LyoKICogU29tZSB1bml0IHRlc3RzIGZvciBkM2QgZnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAoQykgMjAwNSBBbnRvaW5lIENoYXZhc3NlCiAqIENvcHlyaWdodCAoQykgMjAwNiBTdGVmYW4gRPZzaW5nZXIgZm9yIENvZGVXZWF2ZXJzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgIndpbmUvdGVzdC5oIgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgImQzZC5oIgoKc3RhdGljIExQRElSRUNURFJBVzcgICAgICAgICAgIGxwREQgPSBOVUxMOwpzdGF0aWMgTFBESVJFQ1QzRDcgICAgICAgICAgICAgbHBEM0QgPSBOVUxMOwpzdGF0aWMgTFBESVJFQ1REUkFXU1VSRkFDRTcgICAgbHBERFMgPSBOVUxMOwpzdGF0aWMgTFBESVJFQ1QzRERFVklDRTcgICAgICAgbHBEM0REZXZpY2UgPSBOVUxMOwpzdGF0aWMgTFBESVJFQ1QzRFZFUlRFWEJVRkZFUjcgbHBWQnVmU3JjID0gTlVMTDsKc3RhdGljIExQRElSRUNUM0RWRVJURVhCVUZGRVI3IGxwVkJ1ZkRlc3QxID0gTlVMTDsKc3RhdGljIExQRElSRUNUM0RWRVJURVhCVUZGRVI3IGxwVkJ1ZkRlc3QyID0gTlVMTDsKCi8qIFRvIGNvbXBhcmUgYmFkIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIE5vdCB0aGUgaWRlYWwgd2F5IHRvIGRvIGl0LAogKiBidXQgaXQgc2hvdWxkIGJlIGVub3VnaCBmb3IgaGVyZSAqLwojZGVmaW5lIGNvbXBhcmVmbG9hdChhLCBiKSAoICgoKGEpIC0gKGIpKSA8IDAuMDAwMSkgJiYgKCgoYSkgLSAoYikpID4gLTAuMDAwMSkgKQoKc3RhdGljIEhSRVNVTFQgKFdJTkFQSSAqcERpcmVjdERyYXdDcmVhdGVFeCkoTFBHVUlELExQVk9JRCosUkVGSUlELExQVU5LTk9XTik7Cgp0eXBlZGVmIHN0cnVjdCBfVkVSVEVYCnsKICAgIGZsb2F0IHgsIHksIHo7ICAvKiBwb3NpdGlvbiAqLwp9IFZFUlRFWCwgKkxQVkVSVEVYOwoKdHlwZWRlZiBzdHJ1Y3QgX1RWRVJURVgKewogICAgZmxvYXQgeCwgeSwgejsgIC8qIHBvc2l0aW9uICovCiAgICBmbG9hdCByaHc7Cn0gVFZFUlRFWCwgKkxQVFZFUlRFWDsKCgpzdGF0aWMgdm9pZCBpbml0X2Z1bmN0aW9uX3BvaW50ZXJzKHZvaWQpCnsKICAgIEhNT0RVTEUgaG1vZCA9IEdldE1vZHVsZUhhbmRsZUEoImRkcmF3LmRsbCIpOwogICAgcERpcmVjdERyYXdDcmVhdGVFeCA9ICh2b2lkKilHZXRQcm9jQWRkcmVzcyhobW9kLCAiRGlyZWN0RHJhd0NyZWF0ZUV4Iik7Cn0KCgpzdGF0aWMgQk9PTCBDcmVhdGVEaXJlY3QzRCh2b2lkKQp7CiAgICBIUkVTVUxUIHJjOwogICAgRERTVVJGQUNFREVTQzIgZGRzZDsKCiAgICByYyA9IHBEaXJlY3REcmF3Q3JlYXRlRXgoTlVMTCwgKHZvaWQqKikmbHBERCwKICAgICAgICAmSUlEX0lEaXJlY3REcmF3NywgTlVMTCk7CiAgICBvayhyYz09RERfT0sgfHwgcmM9PURERVJSX05PRElSRUNURFJBV1NVUFBPUlQsICJEaXJlY3REcmF3Q3JlYXRlRXggcmV0dXJuZWQ6ICV4XG4iLCByYyk7CiAgICBpZiAoIWxwREQpIHsKICAgICAgICB0cmFjZSgiRGlyZWN0RHJhd0NyZWF0ZUV4KCkgZmFpbGVkIHdpdGggYW4gZXJyb3IgJXhcbiIsIHJjKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgcmMgPSBJRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsKGxwREQsIE5VTEwsIEREU0NMX05PUk1BTCk7CiAgICBvayhyYz09RERfT0ssICJTZXRDb29wZXJhdGl2ZUxldmVsIHJldHVybmVkOiAleFxuIiwgcmMpOwoKICAgIHJjID0gSURpcmVjdERyYXc3X1F1ZXJ5SW50ZXJmYWNlKGxwREQsICZJSURfSURpcmVjdDNENywgKHZvaWQqKikgJmxwRDNEKTsKICAgIGlmIChyYyA9PSBFX05PSU5URVJGQUNFKSByZXR1cm4gRkFMU0U7CiAgICBvayhyYz09RERfT0ssICJRdWVyeUludGVyZmFjZSByZXR1cm5lZDogJXhcbiIsIHJjKTsKCiAgICBtZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7CiAgICBkZHNkLmR3U2l6ZSA9IHNpemVvZihkZHNkKTsKICAgIGRkc2QuZHdGbGFncyA9IEREU0RfQ0FQUyB8IEREU0RfV0lEVEggfCBERFNEX0hFSUdIVDsKICAgIGRkc2QuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX09GRlNDUkVFTlBMQUlOIHwgRERTQ0FQU18zRERFVklDRTsKICAgIGRkc2QuZHdXaWR0aCA9IDI1NjsKICAgIGRkc2QuZHdIZWlnaHQgPSAyNTY7CiAgICByYyA9IElEaXJlY3REcmF3N19DcmVhdGVTdXJmYWNlKGxwREQsICZkZHNkLCAmbHBERFMsIE5VTEwpOwogICAgb2socmM9PUREX09LLCAiQ3JlYXRlU3VyZmFjZSByZXR1cm5lZDogJXhcbiIsIHJjKTsKCiAgICByYyA9IElEaXJlY3QzRDdfQ3JlYXRlRGV2aWNlKGxwRDNELCAmSUlEX0lEaXJlY3QzRFRuTEhhbERldmljZSwgbHBERFMsCiAgICAgICAgJmxwRDNERGV2aWNlKTsKICAgIG9rKHJjPT1EM0RfT0sgfHwgcmM9PURERVJSX05PUEFMRVRURUFUVEFDSEVEIHx8IHJjPT1FX09VVE9GTUVNT1JZLCAiQ3JlYXRlRGV2aWNlIHJldHVybmVkOiAleFxuIiwgcmMpOwogICAgaWYgKCFscEQzRERldmljZSkgewogICAgICAgIHRyYWNlKCJJRGlyZWN0M0Q3OjpDcmVhdGVEZXZpY2UoKSBmb3IgYSBUbkwgSGFsIGRldmljZSBmYWlsZWQgd2l0aCBhbiBlcnJvciAleCwgdHJ5aW5nIEhBTFxuIiwgcmMpOwogICAgICAgIHJjID0gSURpcmVjdDNEN19DcmVhdGVEZXZpY2UobHBEM0QsICZJSURfSURpcmVjdDNESEFMRGV2aWNlLCBscEREUywKICAgICAgICAgICAgJmxwRDNERGV2aWNlKTsKICAgICAgICBpZiAoIWxwRDNERGV2aWNlKSB7CiAgICAgICAgICAgIHRyYWNlKCJJRGlyZWN0M0Q3OjpDcmVhdGVEZXZpY2UoKSBmb3IgYSBIQUwgZGV2aWNlIGZhaWxlZCB3aXRoIGFuIGVycm9yICV4LCB0cnlpbmcgUkdCXG4iLCByYyk7CiAgICAgICAgICAgIHJjID0gSURpcmVjdDNEN19DcmVhdGVEZXZpY2UobHBEM0QsICZJSURfSURpcmVjdDNEUkdCRGV2aWNlLCBscEREUywKICAgICAgICAgICAgICAgICZscEQzRERldmljZSk7CiAgICAgICAgICAgIGlmICghbHBEM0REZXZpY2UpIHsKICAgICAgICAgICAgICAgIHRyYWNlKCJJRGlyZWN0M0Q3OjpDcmVhdGVEZXZpY2UoKSBmb3IgYSBSR0IgZGV2aWNlIGZhaWxlZCB3aXRoIGFuIGVycm9yICV4LCBnaXZpbmcgdXBcbiIsIHJjKTsKICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIHZvaWQgUmVsZWFzZURpcmVjdDNEKHZvaWQpCnsKICAgIGlmIChscEQzRERldmljZSAhPSBOVUxMKQogICAgewogICAgICAgIElEaXJlY3QzRERldmljZTdfUmVsZWFzZShscEQzRERldmljZSk7CiAgICAgICAgbHBEM0REZXZpY2UgPSBOVUxMOwogICAgfQoKICAgIGlmIChscEREUyAhPSBOVUxMKQogICAgewogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKGxwRERTKTsKICAgICAgICBscEREUyA9IE5VTEw7CiAgICB9CgogICAgaWYgKGxwRDNEICE9IE5VTEwpCiAgICB7CiAgICAgICAgSURpcmVjdDNEN19SZWxlYXNlKGxwRDNEKTsKICAgICAgICBscEQzRCA9IE5VTEw7CiAgICB9CgogICAgaWYgKGxwREQgIT0gTlVMTCkKICAgIHsKICAgICAgICBJRGlyZWN0RHJhd19SZWxlYXNlKGxwREQpOwogICAgICAgIGxwREQgPSBOVUxMOwogICAgfQp9CgpzdGF0aWMgdm9pZCBMaWdodFRlc3Qodm9pZCkKewogICAgSFJFU1VMVCByYzsKICAgIEQzRExJR0hUNyBsaWdodDsKICAgIEQzRExJR0hUNyBkZWZhdWx0bGlnaHQ7CiAgICBCT09MIGJFbmFibGVkID0gRkFMU0U7CgogICAgLyogU2V0IGEgZmV3IGxpZ2h0cyB3aXRoIGZ1bmt5IGluZGljZXMuICovCiAgICBtZW1zZXQoJmxpZ2h0LCAwLCBzaXplb2YobGlnaHQpKTsKICAgIGxpZ2h0LmRsdFR5cGUgPSBEM0RMSUdIVF9ESVJFQ1RJT05BTDsKICAgIFUxKGxpZ2h0LmRjdkRpZmZ1c2UpLnIgPSAwLjVmOwogICAgVTIobGlnaHQuZGN2RGlmZnVzZSkuZyA9IDAuNmY7CiAgICBVMyhsaWdodC5kY3ZEaWZmdXNlKS5iID0gMC43ZjsKICAgIFUyKGxpZ2h0LmR2RGlyZWN0aW9uKS55ID0gMS5mOwoKICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19TZXRMaWdodChscEQzRERldmljZSwgNSwgJmxpZ2h0KTsKICAgIG9rKHJjPT1EM0RfT0ssICJTZXRMaWdodCByZXR1cm5lZDogJXhcbiIsIHJjKTsKICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19TZXRMaWdodChscEQzRERldmljZSwgMTAsICZsaWdodCk7CiAgICBvayhyYz09RDNEX09LLCAiU2V0TGlnaHQgcmV0dXJuZWQ6ICV4XG4iLCByYyk7CiAgICByYyA9IElEaXJlY3QzRERldmljZTdfU2V0TGlnaHQobHBEM0REZXZpY2UsIDQ1LCAmbGlnaHQpOwogICAgb2socmM9PUQzRF9PSywgIlNldExpZ2h0IHJldHVybmVkOiAleFxuIiwgcmMpOwoKCiAgICAvKiBUcnkgdG8gcmV0cmlldmUgYSBsaWdodCBiZXlvbmQgdGhlIGluZGljZXMgb2YgdGhlIGxpZ2h0cyB0aGF0IGhhdmUKICAgICAgIGJlZW4gc2V0LiAqLwogICAgcmMgPSBJRGlyZWN0M0REZXZpY2U3X0dldExpZ2h0KGxwRDNERGV2aWNlLCA1MCwgJmxpZ2h0KTsKICAgIG9rKHJjPT1EREVSUl9JTlZBTElEUEFSQU1TLCAiR2V0TGlnaHQgcmV0dXJuZWQ6ICV4XG4iLCByYyk7CiAgICByYyA9IElEaXJlY3QzRERldmljZTdfR2V0TGlnaHQobHBEM0REZXZpY2UsIDIsICZsaWdodCk7CiAgICBvayhyYz09RERFUlJfSU5WQUxJRFBBUkFNUywgIkdldExpZ2h0IHJldHVybmVkOiAleFxuIiwgcmMpOwoKCiAgICAvKiBUcnkgdG8gcmV0cmlldmUgb25lIG9mIHRoZSBsaWdodHMgdGhhdCBoYXZlIGJlZW4gc2V0ICovCiAgICByYyA9IElEaXJlY3QzRERldmljZTdfR2V0TGlnaHQobHBEM0REZXZpY2UsIDEwLCAmbGlnaHQpOwogICAgb2socmM9PUQzRF9PSywgIkdldExpZ2h0IHJldHVybmVkOiAleFxuIiwgcmMpOwoKCiAgICAvKiBFbmFibGUgYSBsaWdodCB0aGF0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHNldC4gKi8KICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19MaWdodEVuYWJsZShscEQzRERldmljZSwgMTAsIFRSVUUpOwogICAgb2socmM9PUQzRF9PSywgIkxpZ2h0RW5hYmxlIHJldHVybmVkOiAleFxuIiwgcmMpOwoKCiAgICAvKiBFbmFibGUgc29tZSBsaWdodHMgdGhhdCBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgc2V0LCBhbmQgdmVyaWZ5IHRoYXQKICAgICAgIHRoZXkgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHdpdGggcHJvcGVyIGRlZmF1bHQgdmFsdWVzLiAqLwogICAgbWVtc2V0KCZkZWZhdWx0bGlnaHQsIDAsIHNpemVvZihEM0RMSUdIVDcpKTsKICAgIGRlZmF1bHRsaWdodC5kbHRUeXBlID0gRDNETElHSFRfRElSRUNUSU9OQUw7CiAgICBVMShkZWZhdWx0bGlnaHQuZGN2RGlmZnVzZSkuciA9IDEuZjsKICAgIFUyKGRlZmF1bHRsaWdodC5kY3ZEaWZmdXNlKS5nID0gMS5mOwogICAgVTMoZGVmYXVsdGxpZ2h0LmRjdkRpZmZ1c2UpLmIgPSAxLmY7CiAgICBVMyhkZWZhdWx0bGlnaHQuZHZEaXJlY3Rpb24pLnogPSAxLmY7CgogICAgcmMgPSBJRGlyZWN0M0REZXZpY2U3X0xpZ2h0RW5hYmxlKGxwRDNERGV2aWNlLCAyMCwgVFJVRSk7CiAgICBvayhyYz09RDNEX09LLCAiTGlnaHRFbmFibGUgcmV0dXJuZWQ6ICV4XG4iLCByYyk7CiAgICBtZW1zZXQoJmxpZ2h0LCAwLCBzaXplb2YoRDNETElHSFQ3KSk7CiAgICByYyA9IElEaXJlY3QzRERldmljZTdfR2V0TGlnaHQobHBEM0REZXZpY2UsIDIwLCAmbGlnaHQpOwogICAgb2socmM9PUQzRF9PSywgIkdldExpZ2h0IHJldHVybmVkOiAleFxuIiwgcmMpOwogICAgb2soIW1lbWNtcCgmbGlnaHQsICZkZWZhdWx0bGlnaHQsIHNpemVvZihEM0RMSUdIVDcpKSwKICAgICAgICAibGlnaHQgZGF0YSBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIGRlZmF1bHQgdmFsdWVzXG4iICk7CgogICAgcmMgPSBJRGlyZWN0M0REZXZpY2U3X0xpZ2h0RW5hYmxlKGxwRDNERGV2aWNlLCA1MCwgVFJVRSk7CiAgICBvayhyYz09RDNEX09LLCAiTGlnaHRFbmFibGUgcmV0dXJuZWQ6ICV4XG4iLCByYyk7CiAgICBtZW1zZXQoJmxpZ2h0LCAwLCBzaXplb2YoRDNETElHSFQ3KSk7CiAgICByYyA9IElEaXJlY3QzRERldmljZTdfR2V0TGlnaHQobHBEM0REZXZpY2UsIDUwLCAmbGlnaHQpOwogICAgb2socmM9PUQzRF9PSywgIkdldExpZ2h0IHJldHVybmVkOiAleFxuIiwgcmMpOwogICAgb2soIW1lbWNtcCgmbGlnaHQsICZkZWZhdWx0bGlnaHQsIHNpemVvZihEM0RMSUdIVDcpKSwKICAgICAgICAibGlnaHQgZGF0YSBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIGRlZmF1bHQgdmFsdWVzXG4iICk7CgoKICAgIC8qIERpc2FibGUgb25lIG9mIHRoZSBsaWdodCB0aGF0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGVuYWJsZWQuICovCiAgICByYyA9IElEaXJlY3QzRERldmljZTdfTGlnaHRFbmFibGUobHBEM0REZXZpY2UsIDIwLCBGQUxTRSk7CiAgICBvayhyYz09RDNEX09LLCAiTGlnaHRFbmFibGUgcmV0dXJuZWQ6ICV4XG4iLCByYyk7CgogICAgLyogVHJ5IHRvIHJldHJpZXZlIHRoZSBlbmFibGUgc3RhdHVzIG9mIHNvbWUgbGlnaHRzICovCiAgICAvKiBMaWdodCAyMCBpcyBzdXBwb3NlZCB0byBiZSBkaXNhYmxlZCAqLwogICAgcmMgPSBJRGlyZWN0M0REZXZpY2U3X0dldExpZ2h0RW5hYmxlKGxwRDNERGV2aWNlLCAyMCwgJmJFbmFibGVkICk7CiAgICBvayhyYz09RDNEX09LLCAiR2V0TGlnaHRFbmFibGUgcmV0dXJuZWQ6ICV4XG4iLCByYyk7CiAgICBvayghYkVuYWJsZWQsICJHZXRMaWdodEVuYWJsZSBzYXlzIHRoZSBsaWdodCBpcyBlbmFibGVkXG4iKTsKCiAgICAvKiBMaWdodCAxMCBpcyBzdXBwb3NlZCB0byBiZSBlbmFibGVkICovCiAgICBiRW5hYmxlZCA9IEZBTFNFOwogICAgcmMgPSBJRGlyZWN0M0REZXZpY2U3X0dldExpZ2h0RW5hYmxlKGxwRDNERGV2aWNlLCAxMCwgJmJFbmFibGVkICk7CiAgICBvayhyYz09RDNEX09LLCAiR2V0TGlnaHRFbmFibGUgcmV0dXJuZWQ6ICV4XG4iLCByYyk7CiAgICBvayhiRW5hYmxlZCwgIkdldExpZ2h0RW5hYmxlIHNheXMgdGhlIGxpZ2h0IGlzIGRpc2FibGVkXG4iKTsKCiAgICAvKiBMaWdodCA4MCBoYXMgbm90IGJlZW4gc2V0ICovCiAgICByYyA9IElEaXJlY3QzRERldmljZTdfR2V0TGlnaHRFbmFibGUobHBEM0REZXZpY2UsIDgwLCAmYkVuYWJsZWQgKTsKICAgIG9rKHJjPT1EREVSUl9JTlZBTElEUEFSQU1TLCAiR2V0TGlnaHRFbmFibGUgcmV0dXJuZWQ6ICV4XG4iLCByYyk7CgogICAgLyogTGlnaHQgMjMgaGFzIG5vdCBiZWVuIHNldCAqLwogICAgcmMgPSBJRGlyZWN0M0REZXZpY2U3X0dldExpZ2h0RW5hYmxlKGxwRDNERGV2aWNlLCAyMywgJmJFbmFibGVkICk7CiAgICBvayhyYz09RERFUlJfSU5WQUxJRFBBUkFNUywgIkdldExpZ2h0RW5hYmxlIHJldHVybmVkOiAleFxuIiwgcmMpOwoKICAgIC8qIFNldCBzb21lIGxpZ2h0cyB3aXRoIGludmFsaWQgcGFyYW1ldGVycyAqLwogICAgbWVtc2V0KCZsaWdodCwgMCwgc2l6ZW9mKEQzRExJR0hUNykpOwogICAgbGlnaHQuZGx0VHlwZSA9IDA7CiAgICBVMShsaWdodC5kY3ZEaWZmdXNlKS5yID0gMS5mOwogICAgVTIobGlnaHQuZGN2RGlmZnVzZSkuZyA9IDEuZjsKICAgIFUzKGxpZ2h0LmRjdkRpZmZ1c2UpLmIgPSAxLmY7CiAgICBVMyhsaWdodC5kdkRpcmVjdGlvbikueiA9IDEuZjsKICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19TZXRMaWdodChscEQzRERldmljZSwgMTAwLCAmbGlnaHQpOwogICAgb2socmM9PURERVJSX0lOVkFMSURQQVJBTVMsICJTZXRMaWdodCByZXR1cm5lZDogJXhcbiIsIHJjKTsKCiAgICBtZW1zZXQoJmxpZ2h0LCAwLCBzaXplb2YoRDNETElHSFQ3KSk7CiAgICBsaWdodC5kbHRUeXBlID0gMTIzNDU7CiAgICBVMShsaWdodC5kY3ZEaWZmdXNlKS5yID0gMS5mOwogICAgVTIobGlnaHQuZGN2RGlmZnVzZSkuZyA9IDEuZjsKICAgIFUzKGxpZ2h0LmRjdkRpZmZ1c2UpLmIgPSAxLmY7CiAgICBVMyhsaWdodC5kdkRpcmVjdGlvbikueiA9IDEuZjsKICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19TZXRMaWdodChscEQzRERldmljZSwgMTAxLCAmbGlnaHQpOwogICAgb2socmM9PURERVJSX0lOVkFMSURQQVJBTVMsICJTZXRMaWdodCByZXR1cm5lZDogJXhcbiIsIHJjKTsKCiAgICByYyA9IElEaXJlY3QzRERldmljZTdfU2V0TGlnaHQobHBEM0REZXZpY2UsIDEwMiwgTlVMTCk7CiAgICBvayhyYz09RERFUlJfSU5WQUxJRFBBUkFNUywgIlNldExpZ2h0IHJldHVybmVkOiAleFxuIiwgcmMpOwoKICAgIG1lbXNldCgmbGlnaHQsIDAsIHNpemVvZihEM0RMSUdIVDcpKTsKICAgIGxpZ2h0LmRsdFR5cGUgPSBEM0RMSUdIVF9TUE9UOwogICAgVTEobGlnaHQuZGN2RGlmZnVzZSkuciA9IDEuZjsKICAgIFUyKGxpZ2h0LmRjdkRpZmZ1c2UpLmcgPSAxLmY7CiAgICBVMyhsaWdodC5kY3ZEaWZmdXNlKS5iID0gMS5mOwogICAgVTMobGlnaHQuZHZEaXJlY3Rpb24pLnogPSAxLmY7CgogICAgbGlnaHQuZHZBdHRlbnVhdGlvbjAgPSAtMS4wIC8gMC4wOyAvKiAtSU5GSU5JVFkgKi8KICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19TZXRMaWdodChscEQzRERldmljZSwgMTAzLCAmbGlnaHQpOwogICAgb2socmM9PURERVJSX0lOVkFMSURQQVJBTVMsICJTZXRMaWdodCByZXR1cm5lZDogJXhcbiIsIHJjKTsKCiAgICBsaWdodC5kdkF0dGVudWF0aW9uMCA9IC0xLjA7CiAgICByYyA9IElEaXJlY3QzRERldmljZTdfU2V0TGlnaHQobHBEM0REZXZpY2UsIDEwMywgJmxpZ2h0KTsKICAgIG9rKHJjPT1EREVSUl9JTlZBTElEUEFSQU1TLCAiU2V0TGlnaHQgcmV0dXJuZWQ6ICV4XG4iLCByYyk7CgogICAgbGlnaHQuZHZBdHRlbnVhdGlvbjAgPSAwLjA7CiAgICByYyA9IElEaXJlY3QzRERldmljZTdfU2V0TGlnaHQobHBEM0REZXZpY2UsIDEwMywgJmxpZ2h0KTsKICAgIG9rKHJjPT1EM0RfT0ssICJTZXRMaWdodCByZXR1cm5lZDogJXhcbiIsIHJjKTsKCiAgICBsaWdodC5kdkF0dGVudWF0aW9uMCA9IDEuMDsKICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19TZXRMaWdodChscEQzRERldmljZSwgMTAzLCAmbGlnaHQpOwogICAgb2socmM9PUQzRF9PSywgIlNldExpZ2h0IHJldHVybmVkOiAleFxuIiwgcmMpOwoKICAgIGxpZ2h0LmR2QXR0ZW51YXRpb24wID0gMS4wIC8gMC4wOyAvKiArSU5GSU5JVFkgKi8KICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19TZXRMaWdodChscEQzRERldmljZSwgMTAzLCAmbGlnaHQpOwogICAgb2socmM9PUQzRF9PSywgIlNldExpZ2h0IHJldHVybmVkOiAleFxuIiwgcmMpOwoKICAgIGxpZ2h0LmR2QXR0ZW51YXRpb24wID0gMC4wIC8gMC4wOyAvKiBOYU4gKi8KICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19TZXRMaWdodChscEQzRERldmljZSwgMTAzLCAmbGlnaHQpOwogICAgb2socmM9PUQzRF9PSywgIlNldExpZ2h0IHJldHVybmVkOiAleFxuIiwgcmMpOwoKICAgIC8qIERpcmVjdGlvbmFsIGxpZ2h0IGlnbm9yZXMgYXR0ZW51YXRpb24gKi8KICAgIGxpZ2h0LmRsdFR5cGUgPSBEM0RMSUdIVF9ESVJFQ1RJT05BTDsKICAgIGxpZ2h0LmR2QXR0ZW51YXRpb24wID0gLTEuMDsKICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19TZXRMaWdodChscEQzRERldmljZSwgMTAzLCAmbGlnaHQpOwogICAgb2socmM9PUQzRF9PSywgIlNldExpZ2h0IHJldHVybmVkOiAleFxuIiwgcmMpOwp9CgpzdGF0aWMgdm9pZCBQcm9jZXNzVmVydGljZXNUZXN0KHZvaWQpCnsKICAgIEQzRFZFUlRFWEJVRkZFUkRFU0MgZGVzYzsKICAgIEhSRVNVTFQgcmM7CiAgICBWRVJURVggKmluOwogICAgVFZFUlRFWCAqb3V0OwogICAgVkVSVEVYICpvdXQyOwogICAgRDNEVklFV1BPUlQ3IHZwOwogICAgRDNETUFUUklYIHZpZXcgPSB7ICAyLjAsIDAuMCwgMC4wLCAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgLTEuMCwgMC4wLCAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC4wLCAxLjAsIDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCAwLjAsIDAuMCwgMy4wIH07CgogICAgRDNETUFUUklYIHdvcmxkID0geyAwLjAsIDEuMCwgMC4wLCAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgIDEuMCwgMC4wLCAwLjAsIDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCAwLjAsIDAuMCwgMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAwLjAsIDEuMCwgMS4wLCAxLjAgfTsKCiAgICBEM0RNQVRSSVggcHJvaiA9IHsgIDEuMCwgMC4wLCAwLjAsIDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCAxLjAsIDEuMCwgMC4wLAogICAgICAgICAgICAgICAgICAgICAgICAwLjAsIDEuMCwgMS4wLCAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgIDEuMCwgMC4wLCAwLjAsIDEuMCB9OwogICAgLyogQ3JlYXRlIHNvbWUgdmVydGV4IGJ1ZmZlcnMgKi8KCiAgICBtZW1zZXQoJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CiAgICBkZXNjLmR3U2l6ZSA9IHNpemVvZihkZXNjKTsKICAgIGRlc2MuZHdDYXBzID0gMDsKICAgIGRlc2MuZHdGVkYgPSBEM0RGVkZfWFlaOwogICAgZGVzYy5kd051bVZlcnRpY2VzID0gMTY7CiAgICByYyA9IElEaXJlY3QzRDdfQ3JlYXRlVmVydGV4QnVmZmVyKGxwRDNELCAmZGVzYywgJmxwVkJ1ZlNyYywgMCk7CiAgICBvayhyYz09RDNEX09LIHx8IHJjPT1FX09VVE9GTUVNT1JZLCAiQ3JlYXRlVmVydGV4QnVmZmVyIHJldHVybmVkOiAleFxuIiwgcmMpOwogICAgaWYgKCFscFZCdWZTcmMpCiAgICB7CiAgICAgICAgdHJhY2UoIklEaXJlY3QzRDc6OkNyZWF0ZVZlcnRleEJ1ZmZlcigpIGZhaWxlZCB3aXRoIGFuIGVycm9yICV4XG4iLCByYyk7CiAgICAgICAgZ290byBvdXQ7CiAgICB9CgogICAgbWVtc2V0KCZkZXNjLCAwLCBzaXplb2YoZGVzYykpOwogICAgZGVzYy5kd1NpemUgPSBzaXplb2YoZGVzYyk7CiAgICBkZXNjLmR3Q2FwcyA9IDA7CiAgICBkZXNjLmR3RlZGID0gRDNERlZGX1hZWlJIVzsKICAgIGRlc2MuZHdOdW1WZXJ0aWNlcyA9IDE2OwogICAgLyogTXNkbiBzYXlzIHRoYXQgdGhlIGxhc3QgcGFyYW1ldGVyIG11c3QgYmUgMCAtIGNoZWNrIHRoYXQgKi8KICAgIHJjID0gSURpcmVjdDNEN19DcmVhdGVWZXJ0ZXhCdWZmZXIobHBEM0QsICZkZXNjLCAmbHBWQnVmRGVzdDEsIDQpOwogICAgb2socmM9PUQzRF9PSyB8fCByYz09RV9PVVRPRk1FTU9SWSwgIkNyZWF0ZVZlcnRleEJ1ZmZlciByZXR1cm5lZDogJXhcbiIsIHJjKTsKICAgIGlmICghbHBWQnVmRGVzdDEpCiAgICB7CiAgICAgICAgdHJhY2UoIklEaXJlY3QzRDc6OkNyZWF0ZVZlcnRleEJ1ZmZlcigpIGZhaWxlZCB3aXRoIGFuIGVycm9yICV4XG4iLCByYyk7CiAgICAgICAgZ290byBvdXQ7CiAgICB9CgogICAgbWVtc2V0KCZkZXNjLCAwLCBzaXplb2YoZGVzYykpOwogICAgZGVzYy5kd1NpemUgPSBzaXplb2YoZGVzYyk7CiAgICBkZXNjLmR3Q2FwcyA9IDA7CiAgICBkZXNjLmR3RlZGID0gRDNERlZGX1hZWjsKICAgIGRlc2MuZHdOdW1WZXJ0aWNlcyA9IDE2OwogICAgLyogTXNkbiBzYXlzIHRoYXQgdGhlIGxhc3QgcGFyYW1ldGVyIG11c3QgYmUgMCAtIGNoZWNrIHRoYXQgKi8KICAgIHJjID0gSURpcmVjdDNEN19DcmVhdGVWZXJ0ZXhCdWZmZXIobHBEM0QsICZkZXNjLCAmbHBWQnVmRGVzdDIsIDEyMzQ1Njc4KTsKICAgIG9rKHJjPT1EM0RfT0sgfHwgcmM9PUVfT1VUT0ZNRU1PUlksICJDcmVhdGVWZXJ0ZXhCdWZmZXIgcmV0dXJuZWQ6ICV4XG4iLCByYyk7CiAgICBpZiAoIWxwVkJ1ZkRlc3QyKQogICAgewogICAgICAgIHRyYWNlKCJJRGlyZWN0M0Q3OjpDcmVhdGVWZXJ0ZXhCdWZmZXIoKSBmYWlsZWQgd2l0aCBhbiBlcnJvciAleFxuIiwgcmMpOwogICAgICAgIGdvdG8gb3V0OwogICAgfQoKICAgIHJjID0gSURpcmVjdDNEVmVydGV4QnVmZmVyN19Mb2NrKGxwVkJ1ZlNyYywgMCwgKHZvaWQgKiopICZpbiwgTlVMTCk7CiAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6TG9jayByZXR1cm5lZDogJXhcbiIsIHJjKTsKICAgIGlmKCFpbikgZ290byBvdXQ7CgogICAgLyogQ2hlY2sgYmFzaWMgdHJhbnNmb3JtYXRpb24gKi8KCiAgICBpblswXS54ID0gMC4wOwogICAgaW5bMF0ueSA9IDAuMDsKICAgIGluWzBdLnogPSAwLjA7CgogICAgaW5bMV0ueCA9IDEuMDsKICAgIGluWzFdLnkgPSAxLjA7CiAgICBpblsxXS56ID0gMS4wOwoKICAgIGluWzJdLnggPSAtMS4wOwogICAgaW5bMl0ueSA9IC0xLjA7CiAgICBpblsyXS56ID0gMC41OwoKICAgIGluWzNdLnggPSAwLjU7CiAgICBpblszXS55ID0gLTAuNTsKICAgIGluWzNdLnogPSAwLjI1OwogICAgcmMgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1VubG9jayhscFZCdWZTcmMpOwogICAgb2socmM9PUQzRF9PSyAsICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI6OlVubG9jayByZXR1cm5lZDogJXhcbiIsIHJjKTsKCiAgICByYyA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfUHJvY2Vzc1ZlcnRpY2VzKGxwVkJ1ZkRlc3QxLCBEM0RWT1BfVFJBTlNGT1JNLCAwLCA0LCBscFZCdWZTcmMsIDAsIGxwRDNERGV2aWNlLCAwKTsKICAgIG9rKHJjPT1EM0RfT0sgLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOjpQcm9jZXNzVmVydGljZXMgcmV0dXJuZWQ6ICV4XG4iLCByYyk7CgogICAgcmMgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1Byb2Nlc3NWZXJ0aWNlcyhscFZCdWZEZXN0MiwgRDNEVk9QX1RSQU5TRk9STSwgMCwgNCwgbHBWQnVmU3JjLCAwLCBscEQzRERldmljZSwgMCk7CiAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6UHJvY2Vzc1ZlcnRpY2VzIHJldHVybmVkOiAleFxuIiwgcmMpOwoKICAgIHJjID0gSURpcmVjdDNEVmVydGV4QnVmZmVyN19Mb2NrKGxwVkJ1ZkRlc3QxLCAwLCAodm9pZCAqKikgJm91dCwgTlVMTCk7CiAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6TG9jayByZXR1cm5lZDogJXhcbiIsIHJjKTsKICAgIGlmKCFvdXQpIGdvdG8gb3V0OwoKICAgIC8qIENoZWNrIHRoZSByZXN1bHRzICovCiAgICBvayggY29tcGFyZWZsb2F0KG91dFswXS54LCAxMjguMCApICYmCiAgICAgICAgY29tcGFyZWZsb2F0KG91dFswXS55LCAxMjguMCApICYmCiAgICAgICAgY29tcGFyZWZsb2F0KG91dFswXS56LCAwLjAgKSAmJgogICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMF0ucmh3LCAxLjAgKSwKICAgICAgICAiT3V0cHV0IDAgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFswXS54LCBvdXRbMF0ueSwgb3V0WzBdLnosIG91dFswXS5yaHcpOwoKICAgIG9rKCBjb21wYXJlZmxvYXQob3V0WzFdLngsIDI1Ni4wICkgJiYKICAgICAgICBjb21wYXJlZmxvYXQob3V0WzFdLnksIDAuMCApICYmCiAgICAgICAgY29tcGFyZWZsb2F0KG91dFsxXS56LCAxLjAgKSAmJgogICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMV0ucmh3LCAxLjAgKSwKICAgICAgICAiT3V0cHV0IDEgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFsxXS54LCBvdXRbMV0ueSwgb3V0WzFdLnosIG91dFsxXS5yaHcpOwoKICAgIG9rKCBjb21wYXJlZmxvYXQob3V0WzJdLngsIDAuMCApICYmCiAgICAgICAgY29tcGFyZWZsb2F0KG91dFsyXS55LCAyNTYuMCApICYmCiAgICAgICAgY29tcGFyZWZsb2F0KG91dFsyXS56LCAwLjUgKSAmJgogICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMl0ucmh3LCAxLjAgKSwKICAgICAgICAiT3V0cHV0IDIgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFsyXS54LCBvdXRbMl0ueSwgb3V0WzJdLnosIG91dFsyXS5yaHcpOwoKICAgIG9rKCBjb21wYXJlZmxvYXQob3V0WzNdLngsIDE5Mi4wICkgJiYKICAgICAgICBjb21wYXJlZmxvYXQob3V0WzNdLnksIDE5Mi4wICkgJiYKICAgICAgICBjb21wYXJlZmxvYXQob3V0WzNdLnosIDAuMjUgKSAmJgogICAgICAgIGNvbXBhcmVmbG9hdChvdXRbM10ucmh3LCAxLjAgKSwKICAgICAgICAiT3V0cHV0IDMgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFszXS54LCBvdXRbM10ueSwgb3V0WzNdLnosIG91dFszXS5yaHcpOwoKICAgIHJjID0gSURpcmVjdDNEVmVydGV4QnVmZmVyN19VbmxvY2sobHBWQnVmRGVzdDEpOwogICAgb2socmM9PUQzRF9PSyAsICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI6OlVubG9jayByZXR1cm5lZDogJXhcbiIsIHJjKTsKICAgIG91dCA9IE5VTEw7CgogICAgcmMgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X0xvY2sobHBWQnVmRGVzdDIsIDAsICh2b2lkICoqKSAmb3V0MiwgTlVMTCk7CiAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6TG9jayByZXR1cm5lZDogJXhcbiIsIHJjKTsKICAgIGlmKCFvdXQyKSBnb3RvIG91dDsKICAgIC8qIFNtYWxsIHRoaW5nIHdpdGhvdXQgbXVjaCBwcmFjdGlhbCBtZWFuaW5nLCBidXQgSSBzdHVtYmxlZCB1cG9uIGl0LAogICAgICogc28gbGV0J3MgY2hlY2sgZm9yIGl0OiBJZiB0aGUgb3V0cHV0IHZlcnRleCBidWZmZXIgaGFzIHRvIFJIVyB2YWx1ZSwKICAgICAqIFRoZSBSSFcgdmFsdWUgb2YgdGhlIGxhc3QgdmVydGV4IGlzIHdyaXR0ZW4gaW50byB0aGUgbmV4dCB2ZXJ0ZXgKICAgICAqLwogICAgb2soIGNvbXBhcmVmbG9hdChvdXQyWzRdLngsIDEuMCApICYmCiAgICAgICAgY29tcGFyZWZsb2F0KG91dDJbNF0ueSwgMC4wICkgJiYKICAgICAgICBjb21wYXJlZmxvYXQob3V0Mls0XS56LCAwLjAgKSwKICAgICAgICAiT3V0cHV0IDQgdmVydGV4IGlzICglZiAsICVmICwgJWYpXG4iLCBvdXQyWzRdLngsIG91dDJbNF0ueSwgb3V0Mls0XS56KTsKCiAgICByYyA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfVW5sb2NrKGxwVkJ1ZkRlc3QyKTsKICAgIG9rKHJjPT1EM0RfT0sgLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOjpVbmxvY2sgcmV0dXJuZWQ6ICV4XG4iLCByYyk7CiAgICBvdXQgPSBOVUxMOwoKICAgIC8qIFRyeSBhIG1vcmUgY29tcGxpY2F0ZWQgdmlld3BvcnQsIHNhbWUgdmVydGljZXMgKi8KICAgIG1lbXNldCgmdnAsIDAsIHNpemVvZih2cCkpOwogICAgdnAuZHdYID0gMTA7CiAgICB2cC5kd1kgPSA1OwogICAgdnAuZHdXaWR0aCA9IDI0NjsKICAgIHZwLmR3SGVpZ2h0ID0gMTMwOwogICAgdnAuZHZNaW5aID0gLTIuMDsKICAgIHZwLmR2TWF4WiA9IDQuMDsKICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19TZXRWaWV3cG9ydChscEQzRERldmljZSwgJnZwKTsKICAgIG9rKHJjPT1EM0RfT0ssICJJRGlyZWN0M0REZXZpY2U3X1NldFZpZXdwb3J0IGZhaWxlZCB3aXRoIHJjPSV4XG4iLCByYyk7CgogICAgLyogUHJvY2VzcyBhZ2FpbiAqLwogICAgcmMgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1Byb2Nlc3NWZXJ0aWNlcyhscFZCdWZEZXN0MSwgRDNEVk9QX1RSQU5TRk9STSwgMCwgNCwgbHBWQnVmU3JjLCAwLCBscEQzRERldmljZSwgMCk7CiAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6UHJvY2Vzc1ZlcnRpY2VzIHJldHVybmVkOiAleFxuIiwgcmMpOwoKICAgIHJjID0gSURpcmVjdDNEVmVydGV4QnVmZmVyN19Mb2NrKGxwVkJ1ZkRlc3QxLCAwLCAodm9pZCAqKikgJm91dCwgTlVMTCk7CiAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6TG9jayByZXR1cm5lZDogJXhcbiIsIHJjKTsKICAgIGlmKCFvdXQpIGdvdG8gb3V0OwoKICAgIC8qIENoZWNrIHRoZSByZXN1bHRzICovCiAgICBvayggY29tcGFyZWZsb2F0KG91dFswXS54LCAxMzMuMCApICYmCiAgICAgICAgY29tcGFyZWZsb2F0KG91dFswXS55LCA3MC4wICkgJiYKICAgICAgICBjb21wYXJlZmxvYXQob3V0WzBdLnosIC0yLjAgKSAmJgogICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMF0ucmh3LCAxLjAgKSwKICAgICAgICAiT3V0cHV0IDAgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFswXS54LCBvdXRbMF0ueSwgb3V0WzBdLnosIG91dFswXS5yaHcpOwoKICAgIG9rKCBjb21wYXJlZmxvYXQob3V0WzFdLngsIDI1Ni4wICkgJiYKICAgICAgICBjb21wYXJlZmxvYXQob3V0WzFdLnksIDUuMCApICYmCiAgICAgICAgY29tcGFyZWZsb2F0KG91dFsxXS56LCA0LjAgKSAmJgogICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMV0ucmh3LCAxLjAgKSwKICAgICAgICAiT3V0cHV0IDEgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFsxXS54LCBvdXRbMV0ueSwgb3V0WzFdLnosIG91dFsxXS5yaHcpOwoKICAgIG9rKCBjb21wYXJlZmxvYXQob3V0WzJdLngsIDEwLjAgKSAmJgogICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMl0ueSwgMTM1LjAgKSAmJgogICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMl0ueiwgMS4wICkgJiYKICAgICAgICBjb21wYXJlZmxvYXQob3V0WzJdLnJodywgMS4wICksCiAgICAgICAgIk91dHB1dCAyIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMV0ueCwgb3V0WzFdLnksIG91dFsxXS56LCBvdXRbMV0ucmh3KTsKCiAgICBvayggY29tcGFyZWZsb2F0KG91dFszXS54LCAxOTQuNSApICYmCiAgICAgICAgY29tcGFyZWZsb2F0KG91dFszXS55LCAxMDIuNSApICYmCiAgICAgICAgY29tcGFyZWZsb2F0KG91dFszXS56LCAtMC41ICkgJiYKICAgICAgICBjb21wYXJlZmxvYXQob3V0WzNdLnJodywgMS4wICksCiAgICAgICAgIk91dHB1dCAzIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbM10ueCwgb3V0WzNdLnksIG91dFszXS56LCBvdXRbM10ucmh3KTsKCiAgICByYyA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfVW5sb2NrKGxwVkJ1ZkRlc3QxKTsKICAgIG9rKHJjPT1EM0RfT0sgLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOjpVbmxvY2sgcmV0dXJuZWQ6ICV4XG4iLCByYyk7CiAgICBvdXQgPSBOVUxMOwoKICAgIC8qIFBsYXkgd2l0aCBzb21lIG1hdHJpY2VzLiAqLwoKICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19TZXRUcmFuc2Zvcm0obHBEM0REZXZpY2UsIEQzRFRSQU5TRk9STVNUQVRFX1ZJRVcsICZ2aWV3KTsKICAgIG9rKHJjPT1EM0RfT0ssICJJRGlyZWN0M0REZXZpY2U3X1NldFRyYW5zZm9ybSBmYWlsZWRcbiIpOwoKICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19TZXRUcmFuc2Zvcm0obHBEM0REZXZpY2UsIEQzRFRSQU5TRk9STVNUQVRFX1BST0pFQ1RJT04sICZwcm9qKTsKICAgIG9rKHJjPT1EM0RfT0ssICJJRGlyZWN0M0REZXZpY2U3X1NldFRyYW5zZm9ybSBmYWlsZWRcbiIpOwoKICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19TZXRUcmFuc2Zvcm0obHBEM0REZXZpY2UsIEQzRFRSQU5TRk9STVNUQVRFX1dPUkxELCAmd29ybGQpOwogICAgb2socmM9PUQzRF9PSywgIklEaXJlY3QzRERldmljZTdfU2V0VHJhbnNmb3JtIGZhaWxlZFxuIik7CgogICAgcmMgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1Byb2Nlc3NWZXJ0aWNlcyhscFZCdWZEZXN0MSwgRDNEVk9QX1RSQU5TRk9STSwgMCwgNCwgbHBWQnVmU3JjLCAwLCBscEQzRERldmljZSwgMCk7CiAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6UHJvY2Vzc1ZlcnRpY2VzIHJldHVybmVkOiAleFxuIiwgcmMpOwoKICAgIHJjID0gSURpcmVjdDNEVmVydGV4QnVmZmVyN19Mb2NrKGxwVkJ1ZkRlc3QxLCAwLCAodm9pZCAqKikgJm91dCwgTlVMTCk7CiAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6TG9jayByZXR1cm5lZDogJXhcbiIsIHJjKTsKICAgIGlmKCFvdXQpIGdvdG8gb3V0OwoKICAgIC8qIEtlZXAgdGhlIHZpZXdwb3J0IHNpbXBsZXIsIG90aGVyd2lzZSB3ZSBnZXQgYmFkIG51bWJlcnMgdG8gY29tcGFyZSAqLwogICAgdnAuZHdYID0gMDsKICAgIHZwLmR3WSA9IDA7CiAgICB2cC5kd1dpZHRoID0gMTAwOwogICAgdnAuZHdIZWlnaHQgPSAxMDA7CiAgICB2cC5kdk1pblogPSAxLjA7CiAgICB2cC5kdk1heFogPSAwLjA7CiAgICByYyA9IElEaXJlY3QzRERldmljZTdfU2V0Vmlld3BvcnQobHBEM0REZXZpY2UsICZ2cCk7CiAgICBvayhyYz09RDNEX09LLCAiSURpcmVjdDNERGV2aWNlN19TZXRWaWV3cG9ydCBmYWlsZWRcbiIpOwoKICAgIC8qIENoZWNrIHRoZSByZXN1bHRzICovCiAgICBvayggY29tcGFyZWZsb2F0KG91dFswXS54LCAyNTYuMCApICYmICAgIC8qIFggY29vcmRpbmF0ZSBpcyBjdXQgYXQgdGhlIHN1cmZhY2UgZWRnZXMgKi8KICAgICAgICBjb21wYXJlZmxvYXQob3V0WzBdLnksIDcwLjAgKSAmJgogICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMF0ueiwgLTIuMCApICYmCiAgICAgICAgY29tcGFyZWZsb2F0KG91dFswXS5yaHcsICgxLjAgLyAzLjApKSwKICAgICAgICAiT3V0cHV0IDAgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFswXS54LCBvdXRbMF0ueSwgb3V0WzBdLnosIG91dFswXS5yaHcpOwoKICAgIG9rKCBjb21wYXJlZmxvYXQob3V0WzFdLngsIDI1Ni4wICkgJiYKICAgICAgICBjb21wYXJlZmxvYXQob3V0WzFdLnksIDc4LjEyNTAwMCApICYmCiAgICAgICAgY29tcGFyZWZsb2F0KG91dFsxXS56LCAtMi43NTAwMDAgKSAmJgogICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMV0ucmh3LCAwLjEyNTAwMCApLAogICAgICAgICJPdXRwdXQgMSB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzFdLngsIG91dFsxXS55LCBvdXRbMV0ueiwgb3V0WzFdLnJodyk7CgogICAgb2soIGNvbXBhcmVmbG9hdChvdXRbMl0ueCwgMjU2LjAgKSAmJgogICAgICAgIGNvbXBhcmVmbG9hdChvdXRbMl0ueSwgNDQuMDAwMDAwICkgJiYKICAgICAgICBjb21wYXJlZmxvYXQob3V0WzJdLnosIDAuNDAwMDAwICkgJiYKICAgICAgICBjb21wYXJlZmxvYXQob3V0WzJdLnJodywgMC40MDAwMDAgKSwKICAgICAgICAiT3V0cHV0IDIgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFsyXS54LCBvdXRbMl0ueSwgb3V0WzJdLnosIG91dFsyXS5yaHcpOwoKICAgIG9rKCBjb21wYXJlZmxvYXQob3V0WzNdLngsIDI1Ni4wICkgJiYKICAgICAgICBjb21wYXJlZmxvYXQob3V0WzNdLnksIDgxLjgxODE4NCApICYmCiAgICAgICAgY29tcGFyZWZsb2F0KG91dFszXS56LCAtMy4wOTA5MDkgKSAmJgogICAgICAgIGNvbXBhcmVmbG9hdChvdXRbM10ucmh3LCAwLjM2MzYzNiApLAogICAgICAgICJPdXRwdXQgMyB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzNdLngsIG91dFszXS55LCBvdXRbM10ueiwgb3V0WzNdLnJodyk7CgogICAgcmMgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1VubG9jayhscFZCdWZEZXN0MSk7CiAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6VW5sb2NrIHJldHVybmVkOiAleFxuIiwgcmMpOwogICAgb3V0ID0gTlVMTDsKCm91dDoKICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfUmVsZWFzZShscFZCdWZTcmMpOwogICAgSURpcmVjdDNEVmVydGV4QnVmZmVyN19SZWxlYXNlKGxwVkJ1ZkRlc3QxKTsKICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfUmVsZWFzZShscFZCdWZEZXN0Mik7Cn0KCnN0YXRpYyB2b2lkIFN0YXRlVGVzdCggdm9pZCApCnsKICAgIEhSRVNVTFQgcmM7CgogICAgLyogVGhlIG1zZG4gc2F5cyBpdHMgdW5kb2N1bWVudGVkLCBkb2VzIGl0IHJldHVybiBhbiBlcnJvciB0b28/ICovCiAgICByYyA9IElEaXJlY3QzRERldmljZTdfU2V0UmVuZGVyU3RhdGUobHBEM0REZXZpY2UsIEQzRFJFTkRFUlNUQVRFX1pWSVNJQkxFLCBUUlVFKTsKICAgIG9rKHJjID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTdfU2V0UmVuZGVyU3RhdGUoRDNEUkVOREVSU1RBVEVfWlZJU0lCTEUsIFRSVUUpIHJldHVybmVkICUwOHhcbiIsIHJjKTsKICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19TZXRSZW5kZXJTdGF0ZShscEQzRERldmljZSwgRDNEUkVOREVSU1RBVEVfWlZJU0lCTEUsIEZBTFNFKTsKICAgIG9rKHJjID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTdfU2V0UmVuZGVyU3RhdGUoRDNEUkVOREVSU1RBVEVfWlZJU0lCTEUsIEZBTFNFKSByZXR1cm5lZCAlMDh4XG4iLCByYyk7Cn0KCgpzdGF0aWMgdm9pZCBTY2VuZVRlc3Qodm9pZCkKewogICAgSFJFU1VMVCAgICAgICAgICAgICAgICAgICAgICBocjsKCiAgICAvKiBUZXN0IGFuIEVuZFNjZW5lIHdpdGhvdXQgYmVnaW5zY2VuZS4gU2hvdWxkIHJldHVybiBhbiBlcnJvciAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U3X0VuZFNjZW5lKGxwRDNERGV2aWNlKTsKICAgIG9rKGhyID09IEQzREVSUl9TQ0VORV9OT1RfSU5fU0NFTkUsICJJRGlyZWN0M0REZXZpY2U3X0VuZFNjZW5lIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAvKiBUZXN0IGEgbm9ybWFsIEJlZ2luU2NlbmUgLyBFbmRTY2VuZSBwYWlyLCB0aGlzIHNob3VsZCB3b3JrICovCiAgICBociA9IElEaXJlY3QzRERldmljZTdfQmVnaW5TY2VuZShscEQzRERldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U3X0JlZ2luU2NlbmUgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTdfRW5kU2NlbmUobHBEM0REZXZpY2UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTdfRW5kU2NlbmUgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwogICAgfQoKICAgIC8qIFRlc3QgYW5vdGhlciBFbmRTY2VuZSB3aXRob3V0IGhhdmluZyBiZWd1biBhIG5ldyBzY2VuZS4gU2hvdWxkIHJldHVybiBhbiBlcnJvciAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U3X0VuZFNjZW5lKGxwRDNERGV2aWNlKTsKICAgIG9rKGhyID09IEQzREVSUl9TQ0VORV9OT1RfSU5fU0NFTkUsICJJRGlyZWN0M0REZXZpY2U3X0VuZFNjZW5lIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAvKiBUd28gbmVzdGVkIEJlZ2luU2NlbmUgYW5kIEVuZFNjZW5lIGNhbGxzICovCiAgICBociA9IElEaXJlY3QzRERldmljZTdfQmVnaW5TY2VuZShscEQzRERldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U3X0JlZ2luU2NlbmUgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U3X0JlZ2luU2NlbmUobHBEM0REZXZpY2UpOwogICAgb2soaHIgPT0gRDNERVJSX1NDRU5FX0lOX1NDRU5FLCAiSURpcmVjdDNERGV2aWNlN19CZWdpblNjZW5lIHJldHVybmVkICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlN19FbmRTY2VuZShscEQzRERldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U3X0VuZFNjZW5lIGZhaWxlZCB3aXRoICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlN19FbmRTY2VuZShscEQzRERldmljZSk7CiAgICBvayhociA9PSBEM0RFUlJfU0NFTkVfTk9UX0lOX1NDRU5FLCAiSURpcmVjdDNERGV2aWNlN19FbmRTY2VuZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgLyogVE9ETzogVmVyaWZ5IHRoYXQgYmxpdHRpbmcgd29ya3MgaW4gdGhlIHNhbWUgd2F5IGFzIGluIGQzZDkgKi8KfQoKc3RhdGljIHZvaWQgTGltaXRUZXN0KHZvaWQpCnsKICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKnBUZXh0dXJlID0gTlVMTDsKICAgIEhSRVNVTFQgaHI7CiAgICBpbnQgaTsKICAgIEREU1VSRkFDRURFU0MyIGRkc2Q7CgogICAgbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOwogICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CiAgICBkZHNkLmR3RmxhZ3MgPSBERFNEX0NBUFMgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQ7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19URVhUVVJFOwogICAgZGRzZC5kd1dpZHRoID0gMTY7CiAgICBkZHNkLmR3SGVpZ2h0ID0gMTY7CiAgICBociA9IElEaXJlY3REcmF3N19DcmVhdGVTdXJmYWNlKGxwREQsICZkZHNkLCAmcFRleHR1cmUsIE5VTEwpOwogICAgb2soaHI9PUREX09LLCJDcmVhdGVTdXJmYWNlIHJldHVybmVkOiAleFxuIixocik7CiAgICBpZighcFRleHR1cmUpIHJldHVybjsKCiAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTdfU2V0VGV4dHVyZShscEQzRERldmljZSwgaSwgcFRleHR1cmUpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZThfU2V0VGV4dHVyZSBmb3Igc2FtcGxlciAlZCBmYWlsZWQgd2l0aCAlMDh4XG4iLCBpLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U3X1NldFRleHR1cmUobHBEM0REZXZpY2UsIGksIE5VTEwpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZThfU2V0VGV4dHVyZSBmb3Igc2FtcGxlciAlZCBmYWlsZWQgd2l0aCAlMDh4XG4iLCBpLCBocik7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U3X1NldFRleHR1cmVTdGFnZVN0YXRlKGxwRDNERGV2aWNlLCBpLCBEM0RUU1NfQ09MT1JPUCwgRDNEVE9QX0FERCk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOF9TZXRUZXh0dXJlU3RhZ2VTdGF0ZSBmb3IgdGV4dHVyZSAlZCBmYWlsZWQgd2l0aCAlMDh4XG4iLCBpLCBocik7CiAgICB9CgogICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKHBUZXh0dXJlKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIGVudW1EZXZpY2VzQ2FsbGJhY2soR1VJRCAqR3VpZCxMUFNUUiBEZXZpY2VEZXNjcmlwdGlvbixMUFNUUiBEZXZpY2VOYW1lLCBEM0RERVZJQ0VERVNDICpoYWwsIEQzRERFVklDRURFU0MgKmhlbCwgVk9JRCAqY3R4KQp7CiAgICBVSU5UIHZlciA9ICooKFVJTlQgKikgY3R4KTsKICAgIGlmKElzRXF1YWxHVUlEKCZJSURfSURpcmVjdDNEUkdCRGV2aWNlLCBHdWlkKSkKICAgIHsKICAgICAgICBvaygoaGFsLT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVDYXBzICYgRDNEUFRFWFRVUkVDQVBTX1BPVzIpID09IDAsCiAgICAgICAgICAgIlJHQiBEZXZpY2UgJWQgaGFsIGxpbmUgY2FwcyBoYXMgRDNEUFRFWFRVUkVDQVBTX1BPVzIgZmxhZyBzZXRcbiIsIHZlcik7CiAgICAgICAgb2soKGhhbC0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVDYXBzICYgRDNEUFRFWFRVUkVDQVBTX1BPVzIpID09IDAsCiAgICAgICAgICAgIlJHQiBEZXZpY2UgJWQgaGFsIHRyaSBjYXBzIGhhcyBEM0RQVEVYVFVSRUNBUFNfUE9XMiBmbGFnIHNldFxuIiwgdmVyKTsKICAgICAgICBvayhoZWwtPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUNhcHMgJiBEM0RQVEVYVFVSRUNBUFNfUE9XMiwKICAgICAgICAgICAiUkdCIERldmljZSAlZCBoZWwgbGluZSBjYXBzIGRvZXMgbm90IGhhdmUgRDNEUFRFWFRVUkVDQVBTX1BPVzIgZmxhZyBzZXRcbiIsIHZlcik7CiAgICAgICAgb2soaGVsLT5kcGNUcmlDYXBzLmR3VGV4dHVyZUNhcHMgJiBEM0RQVEVYVFVSRUNBUFNfUE9XMiwKICAgICAgICAgICAiUkdCIERldmljZSAlZCBoZWwgdHJpIGNhcHMgZG9lcyBub3QgaGF2ZSBEM0RQVEVYVFVSRUNBUFNfUE9XMiBmbGFnIHNldFxuIiwgdmVyKTsKCiAgICAgICAgb2soKGhhbC0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSkgPT0gMCwKICAgICAgICAgICAiUkdCIERldmljZSAlZCBoYWwgbGluZSBjYXBzIGhhcyBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUgc2V0XG4iLCB2ZXIpOwogICAgICAgIG9rKChoYWwtPmRwY1RyaUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSkgPT0gMCwKICAgICAgICAgICAiUkdCIERldmljZSAlZCBoYWwgdHJpIGNhcHMgaGFzIEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSBzZXRcbiIsIHZlcik7CiAgICAgICAgb2soaGVsLT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVDYXBzICYgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFLAogICAgICAgICAgICJSR0IgRGV2aWNlICVkIGhlbCB0cmkgY2FwcyBkb2VzIG5vdCBoYXZlIEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSBzZXRcbiIsIHZlcik7CiAgICAgICAgb2soaGVsLT5kcGNUcmlDYXBzLmR3VGV4dHVyZUNhcHMgJiBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUsCiAgICAgICAgICAgIlJHQiBEZXZpY2UgJWQgaGVsIHRyaSBjYXBzIGRvZXMgbm90IGhhdmUgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFIHNldFxuIiwgdmVyKTsKICAgIH0KICAgIGVsc2UgaWYoSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0M0RIQUxEZXZpY2UsIEd1aWQpKQogICAgewogICAgICAgIC8qIHBvdzIgaXMgaGFyZHdhcmUgZGVwZW5kZW50ICovCgogICAgICAgIG9rKGhhbC0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSwKICAgICAgICAgICAiSEFMIERldmljZSAlZCBoYWwgbGluZSBjYXBzIGRvZXMgbm90IGhhdmUgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFIHNldFxuIiwgdmVyKTsKICAgICAgICBvayhoYWwtPmRwY1RyaUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSwKICAgICAgICAgICAiSEFMIERldmljZSAlZCBoYWwgdHJpIGNhcHMgZG9lcyBub3QgaGF2ZSBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUgc2V0XG4iLCB2ZXIpOwogICAgICAgIG9rKChoZWwtPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUNhcHMgJiBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUpID09IDAsCiAgICAgICAgICAgIkhBTCBEZXZpY2UgJWQgaGVsIGxpbmUgY2FwcyBoYXMgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFIHNldFxuIiwgdmVyKTsKICAgICAgICBvaygoaGVsLT5kcGNUcmlDYXBzLmR3VGV4dHVyZUNhcHMgJiBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUpID09IDAsCiAgICAgICAgICAgIkhBTCBEZXZpY2UgJWQgaGVsIHRyaSBjYXBzIGhhcyBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUgc2V0XG4iLCB2ZXIpOwogICAgfQogICAgZWxzZSBpZihJc0VxdWFsR1VJRCgmSUlEX0lEaXJlY3QzRFJlZkRldmljZSwgR3VpZCkpCiAgICB7CiAgICAgICAgb2soKGhhbC0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QT1cyKSA9PSAwLAogICAgICAgICAgICJSRUYgRGV2aWNlICVkIGhhbCBsaW5lIGNhcHMgaGFzIEQzRFBURVhUVVJFQ0FQU19QT1cyIGZsYWcgc2V0XG4iLCB2ZXIpOwogICAgICAgIG9rKChoYWwtPmRwY1RyaUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QT1cyKSA9PSAwLAogICAgICAgICAgICJSRUYgRGV2aWNlICVkIGhhbCB0cmkgY2FwcyBoYXMgRDNEUFRFWFRVUkVDQVBTX1BPVzIgZmxhZyBzZXRcbiIsIHZlcik7CiAgICAgICAgb2soaGVsLT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVDYXBzICYgRDNEUFRFWFRVUkVDQVBTX1BPVzIsCiAgICAgICAgICAgIlJFRiBEZXZpY2UgJWQgaGVsIGxpbmUgY2FwcyBkb2VzIG5vdCBoYXZlIEQzRFBURVhUVVJFQ0FQU19QT1cyIGZsYWcgc2V0XG4iLCB2ZXIpOwogICAgICAgIG9rKGhlbC0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVDYXBzICYgRDNEUFRFWFRVUkVDQVBTX1BPVzIsCiAgICAgICAgICAgIlJFRiBEZXZpY2UgJWQgaGVsIHRyaSBjYXBzIGRvZXMgbm90IGhhdmUgRDNEUFRFWFRVUkVDQVBTX1BPVzIgZmxhZyBzZXRcbiIsIHZlcik7CgogICAgICAgIG9rKChoYWwtPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUNhcHMgJiBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUpID09IDAsCiAgICAgICAgICAgIlJFRiBEZXZpY2UgJWQgaGFsIGxpbmUgY2FwcyBoYXMgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFIHNldFxuIiwgdmVyKTsKICAgICAgICBvaygoaGFsLT5kcGNUcmlDYXBzLmR3VGV4dHVyZUNhcHMgJiBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUpID09IDAsCiAgICAgICAgICAgIlJFRiBEZXZpY2UgJWQgaGFsIHRyaSBjYXBzIGhhcyBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUgc2V0XG4iLCB2ZXIpOwogICAgICAgIG9rKGhlbC0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSwKICAgICAgICAgICAiUkVGIERldmljZSAlZCBoZWwgdHJpIGNhcHMgZG9lcyBub3QgaGF2ZSBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUgc2V0XG4iLCB2ZXIpOwogICAgICAgIG9rKGhlbC0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVDYXBzICYgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFLAogICAgICAgICAgICJSRUYgRGV2aWNlICVkIGhlbCB0cmkgY2FwcyBkb2VzIG5vdCBoYXZlIEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSBzZXRcbiIsIHZlcik7CiAgICB9CiAgICBlbHNlIGlmKElzRXF1YWxHVUlEKCZJSURfSURpcmVjdDNEUmFtcERldmljZSwgR3VpZCkpCiAgICB7CiAgICAgICAgb2soKGhhbC0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QT1cyKSA9PSAwLAogICAgICAgICAgICJSYW1wIERldmljZSAlZCBoYWwgbGluZSBjYXBzIGhhcyBEM0RQVEVYVFVSRUNBUFNfUE9XMiBmbGFnIHNldFxuIiwgdmVyKTsKICAgICAgICBvaygoaGFsLT5kcGNUcmlDYXBzLmR3VGV4dHVyZUNhcHMgJiBEM0RQVEVYVFVSRUNBUFNfUE9XMikgPT0gMCwKICAgICAgICAgICAiUmFtcCBEZXZpY2UgJWQgaGFsIHRyaSBjYXBzIGhhcyBEM0RQVEVYVFVSRUNBUFNfUE9XMiBmbGFnIHNldFxuIiwgdmVyKTsKICAgICAgICBvayhoZWwtPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUNhcHMgJiBEM0RQVEVYVFVSRUNBUFNfUE9XMiwKICAgICAgICAgICAiUmFtcCBEZXZpY2UgJWQgaGVsIGxpbmUgY2FwcyBkb2VzIG5vdCBoYXZlIEQzRFBURVhUVVJFQ0FQU19QT1cyIGZsYWcgc2V0XG4iLCB2ZXIpOwogICAgICAgIG9rKGhlbC0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVDYXBzICYgRDNEUFRFWFRVUkVDQVBTX1BPVzIsCiAgICAgICAgICAgIlJhbXAgRGV2aWNlICVkIGhlbCB0cmkgY2FwcyBkb2VzIG5vdCBoYXZlIEQzRFBURVhUVVJFQ0FQU19QT1cyIGZsYWcgc2V0XG4iLCB2ZXIpOwoKICAgICAgICBvaygoaGFsLT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVDYXBzICYgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFKSA9PSAwLAogICAgICAgICAgICJSYW1wIERldmljZSAlZCBoYWwgbGluZSBjYXBzIGhhcyBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUgc2V0XG4iLCB2ZXIpOwogICAgICAgIG9rKChoYWwtPmRwY1RyaUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSkgPT0gMCwKICAgICAgICAgICAiUmFtcCBEZXZpY2UgJWQgaGFsIHRyaSBjYXBzIGhhcyBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUgc2V0XG4iLCB2ZXIpOwogICAgICAgIG9rKGhlbC0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSwKICAgICAgICAgICAiUmFtcCBEZXZpY2UgJWQgaGVsIHRyaSBjYXBzIGRvZXMgbm90IGhhdmUgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFIHNldFxuIiwgdmVyKTsKICAgICAgICBvayhoZWwtPmRwY1RyaUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSwKICAgICAgICAgICAiUmFtcCBEZXZpY2UgJWQgaGVsIHRyaSBjYXBzIGRvZXMgbm90IGhhdmUgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFIHNldFxuIiwgdmVyKTsKICAgIH0KICAgIGVsc2UgaWYoSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0M0RNTVhEZXZpY2UsIEd1aWQpKQogICAgewogICAgICAgIG9rKChoYWwtPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUNhcHMgJiBEM0RQVEVYVFVSRUNBUFNfUE9XMikgPT0gMCwKICAgICAgICAgICAiTU1YIERldmljZSAlZCBoYWwgbGluZSBjYXBzIGhhcyBEM0RQVEVYVFVSRUNBUFNfUE9XMiBmbGFnIHNldFxuIiwgdmVyKTsKICAgICAgICBvaygoaGFsLT5kcGNUcmlDYXBzLmR3VGV4dHVyZUNhcHMgJiBEM0RQVEVYVFVSRUNBUFNfUE9XMikgPT0gMCwKICAgICAgICAgICAiTU1YIERldmljZSAlZCBoYWwgdHJpIGNhcHMgaGFzIEQzRFBURVhUVVJFQ0FQU19QT1cyIGZsYWcgc2V0XG4iLCB2ZXIpOwogICAgICAgIG9rKGhlbC0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QT1cyLAogICAgICAgICAgICJNTVggRGV2aWNlICVkIGhlbCBsaW5lIGNhcHMgZG9lcyBub3QgaGF2ZSBEM0RQVEVYVFVSRUNBUFNfUE9XMiBmbGFnIHNldFxuIiwgdmVyKTsKICAgICAgICBvayhoZWwtPmRwY1RyaUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QT1cyLAogICAgICAgICAgICJNTVggRGV2aWNlICVkIGhlbCB0cmkgY2FwcyBkb2VzIG5vdCBoYXZlIEQzRFBURVhUVVJFQ0FQU19QT1cyIGZsYWcgc2V0XG4iLCB2ZXIpOwoKICAgICAgICBvaygoaGFsLT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVDYXBzICYgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFKSA9PSAwLAogICAgICAgICAgICJNTVggRGV2aWNlICVkIGhhbCBsaW5lIGNhcHMgaGFzIEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSBzZXRcbiIsIHZlcik7CiAgICAgICAgb2soKGhhbC0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVDYXBzICYgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFKSA9PSAwLAogICAgICAgICAgICJNTVggRGV2aWNlICVkIGhhbCB0cmkgY2FwcyBoYXMgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFIHNldFxuIiwgdmVyKTsKICAgICAgICBvayhoZWwtPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUNhcHMgJiBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUsCiAgICAgICAgICAgIk1NWCBEZXZpY2UgJWQgaGVsIHRyaSBjYXBzIGRvZXMgbm90IGhhdmUgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFIHNldFxuIiwgdmVyKTsKICAgICAgICBvayhoZWwtPmRwY1RyaUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSwKICAgICAgICAgICAiTU1YIERldmljZSAlZCBoZWwgdHJpIGNhcHMgZG9lcyBub3QgaGF2ZSBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUgc2V0XG4iLCB2ZXIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIG9rKEZBTFNFLCAiVW5leHBlY3RlZCBkZXZpY2UgZW51bWVyYXRlZDogXCIlc1wiIFwiJXNcIlxuIiwgRGV2aWNlRGVzY3JpcHRpb24sIERldmljZU5hbWUpOwogICAgICAgIGlmKGhhbC0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QT1cyKSB0cmFjZSgiaGFsIGxpbmUgaGFzIHBvdzIgc2V0XG4iKTsKICAgICAgICBlbHNlIHRyYWNlKCJoYWwgbGluZSBkb2VzIE5PVCBoYXZlIHBvdzIgc2V0XG4iKTsKICAgICAgICBpZihoYWwtPmRwY1RyaUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QT1cyKSB0cmFjZSgiaGFsIHRyaSBoYXMgcG93MiBzZXRcbiIpOwogICAgICAgIGVsc2UgdHJhY2UoImhhbCB0cmkgZG9lcyBOT1QgaGF2ZSBwb3cyIHNldFxuIik7CiAgICAgICAgaWYoaGVsLT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVDYXBzICYgRDNEUFRFWFRVUkVDQVBTX1BPVzIpIHRyYWNlKCJoZWwgbGluZSBoYXMgcG93MiBzZXRcbiIpOwogICAgICAgIGVsc2UgdHJhY2UoImhlbCBsaW5lIGRvZXMgTk9UIGhhdmUgcG93MiBzZXRcbiIpOwogICAgICAgIGlmKGhlbC0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVDYXBzICYgRDNEUFRFWFRVUkVDQVBTX1BPVzIpIHRyYWNlKCJoZWwgdHJpIGhhcyBwb3cyIHNldFxuIik7CiAgICAgICAgZWxzZSB0cmFjZSgiaGVsIHRyaSBkb2VzIE5PVCBoYXZlIHBvdzIgc2V0XG4iKTsKICAgIH0KICAgIHJldHVybiBEREVOVU1SRVRfT0s7Cn0KCnN0YXRpYyB2b2lkIENhcHNUZXN0KHZvaWQpCnsKICAgIElEaXJlY3QzRDMgKmQzZDM7CiAgICBJRGlyZWN0M0QzICpkM2QyOwogICAgSURpcmVjdERyYXcgKmRkMTsKICAgIEhSRVNVTFQgaHI7CiAgICBVSU5UIHZlcjsKCiAgICBociA9IERpcmVjdERyYXdDcmVhdGUoTlVMTCwgJmRkMSwgTlVMTCk7CiAgICBvayhociA9PSBERF9PSywgIkNhbm5vdCBjcmVhdGUgYSBEaXJlY3REcmF3IDEgaW50ZXJmYWNlLCBociA9ICUwOHhcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdERyYXdfUXVlcnlJbnRlcmZhY2UoZGQxLCAmSUlEX0lEaXJlY3QzRDMsICh2b2lkICoqKSAmZDNkMyk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZSByZXR1cm5lZCAlMDh4XG4iLCBocik7CiAgICB2ZXIgPSAzOwogICAgSURpcmVjdDNEM19FbnVtRGV2aWNlcyhkM2QzLCBlbnVtRGV2aWNlc0NhbGxiYWNrLCAmdmVyKTsKCiAgICBJRGlyZWN0M0QzX1JlbGVhc2UoZDNkMyk7CiAgICBJRGlyZWN0RHJhd19SZWxlYXNlKGRkMSk7CgogICAgaHIgPSBEaXJlY3REcmF3Q3JlYXRlKE5VTEwsICZkZDEsIE5VTEwpOwogICAgb2soaHIgPT0gRERfT0ssICJDYW5ub3QgY3JlYXRlIGEgRGlyZWN0RHJhdyAxIGludGVyZmFjZSwgaHIgPSAlMDh4XG4iLCBocik7CiAgICBociA9IElEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKGRkMSwgJklJRF9JRGlyZWN0M0QyLCAodm9pZCAqKikgJmQzZDIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdERyYXdfUXVlcnlJbnRlcmZhY2UgcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgdmVyID0gMjsKICAgIElEaXJlY3QzRDJfRW51bURldmljZXMoZDNkMiwgZW51bURldmljZXNDYWxsYmFjaywgJnZlcik7CgogICAgSURpcmVjdDNEMl9SZWxlYXNlKGQzZDIpOwogICAgSURpcmVjdERyYXdfUmVsZWFzZShkZDEpOwp9CgpTVEFSVF9URVNUKGQzZCkKewogICAgaW5pdF9mdW5jdGlvbl9wb2ludGVycygpOwogICAgaWYoIXBEaXJlY3REcmF3Q3JlYXRlRXgpIHsKICAgICAgICB0cmFjZSgiZnVuY3Rpb24gRGlyZWN0RHJhd0NyZWF0ZUV4IG5vdCBhdmFpbGFibGUsIHNraXBwaW5nIHRlc3RzXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYoIUNyZWF0ZURpcmVjdDNEKCkpIHsKICAgICAgICB0cmFjZSgiU2tpcHBpbmcgdGVzdHNcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIExpZ2h0VGVzdCgpOwogICAgUHJvY2Vzc1ZlcnRpY2VzVGVzdCgpOwogICAgU3RhdGVUZXN0KCk7CiAgICBTY2VuZVRlc3QoKTsKICAgIExpbWl0VGVzdCgpOwogICAgQ2Fwc1Rlc3QoKTsKICAgIFJlbGVhc2VEaXJlY3QzRCgpOwp9Cg==