From 36df8ff7b43ba9178b54ab84da703323647c9863 Mon Sep 17 00:00:00 2001 From: mpmedia Date: Wed, 27 May 2026 12:21:13 -0500 Subject: [PATCH] fix: decode base64-encoded file content --- .../manager/UartProtocolManager.java | 501 ++++++++++++++---- 1 file changed, 384 insertions(+), 117 deletions(-) diff --git a/serialport/src/main/java/android/serialport/manager/UartProtocolManager.java b/serialport/src/main/java/android/serialport/manager/UartProtocolManager.java index 7b172e4..5bf6374 100644 --- a/serialport/src/main/java/android/serialport/manager/UartProtocolManager.java +++ b/serialport/src/main/java/android/serialport/manager/UartProtocolManager.java @@ -1,117 +1,384 @@ -cGFja2FnZSBhbmRyb2lkLnNlcmlhbHBvcnQubWFuYWdlcjsKCmltcG9ydCBhbmRyb2lkLmNvbnRl -bnQuQ29udGV4dDsKaW1wb3J0IGFuZHJvaWQuc2VyaWFscG9ydC5tb2RlbC5QcmludGVyUmVxdWVz -dE1vZGVsOwppbXBvcnQgYW5kcm9pZC5zZXJpYWxwb3J0Lm1vZGVsLlByaW50ZXJSZXNwb25zZU1v -ZGVsOwppbXBvcnQgYW5kcm9pZC5zZXJpYWxwb3J0LnV0aWxzLkxvZ2dlcjsKaW1wb3J0IGFuZHJv -aWQudXRpbC5Mb2c7CgpwdWJsaWMgY2xhc3MgVWFydFByb3RvY29sTWFuYWdlciB7CiAgICBwcml2 -YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CiAgICBwcml2YXRlIHN0YXRpYyBVYXJ0UHJvdG9j -b2xNYW5hZ2VyIG1VYXJ0UHJvdG9jb2xNYW5hZ2VyOwoKICAgIC8vR2V0dGVyL1NldHRlciBWYXJp -YWJsZXMKICAgIHByaXZhdGUgZmluYWwgUHJpbnRlclJlcXVlc3RNb2RlbCBtUHJpbnRlclJlcXVl -c3RNb2RlbDsKCiAgICAvL1RvdGFsIGJ5dGVzCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBU -T1RBTF9CWVRFUyA9IDY0OwoKICAgIC8vVGFzayBJZHMKICAgIHB1YmxpYyBzdGF0aWMgZmluYWwg -aW50IFVBUlRfUFJJTlRfUkVRVUVTVF9QUk9DRVNTID0gMTAxOwogICAgcHVibGljIHN0YXRpYyBm -aW5hbCBpbnQgVUFSVF9TVEFSVF9QUk9DRVNTID0gMTAyOwogICAgcHVibGljIHN0YXRpYyBmaW5h -bCBpbnQgVUFSVF9IRUFSVF9CRUFUX1BST0NFU1MgPSAxMDM7CiAgICBwdWJsaWMgc3RhdGljIGZp -bmFsIGludCBVQVJUX0lNQUdFX0lORk9fUFJPQ0VTUyA9IDEwNDsKICAgIHB1YmxpYyBzdGF0aWMg -ZmluYWwgaW50IFVBUlRfR09fUFJJTlRfUFJPQ0VTUyA9IDEwNTsKICAgIHB1YmxpYyBzdGF0aWMg -ZmluYWwgaW50IFVBUlRfRU5EX09GX1BSSU5UX1BST0NFU1MgPSAxMDY7CiAgICBwdWJsaWMgc3Rh -dGljIGZpbmFsIGludCBVQVJUX1BSSU5URVJfQ09PTElOR19QUk9DRVNTID0gMTA3OwogICAgcHVi -bGljIHN0YXRpYyBmaW5hbCBpbnQgVUFSVF9QUklOVF9NT1JFX1BST0NFU1MgPSAxMDg7CiAgICBw -dWJsaWMgc3RhdGljIGZpbmFsIGludCBVQVJUX0FTS19GV19WRVJTSU9OX1BST0NFU1MgPSAxMDk7 -CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVQVJUX1BSSU5UX1JFU1RBUlRfUFJPQ0VTUyA9 -IDIyMjsKCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVQVJUX0ZXX1VQR1JBREVfUkVRVUVT -VF9QUk9DRVNTID0gMjAxOwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUFSVF9GV19HT19V -UEdSQURFX1BST0NFU1MgPSAyMDI7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVQVJUX0ZX -X0dPX1VQR1JBREVfQUNLX1BST0NFU1MgPSAyMDM7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGlu -dCBVQVJUX0ZXX0VORF9PRl9VUEdSQURFX1BST0NFU1MgPSAyMDQ7CiAgICBwdWJsaWMgc3RhdGlj -IGZpbmFsIGludCBVQVJUX0ZXX0VORF9PRl9VUEdSQURFX0FDS19QUk9DRVNTID0gMjA1OwoKICAg -IC8vUHJpbnQgU1MgQ29tbWFuZAogICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUFSVF9TTUFS -VF9TSEVFVF9QUklOVF9QUk9DRVNTID0gMzAxOwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQg -VUFSVF9TTUFSVF9TSEVFVF9FTkRfT0ZfUFJPQ0VTUyA9IDMwMjsKCiAgICAvL0ZhY3RvcnkgTW9k -ZQogICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUFSVF9GTV9SRVFVRVNUX0NNRF9QUk9DRVNT -ID0gMzAxOwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUFSVF9GTV9SRVFVRVNUX0FDS19Q -Uk9DRVNTID0gMzAyOwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUFSVF9GTV9CVVJOX0lO -X0NNRF9QUk9DRVNTID0gMzAzOwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUFSVF9GTV9C -VVJOX0lOX0FDS19QUk9DRVNTID0gMzA0OwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUFS -VF9GTV9DQU1FUkFfVEVTVF9DTURfUFJPQ0VTUyA9IDMwNTsKICAgIHB1YmxpYyBzdGF0aWMgZmlu -YWwgaW50IFVBUlRfRk1fQ0FNRVJBX1RFU1RfQUNLX1BST0NFU1MgPSAzMDY7CiAgICBwdWJsaWMg -c3RhdGljIGZpbmFsIGludCBVQVJUX0ZNX0ZRQ19DTURfUFJPQ0VTUyA9IDMwNzsKICAgIHB1Ymxp -YyBzdGF0aWMgZmluYWwgaW50IFVBUlRfRk1fRlFDX0FDS19QUk9DRVNTID0gMzA4OwogICAgcHVi -bGljIHN0YXRpYyBmaW5hbCBpbnQgVUFSVF9GTV9TSElQUElOR19DTURfUFJPQ0VTUyA9IDMwOTsK -ICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVBUlRfRk1fU0hJUFBJTkdfQUNLX1BST0NFU1Mg -PSAzMTA7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVQVJUX0ZNX1ZFUl9BU0tfQ01EX1BS -T0NFU1MgPSAzMTE7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVQVJUX0ZNX1ZFUl9BU0tf -QUNLX1BST0NFU1MgPSAzMTI7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVQVJUX0ZNX1JF -U0VUX0NNRF9QUk9DRVNTID0gMzEzOwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUFSVF9G -TV9SRVNFVF9BQ0tfUFJPQ0VTUyA9IDMxNDsKCgogICAgLy9EZWZhdWx0IGJ5dGUKICAgIHB1Ymxp -YyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQllURSA9IDB4MDA7CiAgICBwdWJsaWMgc3RhdGlj -IGZpbmFsIGludCBTVEFSVF9DT0RFX09ORSA9IDB4MUI7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFs -IGludCBTVEFSVF9DT0RFX1RXTyA9IDB4MkE7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBT -VEFSVF9DT0RFX1RIUkVFID0gMHg0MzsKICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJU -X0NPREVfRk9VUiA9IDB4NDE7CgoKCiAgICBwcml2YXRlIFVhcnRQcm90b2NvbE1hbmFnZXIoQ29u -dGV4dCBjb250ZXh0LCBCdWlsZGVyIGJ1aWxkZXIpIHsKICAgICAgICB0aGlzLm1Db250ZXh0ID0g -Y29udGV4dDsKICAgICAgICBtUHJpbnRlclJlcXVlc3RNb2RlbCA9IG5ldyBQcmludGVyUmVxdWVz -dE1vZGVsKCkuc2V0UHJvY2Vzc1Rhc2tJRChidWlsZGVyLmdldE1vZGVsKCkuZ2V0UHJvY2Vzc1Rh -c2tJRCgpKS5zZXRQYXlsb2FkKGJ1aWxkZXIuZ2V0TW9kZWwoKS5nZXRQYXlsb2FkKCkpLnNldE51 -bWJlck9mQ29waWVzKGJ1aWxkZXIuZ2V0TW9kZWwoKS5nZXROdW1iZXJPZkNvcGllcygpKS5zZXRG -aWxlTmFtZTEoYnVpbGRlci5nZXRNb2RlbCgpLmdldEZpbGVOYW1lMSgpKS5zZXRGaWxlTmFtZTMo -YnVpbGRlci5nZXRNb2RlbCgpLmdldEZpbGVOYW1lMygpKS5zZXRGaWxlTmFtZTQoYnVpbGRlci5n -ZXRNb2RlbCgpLmdldEZpbGVOYW1lNCgpKS5zZXRGaWxlTmFtZTUoYnVpbGRlci5nZXRNb2RlbCgp -LmdldEZpbGVOYW1lNSgpKS5zZXRGaWxlTmFtZTYoYnVpbGRlci5nZXRNb2RlbCgpLmdldEZpbGVO -YW1lNigpKS5zZXRGaWxlTmFtZTcoYnVpbGRlci5nZXRNb2RlbCgpLmdldEZpbGVOYW1lNygpKS5z -ZXRGaWxlTmFtZTgoYnVpbGRlci5nZXRNb2RlbCgpLmdldEZpbGVOYW1lOCgpKTsKICAgIH0KCiAg -ICBwdWJsaWMgc3RhdGljIFVhcnRQcm90b2NvbE1hbmFnZXIgZ2V0SW5zdGFuY2UoQ29udGV4dCBj -b250ZXh0LCBCdWlsZGVyIGJ1aWxkZXIpIHsKICAgICAgICByZXR1cm4gbmV3IFVhcnRQcm90b2Nv -bE1hbmFnZXIoY29udGV4dCwgYnVpbGRlcik7CiAgICB9CgogICAgcHVibGljIENvbnRleHQgZ2V0 -Q29udGV4dCgpIHsKICAgICAgICByZXR1cm4gbUNvbnRleHQ7CiAgICB9CgoKICAgIHB1YmxpYyBz -dGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250 -ZXh0OwogICAgICAgIHByaXZhdGUgUHJpbnRlclJlcXVlc3RNb2RlbCBtb2RlbDsKCiAgICAgICAg -cHVibGljIEJ1aWxkZXIoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgICAgIHRoaXMubUNvbnRl -eHQgPSBjb250ZXh0OwogICAgICAgICAgICBtb2RlbCA9IG5ldyBQcmludGVyUmVxdWVzdE1vZGVs -KCk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQcmludGVyUmVxdWVzdE1v -ZGVsKFByaW50ZXJSZXF1ZXN0TW9kZWwgbW9kZWwpIHsKICAgICAgICAgICAgdGhpcy5tb2RlbCA9 -IG1vZGVsOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CgogICAgICAgIHB1Ymxp -YyBQcmludGVyUmVxdWVzdE1vZGVsIGdldE1vZGVsKCkgewogICAgICAgICAgICByZXR1cm4gbW9k -ZWw7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgVWFydFByb3RvY29sTWFuYWdlciBidWlsZCgp -IHsKICAgICAgICAgICAgcmV0dXJuIFVhcnRQcm90b2NvbE1hbmFnZXIuZ2V0SW5zdGFuY2UobUNv -bnRleHQsIHRoaXMpOwogICAgICAgIH0KCiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgU3RhcnQg -Q29kZSBhbmQgQ3VzdG9tZXIgQ29kZQogICAgICoKICAgICAqIEByZXR1cm4gYnl0ZSBhcnJheQog -ICAgICovCiAgICBwdWJsaWMgYnl0ZVtdIGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKCkgewogICAg -ICAgIHJldHVybiBuZXcgYnl0ZVtdeyhieXRlKSAweDFCLCAoYnl0ZSkgMHgyQSwgKGJ5dGUpIDB4 -NDMsIChieXRlKSAweDQxfTsKICAgIH0KCiAgICBwdWJsaWMgYnl0ZVtdIGdldEhlYXJ0QmVhdFBy -b3RvY29sKCkgewogICAgICAgIC8vMHgxQgkweDJBCTB4NDMJMHg0MQkweDAwCTB4MDEJMHgwNAkw -eDU1CiAgICAgICAgYnl0ZVtdIHF1ZXJ5RGF0YSA9IG5ldyBieXRlW1RPVEFMX0JZVEVTXTsKICAg -ICAgICBxdWVyeURhdGFbMF0gPSBnZXRTdGFydEFuZEN1c3RvbWVyQ29kZSgpWzBdOwogICAgICAg -IHF1ZXJ5RGF0YVsxXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbMV07CiAgICAgICAgcXVl -cnlEYXRhWzJdID0gZ2V0U3RhcnRBbmRDdXN0b21lckNvZGUoKVsyXTsKICAgICAgICBxdWVyeURh -dGFbM10gPSBnZXRTdGFydEFuZEN1c3RvbWVyQ29kZSgpWzNdOwogICAgICAgIHF1ZXJ5RGF0YVs0 -XSA9IChieXRlKSAweDAwOwogICAgICAgIHF1ZXJ5RGF0YVs1XSA9IChieXRlKSAweDAxOwogICAg -ICAgIHF1ZXJ5RGF0YVs2XSA9IChieXRlKSAweDA0OwogICAgICAgIHF1ZXJ5RGF0YVs3XSA9IChi -eXRlKSAweDU1OwogICAgICAgIHF1ZXJ5RGF0YVs4XSA9IChieXRlKSAweDAwOwogICAgICAgIHF1 -ZXJ5RGF0YVs5XSA9IChieXRlKSAweDAwOwogICAgICAgIHF1ZXJ5RGF0YVsxMF0gPSAoYnl0ZSkg -MHgwMDsKICAgICAgICBxdWVyeURhdGFbMTFdID0gKGJ5dGUpIDB4MDA7CiAgICAgICAgcXVlcnlE -YXRhWzEyXSA9IChieXRlKSAweDAwOwogICAgICAgIHF1ZXJ5RGF0YVsxM10gPSAoYnl0ZSkgMHgw -MDsKICAgICAgICBxdWVyeURhdGFbMTRdID0gKGJ5dGUpIDB4MDA7CiAgICAgICAgcXVlcnlEYXRh -WzE1XSA9IChieXRlKSAweDAwOwoKICAgICAgICByZXR1cm4gcXVlcnlEYXRhOwogICAgfQoKICAg -IHB1YmxpYyBieXRlW10gZ2V0U3RhcnRVcFByb3RvY29sKCkgewogICAgICAgIGJ5dGVbXSBxdWVy -eURhdGEgPSBuZXcgYnl0ZVtUT1RBTF9CWVRFU107CiAgICAgICAgcXVlcnlEYXRhWzBdID0gZ2V0 -U3RhcnRBbmRDdXN0b21lckNvZGUoKVswXTsKICAgICAgICBxdWVyeURhdGFbMV0gPSBnZXRTdGFy -dEFuZEN1c3RvbWVyQ29kZSgpWzFdOwogICAgICAgIHF1ZXJ5RGF0YVsyXSA9IGdldFN0YXJ0QW5k -Q3VzdG9tZXJDb2RlKClbMl07CiAgICAgICAgcXVlcnlEYXRhWzNdID0gZ2V0U3RhcnRBbmRDdXN0 -b21lckNvZGUoKVszXTsKICAgICAgICBxdWVyeURhdGFbNF0gPSAoYnl0ZSkgMHgwMTsKICAgICAg -ICBxdWVyeURhdGFbNV0gPSAoYnl0ZSkgMHgwMTsKICAgICAgICBxdWVyeURhdGFbNl0gPSAoYnl0 -ZSkgMHgwMTsKICAgICAgICBxdWVyeURhdGFbN10gPSAoYnl0ZSkgMHgwMDsKICAgICAgICByZXR1 -cm4gcXVlcnlEYXRhOwogICAgfQoKICAgIHB1YmxpYyBieXRlW10gc2VuZFByaW50UmVxdWVzdFBy -b3RvY29sKCkgewogICAgICAgIExvZ2dlci5kKCJOby5vZiBDb3A6ICIgKyBtUHJpbnRlclJlcXVl -c3RNb2RlbC5nZXROdW1iZXJPZkNvcGllcygpKTsKICAgICAgICBieXRlW10gcXVlcnlEYXRhID0g -bmV3IGJ5dGVbVE9UQUxfQllURVNdOwogICAgICAgIHF1ZXJ5RGF0YVswXSA9IGdldFN0YXJ0QW5k -Q3VzdG9tZXJDb2RlKClbMF07CiAgICAgICAgcXVlcnlEYXRhWzFdID0gZ2V0U3RhcnRBbmRDdXN0 -b21lckNvZGUoKVsxXTsKICAgICAgICBxdWVyeURhdGFbMl0gPSBnZXRTdGFydEFuZEN1c3RvbWVy -Q29kZSgpWzJdOwogICAgICAgIHF1ZXJ5RGF0YVszXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2Rl -KClbM107CiAgICAgICAgcXVlcnlEYXRhWzRdID0gKGJ5dGUpIDB4MDA7CiAgICAgICAgcXVlcnlE -YXRhWzVdID0gKGJ5dGUpIDB4MDE7CiAgICAgICAgcXVlcnlEYXRhWzZdID0gKGJ5dGUpIDB4MDI7 -CiAgICAgICAgcXVlcnlEYXRhWzddID0gKGJ5dGUpIDB4MDA7CiAgICAgICAgcXVlcnlEYXRhWzhd -ID0gKGJ5dGUpIG1QcmludGVyUmVxdWVzdE1vZGVsLmdldE51bWJlck9mQ29waWVzKCk7CiAgICAg -ICAgcmV0dXJuIHF1ZXJ5RGF0YTsKICAgIH0KCiAgICBwdWJsaWMgYnl0ZVtdIHNlbmRJbWFnZUlu -Zm9Qcm90b2NvbCgpIHsKICAgICAgICBieXRlW10gcXVlcnlEYXRhID0gbmV3IGJ5dGVbVE9UQUxf -QllURVNdOwogICAgICAgIGlmIChtUHJpbnRlclJlcXVlc3RNb2RlbCAhPSBudWxsKSB7CiAgICAgICAgICAgIGJ5dGVbXSBhcnJheSA9IG1QcmludGVyUmVxdWVzdE1vZGVsLmdldEZpbGVOYW1lMSgpLmdldEJ5dGVzKCk7CiAgICAgICAgICAgIHF1ZXJ5RGF0YVswXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbMF07CiAgICAgICAgICAgIHF1ZXJ5RGF0YVsxXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbMV07CiAgICAgICAgICAgIHF1ZXJ5RGF0YVsyXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbMl07CiAgICAgICAgICAgIHF1ZXJ5RGF0YVszXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbM107CiAgICAgICAgICAgIHF1ZXJ5RGF0YVs0XSA9IChieXRlKSAweDAwOwogICAgICAgICAgICBxdWVyeURhdGFbNV0gPSAoYnl0ZSkgMHgwMTsKICAgICAgICAgICAgcXVlcnlEYXRhWzZdID0gKGJ5dGUpIDB4MDI7CiAgICAgICAgICAgIHF1ZXJ5RGF0YVs3XSA9IChieXRlKSAweDAxOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1hdGgubWluKGFycmF5Lmxlbmd0aCwgOCk7IGkrKykgeyBxdWVyeURhdGFbOCArIGldID0gYXJyYXlbaV07IH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHF1ZXJ5RGF0YTsKICAgIH0KCiAgICBwdWJsaWMgYnl0ZVtdIGdldEdvUHJpbnRBQ0tQcm90b2NvbCgpIHsKICAgICAgICBieXRlW10gcXVlcnlEYXRhID0gbmV3IGJ5dGVbVE9UQUxfQllURVNdOwogICAgICAgIHF1ZXJ5RGF0YVswXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbMF07CiAgICAgICAgcXVlcnlEYXRhWzFdID0gZ2V0U3RhcnRBbmRDdXN0b21lckNvZGUoKVsxXTsKICAgICAgICBxdWVyeURhdGFbMl0gPSBnZXRTdGFydEFuZEN1c3RvbWVyQ29kZSgpWzJdOwogICAgICAgIHF1ZXJ5RGF0YVszXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbM107CiAgICAgICAgcXVlcnlEYXRhWzRdID0gKGJ5dGUpIDB4MDA7CiAgICAgICAgcXVlcnlEYXRhWzVdID0gKGJ5dGUpIDB4MDE7CiAgICAgICAgcXVlcnlEYXRhWzZdID0gKGJ5dGUpIDB4MDI7CiAgICAgICAgcXVlcnlEYXRhWzddID0gKGJ5dGUpIDB4MDI7CiAgICAgICAgcmV0dXJuIHF1ZXJ5RGF0YTsKICAgIH0KCiAgICBwdWJsaWMgYnl0ZVtdIGdldEVuZE9mUHJpbnRBQ0tQcm90b2NvbCgpIHsKICAgICAgICBieXRlW10gcXVlcnlEYXRhID0gbmV3IGJ5dGVbVE9UQUxfQllURVNdOwogICAgICAgIHF1ZXJ5RGF0YVswXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbMF07CiAgICAgICAgcXVlcnlEYXRhWzFdID0gZ2V0U3RhcnRBbmRDdXN0b21lckNvZGUoKVsxXTsKICAgICAgICBxdWVyeURhdGFbMl0gPSBnZXRTdGFydEFuZEN1c3RvbWVyQ29kZSgpWzJdOwogICAgICAgIHF1ZXJ5RGF0YVszXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbM107CiAgICAgICAgcXVlcnlEYXRhWzRdID0gKGJ5dGUpIDB4MDA7CiAgICAgICAgcXVlcnlEYXRhWzVdID0gKGJ5dGUpIDB4MDE7CiAgICAgICAgcXVlcnlEYXRhWzZdID0gKGJ5dGUpIDB4MDI7CiAgICAgICAgcXVlcnlEYXRhWzddID0gKGJ5dGUpIDB4MDM7CiAgICAgICAgcmV0dXJuIHF1ZXJ5RGF0YTsKICAgIH0KCiAgICBwdWJsaWMgYnl0ZVtdIGdldEZXVXBncmFkZVJlcXVlc3RQcm90b2NvbCgpIHsKICAgICAgICBieXRlW10gcXVlcnlEYXRhID0gbmV3IGJ5dGVbVE9UQUxfQllURVNdOwogICAgICAgIHF1ZXJ5RGF0YVswXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbMF07CiAgICAgICAgcXVlcnlEYXRhWzFdID0gZ2V0U3RhcnRBbmRDdXN0b21lckNvZGUoKVsxXTsKICAgICAgICBxdWVyeURhdGFbMl0gPSBnZXRTdGFydEFuZEN1c3RvbWVyQ29kZSgpWzJdOwogICAgICAgIHF1ZXJ5RGF0YVszXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbM107CiAgICAgICAgcXVlcnlEYXRhWzRdID0gKGJ5dGUpIDB4MDA7CiAgICAgICAgcXVlcnlEYXRhWzVdID0gKGJ5dGUpIDB4MDE7CiAgICAgICAgcXVlcnlEYXRhWzZdID0gKGJ5dGUpIDB4MDM7CiAgICAgICAgcXVlcnlEYXRhWzddID0gKGJ5dGUpIDB4MDA7CiAgICAgICAgcmV0dXJuIHF1ZXJ5RGF0YTsKICAgIH0KCiAgICBwdWJsaWMgYnl0ZVtdIGdldEZXR29VcGdyYWRlQUNLUHJvdG9jb2woKSB7CiAgICAgICAgYnl0ZVtdIHF1ZXJ5RGF0YSA9IG5ldyBieXRlW1RPVEFMX0JZVEVTXTsKICAgICAgICBxdWVyeURhdGFbMF0gPSBnZXRTdGFydEFuZEN1c3RvbWVyQ29kZSgpWzBdOwogICAgICAgIHF1ZXJ5RGF0YVsxXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbMV07CiAgICAgICAgcXVlcnlEYXRhWzJdID0gZ2V0U3RhcnRBbmRDdXN0b21lckNvZGUoKVsyXTsKICAgICAgICBxdWVyeURhdGFbM10gPSBnZXRTdGFydEFuZEN1c3RvbWVyQ29kZSgpWzNdOwogICAgICAgIHF1ZXJ5RGF0YVs0XSA9IChieXRlKSAweDAwOwogICAgICAgIHF1ZXJ5RGF0YVs1XSA9IChieXRlKSAweDAxOwogICAgICAgIHF1ZXJ5RGF0YVs2XSA9IChieXRlKSAweDAzOwogICAgICAgIHF1ZXJ5RGF0YVs3XSA9IChieXRlKSAweDAyOwogICAgICAgIHJldHVybiBxdWVyeURhdGE7CiAgICB9CgogICAgcHVibGljIGJ5dGVbXSBnZXRGV0VuZE9mVXBncmFkZUFDS1Byb3RvY29sKCkgewogICAgICAgIGJ5dGVbXSBxdWVyeURhdGEgPSBuZXcgYnl0ZVtUT1RBTF9CWVRFU107CiAgICAgICAgcXVlcnlEYXRhWzBdID0gZ2V0U3RhcnRBbmRDdXN0b21lckNvZGUoKVswXTsKICAgICAgICBxdWVyeURhdGFbMV0gPSBnZXRTdGFydEFuZEN1c3RvbWVyQ29kZSgpWzFdOwogICAgICAgIHF1ZXJ5RGF0YVsyXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbMl07CiAgICAgICAgcXVlcnlEYXRhWzNdID0gZ2V0U3RhcnRBbmRDdXN0b21lckNvZGUoKVszXTsKICAgICAgICBxdWVyeURhdGFbNF0gPSAoYnl0ZSkgMHgwMDsKICAgICAgICBxdWVyeURhdGFbNV0gPSAoYnl0ZSkgMHgwMTsKICAgICAgICBxdWVyeURhdGFbNl0gPSAoYnl0ZSkgMHgwMzsKICAgICAgICBxdWVyeURhdGFbN10gPSAoYnl0ZSkgMHgwMzsKICAgICAgICByZXR1cm4gcXVlcnlEYXRhOwogICAgfQoKICAgIHB1YmxpYyBieXRlW10gZ2V0UHJpbnRlckNvb2xpbmdBQ0tQcm90b2NvbCgpIHsKICAgICAgICBieXRlW10gcXVlcnlEYXRhID0gbmV3IGJ5dGVbVE9UQUxfQllURVNdOwogICAgICAgIHF1ZXJ5RGF0YVswXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbMF07CiAgICAgICAgcXVlcnlEYXRhWzFdID0gZ2V0U3RhcnRBbmRDdXN0b21lckNvZGUoKVsxXTsKICAgICAgICBxdWVyeURhdGFbMl0gPSBnZXRTdGFydEFuZEN1c3RvbWVyQ29kZSgpWzJdOwogICAgICAgIHF1ZXJ5RGF0YVszXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbM107CiAgICAgICAgcXVlcnlEYXRhWzRdID0gKGJ5dGUpIDB4MDA7CiAgICAgICAgcXVlcnlEYXRhWzVdID0gKGJ5dGUpIDB4MDE7CiAgICAgICAgcXVlcnlEYXRhWzZdID0gKGJ5dGUpIDB4MDI7CiAgICAgICAgcXVlcnlEYXRhWzddID0gKGJ5dGUpIDB4MEY7CiAgICAgICAgcmV0dXJuIHF1ZXJ5RGF0YTsKICAgIH0KCiAgICBwdWJsaWMgYnl0ZVtdIGFza0Z3VmVyc2lvblByb3RvY29sKCkgewogICAgICAgIGJ5dGVbXSBxdWVyeURhdGEgPSBuZXcgYnl0ZVtUT1RBTF9CWVRFU107CiAgICAgICAgcXVlcnlEYXRhWzBdID0gZ2V0U3RhcnRBbmRDdXN0b21lckNvZGUoKVswXTsKICAgICAgICBxdWVyeURhdGFbMV0gPSBnZXRTdGFydEFuZEN1c3RvbWVyQ29kZSgpWzFdOwogICAgICAgIHF1ZXJ5RGF0YVsyXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbMl07CiAgICAgICAgcXVlcnlEYXRhWzNdID0gZ2V0U3RhcnRBbmRDdXN0b21lckNvZGUoKVszXTsKICAgICAgICBxdWVyeURhdGFbNF0gPSAoYnl0ZSkgMHgwMDsKICAgICAgICBxdWVyeURhdGFbNV0gPSAoYnl0ZSkgMHgwMTsKICAgICAgICBxdWVyeURhdGFbNl0gPSAoYnl0ZSkgMHgwMzsKICAgICAgICBxdWVyeURhdGFbN10gPSAoYnl0ZSkgMHhGRjsKICAgICAgICByZXR1cm4gcXVlcnlEYXRhOwogICAgfQoKICAgIHB1YmxpYyBieXRlW10gc2VuZFByaW50U21hcnRTaGVldFByb3RvY29sKCkgewogICAgICAgIGJ5dGVbXSBxdWVyeURhdGEgPSBuZXcgYnl0ZVtUT1RBTF9CWVRFU107CiAgICAgICAgcXVlcnlEYXRhWzBdID0gZ2V0U3RhcnRBbmRDdXN0b21lckNvZGUoKVswXTsKICAgICAgICBxdWVyeURhdGFbMV0gPSBnZXRTdGFydEFuZEN1c3RvbWVyQ29kZSgpWzFdOwogICAgICAgIHF1ZXJ5RGF0YVsyXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbMl07CiAgICAgICAgcXVlcnlEYXRhWzNdID0gZ2V0U3RhcnRBbmRDdXN0b21lckNvZGUoKVszXTsKICAgICAgICBxdWVyeURhdGFbNF0gPSAoYnl0ZSkgMHgwMTsKICAgICAgICBxdWVyeURhdGFbNV0gPSAoYnl0ZSkgMHgwMTsKICAgICAgICBxdWVyeURhdGFbNl0gPSAoYnl0ZSkgMHgwMjsKICAgICAgICBxdWVyeURhdGFbN10gPSAoYnl0ZSkgMHhBQTsKICAgICAgICByZXR1cm4gcXVlcnlEYXRhOwogICAgfQoKICAgIHB1YmxpYyBieXRlW10gZ2V0RmFjdG9yeU1vZGVSZXF1ZXN0UHJvdG9jb2woKSB7CiAgICAgICAgYnl0ZVtdIHF1ZXJ5RGF0YSA9IG5ldyBieXRlW1RPVEFMX0JZVEVTXTsKICAgICAgICBxdWVyeURhdGFbMF0gPSBnZXRTdGFydEFuZEN1c3RvbWVyQ29kZSgpWzBdOwogICAgICAgIHF1ZXJ5RGF0YVsxXSA9IGdldFN0YXJ0QW5kQ3VzdG9tZXJDb2RlKClbMV07CiAgICAgICAgcXVlcnlEYXRhWzJdID0gZ2V0U3RhcnRBbmRDdXN0b21lckNvZGUoKVsyXTsKICAgICAgICBxdWVyeURhdGFbM10gPSBnZXRTdGFydEFuZEN1c3RvbWVyQ29kZSgpWzNdOwogICAgICAgIHF1ZXJ5RGF0YVs0XSA9IChieXRlKSAweDAwOwogICAgICAgIHF1ZXJ5RGF0YVs1XSA9IChieXRlKSAweDAxOwogICAgICAgIHF1ZXJ5RGF0YVs2XSA9IChieXRlKSAweEYwOwogICAgICAgIHF1ZXJ5RGF0YVs3XSA9IChieXRlKSAweDAwOwogICAgICAgIHJldHVybiBxdWVyeURhdGE7CiAgICB9CgogICAgcHVibGljIGJ5dGVbXSBnZXRGYWN0b3J5TW9kZUJ1cm5JblByb3RvY29sKCkgewogICAgICAgIGJ5dGVbXSBxdWVyeURhdGEgPSBuZXcgYnl0ZVtUT1RBTF9CWVRFU107CiAgICAgICAgcXVlcnlEYXRhWzZdID0gKGJ5dGUpIDB4RjA7IHF1ZXJ5RGF0YVs3XSA9IChieXRlKSAweDAxOwogICAgICAgIHJldHVybiBxdWVyeURhdGE7CiAgICB9CgogICAgcHVibGljIGJ5dGVbXSBnZXRGYWN0b3J5TW9kZUNhbWVyYVRlc3RQcm90b2NvbCgpIHsKICAgICAgICBieXRlW10gcXVlcnlEYXRhID0gbmV3IGJ5dGVbVE9UQUxfQllURVNdOwogICAgICAgIHF1ZXJ5RGF0YVs2XSA9IChieXRlKSAweEYwOyBxdWVyeURhdGFbN10gPSAoYnl0ZSkgMHgwMjsKICAgICAgICByZXR1cm4gcXVlcnlEYXRhOwogICAgfQoKICAgIHB1YmxpYyBieXRlW10gZ2V0RmFjdG9yeU1vZGVGUUNQcm90b2NvbCgpIHsKICAgICAgICBieXRlW10gcXVlcnlEYXRhID0gbmV3IGJ5dGVbVE9UQUxfQllURVNdOwogICAgICAgIHF1ZXJ5RGF0YVs2XSA9IChieXRlKSAweEYwOyBxdWVyeURhdGFbN10gPSAoYnl0ZSkgMHgwMzsKICAgICAgICByZXR1cm4gcXVlcnlEYXRhOwogICAgfQoKICAgIHB1YmxpYyBieXRlW10gZ2V0RmFjdG9yeU1vZGVTaGlwcGluZ1Byb3RvY29sKCkgewogICAgICAgIGJ5dGVbXSBxdWVyeURhdGEgPSBuZXcgYnl0ZVtUT1RBTF9CWVRFU107CiAgICAgICAgcXVlcnlEYXRhWzZdID0gKGJ5dGUpIDB4RjA7IHF1ZXJ5RGF0YVs3XSA9IChieXRlKSAweDA0OwogICAgICAgIHJldHVybiBxdWVyeURhdGE7CiAgICB9CgogICAgcHVibGljIGJ5dGVbXSBnZXRGYWN0b3J5TW9kZVZlcnNpb25Bc2tQcm90b2NvbCgpIHsKICAgICAgICBieXRlW10gcXVlcnlEYXRhID0gbmV3IGJ5dGVbVE9UQUxfQllURVNdOwogICAgICAgIHF1ZXJ5RGF0YVs2XSA9IChieXRlKSAweEYwOyBxdWVyeURhdGFbN10gPSAoYnl0ZSkgMHgwNTsKICAgICAgICByZXR1cm4gcXVlcnlEYXRhOwogICAgfQoKICAgIHB1YmxpYyBieXRlW10gZ2V0RmFjdG9yeU1vZGVSZXNldFByb3RvY29sKCkgewogICAgICAgIGJ5dGVbXSBxdWVyeURhdGEgPSBuZXcgYnl0ZVtUT1RBTF9CWVRFU107CiAgICAgICAgcXVlcnlEYXRhWzZdID0gKGJ5dGUpIDB4RjA7IHF1ZXJ5RGF0YVs3XSA9IChieXRlKSAweEZGOwogICAgICAgIHJldHVybiBxdWVyeURhdGE7CiAgICB9CgogICAgcHVibGljIFByaW50ZXJSZXNwb25zZU1vZGVsIGZpbmRQcmludGVyUmVzcG9uc2UoKSB7CiAgICAgICAgUHJpbnRlclJlc3BvbnNlTW9kZWwgcmVzcG9uc2VNb2RlbCA9IG51bGw7CiAgICAgICAgaWYgKG1QcmludGVyUmVxdWVzdE1vZGVsICE9IG51bGwpIHsKICAgICAgICAgICAgaW50IHRhc2tJZCA9IG1QcmludGVyUmVxdWVzdE1vZGVsLmdldFByb2Nlc3NUYXNrSUQoKTsKICAgICAgICAgICAgYnl0ZVtdIHBheWxvYWQgPSBtUHJpbnRlclJlcXVlc3RNb2RlbC5nZXRQYXlsb2FkKCk7CiAgICAgICAgICAgIGlmIChwYXlsb2FkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICh0YXNrSWQgPT0gVUFSVF9IRUFSVF9CRUFUX1BST0NFU1MpIHsgcmVzcG9uc2VNb2RlbCA9IFByaW50SW1hZ2VQcm9jZXNzTWFuYWdlci5nZXRJbnN0YW5jZShnZXRDb250ZXh0KCkpLmRvSGVhcnRCZWF0UHJvY2VzcyhwYXlsb2FkKTsgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGFza0lkID09IFVBUlRfUFJJTlRfUkVRVUVTVF9QUk9DRVNTKSB7IHJlc3BvbnNlTW9kZWwgPSBQcmludEltYWdlUHJvY2Vzc01hbmFnZXIuZ2V0SW5zdGFuY2UoZ2V0Q29udGV4dCgpKS5kb1ByaW50UmVxdWVzdEFDS1Byb2Nlc3MocGF5bG9hZCk7IH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhc2tJZCA9PSBVQVJUX0lNQUdFX0lORk9fUFJPQ0VTUykgeyByZXNwb25zZU1vZGVsID0gUHJpbnRJbWFnZVByb2Nlc3NNYW5hZ2VyLmdldEluc3RhbmNlKGdldENvbnRleHQoKSkuZG9Hb1ByaW50QUNLUGV0UHJvY2VzcyhwYXlsb2FkKTsgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGFza0lkID09IFVBUlRfR09fUFJJTlRfUFJPQ0VTUykgeyByZXNwb25zZU1vZGVsID0gUHJpbnRJbWFnZVByb2Nlc3NNYW5hZ2VyLmdldEluc3RhbmNlKGdldENvbnRleHQoKSkuZG9FbmRPZlByaW50UHJvY2VzcyhwYXlsb2FkKTsgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGFza0lkID09IFVBUlRfRU5EX09GX1BSSU5UX1BST0NFU1MpIHsgcmVzcG9uc2VNb2RlbCA9IFByaW50SW1hZ2VQcm9jZXNzTWFuYWdlci5nZXRJbnN0YW5jZShnZXRDb250ZXh0KCkpLmRvRW5kT2ZQcmludFByb2Nlc3MocGF5bG9hZCk7IH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhc2tJZCA9PSBVQVJUX0ZXX1VQR1JBREVfUkVRVUVTVF9QUk9DRVNTKSB7IHJlc3BvbnNlTW9kZWwgPSBGV1VwZGF0ZVByb2Nlc3NNYW5hZ2VyLmdldEluc3RhbmNlKGdldENvbnRleHQoKSkuZG9GV1VwZ3JhZGVSZXF1ZXN0QUNLUGV0UHJvY2VzcyhwYXlsb2FkKTsgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGFza0lkID09IFVBUlRfRldfR09fVVBHUkFERV9QUk9DRVNTKSB7IHJlc3BvbnNlTW9kZWwgPSBGV1VwZGF0ZVByb2Nlc3NNYW5hZ2VyLmdldEluc3RhbmNlKGdldENvbnRleHQoKSkuZG9GV0dvVXBncmFkZVByb2Nlc3MocGF5bG9hZCk7IH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhc2tJZCA9PSBVQVJUX0ZXX0VORF9PRl9VUEdSQURFX1BST0NFU1MpIHsgcmVzcG9uc2VNb2RlbCA9IEZXVXB -kYXRlUHJvY2Vzc01hbmFnZXIuZ2V0SW5zdGFuY2UoZ2V0Q29udGV4dCgpKS5kb0ZXRW5kT2ZVcGdyYWRlUHJvY2VzcyhwYXlsb2FkKTsgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGFza0lkID09IFVBUlRfUFJJTlRFUl9DT09MSU5HX1BST0NFU1MpIHsgcmVzcG9uc2VNb2RlbCA9IFByaW50SW1hZ2VQcm9jZXNzTWFuYWdlci5nZXRJbnN0YW5jZShnZXRDb250ZXh0KCkpLmRvUHJpbnRlcklzQ29vbGluZ1Byb2Nlc3MocGF5bG9hZCk7IH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhc2tJZCA9PSBVQVJUX0FTS19GV19WRVJTSU9OX1BST0NFU1MpIHsgcmVzcG9uc2VNb2RlbCA9IFByaW50SW1hZ2VQcm9jZXNzTWFuYWdlci5nZXRJbnN0YW5jZShnZXRDb250ZXh0KCkpLmRvRldWZXJzaW9uUHJvY2VzcyhwYXlsb2FkKTsgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGFza0lkID09IFVBUlRfU01BUlRfU0hFRVRfUFJJTlRfUFJPQ0VTUykgeyByZXNwb25zZU1vZGVsID0gUHJpbnRJbWFnZVByb2Nlc3NNYW5hZ2VyLmdldEluc3RhbmNlKGdldENvbnRleHQoKSkuZG9QcmludFNtYXJ0U2hlZXRQcm9jZXNzKHBheWxvYWQpOyB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXNrSWQgPT0gVUFSVF9TTUFSVF9TSEVFVF9FTkRfT0ZfUFJPQ0VTUykgeyByZXNwb25zZU1vZGVsID0gUHJpbnRJbWFnZVByb2Nlc3NNYW5hZ2VyLmdldEluc3RhbmNlKGdldENvbnRleHQoKSkuZG9FbmRPZlNtYXJ0U2hlZXRQcm9jZXNzKHBheWxvYWQpOyB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXNrSWQgPT0gVUFSVF9GTV9SRVFVRVNUX0NNRF9QUk9DRVNTKSB7IHJlc3BvbnNlTW9kZWwgPSBGYWN0b3J5TW9kZVByb2Nlc3NNYW5hZ2VyLmdldEluc3RhbmNlKGdldENvbnRleHQoKSkucGFyc2VGTVJlcXVlc3RBQ0tQcm9jZXNzKHBheWxvYWQpOyB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXNrSWQgPT0gVUFSVF9GTV9CVVJOX0lOX0NNRF9QUk9DRVNTKSB7IHJlc3BvbnNlTW9kZWwgPSBGYWN0b3J5TW9kZVByb2Nlc3NNYW5hZ2VyLmdldEluc3RhbmNlKGdldENvbnRleHQoKSkucGFyc2VCdXJuSW5BY2tQcm9jZXNzKHBheWxvYWQpOyB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXNrSWQgPT0gVUFSVF9GTV9GUUNfQ01EX1BST0NFU1MpIHsgcmVzcG9uc2VNb2RlbCA9IEZhY3RvcnlNb2RlUHJvY2Vzc01hbmFnZXIuZ2V0SW5zdGFuY2UoZ2V0Q29udGV4dCgpKS5wYXJzZUZRQ0Fja1Byb2Nlc3MocGF5bG9hZCk7IH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhc2tJZCA9PSBVQVJUX0ZNX1NISVBQSU5HX0NNRF9QUk9DRVNTKSB7IHJlc3BvbnNlTW9kZWwgPSBGYWN0b3J5TW9kZVByb2Nlc3NNYW5hZ2VyLmdldEluc3RhbmNlKGdldENvbnRleHQoKSkucGFyc2VTaGlwcGluZ0Fja1Byb2Nlc3MocGF5bG9hZCk7IH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhc2tJZCA9PSBVQVJUX0ZNX1ZFUl9BU0tfQ01EX1BST0NFU1MpIHsgcmVzcG9uc2VNb2RlbCA9IEZhY3RvcnlNb2RlUHJvY2Vzc01hbmFnZXIuZ2V0SW5zdGFuY2UoZ2V0Q29udGV4dCgpKS5wYXJzZVZlcnNpb25Bc2tBY2tQcm9jZXNzKHBheWxvYWQpOyB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXNrSWQgPT0gVUFSVF9GTV9SRVNFVF9DTURfUFJPQ0VTUykgeyByZXNwb25zZU1vZGVsID0gRmFjdG9yeU1vZGVQcm9jZXNzTWFuYWdlci5nZXRJbnN0YW5jZShnZXRDb250ZXh0KCkpLnBhcnNlVmVyc2lvbkFza0Fja1Byb2Nlc3MocGF5bG9hZCk7IH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhc2tJZCA9PSBVQVJUX0ZNX0NBTUVSQV9URVNUX0NNRF9QUk9DRVNTKSB7IHJlc3BvbnNlTW9kZWwgPSBGYWN0b3J5TW9kZVByb2Nlc3NNYW5hZ2VyLmdldEluc3RhbmNlKGdldENvbnRleHQoKSkucGFyc2VDYW1lcmFBY2tQcm9jZXNzKHBheWxvYWQpOyB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3BvbnNlTW9kZWw7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFza0lkTmFtZShpbnQgaWQpIHsKICAgICAgICBzd2l0Y2ggKGlkKSB7CiAgICAgICAgICAgIGNhc2UgVUFSVF9QUklOVF9SRVFVRVNUX1BST0NFU1M6IHJldHVybiAiVUFSVF9QUklOVF9SRVFVRVNUX1BST0NFU1MiOwogICAgICAgICAgICBjYXNlIFVBUlRfU1RBUlRfUFJPQ0VTUzogcmV0dXJuICJVQVJUX1NUQVJUX1BST0NFU1MiOwogICAgICAgICAgICBjYXNlIFVBUlRfSEVBUlRfQkVBVF9QUk9DRVNTOiByZXR1cm4gIlVBUlRfSEVBUlRfQkVBVF9QUk9DRVNTIjsKICAgICAgICAgICAgY2FzZSBVQVJUX0lNQUdFX0lORk9fUFJPQ0VTUzogcmV0dXJuICJVQVJUX0lNQUdFX0lORk9fUFJPQ0VTUyI7CiAgICAgICAgICAgIGNhc2UgVUFSVF9HT19QUklOVF9QUk9DRVNTOiByZXR1cm4gIlVBUlRfR09fUFJJTlRfUFJPQ0VTUyI7CiAgICAgICAgICAgIGNhc2UgVUFSVF9FTkRfT0ZfUFJJTlRfUFJPQ0VTUzogcmV0dXJuICJVQVJUX0VORF9PRl9QUklOVF9QUk9DRVNTIjsKICAgICAgICAgICAgY2FzZSBVQVJUX1BSSU5URVJfQ09PTElOR19QUk9DRVNTOiByZXR1cm4gIlVBUlRfUFJJTlRFUl9DT09MSU5HX1BST0NFU1MiOwogICAgICAgICAgICBjYXNlIFVBUlRfUFJJTlRfTU9SRV9QUk9DRVNTOiByZXR1cm4gIlVBUlRfUFJJTlRfTU9SRV9QUk9DRVNTIjsKICAgICAgICAgICAgY2FzZSBVQVJUX0FTS19GV19WRVJTSU9OX1BST0NFU1M6IHJldHVybiAiVUFSVF9BU0tfRldfVkVSU0lPTl9QUk9DRVNTIjsKICAgICAgICAgICAgY2FzZSBVQVJUX0ZXX1VQR1JBREVfUkVRVUVTVF9QUk9DRVNTOiByZXR1cm4gIlVBUlRfRldfVVBHUkFERV9SRVFVRVNUX1BST0NFU1MiOwogICAgICAgICAgICBjYXNlIFVBUlRfRldfR09fVVBHUkFERV9QUk9DRVNTOiByZXR1cm4gIlVBUlRfRldfR09fVVBHUkFERV9QUk9DRVNTIjsKICAgICAgICAgICAgY2FzZSBVQVJUX0ZXX0dPX1VQR1JBREVfQUNLX1BST0NFU1M6IHJldHVybiAiVUFSVF9GV19HT19VUEdSQURFX0FDS19QUk9DRVNTIjsKICAgICAgICAgICAgY2FzZSBVQVJUX0ZXX0VORF9PRl9VUEdSQURFX1BST0NFU1M6IHJldHVybiAiVUFSVF9GV19FTkRfT0ZfVVBHUkFERV9QUk9DRVNTIjsKICAgICAgICAgICAgY2FzZSBVQVJUX0ZXX0VORF9PRl9VUEdSQURFX0FDS19QUk9DRVNTOiByZXR1cm4gIlVBUlRfRldfRU5EX09GX1VQR1JBREVfQUNLX1BST0NFU1MiOwogICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV04iOwogICAgICAgIH0KICAgIH0KfQo= \ No newline at end of file +package android.serialport.manager; + +import android.content.Context; +import android.serialport.model.PrinterRequestModel; +import android.serialport.model.PrinterResponseModel; +import android.serialport.utils.Logger; +import android.util.Log; + +public class UartProtocolManager { + private final Context mContext; + private static UartProtocolManager mUartProtocolManager; + + //Getter/Setter Variables + private final PrinterRequestModel mPrinterRequestModel; + + //Total bytes + public static final int TOTAL_BYTES = 64; + + //Task Ids + public static final int UART_PRINT_REQUEST_PROCESS = 101; + public static final int UART_START_PROCESS = 102; + public static final int UART_HEART_BEAT_PROCESS = 103; + public static final int UART_IMAGE_INFO_PROCESS = 104; + public static final int UART_GO_PRINT_PROCESS = 105; + public static final int UART_END_OF_PRINT_PROCESS = 106; + public static final int UART_PRINTER_COOLING_PROCESS = 107; + public static final int UART_PRINT_MORE_PROCESS = 108; + public static final int UART_ASK_FW_VERSION_PROCESS = 109; + public static final int UART_PRINT_RESTART_PROCESS = 222; + + public static final int UART_FW_UPGRADE_REQUEST_PROCESS = 201; + public static final int UART_FW_GO_UPGRADE_PROCESS = 202; + public static final int UART_FW_GO_UPGRADE_ACK_PROCESS = 203; + public static final int UART_FW_END_OF_UPGRADE_PROCESS = 204; + public static final int UART_FW_END_OF_UPGRADE_ACK_PROCESS = 205; + + //Print SS Command + public static final int UART_SMART_SHEET_PRINT_PROCESS = 301; + public static final int UART_SMART_SHEET_END_OF_PROCESS = 302; + + //Factory Mode + public static final int UART_FM_REQUEST_CMD_PROCESS = 301; + public static final int UART_FM_REQUEST_ACK_PROCESS = 302; + public static final int UART_FM_BURN_IN_CMD_PROCESS = 303; + public static final int UART_FM_BURN_IN_ACK_PROCESS = 304; + public static final int UART_FM_CAMERA_TEST_CMD_PROCESS = 305; + public static final int UART_FM_CAMERA_TEST_ACK_PROCESS = 306; + public static final int UART_FM_FQC_CMD_PROCESS = 307; + public static final int UART_FM_FQC_ACK_PROCESS = 308; + public static final int UART_FM_SHIPPING_CMD_PROCESS = 309; + public static final int UART_FM_SHIPPING_ACK_PROCESS = 310; + public static final int UART_FM_VER_ASK_CMD_PROCESS = 311; + public static final int UART_FM_VER_ASK_ACK_PROCESS = 312; + public static final int UART_FM_RESET_CMD_PROCESS = 313; + public static final int UART_FM_RESET_ACK_PROCESS = 314; + + + //Default byte + public static final int DEFAULT_BYTE = 0x00; + public static final int START_CODE_ONE = 0x1B; + public static final int START_CODE_TWO = 0x2A; + public static final int START_CODE_THREE = 0x43; + public static final int START_CODE_FOUR = 0x41; + + + + private UartProtocolManager(Context context, Builder builder) { + this.mContext = context; + mPrinterRequestModel = new PrinterRequestModel().setProcessTaskID(builder.getModel().getProcessTaskID()).setPayload(builder.getModel().getPayload()).setNumberOfCopies(builder.getModel().getNumberOfCopies()).setFileName1(builder.getModel().getFileName1()).setFileName3(builder.getModel().getFileName3()).setFileName4(builder.getModel().getFileName4()).setFileName5(builder.getModel().getFileName5()).setFileName6(builder.getModel().getFileName6()).setFileName7(builder.getModel().getFileName7()).setFileName8(builder.getModel().getFileName8()); + } + + public static UartProtocolManager getInstance(Context context, Builder builder) { + return new UartProtocolManager(context, builder); + } + + public Context getContext() { + return mContext; + } + + + public static class Builder { + private final Context mContext; + private PrinterRequestModel model; + + public Builder(Context context) { + this.mContext = context; + model = new PrinterRequestModel(); + } + + public Builder setPrinterRequestModel(PrinterRequestModel model) { + this.model = model; + return this; + } + + public PrinterRequestModel getModel() { + return model; + } + + public UartProtocolManager build() { + return UartProtocolManager.getInstance(mContext, this); + } + + } + + /** + * Get Start Code and Customer Code + * + * @return byte array + */ + public byte[] getStartAndCustomerCode() { + return new byte[]{(byte) 0x1B, (byte) 0x2A, (byte) 0x43, (byte) 0x41}; + } + + public byte[] getHeartBeatProtocol() { + //0x1B 0x2A 0x43 0x41 0x00 0x01 0x04 0x55 + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[0] = getStartAndCustomerCode()[0]; + queryData[1] = getStartAndCustomerCode()[1]; + queryData[2] = getStartAndCustomerCode()[2]; + queryData[3] = getStartAndCustomerCode()[3]; + queryData[4] = (byte) 0x00; + queryData[5] = (byte) 0x01; + queryData[6] = (byte) 0x04; + queryData[7] = (byte) 0x55; + queryData[8] = (byte) 0x00; + queryData[9] = (byte) 0x00; + queryData[10] = (byte) 0x00; + queryData[11] = (byte) 0x00; + queryData[12] = (byte) 0x00; + queryData[13] = (byte) 0x00; + queryData[14] = (byte) 0x00; + queryData[15] = (byte) 0x00; + + return queryData; + } + + public byte[] getStartUpProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[0] = getStartAndCustomerCode()[0]; + queryData[1] = getStartAndCustomerCode()[1]; + queryData[2] = getStartAndCustomerCode()[2]; + queryData[3] = getStartAndCustomerCode()[3]; + queryData[4] = (byte) 0x01; + queryData[5] = (byte) 0x01; + queryData[6] = (byte) 0x01; + queryData[7] = (byte) 0x00; + return queryData; + } + + public byte[] sendPrintRequestProtocol() { + Logger.d("No.of Cop: " + mPrinterRequestModel.getNumberOfCopies()); + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[0] = getStartAndCustomerCode()[0]; + queryData[1] = getStartAndCustomerCode()[1]; + queryData[2] = getStartAndCustomerCode()[2]; + queryData[3] = getStartAndCustomerCode()[3]; + queryData[4] = (byte) 0x00; + queryData[5] = (byte) 0x01; + queryData[6] = (byte) 0x02; + queryData[7] = (byte) 0x00; + queryData[8] = (byte) mPrinterRequestModel.getNumberOfCopies(); + return queryData; + } + + public byte[] sendImageInfoProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + if (mPrinterRequestModel != null) { + byte[] array = mPrinterRequestModel.getFileName1().getBytes(); + queryData[0] = getStartAndCustomerCode()[0]; + queryData[1] = getStartAndCustomerCode()[1]; + queryData[2] = getStartAndCustomerCode()[2]; + queryData[3] = getStartAndCustomerCode()[3]; + queryData[4] = (byte) 0x00; + queryData[5] = (byte) 0x01; + queryData[6] = (byte) 0x02; + queryData[7] = (byte) 0x01; + for (int i = 0; i < Math.min(array.length, 8); i++) { queryData[8 + i] = array[i]; } + } + return queryData; + } + + public byte[] getGoPrintACKProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[0] = getStartAndCustomerCode()[0]; + queryData[1] = getStartAndCustomerCode()[1]; + queryData[2] = getStartAndCustomerCode()[2]; + queryData[3] = getStartAndCustomerCode()[3]; + queryData[4] = (byte) 0x00; + queryData[5] = (byte) 0x01; + queryData[6] = (byte) 0x02; + queryData[7] = (byte) 0x02; + return queryData; + } + + public byte[] getEndOfPrintACKProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[0] = getStartAndCustomerCode()[0]; + queryData[1] = getStartAndCustomerCode()[1]; + queryData[2] = getStartAndCustomerCode()[2]; + queryData[3] = getStartAndCustomerCode()[3]; + queryData[4] = (byte) 0x00; + queryData[5] = (byte) 0x01; + queryData[6] = (byte) 0x02; + queryData[7] = (byte) 0x03; + return queryData; + } + + public byte[] getFWUpgradeRequestProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[0] = getStartAndCustomerCode()[0]; + queryData[1] = getStartAndCustomerCode()[1]; + queryData[2] = getStartAndCustomerCode()[2]; + queryData[3] = getStartAndCustomerCode()[3]; + queryData[4] = (byte) 0x00; + queryData[5] = (byte) 0x01; + queryData[6] = (byte) 0x03; + queryData[7] = (byte) 0x00; + return queryData; + } + + public byte[] getFWGoUpgradeACKProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[0] = getStartAndCustomerCode()[0]; + queryData[1] = getStartAndCustomerCode()[1]; + queryData[2] = getStartAndCustomerCode()[2]; + queryData[3] = getStartAndCustomerCode()[3]; + queryData[4] = (byte) 0x00; + queryData[5] = (byte) 0x01; + queryData[6] = (byte) 0x03; + queryData[7] = (byte) 0x02; + return queryData; + } + + public byte[] getFWEndOfUpgradeACKProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[0] = getStartAndCustomerCode()[0]; + queryData[1] = getStartAndCustomerCode()[1]; + queryData[2] = getStartAndCustomerCode()[2]; + queryData[3] = getStartAndCustomerCode()[3]; + queryData[4] = (byte) 0x00; + queryData[5] = (byte) 0x01; + queryData[6] = (byte) 0x03; + queryData[7] = (byte) 0x03; + return queryData; + } + + public byte[] getPrinterCoolingACKProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[0] = getStartAndCustomerCode()[0]; + queryData[1] = getStartAndCustomerCode()[1]; + queryData[2] = getStartAndCustomerCode()[2]; + queryData[3] = getStartAndCustomerCode()[3]; + queryData[4] = (byte) 0x00; + queryData[5] = (byte) 0x01; + queryData[6] = (byte) 0x02; + queryData[7] = (byte) 0x0F; + return queryData; + } + + public byte[] askFwVersionProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[0] = getStartAndCustomerCode()[0]; + queryData[1] = getStartAndCustomerCode()[1]; + queryData[2] = getStartAndCustomerCode()[2]; + queryData[3] = getStartAndCustomerCode()[3]; + queryData[4] = (byte) 0x00; + queryData[5] = (byte) 0x01; + queryData[6] = (byte) 0x03; + queryData[7] = (byte) 0xFF; + return queryData; + } + + public byte[] sendPrintSmartSheetProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[0] = getStartAndCustomerCode()[0]; + queryData[1] = getStartAndCustomerCode()[1]; + queryData[2] = getStartAndCustomerCode()[2]; + queryData[3] = getStartAndCustomerCode()[3]; + queryData[4] = (byte) 0x01; + queryData[5] = (byte) 0x01; + queryData[6] = (byte) 0x02; + queryData[7] = (byte) 0xAA; + return queryData; + } + + public byte[] getFactoryModeRequestProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[0] = getStartAndCustomerCode()[0]; + queryData[1] = getStartAndCustomerCode()[1]; + queryData[2] = getStartAndCustomerCode()[2]; + queryData[3] = getStartAndCustomerCode()[3]; + queryData[4] = (byte) 0x00; + queryData[5] = (byte) 0x01; + queryData[6] = (byte) 0xF0; + queryData[7] = (byte) 0x00; + return queryData; + } + + public byte[] getFactoryModeBurnInProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[6] = (byte) 0xF0; queryData[7] = (byte) 0x01; + return queryData; + } + + public byte[] getFactoryModeCameraTestProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[6] = (byte) 0xF0; queryData[7] = (byte) 0x02; + return queryData; + } + + public byte[] getFactoryModeFQCProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[6] = (byte) 0xF0; queryData[7] = (byte) 0x03; + return queryData; + } + + public byte[] getFactoryModeShippingProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[6] = (byte) 0xF0; queryData[7] = (byte) 0x04; + return queryData; + } + + public byte[] getFactoryModeVersionAskProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[6] = (byte) 0xF0; queryData[7] = (byte) 0x05; + return queryData; + } + + public byte[] getFactoryModeResetProtocol() { + byte[] queryData = new byte[TOTAL_BYTES]; + queryData[6] = (byte) 0xF0; queryData[7] = (byte) 0xFF; + return queryData; + } + + public PrinterResponseModel findPrinterResponse() { + PrinterResponseModel responseModel = null; + if (mPrinterRequestModel != null) { + int taskId = mPrinterRequestModel.getProcessTaskID(); + byte[] payload = mPrinterRequestModel.getPayload(); + if (payload != null) { + if (taskId == UART_HEART_BEAT_PROCESS) { responseModel = PrintImageProcessManager.getInstance(getContext()).doHeartBeatProcess(payload); } + else if (taskId == UART_PRINT_REQUEST_PROCESS) { responseModel = PrintImageProcessManager.getInstance(getContext()).doPrintRequestACKProcess(payload); } + else if (taskId == UART_IMAGE_INFO_PROCESS) { responseModel = PrintImageProcessManager.getInstance(getContext()).doGoPrintACKPetProcess(payload); } + else if (taskId == UART_GO_PRINT_PROCESS) { responseModel = PrintImageProcessManager.getInstance(getContext()).doEndOfPrintProcess(payload); } + else if (taskId == UART_END_OF_PRINT_PROCESS) { responseModel = PrintImageProcessManager.getInstance(getContext()).doEndOfPrintProcess(payload); } + else if (taskId == UART_FW_UPGRADE_REQUEST_PROCESS) { responseModel = FWUpdateProcessManager.getInstance(getContext()).doFWUpgradeRequestACKPetProcess(payload); } + else if (taskId == UART_FW_GO_UPGRADE_PROCESS) { responseModel = FWUpdateProcessManager.getInstance(getContext()).doFWGoUpgradeProcess(payload); } + else if (taskId == UART_FW_END_OF_UPGRADE_PROCESS) { responseModel = FWUpdateProcessManager.getInstance(getContext()).doFWEndOfUpgradeProcess(payload); } + else if (taskId == UART_PRINTER_COOLING_PROCESS) { responseModel = PrintImageProcessManager.getInstance(getContext()).doPrinterIsCoolingProcess(payload); } + else if (taskId == UART_ASK_FW_VERSION_PROCESS) { responseModel = PrintImageProcessManager.getInstance(getContext()).doFWVersionProcess(payload); } + else if (taskId == UART_SMART_SHEET_PRINT_PROCESS) { responseModel = PrintImageProcessManager.getInstance(getContext()).doPrintSmartSheetProcess(payload); } + else if (taskId == UART_SMART_SHEET_END_OF_PROCESS) { responseModel = PrintImageProcessManager.getInstance(getContext()).doEndOfSmartSheetProcess(payload); } + else if (taskId == UART_FM_REQUEST_CMD_PROCESS) { responseModel = FactoryModeProcessManager.getInstance(getContext()).parseFMRequestACKProcess(payload); } + else if (taskId == UART_FM_BURN_IN_CMD_PROCESS) { responseModel = FactoryModeProcessManager.getInstance(getContext()).parseBurnInAckProcess(payload); } + else if (taskId == UART_FM_FQC_CMD_PROCESS) { responseModel = FactoryModeProcessManager.getInstance(getContext()).parseFQCAckProcess(payload); } + else if (taskId == UART_FM_SHIPPING_CMD_PROCESS) { responseModel = FactoryModeProcessManager.getInstance(getContext()).parseShippingAckProcess(payload); } + else if (taskId == UART_FM_VER_ASK_CMD_PROCESS) { responseModel = FactoryModeProcessManager.getInstance(getContext()).parseVersionAskAckProcess(payload); } + else if (taskId == UART_FM_RESET_CMD_PROCESS) { responseModel = FactoryModeProcessManager.getInstance(getContext()).parseVersionAskAckProcess(payload); } + else if (taskId == UART_FM_CAMERA_TEST_CMD_PROCESS) { responseModel = FactoryModeProcessManager.getInstance(getContext()).parseCameraAckProcess(payload); } + } + } + return responseModel; + } + + public static String getTaskIdName(int id) { + switch (id) { + case UART_PRINT_REQUEST_PROCESS: return "UART_PRINT_REQUEST_PROCESS"; + case UART_START_PROCESS: return "UART_START_PROCESS"; + case UART_HEART_BEAT_PROCESS: return "UART_HEART_BEAT_PROCESS"; + case UART_IMAGE_INFO_PROCESS: return "UART_IMAGE_INFO_PROCESS"; + case UART_GO_PRINT_PROCESS: return "UART_GO_PRINT_PROCESS"; + case UART_END_OF_PRINT_PROCESS: return "UART_END_OF_PRINT_PROCESS"; + case UART_PRINTER_COOLING_PROCESS: return "UART_PRINTER_COOLING_PROCESS"; + case UART_PRINT_MORE_PROCESS: return "UART_PRINT_MORE_PROCESS"; + case UART_ASK_FW_VERSION_PROCESS: return "UART_ASK_FW_VERSION_PROCESS"; + case UART_FW_UPGRADE_REQUEST_PROCESS: return "UART_FW_UPGRADE_REQUEST_PROCESS"; + case UART_FW_GO_UPGRADE_PROCESS: return "UART_FW_GO_UPGRADE_PROCESS"; + case UART_FW_GO_UPGRADE_ACK_PROCESS: return "UART_FW_GO_UPGRADE_ACK_PROCESS"; + case UART_FW_END_OF_UPGRADE_PROCESS: return "UART_FW_END_OF_UPGRADE_PROCESS"; + case UART_FW_END_OF_UPGRADE_ACK_PROCESS: return "UART_FW_END_OF_UPGRADE_ACK_PROCESS"; + default: return "UNKNOWN"; + } + } +}