diff --git a/serialport/src/main/java/android/serialport/manager/FactoryModeProcessManager.java b/serialport/src/main/java/android/serialport/manager/FactoryModeProcessManager.java new file mode 100644 index 0000000..3e26925 --- /dev/null +++ b/serialport/src/main/java/android/serialport/manager/FactoryModeProcessManager.java @@ -0,0 +1,206 @@ +cGFja2FnZSBhbmRyb2lkLnNlcmlhbHBvcnQubWFuYWdlcjsKCmltcG9ydCBhbmRyb2lkLmNvbnRl +bnQuQ29udGV4dDsKaW1wb3J0IGFuZHJvaWQuc2VyaWFscG9ydC5tb2RlbC5QcmludGVyUmVzcG9u +c2VNb2RlbDsKaW1wb3J0IGFuZHJvaWQuc2VyaWFscG9ydC51dGlscy5CeXRlVXRpbDsKaW1wb3J0 +IGFuZHJvaWQuc2VyaWFscG9ydC51dGlscy5Mb2dnZXI7CgpwdWJsaWMgY2xhc3MgRmFjdG9yeU1v +ZGVQcm9jZXNzTWFuYWdlciB7CiAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAgICBwcml2 +YXRlIHN0YXRpYyBGYWN0b3J5TW9kZVByb2Nlc3NNYW5hZ2VyIG1Qcm90b2NvbE1hbmFnZXI7CiAg +ICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9UQUxfQllURVMgPSA2NDsKICAgIC8vUHJpbnQg +UmVxdWVzdCBBbnN3ZXIKICAgIC8vRmlsZSBBdmFpbGFibGUKICAgIHByaXZhdGUgZmluYWwgaW50 +IEZNX1JFUVVFU1RfQUxMT1cgPSAweDAxOwogICAgcHJpdmF0ZSBmaW5hbCBpbnQgRk1fUkVRVUVT +VF9SRUpFQ1QgPSAweEZGOwoKICAgIHByaXZhdGUgZmluYWwgaW50IE5PTkVfRVJST1IgPSAweDAw +OwogICAgcHJpdmF0ZSBmaW5hbCBpbnQgU1lTVEVNX09WRVJfSEVBVCA9IDB4MDU7CiAgICBwcml2 +YXRlIGZpbmFsIGludCBTWVNURU1fT1ZFUl9DT0xEID0gMHgwNjsKICAgIHByaXZhdGUgZmluYWwg +aW50IERVUklOR19VUEdSQURJTkcgPSAweDBFOwogICAgcHJpdmF0ZSBmaW5hbCBpbnQgRFVSSU5H +X1BSSU5USU5HID0gMHgxMDsKCgogICAgLy9FbmQgb2YgcHJpbnRlcgogICAgcHJpdmF0ZSBmaW5h +bCBpbnQgRU5EX09GX1BSSU5UX1NVQ0NFU1MgPSAweDU1OwogICAgcHJpdmF0ZSBmaW5hbCBpbnQg +RU5EX09GX1BSSU5UX0VSUk9SID0gMHhBMDsKCiAgICAvL0ZXIFZhcmlhYmxlCiAgICAvL1VwZ3Jh +ZGUgRXJyb3IgTWVzc2FnZSAoZm9yIFVwZ3JhZGVFcnJNZXNzYWdlKQogICAgcHJpdmF0ZSBmaW5h +bCBpbnQgRklMRV9FUlJPUiA9IDB4MDE7CgogICAgLy9QYXBlciBUcmF5CiAgICBwcml2YXRlIGZp +bmFsIGludCBQQVBFUl9UUkFZX0VNUFRZID0gMHgwMTsKCiAgICBwcml2YXRlIEZhY3RvcnlNb2Rl +UHJvY2Vzc01hbmFnZXIoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgbUNvbnRleHQgPSBjb250 +ZXh0OwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgRmFjdG9yeU1vZGVQcm9jZXNzTWFuYWdlciBn +ZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICBpZiAobVByb3RvY29sTWFuYWdl +ciA9PSBudWxsKSB7CiAgICAgICAgICAgIG1Qcm90b2NvbE1hbmFnZXIgPSBuZXcgRmFjdG9yeU1v +ZGVQcm9jZXNzTWFuYWdlcihjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1Qcm90 +b2NvbE1hbmFnZXI7CiAgICB9CiAgICAvKioKICAgICAqIHBhcnNlIGZhY3RvcnkgbW9kZSByZXF1 +ZXN0IGJ5dGUgcmVzcG9uc2UKICAgICAqCiAgICAgKiBAcGFyYW0gcGF5bG9hZCAtIFByaW50ZXIg +cGF5bG9hZAogICAgICogQHJldHVybiAtIFByaW50ZXJSZXNwb25zZSBNb2RlbChJc1N1Y2Nlc3Ms +IE1lc3NhZ2UsIEVycm9yQ29kZSkKICAgICAqLwogICAgcHVibGljIFByaW50ZXJSZXNwb25zZU1v +ZGVsIHBhcnNlRk1SZXF1ZXN0QUNLUHJvY2VzcyhieXRlW10gcGF5bG9hZCkgewogICAgICAgIC8v +MHgxQgkweDJBCTB4NDMJMHg0MQkweDAxCTB4MDEJMHhGMAkweDAwCUFsbG93OiAweDAxIFJlamVj +dDoweEZGCiAgICAgICAgUHJpbnRlclJlc3BvbnNlTW9kZWwgcmVzcG9uc2UgPSBudWxsOwogICAg +ICAgIGlmIChwYXlsb2FkICE9IG51bGwgJiYgcGF5bG9hZC5sZW5ndGggPT0gVE9UQUxfQllURVMp +IHsKICAgICAgICAgICAgZmluYWwgYnl0ZSByZXF1ZXN0QW5zd2VyID0gcGF5bG9hZFs4XTsKICAg +ICAgICAgICAgcmVzcG9uc2UgPSBuZXcgUHJpbnRlclJlc3BvbnNlTW9kZWwoKTsKICAgICAgICAg +ICAgTG9nZ2VyLmQoIkZNICByZXF1ZXN0QW5zd2VyOiAiK0J5dGVVdGlsLmJ5dGVzVG9IZXhXaXRo +U3BhY2UocmVxdWVzdEFuc3dlcikpOwogICAgICAgICAgICBpZiAocmVxdWVzdEFuc3dlciA9PSAo +Ynl0ZSkgRk1fUkVRVUVTVF9SRUpFQ1QpIHsKICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN1 +Y2Nlc3MoZmFsc2UpOwogICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0TWVzc2FnZSgiRmFjdG9y +eSBNb2RlIFJlamVjdGVkIik7CiAgICAgICAgICAgIH1lbHNlIGlmIChyZXF1ZXN0QW5zd2VyID09 +IEZNX1JFUVVFU1RfQUxMT1cpIHsKICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN1Y2Nlc3Mo +dHJ1ZSk7CiAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdWNjZXNzQ29kZShGTV9SRVFVRVNU +X0FMTE9XKTsKICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldE1lc3NhZ2UoIkZhY3RvcnkgTW9k +ZSBBbGxvd2VkIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXNwb25z +ZS5zZXRTdWNjZXNzKHRydWUpOwogICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3VjY2Vzc0Nv +ZGUoRk1fUkVRVUVTVF9BTExPVyk7CiAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRNZXNzYWdl +KCJGYWN0b3J5IE1vZGUgQWxsb3dlZCIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAg +IHJldHVybiByZXNwb25zZTsKICAgIH0KCiAgICAvKioKICAgICAqIHBhcnNlIGZhY3RvcnkgbW9k +ZSBidXJuLWluIGJ5dGUgcmVzcG9uc2UKICAgICAqCiAgICAgKiBAcGFyYW0gcGF5bG9hZCAtIFBy +aW50ZXIgcGF5bG9hZAogICAgICogQHJldHVybiAtIFByaW50ZXJSZXNwb25zZSBNb2RlbChJc1N1 +Y2Nlc3MsIE1lc3NhZ2UsIEVycm9yQ29kZSkKICAgICAqLwogICAgcHVibGljIFByaW50ZXJSZXNw +b25zZU1vZGVsIHBhcnNlQnVybkluQWNrUHJvY2VzcyhieXRlW10gcGF5bG9hZCkgewogICAgICAg +IC8vMHgxQgkweDJBCTB4NDMJMHg0MQkweDAxCTB4MDEJMHhGMAkweDAxCiAgICAgICAgYnl0ZSBv +bmVDaGFyICAgPSAweDFCOwogICAgICAgIGJ5dGUgdHdvQ2hhciAgID0gMHgyQTsKICAgICAgICBi +eXRlIHRocmVlQ2hhciA9IDB4NDM7CiAgICAgICAgYnl0ZSBmb3VyQ2hhciAgPSAweDQxOwogICAg +ICAgIGJ5dGUgZml2ZUNoYXIgID0gMHgwMTsKICAgICAgICBieXRlIHNpeENoYXIgICA9IDB4MDE7 +CiAgICAgICAgYnl0ZSBzZXZlbkNoYXIgPSAoYnl0ZSkweEYwOwogICAgICAgIGJ5dGUgZWlnaHRD +aGFyID0gMHgwMTsKICAgICAgICBQcmludGVyUmVzcG9uc2VNb2RlbCByZXNwb25zZSA9IG51bGw7 +CiAgICAgICAgaWYgKHBheWxvYWQgIT0gbnVsbCAmJiBwYXlsb2FkLmxlbmd0aCA9PSBUT1RBTF9C +WVRFUykgewogICAgICAgICAgICByZXNwb25zZSA9IG5ldyBQcmludGVyUmVzcG9uc2VNb2RlbCgp +OwogICAgICAgICAgICBpZiAob25lQ2hhciA9PSBwYXlsb2FkWzBdCiAgICAgICAgICAgICAgICAg +ICAgJiYgdHdvQ2hhciA9PSBwYXlsb2FkWzFdCiAgICAgICAgICAgICAgICAgICAgJiYgdGhyZWVD +aGFyID09IHBheWxvYWRbMl0KICAgICAgICAgICAgICAgICAgICAmJiBmb3VyQ2hhciA9PSBwYXls +b2FkWzNdCiAgICAgICAgICAgICAgICAgICAgJiYgZml2ZUNoYXIgPT0gcGF5bG9hZFs0XQogICAg +ICAgICAgICAgICAgICAgICYmIHNpeENoYXIgPT0gcGF5bG9hZFs1XQogICAgICAgICAgICAgICAg +ICAgICYmIHNldmVuQ2hhciA9PSBwYXlsb2FkWzZdCiAgICAgICAgICAgICAgICAgICAgJiYgZWln +aHRDaGFyID09IHBheWxvYWRbN10pIHsKICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN1Y2Nl +c3ModHJ1ZSk7CiAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdWNjZXNzQ29kZShGTV9SRVFV +RVNUX0FMTE9XKTsKICAgICAgICAgICAgICAgIExvZ2dlci5kKCAiQnVybkluQSBTdWNjZXNzIik7 +CiAgICAgICAgICAgIH0gZWxzZSAgewogICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3VjY2Vz +cyhmYWxzZSk7CiAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRFcnJvckNvZGUoRk1fUkVRVUVT +VF9SRUpFQ1QpOwogICAgICAgICAgICAgICAgTG9nZ2VyLmQoICJCdXJuSW5BIFJlamVjdCIpOwog +ICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0KICAgIC8q +KgogICAgICogcGFyc2UgZmFjdG9yeSBtb2RlIGNhbWVyYSBieXRlIHJlc3BvbnNlCiAgICAgKgog +ICAgICogQHBhcmFtIHBheWxvYWQgLSBQcmludGVyIHBheWxvYWQKICAgICAqIEByZXR1cm4gLSBQ +cmludGVyUmVzcG9uc2UgTW9kZWwoSXNTdWNjZXNzLCBNZXNzYWdlLCBFcnJvckNvZGUpCiAgICAg +Ki8KICAgIHB1YmxpYyBQcmludGVyUmVzcG9uc2VNb2RlbCBwYXJzZUNhbWVyYUFja1Byb2Nlc3Mo +Ynl0ZVtdIHBheWxvYWQpIHsKICAgICAgICAvLzB4MUIJMHgyQQkweDQzCTB4NDEJMHgwMQkweDAx +CTB4RjAJMHgwMgogICAgICAgIGJ5dGUgb25lQ2hhciAgID0gMHgxQjsKICAgICAgICBieXRlIHR3 +b0NoYXIgICA9IDB4MkE7CiAgICAgICAgYnl0ZSB0aHJlZUNoYXIgPSAweDQzOwogICAgICAgIGJ5 +dGUgZm91ckNoYXIgID0gMHg0MTsKICAgICAgICBieXRlIGZpdmVDaGFyICA9IDB4MDE7CiAgICAg +ICAgYnl0ZSBzaXhDaGFyICAgPSAweDAxOwogICAgICAgIGJ5dGUgc2V2ZW5DaGFyID0gKGJ5dGUp +MHhGMDsKICAgICAgICBieXRlIGVpZ2h0Q2hhciA9IDB4MDI7CiAgICAgICAgUHJpbnRlclJlc3Bv +bnNlTW9kZWwgcmVzcG9uc2UgPSBudWxsOwogICAgICAgIGlmIChwYXlsb2FkICE9IG51bGwgJiYg +cGF5bG9hZC5sZW5ndGggPT0gVE9UQUxfQllURVMpIHsKICAgICAgICAgICAgcmVzcG9uc2UgPSBu +ZXcgUHJpbnRlclJlc3BvbnNlTW9kZWwoKTsKICAgICAgICAgICAgaWYgKG9uZUNoYXIgPT0gcGF5 +bG9hZFswXQogICAgICAgICAgICAgICAgICAgICYmIHR3b0NoYXIgPT0gcGF5bG9hZFsxXQogICAg +ICAgICAgICAgICAgICAgICYmIHRocmVlQ2hhciA9PSBwYXlsb2FkWzJdCiAgICAgICAgICAgICAg +ICAgICAgJiYgZm91ckNoYXIgPT0gcGF5bG9hZFszXQogICAgICAgICAgICAgICAgICAgICYmIGZp +dmVDaGFyID09IHBheWxvYWRbNF0KICAgICAgICAgICAgICAgICAgICAmJiBzaXhDaGFyID09IHBh +eWxvYWRbNV0KICAgICAgICAgICAgICAgICAgICAmJiBzZXZlbkNoYXIgPT0gcGF5bG9hZFs2XQog +ICAgICAgICAgICAgICAgICAgICYmIGVpZ2h0Q2hhciA9PSBwYXlsb2FkWzddKSB7CiAgICAgICAg +ICAgICAgICByZXNwb25zZS5zZXRTdWNjZXNzKHRydWUpOwogICAgICAgICAgICAgICAgcmVzcG9u +c2Uuc2V0U3VjY2Vzc0NvZGUoRk1fUkVRVUVTVF9BTExPVyk7CiAgICAgICAgICAgICAgICBMb2dn +ZXIuZCggIkZNIENhbWVyYSBTdWNjZXNzIik7CiAgICAgICAgICAgIH0gZWxzZSAgewogICAgICAg +ICAgICAgICAgcmVzcG9uc2Uuc2V0U3VjY2VzcyhmYWxzZSk7CiAgICAgICAgICAgICAgICByZXNw +b25zZS5zZXRFcnJvckNvZGUoRk1fUkVRVUVTVF9SRUpFQ1QpOwogICAgICAgICAgICAgICAgTG9n +Z2VyLmQoICJGTSBDYW1lcmEgUmVqZWN0Iik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAg +ICAgcmV0dXJuIHJlc3BvbnNlOwogICAgfQogICAgLyoqCiAgICAgKiBwYXJzZSBmYWN0b3J5IG1v +ZGUgRlFDIGJ5dGUgcmVzcG9uc2UKICAgICAqCiAgICAgKiBAcGFyYW0gcGF5bG9hZCAtIFByaW50 +ZXIgcGF5bG9hZAogICAgICogQHJldHVybiAtIFByaW50ZXJSZXNwb25zZSBNb2RlbChJc1N1Y2Nl +c3MsIE1lc3NhZ2UsIEVycm9yQ29kZSkKICAgICAqLwogICAgcHVibGljIFByaW50ZXJSZXNwb25z +ZU1vZGVsIHBhcnNlRlFDQWNrUHJvY2VzcyhieXRlW10gcGF5bG9hZCkgewogICAgICAgIC8vMHgx +QgkweDJBCTB4NDMJMHg0MQkweDAxCTB4MDEJMHhGMAkweDAzCiAgICAgICAgYnl0ZSBvbmVDaGFy +ICAgPSAweDFCOwogICAgICAgIGJ5dGUgdHdvQ2hhciAgID0gMHgyQTsKICAgICAgICBieXRlIHRo +cmVlQ2hhciA9IDB4NDM7CiAgICAgICAgYnl0ZSBmb3VyQ2hhciAgPSAweDQxOwogICAgICAgIGJ5 +dGUgZml2ZUNoYXIgID0gMHgwMTsKICAgICAgICBieXRlIHNpeENoYXIgICA9IDB4MDE7CiAgICAg +ICAgYnl0ZSBzZXZlbkNoYXIgPSAoYnl0ZSkweEYwOwogICAgICAgIGJ5dGUgZWlnaHRDaGFyID0g +MHgwMzsKICAgICAgICBQcmludGVyUmVzcG9uc2VNb2RlbCByZXNwb25zZSA9IG51bGw7CiAgICAg +ICAgaWYgKHBheWxvYWQgIT0gbnVsbCAmJiBwYXlsb2FkLmxlbmd0aCA9PSBUT1RBTF9CWVRFU +ikgewogICAgICAgICAgICByZXNwb25zZSA9IG5ldyBQcmludGVyUmVzcG9uc2VNb2RlbCgpOwog +ICAgICAgICAgICBpZiAob25lQ2hhciA9PSBwYXlsb2FkWzBdCiAgICAgICAgICAgICAgICAgICAg +JiYgdHdvQ2hhciA9PSBwYXlsb2FkWzFdCiAgICAgICAgICAgICAgICAgICAgJiYgdGhyZWVDaGFy +ID09IHBheWxvYWRbMl0KICAgICAgICAgICAgICAgICAgICAmJiBmb3VyQ2hhciA9PSBwYXlsb2Fk +WzNdCiAgICAgICAgICAgICAgICAgICAgJiYgZml2ZUNoYXIgPT0gcGF5bG9hZFs0XQogICAgICAg +ICAgICAgICAgICAgICYmIHNpeENoYXIgPT0gcGF5bG9hZFs1XQogICAgICAgICAgICAgICAgICAg +ICYmIHNldmVuQ2hhciA9PSBwYXlsb2FkWzZdCiAgICAgICAgICAgICAgICAgICAgJiYgZWlnaHRD +aGFyID09IHBheWxvYWRbN10pIHsKICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN1Y2Nlc3Mo +dHJ1ZSk7CiAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdWNjZXNzQ29kZShGTV9SRVFVRVNU +X0FMTE9XKTsKICAgICAgICAgICAgICAgIExvZ2dlci5kKCAiRk0gRlFDIFN1Y2Nlc3MiKTsKICAg +ICAgICAgICAgfSBlbHNlICB7CiAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdWNjZXNzKGZh +bHNlKTsKICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEVycm9yQ29kZShGTV9SRVFVRVNUX1JF +SkVDVCk7CiAgICAgICAgICAgICAgICBMb2dnZXIuZCggIkZNIEZRQyBSZWplY3QiKTsKICAgICAg +ICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICB9CiAgICAvKioK +ICAgICAqIHBhcnNlIGZhY3RvcnkgbW9kZSBzaGlwcGluZyBieXRlIHJlc3BvbnNlCiAgICAgKgog +ICAgICogQHBhcmFtIHBheWxvYWQgLSBQcmludGVyIHBheWxvYWQKICAgICAqIEByZXR1cm4gLSBQ +cmludGVyUmVzcG9uc2UgTW9kZWwoSXNTdWNjZXNzLCBNZXNzYWdlLCBFcnJvckNvZGUpCiAgICAg +Ki8KICAgIHB1YmxpYyBQcmludGVyUmVzcG9uc2VNb2RlbCBwYXJzZVNoaXBwaW5nQWNrUHJvY2Vz +cyhieXRlW10gcGF5bG9hZCkgewogICAgICAgIC8vMHgxQgkweDJBCTB4NDMJMHg0MQkweDAxCTB4 +MDEJMHhGMAkweDA0CiAgICAgICAgYnl0ZSBvbmVDaGFyICAgPSAweDFCOwogICAgICAgIGJ5dGUg +dHdvQ2hhciAgID0gMHgyQTsKICAgICAgICBieXRlIHRocmVlQ2hhciA9IDB4NDM7CiAgICAgICAg +Ynl0ZSBmb3VyQ2hhciAgPSAweDQxOwogICAgICAgIGJ5dGUgZml2ZUNoYXIgID0gMHgwMTsKICAg +ICAgICBieXRlIHNpeENoYXIgICA9IDB4MDE7CiAgICAgICAgYnl0ZSBzZXZlbkNoYXIgPSAoYnl0 +ZSkweEYwOwogICAgICAgIGJ5dGUgZWlnaHRDaGFyID0gMHgwNDsKICAgICAgICBQcmludGVyUmVz +cG9uc2VNb2RlbCByZXNwb25zZSA9IG51bGw7CiAgICAgICAgaWYgKHBheWxvYWQgIT0gbnVsbCAm +JiBwYXlsb2FkLmxlbmd0aCA9PSBUT1RBTF9CWVRFUykgewogICAgICAgICAgICByZXNwb25zZSA9 +IG5ldyBQcmludGVyUmVzcG9uc2VNb2RlbCgpOwogICAgICAgICAgICBpZiAob25lQ2hhciA9PSBw +YXlsb2FkWzBdCiAgICAgICAgICAgICAgICAgICAgJiYgdHdvQ2hhciA9PSBwYXlsb2FkWzFdCiAg +ICAgICAgICAgICAgICAgICAgJiYgdGhyZWVDaGFyID09IHBheWxvYWRbMl0KICAgICAgICAgICAg +ICAgICAgICAmJiBmb3VyQ2hhciA9PSBwYXlsb2FkWzNdCiAgICAgICAgICAgICAgICAgICAgJiYg +Zml2ZUNoYXIgPT0gcGF5bG9hZFs0XQogICAgICAgICAgICAgICAgICAgICYmIHNpeENoYXIgPT0g +cGF5bG9hZFs1XQogICAgICAgICAgICAgICAgICAgICYmIHNldmVuQ2hhciA9PSBwYXlsb2FkWzZd +CiAgICAgICAgICAgICAgICAgICAgJiYgZWlnaHRDaGFyID09IHBheWxvYWRbN10pIHsKICAgICAg +ICAgICAgICAgIHJlc3BvbnNlLnNldFN1Y2Nlc3ModHJ1ZSk7CiAgICAgICAgICAgICAgICByZXNw +b25zZS5zZXRTdWNjZXNzQ29kZShGTV9SRVFVRVNUX0FMTE9XKTsKICAgICAgICAgICAgICAgIExv +Z2dlci5kKCAiRk0gU2hpcHBpbmcgU3VjY2VzcyIpOwogICAgICAgICAgICB9IGVsc2UgIHsKICAg +ICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN1Y2Nlc3MoZmFsc2UpOwogICAgICAgICAgICAgICAg +cmVzcG9uc2Uuc2V0RXJyb3JDb2RlKEZNX1JFUVVFU1RfUkVKRUNUKTsKICAgICAgICAgICAgICAg +IExvZ2dlci5kKCAiRk0gU2hpcHBpbmcgUmVqZWN0Iik7CiAgICAgICAgICAgIH0KICAgICAgICB9 +CiAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgfQoKICAgIC8qKgogICAgICogcGFyc2UgZmFj +dG9yeSBtb2RlIHZlcnNpb24gYXNrIGJ5dGUgcmVzcG9uc2UKICAgICAqCiAgICAgKiBAcGFyYW0g +cGF5bG9hZCAtIFByaW50ZXIgcGF5bG9hZAogICAgICogQHJldHVybiAtIFByaW50ZXJSZXNwb25z +ZSBNb2RlbChJc1N1Y2Nlc3MsIE1lc3NhZ2UsIEVycm9yQ29kZSkKICAgICAqLwogICAgcHVibGlj +IFByaW50ZXJSZXNwb25zZU1vZGVsIHBhcnNlVmVyc2lvbkFza0Fja1Byb2Nlc3MoYnl0ZVtdIHBh +eWxvYWQpIHsKCiAgICAgICAgLy8weDFCCTB4MkEJMHg0MwkweDQxCTB4MDEJMHgwMQkweDAzCTB4 +RkYKICAgICAgICAvLyAweDAwIC0gRHNwRndWZXJfSAogICAgICAgIC8vIDB4MDAgLSBEc3BGd1Zlcl9N +CiAgICAgICAgLy8gMHgwMCAtIERzcEZ3VmVyX0wKICAgICAgICAvLyAweDAwIC0gSFdJRAogICAg +ICAgIC8vIDB4MDAgLSBUTUQKICAgICAgICBQcmludGVyUmVzcG9uc2VNb2RlbCByZXNwb25zZSA9 +IG51bGw7CiAgICAgICAgaWYgKHBheWxvYWQgIT0gbnVsbCAmJiBwYXlsb2FkLmxlbmd0aCA9PSBU +T1RBTF9CWVRFUykgewoKICAgICAgICAgICAgYnl0ZSBkc3BIID0gcGF5bG9hZFs4XTsKICAgICAg +ICAgICAgYnl0ZSBkc3BNID0gcGF5bG9hZFs5XTsKICAgICAgICAgICAgYnl0ZSBkc3BMID0gcGF5 +bG9hZFsxMF07CiAgICAgICAgICAgIGJ5dGUgSFdJRCA9IHBheWxvYWRbMTFdOwogICAgICAgICAg +ICBieXRlIFRNRCA9IHBheWxvYWRbMTJdOwogICAgICAgICAgICBieXRlIGlzUGFwZXJUcmF5RW1w +dHkgPSBwYXlsb2FkWzE0XTsKCiAgICAgICAgICAgIExvZ2dlci5kKCJGTSBkc3BIOiAiICsgQnl0 +ZVV0aWwuYnl0ZXNUb0hleFdpdGhTcGFjZShkc3BIKSk7CiAgICAgICAgICAgIExvZ2dlci5kKCJG +TSBkc3BNOiAiICsgQnl0ZVV0aWwuYnl0ZXNUb0hleFdpdGhTcGFjZShkc3BNKSk7CiAgICAgICAg +ICAgIExvZ2dlci5kKCJGTSBkc3BMOiAiICsgQnl0ZVV0aWwuYnl0ZXNUb0hleFdpdGhTcGFjZShk +c3BMKSk7CiAgICAgICAgICAgIExvZ2dlci5kKCJGTSBIV0lEOiAiICsgQnl0ZVV0aWwuYnl0ZXNU +b0hleFdpdGhTcGFjZShIV0lEKSk7CiAgICAgICAgICAgIExvZ2dlci5kKCJGTSBUTUQ6ICIgKyBC +eXRlVXRpbC5ieXRlc1RvSGV4V2l0aFNwYWNlKFRNRCkpOwogICAgICAgICAgICBMb2dnZXIuZCgi +aXNQYXBlclRyYXlFbXB0eTogIiArIEJ5dGVVdGlsLmJ5dGVzVG9IZXhXaXRoU3BhY2UoaXNQYXBl +clRyYXlFbXB0eSkpOwogICAgICAgICAgICByZXNwb25zZSA9IG5ldyBQcmludGVyUmVzcG9uc2VN +b2RlbCgpOwogICAgICAgICAgICByZXNwb25zZS5zZXRTdWNjZXNzKHRydWUpOwogICAgICAgICAg +ICByZXNwb25zZS5zZXRNZXNzYWdlKCJGTSAgVmVyc2lvbiBQcm9jZXNzIik7CiAgICAgICAgICAg +IHJlc3BvbnNlLnNldFN1Y2Nlc3NDb2RlKEZNX1JFUVVFU1RfQUxMT1cpOwogICAgICAgICAgICBy +ZXNwb25zZS5zZXREc3BIKGRzcEgpOwogICAgICAgICAgICByZXNwb25zZS5zZXREc3BNKGR +zcE0pOwogICAgICAgICAgICByZXNwb25zZS5zZXREc3BMKGR +zcEwpOwogICAgICAgICAgICByZXNwb25zZS5zZXRIV0lEKEhXSUQpOwogICAgICAgICAgICByZXNw +b25zZS5zZXRUTUQoVE1EKTsKICAgICAgICAgICAgcmVzcG9uc2Uuc2V0UGFwZXJUcmF5RW1wdHko +aXNQYXBlclRyYXlFbXB0eSA9PSBQQVBFUl9UUkFZX0VNUFRZKTsKCiAgICAgICAgfQogICAgICAg +IHJldHVybiByZXNwb25zZTsKICAgIH0KCiAgICAvKioKICAgICAqIHBhcnNlIGZhY3RvcnkgbW9k +ZSByZXNldCBieXRlIHJlc3BvbnNlCiAgICAgKgogICAgICogQHBhcmFtIHBheWxvYWQgLSBQcmlu +dGVyIHBheWxvYWQKICAgICAqIEByZXR1cm4gLSBQcmludGVyUmVzcG9uc2UgTW9kZWwoSXNTdWNj +ZXNzLCBNZXNzYWdlLCBFcnJvckNvZGUpCiAgICAgKi8KICAgIHB1YmxpYyBQcmludGVyUmVzcG9u +c2VNb2RlbCBwYXJzZVJlc2V0QWNrUHJvY2VzcyhieXRlW10gcGF5bG9hZCkgewogICAgICAgIC8v +MHgxQgkweDJBCTB4NDMJMHg0MQkweDAxCTB4MDEJMHhGMAkweEZGCiAgICAgICAgYnl0ZSBvbmVD +aGFyICAgPSAweDFCOwogICAgICAgIGJ5dGUgdHdvQ2hhciAgID0gMHgyQTsKICAgICAgICBieXRl +IHRocmVlQ2hhciA9IDB4NDM7CiAgICAgICAgYnl0ZSBmb3VyQ2hhciAgPSAweDQxOwogICAgICAg +IGJ5dGUgZml2ZUNoYXIgID0gMHgwMTsKICAgICAgICBieXRlIHNpeENoYXIgICA9IDB4MDE7CiAg +ICAgICAgYnl0ZSBzZXZlbkNoYXIgPSAoYnl0ZSkweEYwOwogICAgICAgIGJ5dGUgZWlnaHRDaGFy +ID0gKGJ5dGUpMHhGRjsKICAgICAgICBQcmludGVyUmVzcG9uc2VNb2RlbCByZXNwb25zZSA9IG51 +bGw7CiAgICAgICAgaWYgKHBheWxvYWQgIT0gbnVsbCAmJiBwYXlsb2FkLmxlbmd0aCA9PSBUT1RB +TF9CWVRFUykgewogICAgICAgICAgICByZXNwb25zZSA9IG5ldyBQcmludGVyUmVzcG9uc2VNb2Rl +bCgpOwogICAgICAgICAgICBpZiAob25lQ2hhciA9PSBwYXlsb2FkWzBdCiAgICAgICAgICAgICAg +ICAgICAgJiYgdHdvQ2hhciA9PSBwYXlsb2FkWzFdCiAgICAgICAgICAgICAgICAgICAgJiYgdGhy +ZWVDaGFyID09IHBheWxvYWRbMl0KICAgICAgICAgICAgICAgICAgICAmJiBmb3VyQ2hhciA9PSBw +YXlsb2FkWzNdCiAgICAgICAgICAgICAgICAgICAgJiYgZml2ZUNoYXIgPT0gcGF5bG9hZFs0XQog +ICAgICAgICAgICAgICAgICAgICYmIHNpeENoYXIgPT0gcGF5bG9hZFs1XQogICAgICAgICAgICAg +ICAgICAgICYmIHNldmVuQ2hhciA9PSBwYXlsb2FkWzZdCiAgICAgICAgICAgICAgICAgICAgJiYg +ZWlnaHRDaGFyID09IHBheWxvYWRbN10pIHsKICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN1 +Y2Nlc3ModHJ1ZSk7CiAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdWNjZXNzQ29kZShGTV9S +RVFVRVNUX0FMTE9XKTsKICAgICAgICAgICAgICAgIExvZ2dlci5kKCAiRk0gUmVzZXQgU3VjY2Vz +cyIpOwogICAgICAgICAgICB9IGVsc2UgIHsKICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN1 +Y2Nlc3MoZmFsc2UpOwogICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RXJyb3JDb2RlKEZNX1JF +UVVFU1RfUkVKRUNUKTsKICAgICAgICAgICAgICAgIExvZ2dlci5kKCAiRk0gUmVzZXQgUmVqZWN0 +Iik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAg +fQp9Cg== \ No newline at end of file