├── ColourThread.cpp ├── DataFunctions.cpp ├── DataFunctions.h ├── DualThread.cpp ├── LCDThreads.h ├── LogiLCD.cpp ├── LogiLCD.sln ├── LogiLCD.vcxproj ├── LogiLCD.vcxproj.filters ├── MonoThread.cpp ├── README.md └── mono_background.h /ColourThread.cpp: -------------------------------------------------------------------------------- 1 | /******************************************* 2 | A Docile Sloth 2017 (adocilesloth@gmail.com) 3 | *******************************************/ 4 | 5 | #include "LCDThreads.h" 6 | 7 | using namespace std; 8 | 9 | void Colour(atomic& close) 10 | { 11 | wstring scene; 12 | bool leftlast = false; 13 | bool rightlast = false; 14 | bool uplast = false; 15 | bool downlast = false; 16 | bool oklast = false; 17 | bool cancellast = false; 18 | 19 | //fps 20 | int fps = 0; 21 | time_t tlastime; 22 | int fpslastime; 23 | int lastframes; 24 | wstringstream sfps; 25 | 26 | //bit rate 27 | float bitrate = 0.0; 28 | int bpslastime; 29 | int lastbytes; 30 | wstringstream sbyte; 31 | 32 | bool altdisplay = false; 33 | //dropped frames 34 | int dropped; 35 | int total; 36 | double percent; 37 | wstringstream frames; 38 | //stream time 39 | time_t tstartime; 40 | int startime; 41 | int uptime; 42 | int sec; 43 | int min; 44 | int hour; 45 | wstringstream stime; 46 | 47 | //stream info 48 | bool firstime = true; 49 | obs_output_t* output; 50 | 51 | LogiLcdColorSetTitle(L"OBS", 255, 255, 255); 52 | 53 | //Wait for stuff to load or obs_frontend_streaming_active() causes a crash 54 | obs_source_t* sceneUsed = obs_frontend_get_current_scene(); 55 | while(!sceneUsed) 56 | { 57 | LogiLcdColorSetText(0, L"Open Broadcasting Software", 255, 255, 255); 58 | LogiLcdColorSetText(2, L" Loading...", 255, 255, 255); 59 | LogiLcdUpdate(); 60 | sceneUsed = obs_frontend_get_current_scene(); 61 | Sleep(16); 62 | } 63 | obs_source_release(sceneUsed); 64 | 65 | while (!close) 66 | { 67 | //mute and deafen buttons 68 | if(leftlast == true && LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_LEFT) == false) //button released 69 | { 70 | toggleMute(); 71 | } 72 | if(rightlast == true && LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_RIGHT) == false) //button rleased 73 | { 74 | toggleDeaf(); 75 | } 76 | leftlast = LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_LEFT); 77 | rightlast = LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_RIGHT); 78 | if(uplast == true && LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_UP) == false) //button released 79 | { 80 | toggleMute(); 81 | } 82 | if(downlast == true && LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_DOWN) == false) //button rleased 83 | { 84 | toggleDeaf(); 85 | } 86 | uplast = LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_UP); 87 | downlast = LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_DOWN); 88 | //stream and preview buttons 89 | if(oklast == true && LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_OK) == false) //button released 90 | { 91 | if(obs_frontend_streaming_active()) 92 | { 93 | obs_frontend_streaming_stop(); 94 | } 95 | else 96 | { 97 | obs_frontend_streaming_start(); 98 | } 99 | } 100 | if(cancellast == true && LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_CANCEL) == false) //button released 101 | { 102 | //OBSStartStopPreview(); 103 | } 104 | oklast = LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_OK); 105 | cancellast = LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_CANCEL); 106 | 107 | //get scene information 108 | scene = L"Scene: "; 109 | scene.append(getScene()); 110 | wchar_t *name = new wchar_t[scene.length() + 1]; 111 | wcscpy(name, scene.c_str()); //convert to wchar_t 112 | LogiLcdColorSetText(1, name, 255, 255, 255); 113 | delete [] name; //delete temp crap 114 | scene = L""; 115 | 116 | if(obs_frontend_streaming_active() || obs_frontend_recording_active()) //streaming 117 | { 118 | //live 119 | LogiLcdColorSetText(0, L"Live \u25CF", 255, 0, 0); 120 | 121 | if(firstime == true) 122 | { 123 | firstime = false; 124 | time(&tstartime); 125 | time(&tlastime); 126 | startime = int(tstartime); 127 | fpslastime = int(tlastime); 128 | bpslastime = int(tlastime); 129 | lastframes = 0; 130 | lastbytes = 0; 131 | } 132 | 133 | //fps 134 | sfps << L"FPS: "; 135 | getFPS(fps, lastframes, fpslastime); 136 | if(fps < 10) 137 | { 138 | sfps << L"0"; 139 | } 140 | sfps << fps; 141 | wchar_t *wfps = new wchar_t[sfps.str().length() +1]; 142 | wcscpy(wfps, sfps.str().c_str()); //copy string 143 | //fpspercent = double(fps)/OBSGetMaxFPS(); 144 | /*if(fpspercent >= 0.83 && fpspercent < 0.96) 145 | { 146 | LogiLcdColorSetText(2, wfps, 255, 126, 0); //print to lcd as yellow 147 | } 148 | else if(fpspercent < 0.83) 149 | { 150 | LogiLcdColorSetText(2, wfps, 255, 0, 0); //print to lcd as red 151 | }*/ 152 | //else 153 | //{ 154 | LogiLcdColorSetText(2, wfps, 255, 255, 255); //print to lcd 155 | //} 156 | delete [] wfps; 157 | sfps.str(L""); 158 | 159 | //bitrate 160 | sbyte << L"Bitrate: "; 161 | getbps(bitrate, lastbytes, bpslastime); 162 | sbyte << int(bitrate) << L"kb/s"; 163 | wchar_t *wbit = new wchar_t[sbyte.str().length() +1]; 164 | wcscpy(wbit, sbyte.str().c_str()); //copy string 165 | LogiLcdColorSetText(3, wbit, 255, 255, 255); //print to lcd 166 | delete [] wbit; 167 | sbyte.str(L""); 168 | 169 | if(obs_frontend_streaming_active()) 170 | { 171 | output = obs_frontend_get_streaming_output(); 172 | } 173 | else if(obs_frontend_recording_active()) 174 | { 175 | output = obs_frontend_get_recording_output(); 176 | } 177 | 178 | //dropped frames 179 | frames << L"Dropped Frames: "; 180 | dropped = obs_output_get_frames_dropped(output); 181 | frames << dropped << L"("; 182 | total = obs_output_get_total_frames(output); 183 | percent = (double(dropped)/total)*100; 184 | frames << fixed << setprecision(2) << percent << L"%)"; 185 | wchar_t *droppedframes = new wchar_t[frames.str().length() +1]; 186 | wcscpy(droppedframes, frames.str().c_str()); //copy string 187 | 188 | if(percent >= 5 && percent < 10) //between 5% and 10% dropped frames 189 | { 190 | LogiLcdColorSetText(4, droppedframes, 225, 126, 0); //print to lcd as yellow 191 | } 192 | else if(percent >= 10) //over 10% dropped 193 | { 194 | LogiLcdColorSetText(4, droppedframes, 225, 0, 0); //print to lcd as red 195 | } 196 | else 197 | { 198 | LogiLcdColorSetText(4, droppedframes, 225, 225, 225); //print to lcd 199 | } 200 | delete [] droppedframes; 201 | frames.str(L""); 202 | 203 | //stream time 204 | stime << L"Stream Uptime: "; 205 | uptime = streamTime(startime); 206 | hour = (uptime / (60*60)) % 60; 207 | min = (uptime / 60) % 60; 208 | sec = (uptime % 60); 209 | 210 | stime << hour << L":"; 211 | if(min < 10) 212 | { 213 | stime << L"0"; 214 | } 215 | stime << min << L":"; 216 | if(sec < 10) 217 | { 218 | stime << L"0"; 219 | } 220 | stime << sec; 221 | 222 | wchar_t *streamtime = new wchar_t[stime.str().length() +1]; 223 | wcscpy(streamtime, stime.str().c_str()); //copy string 224 | LogiLcdColorSetText(5, streamtime, 255, 255, 255); //print to lcd 225 | delete [] streamtime; 226 | stime.str(L""); 227 | } 228 | else 229 | { 230 | LogiLcdColorSetText(0, L"", 0, 0, 0); 231 | LogiLcdColorSetText(2, L"FPS: --", 255, 255, 255); 232 | LogiLcdColorSetText(3, L"Bitrate: ----kb/s", 255, 255, 255); 233 | LogiLcdColorSetText(4, L"Dropped Frames: -(-.--%)", 255, 255, 255); 234 | LogiLcdColorSetText(5, L"Stream Uptime: -:--:--", 255, 255, 255); 235 | } 236 | 237 | if(getMute() && getDeaf()) 238 | { 239 | LogiLcdColorSetText(6, L"Muted and Deafened", 255, 0, 0); 240 | } 241 | else if(getMute() && !getDeaf()) 242 | { 243 | LogiLcdColorSetText(6, L"Muted", 255, 126, 0); 244 | } 245 | else if(!getMute() && getDeaf()) 246 | { 247 | LogiLcdColorSetText(6, L"Deafened", 255, 126, 0); 248 | } 249 | else 250 | { 251 | LogiLcdColorSetText(6, L"", 0, 0, 0); 252 | } 253 | //update screen 254 | LogiLcdUpdate(); 255 | 256 | Sleep(16); 257 | } 258 | 259 | LogiLcdShutdown(); 260 | return; 261 | } -------------------------------------------------------------------------------- /DataFunctions.cpp: -------------------------------------------------------------------------------- 1 | /******************************************* 2 | A Docile Sloth 2017 (adocilesloth@gmail.com) 3 | *******************************************/ 4 | #include "DataFunctions.h" 5 | #include 6 | 7 | std::wstring s2ws(const std::string& str) 8 | { 9 | int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0); 10 | std::wstring wstrTo( size_needed, 0 ); 11 | MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed); 12 | return wstrTo; 13 | } 14 | 15 | int streamTime(int startime) 16 | { 17 | time_t currtime; 18 | time(&currtime); 19 | int uptime = abs(startime - int(currtime)); 20 | return uptime; 21 | } 22 | 23 | void getFPS(int &lastfps, int &lastframes, int &lastime) 24 | { 25 | time_t currtime; 26 | time(&currtime); 27 | 28 | obs_output_t* output; 29 | if(obs_frontend_streaming_active()) 30 | { 31 | output = obs_frontend_get_streaming_output(); 32 | } 33 | else if(obs_frontend_recording_active()) 34 | { 35 | output = obs_frontend_get_recording_output(); 36 | } 37 | 38 | if(currtime > lastime) 39 | { 40 | int currframes = obs_output_get_total_frames(output); 41 | int fps = currframes - lastframes; 42 | lastfps = fps; 43 | lastframes = currframes; 44 | lastime = currtime; 45 | } 46 | return; 47 | } 48 | 49 | void getbps(float &lastbps, int &lastbytes, int &lastime) 50 | { 51 | //returns as kb/s 52 | time_t currtime; 53 | time(&currtime); 54 | 55 | obs_output_t* output; 56 | if(obs_frontend_streaming_active()) 57 | { 58 | output = obs_frontend_get_streaming_output(); 59 | } 60 | else if(obs_frontend_recording_active()) 61 | { 62 | output = obs_frontend_get_recording_output(); 63 | } 64 | 65 | if(currtime > lastime) 66 | { 67 | int currbytes = obs_output_get_total_bytes(output); 68 | int bps = currbytes - lastbytes; 69 | lastbps = (bps / 1000) * 8; //convert to kb/s 70 | lastbytes = currbytes; 71 | lastime = currtime; 72 | } 73 | return; 74 | } 75 | 76 | std::wstring getScene() 77 | { 78 | obs_source_t* sceneUsed = obs_frontend_get_current_scene(); 79 | if(sceneUsed == nullptr) 80 | { 81 | return L"Loading..."; 82 | } 83 | const char *sceneUsedName = obs_source_get_name(sceneUsed); 84 | if(sceneUsedName == nullptr) 85 | { 86 | return L"Loading..."; 87 | } 88 | obs_source_release(sceneUsed); 89 | std::string sceneName = sceneUsedName; 90 | std::wstring wsceneName = s2ws(sceneName); 91 | return wsceneName; 92 | } 93 | 94 | bool getMute() 95 | { 96 | obs_source_t* sceneUsed = obs_get_output_source(3); 97 | if(sceneUsed) 98 | { 99 | if(obs_source_muted(sceneUsed)) 100 | { 101 | obs_source_release(sceneUsed); 102 | return true; 103 | } 104 | obs_source_release(sceneUsed); 105 | } 106 | sceneUsed = obs_get_output_source(4); 107 | if(sceneUsed) 108 | { 109 | if(obs_source_muted(sceneUsed)) 110 | { 111 | obs_source_release(sceneUsed); 112 | return true; 113 | } 114 | obs_source_release(sceneUsed); 115 | } 116 | sceneUsed = obs_get_output_source(5); 117 | if(sceneUsed) 118 | { 119 | if(obs_source_muted(sceneUsed)) 120 | { 121 | obs_source_release(sceneUsed); 122 | return true; 123 | } 124 | obs_source_release(sceneUsed); 125 | } 126 | return false; 127 | } 128 | 129 | void toggleMute() 130 | { 131 | obs_source_t* sceneUsed = obs_get_output_source(3); 132 | if(sceneUsed) 133 | { 134 | if(obs_source_muted(sceneUsed)) 135 | { 136 | obs_source_set_muted(sceneUsed, false); 137 | } 138 | else 139 | { 140 | obs_source_set_muted(sceneUsed, true); 141 | } 142 | obs_source_release(sceneUsed); 143 | } 144 | sceneUsed = obs_get_output_source(4); 145 | if(sceneUsed) 146 | { 147 | if(obs_source_muted(sceneUsed)) 148 | { 149 | obs_source_set_muted(sceneUsed, false); 150 | } 151 | else 152 | { 153 | obs_source_set_muted(sceneUsed, true); 154 | } 155 | obs_source_release(sceneUsed); 156 | } 157 | sceneUsed = obs_get_output_source(5); 158 | if(sceneUsed) 159 | { 160 | if(obs_source_muted(sceneUsed)) 161 | { 162 | obs_source_set_muted(sceneUsed, false); 163 | } 164 | else 165 | { 166 | obs_source_set_muted(sceneUsed, true); 167 | } 168 | obs_source_release(sceneUsed); 169 | } 170 | return; 171 | } 172 | 173 | bool getDeaf() 174 | { 175 | obs_source_t* sceneUsed = obs_get_output_source(1); 176 | if(sceneUsed) 177 | { 178 | if(obs_source_muted(sceneUsed)) 179 | { 180 | obs_source_release(sceneUsed); 181 | return true; 182 | } 183 | obs_source_release(sceneUsed); 184 | } 185 | sceneUsed = obs_get_output_source(2); 186 | if (sceneUsed) 187 | { 188 | if (obs_source_muted(sceneUsed)) 189 | { 190 | obs_source_release(sceneUsed); 191 | return true; 192 | } 193 | obs_source_release(sceneUsed); 194 | } 195 | return false; 196 | } 197 | 198 | void toggleDeaf() 199 | { 200 | obs_source_t* sceneUsed = obs_get_output_source(1); 201 | if(sceneUsed) 202 | { 203 | if(obs_source_muted(sceneUsed)) 204 | { 205 | obs_source_set_muted(sceneUsed, false); 206 | } 207 | else 208 | { 209 | obs_source_set_muted(sceneUsed, true); 210 | } 211 | obs_source_release(sceneUsed); 212 | } 213 | sceneUsed = obs_get_output_source(2); 214 | if(sceneUsed) 215 | { 216 | if(obs_source_muted(sceneUsed)) 217 | { 218 | obs_source_set_muted(sceneUsed, false); 219 | } 220 | else 221 | { 222 | obs_source_set_muted(sceneUsed, true); 223 | } 224 | obs_source_release(sceneUsed); 225 | } 226 | return; 227 | } -------------------------------------------------------------------------------- /DataFunctions.h: -------------------------------------------------------------------------------- 1 | /******************************************* 2 | A Docile Sloth 2017 (adocilesloth@gmail.com) 3 | *******************************************/ 4 | #ifndef DATAFUNCTIONS_H 5 | #define DATAFUNCTIONS_H 6 | 7 | #include "obs.h" 8 | #include "obs-frontend-api\obs-frontend-api.h" 9 | 10 | #include 11 | #include 12 | 13 | int streamTime(int); 14 | void getFPS(int&, int&, int&); 15 | void getbps(float&, int&, int&); 16 | std::wstring getScene(); 17 | bool getMute(); 18 | void toggleMute(); 19 | bool getDeaf(); 20 | void toggleDeaf(); 21 | 22 | #endif -------------------------------------------------------------------------------- /DualThread.cpp: -------------------------------------------------------------------------------- 1 | /******************************************* 2 | A Docile Sloth 2017 (adocilesloth@gmail.com) 3 | *******************************************/ 4 | #include "LCDThreads.h" 5 | #include "mono_background.h" 6 | 7 | using namespace std; 8 | 9 | void Dual(atomic& close) 10 | { 11 | bool live = false; 12 | 13 | wstring scene; 14 | //mono buttons 15 | bool miclast = false; 16 | bool desklast = false; 17 | bool livelast = false; 18 | bool altdisplast = false; 19 | bool altdisplay = false; 20 | //colour buttons 21 | bool leftlast = false; 22 | bool rightlast = false; 23 | bool uplast = false; 24 | bool downlast = false; 25 | bool oklast = false; 26 | bool cancellast = false; 27 | 28 | //fps and bitrate 29 | int fps = 0; 30 | time_t tlastime; 31 | int fpslastime; 32 | int lastframes; 33 | 34 | float bitrate = 0.0; 35 | int bpslastime; 36 | int lastbytes; 37 | wstringstream fpsbyte; 38 | wstringstream sfps; 39 | wstringstream sbyte; 40 | 41 | //dropped frames 42 | int dropped; 43 | int total; 44 | double percent; 45 | wstringstream frames; 46 | //stream time 47 | time_t tstartime; 48 | int startime; 49 | int uptime; 50 | int sec; 51 | int min; 52 | int hour; 53 | wstringstream stime; 54 | 55 | //stream info 56 | bool firstime = true; 57 | obs_output_t* output; 58 | 59 | LogiLcdColorSetTitle(L"OBS", 255, 255, 255); 60 | 61 | //Wait for stuff to load or obs_frontend_streaming_active() causes a crash 62 | obs_source_t* sceneUsed = obs_frontend_get_current_scene(); 63 | while(!sceneUsed) 64 | { 65 | LogiLcdMonoSetText(0, L"Open Broadcasting Software"); 66 | LogiLcdMonoSetText(1, L" Loading..."); 67 | LogiLcdColorSetText(0, L"Open Broadcasting Software", 255, 255, 255); 68 | LogiLcdColorSetText(2, L" Loading...", 255, 255, 255); 69 | LogiLcdUpdate(); 70 | sceneUsed = obs_frontend_get_current_scene(); 71 | Sleep(16); 72 | } 73 | obs_source_release(sceneUsed); 74 | 75 | while (!close) 76 | { 77 | /*MONO*/ 78 | //mono mute and deafen buttons 79 | if(miclast == true && LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_1) == false) //button released 80 | { 81 | toggleMute(); 82 | } 83 | if(desklast == true && LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_2) == false) //button rleased 84 | { 85 | toggleDeaf(); 86 | } 87 | miclast = LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_1); 88 | desklast = LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_2); 89 | 90 | //mono stream and preview buttons 91 | if(livelast == true && LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_0) == false) 92 | { 93 | if(obs_frontend_streaming_active()) 94 | { 95 | obs_frontend_streaming_stop(); 96 | } 97 | else 98 | { 99 | obs_frontend_streaming_start(); 100 | } 101 | } 102 | if(altdisplast == true && LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_3) == false) 103 | { 104 | if(altdisplay) 105 | { 106 | altdisplay = false; 107 | } 108 | else 109 | { 110 | altdisplay = true; 111 | } 112 | } 113 | livelast = LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_0); 114 | altdisplast = LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_3); 115 | //mute and deafen buttons 116 | if(leftlast == true && LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_LEFT) == false) //button released 117 | { 118 | toggleMute(); 119 | } 120 | if(rightlast == true && LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_RIGHT) == false) //button rleased 121 | { 122 | toggleDeaf(); 123 | } 124 | leftlast = LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_LEFT); 125 | rightlast = LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_RIGHT); 126 | if(uplast == true && LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_UP) == false) //button released 127 | { 128 | toggleMute(); 129 | } 130 | if(downlast == true && LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_DOWN) == false) //button rleased 131 | { 132 | toggleDeaf(); 133 | } 134 | uplast = LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_UP); 135 | downlast = LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_DOWN); 136 | //stream and preview buttons 137 | if(oklast == true && LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_OK) == false) //button released 138 | { 139 | if(obs_frontend_streaming_active()) 140 | { 141 | obs_frontend_streaming_stop(); 142 | } 143 | else 144 | { 145 | obs_frontend_streaming_start(); 146 | } 147 | } 148 | if(cancellast == true && LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_CANCEL) == false) //button released 149 | { 150 | //OBSStartStopPreview(); 151 | } 152 | oklast = LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_OK); 153 | cancellast = LogiLcdIsButtonPressed(LOGI_LCD_COLOR_BUTTON_CANCEL); 154 | 155 | //get scene information 156 | scene = L"Scene: "; 157 | scene.append(getScene()); 158 | wchar_t *name = new wchar_t[scene.length() + 1]; 159 | wcscpy(name, scene.c_str()); //convert to wchar_t 160 | LogiLcdMonoSetText(1, name); 161 | LogiLcdColorSetText(1, name, 255, 255, 255); 162 | delete [] name; //delete temp crap 163 | scene = L""; 164 | 165 | if(obs_frontend_streaming_active() || obs_frontend_recording_active()) //streaming 166 | { 167 | LogiLcdMonoSetBackground(mono_background_started); //button help bitmap for mono 168 | if(firstime == true) 169 | { 170 | firstime = false; 171 | time(&tstartime); 172 | time(&tlastime); 173 | startime = int(tstartime); 174 | fpslastime = int(tlastime); 175 | bpslastime = int(tlastime); 176 | lastframes = 0; 177 | lastbytes = 0; 178 | } 179 | 180 | if(getMute() && getDeaf()) 181 | { 182 | LogiLcdMonoSetText(0, L"OBS Mute||Deaf \u25CF"); 183 | LogiLcdColorSetText(6, L"Muted and Deafened", 255, 0, 0); 184 | } 185 | else if(getMute() && !getDeaf()) 186 | { 187 | LogiLcdMonoSetText(0, L"OBS Mute| \u25CF"); 188 | LogiLcdColorSetText(6, L"Muted", 255, 126, 0); 189 | } 190 | else if(!getMute() && getDeaf()) 191 | { 192 | LogiLcdMonoSetText(0, L"OBS |Deaf \u25CF"); 193 | LogiLcdColorSetText(6, L"Deafened", 255, 126, 0); 194 | } 195 | else 196 | { 197 | LogiLcdMonoSetText(0, L"OBS \u25CF"); 198 | LogiLcdColorSetText(6, L"", 0, 0, 0); 199 | } 200 | 201 | //fps and bitrate 202 | fpsbyte << L"FPS: "; 203 | sfps << L"FPS: "; 204 | getFPS(fps, lastframes, fpslastime); 205 | if(fps < 10) 206 | { 207 | fpsbyte << L"0"; 208 | sfps << L"0"; 209 | } 210 | fpsbyte << fps << L" Bitrate: "; 211 | sfps << fps; 212 | sbyte << L"Bitrate: "; 213 | getbps(bitrate, lastbytes, bpslastime); //get as kb/s 214 | fpsbyte << int(bitrate); 215 | sbyte << int(bitrate) << L"kb/s"; 216 | //mono fps and bitrate 217 | wchar_t *fpsbit = new wchar_t[fpsbyte.str().length() +1]; 218 | wcscpy(fpsbit, fpsbyte.str().c_str()); //copy string 219 | //colour fps 220 | wchar_t *wfps = new wchar_t[sfps.str().length() +1]; 221 | wcscpy(wfps, sfps.str().c_str()); //copy string 222 | //colour bitrate 223 | wchar_t *wbit = new wchar_t[sbyte.str().length() +1]; 224 | wcscpy(wbit, sbyte.str().c_str()); //copy string 225 | //print to LCDs 226 | LogiLcdMonoSetText(2, fpsbit); //print to mono lcd 227 | //fpspercent = double(fps)/OBSGetMaxFPS(); 228 | /*if(fpspercent >= 0.83 && fpspercent < 0.96) 229 | { 230 | LogiLcdColorSetText(2, wfps, 255, 126, 0); //print to lcd as yellow 231 | } 232 | else if(fpspercent < 0.83) 233 | { 234 | LogiLcdColorSetText(2, wfps, 255, 0, 0); //print to lcd as red 235 | } 236 | else 237 | {*/ 238 | LogiLcdColorSetText(2, wfps, 255, 255, 255); //print colour to lcd 239 | //} 240 | LogiLcdColorSetText(3, wbit, 255, 255, 255); //print colour to lcd 241 | //clear up 242 | delete [] fpsbit; 243 | delete [] wfps; 244 | delete [] wbit; 245 | fpsbyte.str(L""); 246 | sfps.str(L""); 247 | sbyte.str(L""); 248 | 249 | if(obs_frontend_streaming_active()) 250 | { 251 | output = obs_frontend_get_streaming_output(); 252 | } 253 | else if(obs_frontend_recording_active()) 254 | { 255 | output = obs_frontend_get_recording_output(); 256 | } 257 | 258 | //dropped frames calculations 259 | frames << L"Dropped Frames: "; 260 | dropped = obs_output_get_frames_dropped(output); 261 | frames << dropped << L"("; 262 | total = obs_output_get_total_frames(output); 263 | percent = (double(dropped)/total)*100; 264 | frames << fixed << setprecision(2) << percent << L"%)"; 265 | wchar_t *droppedframes = new wchar_t[frames.str().length() +1]; 266 | wcscpy(droppedframes, frames.str().c_str()); //copy string 267 | 268 | //stream time 269 | stime << L"Stream Uptime: "; 270 | uptime = streamTime(startime); 271 | hour = (uptime / (60*60)) % 60; 272 | min = (uptime / 60) % 60; 273 | sec = (uptime % 60); 274 | 275 | stime << hour << L":"; 276 | if(min < 10) 277 | { 278 | stime << L"0"; 279 | } 280 | stime << min << L":"; 281 | if(sec < 10) 282 | { 283 | stime << L"0"; 284 | } 285 | stime << sec; 286 | 287 | wchar_t *streamtime = new wchar_t[stime.str().length() +1]; 288 | wcscpy(streamtime, stime.str().c_str()); //copy string*/ 289 | 290 | if(altdisplay) 291 | { 292 | //dropped frames 293 | LogiLcdMonoSetText(3, droppedframes); //print to lcd 294 | } 295 | else 296 | { 297 | //stream time 298 | LogiLcdMonoSetText(3, streamtime); //print to lcd 299 | 300 | } 301 | 302 | if(percent >= 5 && percent < 10) //between 5% and 10% dropped frames 303 | { 304 | LogiLcdColorSetText(4, droppedframes, 225, 126, 0); //print to lcd as yellow 305 | } 306 | else if(percent >= 10) //over 10% dropped 307 | { 308 | LogiLcdColorSetText(4, droppedframes, 225, 0, 0); //print to lcd as red 309 | } 310 | else 311 | { 312 | LogiLcdColorSetText(4, droppedframes, 225, 225, 225); //print colour to lcd 313 | } 314 | LogiLcdColorSetText(5, streamtime, 255, 255, 255); //print to lcd 315 | 316 | delete [] droppedframes; 317 | delete [] streamtime; 318 | frames.str(L""); 319 | stime.str(L""); 320 | } 321 | else 322 | { 323 | LogiLcdMonoSetBackground(mono_background_stopped); //button help bitmap for mono 324 | LogiLcdColorSetText(0, L"", 0, 0, 0); 325 | if(getMute() && getDeaf()) 326 | { 327 | LogiLcdMonoSetText(0, L"OBS Mute||Deaf \u25CB"); 328 | LogiLcdColorSetText(6, L"Muted and Deafened", 255, 0, 0); 329 | } 330 | else if(getMute() && !getDeaf()) 331 | { 332 | LogiLcdMonoSetText(0, L"OBS Mute| \u25CB"); 333 | LogiLcdColorSetText(6, L"Muted", 255, 126, 0); 334 | } 335 | else if(!getMute() && getDeaf()) 336 | { 337 | LogiLcdMonoSetText(0, L"OBS |Deaf \u25CB"); 338 | LogiLcdColorSetText(6, L"Deafened", 255, 126, 0); 339 | } 340 | else 341 | { 342 | LogiLcdMonoSetText(0, L"OBS \u25CB"); 343 | LogiLcdColorSetText(6, L"", 0, 0, 0); 344 | } 345 | 346 | LogiLcdColorSetText(0, L"", 0, 0, 0); 347 | 348 | LogiLcdMonoSetText(2, L"FPS: -- Bitrate: ----"); 349 | LogiLcdColorSetText(2, L"FPS: --"); 350 | LogiLcdColorSetText(3, L"Bitrate: ----kb/s", 255, 255, 255); 351 | if(altdisplay) 352 | { 353 | LogiLcdMonoSetText(3, L"Dropped Frames: -(-.--%)"); 354 | } 355 | else 356 | { 357 | LogiLcdMonoSetText(3, L"Stream Uptime: -:--:--"); 358 | } 359 | LogiLcdColorSetText(4, L"Dropped Frames: -(-.--%)", 255, 255, 255); 360 | LogiLcdColorSetText(5, L"Stream Uptime: -:--:--", 255, 255, 255); 361 | } 362 | //update screen 363 | LogiLcdUpdate(); 364 | 365 | Sleep(16); 366 | } 367 | LogiLcdShutdown(); 368 | return; 369 | } -------------------------------------------------------------------------------- /LCDThreads.h: -------------------------------------------------------------------------------- 1 | /******************************************* 2 | A Docile Sloth 2016 (adocilesloth@gmail.com) 3 | *******************************************/ 4 | #ifndef LCDTHREADS_H 5 | #define LCDTHREADS_H 6 | 7 | #include "LogitechLCDLib.h" 8 | #include "obs.h" 9 | #include "DataFunctions.h" 10 | 11 | //#include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | void Mono(std::atomic&); 19 | void Colour(std::atomic&); 20 | void Dual(std::atomic&); 21 | 22 | #endif //LCDTHREADS_H -------------------------------------------------------------------------------- /LogiLCD.cpp: -------------------------------------------------------------------------------- 1 | /******************************************* 2 | A Docile Sloth 2016 (adocilesloth@gmail.com) 3 | *******************************************/ 4 | 5 | #include 6 | 7 | #include "LCDThreads.h" 8 | 9 | using namespace std; 10 | 11 | thread LcdThread; 12 | 13 | OBS_DECLARE_MODULE() 14 | 15 | atomic close(false); 16 | bool running = true; 17 | 18 | bool obs_module_load(void) 19 | { 20 | if(!LogiLcdInit(L"OBS", LOGI_LCD_TYPE_MONO | LOGI_LCD_TYPE_COLOR)) 21 | { 22 | running = false; 23 | return true; 24 | } 25 | if(LogiLcdIsConnected(LOGI_LCD_TYPE_MONO) && LogiLcdIsConnected(LOGI_LCD_TYPE_COLOR)) 26 | { 27 | //call dual thread 28 | //LcdThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Dual, NULL, 0, 0); 29 | LcdThread = thread(Dual, ref(close)); 30 | } 31 | else if(LogiLcdIsConnected(LOGI_LCD_TYPE_MONO)) 32 | { 33 | //call mono thread 34 | //LcdThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Mono, NULL, 0, 0); 35 | LcdThread = thread(Mono, ref(close)); 36 | } 37 | else if(LogiLcdIsConnected(LOGI_LCD_TYPE_COLOR)) 38 | { 39 | //call colour thread 40 | //LcdThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Colour, NULL, 0, 0); 41 | LcdThread = thread(Colour, ref(close)); 42 | } 43 | return true; 44 | } 45 | 46 | //Calling this causes crashes... 47 | /*void obs_module_unload(void) 48 | { 49 | if(running) 50 | { 51 | close = true; 52 | LcdThread.join(); 53 | } 54 | return; 55 | }*/ 56 | 57 | const char *obs_module_author(void) 58 | { 59 | return "A Docile Sloth"; 60 | } 61 | 62 | const char *obs_module_name(void) 63 | { 64 | return "Logitech LCD"; 65 | } 66 | 67 | const char *obs_module_description(void) 68 | { 69 | return "Adds Logitech LCD Monochrome and Colour support"; 70 | } -------------------------------------------------------------------------------- /LogiLCD.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.40629.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LogiLCD", "LogiLCD.vcxproj", "{B87A73C2-90D2-4B7E-A08B-F52DD49C158D}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Win32 = Debug|Win32 11 | Debug|x64 = Debug|x64 12 | Release|Win32 = Release|Win32 13 | Release|x64 = Release|x64 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {B87A73C2-90D2-4B7E-A08B-F52DD49C158D}.Debug|Win32.ActiveCfg = Debug|Win32 17 | {B87A73C2-90D2-4B7E-A08B-F52DD49C158D}.Debug|Win32.Build.0 = Debug|Win32 18 | {B87A73C2-90D2-4B7E-A08B-F52DD49C158D}.Debug|x64.ActiveCfg = Debug|x64 19 | {B87A73C2-90D2-4B7E-A08B-F52DD49C158D}.Debug|x64.Build.0 = Debug|x64 20 | {B87A73C2-90D2-4B7E-A08B-F52DD49C158D}.Release|Win32.ActiveCfg = Release|Win32 21 | {B87A73C2-90D2-4B7E-A08B-F52DD49C158D}.Release|Win32.Build.0 = Release|Win32 22 | {B87A73C2-90D2-4B7E-A08B-F52DD49C158D}.Release|x64.ActiveCfg = Release|x64 23 | {B87A73C2-90D2-4B7E-A08B-F52DD49C158D}.Release|x64.Build.0 = Release|x64 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | EndGlobal 29 | -------------------------------------------------------------------------------- /LogiLCD.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Debug 10 | x64 11 | 12 | 13 | Release 14 | Win32 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | {B87A73C2-90D2-4B7E-A08B-F52DD49C158D} 23 | Win32Proj 24 | LogiLCD 25 | 8.1 26 | 27 | 28 | 29 | DynamicLibrary 30 | true 31 | v140 32 | Unicode 33 | 34 | 35 | DynamicLibrary 36 | true 37 | v140 38 | Unicode 39 | 40 | 41 | DynamicLibrary 42 | false 43 | v140 44 | true 45 | Unicode 46 | 47 | 48 | DynamicLibrary 49 | false 50 | v120 51 | true 52 | Unicode 53 | 54 | 55 | 56 | 57 | 58 | 59 | true 60 | 61 | 62 | true 63 | 64 | 65 | false 66 | 67 | 68 | false 69 | 70 | 71 | 72 | 73 | 74 | Level3 75 | Disabled 76 | WIN32;_DEBUG;_WINDOWS;_USRDLL;LOGILCD_EXPORTS;%(PreprocessorDefinitions) 77 | D:\LogitechSDK\LCDSDK_8.57.148\Lib\x86;D:\OBS\obs-studio\libobs;D:\OBS\build32\config;%(AdditionalIncludeDirectories) 78 | 79 | 80 | Windows 81 | true 82 | %(AdditionalLibraryDirectories);D:\LogitechSDK\LCDSDK_8.57.148\Lib\x86;D:\OBS\build32\libobs\Debug 83 | LogitechLCDLib.lib;obs.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) 84 | 85 | 86 | false 87 | 88 | 89 | 90 | 91 | 92 | 93 | Level3 94 | Disabled 95 | WIN32;_DEBUG;_WINDOWS;_USRDLL;LOGILCD_EXPORTS;%(PreprocessorDefinitions) 96 | D:\LogitechSDK\LCDSDK_8.57.148\Lib\x86;D:\OBS\obs-studio\libobs;D:\OBS\build32\config;%(AdditionalIncludeDirectories) 97 | 98 | 99 | Windows 100 | true 101 | %(AdditionalLibraryDirectories);D:\LogitechSDK\LCDSDK_8.57.148\Lib\x86;D:\OBS\build32\libobs\Debug 102 | LogitechLCDLib.lib;obs.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) 103 | 104 | 105 | false 106 | 107 | 108 | 109 | 110 | Level3 111 | 112 | 113 | MaxSpeed 114 | true 115 | true 116 | WIN32;NDEBUG;_WINDOWS;_USRDLL;LOGILCD_EXPORTS;%(PreprocessorDefinitions) 117 | D:\OBS\obs-studio\UI;D:\LogitechSDK\LCDSDK_8.57.148\Lib\x86;D:\OBS\obs-studio\libobs;D:\OBS\build32\config;%(AdditionalIncludeDirectories) 118 | 119 | 120 | Windows 121 | true 122 | true 123 | true 124 | %(AdditionalLibraryDirectories);D:\OBS\build32\UI\obs-frontend-api\Release;D:\LogitechSDK\LCDSDK_8.57.148\Lib\x86;D:\OBS\build32\libobs\Release 125 | obs-frontend-api.lib;LogitechLCDLib.lib;obs.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) 126 | 127 | 128 | false 129 | 130 | 131 | 132 | 133 | Level3 134 | 135 | 136 | MaxSpeed 137 | true 138 | true 139 | WIN32;NDEBUG;_WINDOWS;_USRDLL;LOGILCD_EXPORTS;%(PreprocessorDefinitions) 140 | D:\OBS\obs-studio\UI;D:\LogitechSDK\LCDSDK_8.57.148\Lib\x64;D:\OBS\obs-studio\libobs;D:\OBS\build64\config;%(AdditionalIncludeDirectories) 141 | 142 | 143 | Windows 144 | true 145 | true 146 | true 147 | %(AdditionalLibraryDirectories);D:\OBS\build64\UI\obs-frontend-api\Release;D:\LogitechSDK\LCDSDK_8.57.148\Lib\x64;D:\OBS\build64\libobs\Release 148 | obs-frontend-api.lib;LogitechLCDLib.lib;obs.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) 149 | 150 | 151 | false 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | -------------------------------------------------------------------------------- /LogiLCD.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | Source Files 23 | 24 | 25 | Source Files 26 | 27 | 28 | Source Files 29 | 30 | 31 | Source Files 32 | 33 | 34 | 35 | 36 | Header Files 37 | 38 | 39 | Header Files 40 | 41 | 42 | Header Files 43 | 44 | 45 | Header Files 46 | 47 | 48 | -------------------------------------------------------------------------------- /MonoThread.cpp: -------------------------------------------------------------------------------- 1 | /******************************************* 2 | A Docile Sloth 2017 (adocilesloth@gmail.com) 3 | *******************************************/ 4 | 5 | #include "LCDThreads.h" 6 | #include "mono_background.h" 7 | //#include 8 | 9 | using namespace std; 10 | 11 | void Mono(atomic& close) 12 | { 13 | wstring scene; 14 | bool miclast = false; 15 | bool desklast = false; 16 | bool livelast = false; 17 | bool altdisplast = false; 18 | 19 | //fps and bitrate 20 | int fps = 0; 21 | time_t tlastime; 22 | int fpslastime; 23 | int lastframes; 24 | 25 | float bitrate = 0.0; 26 | int bpslastime; 27 | int lastbytes; 28 | wstringstream fpsbyte; 29 | 30 | bool altdisplay = false; 31 | //dropped frames 32 | int dropped; 33 | int total; 34 | double percent; 35 | wstringstream frames; 36 | //stream time 37 | time_t tstartime; 38 | int startime; 39 | int uptime; 40 | int sec; 41 | int min; 42 | int hour; 43 | wstringstream stime; 44 | 45 | //stream info 46 | bool firstime = true; 47 | obs_output_t* output; 48 | 49 | //Wait for stuff to load or obs_frontend_streaming_active() causes a crash 50 | obs_source_t* sceneUsed = obs_frontend_get_current_scene(); 51 | while(!sceneUsed) 52 | { 53 | LogiLcdMonoSetText(0, L"Open Broadcasting Software"); 54 | LogiLcdMonoSetText(1, L" Loading..."); 55 | LogiLcdUpdate(); 56 | sceneUsed = obs_frontend_get_current_scene(); 57 | Sleep(16); 58 | } 59 | obs_source_release(sceneUsed); 60 | 61 | while(!close) //Text line length is 26 characters 62 | { 63 | //mute and deafen buttons 64 | if(miclast == true && LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_1) == false) //button released 65 | { 66 | toggleMute(); 67 | } 68 | if(desklast == true && LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_2) == false) //button rleased 69 | { 70 | toggleDeaf(); 71 | } 72 | miclast = LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_1); 73 | desklast = LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_2); 74 | //stream and preview buttons 75 | if(livelast == true && LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_0) == false) 76 | { 77 | if(obs_frontend_streaming_active()) 78 | { 79 | obs_frontend_streaming_stop(); 80 | } 81 | else 82 | { 83 | obs_frontend_streaming_start(); 84 | } 85 | } 86 | if(altdisplast == true && LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_3) == false) 87 | { 88 | if(altdisplay) 89 | { 90 | altdisplay = false; 91 | } 92 | else 93 | { 94 | altdisplay = true; 95 | } 96 | } 97 | livelast = LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_0); 98 | altdisplast = LogiLcdIsButtonPressed(LOGI_LCD_MONO_BUTTON_3); 99 | 100 | //scene information 101 | scene = L"Scene: "; 102 | scene.append(getScene()); 103 | wchar_t *name = new wchar_t[scene.length() + 1]; 104 | wcscpy(name, scene.c_str()); //convert to wchar_t 105 | LogiLcdMonoSetText(1, name); //print 106 | delete[] name; //delete temp crap 107 | scene = L""; 108 | 109 | if(obs_frontend_streaming_active() || obs_frontend_recording_active()) //streaming 110 | { 111 | LogiLcdMonoSetBackground(mono_background_started); 112 | if(getMute() && getDeaf()) 113 | { 114 | LogiLcdMonoSetText(0, L"OBS Mute||Deaf live\u25CF"); 115 | } 116 | else if(getMute() && !getDeaf()) 117 | { 118 | LogiLcdMonoSetText(0, L"OBS Mute| live\u25CF"); 119 | } 120 | else if(!getMute() && getDeaf()) 121 | { 122 | LogiLcdMonoSetText(0,L"OBS |Deaf live\u25CF"); 123 | } 124 | else 125 | { 126 | LogiLcdMonoSetText(0, L"OBS live\u25CF"); 127 | } 128 | 129 | if(firstime == true) 130 | { 131 | firstime = false; 132 | time(&tstartime); 133 | time(&tlastime); 134 | startime = int(tstartime); 135 | fpslastime = int(tlastime); 136 | bpslastime = int(tlastime); 137 | lastframes = 0; 138 | lastbytes = 0; 139 | } 140 | 141 | //fps and bitrate 142 | fpsbyte << L"FPS: "; 143 | getFPS(fps, lastframes, fpslastime);//, streamName[indx]); 144 | if(fps < 10) 145 | { 146 | fpsbyte << L"0"; 147 | } 148 | fpsbyte << fps << L" Bitrate: "; 149 | 150 | getbps(bitrate, lastbytes, bpslastime);//, streamName[indx]); 151 | fpsbyte << int(bitrate); 152 | 153 | wchar_t *fpsbit = new wchar_t[fpsbyte.str().length() + 1]; 154 | wcscpy(fpsbit, fpsbyte.str().c_str()); //copy string 155 | LogiLcdMonoSetText(2, fpsbit); //print to lcd 156 | delete[] fpsbit; 157 | fpsbyte.str(L""); 158 | 159 | if(altdisplay) 160 | { 161 | if(obs_frontend_streaming_active()) 162 | { 163 | output = obs_frontend_get_streaming_output(); 164 | } 165 | else if(obs_frontend_recording_active()) 166 | { 167 | output = obs_frontend_get_recording_output(); 168 | } 169 | 170 | //dropped frames 171 | frames << L"Dropped Frames: "; 172 | dropped = obs_output_get_frames_dropped(output); 173 | frames << dropped << L"("; 174 | total = obs_output_get_total_frames(output); 175 | percent = (double(dropped) / total) * 100; 176 | frames << fixed << setprecision(2) << percent << L"%)"; 177 | 178 | wchar_t *droppedframes = new wchar_t[frames.str().length() +1]; 179 | wcscpy(droppedframes, frames.str().c_str()); //copy string 180 | LogiLcdMonoSetText(3, droppedframes); //print to lcd 181 | delete[] droppedframes; 182 | frames.str(L""); 183 | } 184 | else 185 | { 186 | //stream time 187 | stime << L"Stream Uptime: "; 188 | uptime = streamTime(startime); 189 | hour = (uptime / (60 * 60)) % 60; 190 | min = (uptime / 60) % 60; 191 | sec = (uptime % 60); 192 | 193 | stime << hour << L":"; 194 | if (min < 10) 195 | { 196 | stime << L"0"; 197 | } 198 | stime << min << L":"; 199 | if (sec < 10) 200 | { 201 | stime << L"0"; 202 | } 203 | stime << sec; 204 | 205 | wchar_t *streamtime = new wchar_t[stime.str().length() + 1]; 206 | wcscpy(streamtime, stime.str().c_str()); //copy string 207 | LogiLcdMonoSetText(3, streamtime); //print to lcd 208 | delete[] streamtime; 209 | stime.str(L""); 210 | } 211 | }//end of streaming 212 | else 213 | { 214 | LogiLcdMonoSetBackground(mono_background_stopped); 215 | if(getMute() && getDeaf()) 216 | { 217 | LogiLcdMonoSetText(0, L"OBS Mute||Deaf \u25CB"); 218 | } 219 | else if(getMute() && !getDeaf()) 220 | { 221 | LogiLcdMonoSetText(0, L"OBS Mute| \u25CB"); 222 | } 223 | else if(!getMute() && getDeaf()) 224 | { 225 | LogiLcdMonoSetText(0, L"OBS |Deaf \u25CB"); 226 | } 227 | else 228 | {//------------------------------------------------------------------------------------------- 229 | LogiLcdMonoSetText(0, L"OBS \u25CB"); 230 | } 231 | 232 | LogiLcdMonoSetText(2, L"FPS: -- Bitrate: ----"); 233 | 234 | if(firstime == false) 235 | { 236 | firstime =true; 237 | } 238 | if(altdisplay) 239 | { 240 | LogiLcdMonoSetText(3, L"Dropped Frames: -(-.--%)"); 241 | } 242 | else 243 | { 244 | LogiLcdMonoSetText(3, L"Stream Uptime: -:--:--"); 245 | } 246 | } 247 | //update screen 248 | LogiLcdUpdate(); 249 | 250 | Sleep(16); 251 | } 252 | LogiLcdShutdown(); 253 | return; 254 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Logitech LCD Plugin 2 | =================== 3 | OBS plugin that adds Logitech Colour and Monochrome LCD support. 4 | 5 | I'm not sure if the colour LCD actually works as my emulator is acting weird for the colour LCD 6 | -------------------------------------------------------------------------------- /mono_background.h: -------------------------------------------------------------------------------- 1 | static unsigned char mono_background_started[] = { 2 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 157 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 182 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 186 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 199 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 201 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 205 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 209 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 211 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 214 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 227 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 236 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 260 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 261 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 263 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 264 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 265 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 266 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 267 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 269 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 270 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 273 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 279 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 283 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 285 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 288 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 292 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 295 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 299 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 302 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 303 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 305 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 306 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 307 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 308 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 310 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 311 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 314 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 315 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 316 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 317 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 322 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 323 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 324 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 325 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 326 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 329 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 332 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 334 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 335 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 336 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 337 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 338 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 340 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 341 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 342 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 343 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 345 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 346 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 348 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 351 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 352 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 353 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 354 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 355 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 357 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 360 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 361 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 363 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 366 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 367 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 369 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 371 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 372 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 373 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 374 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 375 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 376 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 377 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 378 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 379 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 381 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 382 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 383 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 384 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 385 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 386 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 387 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 388 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 389 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 390 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 393 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 394 | 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 395 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 396 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 397 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 398 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399 | 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 400 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 401 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 255, 403 | 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 0, 0, 0, 0, 0, 404 | 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 405 | 0, 0, 0, 0, 0, 0, 255, 255, 0, 255, 255, 0, 255, 0, 255, 255, 406 | 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 407 | 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 255, 255, 255, 0, 0, 255, 408 | 255, 0, 255, 0, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 409 | 255, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 410 | 255, 255, 0, 0, 255, 0, 0, 255, 255, 0, 255, 255, 255, 0, 255, 0, 411 | 0, 0, 255, 255, 0, 255, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 412 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 413 | 255, 0, 0, 255, 0, 255, 0, 255, 255, 255, 0, 0, 0, 0, 0, 0, 414 | 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 415 | 0, 0, 0, 0, 0, 0, 255, 255, 0, 255, 255, 0, 255, 0, 255, 0, 416 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 417 | 0, 0, 0, 0, 0, 0, 255, 0, 255, 0, 255, 255, 0, 0, 0, 255, 418 | 0, 0, 255, 255, 0, 0, 0, 255, 0, 0, 255, 0, 255, 0, 255, 255, 419 | 255, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 420 | 255, 0, 255, 0, 255, 0, 0, 255, 0, 0, 255, 255, 255, 0, 255, 0, 421 | 0, 255, 0, 255, 0, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 422 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 423 | 255, 0, 0, 255, 255, 255, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 424 | 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 425 | 0, 0, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 255, 426 | 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 427 | 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 255, 255, 255, 0, 255, 255, 428 | 0, 0, 255, 0, 255, 0, 0, 255, 0, 0, 255, 255, 255, 0, 255, 0, 429 | 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 430 | 255, 255, 0, 0, 255, 0, 255, 255, 0, 0, 255, 0, 0, 0, 255, 255, 431 | 0, 255, 255, 255, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0 432 | }; 433 | 434 | static unsigned char mono_background_stopped[] = { 435 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 436 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 437 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 438 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 439 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 440 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 441 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 442 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 443 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 444 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 445 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 446 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 447 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 448 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 449 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 451 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 452 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 453 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 454 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 455 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 456 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 458 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 459 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 460 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 461 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 462 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 463 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 464 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 465 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 468 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 469 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 470 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 471 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 472 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 473 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 474 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 475 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 476 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 477 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 478 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 479 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 481 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 482 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 483 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 484 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 485 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 486 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 487 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 488 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 490 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 492 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 493 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 494 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 495 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 496 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 497 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 498 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 499 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 501 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 502 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 503 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 504 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 505 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 506 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 507 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 508 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 509 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 510 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 511 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 512 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 513 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 514 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 515 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 516 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 517 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 518 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 519 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 520 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 521 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 522 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 523 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 524 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 525 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 527 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 528 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 529 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 530 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 531 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 532 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 533 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 535 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 536 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 538 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 539 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 542 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 543 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 544 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 545 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 546 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 547 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 548 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 549 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 550 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 551 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 552 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 553 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 554 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 555 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 556 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 557 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 558 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 560 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 561 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 562 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 563 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 564 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 565 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 566 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 567 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 568 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 569 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 570 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 572 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 573 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 574 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 575 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 576 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 577 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 578 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 579 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 580 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 581 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 582 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 583 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 584 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 585 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 587 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 588 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 590 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 592 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 593 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 594 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 595 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 596 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 597 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 598 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 599 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 600 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 601 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 602 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 603 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 604 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 605 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 606 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 608 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 609 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 610 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 611 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 612 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 614 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 615 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 616 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 617 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 618 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 619 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 620 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 621 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 622 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 623 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 624 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 625 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 626 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 627 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 628 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 629 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 630 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 631 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 632 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 633 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 634 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 635 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 636 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 639 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 640 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 641 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 642 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 643 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 644 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 645 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 646 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 647 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 649 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 650 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 651 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 652 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 653 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 654 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 655 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 656 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 657 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 658 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 659 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 660 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 661 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 662 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 663 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 664 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 665 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 666 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 667 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 668 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 669 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 670 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 671 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 672 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 673 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 674 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 675 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 676 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 677 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 678 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 679 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 680 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 681 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 682 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 683 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 684 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 685 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 686 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 687 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 688 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 689 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 690 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 691 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 692 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 693 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 694 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 695 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 696 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 697 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 698 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 699 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 700 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 701 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 702 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 703 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 704 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 705 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 706 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 707 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 708 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 709 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 710 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 711 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 712 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 713 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 714 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 715 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 716 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 717 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 718 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 719 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 720 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 721 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 722 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 723 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 724 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 725 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 726 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 727 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 728 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 729 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 730 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 731 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 732 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 733 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 734 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 735 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 736 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 737 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 738 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 739 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 740 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 741 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 742 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 743 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 744 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 745 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 746 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 747 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 748 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 749 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 750 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 751 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 752 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 753 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 754 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 755 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 756 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 757 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 758 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 759 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 760 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 761 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 762 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 763 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 764 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 765 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 766 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 767 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 768 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 769 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 770 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 771 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 772 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 773 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 774 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 775 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 776 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 777 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 778 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 779 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 780 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 781 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 782 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 783 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 784 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 785 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 786 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 787 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 788 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 789 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 790 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 791 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 792 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 793 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 794 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 795 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 796 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 797 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 798 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 799 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 800 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 801 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 802 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 803 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 804 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 805 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 806 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 807 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 808 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 809 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 810 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 811 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 812 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 813 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 814 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 815 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 816 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 817 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 818 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 819 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 820 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 821 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 822 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 823 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 824 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 825 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 826 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 827 | 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 828 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 829 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 830 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 831 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 832 | 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 833 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 834 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 835 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 255, 255, 836 | 255, 0, 0, 255, 255, 0, 255, 255, 0, 255, 255, 255, 0, 0, 0, 0, 837 | 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 838 | 0, 0, 0, 0, 0, 0, 255, 255, 0, 255, 255, 0, 255, 0, 255, 255, 839 | 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 840 | 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 255, 255, 255, 0, 0, 255, 841 | 255, 0, 255, 0, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 842 | 255, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 843 | 255, 255, 0, 0, 255, 0, 0, 255, 255, 0, 255, 255, 255, 0, 255, 0, 844 | 0, 0, 255, 255, 0, 255, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 845 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 255, 846 | 0, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 0, 0, 0, 0, 847 | 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 848 | 0, 0, 0, 0, 0, 0, 255, 255, 0, 255, 255, 0, 255, 0, 255, 0, 849 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 850 | 0, 0, 0, 0, 0, 0, 255, 0, 255, 0, 255, 255, 0, 0, 0, 255, 851 | 0, 0, 255, 255, 0, 0, 0, 255, 0, 0, 255, 0, 255, 0, 255, 255, 852 | 255, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 853 | 255, 0, 255, 0, 255, 0, 0, 255, 0, 0, 255, 255, 255, 0, 255, 0, 854 | 0, 255, 0, 255, 0, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 855 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 255, 856 | 0, 0, 255, 255, 255, 0, 255, 0, 0, 0, 255, 0, 0, 0, 0, 0, 857 | 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 858 | 0, 0, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 255, 859 | 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 860 | 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 255, 255, 255, 0, 255, 255, 861 | 0, 0, 255, 0, 255, 0, 0, 255, 0, 0, 255, 255, 255, 0, 255, 0, 862 | 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 863 | 255, 255, 0, 0, 255, 0, 255, 255, 0, 0, 255, 0, 0, 0, 255, 255, 864 | 0, 255, 255, 255, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0 865 | }; 866 | --------------------------------------------------------------------------------