├── .gitignore ├── apk_disection └── iDotMatrix_1.3.1_apkcombo.com.apk.jadx ├── assets_test ├── Christmas tree .gif ├── Christmas2023+The Tree.gif ├── Christmas2023+rudolph.gif ├── Fire.gif ├── Museum2023+Piet Mondrian 32.gif ├── Pinguin dance.gif ├── Pogo Penguin.gif ├── Xmas.gif ├── dedo mraz.gif ├── downloads │ ├── NEWGIFS2.zip │ └── NEWGIFS2 │ │ ├── 1.GIF │ │ ├── 10.GIF │ │ ├── 11.GIF │ │ ├── 12.GIF │ │ ├── 13.GIF │ │ ├── 14.GIF │ │ ├── 15.GIF │ │ ├── 16.GIF │ │ ├── 17.GIF │ │ ├── 18.GIF │ │ ├── 19.GIF │ │ ├── 2.GIF │ │ ├── 20.GIF │ │ ├── 21.GIF │ │ ├── 22.GIF │ │ ├── 23.GIF │ │ ├── 24.GIF │ │ ├── 25.GIF │ │ ├── 26.GIF │ │ ├── 27.GIF │ │ ├── 28.GIF │ │ ├── 29.GIF │ │ ├── 3.GIF │ │ ├── 30.GIF │ │ ├── 31.GIF │ │ ├── 32.GIF │ │ ├── 33.GIF │ │ ├── 34.GIF │ │ ├── 35.GIF │ │ ├── 4.GIF │ │ ├── 5.GIF │ │ ├── 6.GIF │ │ ├── 7.GIF │ │ ├── 8.GIF │ │ └── 9.GIF ├── fireplace_from_app.gif ├── hohoho .gif ├── luigi running.gif ├── output_from_pil.gif ├── test.4.gif ├── test.5.gif └── upload_test.gif ├── btsnoop ├── initial_dump_values.pcapng ├── initial_dump_values.txt ├── onoff_and_graffitti.pcapng ├── onoff_and_graffitti.values.txt ├── onoff_and_graffitti.with_values_only.pcapng ├── redgreenbluea.pcapng └── underscore.pcapng ├── decoding_bytes.md ├── idotmatrix_controller.py ├── readme.md └── tools ├── gifdecoder.py └── plot_hex_grid.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.cache 2 | *.com 3 | *.apk 4 | 5 | -------------------------------------------------------------------------------- /apk_disection/iDotMatrix_1.3.1_apkcombo.com.apk.jadx: -------------------------------------------------------------------------------- 1 | { 2 | "projectVersion": 1, 3 | "files": [ 4 | "iDotMatrix_1.3.1_apkcombo.com.apk" 5 | ], 6 | "treeExpansions": [ 7 | [ 8 | "com", 9 | "Source code", 10 | "iDotMatrix_1.3.1_apkcombo.com.apk" 11 | ], 12 | [ 13 | "j256.ormlite", 14 | "com", 15 | "Source code", 16 | "iDotMatrix_1.3.1_apkcombo.com.apk" 17 | ], 18 | [ 19 | "android", 20 | "j256.ormlite", 21 | "com", 22 | "Source code", 23 | "iDotMatrix_1.3.1_apkcombo.com.apk" 24 | ], 25 | [ 26 | "blankj.utilcode", 27 | "com", 28 | "Source code", 29 | "iDotMatrix_1.3.1_apkcombo.com.apk" 30 | ], 31 | [ 32 | "meis.widget", 33 | "com", 34 | "Source code", 35 | "iDotMatrix_1.3.1_apkcombo.com.apk" 36 | ], 37 | [ 38 | "tiro.jlotalibrary", 39 | "com", 40 | "Source code", 41 | "iDotMatrix_1.3.1_apkcombo.com.apk" 42 | ], 43 | [ 44 | "scwang.smart", 45 | "com", 46 | "Source code", 47 | "iDotMatrix_1.3.1_apkcombo.com.apk" 48 | ], 49 | [ 50 | "refresh", 51 | "scwang.smart", 52 | "com", 53 | "Source code", 54 | "iDotMatrix_1.3.1_apkcombo.com.apk" 55 | ], 56 | [ 57 | "footer", 58 | "refresh", 59 | "scwang.smart", 60 | "com", 61 | "Source code", 62 | "iDotMatrix_1.3.1_apkcombo.com.apk" 63 | ], 64 | [ 65 | "jieli", 66 | "com", 67 | "Source code", 68 | "iDotMatrix_1.3.1_apkcombo.com.apk" 69 | ], 70 | [ 71 | "weigan.loopview", 72 | "com", 73 | "Source code", 74 | "iDotMatrix_1.3.1_apkcombo.com.apk" 75 | ], 76 | [ 77 | "csh.tiro.p017cc", 78 | "Source code", 79 | "iDotMatrix_1.3.1_apkcombo.com.apk" 80 | ], 81 | [ 82 | "fft", 83 | "csh.tiro.p017cc", 84 | "Source code", 85 | "iDotMatrix_1.3.1_apkcombo.com.apk" 86 | ], 87 | [ 88 | "example.admin.balatetris", 89 | "com", 90 | "Source code", 91 | "iDotMatrix_1.3.1_apkcombo.com.apk" 92 | ], 93 | [ 94 | "tech.idotmatrix", 95 | "com", 96 | "Source code", 97 | "iDotMatrix_1.3.1_apkcombo.com.apk" 98 | ], 99 | [ 100 | "ota", 101 | "tech.idotmatrix", 102 | "com", 103 | "Source code", 104 | "iDotMatrix_1.3.1_apkcombo.com.apk" 105 | ], 106 | [ 107 | "wifiled.ipixels.core.text", 108 | "com", 109 | "Source code", 110 | "iDotMatrix_1.3.1_apkcombo.com.apk" 111 | ], 112 | [ 113 | "getkeepsafe.relinker", 114 | "com", 115 | "Source code", 116 | "iDotMatrix_1.3.1_apkcombo.com.apk" 117 | ], 118 | [ 119 | "chad.library", 120 | "com", 121 | "Source code", 122 | "iDotMatrix_1.3.1_apkcombo.com.apk" 123 | ], 124 | [ 125 | "heaton", 126 | "com", 127 | "Source code", 128 | "iDotMatrix_1.3.1_apkcombo.com.apk" 129 | ], 130 | [ 131 | "baselib", 132 | "heaton", 133 | "com", 134 | "Source code", 135 | "iDotMatrix_1.3.1_apkcombo.com.apk" 136 | ], 137 | [ 138 | "ble", 139 | "tech.idotmatrix", 140 | "com", 141 | "Source code", 142 | "iDotMatrix_1.3.1_apkcombo.com.apk" 143 | ], 144 | [ 145 | "send", 146 | "ble", 147 | "tech.idotmatrix", 148 | "com", 149 | "Source code", 150 | "iDotMatrix_1.3.1_apkcombo.com.apk" 151 | ] 152 | ], 153 | "codeData": { 154 | "comments": [ 155 | { 156 | "nodeRef": { 157 | "refType": "METHOD", 158 | "declClass": "com.tech.idotmatrix.core.data.TextAgreement", 159 | "shortId": "sendTextTo3232(Lcn/com/heaton/blelibrary/ble/model/BleDevice;Lcom/tech/idotmatrix/core/db/bean/Material;ILcom/tech/idotmatrix/core/data/TextAgreement$TextAgreementListener;)V" 160 | }, 161 | "codeRef": { 162 | "attachType": "INSN", 163 | "index": 927 164 | }, 165 | "comment": "WHAT\u003e!!" 166 | }, 167 | { 168 | "nodeRef": { 169 | "refType": "METHOD", 170 | "declClass": "com.tech.idotmatrix.core.data.TextAgreement", 171 | "shortId": "sendTextTo3232(Lcn/com/heaton/blelibrary/ble/model/BleDevice;Lcom/tech/idotmatrix/core/db/bean/Material;ILcom/tech/idotmatrix/core/data/TextAgreement$TextAgreementListener;)V" 172 | }, 173 | "codeRef": { 174 | "attachType": "INSN", 175 | "index": 991 176 | }, 177 | "comment": "copies source barr2 from 0 in to barr3 at pos 14, for size bytes" 178 | } 179 | ], 180 | "renames": [ 181 | { 182 | "nodeRef": { 183 | "refType": "METHOD", 184 | "declClass": "com.tech.idotmatrix.core.data.TextAgreement", 185 | "shortId": "sendTextTo3232(Lcn/com/heaton/blelibrary/ble/model/BleDevice;Lcom/tech/idotmatrix/core/db/bean/DeviceMaterial;ILcom/tech/idotmatrix/core/data/TextAgreement$TextAgreementListener;)V" 186 | }, 187 | "codeRef": { 188 | "attachType": "VAR", 189 | "index": 262150 190 | }, 191 | "newName": "maybetextbitmaps" 192 | }, 193 | { 194 | "nodeRef": { 195 | "refType": "METHOD", 196 | "declClass": "com.tech.idotmatrix.core.data.TextAgreement", 197 | "shortId": "sendTextTo3232(Lcn/com/heaton/blelibrary/ble/model/BleDevice;Lcom/tech/idotmatrix/core/db/bean/DeviceMaterial;ILcom/tech/idotmatrix/core/data/TextAgreement$TextAgreementListener;)V" 198 | }, 199 | "codeRef": { 200 | "attachType": "VAR", 201 | "index": 393217 202 | }, 203 | "newName": "textbitmapsarray" 204 | }, 205 | { 206 | "nodeRef": { 207 | "refType": "METHOD", 208 | "declClass": "com.tech.idotmatrix.core.data.TextAgreement", 209 | "shortId": "sendTextTo3232(Lcn/com/heaton/blelibrary/ble/model/BleDevice;Lcom/tech/idotmatrix/core/db/bean/DeviceMaterial;ILcom/tech/idotmatrix/core/data/TextAgreement$TextAgreementListener;)V" 210 | }, 211 | "codeRef": { 212 | "attachType": "VAR", 213 | "index": 524296 214 | }, 215 | "newName": "textmetadataarray" 216 | } 217 | ] 218 | }, 219 | "openTabs": [ 220 | { 221 | "type": "class", 222 | "tabPath": "com.tech.idotmatrix.ble.send.SendCore", 223 | "subPath": "java", 224 | "caret": 60723, 225 | "view": { 226 | "x": 0, 227 | "y": 3237 228 | } 229 | }, 230 | { 231 | "type": "class", 232 | "tabPath": "com.tech.idotmatrix.ui.pattern.DeviceMaterialChildFragment", 233 | "subPath": "java", 234 | "caret": 11160, 235 | "view": { 236 | "x": 0, 237 | "y": 4391 238 | } 239 | }, 240 | { 241 | "type": "class", 242 | "tabPath": "com.tech.idotmatrix.core.data.ImageAgreement1", 243 | "subPath": "java", 244 | "caret": 8212, 245 | "view": { 246 | "x": 0, 247 | "y": 2086 248 | } 249 | }, 250 | { 251 | "type": "class", 252 | "tabPath": "com.tech.idotmatrix.core.data.TextAgreement", 253 | "subPath": "java", 254 | "caret": 63302, 255 | "view": { 256 | "x": 0, 257 | "y": 19708 258 | } 259 | }, 260 | { 261 | "type": "class", 262 | "tabPath": "com.tech.idotmatrix.core.data.GifAgreement", 263 | "subPath": "java", 264 | "caret": 6383, 265 | "view": { 266 | "x": 0, 267 | "y": 1852 268 | } 269 | }, 270 | { 271 | "type": "class", 272 | "tabPath": "com.tech.idotmatrix.AppData", 273 | "subPath": "java", 274 | "caret": 2291, 275 | "view": { 276 | "x": 0, 277 | "y": 982 278 | } 279 | }, 280 | { 281 | "type": "class", 282 | "tabPath": "com.tech.idotmatrix.core.data.DeviceMaterialTimeConvert", 283 | "subPath": "java", 284 | "caret": 233, 285 | "view": { 286 | "x": 0, 287 | "y": 0 288 | } 289 | } 290 | ], 291 | "activeTab": 6, 292 | "cacheDir": "iDotMatrix_1.3.1_apkcombo.com.apk.cache", 293 | "enableLiveReload": false, 294 | "searchHistory": [ 295 | "crc32", 296 | "mymaterial", 297 | "sendDIYImageData", 298 | "[6] \u003d (byte) ", 299 | "gif", 300 | "4096", 301 | "0, 13", 302 | "16, 16", 303 | "GIF89a", 304 | "sendgif", 305 | "textColorMode", 306 | "3232", 307 | "senddata4096", 308 | "crc32.crc32", 309 | "speed", 310 | "bitmap", 311 | "[0] \u003d (byte)", 312 | "text", 313 | "sendtext", 314 | "len:" 315 | ] 316 | } -------------------------------------------------------------------------------- /assets_test/Christmas tree .gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/Christmas tree .gif -------------------------------------------------------------------------------- /assets_test/Christmas2023+The Tree.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/Christmas2023+The Tree.gif -------------------------------------------------------------------------------- /assets_test/Christmas2023+rudolph.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/Christmas2023+rudolph.gif -------------------------------------------------------------------------------- /assets_test/Fire.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/Fire.gif -------------------------------------------------------------------------------- /assets_test/Museum2023+Piet Mondrian 32.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/Museum2023+Piet Mondrian 32.gif -------------------------------------------------------------------------------- /assets_test/Pinguin dance.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/Pinguin dance.gif -------------------------------------------------------------------------------- /assets_test/Pogo Penguin.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/Pogo Penguin.gif -------------------------------------------------------------------------------- /assets_test/Xmas.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/Xmas.gif -------------------------------------------------------------------------------- /assets_test/dedo mraz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/dedo mraz.gif -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2.zip -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/1.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/1.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/10.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/10.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/11.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/11.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/12.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/12.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/13.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/13.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/14.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/14.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/15.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/15.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/16.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/16.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/17.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/17.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/18.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/18.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/19.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/19.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/2.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/2.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/20.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/20.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/21.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/21.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/22.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/22.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/23.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/23.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/24.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/24.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/25.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/25.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/26.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/26.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/27.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/27.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/28.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/28.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/29.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/29.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/3.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/3.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/30.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/30.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/31.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/31.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/32.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/32.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/33.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/33.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/34.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/34.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/35.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/35.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/4.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/4.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/5.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/5.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/6.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/6.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/7.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/7.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/8.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/8.GIF -------------------------------------------------------------------------------- /assets_test/downloads/NEWGIFS2/9.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/downloads/NEWGIFS2/9.GIF -------------------------------------------------------------------------------- /assets_test/fireplace_from_app.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/fireplace_from_app.gif -------------------------------------------------------------------------------- /assets_test/hohoho .gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/hohoho .gif -------------------------------------------------------------------------------- /assets_test/luigi running.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/luigi running.gif -------------------------------------------------------------------------------- /assets_test/output_from_pil.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/output_from_pil.gif -------------------------------------------------------------------------------- /assets_test/test.4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/test.4.gif -------------------------------------------------------------------------------- /assets_test/test.5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/test.5.gif -------------------------------------------------------------------------------- /assets_test/upload_test.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/assets_test/upload_test.gif -------------------------------------------------------------------------------- /btsnoop/initial_dump_values.pcapng: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/btsnoop/initial_dump_values.pcapng -------------------------------------------------------------------------------- /btsnoop/initial_dump_values.txt: -------------------------------------------------------------------------------- 1 | 0c060002fa,10090003fa 2 | 0b000180e70c12010a2610 3 | 0500070100 4 | 0500070101 5 | 0500070100 6 | 0500070101 7 | 0500070100 8 | 0500070101 9 | 0500070100 10 | 0500070101 11 | 0500040101 12 | 0a00050100ff00000001 13 | 0a00050100ff00000001 14 | 0a00050100ff00000003 15 | 0a00050100ff00000002 16 | 0a00050100ff00000001 17 | 0a00050100ff00000102 18 | 0a00050100ff00000001 19 | 0a00050100ff00000000 20 | 0a00050100ff00001f1f 21 | 0a00050100ff00001e1f 22 | 0a00050100ff00001e1e 23 | 0a00050100ff00001e1f 24 | 0a00050100ff00001f1f 25 | 0a00050100ff00001e1f 26 | 0a00050100ff00001e1e 27 | 0a00050100ff00001e1d 28 | 0a00050100ff00001d1e 29 | 0a00050100ff00001d1f 30 | 0a00050100ff00001e1e 31 | 0a00050100ff00001e1d 32 | 0a00050100ff00001d1d 33 | 0a00050100ff00001d1e 34 | 0a00050100ff00001d1f 35 | 0a00050100ff00001e1f 36 | 0a00050100ff00001e1e 37 | 0500040101 38 | 0500040100 39 | 0500040102 40 | 0c060002fa,10090003fa 41 | 0c060002fa,10090003fa 42 | 0b000180e70c12010c3939 43 | 0500040101 44 | 0500040100 45 | 0500040102 46 | 0500070100 47 | 0c060002fa,10090003fa 48 | 0b000180e70c12010e1e11 49 | 0500070100 50 | 0500070101 51 | 0500070100 52 | 0500070101 53 | aa000300009a000000fad1c25c00000c070000010000010101010000000002ffffff000000000302021a26424242261a000002ffffff000000000000003c42424242423c000002ffffff000000000008083e080808084830000002ffffff000000000008083e080808084830000002ffffff000000000000003c42424242423c000002ffffff000000000000007f9292929292b7000002ffffff000000000000007c42023c40423e0000 54 | aa000300009a0000008c2d5eb500000c07000001000001ff3d3d0000000002ffffff000000000302021a26424242261a000002ffffff000000000000003c42424242423c000002ffffff000000000008083e080808084830000002ffffff000000000008083e080808084830000002ffffff000000000000003c42424242423c000002ffffff000000000000007f9292929292b7000002ffffff000000000000007c42023c40423e0000 55 | 050004800a 56 | 050004800a 57 | aa000300009a00000041270a8600000c07000001000001ff95950000000002ffffff000000000302021a26424242261a000002ffffff000000000000003c42424242423c000002ffffff000000000008083e080808084830000002ffffff000000000008083e080808084830000002ffffff000000000000003c42424242423c000002ffffff000000000000007f9292929292b7000002ffffff000000000000007c42023c40423e0000 58 | aa000300009a00000057ca918100000c07000001000001ff1c1c0000000002ffffff000000000302021a26424242261a000002ffffff000000000000003c42424242423c000002ffffff000000000008083e080808084830000002ffffff000000000008083e080808084830000002ffffff000000000000003c42424242423c000002ffffff000000000000007f9292929292b7000002ffffff000000000000007c42023c40423e0000 59 | aa000300009a000000108a3d0b00000c07000001000004ff76ef0000000002ffffff000000000302021a26424242261a000002ffffff000000000000003c42424242423c000002ffffff000000000008083e080808084830000002ffffff000000000008083e080808084830000002ffffff000000000000003c42424242423c000002ffffff000000000000007f9292929292b7000002ffffff000000000000007c42023c40423e0000 60 | 08000a8000000000 61 | 08000601006118d6 62 | 07000202ffffff 63 | 07000202ff0000 64 | 0500048008 65 | 0500048009 66 | 050004800a 67 | 050004800b 68 | 050004800d 69 | 0500048010 70 | 0500048014 71 | 0500048018 72 | 050004801d 73 | 0500048022 74 | 0500048028 75 | 050004802e 76 | 0500048035 77 | 050004803b 78 | 0500048042 79 | 0500048048 80 | 050004804d 81 | 0500048052 82 | 0500048057 83 | 050004805a 84 | 050004805d 85 | 050004805e 86 | 0500048060 87 | 0500048061 88 | 0500048062 89 | 0500048063 90 | 0500048064 91 | 0500048064 92 | 050004805f 93 | 050004805e 94 | 050004805d 95 | 050004805c 96 | 050004805b 97 | 050004805a 98 | 0500048059 99 | 0500048058 100 | 0500048056 101 | 0500048055 102 | 0500048054 103 | 0500048052 104 | 0500048051 105 | 0500048050 106 | 050004804f 107 | 050004804d 108 | 050004804d 109 | 050004804a 110 | 0500048049 111 | 0500048048 112 | 0500048047 113 | 0500048045 114 | 0500048044 115 | 0500048042 116 | 0500048041 117 | 0500048040 118 | 050004803e 119 | 050004803d 120 | 050004803c 121 | 050004803b 122 | 050004803a 123 | 050004803a 124 | 0500048039 125 | 0500048038 126 | 0500048037 127 | 0500048036 128 | 0500048035 129 | 0500048033 130 | 0500048032 131 | 0500048031 132 | 0500048030 133 | 050004802e 134 | 050004802d 135 | 050004802c 136 | 050004802b 137 | 050004802a 138 | 0500048029 139 | 0500048029 140 | 0500048027 141 | 0500048026 142 | 0500048025 143 | 0500048024 144 | 0500048023 145 | 0500048022 146 | 0500048021 147 | 050004801f 148 | 050004801e 149 | 050004801d 150 | 050004801c 151 | 050004801b 152 | 050004801a 153 | 0500048019 154 | 0500048019 155 | 050004801d 156 | 050004801c 157 | 050004801b 158 | 050004801a 159 | 0500048019 160 | 0500048017 161 | 0500048016 162 | 0500048015 163 | 0500048014 164 | 0500048013 165 | 0500048012 166 | 0500048011 167 | 0500048011 168 | 0500048014 169 | 0500048013 170 | 0500048012 171 | 0500048011 172 | 0500048010 173 | 050004800f 174 | 050004800e 175 | 050004800b 176 | 050004800b 177 | 050004800c 178 | 050004800b 179 | 050004800a 180 | 0500048009 181 | 0500048008 182 | 0500048007 183 | 0500048005 184 | 0500048005 185 | 0500048007 186 | 0500048008 187 | 0500048009 188 | 050004800a 189 | 050004800c 190 | 050004800e 191 | 050004800f 192 | 0500048011 193 | 0500048012 194 | 0500048015 195 | 0500048016 196 | 0500048016 197 | 0500048011 198 | 0500048012 199 | 0500048013 200 | 0500048014 201 | 0500048016 202 | 0500048018 203 | 050004801a 204 | 050004801c 205 | 050004801d 206 | 0500048021 207 | 0500048022 208 | 0500048023 209 | 0500048024 210 | 0500048025 211 | 0500048026 212 | 0500048027 213 | 0500048029 214 | 050004802a 215 | 050004802c 216 | 050004802d 217 | 050004802f 218 | 050004802f 219 | 0500048030 220 | 0500048031 221 | 0500048032 222 | 0500048033 223 | 0500048035 224 | 0500048037 225 | 0500048038 226 | 050004803a 227 | 050004803d 228 | 050004803d 229 | 050004803f 230 | 0500048040 231 | 0500048041 232 | 0500048042 233 | 0500048044 234 | 0500048045 235 | 0500048046 236 | 0500048047 237 | 0500048049 238 | 0500048049 239 | 050004804b 240 | 050004804c 241 | 050004804d 242 | 050004804e 243 | 050004804f 244 | 0500048051 245 | 0500048053 246 | 0500048056 247 | 0500048057 248 | 0500048057 249 | 050004805a 250 | 050004805b 251 | 050004805c 252 | 050004805d 253 | 050004805f 254 | 0500048062 255 | 0500048062 256 | 0500048060 257 | 0500048061 258 | 0500048062 259 | 0500048063 260 | 0500048064 261 | 0500048064 262 | 0500048060 263 | 0500048061 264 | 0500048062 265 | 0500048064 266 | 0500048064 267 | 0700020200ff00 268 | 269 | 270 | 271 | 272 | 273 | 274 | 00000000000000000000000000000000000000000000000000ff0000ff0000ff0000 275 | 04000a01 276 | 1c000302005a077f00007f51007f7f00007f0000007f7f007f7f7f7f 277 | 0500048064 278 | 08000601006118d6 279 | 0700020200ff00 280 | 08000601006118d6 281 | 0500040101 282 | 0500040100 283 | 0500040102 284 | 08000601006118d6 285 | 286 | 287 | 288 | 289 | 290 | 291 | 00000000000000000000000000000000000000000000000000ff0000ff0000ff0000 292 | 0500040101 293 | 0500040100 294 | 0500040102 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 0b4e45545343415045322e30030100000021f90409f9ffff002c00000000200020000708b0000508 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 0b4e45545343415045322e30030100000021f90409f9ffff002c00000000200020000708b0000508 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | ff0b4e45545343415045322e30030100000021f90409f9ffff002c00000000200020000708b00005 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 66483b17e85b882fd7e67cfaf4ac03bd39a1f63d6b00f0d0a45d09cf9d9b586862c519de0ad548b9 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | c0869e3507d4241074a8c3031f3e38080060800aab4a99128848b2a4ca011e4082f4c9d564069b1d 347 | 348 | 349 | 350 | 351 | b3670100003b 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | ff0b4e45545343415045322e30030100000021f90409f9ffff002c00000000200020000708b00005 361 | 0500040101 362 | 0500040101 363 | 364 | 0a00050104000000191d 365 | 0a00050104000000181d 366 | 0a00050104000000141d 367 | 0a000501040000000f1d 368 | 0a00050104000000091e 369 | 0a00050104000000081e 370 | 0a000501040000000c1e 371 | 0a00050104000000151e 372 | 0a000501040000001a1e 373 | 0a000501040000001b1e 374 | 0a00050104000000161e 375 | 0a000501040000000e1e 376 | 0a00050104000000081e 377 | 0a00050104000000061f 378 | 0a000501040000000a1f 379 | 0a00050104000000101f 380 | 0a00050104000000161f 381 | 0a000501040000001a1f 382 | 0a00050104000000181f 383 | 0a00050104000000131f 384 | 0a000501040000001c1f 385 | 0a000501040000001a1f 386 | 0a00050104000000121f 387 | 0a000501040000000a1f 388 | 0a00050104000000031f 389 | 0a00050104000000001f 390 | 0a00050104000000031e 391 | 0a000501040000000b1e 392 | 0a00050104000000121d 393 | 0a00050104000000171d 394 | 0a00050104000000131d 395 | 0a000501040000000e1c 396 | 0a00050104000000081c 397 | 0a00050104000000051d 398 | 0a000501040000000a1d 399 | 0a00050104000000141c 400 | 0a00050104000000191c 401 | 0a000501040000001b1c 402 | 0a00050104000000181c 403 | 0a00050104000000131c 404 | 0a000501040000000a1c 405 | 0a00050104000000061c 406 | 0a00050104000000071c 407 | 0a00050104000000101c 408 | 0a00050104000000171c 409 | 0a000501040000001c1c 410 | 0a00050104000000151d 411 | 0a000501040000000e1d 412 | 0a00050104000000091e 413 | 0a00050104000000081e 414 | 0a000501040000000c1e 415 | 0a00050104000000131d 416 | 0a000501040000001a1d 417 | 0a000501040000001d1c 418 | 0a000501040000001c1c 419 | 0a00050104000000191d 420 | 0a00050104000000161e 421 | 0a00050104000000161d 422 | 0a00050104000000181b 423 | 0a000501040000001b18 424 | 0a000501040000001d14 425 | 0a000501040000001d13 426 | 0a000501040000001c17 427 | 0a000501040000001c1a 428 | 0a000501040000001b1b 429 | 0a000501040000001b1a 430 | 0a000501040000001c16 431 | 0a000501040000001c13 432 | 0a000501040000001d10 433 | 0a000501040000001d11 434 | 0a000501040000001a09 435 | 0a000501040000001906 436 | 0a000501040000001c06 437 | 0a000501040000001606 438 | 0a000501040000001704 439 | 0a000501040000001904 440 | 0a000501040000001704 441 | 0a000501040000001906 442 | 0a000501040000001a05 443 | 0a000501040000001c08 444 | 0a000501040000001c0a 445 | 0a000501040000001d0b 446 | 0a000501040000001e0b 447 | 0a000501040000001b15 448 | 0a000501040000001b16 449 | 0a000501040000001b17 450 | 0a000501040000001a1b 451 | 0a00050104000000191b 452 | 0a00050104000000151c 453 | 0a00050104000000121b 454 | 0a000501040000000e1b 455 | 0a000501040000000c1b 456 | 0a000501040000000a1b 457 | 0a000501040000000616 458 | 0500040100 459 | 0500040102 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | ff0b4e45545343415045322e30030100000021f90409f9ffff002c00000000200020000708b00005 469 | 470 | 471 | 472 | 473 | 474 | 475 | 00000000000000000000000000000000000000000000000000ff0000ff0000ff0000 476 | 477 | 478 | 479 | 480 | 481 | 482 | 00000000000000000000000000000000000000000000000000ff0000ff0000ff0000 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | ff0b4e45545343415045322e30030100000021f90409f9ffff002c00000000200020000708b00005 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 66483b17e85b882fd7e67cfaf4ac03bd39a1f63d6b00f0d0a45d09cf9d9b586862c519de0ad548b9 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | c0869e3507d4241074a8c3031f3e38080060800aab4a99128848b2a4ca011e4082f4c9d564069b1d 510 | 511 | 512 | 513 | 514 | b3670100003b 515 | 050004805a 516 | 0500048059 517 | 0500048057 518 | 0500048054 519 | 0500048050 520 | 050004804c 521 | 0500048047 522 | 0500048041 523 | 050004803b 524 | 0500048035 525 | 0500048030 526 | 050004802b 527 | 0500048028 528 | 0500048024 529 | 0500048021 530 | 050004801f 531 | 050004801e 532 | 050004801d 533 | 050004801c 534 | 050004801b 535 | 050004801b 536 | 050004801a 537 | 050004801a 538 | 050004801a 539 | 0500048019 540 | 0500048019 541 | 0500048019 542 | 0500048019 543 | 0500048018 544 | 0500048018 545 | 0500048018 546 | 0500048018 547 | 0500048018 548 | 0500048017 549 | 0500048017 550 | 0500048017 551 | 0500048017 552 | 0500048016 553 | 0500048016 554 | 0500048016 555 | 0500048016 556 | 0500048015 557 | 0500048015 558 | 0500048015 559 | 0500048015 560 | 0500048017 561 | 0500048017 562 | 0500048017 563 | 0500048019 564 | 0500048018 565 | 0500048017 566 | 0500048016 567 | 0500048014 568 | 0500048013 569 | 0500048011 570 | 0500048010 571 | 0500048010 572 | 050004800f 573 | 050004800e 574 | 050004800d 575 | 050004800d 576 | 050004800c 577 | 050004800c 578 | 050004800d 579 | 050004800e 580 | 0500048010 581 | 0500048012 582 | 0500048015 583 | 0500048018 584 | 050004801c 585 | 050004801f 586 | 0500048022 587 | 0500048026 588 | 050004802a 589 | 050004802d 590 | 0500048030 591 | 0500048033 592 | 0500048037 593 | 050004803a 594 | 050004803e 595 | 0500048041 596 | 0500048045 597 | 0500048048 598 | 050004804b 599 | 050004804e 600 | 0500048051 601 | 0500048054 602 | 0500048057 603 | 050004805a 604 | 050004805d 605 | 050004805f 606 | 0500048061 607 | 0500048062 608 | 0500048063 609 | 0500048064 610 | 0500048064 611 | 0500048063 612 | 0500048061 613 | 050004805e 614 | 050004805a 615 | 0500048055 616 | 050004804f 617 | 0500048049 618 | 0500048044 619 | 050004803e 620 | 0500048039 621 | 0500048033 622 | 050004802e 623 | 050004802a 624 | 0500048025 625 | 0500048021 626 | 050004801d 627 | 0500048018 628 | 0500048014 629 | 050004800f 630 | 050004800b 631 | 0500048007 632 | 0500048003 633 | 05000480ff 634 | 05000480fc 635 | 05000480fa 636 | 05000480f9 637 | 05000480f8 638 | 05000480f8 639 | 05000480f8 640 | 05000480f9 641 | 05000480fb 642 | 05000480fe 643 | 0500048003 644 | 0500048008 645 | 050004800e 646 | 0500048014 647 | 050004801a 648 | 0500048021 649 | 0500048028 650 | 050004802e 651 | 0500048034 652 | 050004803a 653 | 0500048040 654 | 0500048046 655 | 050004804c 656 | 0500048052 657 | 0500048057 658 | 050004805c 659 | 0500048060 660 | 0500048064 661 | 0500048064 662 | 0500048064 663 | 0500048064 664 | 0500048064 665 | 0500048061 666 | 050004805c 667 | 0500048055 668 | 050004804e 669 | 0500048046 670 | 050004803e 671 | 0500048037 672 | 050004802f 673 | 0500048029 674 | 0500048022 675 | 050004801c 676 | 0500048016 677 | 0500048010 678 | 050004800b 679 | 0500048006 680 | 0500048001 681 | 05000480fd 682 | 05000480fa 683 | 05000480f8 684 | 05000480f6 685 | 05000480f5 686 | 05000480f5 687 | 05000480f5 688 | 05000480f7 689 | 05000480f9 690 | 05000480fd 691 | 0500048001 692 | 0500048006 693 | 050004800c 694 | 0500048011 695 | 0500048016 696 | 050004801b 697 | 0500048020 698 | 0500048026 699 | 050004802a 700 | 050004802f 701 | 0500048032 702 | 0500048035 703 | 0500048038 704 | 050004803b 705 | 050004803d 706 | 0500048040 707 | 0500048042 708 | 0500048043 709 | 0500048044 710 | 0500048045 711 | 0500048046 712 | 0500048047 713 | 0500048048 714 | 0500048048 715 | 0500048049 716 | 0500048049 717 | 050004804a 718 | 050004804a 719 | 050004804b 720 | 050004804b 721 | 050004804b 722 | 050004804b 723 | 050004804c 724 | 050004804c 725 | 050004804b 726 | 050004804b 727 | 050004804b 728 | 050004804b 729 | 050004804b 730 | 0500048049 731 | 0500048047 732 | 0500048043 733 | 0500048040 734 | 050004803c 735 | 0500048038 736 | 0500048034 737 | 0500048030 738 | 050004802d 739 | 050004802b 740 | 0500048028 741 | 0500048026 742 | 0500048025 743 | 0500048024 744 | 0500048023 745 | 0500048022 746 | 0500048022 747 | 0500048021 748 | 0500048021 749 | 0500048021 750 | 0500048021 751 | 0500048020 752 | 0500048020 753 | 0500048020 754 | 0500048020 755 | 0500048021 756 | 0500048023 757 | 0500048025 758 | 0500048028 759 | 050004802c 760 | 050004802f 761 | 0500048033 762 | 0500048037 763 | 050004803a 764 | 050004803d 765 | 0500048040 766 | 0500048043 767 | 0500048046 768 | 0500048048 769 | 050004804b 770 | 050004804d 771 | 0500048050 772 | 0500048052 773 | 0500048054 774 | 0500048056 775 | 0500048058 776 | 050004805a 777 | 050004805c 778 | 050004805e 779 | 0500048060 780 | 0500048061 781 | 0500048062 782 | 0500048063 783 | 0500048064 784 | 0500048064 785 | 0500048064 786 | 0500048064 787 | 0500048064 788 | 0500048064 789 | 0500048064 790 | 0500048064 791 | 0500048064 792 | 0500048064 793 | 04000a01 794 | 08000601006118d6 795 | 0700020200ff00 796 | 1c000302005a077f00007f51007f7f00007f0000007f7f007f7f7f7f 797 | 0d000302015a027f007f7f7f7f 798 | 0d000302025a0200007f7f007f 799 | 1c000302035a077f00007f51007f7f00007f0000007f7f007f7f7f7f 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 0b4e45545343415045322e30030100000021f90409f9ffff002c00000000200020000708b0000508 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 00000000000000000000000000000000000000000000000000ff0000ff0000ff0000 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | ff0b4e45545343415045322e30030100000021f90409f9ffff002c00000000200020000708b00005 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 66483b17e85b882fd7e67cfaf4ac03bd39a1f63d6b00f0d0a45d09cf9d9b586862c519de0ad548b9 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | c0869e3507d4241074a8c3031f3e38080060800aab4a99128848b2a4ca011e4082f4c9d564069b1d 850 | 851 | 852 | 853 | 854 | b3670100003b 855 | 0c060002fa,10090003fa 856 | 0b000180e70c1201101137 857 | 0500040103 858 | 0500040101 859 | 860 | 0500040100 861 | 0500040100 862 | 0500040103 863 | 0500040101 864 | 865 | 0a00050100ffffff100d 866 | 0a00050100ffffff0f0d 867 | 0a00050100ffffff070c 868 | 0a00050104000000070d 869 | 0a00050104010101070c 870 | 0500040100 871 | 0500040100 872 | 210001020006060606060606060606060606060606 873 | 210001020005070c0c04060302020306040c0c0705 874 | 210001020006060b030205060b0b060502030b0606 875 | 21000102000c06040b01010b05050b01010b04060c 876 | 210001020009060502090b0c05050c0b0902050609 877 | 210001020000060a0c0c0602050502060c0c0a0600 878 | 2100010200060b0506040301060601030406050b06 879 | 210001020006060505060505060605050605050606 880 | 210001020003060206020600050500060206020603 881 | 21000102000001020b0505040c0c0405050b020100 882 | 2100010200060c0606020100060600010206060c06 883 | 21000102000c02050c02010404040401020c05020c 884 | 21000102000a050c01040b030909030b04010c050a 885 | 210001020006060b020b0201010101020b020b0606 886 | 21000102000206040107060c03030c060701040602 887 | 2100010200080506010c020c0c0c0c020c01060508 888 | 21000102000604040b0c0606090906060c0b040406 889 | 210001020003060906060606050506060606090603 890 | 210001020004010506070c000606000c0706050104 891 | 21000102000c0a060c0c0a050505050a0c0c060a0c 892 | 2100010200090c0b090c0b0c0b0b0c0b0c090b0c09 893 | 210001020005090506050504050504050506050905 894 | 2100010200070b0c060c090c0b0b0c090c060c0b07 895 | 21000102000305050505040a06060a040505050503 896 | 2100010200050c0c040605050c0c050506040c0c05 897 | 210001020003060c050305020808020503050c0603 898 | 21000102000a02050c050b060707060b050c05020a 899 | 21000102000b060504030c0a09090a0c030405060b 900 | 2100010200060c0b0c060a090606090a060c0b0c06 901 | 21000102000603060a03050609090605030a060306 902 | 21000102000c020c060c0303090903030c060c020c 903 | 2100010200040603060606060c0c06060606030604 904 | 21000102000606040b040c050303050c040b040606 905 | 2100010200060a020a0c05060c0c06050c0a020a06 906 | 210001020000030305010c030b0b030c0105030300 907 | 2100010200060b0b0b010a0a0c0c0a0a010b0b0b06 908 | 21000102000c0b0c08060c080606080c06080c0b0c 909 | 2100010200010603060c0505040405050c06030601 910 | 2100010200050b040a05060205050206050a040b05 911 | 2100010200090602080c060b05050b060c08020609 912 | 21000102000c0c030b0a06040c0c04060a0b030c0c 913 | 21000102000c0b010c090a030505030a090c010b0c 914 | 21000102000a0509040b0505040405050b0409050a 915 | 2100010200060100090206010c0c01060209000106 916 | 060000020105 917 | 060000020105 918 | 060000020405 919 | 060000020105 920 | 060000020705 921 | 060000020105 922 | 060000020105 923 | 060000020505 924 | 060000020605 925 | 060000020105 926 | 060000020105 927 | 060000020105 928 | 060000020105 929 | 060000020105 930 | 060000020105 931 | 060000020605 932 | 060000020505 933 | 060000020105 934 | 060000020105 935 | 060000020205 936 | 060000020105 937 | 060000020105 938 | 060000020105 939 | 060000020305 940 | 060000020105 941 | 060000020105 942 | 060000020105 943 | 060000020105 944 | 060000020105 945 | 060000020105 946 | 060000020105 947 | 060000020105 948 | 060000020705 949 | 060000020105 950 | 060000020105 951 | 060000020105 952 | 060000020305 953 | 060000020205 954 | 060000020105 955 | 060000020105 956 | 060000020305 957 | 060000020405 958 | 060000020205 959 | 060000020105 960 | 060000020105 961 | 060000020105 962 | 060000020105 963 | 060000020105 964 | 060000020105 965 | 060000020205 966 | 060000020105 967 | 060000020105 968 | 060000020405 969 | 060000020405 970 | 060000020605 971 | 060000020105 972 | 060000020105 973 | 060000020105 974 | 060000020305 975 | 060000020105 976 | 060000020105 977 | 060000020105 978 | 060000020105 979 | 060000020105 980 | 060000020105 981 | 060000020304 982 | 060000020104 983 | 060000020304 984 | 060000020104 985 | 060000020104 986 | 060000020104 987 | 060000020104 988 | 060000020104 989 | 060000020104 990 | 060000020104 991 | 060000020204 992 | 060000020104 993 | 060000020104 994 | 060000020104 995 | 060000020504 996 | 060000020104 997 | 060000020404 998 | 060000020104 999 | 060000020204 1000 | 060000020104 1001 | 060000020504 1002 | 060000020304 1003 | 060000020104 1004 | 060000020103 1005 | 060000020103 1006 | 060000020203 1007 | 060000020103 1008 | 060000020503 1009 | 060000020103 1010 | 060000020103 1011 | 060000020103 1012 | 060000020503 1013 | 060000020103 1014 | 060000020103 1015 | 060000020103 1016 | 060000020103 1017 | 060000020103 1018 | 060000020103 1019 | 060000020403 1020 | 060000020103 1021 | 060000020103 1022 | 060000020103 1023 | 060000020503 1024 | 060000020203 1025 | 060000020403 1026 | 060000020603 1027 | 060000020103 1028 | 060000020203 1029 | 060000020103 1030 | 060000020403 1031 | 060000020103 1032 | 060000020103 1033 | 060000020103 1034 | 060000020103 1035 | 060000020203 1036 | 060000020203 1037 | 060000020603 1038 | 060000020203 1039 | 060000020303 1040 | 060000020103 1041 | 060000020103 1042 | 060000020603 1043 | 060000020103 1044 | 060000020103 1045 | 060000020103 1046 | 060000020203 1047 | 060000020103 1048 | 060000020103 1049 | 060000020403 1050 | 060000020103 1051 | 060000020103 1052 | 060000020103 1053 | 060000020103 1054 | 060000020103 1055 | 060000020103 1056 | 060000020103 1057 | 060000020103 1058 | 0500048060 1059 | 050004805f 1060 | 050004805e 1061 | 050004805d 1062 | 050004805c 1063 | 0500048059 1064 | 0500048057 1065 | 0500048054 1066 | 0500048050 1067 | 050004804d 1068 | 0500048048 1069 | 0500048044 1070 | 0500048040 1071 | 050004803c 1072 | 0500048038 1073 | 0500048034 1074 | 0500048031 1075 | 050004802e 1076 | 050004802b 1077 | 0500048028 1078 | 0500048025 1079 | 0500048022 1080 | 0500048020 1081 | 050004801d 1082 | 050004801a 1083 | 0500048018 1084 | 0500048016 1085 | 0500048014 1086 | 0500048012 1087 | 0500048010 1088 | 050004800e 1089 | 050004800d 1090 | 050004800c 1091 | 050004800b 1092 | 050004800a 1093 | 050004800b 1094 | 050004800c 1095 | 050004800e 1096 | 0500048010 1097 | 0500048013 1098 | 0500048017 1099 | 050004801b 1100 | 0500048020 1101 | 0500048025 1102 | 0500048029 1103 | 050004802e 1104 | 0500048032 1105 | 0500048037 1106 | 050004803a 1107 | 050004803e 1108 | 0500048041 1109 | 0500048044 1110 | 0500048046 1111 | 0500048049 1112 | 050004804b 1113 | 050004804d 1114 | 050004804f 1115 | 0500048051 1116 | 0500048053 1117 | 0500048056 1118 | 0500048058 1119 | 0500048059 1120 | 050004805b 1121 | 050004805d 1122 | 050004805e 1123 | 050004805f 1124 | 0500048060 1125 | 0500048061 1126 | 0500048062 1127 | 0500048063 1128 | 0500048064 1129 | 0500048064 1130 | 08000601006118d6 1131 | 04000a01 1132 | 1c000302005a077f00007f51007f7f00007f0000007f7f007f7f7f7f 1133 | 1134 | 1135 | 1136 | 1137 | -------------------------------------------------------------------------------- /btsnoop/onoff_and_graffitti.pcapng: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/btsnoop/onoff_and_graffitti.pcapng -------------------------------------------------------------------------------- /btsnoop/onoff_and_graffitti.values.txt: -------------------------------------------------------------------------------- 1 | 0100 2 | 0100 3 | 0b000180e70c12010a2610 4 | 0500070100 5 | 0500070101 6 | 0500070100 7 | 0500070101 8 | 0500070100 9 | 0500070101 10 | 0500070100 11 | 0500070101 12 | 0500040101 13 | 0a00050100ff00000001 14 | 0a00050100ff00000001 15 | 0a00050100ff00000003 16 | 0a00050100ff00000002 17 | 0a00050100ff00000001 18 | 0a00050100ff00000102 19 | 0a00050100ff00000001 20 | 0a00050100ff00000000 21 | 0a00050100ff00001f1f 22 | 0a00050100ff00001e1f 23 | 0a00050100ff00001e1e 24 | 0a00050100ff00001e1f 25 | 0a00050100ff00001f1f 26 | 0a00050100ff00001e1f 27 | 0a00050100ff00001e1e 28 | 0a00050100ff00001e1d 29 | 0a00050100ff00001d1e 30 | 0a00050100ff00001d1f 31 | 0a00050100ff00001e1e 32 | 0a00050100ff00001e1d 33 | 0a00050100ff00001d1d 34 | 0a00050100ff00001d1e 35 | 0a00050100ff00001d1f 36 | 0a00050100ff00001e1f 37 | 0a00050100ff00001e1e 38 | 0500040101 39 | -------------------------------------------------------------------------------- /btsnoop/onoff_and_graffitti.with_values_only.pcapng: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/btsnoop/onoff_and_graffitti.with_values_only.pcapng -------------------------------------------------------------------------------- /btsnoop/redgreenbluea.pcapng: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/btsnoop/redgreenbluea.pcapng -------------------------------------------------------------------------------- /btsnoop/underscore.pcapng: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/8none1/idotmatrix/1a08e1e9b82d78427ab1c896c24c2a7fb45bc2f0/btsnoop/underscore.pcapng -------------------------------------------------------------------------------- /decoding_bytes.md: -------------------------------------------------------------------------------- 1 | # Decoding bytes 2 | 3 | ```text 4 | 0a03030000fa0200000914ec8300000c0b000001016201ff00000000000005ffffff000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c180e38fe3ffe3f0e000e000e381c383c1cf80fe00300000000000000000000000005ffffff0000000000000000000080038003800380038003800380038003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff0000000000000000000080038003800380038003800380038003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f00f381c1c380e700e700e700e700e700e701c38381cf00fe00700000000000000000000000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005ffff 5 | ff000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c180e38fe3ffe3f0e000e000e381c383c1cf80fe00300000000000000000000000005ffffff000000000000000000000000000000000000000000000000380e380fb80ff801f80078003800380038003800380038003800380000000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c180e38fe3ffe3f0e000e000e381c383c1cf80fe003000000000000000000000000 6 | ``` 7 | 8 | ```text 9 | 6200 03 00 00 52000000 81866079 0000 0c [16 removed see below] 05ffffff [deleted] 10 | length ------------------|||| | | | |------| |------| |--| | 11 | three ------------------------| | | | | | | | | | 12 | zero ----------------------------| | | | | | | | | 13 | maybe continuation marker? if >4096-| | | | | | | | 14 | some length spanning 4 bytes --------- |------| | | | | | 15 | crc32 spanning 4 bytes (char data and the below)|------| | | | 16 | if `thing` is 12, then 00,00 else something about time---|--| | 17 | `thing` ------------------------------------------------------| 18 | 19 | ``` 20 | 21 | ```text 22 | [16 bytes deleted as seen above ] 0100 00 01 00 64 01 00 00 ff 00 00 00 00 05ffffff [deleted] 23 | length of char array (one char)---|||| | | | | | | | | | | | | | 24 | zero ----------------------------------| | | | | | | | | | | | | 25 | one --------------------------------------| | | | | | | | | | | | 26 | text mode -----------------------------------| | | | | | | | | | | 27 | speed ------------------------------------------| | | | | | | | | | 28 | textcolourmode ------------------------------------| | | | | | | | | 29 | red ------------------------------------------------| | | | | | | | 30 | green -------------------------------------------------| | | | | | | 31 | blue -----------------------------------------------------| | | | | | 32 | text background col mode --------------------------------------| | | | | 33 | bg r -------------------------------------------------------------| | | | 34 | bg g ----------------------------------------------------------------| | | 35 | bg b -------------------------------------------------------------------| | 36 | this is the start of a copy of `barr2` and is at pos. 14 (start 0) --------| 37 | ``` 38 | 39 | 40 | ```text 41 | 0a03 03 00 00 fa020000 aa7d3149 0000 0c 0b00 00 01 01 62 02 21 ca ff 00 00 00 00 05ffffff 000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c180e38fe3ffe3f0e000e000e381c383c1cf80fe00300000000000000000000000005ffffff0000000000000000000080038003800380038003800380038003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff0000000000000000000080038003800380038003800380038003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f00f381c1c380e700e700e700e700e700e701c38381cf00fe00700000000000000000000000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005ffff 42 | ``` 43 | 44 | `0a03030000fa020000aa7d314900000c0b00000101620221caff0000000005ffffff000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c180e38fe3ffe3f0e000e000e381c383c1cf80fe00300000000000000000000000005ffffff0000000000000000000080038003800380038003800380038003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff0000000000000000000080038003800380038003800380038003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f00f381c1c380e700e700e700e700e700e701c38381cf00fe00700000000000000000000000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005ffff` 45 | `ff000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c180e38fe3ffe3f0e000e000e381c383c1cf80fe00300000000000000000000000005ffffff000000000000000000000000000000000000000000000000380e380fb80ff801f80078003800380038003800380038003800380000000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c180e38fe3ffe3f0e000e000e381c383c1cf80fe003000000000000000000000000` 46 | 47 | 0a 03 -> reverse bytes = 03 10 = 3 * 256 = 768 + 10 = 778. 48 | Total length of both payloads including all headers and everything: 778 49 | 50 | 51 | `70 e3 6f 6d` 52 | 53 | ```text 54 | de0c030000ce0c000070e36f6d00000c30000001016201ff00000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005ffffff000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff0000000000000000000080038003800300000000000000008003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f81f3c3c1c381c003c00f807e01f003c1c381c38383cf81fe00700000000000000000000000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff0000000000000000000080038003800300000000000000008003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f81f3c3c1c381c003c00f807e01f003c1c381c38383cf81fe00700000000000000000000000005ffff 55 | ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff000000000000000000000000000000000000000000000000c00ff01f783c38380038003ee03ff83b3c381c381c3c3c3ef83ff07900000000000000000000000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff0000000000000000000000000000000000000000000000000e381c1c1c1c1c1c380e380e380e700770077007e003e003e003c00100000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c180e38fe3ffe3f0e000e000e381c383c1cf80fe00300000000000000000000000005ffffff000000000000000000000000000000000000000000000000380e380fb80ff801f80078003800380038003800380038003800380000000000000000000000000005ffffff0000000000000000000000000000000000000000000000000e701c381c381c38381c381c781e700e700ee007e007e007c003c00380018001c801f8007800000005ffffff0000000000000000000000000000000000000000000000000000000000000000 56 | 000000000000000000000000000000000000000000000000000000000000000005ffffff0000000000000000000080038003800380038003800380038003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f00f381c1c380e700e700e700e700e700e701c38381cf00fe00700000000000000000000000005ffffff0000000000000000000000000000000000000000000000009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000c0e3f0ff701e381c381c381c381c700ef00fd8030c001c00f81ff83f0c700c601c70f83ff00f000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f81f3c3c1c381c003c00f807e01f003c1c381c38383cf81fe00700000000000000000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005 57 | ffffff000000000000000000000000000000000000000000000000380e380fb80ff801f80078003800380038003800380038003800380000000000000000000000000005ffffff0000000000000000000080038003800300000000000000008003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff0000000000000000000000000000000000000000000000009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000c0e3f0ff701e381c381c381c381c700ef00fd8030c001c00f81ff83f0c700c601c70f83ff00f000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038003800380000000000000000000000000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff0000000000000000000000000000000000000000000000009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f00f381c 58 | 1c380e700e700e700e700e700e701c38381cf00fe00700000000000000000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff000000000000000000000000000000000000000000000000f039f83f3c3e1c3c0e380e380e380e380e380e381c3c3c3ef83bf03900380038003800380038000005ffffff0000000000000000000000000000000000000000000000001c381c381c381c381c381c381c381c381c381c3c1c3c3c3ef83bf03900000000000000000000000005ffffff0000000000000000000080038003800300000000000000008003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c180e38fe3ffe3f0e000e000e381c383c1cf80fe0030000000000000000000000 59 | 0005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff00000000000000000000000e000f000f800fc00fc00e600e700e300e380e180e0c0e0e0efe7ffe7f000e000e000e000e000e000e00000000000000000000000005ffffff000000000000000000001c001c001c001c001c001c001c001c3c1c1e1c0f9c07dc03fc03fc037c073c0f1c0e1c1e1c1c1c381c7800000000000000000000000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005ffffff000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f00f381c1c380e700e700e700e700e700e701c38381cf00fe00700000000000000000000000005ffffff0000000000000000000000000000000000000000000000001c381c38 60 | 1c381c381c381c381c381c381c381c3c1c3c3c3ef83bf03900000000000000000000000005ffffff000000000000000000000000000000000000000000000000c0e3f0ff701e381c381c381c381c700ef00fd8030c001c00f81ff83f0c700c601c70f83ff00f000005ffffff000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380038003800000000000000000000000000 61 | ``` 62 | 63 | strip off the starting header leving only the text meta data header and the bitmaps 64 | 65 | ```text 66 | 30000001016201ff00000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005ffffff000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff0000000000000000000080038003800300000000000000008003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f81f3c3c1c381c003c00f807e01f003c1c381c38383cf81fe00700000000000000000000000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff0000000000000000000080038003800300000000000000008003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f81f3c3c1c381c003c00f807e01f003c1c381c38383cf81fe00700000000000000000000000005ffff 67 | ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff000000000000000000000000000000000000000000000000c00ff01f783c38380038003ee03ff83b3c381c381c3c3c3ef83ff07900000000000000000000000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff0000000000000000000000000000000000000000000000000e381c1c1c1c1c1c380e380e380e700770077007e003e003e003c00100000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c180e38fe3ffe3f0e000e000e381c383c1cf80fe00300000000000000000000000005ffffff000000000000000000000000000000000000000000000000380e380fb80ff801f80078003800380038003800380038003800380000000000000000000000000005ffffff0000000000000000000000000000000000000000000000000e701c381c381c38381c381c781e700e700ee007e007e007c003c00380018001c801f8007800000005ffffff0000000000000000000000000000000000000000000000000000000000000000 68 | 000000000000000000000000000000000000000000000000000000000000000005ffffff0000000000000000000080038003800380038003800380038003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f00f381c1c380e700e700e700e700e700e701c38381cf00fe00700000000000000000000000005ffffff0000000000000000000000000000000000000000000000009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000c0e3f0ff701e381c381c381c381c700ef00fd8030c001c00f81ff83f0c700c601c70f83ff00f000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f81f3c3c1c381c003c00f807e01f003c1c381c38383cf81fe00700000000000000000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005 69 | ffffff000000000000000000000000000000000000000000000000380e380fb80ff801f80078003800380038003800380038003800380000000000000000000000000005ffffff0000000000000000000080038003800300000000000000008003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff0000000000000000000000000000000000000000000000009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000c0e3f0ff701e381c381c381c381c700ef00fd8030c001c00f81ff83f0c700c601c70f83ff00f000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038003800380000000000000000000000000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff0000000000000000000000000000000000000000000000009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f00f381c 70 | 1c380e700e700e700e700e700e701c38381cf00fe00700000000000000000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff000000000000000000000000000000000000000000000000f039f83f3c3e1c3c0e380e380e380e380e380e381c3c3c3ef83bf03900380038003800380038000005ffffff0000000000000000000000000000000000000000000000001c381c381c381c381c381c381c381c381c381c3c1c3c3c3ef83bf03900000000000000000000000005ffffff0000000000000000000080038003800300000000000000008003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c180e38fe3ffe3f0e000e000e381c383c1cf80fe0030000000000000000000000 71 | 0005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff00000000000000000000000e000f000f800fc00fc00e600e700e300e380e180e0c0e0e0efe7ffe7f000e000e000e000e000e000e00000000000000000000000005ffffff000000000000000000001c001c001c001c001c001c001c001c3c1c1e1c0f9c07dc03fc03fc037c073c0f1c0e1c1e1c1c1c381c7800000000000000000000000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005ffffff000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f00f381c1c380e700e700e700e700e700e701c38381cf00fe00700000000000000000000000005ffffff0000000000000000000000000000000000000000000000001c381c38 72 | 1c381c381c381c381c381c381c381c3c1c3c3c3ef83bf03900000000000000000000000005ffffff000000000000000000000000000000000000000000000000c0e3f0ff701e381c381c381c381c700ef00fd8030c001c00f81ff83f0c700c601c70f83ff00f000005ffffff000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380038003800000000000000000000000000 73 | ``` 74 | 75 | ```text 76 | >>> c = zlib.crc32(a) 77 | >>> print(f"0x{c.to_bytes(4, byteorder='little')[0]:02X}") 78 | 0x70 79 | >>> print(f"0x{c.to_bytes(4, byteorder='little')[1]:02X}") 80 | 0xE3 81 | >>> print(f"0x{c.to_bytes(4, byteorder='little')[2]:02X}") 82 | 0x6F 83 | >>> print(f"0x{c.to_bytes(4, byteorder='little')[3]:02X}") 84 | 0x6D``` 85 | 86 | 87 | ## Lengths from header 88 | 89 | `de 0c 03 00 00 ce 0c 00 00 70 e3 6f 6d 00 00 0c` 90 | 91 | The total length of the entire thing inc. first two bytes is: 3294 bytes 92 | de 0c = 56844 93 | 0c de = 3294 94 | 95 | 96 | ### The other lengths 97 | 98 | `ce 0c 00 00` 99 | 100 | is 0x00000cce = 3278 101 | 102 | 3294-3278 = 16 103 | 104 | i.e. this is the total length of the text metadata header and the rest of the payload. 105 | 106 | 107 | 82 02 03 00 00 72 02 00 00 9F 93 AD F9 00 00 0C 09 00 00 01 01 64 01 FF 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 07 F8 0F 3C 1C 1C 38 0E 38 0E 00 0E 00 0E 00 0E 38 0E 38 1C 3C 3C 1C F8 0F E0 03 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 1C 00 1C 00 1C 00 1C 00 1C 00 1C 00 1C 00 9C 0F DC 1F 7C 3C 3C 38 3C 38 1C 38 1C 38 1C 38 1C 38 1C 38 1C 38 1C 38 1C 38 1C 38 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 38 0E 38 0F B8 0F F8 01 F8 00 78 00 38 00 38 00 38 00 38 00 38 00 38 00 38 00 38 00 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 80 03 80 03 80 03 00 00 00 00 00 00 00 00 80 03 80 03 80 03 80 03 80 03 80 03 80 03 80 03 80 03 80 03 80 03 80 03 80 03 80 03 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 07 F8 1F 3C 3C 1C 38 1C 00 3C 00 F8 07 E0 1F 00 3C 1C 38 1C 38 38 3C F8 1F E0 07 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 00 E0 00 E0 00 E0 00 E0 00 FE 1F FE 1F E0 00 E0 00 E0 00 E0 00 E0 00 E0 00 E0 00 E0 00 E0 00 E0 21 C0 3F 00 3F 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CE 79 FE FF 9E E7 8E E3 8E E3 8E E3 8E E3 8E E3 8E E3 8E E3 8E E3 8E E3 8E E3 8E E3 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 0F F0 1F 78 3C 38 38 00 38 00 3E E0 3F F8 3B 3C 38 1C 38 1C 3C 3C 3E F8 3F F0 79 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 07 F8 1F 3C 3C 1C 38 1C 00 3C 00 F8 07 E0 1F 00 3C 1C 38 1C 38 38 3C F8 1F E0 07 00 00 00 00 00 00 00 00 00 00 00 00 108 | 82 02 03 00 00 72 02 00 00 9F 93 AD F9 00 00 0C 09 00 00 01 01 64 01 FF 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 07 F8 0F 3C 1C 1C 38 0E 38 0E 00 0E 00 0E 00 0E 38 0E 38 1C 3C 3C 1C F8 0F E0 03 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 1C 00 1C 00 1C 00 1C 00 1C 00 1C 00 1C 00 9C 0F DC 1F 7C 3C 3C 38 3C 38 1C 38 1C 38 1C 38 1C 38 1C 38 1C 38 1C 38 1C 38 1C 38 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 38 0E 38 0F B8 0F F8 01 F8 00 78 00 38 00 38 00 38 00 38 00 38 00 38 00 38 00 38 00 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 80 03 80 03 80 03 00 00 00 00 00 00 00 00 80 03 80 03 80 03 80 03 80 03 80 03 80 03 80 03 80 03 80 03 80 03 80 03 80 03 80 03 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 07 F8 1F 3C 3C 1C 38 1C 00 3C 00 F8 07 E0 1F 00 3C 1C 38 1C 38 38 3C F8 1F E0 07 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 00 E0 00 E0 00 E0 00 E0 00 FE 1F FE 1F E0 00 E0 00 E0 00 E0 00 E0 00 E0 00 E0 00 E0 00 E0 00 E0 21 C0 3F 00 3F 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CE 79 FE FF 9E E7 8E E3 8E E3 8E E3 8E E3 8E E3 8E E3 8E E3 8E E3 8E E3 8E E3 8E E3 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 0F F0 1F 78 3C 38 38 00 38 00 3E E0 3F F8 3B 3C 38 1C 38 1C 3C 3C 3E F8 3F F0 79 00 00 00 00 00 00 00 00 00 00 00 00 05 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 07 F8 1F 3C 3C 1C 38 1C 00 3C 00 F8 07 E0 1F 00 3C 1C 38 1C 38 38 3C F8 1F E0 07 00 00 00 00 00 00 00 00 00 00 00 00 109 | 110 | ```text 111 | $ diff -s /tmp/1.txt /tmp/2.txt 112 | Files /tmp/1.txt and /tmp/2.txt are identical 113 | ``` 114 | # GIF 115 | The files are split in to chunks of 4096 bytes. 116 | 117 | 118 | ```text 119 | 10100100008f270000e8e44a8305000d47494638396120002000f7ff00fefefe0800fe00894d0404b6818181b9b9b9fe000000860200233eaea8000500b4b10000fefefe00243f4e3e50fe4e4e00243e4e8328593f2e4e3e50b9b9b8fe4c4cfef500fef6017d675a504bfe50aa274e3e504d83274e4e4e4e3e504e3f51670000808080366281504cfd3662840404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b6 120 | 0404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b600233f00000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f7001b081c48b0a0c18308132a3448606183860e234a940871a24582152f6a6c7060e3c203201f1ecc381164478f063f4430795263c60f0f0c4498d91265830f061660a82033c2079b026746c8b9d3c04f9b2685e63cea9165d2102210f86318d1a980ab1902203d7055405612010690f0d8f56b00055da72a2429508459b4574d6e44d020ac00111a9cd6b4c89544880b17340866b9d1a4860b090800169c97ea47c382112b0eec926007091d3068462c02a884cf9f1b 121 | 88c000c16181d3050e820e5d7a216a000050175c2da1e0e9830560eb8e7d5b206d81a883a71e987bb7eedeb45f1b176e7c39eacfca9b4b9f7e3c3af5ebd8b3c3060021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff001b086c1062a0c18308132a5cc8b0a1c387051b467c48b122c3891633124c7840a3c303203d3204d911e340930e3f4420d951a4c10f0f0c4498d95223c60f0616608839f383cb813323e4dc69c0e74f9241731a15c91229ca8c4d0548cd1080843f844f1182942a80aa88000344f8bb9a91abd7000ab822189b51c4d9b45249b25d88124103b0524334ad0955008910172e6818ccd223490d171210083c5803df8a2c1b275e2c18ab45091d2484c08021b1080819091894409a7403111820a86658a0758184a549ab5ebdd0350000ae0fc696305b60eb84056e0bc7fd5be06edfae931b0c3e5c78f1ddb69b2767dedcb96bd2d1ab6bdf6ebd35f7efe0c33701070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0021081c48b0a0c1830809205cc8b0a1c387101b2a9418b1a24583131b1eb85830e3c00320393204b951a4c10f11481ef0389065c30f0f0c449859d2a4c00f061660a82033c2878b2c6746c8b9d3c04f9b2485e63c2a5265d2100da246bde85480d50c0148f89b6a11a455 122 | 015845041820952b049706bf860da0e06b59b30d45ac6d6b95e45bb8081134186b5583d303771b7434d8e0800012212e5cd0c058e5dd8651496ab890808062c67e1f338c2c993165cb8b352fbcdb4142070ca8298bb88b96e05b09b06137108121b0c102b80b08542835b6ec816f0be60600207741df12a40ac42d5838f1e7c5710f441e35b775dd030b40872e1d02f2e1dbaf6f110f9f1b36f8f1e8d33fb7aebebdfbf7db010021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f200fd091c489020818208132a5cc850e1c18610234a9c4811e14386172b523c5031a3c20320351a440892a3c8841f3894347972e087070638c83ce051604d861f0c2cc00053e6879603394488a093a7819f143d96144a7401d2932b97866840b581c8a802b2660840a225c8ac02460410116080889360c59255001641c29b04456c5d0bb6a448040dcad68d2ab2c10101243a58b0103524c68254575eb02098b0dd8a7e0b0f6ecc726255aa123267f637b825557f9a372ff458a0748184a12548340d0080e98ca90b964e58a0b56dd7b305c6f667baf7e981b56fdbce9d9ab570dfc28f9bce6c3cb9f3e7c39b439f4ebd7a6b0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708e40021081c489020818208132a5cc850e1c18610234a 123 | 9c4811e14386172b523c5031a3c20320351a440892a3c8841f3894347972e087070638c83ce051604d861f0c2cc0502126870f2d0772881041274f0340297a2c39b4e882a4275732c58020a8d4920102585d99b543d6965803780d50d221c4ae59afb64c7b35a448901d3a58b0d0b6e1cd9573e5d22dabb16ddeb92c4f4a183c18c2dca00209172e88a14103081e0b482e9050b184828e413c2638190080c9192d17940c423367cfa83f4b1e281ac2e4d7940716489d7a3504cb9d69c3a6ad7bf2e0dcbc830b47fd7ab8f1e3c869030021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708e0001b081c48b0a0c18308132a6c4060a1c2860e234a8c0871a2c58b180d1ea0e8b0e2818f19157edc38b122c29120439a3460006548832c3bb04cf952e0c8982c0d9a8c88f263ce9a3d4776c06832e8c7000180a244da01e9cb914c918e7c19354050aa568d92d4b9f063870e162c181d886122cab060c54e1d0842a251b461b73600d196e04e8312f2e66d1096205dba16f5ee35f8b7eec002880b1c142cc120060c221e976d90180080c4051917442c40446701fefc15b04cfa32e2819a29275e4d37f4e8d2a44f37605c19f6ead7b06327ce5b3bb7efdfba11031f4ebc386c0021ff0b4e45545343415045322e30030100000021f904093200ff002c000000002000200007 124 | 08ff001b081c48b0a0c18308132a5cc850218186081f429c48f1a0c48a180b1ec8b8f080478617135ef4b891e341921f21863468c0004a93215b766899d2a44092325bdabc89f280ce822b3bf6f4d861e7508f0102540cd9336987a426493a4d4ab220868953030c35080222550d1ab61604d15568070c172e800d5b752059b2420f68b8902044dab52505be2d9b10e55aba76d50ec4804104e1ab0d2574901082305d1110040a103179b2bf06410b4ad8bcb9c1d981fec852862bb080e902073977e63a797483d300009cd6acbaa0e9ca0d4808f05720b66fd9a607aa9650fab471ca2478fffe1dbcc170d8cb8df75ecefcf466e8d4b36bf76d7cbbf7efe097030021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff001b081c48b0a0c18308132a5cc8b0a1c387041e1a8c28b1a2c50614111eb8b8f080478e093d6e5c98312145911f41123460002544852c3bb04c69b1a4c8982c550a44e931a74a9e22458840e06f6049863c0528cd10c02086871e950a602a22c000120641981c28956a0005528b1604a155a108af60958acc4ab6ec41040dac2a0d01942d59850704900871e18286bf2e07621081a1b088901e355c48c0d72f60822204448e8c38f1dfc504fa6a204856e85d86123a48088181c2e2c303414896ec56a184d7af2174e850707203c91829e8a670 125 | 1076ec8392239310b01b0000dd050afa9650b040017fd02543a760bcfa71e703970b74ce9d7be4e9d6ad63196fb09c7b7800dd0b9c17cffdb5f9f5f0e3a37f2fbfbe7dfb000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c18308132a5cc8b0a1c38710211288487022c586072e22b078f080478d093d660459f043049123137254f9e181810830538284f0c1c0020c155e46f80081e14a821020c08c6013a7019e1139421039d426528d2899866840b5813f8218fc5d55185580d70c014868bd3a512b88ad210f7815005644000522b412340b42e1dab66fd72204c1d7a045117815ac15b9b72fc20601060c8e7a10030611180eab25d1c18285a81fe70a10b1f9205594172c7c088db2a03fbe9d0dfa6b80f940e8d197e79ee62ce2e0eaaa0d24e8d60dc1b2697f9b1b0840a895aabfddba7f0e04ce9984c002d00b2c1f8b5c02f1b19ca3030010bd60f582d011682e35c0bcc0f6f3dcc30bfc8e20bafb02c30d08308ffebcfaeadaebbfafaf3fbaeefcfc0528a07d000e68e081086e070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff001b081c283004c18308132a5cc8b0a1c38710234a9c4891a1c18a0d421cc0c8f080c78a17137adcc8f1e087082349966cf0e181810830552a0c 126 | b930c407030b30547819e1c3ca063023e0d469c067439a084706c5695462c8944a31f82b09756480000c3134847ab5c3d583483b7aec7a752447b201aa3204813064590d1ad42e64abd063070c172ec08d6b362106ad753d6ab8902044debd32090a10b130e55ec286f526f407826e43091d2484f84b580404840440087828a174e906771b7c46b8586081d705129a2e4d80a13f110260030000fbe06c09075f13f447bcc0eee3bc850bfced1ab6f306fe0cf8338efcb8f2dfbaab3ba75edd3aecd2d9bb8b0a1feffd35f9f3e8d357070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f7001b081c48b0a0c18308091248c8b0a1c38710234a9c48b1a2c30308175a3cc0d162428e18296a3408b2a34782060c943c89d240879426333a5c0832e54b032c1b94e498f2e148923b398a1081c09fc4913b0528cd10e02447a502988a0830808445a8520328806a74e04f8622b26e550ab2228206540568101174a2c603024884b8704183dd9514416ab89080005dbb1a424e2c0998afdfba09313cec20a10386c77c452414f0508265cb0d4460807090803f10020b882e70f03266089c1382180d00c0e882a625fc146d504081d6b85dd316183bf4e8df02fd89b89d1bf7eed8ac8bff265edcf868cbc99b4b9fee5c34f5ebd8b317070021ff0b4e45545343415045322e 127 | 30030100000021f904093200ff002c00000000200020000708f8001b081c48b0a0c183040e2a5cc8 128 | 10100100028f270000e8e44a8305000d7061c28610234a9c48b1a2c58a072e363cc011a1c6061c337e2cf821424891141f12fcf0c040849728477e30b00043cb971f460a7c1981a64d03393d364c189227cda01a4f160d2102813f862a0d2a1540354380a64f25aae4485580551101147cecfa356c578d22ca2ae81ab260d485081a0418403584d298140f082011e2c2050d804fa6141852c385047dff06be7812b061c47e35e89420a10386cb87454ca64cb981080c102016185de02067ca10528736f890340000a40b9e96d020b5c0d1070bbcde0d1bb7c0d909490b2f3d5037efddbe67bb3e3efc3873d294973b9f4e1db9f4ead8b36b7f0d0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f9001b081c48b0a0c18308132a2c4860a1c387071b429c48b1a2c58b020f605478a0e346841d351a9458d1418490223f3670f0c04084972927921ce8c0c0020c2d5f3a50d9e065049b380decfc18d2a7cda1231d1240591483087ffe30321540354300a5093b52156055448001242a4adcda358082ad512d8a287b966ac88b081a7ca51a8269cc0633390a2011e2c2050d80515e0ca9e14202027e016bb8bb50224ac58611ff5529a183040c980d8b80f0518267cf0d446080c0596181d3050e7e064dba3442d40000a02eb85a42c1d304251688cd5b366e81b505a2 129 | 1e9e7ae0eedebc7fd7868d9c38f2e6a83d337f4ebd7af2e9d6b36bdf1e1b0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f1001b081c48b0a0c18308132a5cc8b06183100e233a8428b1a2458b072e2e3cc05163428e193d16fc100164488214257e78602082cb93223f18588081a5cb0f125312741961664d03384582e43933a84693437516547a3004520150470410e1efe801a80232042011600043a602b16ae53a00ab458a52c96205a951ad080d48614abc4a02c3850b1af29a2448c021480d171210b89b17ee459385030fc69bd36007091d4260b09b4084c8061232676e200243c302a00b1cd4bc19028485a10100085d90b48482a00f16504d7b756c81ae0586de2dba6f83d9b569df769d3a38efe0c643672e8ebcb973e1cc9f4b9f4e5d350021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708fa001b846840b0a0c18308132a5cc8b0a1c3871023121c28b1e2428a162d1ec8d8f080478e0b3d6e0479f0430491234936f8f0c0408497290b628cf8c1c0020c2d5f7e50d9e065049b380dec8438b3a0489f368772447934840804fe96a21440354380a7510d164d18c22355015645045000f26bd8b15f1d6e6d20e2ac82af222d8640d020c000aa5d992e154022c4850b1a02a3cc2852c3850404fe06d610 130 | 930044948b0f2706ac52420709213060382c42e25609a041b3c500c16181d3051286060da17543d40000a03eb85a42ebd20d4e272c10bbb76cdd046b13444d3c7541debe7b03af0d3b79f1e4ce51836e0ebdba75e5d4af6bdfce3d360021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f6001b081c48b0a0c1830509205cc8b0a1c38710234a84a870a2c58315091eb8d8f080478e0b3d6e0459f0430491234936f8f0c040849729497e30b000430597113e10cc28f165049a360de82429d227cda10f790a445934844aa602a2660840c21f478f51054c15114081087f60773accbab56b560461258a28ab20abc8b408953640d020c080a82198c6a4d8e0800012212e5cd04018e545911a2e24083cb8f061c4841533d62076a2840e12306856dc41a584cf9f1b88c0f0b080e90272418786e0f0340000a70baa9650d0f4c102af73c3b62d70b6c0d3c00b10c4ad3b37efd9ae8b072faefcf4e7e4cca34b370e7dbaf5ebd85f030021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f5001b081c48b0e0400206132a5cc8d020c28610234a9c48b1a2c5820f291eb888b1e0818f1c177edc18b2e087082349966cf0e1818108305596fc6060010697303fac6c003342cd9b06740acca8f163cf9a4239a61c19210445a202 131 | 970a989a2100097f4a0f4c15505544800121b7760da060ab42a806458c2d3b75e445040dbe0a10a161a9ccb309b592c070e18286bf292b221ca9e14202027dffd6bd9852b161c47e577690d00143080a864510440b518267cf082a438058a07481849f3d8f265d1a0000d305534b28583a6101d7b85fd716285ba0e9dfa707dece8d7bb76cd3c475234f5edcb4e7e5cca34bff2dbdbaf5ebc4010021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708fb001b081c48b0a0c1830813160ca1b0a1c3870c1f4a9c48b1a2c589071c46c47820e3c5811b0576f4f8b1a083082349966ce0e0818108305596746060010697301dac14083342cd9b0674ae1cd9b3a6d0062125a6241a4204027f1f970a989a21c0c4a40d3a4e155095448001243e6eed1a40c156a8164590353b752442ac041134f82a408388a532310a2011e2c2050d805336843b52c3850404fc02d690b72181ac85011f4efc776707091d30683e2c62a784cf9f0988c00081e063830552173808fa730308b015aa06004075c1d6125e0f4c7db000eddfb5790bc42d50b5f1d5bb8103178e7bb6f2e3ca9fabfeec3cbaf5ebbf8d63dfcebdbb720021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708fe001b081c48b0a0c1830d08205cc8b0a143810a1f4a9c3830 132 | 22c58b1833163ca091e1818f0d2d4afcc8b163c2811f22902c69b2c187070622c86469f2838105182ac48cf0a1650399116ee634d0d32449a0378b6a5c7934840804fe4e5e642aa06a86004ffd459d7aa0aa80ab22020c9828b28157b062bd6a148176805792191134482b2004539a04cb1aec4a22c4850b1a02afcc4852c3850404fe06d680d7a0de062b171f4e0cf862d90e123a60d87c58444b09a0413710810182c302a80b1c0c0d9a0004d3790ba60600207541d6121ac06e80fa6001dac06bf716885b60eae3aa07fe0e0e7c38eed9cc91338f9e1a34f4e9d8b337bfaebdbbf7efb4010021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff001b081c48b0a0c18308132a341862a1c3871005368c4811e2c48a18111ec8b8f080478e093d6e5478d1e187082247729cf8e18181083055826cf0c1c0020c155e46f8305320cc0836711ae03953e44f9b4439a6345a32e3520150470420e1af01018c1ea10ac83035c00011fec256d4ca958457ad61ab2e2c29a2ec59a822c55244d0e0ad88a532291e104022c4850b1a02a73cd8d4a0480d171210f81b58435e88291b275e0c78edc20e123a60d89c5804048a57094a183dba81080c103e2b2cc0bac041d2a553ab46d81a0080d605614b20309bb5d582056c0bbfed5ba06e81ad93bb1e187cb8f0e2ba6b3b57ee 133 | 7c7aebd1d2ab6bdffe3c3bf7efe0c3db01060021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f2001b081c48b0a0c18308132a5cc8b0a1c0100e234a3c0871a2458515171eb8a8f1c0468e083d7e0449f043049123293afcf0c0408497292d56fc60600186962f3f9014f83242cd9b06749214d9b3a6508e288966448a5280d30c0148f863ea54005411010688f0e78fc0c4aa57b35645c075a288b003aa8a2ccb30238206624568481a33e2010124425cb8a0a12fca8b22355c4840606fdfb92a15a23c3cb830df9d1d2474c01002c3601110302e94c0997383c90d0b882ed0c02bc1ce9e438b0600607441d4120a8a3e5880b5edd6b305c2f63aba37e981b56fdbce0d7bb470dcc68f0f1fcd39b9f2e7d07b439f4ebdba700021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f9001b081c48b0a0c18308132a5cc8b0a1c3870543409c48b181c48a080f4cbca8f080478c093d6a0459f0430491234936f8f0c0408497290f725cf8c1c0020c2d5f7ec0c8f165049b380dec2429d2a7cda11851160d210281bfa4280548cd1080e801a902a8920830800446ac5a0328c0fab401018822c28e952ab22282065ca58a501a73e1ccab24425cb8a0a12fca8a22355c4840606f5f0d751da23c3cb830df83671746ee204142 134 | 080c18068b8040b2b2e7062230705618a280e902073d5786c07a34c2d300009c2ea85a4203d7a60f1688cd5b766e81b5059e1e8e7ae0eedebc7fd7868d9c38f2e6a72b337f4ebd7af2e9d6b36bdf1e1b0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff001b081c4860a0c18308132a5cc8b0a1c38710234a9c5870a2c587070456bc88f08047891b177accc811e1870823499614f8e18181083055aefc606001860a2f237c5018b221cc08356f1ad86971e3c89f3589724c7934c4ca064c0548cd108084bfa507a40aa02a22c00011feae4ed4ca358002ad08c24e1451f6acd4916a7b3244d0c0abd4104c654acc4a22c4850b1a02a7841872a4860b0908fc0dac412fc4948c112b06fc5482840e183223160101c241b9082b5a1edd400486ce9e1716585d20e168cba8532b640d0000eb83af2534e82c7075c202b583dbf62d30776fd6c80d02171e9c786edacc912f67de9cb565e8d4b36bafbe7abbf7efe099030021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708fd001b081c48b0a0c18308051248c8b0a1c38710234a9c4831e24289072a363cc0b1c1458d053966b4c8f043049123410afc50c140849729557e30b00043cb971f540a7c1981a64d03390d7e74289227cda0132fa22c1a42e7520150330420 135 | e14f2347a802a48a08304084bfaf13b16a0da0002b02b012458c2d0b5524da88081a70152042c3d29443890a2081e1c2050d80515614a9e14202027e01db853814a562c388ffeaec20a10386107d138880a0528267cf0d2c231c4aa1340582173f837e681a0080d2050aaa9650b0c06983145ceb7e5d20b6c0d9027bf7367d5b60eeddba7bff562d1cf96be2ce770b2fe0b979f4ebd8014ccfcebdbb7700000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f2001b081c48b0a0c18308132a5c489000c38710234a9c48b122c3030f1d463cc0d162428e18357a14f82102488c10451afcf0c0408497284736f8606001860a2e237c90d9e065849a370dec1c09d267cda105552a3c593484458d4c0548cd1080843f8b1ca50aa02a2280028f5ab97ad56a518458055a415644d020c000a92198c69c7840008910172e68d87b52a0d28520355c484020ef5e0d733706de3bb8b0de940825749010020386c122644ad8bcb941070c0f0b882e70907367851a47030030daaf40d3120a8a3e5860b56dd6b35f9b1638ba37e981b56fdbce0d5bb570dfc28f8fde6c3cb9f3e7c39b439f4ebdfa6a0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff00fd091c48b0e0400206fd214cc8b0a1c3871023125c28b1a2c58b18 136 | 9f070100028f270000e8e44a8305000de18349813123e0d469c0a7499241711ad5a812698806501b4c94d85480d5110148605cf8d1aa800c59030c10a1d12b5812011478459051c4d9b45e496644d040ac000d229aceb4d8e0800012212e5cd04058e545a824355c48404030610d256b36ec9b98f0e2c683a5f28ddaa083840e18422f160141b3439650fd4958bdba81080c104a3b2c40bb4042d6ad63974e6db0360000b50be296d0607703daa61716f8cd1c38ed85c3a1d69e6e7be0f2e6cc690b1cee1b3b75ecde6baf0dee0ebebcf9ece4cfab5fcffe370021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f6001b081c48b0a0c1830813160c7190a1c28710234a94e870a2c58b18091ec8f8f080478e093d6e7c58f1e1870822478214f8e1818108300f94e4f8c1c0020c2e617e8838b320cc0836711ad8b952e44f9b4439a6348a41843f7f4a530a989a214043891ea70aa84a22c0001218196aad2a228002ad50318a206b56abc88c081a789d1a62a9ca8b0704900871e18286bf29338ad470210181be7f35dc9d98327161be7e0512e028a1838410183014160161a584cf9f1b74c010b180e9020741872e6d1a0080d305554b2868fa6001d7b85fd716285be0e9dfa82737b89d1bf76ed9a78beb4eaedcf8e9cfcc9b4b9ffe7bbaf5ebd88b030021ff0b4e45 137 | 545343415045322e30030100000021f904093200ff002c00000000200020000708f7001b081cd88000c18308132a5cc8b0a143810611467c48b1a2c58a132f6a14786063c303203d2e04d951e4c10f1148965c9871e187070622c85c69f2838105182ac48cf0c1a44099116ee634d0b361cb832481de2cea5165d2102210f86baa5280d50c014c82b42a002b89000348487cc8d56b00055ca75e2420c22c5aab24374e052b408406a7342d1e104022c4850b1a02abdc4852c3850404fe06be4bb870e0c38901fbec20a143080c180e8b80e8518267cf0d446080e0b080e902093f8386409ae16900004e1f542de1a0e9840560eb8e7d5b206d81a783a31e987bb7eedeb45f1b176e7cf969cfca9b4b9f7e3c3af5ebd8b3c3060021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f8001b846840b0a0c18308132a14b8b0a1c38710231e1c8890a2c48b183326b478f080468707427e5c18d2e3c8830e22943479b28183070622c864a990e342070616608029d341cb063223e4dc69c0e7c99241731a6d68d3e04aa44d313e154075440012fe3e86a42a2043001101068ce4ea15ac02ae1b1f8a281be02cd5921a0786a51ae229cd8b0704900871e18286bf2b3596d470210181be7f35dc8db83271e1c37e5b4ae8202104060c85454896c05942031118201024b0b080e9 138 | 02093b7386c0dae16900004e1f54ed593441d3090bc0de1d1b3741dab74f0b37a89bf76edfb45f1b175edcf8f1d39c953b9f4efdb9e9ead8b36b370e0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff001b081c48b0a0c1830543205cc890a1c28610234a9c88f061428a18333638a071a045820742765c1892e3c8821f22943479b2c187070622c86479f2838105182ac48cf061e147863223dccc69a0e7c992416f1aedb812e9cf8a24570a989a2100097f4c0f4c15509544000522fc61c5b8b5ebd7ad08c462146156c1d6926a093e2d88a0418001024468684a732201ad24425cb8a0a1f04a8d25355c48406070e1bd8813175edc9870cb0e123a84c08061b1080827258816dd40040608a01916585de0e068d2a8531338c81a0000d6055f4b6890bac16adab683dffe2d50b740d6c85b0f2c205c3871ddb59b276f2e9db5e8e8d4b36b0f8e7cbbf7efe09b030021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f6001b081c489000c18308132a5cc8f0a0c18610233e8c48b1a2458a130b5e1c786023c403203d0accc831a448841f2280347952e087070622c8ecd8d2a58105182ac48cf0a1660399116ee634d03321c9852b81de2c2a72a5d308214420f0d7d4a980ab190248a5aaf068c9ab02b29208a0e0 139 | 2458b164c18a14815601d8951e11340830e0aa06a72c35363c208044880b17340876ba91c04a0d171210002cf8ae47a78d132f0e5cb383840f213060482ca2a684cf9f1b88c010b180e9020941878600f1340000a70faa9670d074c202af73c3b62d70b6c0d3c0510fc4ad3b37efd9ae8b072faefcf4e7e4cca34b370e7dbaf5ebd85f030021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708fa001b081c48b0a0c1830d082024a870a1c387101f368c4811e1c48a18336a147840e0c5811f291e18b9d1e1c88e253f7e88701265c9811f1e188840d3e5cb061f0c2cc02093e6879b026946d0c9d3c0cf9b2785ea3c6a30e4c19649438840e0af245401583304407a00ab80110144041840422242af60498cf55a55a308ad6a07783db9114183b5223440b589b12b090c172e6818dcb229c4931a2e24201078b05e8d045a3a56cc5830d00e0e2484c000388108a01242876e200203048805521738287a3484d30e550300a0ba606b0905531f2c30bb376ddd026f0b544d7cf540debe7b03bf2d3b79f1e4ce55876e0ebdba75e5d4af6bdfce7d36003b 140 | ``` 141 | 142 | If we convert this to ascii and look for the GIF magic bytes.... we find them! 143 | 144 | `G I F 8 9 a` 145 | `474946383961` at position 17 146 | So we have a 16 byte header again perhaps? 147 | 148 | If we write the raw bytes above out to a file from 16 onwards we get a GIF that can be opened by Gimp. So it might be as simple as working out the header and then sending the GIF! (Assuming it's the right size of course). 149 | 150 | GIF files must end with a 0x3B, lets look for that. That's the last byte of both streams. Let's choose to beleive that this means the GIFs are just sent as is. 151 | 152 | 153 | # Header 154 | `10 10 01 00 00 8f 27 00 00 e8 e4 4a 83 05 00 0d` 155 | 156 | Let's try and upload another file. 157 | 158 | ```text 159 | 1010010000b9180000db42cb1405000d47494638396120002000f7ff00fedb96aa7353a97254fea800b269402b2b2b3b3a3a010101ffb68bb26a413c3a3afea800aa5b2f2b2b2b3b3939010101a972543c3a3aa97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254 160 | a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a9725456555400000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a50efcf9638a952acf952c312ed5aa75eacfa64925221c4bd6ec54921a7b622debd627d596719576fd595768cbb55d0720e84bf520d18a76831a303060c06203669f563c4c31f1e2c682971af0299922e09f0610 161 | 606e0c7971618333af2ec59c00f3e0cda1bfa616bb7a0081c6b70714783c1429c203c0830b1f7e0061cc850e0e183830803966e6ca9573ac785c6172c6cd0730d0ee7cb981e99e0f1639709e5d7bf9e6051002580f0001fbf6efddbf9f4fbfbefdfbf1edcb5fbf1f3efdfef805e85f7d00b257a08008ced79f7c03e427e081090e08000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffaf3075468cda217732e652a14e7478e3e0b4ca59ad569d29a587f3a58dab4ab83a148252234fb33a859921a7bb22d2b5668cbb81f7dd66dabd7edd9966bcd0e18e0d7afce9945fbea1dacd827d48a442b361ecc78ef638a81c552a6bcf7b0c8be94196c36ccf32a46d003448fd68b56e2cc830762cb9e4dfb00c2980b1d1cd03de04068df070cece65811b742dd0e06fb56ed7b807007c4311f2cd0bcf760d1d50f144008a03b0004debf8729071fbe3b79f3e5d3abf77e7ebdfaf6f0df8f774f1f7dfdf4f1d9cbd77f7ffd80fee5e5675f80f379070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff00 162 | 11081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39fcf020e1cd8fc58d1a2c29d2e3ffaf4075468cda21773fe6c9af323c7a00514682dd0d401559e2b5962c4ea606bd7af492522c4aa5501d7a05e8392d458136e56b376e1d26440f7a3ddb66fc9ca6db956f0000467f51e245a31af020303061898dc156a45c614ed4e8e7c18ab81a0962916f66a0001e7c8060a4c16ba58ac46bb9c097046bc7a28d29957b19e66c059f564db12671e3c40bcb8f1e30710c65ce8e080810303a07386eedc39c78acb1536871c5d366fe9cf0d5c3d177db080f4e89c199c3f50002180f70010c08f3f5ffefcfbefede3dfcf1fbefefef4f9575f7e001668207fff0d58e0000a1e28e0830ede97608404c2070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830505281480602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39fbf02051c38b0f9b1a245853b5d7e140a5428d199462fe6641a7428ce8f1c990a75d054eb509e2b5962f4cab52a57a760252224dbf5acd5831a6b6e35dbd62c4d067197b2a5bbf5ee5aaf0306f0757ab068c5b9 163 | 5b03fb74eb206a45c314113b08acf8e756c714ff9ea54cd932618333b332a5cc80b3ddb46235ce0d5cda745fb0080fc89e4dbbf6018431173a38b07bc001d2bf0f18e0cdb1626e85bb27fb1ed0faf780e10e8a673e58c0f972e6d77d174008a03b0004debf8728071fbe3b79f3e5d3abf77e7ebdfaf6f0df8f774f1f7dfdf4f1d9cbd77f7ffd80fee5b517e07ded010021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab5ca5669d3a14a9448458c5a625a9b1675aad63b3d264d056e95ba0fefc85a5da126dda0108f2e6ddaa7366d1b8060c0c182078ebd38a442b8e4dbc18b0de02067c3ea6e8f7a7010495171bc09cb9b0c8b19509544640fa334fab1851576650b9755989330f1ed8cdbbb7ef0308632e7470c0c08101c72b1f2f5e9c6345e10a892b46ae9a7672e3069c733e582039f2d9de0f14314008a03c0004e6cfa7479fbe7d79f6eee3cb370f7fbe7afaebdfdbdfcf5f7efdfcfb0d00607ff81548607bff1da89f79000021ff0b4e45545343415045322e30030100000021 164 | f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c806021430610190824409140c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab5ca5669d3a14a9448458a5faf31796a4c69e697fae5dbb952683b74ae31698ebaf6e4bb4690720d8cbb6ee41a215c73a306060c000c606b63ead8898e258c68e052f35e0733245c03f0d20c8ec383263aa8759621c9b9940e6c18b45f3b4ba7a296906990b402e2b71e6c103c0830b1f7e0061cc850e0e183830807966e6ca9573ac785c61f2c6cd5de376bedcc0f4cf070b38376f9e99c1f803051002580f0001fbf6efddbf9fbf5e3efdfbf8d9dbcf0f5f7ffcfaf9edc7df8004fa37e000ff15982080030a68a08203020021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f16f0e7ef67d3a435af7a5dca95ebd4a1482522c44ab6ec59841a7bb2d5ca752cd5967195ce65 165 | 3a97a65a8359a70e1830d5aece994503671dacd8e7d38a442b361eccd8ee638a6bb152a66cf8e04cb13f2933d85c18adc4b018030f1e4d3aabe9a1080fc89e4dbbf601b81a1d3a38b07bc001ca047e1f30c09b63c5980b773b18fc9bf5ef01c41d18c77cb0c073dfabb1332f801080770008be8329171f5ebcf7f2e7cdab5fff1d3dfbf5eee3c327ffbe7e7afbeae5b79fbf1f3ffb01fe99e79e80f8b9070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa04eacfdfd099452fe65cdad429ce8f1c97fafc59d55f50074f25ae9c99f5e756a6fecc82e53913a1d6a55fd592d4d8f3edcfb8716932a0abd42ed0b35bf5ba7d3b6000dec007895604ecb3306307512b2aa678b66961c76a21870c7970abe5cb8ef3266689d1f36506a0f3b2255b7a6961d4a903b34578a0b6eddbb80f208cb9d0c101df030e9c167ec0c06f8e15792bf4eda0b070d8c2071877809c22c202d183bfd6eebc004200e001202c082f9efc78f2e0cfa747cfbe7d78f5eedbc39f2fdf7cfcfbebf1b3a7ffbe7e7ffdee0d00207af011a81f7c000021ff0b4e455453434150 166 | 45322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3808102fe82dafc58d1a2c29d2e3ffa042ab466d18b399732cdf991a30307057cfeccbaf4ea50a435ad627520556b01af3c6722bcca75ab59af0835d6bc8ad56cdbb35e5bcafd48f7ee5dba34251eec1b740002bc3f011f245a916ed0c203de5e7d5a913145c7900d93cd3a3964c8c16cfd2118409af44f9f0e74b2c4d8b77482d287b57e951896355bd20470936e3b7b28c203c0830b1f7e20ae46870e0e183830807969e6ca9573ac1873617203a4993318c0c0f97203d329223b2ce0bc39e9ede50f144008a03d0004eedfc7871fbf7e7bfaf6f3ebdfaf1fbf7cf7fe01c8df80f505385f7f042638a07ff40d702081062a785f7c000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d381830205fcf9b3f9b1a245853b5d7ef409d427d199462fe6645ac029ce8f1c99fafc5955ab83a71257ceccfa736b53af609f92f4cad5acd5 167 | 831a7b3215da962d4d067197fa142af46c59a72d116ee53b6040d7bf5f0f16ad68966e61b73ea356 168 | c908010002b9180000db42cb1405000d5c4c1172e1c788255314acf5f265c43a5962347b9981e7c3696b92fd59d8f4e9ada9251e3c40bbb6eddb0710c65ce8e040ef01074a073f60c037c78abb15f6765038b8ebe0038a3b38bef96001e8c05b676f5e002180ef0010802a0f3f5efcf8efe6d19f5fcf1e7cfaf6ecdfcb8f5f1ebe7df5f7d7cf774f9f7ffef603fc77de7b03e6f71e0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab3ffdf9d39a75ea50a41211fa142b962956aa0835f65ccbd62d57a12de52a5d2a96ec5baa2dd5be1d8060eb569d338b967560c0c080018d0d6c7d5a9168c5b28d1f135e6ac027658a827f1a40a0f9b1e4c6700dce04fb533301cd85198fe6691563d9d20c3417887c56e2cc8307820b1f4efc405c8d0e1d1c3070604073cdcd972fe75831e642e58e9dbfcefd9cb901eaa00f163878ee5c3303f2070a2004c01e0082f6eee1bf874f9ffdfcfaf8f3b7bfaf3ffe7ef9f6e9c75f7f0416f81f81030068a082011238e0810b12080021ff0b4e455453 169 | 43415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b39fdfd0cea20e7478e3efd69f5c77469d3a435b13ad8ca95eacfaf4825225caa75aacfb355116aece975a959b33419cc555ad76ddfbc6beb0e4070f7adce9945df06356060c000c606cc3ead48b4a262c68e072f35e07332c5c03f0d20c8ec3832e3b806678afd99394166c2a787a6658951b16302b71d17802c5be2cc8307820b1f4efc805c8d0e1d1c30706040f3cccd972fe75831e642e58d9d0f60b0fd397303d43f1f372cf05cfb76f3ce0b2004c01e0082f6eee1bf874fbfbefdfbf8e5df9fcf9e7ffcfafee527e07f03ea57e07e05fa37df00071ad8a082f0010021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39f8302051c38b0f9b1a245853b5d7ef4e70fa850a2338d5eccc9d4e9509c1f390a2dc0f467d0ad4f79ae648911ecd6af3fc32a9588d0ac57a1 170 | 69af1ed458132e5aab7187b6a4fbd1aeddbb7069b235e8d7c10004809f1e2c5ad1af010303063c3680566a45c614ed3e8e7c78ab01a19629b6f58c807364ca8fe5169ca9752b67029c113b780c5562cdd63f4d33e05c60726da2080f081f4ebcf8018431173a3860e0c000e79c9d3367ceb1627285cb213f87bd1b7a7303d5451f392c00fd396706e50f144008a03d0004eedfc7871fbf7e7bfaf6f3eb778f7fbf7cfef3ddb75f7ffe15682080050e10e0810b0a582081083258200021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39fbf02051c38b0f9b1a245853b5d7ef4e700a850a2338d5ecc29d4e9509c1f395615da34e8d6a13c57b2c4f8b52b57af5025de3c58d66ad3a70835d63c7bd6ebdba72de57ea45bd5ae5d9a12d97e1d80c02f579d512bd2f539608081c776a5562caab82ae3c608aa1a102a9922c2b3fe10341e6da0c0e3ab06676aad3a3ac1e8c2a7d3ca5edd74f40006a34d3f963df3e081dfc0830b3f1057a34307070c1c18b07cf4f2e4c939568cb910b981c60708dc66de58b901e99e0f163968cebd3103f2070a2004c01e0082f6eee1bf874f9ffdfcfaf8f3 171 | b7bfaf3ffe7ef9f6f527e080f9f107a080031c48e07f0c2e489f810e06d81e0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab5ca5669d3a14a9448458c5a625a9b1675aad63b3d264d05629567ffe98be9d8b7629de0103b66ed539b3e858bcfe00c7f5f9b422d18a7113031ef0b631c5be5c274f0e4bf5e04cb03f2733d03c98a7558c63018f262dd734c203b063cb9e7d0061cc850e0ee41e704074ef03067473ac785b616e07807bafee3d20b883e1970f1660ce5b75f5e4051002d80e0001f7eedfbd7f24df2e9efcf8f3e8d3ab1f5f1e3c77f1ede3af9f4f1f7dfbf403c2d767af7ffefdf7fbd5070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3808102057cdafc58d1a2c29d2e3ffa042ab466d18b3997063590f32347070ea6fed45a00eb 172 | 50a435af66f5b9956c57075f25de3c8835a83f7f4c977a45a8b126d6ac6fdf72bd4b9341dd8f770be4856b966f4b84810df81b80a0abdcb90689564cec73c080c2589f56944c91b265c60e7e1ac81c3224dbb6543f5b163d5a274b8c813f27f8dc986cdadb62b3aa66f059ebed99070f081f4ebcf801ba1a1d3a3860e0c000e79f9d3367ceb162cc85cb0d583e4060006fe8cd0d543da788b000f4e79f199c3f50002180f70010c08f3f5ffefcfbefede3dfcf1fbefefef4f9575f7e001668207fff0d58e0000a1e28e0830ede97608404c207003b 173 | ``` 174 | ` 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15` 175 | A: `10 10 01 00 00 8f 27 00 00 e8 e4 4a 83 05 00 0d` 176 | B: `10 10 01 00 00 b9 18 00 00 db 42 cb 14 05 00 0d` 177 | 178 | 179 | Ok, so we have a start and end. The bits inbetween though... 180 | 181 | We've seen 4 bytes be used as a CRC32, but I can't match that yet. 182 | There must be a size in there too. 183 | 184 | 185 | Using B. If `b9 18` were the size, what would that be in decimal? Let's assume it's little endian. So, 18b9 = `6329`. 186 | The file produced from the hex stream, minus the 16 bytes header is: `6345` bytes. So even with the header removed from the file, it's still 16 bytes too long. 187 | 188 | 189 | So perhaps the file is `16` bytes too long. We've seen a lot of 16 byte headers. The file ends `0x3b` which is the end marker. That suggests that there is junk somewhere in the middle. 190 | I would assume around where the file is split in to 4k chunks. 191 | 192 | Maybe, at the start of the second 4k block, the first n bytes are a header? 193 | If the first 2 bytes were a size, then the expected size would be: `c908` -> `08c9` -> 2249 bytes. And there are... 2249 bytes left. HELLO! 194 | That suggests that the other extra bytes are not in the 2nd batch. Only that the 2nd batch has a count in it. 195 | 196 | If the counter at the start is indeed `b9 18` which we think is 6329 bytes 197 | 198 | Ok, so each chunk has a 16 byte header. If we remove those headers then the file on disk very very nearly matches the bytes sent over the wire. I don't understand what is different about them, but it's inside the GIF itself, so perhaps doesn't matter. 199 | 200 | Let's focus on decoding those headers. 201 | 202 | see `gifdecoder.py` 203 | 204 | BINGO! 205 | 206 | Ok, so there are multiple headers. Using the example files we see: 207 | 208 | ```text 209 | 1st header: 10 10 01 00 00 b9 18 00 00 db 42 cb 14 05 00 0d 210 | 2nd header: c9 08 01 00 02 b9 18 00 00 db 42 cb 14 05 00 0d 211 | ``` 212 | 213 | It seems to be one master header, and then one header per 4k chunk. 214 | 215 | ### Master header 216 | 217 | 218 | ```text 219 | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 220 | 10 10 01 00 00 b9 18 00 00 db 42 cb 14 05 00 0d 221 | Payload size for this block inc header --|---| | | | |--------| |---------| |------| 222 | fixed 01 --------------------------------------| | | | | | | | | 223 | fixed 00 -----------------------------------------| | | | | | | | 224 | indications multi chunk. 0 = 1 chunk 2 = > 1 --------| | | | | | | 225 | total payload inc headers over all chunks size ---------|--------| | | | | 226 | CRC32 whole payload only, not headers ------------------------------|---------| | | 227 | fixed? -------------------------------------------------------------------------|------| 228 | ``` 229 | 230 | ### Secondary headers 231 | 232 | ```text 233 | c9 08 01 00 02 b9 18 00 00 db 42 cb 14 05 00 0d 234 | Payload size for this block inc header --|---| | | | |---------| |---------| |------| 235 | fixed 01 --------------------------------------| | | | | | | | | 236 | fixed 00 -----------------------------------------| | | | | | | | 237 | multi chunk indication as above ---------------------| | | | | | | 238 | total payload inc headers over all chunks size size ----|---------| | | | | 239 | CRC32 whole payload only, not headers ------------------------------|---------| | | 240 | fixed? something about `timeSign`? doesnt make sense ---------------------------|------| 241 | ``` 242 | 243 | It's possible that the time sign thing is just the 12 hour clock version of the current hour? But... why? 244 | Let's test this. It's now 18:04... nope. Still 05. Then I don't know. 245 | 246 | 247 | 248 | Further details in: ` public void sendImageData(BleDevice bleDevice, byte[] bArr, int i, TextAgreementListener textAgreementListener) {` 249 | `GifAgreement` 250 | 251 | 252 | TODO: I think we can change the speed at which the gif changes images quite easily. It's just a couple of bytes in the GIF file for each frame. PIL can probably do it already 253 | -------------------------------------------------------------------------------- /idotmatrix_controller.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | from Crypto.Cipher import AES 3 | import sys 4 | import colorsys 5 | import simplepyble 6 | import time 7 | import random 8 | import math 9 | from PIL import Image, ImageDraw, ImageFont, ImageSequence 10 | from collections import OrderedDict 11 | import zlib 12 | import sys 13 | import io 14 | 15 | 16 | 17 | SERVICE_UUID = "000000fa-0000-1000-8000-00805f9b34fb" 18 | WRITE_CMD_UUID = "0000fa02-0000-1000-8000-00805f9b34fb" # For sending commands to the controller 19 | NOTIFICATION_UUID = "0000fa03-0000-1000-8000-00805f9b34fb" # The UUID that I think notifications are sent from 20 | MIN_BYTE_VALUE = 0x80 # This seems pretty much static for all packets. I haven't experimented with it though. 21 | 22 | def write_packet(packet): 23 | #packet = encrypt_aes_ecb(packet) 24 | peripheral.write_request(SERVICE_UUID, WRITE_CMD_UUID, bytes(packet)) 25 | 26 | def build_rainbow_colour_list(num=31): 27 | colour_list = [] 28 | colour_divisions = int(360 / num) 29 | for i in range(num): 30 | h = i * colour_divisions 31 | r, g, b = colorsys.hsv_to_rgb(h / 360, 1, 1) 32 | r = int(r * 255) 33 | g = int(g * 255) 34 | b = int(b * 255) 35 | colour_list.append((r, g, b)) 36 | print(f"Colour list: {colour_list}") 37 | return colour_list 38 | 39 | def generate_spiral_coordinates(grid_size=32, num_points=500): 40 | x_center, y_center = grid_size // 2, grid_size // 2 41 | spiral_coordinates = [] 42 | 43 | for t in range(num_points): 44 | angle = 0.1 * t 45 | radius = 0.5 * angle 46 | 47 | x = int(x_center + radius * math.cos(angle)) 48 | y = int(y_center + radius * math.sin(angle)) 49 | 50 | if 0 <= x < grid_size and 0 <= y < grid_size: 51 | spiral_coordinates.append((x, y)) 52 | 53 | return list(OrderedDict.fromkeys(spiral_coordinates)) 54 | 55 | def graffiti_paint(rgb_tuple, x, y): 56 | # Sets a single pixel to a colour and mode 57 | """ 58 | y (starting at zero) ---------------| 59 | x (starting at zero) ------------| | 60 | blue -------------------------| | | 61 | green ---------------------| | | | 62 | red --------------------| | | | | 63 | header --|------------| | | | | | 64 | `0a 00 05 01 00 ff 00 00 1f 1f` 65 | 0 1 2 3 4 5 6 7 8 9 66 | """ 67 | graffiti_packet = bytearray.fromhex("0a 00 05 01 00 ff 00 00 1f 1f") 68 | print(f"X: {x}, Y: {y}") 69 | print(f"RGB: {rgb_tuple}") 70 | if x > 31: 71 | x = 31 72 | if y > 31: 73 | y = 31 74 | r, g, b = rgb_tuple 75 | graffiti_packet[5] = r 76 | graffiti_packet[6] = g 77 | graffiti_packet[7] = b 78 | graffiti_packet[8] = x 79 | graffiti_packet[9] = y 80 | write_packet(graffiti_packet) 81 | 82 | def sync_time(): 83 | # Set the time on the device 84 | current_time = time.localtime(time.time()) 85 | year = current_time.tm_year & 0xff # This is what the Android app does. This suggests that the year is pointless. 86 | month = current_time.tm_mon 87 | day = current_time.tm_mday 88 | dow = current_time.tm_wday + 1 # The controller uses 1-7 for days of the week, but time uses 0-6 89 | hour = current_time.tm_hour 90 | minute = current_time.tm_min 91 | seconds = current_time.tm_sec 92 | packet = bytearray.fromhex("0b 00 01 80 e7 0c 12 01 0a 26 10") 93 | packet[3] = MIN_BYTE_VALUE 94 | packet[4] = year 95 | packet[5] = month 96 | packet[6] = day 97 | packet[7] = dow 98 | packet[8] = hour 99 | packet[9] = minute 100 | packet[10] = seconds 101 | print(f"Packet: {packet.hex()}") 102 | write_packet(packet) 103 | 104 | 105 | def send_reset_command(): 106 | packet = bytearray.fromhex("04 00 03 80") 107 | write_packet(packet) 108 | # Maybe that first command is all that's needed? Try commenting out this second packet below and see if it still works... 109 | packet = bytearray.fromhex("05 00 04 80 50") 110 | write_packet(packet) 111 | 112 | def switch_on(state): 113 | packet = bytearray.fromhex("05 00 07 01 01") 114 | if state is True: 115 | packet[4] = 1 116 | else: 117 | packet[4] = 0 118 | write_packet(packet) 119 | 120 | def string_to_bitmaps(input_string, font_path=None): 121 | if font_path is None: 122 | font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf" 123 | font_size = 24 124 | font = ImageFont.truetype(font_path, font_size) 125 | hex_strings = [] 126 | for char in input_string: 127 | image = Image.new('1', (16, 32), 0) 128 | draw = ImageDraw.Draw(image) 129 | text_width, text_height = draw.textsize(char, font=font) 130 | text_x = (16 - text_width) // 2 131 | text_y = (32 - text_height) // 2 132 | draw.text((text_x, text_y), char, 1, font=font) 133 | bitmap = image.load() 134 | byte = 0 135 | bit_count = 0 136 | hex_string = "05ffffff" # 05 is the font size (32) and ffffff is fixed 137 | for y in range(32): 138 | for x in range(16): 139 | # Accumulate bits in little-endian order 140 | byte |= (bitmap[x, y] << bit_count) 141 | bit_count += 1 142 | if bit_count == 8 or (x == 15 and y == 31): 143 | hex_string += '{:02x}'.format(byte) 144 | byte = 0 145 | bit_count = 0 146 | hex_strings.append(hex_string) 147 | byte_stream = bytearray.fromhex(''.join(hex_strings)) 148 | return byte_stream 149 | 150 | def build_string_packet(text_bitmaps, text_mode=0, speed=100, text_colour_mode=1, text_colour=(255,0,0), text_bg_mode=0, text_bg_colour=(0,0,0)): 151 | # text_bitmaps is a bytearray and we assume it is correctly formatted 152 | separator = bytearray.fromhex("05 FF FF FF") 153 | num_chars = text_bitmaps.count(separator) 154 | 155 | text_metadata = bytearray.fromhex("FF FF 00 01 00 00 00 00 00 00 00 00 00 00") 156 | text_metadata[0] = num_chars.to_bytes(2, byteorder='little')[0] 157 | text_metadata[1] = num_chars.to_bytes(2, byteorder='little')[1] 158 | text_metadata[4] = text_mode 159 | text_metadata[5] = speed 160 | text_metadata[6] = text_colour_mode 161 | text_metadata[7] = text_colour[0] # r 162 | text_metadata[8] = text_colour[1] # g 163 | text_metadata[9] = text_colour[2] # b 164 | text_metadata[10] = text_bg_mode 165 | text_metadata[11] = text_bg_colour[0] # r 166 | text_metadata[12] = text_bg_colour[1] # g 167 | text_metadata[13] = text_bg_colour[2] # b 168 | 169 | packet = text_metadata + text_bitmaps 170 | 171 | header = bytearray.fromhex("FF FF 03 00 00 FF FF FF FF FF FF FF FF 00 00 0c") 172 | total_len = len(packet) + len(header) 173 | header[0] = total_len.to_bytes(2, byteorder='little')[0] 174 | header[1] = total_len.to_bytes(2, byteorder='little')[1] 175 | # header[2] = total_len.to_bytes(4, byteorder='little')[2] 176 | # header[3] = total_len.to_bytes(4, byteorder='little')[3] 177 | 178 | textmeta_and_bitmaps = len(packet) 179 | header[5] = textmeta_and_bitmaps.to_bytes(4, byteorder='little')[0] 180 | header[6] = textmeta_and_bitmaps.to_bytes(4, byteorder='little')[1] 181 | header[7] = textmeta_and_bitmaps.to_bytes(4, byteorder='little')[2] 182 | header[8] = textmeta_and_bitmaps.to_bytes(4, byteorder='little')[3] 183 | crc = zlib.crc32(packet) 184 | header[9] = crc.to_bytes(4, byteorder='little')[0] 185 | header[10] = crc.to_bytes(4, byteorder='little')[1] 186 | header[11] = crc.to_bytes(4, byteorder='little')[2] 187 | header[12] = crc.to_bytes(4, byteorder='little')[3] 188 | 189 | return header + packet 190 | 191 | def print_bitmaps(bitmaps): 192 | for bitmap in bitmaps: 193 | for row in bitmap: 194 | print(''.join(['X' if pixel else '.' for pixel in row])) 195 | print("\n") 196 | 197 | def generate_gif_payload(gif_path): 198 | with Image.open(gif_path) as img: 199 | print(f"Image size: {img.size}") 200 | if img.size != (32, 32): 201 | print("Image is too big.") 202 | raise Exception("Image is too big") 203 | 204 | with open(gif_path, "rb") as f: 205 | gif_bytes = f.read() 206 | 207 | crc = zlib.crc32(gif_bytes) 208 | print(f"Length: {len(gif_bytes)}") 209 | print(f"CRC: {crc}") 210 | return (gif_bytes, crc) 211 | 212 | def build_gif_packet(gif_payload): 213 | crc = gif_payload[1] 214 | gif_payload = gif_payload[0] 215 | header = bytearray.fromhex("FF FF 01 00 00 FF FF FF FF FF FF FF FF 05 00 0d") 216 | header[9] = crc.to_bytes(4, byteorder='little')[0] 217 | header[10] = crc.to_bytes(4, byteorder='little')[1] 218 | header[11] = crc.to_bytes(4, byteorder='little')[2] 219 | header[12] = crc.to_bytes(4, byteorder='little')[3] 220 | 221 | l = len(gif_payload) 222 | total_len = l + (len(header) * 2) 223 | header[5] = total_len.to_bytes(4, byteorder='little')[0] 224 | header[6] = total_len.to_bytes(4, byteorder='little')[1] 225 | header[7] = total_len.to_bytes(4, byteorder='little')[2] 226 | header[8] = total_len.to_bytes(4, byteorder='little')[3] 227 | 228 | print(f"Header: {header.hex()}") 229 | print(f"Payload: {gif_payload.hex()}") 230 | print(f"Payload length: {len(gif_payload)}") 231 | 232 | chunks = [] 233 | for i in range(0, len(gif_payload), 4096): 234 | chunk = gif_payload[i:i+4096] 235 | chunks.append(chunk) 236 | 237 | for i in range(len(chunks)): 238 | if i > 0: header[4] = 2 239 | else: header[4] = 0 240 | chunk_len = len(chunks[i])+len(header) 241 | header[0] = chunk_len.to_bytes(2, byteorder='little')[0] 242 | header[1] = chunk_len.to_bytes(2, byteorder='little')[1] 243 | 244 | write_packet(header + chunks[i]) 245 | print(f"\nChunk {i}:") 246 | print(' '.join(format(x, '02x') for x in header + chunks[i])) 247 | time.sleep(1) 248 | 249 | 250 | 251 | def response_decode(response): 252 | print(f"Response: {response.hex()}") 253 | 254 | def connect_to_device(mac_addr): 255 | print("Connecting to device" + mac_addr) 256 | idm_device = Peripheral(mac_addr) 257 | services = idm_device.getServices() 258 | for service in services: 259 | print(service) 260 | characteristics = service.getCharacteristics() 261 | for characteristic in characteristics: 262 | print(characteristic) 263 | descriptors = service.getDescriptors() 264 | for descriptor in descriptors: 265 | print(descriptor) 266 | return idm_device 267 | 268 | def find_devices(): 269 | idotmatrixes = {} 270 | scanner = Scanner().withDelegate(ScanDelegate()) 271 | devices = scanner.scan(10.0) 272 | for dev in devices: 273 | for (adtype, desc, value) in dev.getScanData(): 274 | if desc == "Complete Local Name" and value.startswith("LEDnetWF"): 275 | print("Found device: %s (%s), RSSI=%d dB" % (dev.addr, value, dev.rssi)) 276 | idotmatrixes[dev.addr] = dev.rssi 277 | 278 | if len(idotmatrixes) > 0: 279 | idotmatrixes = dict(sorted(idotmatrixes.items(), key=lambda item: item[1], reverse=True)) 280 | print("\n\n") 281 | for key, value in idotmatrixes.items(): 282 | print(f"Device: {key}, RSSI: {value}") 283 | else: 284 | print("No devices found") 285 | 286 | adapters = simplepyble.Adapter.get_adapters() 287 | adapter = adapters[0] 288 | 289 | if len(sys.argv) > 1 and sys.argv[1] == "--scan": 290 | adapter.set_callback_on_scan_start(lambda: print("Scan started")) 291 | adapter.set_callback_on_scan_stop(lambda: print("Scan stopped")) 292 | adapter.set_callback_on_scan_found(lambda peripheral: print(f"Found {peripheral.identifier()} [{peripheral.address()}]")) 293 | adapter.scan_for(5000) 294 | peripherals = adapter.scan_get_results() 295 | print("The following devices were found:") 296 | for peripheral in peripherals: 297 | if peripheral.identifier().startswith("IDM-"): 298 | print(f"\tMAC address: {peripheral.address()}, RSSI: {peripheral.rssi()}") 299 | manufacturer_data = peripheral.manufacturer_data() 300 | for manufacturer_id, value in manufacturer_data.items(): 301 | print(f"\t\tManufacturer ID: {manufacturer_id}") 302 | print(f"\t\tManufacturer data: {value}") 303 | print(' '.join(format(x, '02x') for x in value)) 304 | elif len(sys.argv) > 1 and sys.argv[1] == "--connect": 305 | # There are no examples of how to instantiate a peripheral object from a mac address 306 | # it probably can be done, but I can't work it out from the source, so for now 307 | # just use scan to find it by name 308 | print("Scanning for devices") 309 | adapter.scan_for(2000) 310 | peripherals = adapter.scan_get_results() 311 | for peripheral in peripherals: 312 | if peripheral.identifier().startswith("IDM-"): 313 | # this will do 314 | peripheral.connect() 315 | print(f"Connected to {peripheral.identifier()}. MTU: {peripheral.mtu()}") 316 | time.sleep(3) 317 | try: 318 | services = peripheral.services() 319 | for service in services: 320 | print(f"Service: {service.uuid()}") 321 | for characteristic in service.characteristics(): 322 | print(f"\tCharacteristic: {characteristic.uuid()}") 323 | for descriptor in characteristic.descriptors(): 324 | print(f"\t\tDescriptor: {descriptor.uuid()}") 325 | peripheral.notify(SERVICE_UUID, NOTIFICATION_UUID, response_decode) 326 | print("Turning on") 327 | switch_on(True) 328 | time.sleep(1) 329 | print("Syncing time") 330 | sync_time() 331 | 332 | #spiral = generate_spiral_coordinates() 333 | #print(spiral) 334 | # for each in spiral: 335 | # graffiti_paint((random.randint(0,255), random.randint(0,255), random.randint(0,255)), each[0], each[1]) 336 | # # time.sleep(0.1) 337 | # time.sleep(5) 338 | text_packet = build_string_packet(string_to_bitmaps("It's Christmas!"), text_mode=1, text_colour=(random.randint(0,255),random.randint(0,255),random.randint(0,255)), text_colour_mode=1) 339 | write_packet(text_packet) 340 | time.sleep(5) 341 | g = generate_gif_payload("assets_test/luigi32.gif") 342 | build_gif_packet(g) 343 | time.sleep(5) 344 | print("Resetting device...") 345 | send_reset_command() 346 | #print("Turning off") 347 | #switch_on(False) 348 | finally: 349 | peripheral.disconnect() 350 | else: 351 | print("Pass in either --scan or --connect") 352 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # iDotMatrix 2 | 3 | Here we go again. 4 | 5 | This time is an iDotMatrix device. 6 | 7 | This device is a 32 by 32 RGB matrix. A quick look at the app suggests that this uses the same controller as the iDeal LEDs from last time. Result if that is true. 8 | 9 | Looking at the initial packets says that these are not encrypted. Let's find out. 10 | 11 | There is another, much better looking, project to control these devices here: https://github.com/derkalle4/python3-idotmatrix-client 12 | 13 | 14 | ## On & Off 15 | 16 | 17 | `On` : `05 00 07 01 01` 18 | 19 | `Off`: `05 00 07 01 00` 20 | 21 | 22 | ## Set time and date 23 | 24 | ```text 25 | 11 0 1 128 231 12 18 1 10 38 16` in decimal. 26 | | | | | | | 27 | | | | | | L sec 28 | | | | | L min 29 | | | | L hour 30 | |----| header | | L DOW (Monday) 31 | | L day 32 | L month 33 | L how is this being convert to year? Answer: badly. 34 | L min byte value in Java is -128 so we've lost the sign? Why is this helpful? 35 | ``` 36 | 37 | The year seems to be a straight conversion to a byte. i.e. decimal 2023 & 0xFF = decimal 231. 38 | So... maybe the year is irrelevant? I don't imagine it's really needed for anything. 39 | 40 | ## Graffiti mode 41 | 42 | This lets you draw a pattern on the screen. You use the app to trace out the pattern and choose the colours. 43 | 44 | ```text 45 | y (starting at zero) ---------------| 46 | x (starting at zero) ------------| | 47 | blue -------------------------| | | 48 | green ---------------------| | | | 49 | red --------------------| | | | | 50 | header --|------------| | | | | | 51 | `0a 00 05 01 00 ff 00 00 1f 1f` 52 | ``` 53 | 54 | Let's write a function to draw a spiral in red in the `idotmatrix_controller.py`. 55 | 56 | It works! 57 | 58 | ## Text 59 | 60 | Text is a series of bitmaps for each letter. 61 | 62 | - The first byte of a long payload is the total length including the length byte 63 | - At font size "32" each character is 16 pixels wide and 32 high 64 | - It appears that each character of the text is sent as it's own bitmap. So if you have a string of 5 characters, 5 sets of bitmaps are sent 65 | - The bitmap format is row major, little endian 66 | - `plot_hex_grid.py` is capable of decoding the bytes in to a bitmap which looks like it should 67 | - Java function is perhaps `` public void sendTextTo3232(BleDevice bleDevice, Material material, int i, TextAgreementListener textAgreementListener)`` 68 | 69 | 70 | Handy tool: http://dotmatrixtool.com/# 71 | 72 | 73 | 74 | ### Text payload 75 | 76 | #### Header 1 77 | 78 | ```text 79 | 0 1 2 3 4 5 6 7 8 9101112 1314 15 80 | 6200 03 00 00 52000000 81866079 0000 0c [16 removed see below] 05ffffff [deleted] 81 | length ------------------|||| | | | |------| |------| |--| | Length is the total length of all bytes including any continuation packets. Bytes little endian. 82 | three ------------------------| | | | | | | | | | 83 | zero ----------------------------| | | | | | | | | 84 | maybe continuation marker? if >4096-| | | | | | | | 85 | length of next header plus bitmaps --- |------| | | | | | i.e. total length minus 16 86 | crc32 spanning 4 bytes (char data and the below)|------| | | | 87 | if `thing` is 12, then 00,00 else something about time---|--| | 88 | `thing` ------------------------------------------------------| 89 | 90 | ``` 91 | 92 | #### Header 2 - Text Metadata 93 | 94 | ```text 95 | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 96 | [16 bytes deleted as seen above ] 0100 00 01 00 64 01 00 00 ff 00 00 00 00 05ffffff [deleted] 97 | length of char array (one char)---|||| | | | | | | | | | | | | | 98 | zero ----------------------------------| | | | | | | | | | | | | 99 | one --------------------------------------| | | | | | | | | | | | 100 | text mode -----------------------------------| | | | | | | | | | | 101 | speed ------------------------------------------| | | | | | | | | | 102 | textcolourmode ------------------------------------| | | | | | | | | 103 | red ------------------------------------------------| | | | | | | | 104 | green -------------------------------------------------| | | | | | | 105 | blue -----------------------------------------------------| | | | | | 106 | text background col mode --------------------------------------| | | | | 107 | bg r -------------------------------------------------------------| | | | 108 | bg g ----------------------------------------------------------------| | | 109 | bg b -------------------------------------------------------------------| | 110 | this is the start the character bitmap ----------------------------------| 111 | ``` 112 | 113 | The 0x05 (or a 6) means that the font size (and so the bitmap size?) is "32". A 2 or a 3 would be for size "16". 114 | Then three bytes of 0xFF are added. `jadx` shows this as `-1`. 115 | 116 | #### CRC32 117 | 118 | The checksum (bytes `9` to `12` (zero index)) are the CRC32 of the text metadata header and *all* of the bitmaps (even if the bitmaps go in to a new BLE packet). 119 | So take the entire payload from the byte after `0c` (the end of the first header) to the end. Do a CRC32 on it, convert it to hex and you might get: `49317daa`. 120 | In the payload the CRC32 would be `aa 7d 31 49` (i.e. little endian). 121 | 122 | ### multi character text 123 | 124 | You send multiple characters one at a time. Each character starts with a header. `05FFFFFF` - where the `05` indicates the size. 5 is 32 bits. 125 | 126 | The maximum payload size is 4kB. I haven't implemented anything to test this for text, but it works for GIFs. See below. 127 | 128 | ### Text Mode 129 | 130 | ```text 131 | 0 - fixed 132 | 1 - left to right scroll 133 | 2 - right to left and letters come in the opposite order. Must be for RTL languages? 134 | 3 - up scroll 135 | 4 - down scroll 136 | 5 - strobe 137 | 6 - fade 138 | 7 - falling blocks 139 | 8 - laser 140 | ``` 141 | 142 | I'm stopping here. Last time I experimented with a set of lights it ended badly. 143 | 144 | ### Text Colour Mode 145 | 146 | ```text 147 | 0 - ? 148 | 1 - Fixed 149 | 2 - Blue to red gradient 150 | 3 - kinda pastels gradient 151 | 4 - Pink to orange gradient 152 | 5 - ? 153 | ``` 154 | 155 | This is all I've tested so far. Please update if you have others. 156 | 157 | ### Text Background Mode 158 | 159 | ```text 160 | 0 - Off 161 | 1 - Solid colour 162 | ``` 163 | 164 | ## GIFs 165 | 166 | My device is 32 x 32 pixels. All GIFs need to be 32 x 32. You can use [Gifsicle](https://www.lcdf.org/gifsicle/man.html) to batch resize. 167 | Each gif upload starts with a master header. The payload must be chunked in to 4k blocks. At the start of each 4k block is a secondary header. 168 | The payload does not count towards the 4k chunk size it seems. So 4096 + 16 bytes total size. 169 | 170 | When you have finished sending one block you should wait for confirmation from the device via a notification `0500010001`. Or, much easier, just sleep for a second. 171 | When the upload is complete you should get a `0500010003`. I haven't implemented any kind of flow control to test this yet. 172 | 173 | There is a very rudimentary implementation in the `idotmatrix_controller.py` script. 174 | 175 | ### Master header 176 | 177 | ```text 178 | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 179 | 10 10 01 00 00 b9 18 00 00 db 42 cb 14 05 00 0d 180 | Payload size for this block inc header --|---| | | | |--------| |---------| |------| 181 | fixed 01 --------------------------------------| | | | | | | | | 182 | fixed 00 -----------------------------------------| | | | | | | | 183 | indications multi chunk. 0 = 1 chunk 2 = > 1 --------| | | | | | | 184 | total payload size inc headers over all chunks --------|--------| | | | | 185 | CRC32 whole payload only, not headers ------------------------------|---------| | | 186 | fixed? -------------------------------------------------------------------------|------| 187 | ``` 188 | 189 | ### Secondary headers 190 | 191 | ```text 192 | c9 08 01 00 02 b9 18 00 00 db 42 cb 14 05 00 0d 193 | Payload size for this block inc header --|---| | | | |---------| |---------| |------| 194 | fixed 01 --------------------------------------| | | | | | | | | 195 | fixed 00 -----------------------------------------| | | | | | | | 196 | multi chunk indication as above ---------------------| | | | | | | 197 | total payload inc headers over all chunks size size ----|---------| | | | | 198 | CRC32 whole payload only, not headers ------------------------------|---------| | | 199 | fixed? something about `timeSign`? doesnt make sense ---------------------------|------| 200 | ``` 201 | 202 | ## Other projects that might be of interest 203 | 204 | - [iDotMatrix](https://github.com/8none1/idotmatrix) 205 | - [Zengge LEDnet WF](https://github.com/8none1/zengge_lednetwf) 206 | - [iDealLED](https://github.com/8none1/idealLED) 207 | - [BJ_LED](https://github.com/8none1/bj_led) 208 | - [ELK BLEDOB](https://github.com/8none1/elk-bledob) 209 | - [HiLighting LED](https://github.com/8none1/hilighting_homeassistant) 210 | - [BLELED LED Lamp](https://github.com/8none1/ledble-ledlamp) 211 | -------------------------------------------------------------------------------- /tools/gifdecoder.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | from PIL import Image, ImageDraw, ImageFont 4 | import zlib 5 | 6 | 7 | # p1 = "10100100008f270000e8e44a8305000d47494638396120002000f7ff00fefefe0800fe00894d0404b6818181b9b9b9fe000000860200233eaea8000500b4b10000fefefe00243f4e3e50fe4e4e00243e4e8328593f2e4e3e50b9b9b8fe4c4cfef500fef6017d675a504bfe50aa274e3e504d83274e4e4e4e3e504e3f51670000808080366281504cfd3662840404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b6" 8 | # p2 = "0404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b60404b600233f00000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f7001b081c48b0a0c18308132a3448606183860e234a940871a24582152f6a6c7060e3c203201f1ecc381164478f063f4430795263c60f0f0c4498d91265830f061660a82033c2079b026746c8b9d3c04f9b2685e63cea9165d2102210f86318d1a980ab1902203d7055405612010690f0d8f56b00055da72a2429508459b4574d6e44d020ac00111a9cd6b4c89544880b17340866b9d1a4860b090800169c97ea47c382112b0eec926007091d3068462c02a884cf9f1b" 9 | # p3 = "88c000c16181d3050e820e5d7a216a000050175c2da1e0e9830560eb8e7d5b206d81a883a71e987bb7eedeb45f1b176e7c39eacfca9b4b9f7e3c3af5ebd8b3c3060021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff001b086c1062a0c18308132a5cc8b0a1c387051b467c48b122c3891633124c7840a3c303203d3204d911e340930e3f4420d951a4c10f0f0c4498d95223c60f0616608839f383cb813323e4dc69c0e74f9241731a15c91229ca8c4d0548cd1080843f844f1182942a80aa88000344f8bb9a91abd7000ab822189b51c4d9b45249b25d88124103b0524334ad0955008910172e6818ccd223490d171210083c5803df8a2c1b275e2c18ab45091d2484c08021b1080819091894409a7403111820a86658a0758184a549ab5ebdd0350000ae0fc696305b60eb84056e0bc7fd5be06edfae931b0c3e5c78f1ddb69b2767dedcb96bd2d1ab6bdf6ebd35f7efe0c33701070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0021081c48b0a0c1830809205cc8b0a1c387101b2a9418b1a24583131b1eb85830e3c00320393204b951a4c10f11481ef0389065c30f0f0c449859d2a4c00f061660a82033c2878b2c6746c8b9d3c04f9b2485e63c2a5265d2100da246bde85480d50c0148f89b6a11a455" 10 | # p4 = "015845041820952b049706bf860da0e06b59b30d45ac6d6b95e45bb8081134186b5583d303771b7434d8e0800012212e5cd0c058e5dd8651496ab890808062c67e1f338c2c993165cb8b352fbcdb4142070ca8298bb88b96e05b09b06137108121b0c102b80b08542835b6ec816f0be60600207741df12a40ac42d5838f1e7c5710f441e35b775dd030b40872e1d02f2e1dbaf6f110f9f1b36f8f1e8d33fb7aebebdfbf7db010021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f200fd091c489020818208132a5cc850e1c18610234a9c4811e14386172b523c5031a3c20320351a440892a3c8841f3894347972e087070638c83ce051604d861f0c2cc00053e6879603394488a093a7819f143d96144a7401d2932b97866840b581c8a802b2660840a225c8ac02460410116080889360c59255001641c29b04456c5d0bb6a448040dcad68d2ab2c10101243a58b0103524c68254575eb02098b0dd8a7e0b0f6ecc726255aa123267f637b825557f9a372ff458a0748184a12548340d0080e98ca90b964e58a0b56dd7b305c6f667baf7e981b56fdbce9d9ab570dfc28f9bce6c3cb9f3e7c39b439f4ebd7a6b0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708e40021081c489020818208132a5cc850e1c18610234a" 11 | # p5 = "9c4811e14386172b523c5031a3c20320351a440892a3c8841f3894347972e087070638c83ce051604d861f0c2cc0502126870f2d0772881041274f0340297a2c39b4e882a4275732c58020a8d4920102585d99b543d6965803780d50d221c4ae59afb64c7b35a448901d3a58b0d0b6e1cd9573e5d22dabb16ddeb92c4f4a183c18c2dca00209172e88a14103081e0b482e9050b184828e413c2638190080c9192d17940c423367cfa83f4b1e281ac2e4d7940716489d7a3504cb9d69c3a6ad7bf2e0dcbc830b47fd7ab8f1e3c869030021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708e0001b081c48b0a0c18308132a6c4060a1c2860e234a8c0871a2c58b180d1ea0e8b0e2818f19157edc38b122c29120439a3460006548832c3bb04cf952e0c8982c0d9a8c88f263ce9a3d4776c06832e8c7000180a244da01e9cb914c918e7c19354050aa568d92d4b9f063870e162c181d886122cab060c54e1d0842a251b461b73600d196e04e8312f2e66d1096205dba16f5ee35f8b7eec002880b1c142cc120060c221e976d90180080c4051917442c40446701fefc15b04cfa32e2819a29275e4d37f4e8d2a44f37605c19f6ead7b06327ce5b3bb7efdfba11031f4ebc386c0021ff0b4e45545343415045322e30030100000021f904093200ff002c000000002000200007" 12 | # p6 = "08ff001b081c48b0a0c18308132a5cc850218186081f429c48f1a0c48a180b1ec8b8f080478617135ef4b891e341921f21863468c0004a93215b766899d2a44092325bdabc89f280ce822b3bf6f4d861e7508f0102540cd9336987a426493a4d4ab220868953030c35080222550d1ab61604d15568070c172e800d5b752059b2420f68b8902044dab52505be2d9b10e55aba76d50ec4804104e1ab0d2574901082305d1110040a103179b2bf06410b4ad8bcb9c1d981fec852862bb080e902073977e63a797483d300009cd6acbaa0e9ca0d4808f05720b66fd9a607aa9650fab471ca2478fffe1dbcc170d8cb8df75ecefcf466e8d4b36bf76d7cbbf7efe097030021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff001b081c48b0a0c18308132a5cc8b0a1c387041e1a8c28b1a2c50614111eb8b8f080478e093d6e5c98312145911f41123460002544852c3bb04c69b1a4c8982c550a44e931a74a9e22458840e06f6049863c0528cd10c02086871e950a602a22c000120641981c28956a0005528b1604a155a108af60958acc4ab6ec41040dac2a0d01942d59850704900871e18286bf2e07621081a1b088901e355c48c0d72f60822204448e8c38f1dfc504fa6a204856e85d86123a48088181c2e2c303414896ec56a184d7af2174e850707203c91829e8a670" 13 | # p7 = "1076ec8392239310b01b0000dd050afa9650b040017fd02543a760bcfa71e703970b74ce9d7be4e9d6ad63196fb09c7b7800dd0b9c17cffdb5f9f5f0e3a37f2fbfbe7dfb000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c18308132a5cc8b0a1c38710211288487022c586072e22b078f080478d093d660459f043049123137254f9e181810830538284f0c1c0020c155e46f80081e14a821020c08c6013a7019e1139421039d426528d2899866840b5813f8218fc5d55185580d70c014868bd3a512b88ad210f7815005644000522b412340b42e1dab66fd72204c1d7a045117815ac15b9b72fc20601060c8e7a10030611180eab25d1c18285a81fe70a10b1f9205594172c7c088db2a03fbe9d0dfa6b80f940e8d197e79ee62ce2e0eaaa0d24e8d60dc1b2697f9b1b0840a895aabfddba7f0e04ce9984c002d00b2c1f8b5c02f1b19ca3030010bd60f582d011682e35c0bcc0f6f3dcc30bfc8e20bafb02c30d08308ffebcfaeadaebbfafaf3fbaeefcfc0528a07d000e68e081086e070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff001b081c283004c18308132a5cc8b0a1c38710234a9c4891a1c18a0d421cc0c8f080c78a17137adcc8f1e087082349966cf0e181810830552a0c" 14 | # p8 = "b930c407030b30547819e1c3ca063023e0d469c067439a084706c5695462c8944a31f82b09756480000c3134847ab5c3d583483b7aec7a752447b201aa3204813064590d1ad42e64abd063070c172ec08d6b362106ad753d6ab8902044debd32090a10b130e55ec286f526f407826e43091d2484f84b580404840440087828a174e906771b7c46b8586081d705129a2e4d80a13f110260030000fbe06c09075f13f447bcc0eee3bc850bfced1ab6f306fe0cf8338efcb8f2dfbaab3ba75edd3aecd2d9bb8b0a1feffd35f9f3e8d357070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f7001b081c48b0a0c18308091248c8b0a1c38710234a9c48b1a2c30308175a3cc0d162428e18296a3408b2a34782060c943c89d240879426333a5c0832e54b032c1b94e498f2e148923b398a1081c09fc4913b0528cd10e02447a502988a0830808445a8520328806a74e04f8622b26e550ab2228206540568101174a2c603024884b8704183dd9514416ab89080005dbb1a424e2c0998afdfba09313cec20a10386c77c452414f0508265cb0d4460807090803f10020b882e70f03266089c1382180d00c0e882a625fc146d504081d6b85dd316183bf4e8df02fd89b89d1bf7eed8ac8bff265edcf868cbc99b4b9fee5c34f5ebd8b317070021ff0b4e45545343415045322e" 15 | # p9 = "30030100000021f904093200ff002c00000000200020000708f8001b081c48b0a0c183040e2a5cc8" 16 | # p10 = "10100100028f270000e8e44a8305000d7061c28610234a9c48b1a2c58a072e363cc011a1c6061c337e2cf821424891141f12fcf0c040849728477e30b00043cb971f460a7c1981a64d03393d364c189227cda01a4f160d2102813f862a0d2a1540354380a64f25aae4485580551101147cecfa356c578d22ca2ae81ab260d485081a0418403584d298140f082011e2c2050d804fa6141852c385047dff06be7812b061c47e35e89420a10386cb87454ca64cb981080c102016185de02067ca10528736f890340000a40b9e96d020b5c0d1070bbcde0d1bb7c0d909490b2f3d5037efddbe67bb3e3efc3873d294973b9f4e1db9f4ead8b36b7f0d0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f9001b081c48b0a0c18308132a2c4860a1c387071b429c48b1a2c58b020f605478a0e346841d351a9458d1418490223f3670f0c04084972927921ce8c0c0020c2d5f3a50d9e065049b380decfc18d2a7cda1231d1240591483087ffe30321540354300a5093b52156055448001242a4adcda358082ad512d8a287b966ac88b081a7ca51a8269cc0633390a2011e2c2050d80515e0ca9e14202027e016bb8bb50224ac58611ff5529a183040c980d8b80f0518267cf0d446080c0596181d3050e7e064dba3442d40000a02eb85a42c1d304251688cd5b366e81b505a2" 17 | # p11 = "1e9e7ae0eedebc7fd7868d9c38f2e6a83d337f4ebd7af2e9d6b36bdf1e1b0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f1001b081c48b0a0c18308132a5cc8b06183100e233a8428b1a2458b072e2e3cc05163428e193d16fc100164488214257e78602082cb93223f18588081a5cb0f125312741961664d03384582e43933a84693437516547a3004520150470410e1efe801a80232042011600043a602b16ae53a00ab458a52c96205a951ad080d48614abc4a02c3850b1af29a2448c021480d171210b89b17ee459385030fc69bd36007091d4260b09b4084c8061232676e200243c302a00b1cd4bc19028485a10100085d90b48482a00f16504d7b756c81ae0586de2dba6f83d9b569df769d3a38efe0c643672e8ebcb973e1cc9f4b9f4e5d350021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708fa001b846840b0a0c18308132a5cc8b0a1c3871023121c28b1e2428a162d1ec8d8f080478e0b3d6e0479f0430491234936f8f0c0408497290b628cf8c1c0020c2d5f7e50d9e065049b380dec8438b3a0489f368772447934840804fe96a21440354380a7510d164d18c22355015645045000f26bd8b15f1d6e6d20e2ac82af222d8640d020c000aa5d992e154022c4850b1a02a3cc2852c3850404fe06d610" 18 | # p12 = "930044948b0f2706ac52420709213060382c42e25609a041b3c500c16181d3051286060da17543d40000a03eb85a42ebd20d4e272c10bbb76cdd046b13444d3c7541debe7b03af0d3b79f1e4ce51836e0ebdba75e5d4af6bdfce3d360021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f6001b081c48b0a0c1830509205cc8b0a1c38710234a84a870a2c58315091eb8d8f080478e0b3d6e0459f0430491234936f8f0c040849729497e30b000430597113e10cc28f165049a360de82429d227cda10f790a445934844aa602a2660840c21f478f51054c15114081087f60773accbab56b560461258a28ab20abc8b408953640d020c080a82198c6a4d8e0800012212e5cd04018e545911a2e24083cb8f061c4841533d62076a2840e12306856dc41a584cf9f1b88c0f0b080e90272418786e0f0340000a70baa9650d0f4c102af73c3b62d70b6c0d3c00b10c4ad3b37efd9ae8b072faefcf4e7e4cca34b370e7dbaf5ebd85f030021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f5001b081c48b0e0400206132a5cc8d020c28610234a9c48b1a2c5820f291eb888b1e0818f1c177edc18b2e087082349966cf0e1818108305596fc6060010697303fac6c003342cd9b06740acca8f163cf9a4239a61c19210445a202" 19 | # p13 = "970a989a2100097f4a0f4c15505544800121b7760da060ab42a806458c2d3b75e445040dbe0a10a161a9ccb309b592c070e18286bf292b221ca9e14202027dffd6bd9852b161c47e577690d00143080a864510440b518267cf082a438058a07481849f3d8f265d1a0000d305534b28583a6101d7b85fd716285ba0e9dfa707dece8d7bb76cd3c475234f5edcb4e7e5cca34bff2dbdbaf5ebc4010021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708fb001b081c48b0a0c1830813160ca1b0a1c3870c1f4a9c48b1a2c589071c46c47820e3c5811b0576f4f8b1a083082349966ce0e0818108305596746060010697301dac14083342cd9b0674ae1cd9b3a6d0062125a6241a4204027f1f970a989a21c0c4a40d3a4e155095448001243e6eed1a40c156a8164590353b752442ac041134f82a408388a532310a2011e2c2050d805336843b52c3850404fc02d690b72181ac85011f4efc776707091d30683e2c62a784cf9f0988c00081e063830552173808fa730308b015aa06004075c1d6125e0f4c7db000eddfb5790bc42d50b5f1d5bb8103178e7bb6f2e3ca9fabfeec3cbaf5ebbf8d63dfcebdbb720021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708fe001b081c48b0a0c1830d08205cc8b0a143810a1f4a9c3830" 20 | # p14 = "22c58b1833163ca091e1818f0d2d4afcc8b163c2811f22902c69b2c187070622c86469f2838105182ac48cf0a1650399116ee634d0d32449a0378b6a5c7934840804fe4e5e642aa06a86004ffd459d7aa0aa80ab22020c9828b28157b062bd6a148176805792191134482b2004539a04cb1aec4a22c4850b1a02afcc4852c3850404fe06d680d7a0de062b171f4e0cf862d90e123a60d87c58444b09a0413710810182c302a80b1c0c0d9a0004d3790ba60600207541d6121ac06e80fa6001dac06bf716885b60eae3aa07fe0e0e7c38eed9cc91338f9e1a34f4e9d8b337bfaebdbbf7efb4010021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff001b081c48b0a0c18308132a341862a1c3871005368c4811e2c48a18111ec8b8f080478e093d6e5478d1e187082247729cf8e18181083055826cf0c1c0020c155e46f8305320cc0836711ae03953e44f9b4439a6345a32e3520150470420e1af01018c1ea10ac83035c00011fec256d4ca958457ad61ab2e2c29a2ec59a822c55244d0e0ad88a532291e104022c4850b1a02a73cd8d4a0480d171210f81b58435e88291b275e0c78edc20e123a60d89c5804048a57094a183dba81080c103e2b2cc0bac041d2a553ab46d81a0080d605614b20309bb5d582056c0bbfed5ba06e81ad93bb1e187cb8f0e2ba6b3b57ee" 21 | # p15 = "7c7aebd1d2ab6bdffe3c3bf7efe0c3db01060021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f2001b081c48b0a0c18308132a5cc8b0a1c0100e234a3c0871a2458515171eb8a8f1c0468e083d7e0449f043049123293afcf0c0408497292d56fc60600186962f3f9014f83242cd9b06749214d9b3a6508e288966448a5280d30c0148f863ea54005411010688f0e78fc0c4aa57b35645c075a288b003aa8a2ccb30238206624568481a33e2010124425cb8a0a12fca8b22355c4840606fdfb92a15a23c3cb830df9d1d2474c01002c3601110302e94c0997383c90d0b882ed0c02bc1ce9e438b0600607441d4120a8a3e5880b5edd6b305c2f63aba37e981b56fdbce0d7bb470dcc68f0f1fcd39b9f2e7d07b439f4ebdba700021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f9001b081c48b0a0c18308132a5cc8b0a1c3870543409c48b181c48a080f4cbca8f080478c093d6a0459f0430491234936f8f0c0408497290f725cf8c1c0020c2d5f7ec0c8f165049b380dec2429d2a7cda11851160d210281bfa4280548cd1080e801a902a8920830800446ac5a0328c0fab401018822c28e952ab22282065ca58a501a73e1ccab24425cb8a0a12fca8a22355c4840606f5f0d751da23c3cb830df83671746ee204142" 22 | # p16 = "080c18068b8040b2b2e7062230705618a280e902073d5786c07a34c2d300009c2ea85a4203d7a60f1688cd5b766e81b5059e1e8e7ae0eedebc7fd7868d9c38f2e6a72b337f4ebd7af2e9d6b36bdf1e1b0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff001b081c4860a0c18308132a5cc8b0a1c38710234a9c5870a2c587070456bc88f08047891b177accc811e1870823499614f8e18181083055aefc606001860a2f237c5018b221cc08356f1ad86971e3c89f3589724c7934c4ca064c0548cd108084bfa507a40aa02a22c00011feae4ed4ca358002ad08c24e1451f6acd4916a7b3244d0c0abd4104c654acc4a22c4850b1a02a7841872a4860b0908fc0dac412fc4948c112b06fc5482840e183223160101c241b9082b5a1edd400486ce9e1716585d20e168cba8532b640d0000eb83af2534e82c7075c202b583dbf62d30776fd6c80d02171e9c786edacc912f67de9cb565e8d4b36bafbe7abbf7efe099030021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708fd001b081c48b0a0c18308051248c8b0a1c38710234a9c4831e24289072a363cc0b1c1458d053966b4c8f043049123410afc50c140849729557e30b00043cb971f540a7c1981a64d03390d7e74289227cda0132fa22c1a42e7520150330420" 23 | # p17 = "e14f2347a802a48a08304084bfaf13b16a0da0002b02b012458c2d0b5524da88081a70152042c3d29443890a2081e1c2050d80515614a9e14202027e01db853814a562c388ffeaec20a10386107d138880a0528267cf0d2c231c4aa1340582173f837e681a0080d2050aaa9650b0c06983145ceb7e5d20b6c0d9027bf7367d5b60eeddba7bff562d1cf96be2ce770b2fe0b979f4ebd8014ccfcebdbb7700000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f2001b081c48b0a0c18308132a5c489000c38710234a9c48b122c3030f1d463cc0d162428e18357a14f82102488c10451afcf0c0408497284736f8606001860a2e237c90d9e065849a370dec1c09d267cda105552a3c593484458d4c0548cd1080843f8b1ca50aa02a2280028f5ab97ad56a518458055a415644d020c000a92198c69c7840008910172e68d87b52a0d28520355c484020ef5e0d733706de3bb8b0de940825749010020386c122644ad8bcb941070c0f0b882e70907367851a47030030daaf40d3120a8a3e5860b56dd6b35f9b1638ba37e981b56fdbce0d5bb570dfc28f8fde6c3cb9f3e7c39b439f4ebdfa6a0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff00fd091c48b0e0400206fd214cc8b0a1c3871023125c28b1a2c58b18" 24 | # p18 = "9f070100028f270000e8e44a8305000de18349813123e0d469c0a7499241711ad5a812698806501b4c94d85480d5110148605cf8d1aa800c59030c10a1d12b5812011478459051c4d9b45e496644d040ac000d229aceb4d8e0800012212e5cd04058e545a824355c48404030610d256b36ec9b98f0e2c683a5f28ddaa083840e18422f160141b3439650fd4958bdba81080c104a3b2c40bb4042d6ad63974e6db0360000b50be296d0607703daa61716f8cd1c38ed85c3a1d69e6e7be0f2e6cc690b1cee1b3b75ecde6baf0dee0ebebcf9ece4cfab5fcffe370021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f6001b081c48b0a0c1830813160c7190a1c28710234a94e870a2c58b18091ec8f8f080478e093d6e7c58f1e1870822478214f8e1818108300f94e4f8c1c0020c2e617e8838b320cc0836711ad8b952e44f9b4439a6348a41843f7f4a530a989a214043891ea70aa84a22c0001218196aad2a228002ad50318a206b56abc88c081a789d1a62a9ca8b0704900871e18286bf29338ad470210181be7f35dc9d98327161be7e0512e028a1838410183014160161a584cf9f1b74c010b180e9020741872e6d1a0080d305554b2868fa6001d7b85fd716285be0e9dfa82737b89d1bf76ed9a78beb4eaedcf8e9cfcc9b4b9ffe7bbaf5ebd88b030021ff0b4e45" 25 | # p19 = "545343415045322e30030100000021f904093200ff002c00000000200020000708f7001b081cd88000c18308132a5cc8b0a143810611467c48b1a2c58a132f6a14786063c303203d2e04d951e4c10f1148965c9871e187070622c85c69f2838105182ac48cf0c1a44099116ee634d0b361cb832481de2cea5165d2102210f86baa5280d50c014c82b42a002b89000348487cc8d56b00055ca75e2420c22c5aab24374e052b408406a7342d1e104022c4850b1a02abdc4852c3850404fe06be4bb870e0c38901fbec20a143080c180e8b80e8518267cf0d446080e0b080e902093f8386409ae16900004e1f542de1a0e9840560eb8e7d5b206d81a783a31e987bb7eedeb45f1b176e7cf969cfca9b4b9f7e3c3af5ebd8b3c3060021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f8001b846840b0a0c18308132a14b8b0a1c38710231e1c8890a2c48b183326b478f080468707427e5c18d2e3c8830e22943479b28183070622c864a990e342070616608029d341cb063223e4dc69c0e7c99241731a6d68d3e04aa44d313e154075440012fe3e86a42a2043001101068ce4ea15ac02ae1b1f8a281be02cd5921a0786a51ae229cd8b0704900871e18286bf2b3596d470210181be7f35dc8db83271e1c37e5b4ae8202104060c85454896c05942031118201024b0b080e9" 26 | # p20 = "02093b7386c0dae16900004e1f54ed593441d3090bc0de1d1b3741dab74f0b37a89bf76edfb45f1b175edcf8f1d39c953b9f4efdb9e9ead8b36b370e0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff001b081c48b0a0c1830543205cc890a1c28610234a9c88f061428a18333638a071a045820742765c1892e3c8821f22943479b2c187070622c86479f2838105182ac48cf061e147863223dccc69a0e7c992416f1aedb812e9cf8a24570a989a2100097f4c0f4c15509544000522fc61c5b8b5ebd7ad08c462146156c1d6926a093e2d88a0418001024468684a732201ad24425cb8a0a1f04a8d25355c48406070e1bd8813175edc9870cb0e123a84c08061b1080827258816dd40040608a01916585de0e068d2a8531338c81a0000d6055f4b6890bac16adab683dffe2d50b740d6c85b0f2c205c3871ddb59b276f2e9db5e8e8d4b36b0f8e7cbbf7efe09b030021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708f6001b081c489000c18308132a5cc8f0a0c18610233e8c48b1a2458a130b5e1c786023c403203d0accc831a448841f2280347952e087070622c8ecd8d2a58105182ac48cf0a1660399116ee634d03321c9852b81de2c2a72a5d308214420f0d7d4a980ab190248a5aaf068c9ab02b29208a0e0" 27 | # p21 = "2458b164c18a14815601d8951e11340830e0aa06a72c35363c208044880b17340876ba91c04a0d171210002cf8ae47a78d132f0e5cb383840f213060482ca2a684cf9f1b88c010b180e9020941878600f1340000a70faa9670d074c202af73c3b62d70b6c0d3c0510fc4ad3b37efd9ae8b072faefcf4e7e4cca34b370e7dbaf5ebd85f030021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708fa001b081c48b0a0c1830d082024a870a1c387101f368c4811e1c48a18336a147840e0c5811f291e18b9d1e1c88e253f7e88701265c9811f1e188840d3e5cb061f0c2cc02093e6879b026946d0c9d3c0cf9b2785ea3c6a30e4c19649438840e0af245401583304407a00ab80110144041840422242af60498cf55a55a308ad6a07783db9114183b5223440b589b12b090c172e6818dcb229c4931a2e24201078b05e8d045a3a56cc5830d00e0e2484c000388108a01242876e200203048805521738287a3484d30e550300a0ba606b0905531f2c30bb376ddd026f0b544d7cf540debe7b03bf2d3b79f1e4ce55876e0ebdba75e5d4af6bdfce7d36003b" 28 | 29 | # byte_array = bytearray.fromhex(p1+p2+p3+p4+p5+p6+p7+p8+p9+p10+p11+p12+p13+p14+p15+p16+p17+p18+p19+p20+p21) 30 | 31 | # print(byte_array) 32 | 33 | # with open('test.gif', 'wb') as f: 34 | # f.write(byte_array) 35 | 36 | # with open('test.2gif', 'wb') as f: 37 | # f.write(byte_array[16:]) 38 | 39 | i1 = """ 40 | 1010010000b9180000db42cb1405000d47494638396120002000f7ff00fedb96aa7353a97254fea800b269402b2b2b3b3a3a010101ffb68bb26a413c3a3afea800aa5b2f2b2b2b3b3939010101a972543c3a3aa97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254 41 | a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a9725456555400000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a50efcf9638a952acf952c312ed5aa75eacfa64925221c4bd6ec54921a7b622debd627d596719576fd595768cbb55d0720e84bf520d18a76831a303060c06203669f563c4c31f1e2c682971af0299922e09f0610 42 | 606e0c7971618333af2ec59c00f3e0cda1bfa616bb7a0081c6b70714783c1429c203c0830b1f7e0061cc850e0e183830803966e6ca9573ac785c6172c6cd0730d0ee7cb981e99e0f1639709e5d7bf9e6051002580f0001fbf6efddbf9f4fbfbefdfbf1edcb5fbf1f3efdfef805e85f7d00b257a08008ced79f7c03e427e081090e08000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffaf3075468cda217732e652a14e7478e3e0b4ca59ad569d29a587f3a58dab4ab83a148252234fb33a859921a7bb22d2b5668cbb81f7dd66dabd7edd9966bcd0e18e0d7afce9945fbea1dacd827d48a442b361ecc78ef638a81c552a6bcf7b0c8be94196c36ccf32a46d003448fd68b56e2cc830762cb9e4dfb00c2980b1d1cd03de04068df070cece65811b742dd0e06fb56ed7b807007c4311f2cd0bcf760d1d50f144008a03b0004debf8729071fbe3b79f3e5d3abf77e7ebdfaf6f0df8f774f1f7dfdf4f1d9cbd77f7ffd80fee5e5675f80f379070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff00 43 | 11081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39fcf020e1cd8fc58d1a2c29d2e3ffaf4075468cda21773fe6c9af323c7a00514682dd0d401559e2b5962c4ea606bd7af492522c4aa5501d7a05e8392d458136e56b376e1d26440f7a3ddb66fc9ca6db956f0000467f51e245a31af020303061898dc156a45c614ed4e8e7c18ab81a0962916f66a0001e7c8060a4c16ba58ac46bb9c097046bc7a28d29957b19e66c059f564db12671e3c40bcb8f1e30710c65ce8e080810303a07386eedc39c78acb1536871c5d366fe9cf0d5c3d177db080f4e89c199c3f50002180f70010c08f3f5ffefcfbefede3dfcf1fbefefef4f9575f7e001668207fff0d58e0000a1e28e0830ede97608404c2070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830505281480602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39fbf02051c38b0f9b1a245853b5d7e140a5428d199462fe6641a7428ce8f1c990a75d054eb509e2b5962f4cab52a57a760252224dbf5acd5831a6b6e35dbd62c4d067197b2a5bbf5ee5aaf0306f0757ab068c5b9 44 | 5b03fb74eb206a45c314113b08acf8e756c714ff9ea54cd932618333b332a5cc80b3ddb46235ce0d5cda745fb0080fc89e4dbbf6018431173a38b07bc001d2bf0f18e0cdb1626e85bb27fb1ed0faf780e10e8a673e58c0f972e6d77d174008a03b0004debf8728071fbe3b79f3e5d3abf77e7ebdfaf6f0df8f774f1f7dfdf4f1d9cbd77f7ffd80fee5b517e07ded010021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab5ca5669d3a14a9448458c5a625a9b1675aad63b3d264d056e95ba0fefc85a5da126dda0108f2e6ddaa7366d1b8060c0c182078ebd38a442b8e4dbc18b0de02067c3ea6e8f7a7010495171bc09cb9b0c8b19509544640fa334fab1851576650b9755989330f1ed8cdbbb7ef0308632e7470c0c08101c72b1f2f5e9c6345e10a892b46ae9a7672e3069c733e582039f2d9de0f14314008a03c0004e6cfa7479fbe7d79f6eee3cb370f7fbe7afaebdfdbdfcf5f7efdfcfb0d00607ff81548607bff1da89f79000021ff0b4e45545343415045322e30030100000021 45 | f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c806021430610190824409140c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab5ca5669d3a14a9448458a5faf31796a4c69e697fae5dbb952683b74ae31698ebaf6e4bb4690720d8cbb6ee41a215c73a306060c000c606b63ead8898e258c68e052f35e0733245c03f0d20c8ec383263aa8759621c9b9940e6c18b45f3b4ba7a296906990b402e2b71e6c103c0830b1f7e0061cc850e0e183830807966e6ca9573ac785c61f2c6cd5de376bedcc0f4cf070b38376f9e99c1f803051002580f0001fbf6efddbf9fbf5e3efdfbf8d9dbcf0f5f7ffcfaf9edc7df8004fa37e000ff15982080030a68a08203020021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f16f0e7ef67d3a435af7a5dca95ebd4a1482522c44ab6ec59841a7bb2d5ca752cd5967195ce65 46 | 3a97a65a8359a70e1830d5aece994503671dacd8e7d38a442b361eccd8ee638a6bb152a66cf8e04cb13f2933d85c18adc4b018030f1e4d3aabe9a1080fc89e4dbbf601b81a1d3a38b07bc001ca047e1f30c09b63c5980b773b18fc9bf5ef01c41d18c77cb0c073dfabb1332f801080770008be8329171f5ebcf7f2e7cdab5fff1d3dfbf5eee3c327ffbe7e7afbeae5b79fbf1f3ffb01fe99e79e80f8b9070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa04eacfdfd099452fe65cdad429ce8f1c97fafc59d55f50074f25ae9c99f5e756a6fecc82e53913a1d6a55fd592d4d8f3edcfb8716932a0abd42ed0b35bf5ba7d3b6000dec007895604ecb3306307512b2aa678b66961c76a21870c7970abe5cb8ef3266689d1f36506a0f3b2255b7a6961d4a903b34578a0b6eddbb80f208cb9d0c101df030e9c167ec0c06f8e15792bf4eda0b070d8c2071877809c22c202d183bfd6eebc004200e001202c082f9efc78f2e0cfa747cfbe7d78f5eedbc39f2fdf7cfcfbebf1b3a7ffbe7e7ffdee0d00207af011a81f7c000021ff0b4e455453434150 47 | 45322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3808102fe82dafc58d1a2c29d2e3ffa042ab466d18b399732cdf991a30307057cfeccbaf4ea50a435ad627520556b01af3c6722bcca75ab59af0835d6bc8ad56cdbb35e5bcafd48f7ee5dba34251eec1b740002bc3f011f245a916ed0c203de5e7d5a913145c7900d93cd3a3964c8c16cfd2118409af44f9f0e74b2c4d8b77482d287b57e951896355bd20470936e3b7b28c203c0830b1f7e20ae46870e0e183830807969e6ca9573ac1873617203a4993318c0c0f97203d329223b2ce0bc39e9ede50f144008a03d0004eedfc7871fbf7e7bfaf6f3ebdfaf1fbf7cf7fe01c8df80f505385f7f042638a07ff40d702081062a785f7c000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d381830205fcf9b3f9b1a245853b5d7ef409d427d199462fe6645ac029ce8f1c99fafc5955ab83a71257ceccfa736b53af609f92f4cad5acd5 48 | 831a7b3215da962d4d067197fa142af46c59a72d116ee53b6040d7bf5f0f16ad68966e61b73ea356 49 | c908010002b9180000db42cb1405000d5c4c1172e1c788255314acf5f265c43a5962347b9981e7c3696b92fd59d8f4e9ada9251e3c40bbb6eddb0710c65ce8e040ef01074a073f60c037c78abb15f6765038b8ebe0038a3b38bef96001e8c05b676f5e002180ef0010802a0f3f5efcf8efe6d19f5fcf1e7cfaf6ecdfcb8f5f1ebe7df5f7d7cf774f9f7ffef603fc77de7b03e6f71e0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab3ffdf9d39a75ea50a41211fa142b962956aa0835f65ccbd62d57a12de52a5d2a96ec5baa2dd5be1d8060eb569d338b967560c0c080018d0d6c7d5a9168c5b28d1f135e6ac027658a827f1a40a0f9b1e4c6700dce04fb533301cd85198fe6691563d9d20c3417887c56e2cc8307820b1f4efc405c8d0e1d1c3070604073cdcd972fe75831e642e58e9dbfcefd9cb901eaa00f163878ee5c3303f2070a2004c01e0082f6eee1bf874f9ffdfcfaf8f3b7bfaf3ffe7ef9f6e9c75f7f0416f81f81030068a082011238e0810b12080021ff0b4e455453 50 | 43415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b39fdfd0cea20e7478e3efd69f5c77469d3a435b13ad8ca95eacfaf4825225caa75aacfb355116aece975a959b33419cc555ad76ddfbc6beb0e4070f7adce9945df06356060c000c606cc3ead48b4a262c68e072f35e07332c5c03f0d20c8ec3832e3b806678afd99394166c2a787a6658951b16302b71d17802c5be2cc8307820b1f4efc805c8d0e1d1c30706040f3cccd972fe75831e642e58d9d0f60b0fd397303d43f1f372cf05cfb76f3ce0b2004c01e0082f6eee1bf874fbfbefdfbf8e5df9fcf9e7ffcfafee527e07f03ea57e07e05fa37df00071ad8a082f0010021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39f8302051c38b0f9b1a245853b5d7ef4e70fa850a2338d5eccc9d4e9509c1f390a2dc0f467d0ad4f79ae648911ecd6af3fc32a9588d0ac57a1 51 | 69af1ed458132e5aab7187b6a4fbd1aeddbb7069b235e8d7c10004809f1e2c5ad1af010303063c3680566a45c614ed3e8e7c78ab01a19629b6f58c807364ca8fe5169ca9752b67029c113b780c5562cdd63f4d33e05c60726da2080f081f4ebcf8018431173a3860e0c000e79c9d3367ceb1627285cb213f87bd1b7a7303d5451f392c00fd396706e50f144008a03d0004eedfc7871fbf7e7bfaf6f3eb778f7fbf7cfef3ddb75f7ffe15682080050e10e0810b0a582081083258200021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39fbf02051c38b0f9b1a245853b5d7ef4e700a850a2338d5ecc29d4e9509c1f395615da34e8d6a13c57b2c4f8b52b57af5025de3c58d66ad3a70835d63c7bd6ebdba72de57ea45bd5ae5d9a12d97e1d80c02f579d512bd2f539608081c776a5562caab82ae3c608aa1a102a9922c2b3fe10341e6da0c0e3ab06676aad3a3ac1e8c2a7d3ca5edd74f40006a34d3f963df3e081dfc0830b3f1057a34307070c1c18b07cf4f2e4c939568cb910b981c60708dc66de58b901e99e0f163968cebd3103f2070a2004c01e0082f6eee1bf874f9ffdfcfaf8f3 52 | b7bfaf3ffe7ef9f6f527e080f9f107a080031c48e07f0c2e489f810e06d81e0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab5ca5669d3a14a9448458c5a625a9b1675aad63b3d264d05629567ffe98be9d8b7629de0103b66ed539b3e858bcfe00c7f5f9b422d18a7113031ef0b631c5be5c274f0e4bf5e04cb03f2733d03c98a7558c63018f262dd734c203b063cb9e7d0061cc850e0ee41e704074ef03067473ac785b616e07807bafee3d20b883e1970f1660ce5b75f5e4051002d80e0001f7eedfbd7f24df2e9efcf8f3e8d3ab1f5f1e3c77f1ede3af9f4f1f7dfbf403c2d767af7ffefdf7fbd5070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3808102057cdafc58d1a2c29d2e3ffa042ab466d18b3997063590f32347070ea6fed45a00eb 53 | 50a435af66f5b9956c57075f25de3c8835a83f7f4c977a45a8b126d6ac6fdf72bd4b9341dd8f770be4856b966f4b84810df81b80a0abdcb90689564cec73c080c2589f56944c91b265c60e7e1ac81c3224dbb6543f5b163d5a274b8c813f27f8dc986cdadb62b3aa66f059ebed99070f081f4ebcf801ba1a1d3a3860e0c000e79f9d3367ceb162cc85cb0d583e4060006fe8cd0d543da788b000f4e79f199c3f50002180f70010c08f3f5ffefcfbefede3dfcf1fbefefef4f9575f7e001668207fff0d58e0000a1e28e0830ede97608404c207003b 54 | """ 55 | 56 | #byte_array = bytearray.fromhex(i1) 57 | #print(byte_array) 58 | 59 | # with open('test.3.gif', 'wb') as f: 60 | # f.write(byte_array[16:]) 61 | 62 | #print(f"CRC32: {hex(zlib.crc32(byte_array[16:]))}") 63 | 64 | i1 = """1010010000b9180000db42cb1405000d47494638396120002000f7ff00fedb96aa7353a97254fea800b269402b2b2b3b3a3a010101ffb68bb26a413c3a3afea800aa5b2f2b2b2b3b3939010101a972543c3a3aa97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254 65 | a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a9725456555400000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a50efcf9638a952acf952c312ed5aa75eacfa64925221c4bd6ec54921a7b622debd627d596719576fd595768cbb55d0720e84bf520d18a76831a303060c06203669f563c4c31f1e2c682971af0299922e09f0610 66 | 606e0c7971618333af2ec59c00f3e0cda1bfa616bb7a0081c6b70714783c1429c203c0830b1f7e0061cc850e0e183830803966e6ca9573ac785c6172c6cd0730d0ee7cb981e99e0f1639709e5d7bf9e6051002580f0001fbf6efddbf9f4fbfbefdfbf1edcb5fbf1f3efdfef805e85f7d00b257a08008ced79f7c03e427e081090e08000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffaf3075468cda217732e652a14e7478e3e0b4ca59ad569d29a587f3a58dab4ab83a148252234fb33a859921a7bb22d2b5668cbb81f7dd66dabd7edd9966bcd0e18e0d7afce9945fbea1dacd827d48a442b361ecc78ef638a81c552a6bcf7b0c8be94196c36ccf32a46d003448fd68b56e2cc830762cb9e4dfb00c2980b1d1cd03de04068df070cece65811b742dd0e06fb56ed7b807007c4311f2cd0bcf760d1d50f144008a03b0004debf8729071fbe3b79f3e5d3abf77e7ebdfaf6f0df8f774f1f7dfdf4f1d9cbd77f7ffd80fee5e5675f80f379070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff00 67 | 11081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39fcf020e1cd8fc58d1a2c29d2e3ffaf4075468cda21773fe6c9af323c7a00514682dd0d401559e2b5962c4ea606bd7af492522c4aa5501d7a05e8392d458136e56b376e1d26440f7a3ddb66fc9ca6db956f0000467f51e245a31af020303061898dc156a45c614ed4e8e7c18ab81a0962916f66a0001e7c8060a4c16ba58ac46bb9c097046bc7a28d29957b19e66c059f564db12671e3c40bcb8f1e30710c65ce8e080810303a07386eedc39c78acb1536871c5d366fe9cf0d5c3d177db080f4e89c199c3f50002180f70010c08f3f5ffefcfbefede3dfcf1fbefefef4f9575f7e001668207fff0d58e0000a1e28e0830ede97608404c2070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830505281480602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39fbf02051c38b0f9b1a245853b5d7e140a5428d199462fe6641a7428ce8f1c990a75d054eb509e2b5962f4cab52a57a760252224dbf5acd5831a6b6e35dbd62c4d067197b2a5bbf5ee5aaf0306f0757ab068c5b9 68 | 5b03fb74eb206a45c314113b08acf8e756c714ff9ea54cd932618333b332a5cc80b3ddb46235ce0d5cda745fb0080fc89e4dbbf6018431173a38b07bc001d2bf0f18e0cdb1626e85bb27fb1ed0faf780e10e8a673e58c0f972e6d77d174008a03b0004debf8728071fbe3b79f3e5d3abf77e7ebdfaf6f0df8f774f1f7dfdf4f1d9cbd77f7ffd80fee5b517e07ded010021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab5ca5669d3a14a9448458c5a625a9b1675aad63b3d264d056e95ba0fefc85a5da126dda0108f2e6ddaa7366d1b8060c0c182078ebd38a442b8e4dbc18b0de02067c3ea6e8f7a7010495171bc09cb9b0c8b19509544640fa334fab1851576650b9755989330f1ed8cdbbb7ef0308632e7470c0c08101c72b1f2f5e9c6345e10a892b46ae9a7672e3069c733e582039f2d9de0f14314008a03c0004e6cfa7479fbe7d79f6eee3cb370f7fbe7afaebdfdbdfcf5f7efdfcfb0d00607ff81548607bff1da89f79000021ff0b4e45545343415045322e30030100000021 69 | f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c806021430610190824409140c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab5ca5669d3a14a9448458a5faf31796a4c69e697fae5dbb952683b74ae31698ebaf6e4bb4690720d8cbb6ee41a215c73a306060c000c606b63ead8898e258c68e052f35e0733245c03f0d20c8ec383263aa8759621c9b9940e6c18b45f3b4ba7a296906990b402e2b71e6c103c0830b1f7e0061cc850e0e183830807966e6ca9573ac785c61f2c6cd5de376bedcc0f4cf070b38376f9e99c1f803051002580f0001fbf6efddbf9fbf5e3efdfbf8d9dbcf0f5f7ffcfaf9edc7df8004fa37e000ff15982080030a68a08203020021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f16f0e7ef67d3a435af7a5dca95ebd4a1482522c44ab6ec59841a7bb2d5ca752cd5967195ce65 70 | 3a97a65a8359a70e1830d5aece994503671dacd8e7d38a442b361eccd8ee638a6bb152a66cf8e04cb13f2933d85c18adc4b018030f1e4d3aabe9a1080fc89e4dbbf601b81a1d3a38b07bc001ca047e1f30c09b63c5980b773b18fc9bf5ef01c41d18c77cb0c073dfabb1332f801080770008be8329171f5ebcf7f2e7cdab5fff1d3dfbf5eee3c327ffbe7e7afbeae5b79fbf1f3ffb01fe99e79e80f8b9070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa04eacfdfd099452fe65cdad429ce8f1c97fafc59d55f50074f25ae9c99f5e756a6fecc82e53913a1d6a55fd592d4d8f3edcfb8716932a0abd42ed0b35bf5ba7d3b6000dec007895604ecb3306307512b2aa678b66961c76a21870c7970abe5cb8ef3266689d1f36506a0f3b2255b7a6961d4a903b34578a0b6eddbb80f208cb9d0c101df030e9c167ec0c06f8e15792bf4eda0b070d8c2071877809c22c202d183bfd6eebc004200e001202c082f9efc78f2e0cfa747cfbe7d78f5eedbc39f2fdf7cfcfbebf1b3a7ffbe7e7ffdee0d00207af011a81f7c000021ff0b4e455453434150 71 | 45322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3808102fe82dafc58d1a2c29d2e3ffa042ab466d18b399732cdf991a30307057cfeccbaf4ea50a435ad627520556b01af3c6722bcca75ab59af0835d6bc8ad56cdbb35e5bcafd48f7ee5dba34251eec1b740002bc3f011f245a916ed0c203de5e7d5a913145c7900d93cd3a3964c8c16cfd2118409af44f9f0e74b2c4d8b77482d287b57e951896355bd20470936e3b7b28c203c0830b1f7e20ae46870e0e183830807969e6ca9573ac1873617203a4993318c0c0f97203d329223b2ce0bc39e9ede50f144008a03d0004eedfc7871fbf7e7bfaf6f3ebdfaf1fbf7cf7fe01c8df80f505385f7f042638a07ff40d702081062a785f7c000021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d381830205fcf9b3f9b1a245853b5d7ef409d427d199462fe6645ac029ce8f1c99fafc5955ab83a71257ceccfa736b53af609f92f4cad5acd5 72 | 831a7b3215da962d4d067197fa142af46c59a72d116ee53b6040d7bf5f0f16ad68966e61b73ea356""" 73 | i2 = """c908010002b9180000db42cb1405000d5c4c1172e1c788255314acf5f265c43a5962347b9981e7c3696b92fd59d8f4e9ada9251e3c40bbb6eddb0710c65ce8e040ef01074a073f60c037c78abb15f6765038b8ebe0038a3b38bef96001e8c05b676f5e002180ef0010802a0f3f5efcf8efe6d19f5fcf1e7cfaf6ecdfcb8f5f1ebe7df5f7d7cf774f9f7ffef603fc77de7b03e6f71e0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab3ffdf9d39a75ea50a41211fa142b962956aa0835f65ccbd62d57a12de52a5d2a96ec5baa2dd5be1d8060eb569d338b967560c0c080018d0d6c7d5a9168c5b28d1f135e6ac027658a827f1a40a0f9b1e4c6700dce04fb533301cd85198fe6691563d9d20c3417887c56e2cc8307820b1f4efc405c8d0e1d1c3070604073cdcd972fe75831e642e58e9dbfcefd9cb901eaa00f163878ee5c3303f2070a2004c01e0082f6eee1bf874f9ffdfcfaf8f3b7bfaf3ffe7ef9f6e9c75f7f0416f81f81030068a082011238e0810b12080021ff0b4e455453 74 | 43415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b39fdfd0cea20e7478e3efd69f5c77469d3a435b13ad8ca95eacfaf4825225caa75aacfb355116aece975a959b33419cc555ad76ddfbc6beb0e4070f7adce9945df06356060c000c606cc3ead48b4a262c68e072f35e07332c5c03f0d20c8ec3832e3b806678afd99394166c2a787a6658951b16302b71d17802c5be2cc8307820b1f4efc805c8d0e1d1c30706040f3cccd972fe75831e642e58d9d0f60b0fd397303d43f1f372cf05cfb76f3ce0b2004c01e0082f6eee1bf874fbfbefdfbf8e5df9fcf9e7ffcfafee527e07f03ea57e07e05fa37df00071ad8a082f0010021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39f8302051c38b0f9b1a245853b5d7ef4e70fa850a2338d5eccc9d4e9509c1f390a2dc0f467d0ad4f79ae648911ecd6af3fc32a9588d0ac57a1 75 | 69af1ed458132e5aab7187b6a4fbd1aeddbb7069b235e8d7c10004809f1e2c5ad1af010303063c3680566a45c614ed3e8e7c78ab01a19629b6f58c807364ca8fe5169ca9752b67029c113b780c5562cdd63f4d33e05c60726da2080f081f4ebcf8018431173a3860e0c000e79c9d3367ceb1627285cb213f87bd1b7a7303d5451f392c00fd396706e50f144008a03d0004eedfc7871fbf7e7bfaf6f3eb778f7fbf7cfef3ddb75f7ffe15682080050e10e0810b0a582081083258200021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39fbf02051c38b0f9b1a245853b5d7ef4e700a850a2338d5ecc29d4e9509c1f395615da34e8d6a13c57b2c4f8b52b57af5025de3c58d66ad3a70835d63c7bd6ebdba72de57ea45bd5ae5d9a12d97e1d80c02f579d512bd2f539608081c776a5562caab82ae3c608aa1a102a9922c2b3fe10341e6da0c0e3ab06676aad3a3ac1e8c2a7d3ca5edd74f40006a34d3f963df3e081dfc0830b3f1057a34307070c1c18b07cf4f2e4c939568cb910b981c60708dc66de58b901e99e0f163968cebd3103f2070a2004c01e0082f6eee1bf874f9ffdfcfaf8f3 76 | b7bfaf3ffe7ef9f6f527e080f9f107a080031c48e07f0c2e489f810e06d81e0021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab5ca5669d3a14a9448458c5a625a9b1675aad63b3d264d05629567ffe98be9d8b7629de0103b66ed539b3e858bcfe00c7f5f9b422d18a7113031ef0b631c5be5c274f0e4bf5e04cb03f2733d03c98a7558c63018f262dd734c203b063cb9e7d0061cc850e0ee41e704074ef03067473ac785b616e07807bafee3d20b883e1970f1660ce5b75f5e4051002d80e0001f7eedfbd7f24df2e9efcf8f3e8d3ab1f5f1e3c77f1ede3af9f4f1f7dfbf403c2d767af7ffefdf7fbd5070021ff0b4e45545343415045322e30030100000021f904093200ff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3808102057cdafc58d1a2c29d2e3ffa042ab466d18b3997063590f32347070ea6fed45a00eb 77 | 50a435af66f5b9956c57075f25de3c8835a83f7f4c977a45a8b126d6ac6fdf72bd4b9341dd8f770be4856b966f4b84810df81b80a0abdcb90689564cec73c080c2589f56944c91b265c60e7e1ac81c3224dbb6543f5b163d5a274b8c813f27f8dc986cdadb62b3aa66f059ebed99070f081f4ebcf801ba1a1d3a3860e0c000e79f9d3367ceb162cc85cb0d583e4060006fe8cd0d543da788b000f4e79f199c3f50002180f70010c08f3f5ffefcfbefede3dfcf1fbefefef4f9575f7e001668207fff0d58e0000a1e28e0830ede97608404c207003b""" 78 | 79 | i1_hex = bytearray.fromhex(i1) 80 | i2_hex = bytearray.fromhex(i2) 81 | 82 | header1 = i1_hex[:16] 83 | header2 = i2_hex[:16] 84 | 85 | i1_hex = i1_hex[16:] # remove header 86 | i2_hex = i2_hex[16:] # remove header 87 | 88 | #with open('test.4.gif', 'wb') as f: 89 | # f.write(i1_hex) 90 | # f.write(i2_hex) 91 | 92 | #i1 = bytearray.fromhex("""1010010000b918000040fb36e105000d47494638396120002000f7ff00fedb96aa7353a97254fea800b269402b2b2b3b3a3a010101ffb68bb26a413c3a3afea800aa5b2f2b2b2b3b3939010101a972543c3a3aa97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a97254a9725456555400000021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a50efcf9638a952acf952c312ed5aa75eacfa64925221c4bd6ec54921a7b622debd627d596719576fd595768cbb55d0720e84bf520d18a76831a303060c06203669f563c4c31f1e2c682971af0299922e09f0610606e0c7971618333af2ec59c00f3e0cda1bfa616bb7a0081c6b70714783c1429c203c0830b1f7e0061cc850e0e183830803966e6ca9573ac785c6172c6cd0730d0ee7cb981e99e0f1639709e5d7bf9e6051002580f0001fbf6efddbf9f4fbfbefdfbf1edcb5fbf1f3efdfef805e85f7d00b257a08008ced79f7c03e427e081090e08000021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffaf3075468cda217732e652a14e7478e3e0b4ca59ad569d29a587f3a58dab4ab83a148252234fb33a859921a7bb22d2b5668cbb81f7dd66dabd7edd9966bcd0e18e0d7afce9945fbea1dacd827d48a442b361ecc78ef638a81c552a6bcf7b0c8be94196c36ccf32a46d003448fd68b56e2cc830762cb9e4dfb00c2980b1d1cd03de04068df070cece65811b742dd0e06fb56ed7b807007c4311f2cd0bcf760d1d50f144008a03b0004debf8729071fbe3b79f3e5d3abf77e7ebdfaf6f0df8f774f1f7dfdf4f1d9cbd77f7ffd80fee5e5675f80f379070021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39fcf020e1cd8fc58d1a2c29d2e3ffaf4075468cda21773fe6c9af323c7a00514682dd0d401559e2b5962c4ea606bd7af492522c4aa5501d7a05e8392d458136e56b376e1d26440f7a3ddb66fc9ca6db956f0000467f51e245a31af020303061898dc156a45c614ed4e8e7c18ab81a0962916f66a0001e7c8060a4c16ba58ac46bb9c097046bc7a28d29957b19e66c059f564db12671e3c40bcb8f1e30710c65ce8e080810303a07386eedc39c78acb1536871c5d366fe9cf0d5c3d177db080f4e89c199c3f50002180f70010c08f3f5ffefcfbefede3dfcf1fbefefef4f9575f7e001668207fff0d58e0000a1e28e0830ede97608404c2070021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830505281480602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39fbf02051c38b0f9b1a245853b5d7e140a5428d199462fe6641a7428ce8f1c990a75d054eb509e2b5962f4cab52a57a760252224dbf5acd5831a6b6e35dbd62c4d067197b2a5bbf5ee5aaf0306f0757ab068c5b95b03fb74eb206a45c314113b08acf8e756c714ff9ea54cd932618333b332a5cc80b3ddb46235ce0d5cda745fb0080fc89e4dbbf6018431173a38b07bc001d2bf0f18e0cdb1626e85bb27fb1ed0faf780e10e8a673e58c0f972e6d77d174008a03b0004debf8728071fbe3b79f3e5d3abf77e7ebdfaf6f0df8f774f1f7dfdf4f1d9cbd77f7ffd80fee5b517e07ded010021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab5ca5669d3a14a9448458c5a625a9b1675aad63b3d264d056e95ba0fefc85a5da126dda0108f2e6ddaa7366d1b8060c0c182078ebd38a442b8e4dbc18b0de02067c3ea6e8f7a7010495171bc09cb9b0c8b19509544640fa334fab1851576650b9755989330f1ed8cdbbb7ef0308632e7470c0c08101c72b1f2f5e9c6345e10a892b46ae9a7672e3069c733e582039f2d9de0f14314008a03c0004e6cfa7479fbe7d79f6eee3cb370f7fbe7afaebdfdbdfcf5f7efdfcfb0d00607ff81548607bff1da89f79000021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c806021430610190824409140c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab5ca5669d3a14a9448458a5faf31796a4c69e697fae5dbb952683b74ae31698ebaf6e4bb4690720d8cbb6ee41a215c73a306060c000c606b63ead8898e258c68e052f35e0733245c03f0d20c8ec383263aa8759621c9b9940e6c18b45f3b4ba7a296906990b402e2b71e6c103c0830b1f7e0061cc850e0e183830807966e6ca9573ac785c61f2c6cd5de376bedcc0f4cf070b38376f9e99c1f803051002580f0001fbf6efddbf9fbf5e3efdfbf8d9dbcf0f5f7ffcfaf9edc7df8004fa37e000ff15982080030a68a08203020021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f16f0e7ef67d3a435af7a5dca95ebd4a1482522c44ab6ec59841a7bb2d5ca752cd5967195ce653a97a65a8359a70e1830d5aece994503671dacd8e7d38a442b361eccd8ee638a6bb152a66cf8e04cb13f2933d85c18adc4b018030f1e4d3aabe9a1080fc89e4dbbf601b81a1d3a38b07bc001ca047e1f30c09b63c5980b773b18fc9bf5ef01c41d18c77cb0c073dfabb1332f801080770008be8329171f5ebcf7f2e7cdab5fff1d3dfbf5eee3c327ffbe7e7afbeae5b79fbf1f3ffb01fe99e79e80f8b9070021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa04eacfdfd099452fe65cdad429ce8f1c97fafc59d55f50074f25ae9c99f5e756a6fecc82e53913a1d6a55fd592d4d8f3edcfb8716932a0abd42ed0b35bf5ba7d3b6000dec007895604ecb3306307512b2aa678b66961c76a21870c7970abe5cb8ef3266689d1f36506a0f3b2255b7a6961d4a903b34578a0b6eddbb80f208cb9d0c101df030e9c167ec0c06f8e15792bf4eda0b070d8c2071877809c22c202d183bfd6eebc004200e001202c082f9efc78f2e0cfa747cfbe7d78f5eedbc39f2fdf7cfcfbebf1b3a7ffbe7e7ffdee0d00207af011a81f7c000021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3808102fe82dafc58d1a2c29d2e3ffa042ab466d18b399732cdf991a30307057cfeccbaf4ea50a435ad627520556b01af3c6722bcca75ab59af0835d6bc8ad56cdbb35e5bcafd48f7ee5dba34251eec1b740002bc3f011f245a916ed0c203de5e7d5a913145c7900d93cd3a3964c8c16cfd2118409af44f9f0e74b2c4d8b77482d287b57e951896355bd20470936e3b7b28c203c0830b1f7e20ae46870e0e183830807969e6ca9573ac1873617203a4993318c0c0f97203d329223b2ce0bc39e9ede50f144008a03d0004eedfc7871fbf7e7bfaf6f3ebdfaf1fbf7cf7fe01c8df80f505385f7f042638a07ff40d702081062a785f7c000021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d381830205fcf9b3f9b1a245853b5d7ef409d427d199462fe6645ac029ce8f1c99fafc5955ab83a71257ceccfa736b53af609f92f4cad5acd5831a7b3215da962d4d067197fa142af46c59a72d116ee53b6040d7bf5f0f16ad68966e61b73ea356c908010002b918000040fb36e105000d5c4c1172e1c788255314acf5f265c43a5962347b9981e7c3696b92fd59d8f4e9ada9251e3c40bbb6eddb0710c65ce8e040ef01074a073f60c037c78abb15f6765038b8ebe0038a3b38bef96001e8c05b676f5e002180ef0010802a0f3f5efcf8efe6d19f5fcf1e7cfaf6ecdfcb8f5f1ebe7df5f7d7cf774f9f7ffef603fc77de7b03e6f71e0021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab3ffdf9d39a75ea50a41211fa142b962956aa0835f65ccbd62d57a12de52a5d2a96ec5baa2dd5be1d8060eb569d338b967560c0c080018d0d6c7d5a9168c5b28d1f135e6ac027658a827f1a40a0f9b1e4c6700dce04fb533301cd85198fe6691563d9d20c3417887c56e2cc8307820b1f4efc405c8d0e1d1c3070604073cdcd972fe75831e642e58e9dbfcefd9cb901eaa00f163878ee5c3303f2070a2004c01e0082f6eee1bf874f9ffdfcfaf8f3b7bfaf3ffe7ef9f6e9c75f7f0416f81f81030068a082011238e0810b12080021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b39fdfd0cea20e7478e3efd69f5c77469d3a435b13ad8ca95eacfaf4825225caa75aacfb355116aece975a959b33419cc555ad76ddfbc6beb0e4070f7adce9945df06356060c000c606cc3ead48b4a262c68e072f35e07332c5c03f0d20c8ec3832e3b806678afd99394166c2a787a6658951b16302b71d17802c5be2cc8307820b1f4efc805c8d0e1d1c30706040f3cccd972fe75831e642e58d9d0f60b0fd397303d43f1f372cf05cfb76f3ce0b2004c01e0082f6eee1bf874fbfbefdfbf8e5df9fcf9e7ffcfafee527e07f03ea57e07e05fa37df00071ad8a082f0010021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39f8302051c38b0f9b1a245853b5d7ef4e70fa850a2338d5eccc9d4e9509c1f390a2dc0f467d0ad4f79ae648911ecd6af3fc32a9588d0ac57a169af1ed458132e5aab7187b6a4fbd1aeddbb7069b235e8d7c10004809f1e2c5ad1af010303063c3680566a45c614ed3e8e7c78ab01a19629b6f58c807364ca8fe5169ca9752b67029c113b780c5562cdd63f4d33e05c60726da2080f081f4ebcf8018431173a3860e0c000e79c9d3367ceb1627285cb213f87bd1b7a7303d5451f392c00fd396706e50f144008a03d0004eedfc7871fbf7e7bfaf6f3eb778f7fbf7cfef3ddb75f7ffe15682080050e10e0810b0a582081083258200021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d39fbf02051c38b0f9b1a245853b5d7ef4e700a850a2338d5ecc29d4e9509c1f395615da34e8d6a13c57b2c4f8b52b57af5025de3c58d66ad3a70835d63c7bd6ebdba72de57ea45bd5ae5d9a12d97e1d80c02f579d512bd2f539608081c776a5562caab82ae3c608aa1a102a9922c2b3fe10341e6da0c0e3ab06676aad3a3ac1e8c2a7d3ca5edd74f40006a34d3f963df3e081dfc0830b3f1057a34307070c1c18b07cf4f2e4c939568cb910b981c60708dc66de58b901e99e0f163968cebd3103f2070a2004c01e0082f6eee1bf874f9ffdfcfaf8f3b7bfaf3ffe7ef9f6f527e080f9f107a080031c48e07f0c2e489f810e06d81e0021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3818302057cdafc58d1a2c29d2e3ffa042ab466d18b3997067590f323c7a53e7f4efdd93469cdab5ca5669d3a14a9448458c5a625a9b1675aad63b3d264d05629567ffe98be9d8b7629de0103b66ed539b3e858bcfe00c7f5f9b422d18a7113031ef0b631c5be5c274f0e4bf5e04cb03f2733d03c98a7558c63018f262dd734c203b063cb9e7d0061cc850e0ee41e704074ef03067473ac785b616e07807bafee3d20b883e1970f1660ce5b75f5e4051002d80e0001f7eedfbd7f24df2e9efcf8f3e8d3ab1f5f1e3c77f1ede3af9f4f1f7dfbf403c2d767af7ffefdf7fbd5070021ff0b4e45545343415045322e30030100000021f90409f7ffff002c00000000200020000708ff0011081c48b0a0c1830503280c80602143061019084c403141c38517150a7498f161c489153b8a4448b264c1901c394694a8f2634494185b4214b912c147933811ceac59d3808102057cdafc58d1a2c29d2e3ffa042ab466d18b3997063590f32347070ea6fed45a00eb50a435af66f5b9956c57075f25de3c8835a83f7f4c977a45a8b126d6ac6fdf72bd4b9341dd8f770be4856b966f4b84810df81b80a0abdcb90689564cec73c080c2589f56944c91b265c60e7e1ac81c3224dbb6543f5b163d5a274b8c813f27f8dc986cdadb62b3aa66f059ebed99070f081f4ebcf801ba1a1d3a3860e0c000e79f9d3367ceb162cc85cb0d583e4060006fe8cd0d543da788b000f4e79f199c3f50002180f70010c08f3f5ffefcfbefede3dfcf1fbefefef4f9575f7e001668207fff0d58e0000a1e28e0830ede97608404c207003b""") 93 | 94 | #with open('test.5.gif', 'wb') as f: 95 | # f.write(i1[16:]) 96 | 97 | 98 | print(' '.join('{:02x}'.format(x) for x in header1)) 99 | print(' '.join('{:02x}'.format(x) for x in header2)) 100 | 101 | print(f"1st actual payload size:\t\t\t{hex(len(i1_hex+header1))} \t| {len(i1_hex+header1)}") 102 | print(f"2nd actual payload size:\t\t\t{hex(len(i2_hex+header2))} \t| {len(i2_hex+header2)}") 103 | print(f"1st indicated payload size:\t\t\t{hex(int.from_bytes(header1[0:2], 'little'))} \t| {int.from_bytes(header1[0:2], 'little')}") 104 | print(f"2nd indicated payload size:\t\t\t{hex(int.from_bytes(header2[0:2], 'little'))} \t| {int.from_bytes(header2[0:2], 'little')}") 105 | 106 | print(f"Total payload size not including headers:\t{hex(len(i1_hex)+len(i2_hex))} \t| {len(i1_hex)+len(i2_hex)}") 107 | 108 | c = zlib.crc32(i1_hex+i2_hex) 109 | print(f"{hex(c.to_bytes(4, 'little')[0])} {hex(c.to_bytes(4, 'little')[1])} {hex(c.to_bytes(4, 'little')[2])} {hex(c.to_bytes(4, 'little')[3])}") 110 | #print(hex(c.to_bytes(4, 'little')[1])) 111 | #print(hex(c.to_bytes(4, 'little')[2])) 112 | #print(hex(c.to_bytes(4, 'little')[3])) 113 | 114 | 115 | 116 | i = bytearray.fromhex("1a 04 01 00 00 2a 04 00 00 f9 79 ee 40 05 00 0d 47 49 46 38 39 61 20 00 20 00 87 00 00 20 57 1e 17 97 16 5b 20 1d 5a 5a 12 5c 99 0b 98 9c 09 95 5f 0c 2e 2b 18 70 ce 04 91 d0 03 2f cd 04 1b 35 1c 21 21 21 35 19 1c 18 2b 2f 12 5b 57 04 ce 2f 0b 9a 5b 03 d0 4f 4d d1 03 1d 1f 5c 03 cf 71 09 9b 99 0c 5f 93 1b 19 34 03 d0 91 29 18 2a 03 d2 b2 17 16 94 03 b2 ce 37 3c a8 04 71 c8 03 8f ce 1a 60 cb 28 48 c6 59 12 59 04 4d ca 5e 0b 98 05 30 c2 2f 05 c8 28 25 ca 4d 03 cf 70 03 d0 9b 09 9a 9a 0b 5c 91 20 cd 94 17 17 b2 03 cf d4 02 b0 d2 03 91 cf 03 70 c2 1b 43 c8 30 05 d1 03 4d cd 4d 04 cb 71 04 cc 04 2d cd 8f 04 cd 26 23 ce b2 04 d4 d6 00 b0 d3 03 00 00 00 00 00 00 40 40 40 41 41 41 42 42 42 43 43 43 44 44 44 45 45 45 46 46 46 47 47 47 48 48 48 49 49 49 4a 4a 4a 4b 4b 4b 4c 4c 4c 4d 4d 4d 4e 4e 4e 4f 4f 4f 50 50 50 51 51 51 52 52 52 53 53 53 54 54 54 55 55 55 56 56 56 57 57 57 58 58 58 59 59 59 5a 5a 5a 5b 5b 5b 5c 5c 5c 5d 5d 5d 5e 5e 5e 5f 5f 5f 60 60 60 61 61 61 62 62 62 63 63 63 64 64 64 65 65 65 66 66 66 67 67 67 68 68 68 69 69 69 6a 6a 6a 6b 6b 6b 6c 6c 6c 6d 6d 6d 6e 6e 6e 6f 6f 6f 70 70 70 71 71 71 72 72 72 73 73 73 74 74 74 75 75 75 76 76 76 77 77 77 78 78 78 79 79 79 7a 7a 7a 7b 7b 7b 7c 7c 7c 7d 7d 7d 7e 7e 7e 7f 7f 7f 80 80 80 81 81 81 82 82 82 83 83 83 84 84 84 85 85 85 86 86 86 87 87 87 88 88 88 89 89 89 8a 8a 8a 8b 8b 8b 8c 8c 8c 8d 8d 8d 8e 8e 8e 8f 8f 8f 90 90 90 91 91 91 92 92 92 93 93 93 94 94 94 95 95 95 96 96 96 97 97 97 98 98 98 99 99 99 9a 9a 9a 9b 9b 9b 9c 9c 9c 9d 9d 9d 9e 9e 9e 9f 9f 9f a0 a0 a0 a1 a1 a1 a2 a2 a2 a3 a3 a3 a4 a4 a4 a5 a5 a5 a6 a6 a6 a7 a7 a7 a8 a8 a8 a9 a9 a9 aa aa aa ab ab ab ac ac ac ad ad ad ae ae ae af af af b0 b0 b0 b1 b1 b1 b2 b2 b2 b3 b3 b3 b4 b4 b4 b5 b5 b5 b6 b6 b6 b7 b7 b7 b8 b8 b8 b9 b9 b9 ba ba ba bb bb bb bc bc bc bd bd bd be be be bf bf bf c0 c0 c0 c1 c1 c1 c2 c2 c2 c3 c3 c3 c4 c4 c4 c5 c5 c5 c6 c6 c6 c7 c7 c7 c8 c8 c8 c9 c9 c9 ca ca ca cb cb cb cc cc cc cd cd cd ce ce ce cf cf cf d0 d0 d0 d1 d1 d1 d2 d2 d2 d3 d3 d3 d4 d4 d4 d5 d5 d5 d6 d6 d6 d7 d7 d7 d8 d8 d8 d9 d9 d9 da da da db db db dc dc dc dd dd dd de de de df df df e0 e0 e0 e1 e1 e1 e2 e2 e2 e3 e3 e3 e4 e4 e4 e5 e5 e5 e6 e6 e6 e7 e7 e7 e8 e8 e8 e9 e9 e9 ea ea ea eb eb eb ec ec ec ed ed ed ee ee ee ef ef ef f0 f0 f0 f1 f1 f1 f2 f2 f2 f3 f3 f3 f4 f4 f4 f5 f5 f5 f6 f6 f6 f7 f7 f7 f8 f8 f8 f9 f9 f9 fa fa fa fb fb fb fc fc fc fd fd fd fe fe fe ff ff ff 21 f9 04 01 02 00 0e 00 21 ff 0b 4e 45 54 53 43 41 50 45 32 2e 30 03 01 00 00 00 2c 00 00 00 00 20 00 20 00 40 08 d4 00 19 08 1c 48 b0 a0 c1 83 08 13 2a 5c 28 10 40 c1 00 01 16 00 88 08 00 c1 00 01 03 0b 10 c4 c8 90 60 00 02 0e 05 1e 28 30 a0 a3 c9 93 28 09 1e 68 c0 b2 e3 02 06 01 1a 3a 0c 00 60 00 81 92 07 06 0c 18 29 80 63 ca 9f 40 83 0a 1d 0a 54 62 48 06 00 92 16 1c 60 c0 40 49 81 2d 0d 2e 78 39 30 22 4c 98 0e 09 30 78 2a 50 23 83 a8 08 29 c6 14 18 51 ab cd 81 4c 89 aa 5d cb b6 ad db b7 70 e3 b6 35 0a 80 aa c1 03 07 06 82 95 7a b4 a1 02 88 0c 16 20 c8 29 50 e7 40 9f 04 a7 12 9c 68 94 e6 81 c1 5c d3 0a 44 3c 30 e9 54 9a 64 b1 2e 48 c0 80 70 d7 c9 0b 27 22 1d 4b 93 c0 02 af 93 0b e4 65 b8 00 70 d5 05 5a b7 aa 1e 80 ba 68 6c b9 b8 73 2f 0c 08 00 3b") 117 | print(i) 118 | -------------------------------------------------------------------------------- /tools/plot_hex_grid.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | from PIL import Image, ImageDraw, ImageFont 4 | import zlib 5 | 6 | def plot_hex_grid(hex_string, width, height, little_endian=False): 7 | l = len(hex_string) 8 | byte_data = bytes.fromhex(hex_string) 9 | grid = [['.' for _ in range(width)] for _ in range(height)] 10 | # Iterate through each byte in the data 11 | for i in range(0, len(byte_data), 2): 12 | # Convert two bytes to a 16-bit integer 13 | if little_endian: 14 | pixel_value = int.from_bytes(byte_data[i:i + 2], byteorder='little') 15 | else: 16 | pixel_value = int.from_bytes(byte_data[i:i + 2], byteorder='big') 17 | # Iterate through each bit in the 16-bit integer 18 | for j in range(16): 19 | # Extract the j-th bit 20 | bit = (pixel_value >> (15 - j)) & 1 21 | # Map 1 to 'X' and 0 to '.' 22 | if little_endian: 23 | grid[i // 2][width - 1 - j] = 'X' if bit else '.' 24 | else: 25 | grid[i // 2][j] = 'X' if bit else '.' 26 | for row in grid: 27 | print(''.join(row)) 28 | 29 | 30 | def set_text(text, text_colour=(255,0,0), text_colour_effect=0, background_colour=(0,0,0), background_colour_effect=0, speed=50,font_path=None): 31 | # Set default font if none provided 32 | if font_path is None: 33 | font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf" 34 | # Adjust font size as needed to fit in 16x32 grid 35 | font_size = 24 # This may need tweaking depending on the font and desired appearance 36 | font = ImageFont.truetype(font_path, font_size) 37 | bitmaps = [] 38 | for char in text: 39 | # Create image with a 16 (width) x 32 (height) grid 40 | image = Image.new('1', (16, 32), 0) # Background is black 0 - could be changed to 1 for white for inverted text 41 | draw = ImageDraw.Draw(image) 42 | # Calculate text position to center it in the grid 43 | text_width, text_height = draw.textsize(char, font=font) 44 | text_x = (16 - text_width) // 2 45 | text_y = (32 - text_height) // 2 46 | # Draw the character 47 | draw.text((text_x, text_y), char, 1, font=font) # 1 for white text 48 | # Convert to bitmap and add to list 49 | bitmap = image.load() 50 | bitmaps.append([[bitmap[x, y] for x in range(16)] for y in range(32)]) 51 | print(bitmaps) 52 | return bitmaps 53 | 54 | def string_to_bitmaps(input_string, font_path=None): 55 | if font_path is None: 56 | font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf" 57 | 58 | font_size = 24 59 | font = ImageFont.truetype(font_path, font_size) 60 | 61 | hex_strings = [] 62 | 63 | for char in input_string: 64 | image = Image.new('1', (16, 32), 0) 65 | draw = ImageDraw.Draw(image) 66 | 67 | text_width, text_height = draw.textsize(char, font=font) 68 | text_x = (16 - text_width) // 2 69 | text_y = (32 - text_height) // 2 70 | 71 | draw.text((text_x, text_y), char, 1, font=font) 72 | 73 | bitmap = image.load() 74 | byte = 0 75 | bit_count = 0 76 | hex_string = "" 77 | hex_string+= "05ffffff" 78 | 79 | 80 | for y in range(32): 81 | for x in range(16): 82 | # Accumulate bits in little-endian order 83 | byte |= (bitmap[x, y] << bit_count) 84 | bit_count += 1 85 | 86 | if bit_count == 8 or (x == 15 and y == 31): 87 | hex_string += '{:02x}'.format(byte) 88 | byte = 0 89 | bit_count = 0 90 | 91 | hex_strings.append(hex_string) 92 | 93 | return hex_strings 94 | 95 | def iterate_values(hex_string): 96 | # Convert hex string to bytes 97 | # This is super janky and needs to parse the strings much more reliably. But we only need to encode really, so not really bothered. 98 | byte_data = bytes.fromhex(hex_string) 99 | print(f"Length of byte data: {len(byte_data)}") 100 | if byte_data[0] == 0xff: 101 | # This indicates that it is a continuation of the previous payload I think. Hack it to make it work. 102 | byte_data = byte_data[1:] 103 | # and pre-pend the marker 104 | byte_data = bytes.fromhex("05ffffff") + byte_data 105 | 106 | # Find occurrences of "05ffffff" 107 | pattern = bytes.fromhex("05ffffff") 108 | start_index = 0 109 | occurrences = [] 110 | 111 | while start_index < len(byte_data): 112 | index = byte_data.find(pattern, start_index) 113 | print(index) 114 | if index == -1: 115 | break 116 | occurrences.append(index) 117 | start_index = index + len(pattern) 118 | 119 | # Extract bytes for each occurrence 120 | terminator_pattern = bytes.fromhex("05ffff") 121 | for i, start in enumerate(occurrences): 122 | end = occurrences[i + 1] if i + 1 < len(occurrences) else len(byte_data) 123 | result_bytes = byte_data[start + len(pattern):end] 124 | # Strip and dangling separator bytes 125 | index = result_bytes.find(terminator_pattern) 126 | print(f"Index: {index}") 127 | if index != -1: 128 | result_bytes = result_bytes[:index] 129 | result_hex_string = ''.join(format(byte, '02X') for byte in result_bytes) 130 | print(result_hex_string) 131 | plot_hex_grid(result_hex_string, 16, 32, little_endian=True) 132 | 133 | 134 | def print_bitmaps(bitmaps): 135 | for bitmap in bitmaps: 136 | for row in bitmap: 137 | print(''.join(['X' if pixel else '.' for pixel in row])) 138 | print("\n") 139 | 140 | def build_string_packet(text_bitmaps, text_mode=0, speed=100, text_colour_mode=1, text_colour=(255,0,0), text_bg_mode=0, text_bg_colour=(0,0,0)): 141 | # text_bitmaps is a bytearray and we assume it is correctly formatted 142 | separator = bytearray.fromhex("05 FF FF FF") 143 | num_chars = text_bitmaps.count(separator) 144 | 145 | text_metadata = bytearray.fromhex("FF FF 00 01 00 00 00 00 00 00 00 00 00 00") 146 | text_metadata[0] = num_chars.to_bytes(2, byteorder='little')[0] 147 | text_metadata[1] = num_chars.to_bytes(2, byteorder='little')[1] 148 | text_metadata[4] = text_mode 149 | text_metadata[5] = speed 150 | text_metadata[6] = text_colour_mode 151 | text_metadata[7] = text_colour[0] # r 152 | text_metadata[8] = text_colour[1] # g 153 | text_metadata[9] = text_colour[2] # b 154 | text_metadata[10] = text_bg_mode 155 | text_metadata[11] = text_bg_colour[0] # r 156 | text_metadata[12] = text_bg_colour[1] # g 157 | text_metadata[13] = text_bg_colour[2] # b 158 | 159 | packet = text_metadata + text_bitmaps 160 | 161 | header = bytearray.fromhex("FF FF 03 00 00 FF FF FF FF FF FF FF FF 00 00 0c") 162 | total_len = len(packet) + len(header) 163 | header[0] = total_len.to_bytes(2, byteorder='little')[0] 164 | header[1] = total_len.to_bytes(2, byteorder='little')[1] 165 | # header[2] = total_len.to_bytes(4, byteorder='little')[2] 166 | # header[3] = total_len.to_bytes(4, byteorder='little')[3] 167 | 168 | textmeta_and_bitmaps = len(packet) 169 | header[5] = textmeta_and_bitmaps.to_bytes(4, byteorder='little')[0] 170 | header[6] = textmeta_and_bitmaps.to_bytes(4, byteorder='little')[1] 171 | header[7] = textmeta_and_bitmaps.to_bytes(4, byteorder='little')[2] 172 | header[8] = textmeta_and_bitmaps.to_bytes(4, byteorder='little')[3] 173 | crc = zlib.crc32(packet) 174 | header[9] = crc.to_bytes(4, byteorder='little')[0] 175 | header[10] = crc.to_bytes(4, byteorder='little')[1] 176 | header[11] = crc.to_bytes(4, byteorder='little')[2] 177 | header[12] = crc.to_bytes(4, byteorder='little')[3] 178 | 179 | return header + packet 180 | 181 | 182 | # Copy and paste a line from tshark which contains only the values 183 | # The we will extract the letter and print it on a grid maybe. 184 | 185 | # an actual hash #hash_value = "62000300005200000032a4a8c500000c010000010000010000ff0000000005ffffff00000000000000000000000020102010201020102010fe7ffe7ffe7f100810081008100810081008fe7ffe7ffe7f180c08040804080408040000000000000000" 186 | # my generated text: "05ffffff00000000000000000000000000000000000000000000303030303030303030303ff03ff030303030303030303030000000000000000000000000000000000000" 187 | # a w # hash_value = "620003000052000000b2f4c89a00000c010000010000010000ff0000000005ffffff000000000000000000008ee38ee38ee38ee39c739c729c72dc76dc76dc76dc76d836d836f83ef83ef83e783c783c701c701c701c000000000000000000000000" 188 | # hash_value = "620003000052000000934dbb8c00000c010000010000010000ff0000000005ffffff00000000000000000000e007f00f381e1c1c1c380c380e380e000e000e000e3f0e3f0e380e380e380e381c381c3c383ef03fe033000000000000000000000000" 189 | multi_char = "0a03030000fa0200000914ec8300000c0b000001016201ff00000000000005ffffff000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c180e38fe3ffe3f0e000e000e381c383c1cf80fe00300000000000000000000000005ffffff0000000000000000000080038003800380038003800380038003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff0000000000000000000080038003800380038003800380038003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f00f381c1c380e700e700e700e700e700e701c38381cf00fe00700000000000000000000000005ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005ffff" 190 | continuation = "ff000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c180e38fe3ffe3f0e000e000e381c383c1cf80fe00300000000000000000000000005ffffff000000000000000000000000000000000000000000000000380e380fb80ff801f80078003800380038003800380038003800380000000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c180e38fe3ffe3f0e000e000e381c383c1cf80fe003000000000000000000000000" 191 | #plot_hex_grid(trimmed_hash_value, 16, 32, little_endian=True) 192 | 193 | #iterate_values(multi_char) 194 | #iterate_values(continuation) 195 | #plot_hex_grid("0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f000000000000000000000000", 16, 32, little_endian=True) 196 | 197 | a = set_text("hello") 198 | print_bitmaps(a) 199 | 200 | # hex_output = string_to_bitmaps("Hello") 201 | # for i, hex_string in enumerate(hex_output): 202 | # print(f"Character {i}: {hex_string}") 203 | 204 | # multi_char = ''.join([''.join(lst) for lst in hex_output]) 205 | # print(multi_char) 206 | # #plot_hex_grid("000000000000000000000000000000000000000000000c0c0c0c0c0c0c0c0c0cfc0ffc0f0c0c0c0c0c0c0c0c0c0c000000000000000000000000000000000000", 16, 32, little_endian=True) 207 | 208 | # iterate_values(multi_char) 209 | 210 | # test_packet_from_device = """8202030000720200009f93adf900000c09000001016401ff00000000000005ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c380e380e000e000e000e380e381c3c3c1cf80fe00300000000000000000000000005ffffff000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000380e380fb80ff801f80078003800380038003800380038003800380000000000000000000000000005ffffff0000000000000000000080038003800300000000000000008003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f81f3c3c1c381c003c00f807e01f003c1c381c38383cf81fe00700000000000000000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005ffffff000000000000000000000000000000000000000000000000ce79feff9ee78ee38ee38ee38ee38ee38ee38ee38ee38ee38ee38ee300000000000000000000000005ffff 211 | # ff000000000000000000000000000000000000000000000000c00ff01f783c38380038003ee03ff83b3c381c381c3c3c3ef83ff07900000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f81f3c3c1c381c003c00f807e01f003c1c381c38383cf81fe007000000000000000000000000 212 | # """ 213 | 214 | # bitmap_from_test_packet = """05ffffff000000000000000000000000000000000000000000000000e007f80f3c1c1c380e380e000e000e000e380e381c3c3c1cf80fe00300000000000000000000000005ffffff000000000000000000001c001c001c001c001c001c001c009c0fdc1f7c3c3c383c381c381c381c381c381c381c381c381c381c3800000000000000000000000005ffffff000000000000000000000000000000000000000000000000380e380fb80ff801f80078003800380038003800380038003800380000000000000000000000000005ffffff0000000000000000000080038003800300000000000000008003800380038003800380038003800380038003800380038003800300000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f81f3c3c1c381c003c00f807e01f003c1c381c38383cf81fe00700000000000000000000000005ffffff0000000000000000000000000000e000e000e000e000e000fe1ffe1fe000e000e000e000e000e000e000e000e000e021c03f003f00000000000000000000000005ffffff000000000000000000000000000000000000000000000000ce79feff9ee78ee38ee38ee38ee38ee38ee38ee38ee38ee38ee38ee300000000000000000000000005ffff 215 | # ff000000000000000000000000000000000000000000000000c00ff01f783c38380038003ee03ff83b3c381c381c3c3c3ef83ff07900000000000000000000000005ffffff000000000000000000000000000000000000000000000000e007f81f3c3c1c381c003c00f807e01f003c1c381c38383cf81fe007000000000000000000000000""" 216 | 217 | # test_text_packet_generator = build_string_packet(bytearray.fromhex(bitmap_from_test_packet), text_mode=1, text_colour_mode=1, text_colour=(255,0,0), text_bg_mode=0, text_bg_colour=(0,0,0)) 218 | 219 | # print(' '.join([f'{byte:02X}' for byte in bytearray.fromhex(test_packet_from_device)])) 220 | # print(' '.join([f'{byte:02X}' for byte in test_text_packet_generator])) 221 | --------------------------------------------------------------------------------