// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- // // The contents of this file are subject to the Netscape Public // License Version 1.1 (the "License"); you may not use this file // except in compliance with the License. You may obtain a copy of // the License at http://www.mozilla.org/NPL/ // // Software distributed under the License is distributed on an "AS // IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr // implied. See the License for the specific language governing // rights and limitations under the License. // // The Original Code is the JavaScript 2 Prototype. // // The Initial Developer of the Original Code is Netscape // Communications Corporation. Portions created by Netscape are // Copyright (C) 1998 Netscape Communications Corporation. All // Rights Reserved. #include #include #include #include #include "utilities.h" #ifdef WIN32 #include #endif #ifdef XP_MAC #include #include #endif #ifdef XP_UNIX #include #endif namespace JS = JavaScript; // // Assertions // #ifdef DEBUG #ifdef XP_MAC // PStrFromCStr converts the source C string to a destination // pascal string as it copies. The dest string will // be truncated to fit into an Str255 if necessary. // If the C String pointer is NULL, the pascal string's length is // set to zero. static void PStrFromCStr(const char* src, Str255 &dst) { int length = 0; if (src) { char *p = reinterpret_cast(&dst[1]); int spaceLeft = 255; char ch; while ((ch = *src++) != 0) { *p++ = ch; if (--spaceLeft == 0) break; } length = 255 - spaceLeft; } dst[0] = (uchar)length; } static void jsdebugstr(const char *debuggerMsg) { Str255 pStr; PStrFromCStr(debuggerMsg, pStr); DebugStr(pStr); } static void dprintf(const char *format, ...) { std::va_list ap; char buffer[4096]; va_start(ap, format); std::vsprintf(buffer, format, ap); va_end(ap); jsdebugstr(buffer); } #endif /* XP_MAC */ void JS::Assert(const char *s, const char *file, int line) { #if defined(XP_UNIX) || defined(XP_OS2) std::fprintf(std::stderr, "Assertion failure: %s, at %s:%d\n", s, file, line); #endif #ifdef XP_MAC dprintf("Assertion failure: %s, at %s:%d\n", s, file, line); #endif #ifdef WIN32 DebugBreak(); #endif #ifndef XP_MAC abort(); #endif } #endif /* DEBUG */ // // Bit manipulation // // Return lg2 of the least power of 2 greater than or equal to n. // Return 0 if n is 0 or 1. uint JS::ceilingLog2(uint32 n) { uint log2 = 0; if (n & (n-1)) log2++; if (n >> 16) log2 += 16, n >>= 16; if (n >> 8) log2 += 8, n >>= 8; if (n >> 4) log2 += 4, n >>= 4; if (n >> 2) log2 += 2, n >>= 2; if (n >> 1) log2++; return log2; } // Return lg2 of the greatest power of 2 less than or equal to n. // This really just finds the highest set bit in the word. // Return 0 if n is 0 or 1. uint JS::floorLog2(uint32 n) { uint log2 = 0; if (n >> 16) log2 += 16, n >>= 16; if (n >> 8) log2 += 8, n >>= 8; if (n >> 4) log2 += 4, n >>= 4; if (n >> 2) log2 += 2, n >>= 2; if (n >> 1) log2++; return log2; } // // Unicode UTF-16 characters and strings // #ifdef _WIN32 // Microsoft VC6 bug: String constructor and append limited to char16 iterators // Return a String containing the characters of the null-terminated C string cstr // (without the trailing null). JS::String JS::widenCString(const char *cstr) { size_t len = strlen(cstr); String s(len, uni::null); std::transform(cstr, cstr+len, s.begin(), widen); return s; } // Widen and append length characters starting at chars to the end of str. void JS::appendChars(String &str, const char *chars, size_t length) { String::size_type strLen = str.size(); str.append(length, uni::null); std::transform(chars, chars+length, str.begin()+strLen, widen); } #endif // Widen and append the null-terminated string cstr to the end of str. // Return str. JS::String &JS::operator+=(String &str, const char *cstr) { appendChars(str, cstr, strlen(cstr)); return str; } // Return the concatenation of str and the null-terminated string cstr. JS::String JS::operator+(const String &str, const char *cstr) { return str + widenCString(cstr); } // Return the concatenation of the null-terminated string cstr and str. JS::String JS::operator+(const char *cstr, const String &str) { String s = widenCString(cstr); s += str; return s; } // From java.lang.Character: // // The character properties are currently encoded into 32 bits in the // following manner: // // 10 bits signed offset used for converting case // 1 bit if 1, adding the signed offset converts the character to // lowercase // 1 bit if 1, subtracting the signed offset converts the character to // uppercase // 1 bit if 1, character has a titlecase equivalent (possibly itself) // 3 bits 0 May not be part of an identifier // 1 Format control // 2 May start or continue a JS identifier (includes $ and _) // 3 May continue a JS identifier // 4 Behaves like a white space character (but not line break) // 5 Behaves like a line break character // 2 bits 0 this character has no numeric property // 1 adding the digit offset to the character code and then // masking with 0x1F will produce the desired numeric value // 2 this character has a "strange" numeric value // 3 a JS supradecimal digit: adding the digit offset to the // character code, then masking with 0x1F, then adding 10 // will produce the desired numeric value // 5 bits digit offset // 4 bits reserved for future use // 5 bits character type // The X table has 1024 entries for a total of 1024 bytes. const uint8 JS::CharInfo::x[] = { 0, 1, 2, 3, 4, 5, 6, 7, // 0x0000 8, 9, 10, 11, 12, 13, 14, 15, // 0x0200 16, 17, 18, 19, 20, 21, 22, 23, // 0x0400 24, 25, 26, 27, 28, 28, 28, 28, // 0x0600 28, 28, 28, 28, 29, 30, 31, 32, // 0x0800 33, 34, 35, 36, 37, 38, 39, 40, // 0x0A00 41, 42, 43, 44, 45, 46, 28, 28, // 0x0C00 47, 48, 49, 50, 51, 52, 53, 28, // 0x0E00 28, 28, 54, 55, 56, 57, 58, 59, // 0x1000 28, 28, 28, 28, 28, 28, 28, 28, // 0x1200 28, 28, 28, 28, 28, 28, 28, 28, // 0x1400 28, 28, 28, 28, 28, 28, 28, 28, // 0x1600 28, 28, 28, 28, 28, 28, 28, 28, // 0x1800 28, 28, 28, 28, 28, 28, 28, 28, // 0x1A00 28, 28, 28, 28, 28, 28, 28, 28, // 0x1C00 60, 60, 61, 62, 63, 64, 65, 66, // 0x1E00 67, 68, 69, 70, 71, 72, 73, 74, // 0x2000 75, 75, 75, 76, 77, 78, 28, 28, // 0x2200 79, 80, 81, 82, 83, 83, 84, 85, // 0x2400 86, 85, 28, 28, 87, 88, 89, 28, // 0x2600 28, 28, 28, 28, 28, 28, 28, 28, // 0x2800 28, 28, 28, 28, 28, 28, 28, 28, // 0x2A00 28, 28, 28, 28, 28, 28, 28, 28, // 0x2C00 28, 28, 28, 28, 28, 28, 28, 28, // 0x2E00 90, 91, 92, 93, 94, 56, 95, 28, // 0x3000 96, 97, 98, 99, 83, 100, 83, 101, // 0x3200 28, 28, 28, 28, 28, 28, 28, 28, // 0x3400 28, 28, 28, 28, 28, 28, 28, 28, // 0x3600 28, 28, 28, 28, 28, 28, 28, 28, // 0x3800 28, 28, 28, 28, 28, 28, 28, 28, // 0x3A00 28, 28, 28, 28, 28, 28, 28, 28, // 0x3C00 28, 28, 28, 28, 28, 28, 28, 28, // 0x3E00 28, 28, 28, 28, 28, 28, 28, 28, // 0x4000 28, 28, 28, 28, 28, 28, 28, 28, // 0x4200 28, 28, 28, 28, 28, 28, 28, 28, // 0x4400 28, 28, 28, 28, 28, 28, 28, 28, // 0x4600 28, 28, 28, 28, 28, 28, 28, 28, // 0x4800 28, 28, 28, 28, 28, 28, 28, 28, // 0x4A00 28, 28, 28, 28, 28, 28, 28, 28, // 0x4C00 56, 56, 56, 56, 56, 56, 56, 56, // 0x4E00 56, 56, 56, 56, 56, 56, 56, 56, // 0x5000 56, 56, 56, 56, 56, 56, 56, 56, // 0x5200 56, 56, 56, 56, 56, 56, 56, 56, // 0x5400 56, 56, 56, 56, 56, 56, 56, 56, // 0x5600 56, 56, 56, 56, 56, 56, 56, 56, // 0x5800 56, 56, 56, 56, 56, 56, 56, 56, // 0x5A00 56, 56, 56, 56, 56, 56, 56, 56, // 0x5C00 56, 56, 56, 56, 56, 56, 56, 56, // 0x5E00 56, 56, 56, 56, 56, 56, 56, 56, // 0x6000 56, 56, 56, 56, 56, 56, 56, 56, // 0x6200 56, 56, 56, 56, 56, 56, 56, 56, // 0x6400 56, 56, 56, 56, 56, 56, 56, 56, // 0x6600 56, 56, 56, 56, 56, 56, 56, 56, // 0x6800 56, 56, 56, 56, 56, 56, 56, 56, // 0x6A00 56, 56, 56, 56, 56, 56, 56, 56, // 0x6C00 56, 56, 56, 56, 56, 56, 56, 56, // 0x6E00 56, 56, 56, 56, 56, 56, 56, 56, // 0x7000 56, 56, 56, 56, 56, 56, 56, 56, // 0x7200 56, 56, 56, 56, 56, 56, 56, 56, // 0x7400 56, 56, 56, 56, 56, 56, 56, 56, // 0x7600 56, 56, 56, 56, 56, 56, 56, 56, // 0x7800 56, 56, 56, 56, 56, 56, 56, 56, // 0x7A00 56, 56, 56, 56, 56, 56, 56, 56, // 0x7C00 56, 56, 56, 56, 56, 56, 56, 56, // 0x7E00 56, 56, 56, 56, 56, 56, 56, 56, // 0x8000 56, 56, 56, 56, 56, 56, 56, 56, // 0x8200 56, 56, 56, 56, 56, 56, 56, 56, // 0x8400 56, 56, 56, 56, 56, 56, 56, 56, // 0x8600 56, 56, 56, 56, 56, 56, 56, 56, // 0x8800 56, 56, 56, 56, 56, 56, 56, 56, // 0x8A00 56, 56, 56, 56, 56, 56, 56, 56, // 0x8C00 56, 56, 56, 56, 56, 56, 56, 56, // 0x8E00 56, 56, 56, 56, 56, 56, 56, 56, // 0x9000 56, 56, 56, 56, 56, 56, 56, 56, // 0x9200 56, 56, 56, 56, 56, 56, 56, 56, // 0x9400 56, 56, 56, 56, 56, 56, 56, 56, // 0x9600 56, 56, 56, 56, 56, 56, 56, 56, // 0x9800 56, 56, 56, 56, 56, 56, 56, 56, // 0x9A00 56, 56, 56, 56, 56, 56, 56, 56, // 0x9C00 56, 56, 56, 56, 56, 56, 102, 28, // 0x9E00 28, 28, 28, 28, 28, 28, 28, 28, // 0xA000 28, 28, 28, 28, 28, 28, 28, 28, // 0xA200 28, 28, 28, 28, 28, 28, 28, 28, // 0xA400 28, 28, 28, 28, 28, 28, 28, 28, // 0xA600 28, 28, 28, 28, 28, 28, 28, 28, // 0xA800 28, 28, 28, 28, 28, 28, 28, 28, // 0xAA00 56, 56, 56, 56, 56, 56, 56, 56, // 0xAC00 56, 56, 56, 56, 56, 56, 56, 56, // 0xAE00 56, 56, 56, 56, 56, 56, 56, 56, // 0xB000 56, 56, 56, 56, 56, 56, 56, 56, // 0xB200 56, 56, 56, 56, 56, 56, 56, 56, // 0xB400 56, 56, 56, 56, 56, 56, 56, 56, // 0xB600 56, 56, 56, 56, 56, 56, 56, 56, // 0xB800 56, 56, 56, 56, 56, 56, 56, 56, // 0xBA00 56, 56, 56, 56, 56, 56, 56, 56, // 0xBC00 56, 56, 56, 56, 56, 56, 56, 56, // 0xBE00 56, 56, 56, 56, 56, 56, 56, 56, // 0xC000 56, 56, 56, 56, 56, 56, 56, 56, // 0xC200 56, 56, 56, 56, 56, 56, 56, 56, // 0xC400 56, 56, 56, 56, 56, 56, 56, 56, // 0xC600 56, 56, 56, 56, 56, 56, 56, 56, // 0xC800 56, 56, 56, 56, 56, 56, 56, 56, // 0xCA00 56, 56, 56, 56, 56, 56, 56, 56, // 0xCC00 56, 56, 56, 56, 56, 56, 56, 56, // 0xCE00 56, 56, 56, 56, 56, 56, 56, 56, // 0xD000 56, 56, 56, 56, 56, 56, 56, 56, // 0xD200 56, 56, 56, 56, 56, 56, 56, 56, // 0xD400 56, 56, 56, 56, 56, 56, 103, 28, // 0xD600 104, 104, 104, 104, 104, 104, 104, 104, // 0xD800 104, 104, 104, 104, 104, 104, 104, 104, // 0xDA00 104, 104, 104, 104, 104, 104, 104, 104, // 0xDC00 104, 104, 104, 104, 104, 104, 104, 104, // 0xDE00 105, 105, 105, 105, 105, 105, 105, 105, // 0xE000 105, 105, 105, 105, 105, 105, 105, 105, // 0xE200 105, 105, 105, 105, 105, 105, 105, 105, // 0xE400 105, 105, 105, 105, 105, 105, 105, 105, // 0xE600 105, 105, 105, 105, 105, 105, 105, 105, // 0xE800 105, 105, 105, 105, 105, 105, 105, 105, // 0xEA00 105, 105, 105, 105, 105, 105, 105, 105, // 0xEC00 105, 105, 105, 105, 105, 105, 105, 105, // 0xEE00 105, 105, 105, 105, 105, 105, 105, 105, // 0xF000 105, 105, 105, 105, 105, 105, 105, 105, // 0xF200 105, 105, 105, 105, 105, 105, 105, 105, // 0xF400 105, 105, 105, 105, 105, 105, 105, 105, // 0xF600 105, 105, 105, 105, 56, 56, 56, 56, // 0xF800 106, 28, 28, 28, 107, 108, 109, 110, // 0xFA00 56, 56, 56, 56, 111, 112, 113, 114, // 0xFC00 115, 116, 56, 117, 118, 119, 120, 121 // 0xFE00 }; // The Y table has 7808 entries for a total of 7808 bytes. const uint8 JS::CharInfo::y[] = { 0, 0, 0, 0, 0, 0, 0, 0, // 0 0, 1, 14, 1, 1, 14, 0, 0, // 0 0, 0, 0, 0, 0, 0, 0, 0, // 0 0, 0, 0, 0, 0, 0, 0, 0, // 0 2, 3, 3, 3, 4, 3, 3, 3, // 0 5, 6, 3, 7, 3, 8, 3, 3, // 0 9, 9, 9, 9, 9, 9, 9, 9, // 0 9, 9, 3, 3, 7, 7, 7, 3, // 0 3, 10, 10, 10, 10, 10, 10, 10, // 1 10, 10, 10, 10, 10, 10, 10, 10, // 1 10, 10, 10, 10, 10, 10, 10, 10, // 1 10, 10, 10, 5, 3, 6, 11, 12, // 1 11, 13, 13, 13, 13, 13, 13, 13, // 1 13, 13, 13, 13, 13, 13, 13, 13, // 1 13, 13, 13, 13, 13, 13, 13, 13, // 1 13, 13, 13, 5, 7, 6, 7, 0, // 1 0, 0, 0, 0, 0, 0, 0, 0, // 2 0, 0, 0, 0, 0, 0, 0, 0, // 2 0, 0, 0, 0, 0, 0, 0, 0, // 2 0, 0, 0, 0, 0, 0, 0, 0, // 2 2, 3, 4, 4, 4, 4, 15, 15, // 2 11, 15, 16, 5, 7, 8, 15, 11, // 2 15, 7, 17, 17, 11, 16, 15, 3, // 2 11, 18, 16, 6, 19, 19, 19, 3, // 2 20, 20, 20, 20, 20, 20, 20, 20, // 3 20, 20, 20, 20, 20, 20, 20, 20, // 3 20, 20, 20, 20, 20, 20, 20, 7, // 3 20, 20, 20, 20, 20, 20, 20, 16, // 3 21, 21, 21, 21, 21, 21, 21, 21, // 3 21, 21, 21, 21, 21, 21, 21, 21, // 3 21, 21, 21, 21, 21, 21, 21, 7, // 3 21, 21, 21, 21, 21, 21, 21, 22, // 3 23, 24, 23, 24, 23, 24, 23, 24, // 4 23, 24, 23, 24, 23, 24, 23, 24, // 4 23, 24, 23, 24, 23, 24, 23, 24, // 4 23, 24, 23, 24, 23, 24, 23, 24, // 4 23, 24, 23, 24, 23, 24, 23, 24, // 4 23, 24, 23, 24, 23, 24, 23, 24, // 4 25, 26, 23, 24, 23, 24, 23, 24, // 4 16, 23, 24, 23, 24, 23, 24, 23, // 4 24, 23, 24, 23, 24, 23, 24, 23, // 5 24, 16, 23, 24, 23, 24, 23, 24, // 5 23, 24, 23, 24, 23, 24, 23, 24, // 5 23, 24, 23, 24, 23, 24, 23, 24, // 5 23, 24, 23, 24, 23, 24, 23, 24, // 5 23, 24, 23, 24, 23, 24, 23, 24, // 5 23, 24, 23, 24, 23, 24, 23, 24, // 5 27, 23, 24, 23, 24, 23, 24, 28, // 5 16, 29, 23, 24, 23, 24, 30, 23, // 6 24, 31, 31, 23, 24, 16, 32, 32, // 6 33, 23, 24, 31, 34, 16, 35, 36, // 6 23, 24, 16, 16, 35, 37, 16, 38, // 6 23, 24, 23, 24, 23, 24, 38, 23, // 6 24, 39, 40, 16, 23, 24, 39, 23, // 6 24, 41, 41, 23, 24, 23, 24, 42, // 6 23, 24, 16, 40, 23, 24, 40, 40, // 6 40, 40, 40, 40, 43, 44, 45, 43, // 7 44, 45, 43, 44, 45, 23, 24, 23, // 7 24, 23, 24, 23, 24, 23, 24, 23, // 7 24, 23, 24, 23, 24, 16, 23, 24, // 7 23, 24, 23, 24, 23, 24, 23, 24, // 7 23, 24, 23, 24, 23, 24, 23, 24, // 7 16, 43, 44, 45, 23, 24, 46, 46, // 7 46, 46, 23, 24, 23, 24, 23, 24, // 7 23, 24, 23, 24, 23, 24, 23, 24, // 8 23, 24, 23, 24, 23, 24, 23, 24, // 8 23, 24, 23, 24, 23, 24, 23, 24, // 8 46, 46, 46, 46, 46, 46, 46, 46, // 8 46, 46, 46, 46, 46, 46, 46, 46, // 8 46, 46, 46, 46, 46, 46, 46, 46, // 8 46, 46, 46, 46, 46, 46, 46, 46, // 8 46, 46, 46, 46, 46, 46, 46, 46, // 8 46, 46, 46, 46, 46, 46, 46, 46, // 9 46, 46, 46, 46, 46, 46, 46, 46, // 9 16, 16, 16, 47, 48, 16, 49, 49, // 9 50, 50, 16, 51, 16, 16, 16, 16, // 9 49, 16, 16, 52, 16, 16, 16, 16, // 9 53, 54, 16, 16, 16, 16, 16, 54, // 9 16, 16, 55, 16, 16, 16, 16, 16, // 9 16, 16, 16, 16, 16, 16, 16, 16, // 9 16, 16, 16, 56, 16, 16, 16, 16, // 10 56, 16, 57, 57, 16, 16, 16, 16, // 10 16, 16, 58, 16, 16, 16, 16, 16, // 10 16, 16, 16, 16, 16, 16, 16, 16, // 10 16, 16, 16, 16, 16, 16, 16, 16, // 10 16, 46, 46, 46, 46, 46, 46, 46, // 10 59, 59, 59, 59, 59, 59, 59, 59, // 10 59, 11, 11, 59, 59, 59, 59, 59, // 10 59, 59, 11, 11, 11, 11, 11, 11, // 11 11, 11, 11, 11, 11, 11, 11, 11, // 11 59, 59, 11, 11, 11, 11, 11, 11, // 11 11, 11, 11, 11, 11, 11, 11, 46, // 11 59, 59, 59, 59, 59, 11, 11, 11, // 11 11, 11, 46, 46, 46, 46, 46, 46, // 11 46, 46, 46, 46, 46, 46, 46, 46, // 11 46, 46, 46, 46, 46, 46, 46, 46, // 11 60, 60, 60, 60, 60, 60, 60, 60, // 12 60, 60, 60, 60, 60, 60, 60, 60, // 12 60, 60, 60, 60, 60, 60, 60, 60, // 12 60, 60, 60, 60, 60, 60, 60, 60, // 12 60, 60, 60, 60, 60, 60, 60, 60, // 12 60, 60, 60, 60, 60, 60, 60, 60, // 12 60, 60, 60, 60, 60, 60, 60, 60, // 12 60, 60, 60, 60, 60, 60, 60, 60, // 12 60, 60, 60, 60, 60, 60, 46, 46, // 13 46, 46, 46, 46, 46, 46, 46, 46, // 13 46, 46, 46, 46, 46, 46, 46, 46, // 13 46, 46, 46, 46, 46, 46, 46, 46, // 13 60, 60, 46, 46, 46, 46, 46, 46, // 13 46, 46, 46, 46, 46, 46, 46, 46, // 13 46, 46, 46, 46, 3, 3, 46, 46, // 13 46, 46, 59, 46, 46, 46, 3, 46, // 13 46, 46, 46, 46, 11, 11, 61, 3, // 14 62, 62, 62, 46, 63, 46, 64, 64, // 14 16, 20, 20, 20, 20, 20, 20, 20, // 14 20, 20, 20, 20, 20, 20, 20, 20, // 14 20, 20, 46, 20, 20, 20, 20, 20, // 14 20, 20, 20, 20, 65, 66, 66, 66, // 14 16, 21, 21, 21, 21, 21, 21, 21, // 14 21, 21, 21, 21, 21, 21, 21, 21, // 14 21, 21, 16, 21, 21, 21, 21, 21, // 15 21, 21, 21, 21, 67, 68, 68, 46, // 15 69, 70, 38, 38, 38, 71, 72, 46, // 15 46, 46, 38, 46, 38, 46, 38, 46, // 15 38, 46, 23, 24, 23, 24, 23, 24, // 15 23, 24, 23, 24, 23, 24, 23, 24, // 15 73, 74, 16, 40, 46, 46, 46, 46, // 15 46, 46, 46, 46, 46, 46, 46, 46, // 15 46, 75, 75, 75, 75, 75, 75, 75, // 16 75, 75, 75, 75, 75, 46, 75, 75, // 16 20, 20, 20, 20, 20, 20, 20, 20, // 16 20, 20, 20, 20, 20, 20, 20, 20, // 16 20, 20, 20, 20, 20, 20, 20, 20, // 16 20, 20, 20, 20, 20, 20, 20, 20, // 16 21, 21, 21, 21, 21, 21, 21, 21, // 16 21, 21, 21, 21, 21, 21, 21, 21, // 16 21, 21, 21, 21, 21, 21, 21, 21, // 17 21, 21, 21, 21, 21, 21, 21, 21, // 17 46, 74, 74, 74, 74, 74, 74, 74, // 17 74, 74, 74, 74, 74, 46, 74, 74, // 17 23, 24, 23, 24, 23, 24, 23, 24, // 17 23, 24, 23, 24, 23, 24, 23, 24, // 17 23, 24, 23, 24, 23, 24, 23, 24, // 17 23, 24, 23, 24, 23, 24, 23, 24, // 17 23, 24, 15, 60, 60, 60, 60, 46, // 18 46, 46, 46, 46, 46, 46, 46, 46, // 18 23, 24, 23, 24, 23, 24, 23, 24, // 18 23, 24, 23, 24, 23, 24, 23, 24, // 18 23, 24, 23, 24, 23, 24, 23, 24, // 18 23, 24, 23, 24, 23, 24, 23, 24, // 18 23, 24, 23, 24, 23, 24, 23, 24, // 18 23, 24, 23, 24, 23, 24, 23, 24, // 18 40, 23, 24, 23, 24, 46, 46, 23, // 19 24, 46, 46, 23, 24, 46, 46, 46, // 19 23, 24, 23, 24, 23, 24, 23, 24, // 19 23, 24, 23, 24, 23, 24, 23, 24, // 19 23, 24, 23, 24, 23, 24, 23, 24, // 19 23, 24, 23, 24, 46, 46, 23, 24, // 19 23, 24, 23, 24, 23, 24, 46, 46, // 19 23, 24, 46, 46, 46, 46, 46, 46, // 19 46, 46, 46, 46, 46, 46, 46, 46, // 20 46, 46, 46, 46, 46, 46, 46, 46, // 20 46, 46, 46, 46, 46, 46, 46, 46, // 20 46, 46, 46, 46, 46, 46, 46, 46, // 20 46, 46, 46, 46, 46, 46, 46, 46, // 20 46, 46, 46, 46, 46, 46, 46, 46, // 20 46, 76, 76, 76, 76, 76, 76, 76, // 20 76, 76, 76, 76, 76, 76, 76, 76, // 20 76, 76, 76, 76, 76, 76, 76, 76, // 21 76, 76, 76, 76, 76, 76, 76, 76, // 21 76, 76, 76, 76, 76, 76, 76, 46, // 21 46, 59, 3, 3, 3, 3, 3, 3, // 21 46, 77, 77, 77, 77, 77, 77, 77, // 21 77, 77, 77, 77, 77, 77, 77, 77, // 21 77, 77, 77, 77, 77, 77, 77, 77, // 21 77, 77, 77, 77, 77, 77, 77, 77, // 21 77, 77, 77, 77, 77, 77, 77, 16, // 22 46, 3, 46, 46, 46, 46, 46, 46, // 22 46, 60, 60, 60, 60, 60, 60, 60, // 22 60, 60, 60, 60, 60, 60, 60, 60, // 22 60, 60, 46, 60, 60, 60, 60, 60, // 22 60, 60, 60, 60, 60, 60, 60, 60, // 22 60, 60, 60, 60, 60, 60, 60, 60, // 22 60, 60, 46, 60, 60, 60, 3, 60, // 22 3, 60, 60, 3, 60, 46, 46, 46, // 23 46, 46, 46, 46, 46, 46, 46, 46, // 23 40, 40, 40, 40, 40, 40, 40, 40, // 23 40, 40, 40, 40, 40, 40, 40, 40, // 23 40, 40, 40, 40, 40, 40, 40, 40, // 23 40, 40, 40, 46, 46, 46, 46, 46, // 23 40, 40, 40, 3, 3, 46, 46, 46, // 23 46, 46, 46, 46, 46, 46, 46, 46, // 23 46, 46, 46, 46, 46, 46, 46, 46, // 24 46, 46, 46, 46, 3, 46, 46, 46, // 24 46, 46, 46, 46, 46, 46, 46, 46, // 24 46, 46, 46, 3, 46, 46, 46, 3, // 24 46, 40, 40, 40, 40, 40, 40, 40, // 24 40, 40, 40, 40, 40, 40, 40, 40, // 24 40, 40, 40, 40, 40, 40, 40, 40, // 24 40, 40, 40, 46, 46, 46, 46, 46, // 24 59, 40, 40, 40, 40, 40, 40, 40, // 25 40, 40, 40, 60, 60, 60, 60, 60, // 25 60, 60, 60, 46, 46, 46, 46, 46, // 25 46, 46, 46, 46, 46, 46, 46, 46, // 25 78, 78, 78, 78, 78, 78, 78, 78, // 25 78, 78, 3, 3, 3, 3, 46, 46, // 25 60, 40, 40, 40, 40, 40, 40, 40, // 25 40, 40, 40, 40, 40, 40, 40, 40, // 25 40, 40, 40, 40, 40, 40, 40, 40, // 26 40, 40, 40, 40, 40, 40, 40, 40, // 26 40, 40, 40, 40, 40, 40, 40, 40, // 26 40, 40, 40, 40, 40, 40, 40, 40, // 26 40, 40, 40, 40, 40, 40, 40, 40, // 26 40, 40, 40, 40, 40, 40, 40, 40, // 26 40, 40, 40, 40, 40, 40, 40, 40, // 26 46, 46, 40, 40, 40, 40, 40, 46, // 26 40, 40, 40, 40, 40, 40, 40, 40, // 27 40, 40, 40, 40, 40, 40, 40, 46, // 27 40, 40, 40, 40, 3, 40, 60, 60, // 27 60, 60, 60, 60, 60, 79, 79, 60, // 27 60, 60, 60, 60, 60, 59, 59, 60, // 27 60, 15, 60, 60, 60, 60, 46, 46, // 27 9, 9, 9, 9, 9, 9, 9, 9, // 27 9, 9, 46, 46, 46, 46, 46, 46, // 27 46, 46, 46, 46, 46, 46, 46, 46, // 28 46, 46, 46, 46, 46, 46, 46, 46, // 28 46, 46, 46, 46, 46, 46, 46, 46, // 28 46, 46, 46, 46, 46, 46, 46, 46, // 28 46, 46, 46, 46, 46, 46, 46, 46, // 28 46, 46, 46, 46, 46, 46, 46, 46, // 28 46, 46, 46, 46, 46, 46, 46, 46, // 28 46, 46, 46, 46, 46, 46, 46, 46, // 28 46, 60, 60, 80, 46, 40, 40, 40, // 29 40, 40, 40, 40, 40, 40, 40, 40, // 29 40, 40, 40, 40, 40, 40, 40, 40, // 29 40, 40, 40, 40, 40, 40, 40, 40, // 29 40, 40, 40, 40, 40, 40, 40, 40, // 29 40, 40, 40, 40, 40, 40, 40, 40, // 29 40, 40, 40, 40, 40, 40, 40, 40, // 29 40, 40, 46, 46, 60, 40, 80, 80, // 29 80, 60, 60, 60, 60, 60, 60, 60, // 30 60, 80, 80, 80, 80, 60, 46, 46, // 30 15, 60, 60, 60, 60, 46, 46, 46, // 30 40, 40, 40, 40, 40, 40, 40, 40, // 30 40, 40, 60, 60, 3, 3, 81, 81, // 30 81, 81, 81, 81, 81, 81, 81, 81, // 30 3, 46, 46, 46, 46, 46, 46, 46, // 30 46, 46, 46, 46, 46, 46, 46, 46, // 30 46, 60, 80, 80, 46, 40, 40, 40, // 31 40, 40, 40, 40, 40, 46, 46, 40, // 31 40, 46, 46, 40, 40, 40, 40, 40, // 31 40, 40, 40, 40, 40, 40, 40, 40, // 31 40, 40, 40, 40, 40, 40, 40, 40, // 31 40, 46, 40, 40, 40, 40, 40, 40, // 31 40, 46, 40, 46, 46, 46, 40, 40, // 31 40, 40, 46, 46, 60, 46, 80, 80, // 31 80, 60, 60, 60, 60, 46, 46, 80, // 32 80, 46, 46, 80, 80, 60, 46, 46, // 32 46, 46, 46, 46, 46, 46, 46, 80, // 32 46, 46, 46, 46, 40, 40, 46, 40, // 32 40, 40, 60, 60, 46, 46, 81, 81, // 32 81, 81, 81, 81, 81, 81, 81, 81, // 32 40, 40, 4, 4, 82, 82, 82, 82, // 32 19, 83, 15, 46, 46, 46, 46, 46, // 32 46, 46, 60, 46, 46, 40, 40, 40, // 33 40, 40, 40, 46, 46, 46, 46, 40, // 33 40, 46, 46, 40, 40, 40, 40, 40, // 33 40, 40, 40, 40, 40, 40, 40, 40, // 33 40, 40, 40, 40, 40, 40, 40, 40, // 33 40, 46, 40, 40, 40, 40, 40, 40, // 33 40, 46, 40, 40, 46, 40, 40, 46, // 33 40, 40, 46, 46, 60, 46, 80, 80, // 33 80, 60, 60, 46, 46, 46, 46, 60, // 34 60, 46, 46, 60, 60, 60, 46, 46, // 34 46, 46, 46, 46, 46, 46, 46, 46, // 34 46, 40, 40, 40, 40, 46, 40, 46, // 34 46, 46, 46, 46, 46, 46, 81, 81, // 34 81, 81, 81, 81, 81, 81, 81, 81, // 34 60, 60, 40, 40, 40, 46, 46, 46, // 34 46, 46, 46, 46, 46, 46, 46, 46, // 34 46, 60, 60, 80, 46, 40, 40, 40, // 35 40, 40, 40, 40, 46, 40, 46, 40, // 35 40, 40, 46, 40, 40, 40, 40, 40, // 35 40, 40, 40, 40, 40, 40, 40, 40, // 35 40, 40, 40, 40, 40, 40, 40, 40, // 35 40, 46, 40, 40, 40, 40, 40, 40, // 35 40, 46, 40, 40, 46, 40, 40, 40, // 35 40, 40, 46, 46, 60, 40, 80, 80, // 35 80, 60, 60, 60, 60, 60, 46, 60, // 36 60, 80, 46, 80, 80, 60, 46, 46, // 36 15, 46, 46, 46, 46, 46, 46, 46, // 36 46, 46, 46, 46, 46, 46, 46, 46, // 36 40, 46, 46, 46, 46, 46, 81, 81, // 36 81, 81, 81, 81, 81, 81, 81, 81, // 36 46, 46, 46, 46, 46, 46, 46, 46, // 36 46, 46, 46, 46, 46, 46, 46, 46, // 36 46, 60, 80, 80, 46, 40, 40, 40, // 37 40, 40, 40, 40, 40, 46, 46, 40, // 37 40, 46, 46, 40, 40, 40, 40, 40, // 37 40, 40, 40, 40, 40, 40, 40, 40, // 37 40, 40, 40, 40, 40, 40, 40, 40, // 37 40, 46, 40, 40, 40, 40, 40, 40, // 37 40, 46, 40, 40, 46, 46, 40, 40, // 37 40, 40, 46, 46, 60, 40, 80, 60, // 37 80, 60, 60, 60, 46, 46, 46, 80, // 38 80, 46, 46, 80, 80, 60, 46, 46, // 38 46, 46, 46, 46, 46, 46, 60, 80, // 38 46, 46, 46, 46, 40, 40, 46, 40, // 38 40, 40, 46, 46, 46, 46, 81, 81, // 38 81, 81, 81, 81, 81, 81, 81, 81, // 38 15, 46, 46, 46, 46, 46, 46, 46, // 38 46, 46, 46, 46, 46, 46, 46, 46, // 38 46, 46, 60, 80, 46, 40, 40, 40, // 39 40, 40, 40, 46, 46, 46, 40, 40, // 39 40, 46, 40, 40, 40, 40, 46, 46, // 39 46, 40, 40, 46, 40, 46, 40, 40, // 39 46, 46, 46, 40, 40, 46, 46, 46, // 39 40, 40, 40, 46, 46, 46, 40, 40, // 39 40, 40, 40, 40, 40, 40, 46, 40, // 39 40, 40, 46, 46, 46, 46, 80, 80, // 39 60, 80, 80, 46, 46, 46, 80, 80, // 40 80, 46, 80, 80, 80, 60, 46, 46, // 40 46, 46, 46, 46, 46, 46, 46, 80, // 40 46, 46, 46, 46, 46, 46, 46, 46, // 40 46, 46, 46, 46, 46, 46, 46, 81, // 40 81, 81, 81, 81, 81, 81, 81, 81, // 40 84, 19, 19, 46, 46, 46, 46, 46, // 40 46, 46, 46, 46, 46, 46, 46, 46, // 40 46, 80, 80, 80, 46, 40, 40, 40, // 41 40, 40, 40, 40, 40, 46, 40, 40, // 41 40, 46, 40, 40, 40, 40, 40, 40, // 41 40, 40, 40, 40, 40, 40, 40, 40, // 41 40, 40, 40, 40, 40, 40, 40, 40, // 41 40, 46, 40, 40, 40, 40, 40, 40, // 41 40, 40, 40, 40, 46, 40, 40, 40, // 41 40, 40, 46, 46, 46, 46, 60, 60, // 41 60, 80, 80, 80, 80, 46, 60, 60, // 42 60, 46, 60, 60, 60, 60, 46, 46, // 42 46, 46, 46, 46, 46, 60, 60, 46, // 42 46, 46, 46, 46, 46, 46, 46, 46, // 42 40, 40, 46, 46, 46, 46, 81, 81, // 42 81, 81, 81, 81, 81, 81, 81, 81, // 42 46, 46, 46, 46, 46, 46, 46, 46, // 42 46, 46, 46, 46, 46, 46, 46, 46, // 42 46, 46, 80, 80, 46, 40, 40, 40, // 43 40, 40, 40, 40, 40, 46, 40, 40, // 43 40, 46, 40, 40, 40, 40, 40, 40, // 43 40, 40, 40, 40, 40, 40, 40, 40, // 43 40, 40, 40, 40, 40, 40, 40, 40, // 43 40, 46, 40, 40, 40, 40, 40, 40, // 43 40, 40, 40, 40, 46, 40, 40, 40, // 43 40, 40, 46, 46, 46, 46, 80, 60, // 43 80, 80, 80, 80, 80, 46, 60, 80, // 44 80, 46, 80, 80, 60, 60, 46, 46, // 44 46, 46, 46, 46, 46, 80, 80, 46, // 44 46, 46, 46, 46, 46, 46, 40, 46, // 44 40, 40, 46, 46, 46, 46, 81, 81, // 44 81, 81, 81, 81, 81, 81, 81, 81, // 44 46, 46, 46, 46, 46, 46, 46, 46, // 44 46, 46, 46, 46, 46, 46, 46, 46, // 44 46, 46, 80, 80, 46, 40, 40, 40, // 45 40, 40, 40, 40, 40, 46, 40, 40, // 45 40, 46, 40, 40, 40, 40, 40, 40, // 45 40, 40, 40, 40, 40, 40, 40, 40, // 45 40, 40, 40, 40, 40, 40, 40, 40, // 45 40, 46, 40, 40, 40, 40, 40, 40, // 45 40, 40, 40, 40, 40, 40, 40, 40, // 45 40, 40, 46, 46, 46, 46, 80, 80, // 45 80, 60, 60, 60, 46, 46, 80, 80, // 46 80, 46, 80, 80, 80, 60, 46, 46, // 46 46, 46, 46, 46, 46, 46, 46, 80, // 46 46, 46, 46, 46, 46, 46, 46, 46, // 46 40, 40, 46, 46, 46, 46, 81, 81, // 46 81, 81, 81, 81, 81, 81, 81, 81, // 46 46, 46, 46, 46, 46, 46, 46, 46, // 46 46, 46, 46, 46, 46, 46, 46, 46, // 46 46, 40, 40, 40, 40, 40, 40, 40, // 47 40, 40, 40, 40, 40, 40, 40, 40, // 47 40, 40, 40, 40, 40, 40, 40, 40, // 47 40, 40, 40, 40, 40, 40, 40, 40, // 47 40, 40, 40, 40, 40, 40, 40, 40, // 47 40, 40, 40, 40, 40, 40, 40, 3, // 47 40, 60, 40, 40, 60, 60, 60, 60, // 47 60, 60, 60, 46, 46, 46, 46, 4, // 47 40, 40, 40, 40, 40, 40, 59, 60, // 48 60, 60, 60, 60, 60, 60, 60, 15, // 48 9, 9, 9, 9, 9, 9, 9, 9, // 48 9, 9, 3, 3, 46, 46, 46, 46, // 48 46, 46, 46, 46, 46, 46, 46, 46, // 48 46, 46, 46, 46, 46, 46, 46, 46, // 48 46, 46, 46, 46, 46, 46, 46, 46, // 48 46, 46, 46, 46, 46, 46, 46, 46, // 48 46, 40, 40, 46, 40, 46, 46, 40, // 49 40, 46, 40, 46, 46, 40, 46, 46, // 49 46, 46, 46, 46, 40, 40, 40, 40, // 49 46, 40, 40, 40, 40, 40, 40, 40, // 49 46, 40, 40, 40, 46, 40, 46, 40, // 49 46, 46, 40, 40, 46, 40, 40, 3, // 49 40, 60, 40, 40, 60, 60, 60, 60, // 49 60, 60, 46, 60, 60, 40, 46, 46, // 49 40, 40, 40, 40, 40, 46, 59, 46, // 50 60, 60, 60, 60, 60, 60, 46, 46, // 50 9, 9, 9, 9, 9, 9, 9, 9, // 50 9, 9, 46, 46, 40, 40, 46, 46, // 50 46, 46, 46, 46, 46, 46, 46, 46, // 50 46, 46, 46, 46, 46, 46, 46, 46, // 50 46, 46, 46, 46, 46, 46, 46, 46, // 50 46, 46, 46, 46, 46, 46, 46, 46, // 50 15, 15, 15, 15, 3, 3, 3, 3, // 51 3, 3, 3, 3, 3, 3, 3, 3, // 51 3, 3, 3, 15, 15, 15, 15, 15, // 51 60, 60, 15, 15, 15, 15, 15, 15, // 51 78, 78, 78, 78, 78, 78, 78, 78, // 51 78, 78, 85, 85, 85, 85, 85, 85, // 51 85, 85, 85, 85, 15, 60, 15, 60, // 51 15, 60, 5, 6, 5, 6, 80, 80, // 51 40, 40, 40, 40, 40, 40, 40, 40, // 52 46, 40, 40, 40, 40, 40, 40, 40, // 52 40, 40, 40, 40, 40, 40, 40, 40, // 52 40, 40, 40, 40, 40, 40, 40, 40, // 52 40, 40, 40, 40, 40, 40, 40, 40, // 52 40, 40, 46, 46, 46, 46, 46, 46, // 52 46, 60, 60, 60, 60, 60, 60, 60, // 52 60, 60, 60, 60, 60, 60, 60, 80, // 52 60, 60, 60, 60, 60, 3, 60, 60, // 53 60, 60, 60, 60, 46, 46, 46, 46, // 53 60, 60, 60, 60, 60, 60, 46, 60, // 53 46, 60, 60, 60, 60, 60, 60, 60, // 53 60, 60, 60, 60, 60, 60, 60, 60, // 53 60, 60, 60, 60, 60, 60, 46, 46, // 53 46, 60, 60, 60, 60, 60, 60, 60, // 53 46, 60, 46, 46, 46, 46, 46, 46, // 53 46, 46, 46, 46, 46, 46, 46, 46, // 54 46, 46, 46, 46, 46, 46, 46, 46, // 54 46, 46, 46, 46, 46, 46, 46, 46, // 54 46, 46, 46, 46, 46, 46, 46, 46, // 54 76, 76, 76, 76, 76, 76, 76, 76, // 54 76, 76, 76, 76, 76, 76, 76, 76, // 54 76, 76, 76, 76, 76, 76, 76, 76, // 54 76, 76, 76, 76, 76, 76, 76, 76, // 54 76, 76, 76, 76, 76, 76, 46, 46, // 55 46, 46, 46, 46, 46, 46, 46, 46, // 55 16, 16, 16, 16, 16, 16, 16, 16, // 55 16, 16, 16, 16, 16, 16, 16, 16, // 55 16, 16, 16, 16, 16, 16, 16, 16, // 55 16, 16, 16, 16, 16, 16, 16, 16, // 55 16, 16, 16, 16, 16, 16, 16, 46, // 55 46, 46, 46, 3, 46, 46, 46, 46, // 55 40, 40, 40, 40, 40, 40, 40, 40, // 56 40, 40, 40, 40, 40, 40, 40, 40, // 56 40, 40, 40, 40, 40, 40, 40, 40, // 56 40, 40, 40, 40, 40, 40, 40, 40, // 56 40, 40, 40, 40, 40, 40, 40, 40, // 56 40, 40, 40, 40, 40, 40, 40, 40, // 56 40, 40, 40, 40, 40, 40, 40, 40, // 56 40, 40, 40, 40, 40, 40, 40, 40, // 56 40, 40, 40, 40, 40, 40, 40, 40, // 57 40, 40, 40, 40, 40, 40, 40, 40, // 57 40, 40, 40, 40, 40, 40, 40, 40, // 57 40, 40, 46, 46, 46, 46, 46, 40, // 57 40, 40, 40, 40, 40, 40, 40, 40, // 57 40, 40, 40, 40, 40, 40, 40, 40, // 57 40, 40, 40, 40, 40, 40, 40, 40, // 57 40, 40, 40, 40, 40, 40, 40, 40, // 57 40, 40, 40, 40, 40, 40, 40, 40, // 58 40, 40, 40, 40, 40, 40, 40, 40, // 58 40, 40, 40, 40, 40, 40, 40, 40, // 58 40, 40, 40, 40, 40, 40, 40, 40, // 58 40, 40, 40, 46, 46, 46, 46, 46, // 58 40, 40, 40, 40, 40, 40, 40, 40, // 58 40, 40, 40, 40, 40, 40, 40, 40, // 58 40, 40, 40, 40, 40, 40, 40, 40, // 58 40, 40, 40, 40, 40, 40, 40, 40, // 59 40, 40, 40, 40, 40, 40, 40, 40, // 59 40, 40, 40, 40, 40, 40, 40, 40, // 59 40, 40, 40, 40, 40, 40, 40, 40, // 59 40, 40, 40, 40, 40, 40, 40, 40, // 59 40, 40, 40, 40, 40, 40, 40, 40, // 59 40, 40, 40, 40, 40, 40, 40, 40, // 59 40, 40, 46, 46, 46, 46, 46, 46, // 59 23, 24, 23, 24, 23, 24, 23, 24, // 60 23, 24, 23, 24, 23, 24, 23, 24, // 60 23, 24, 23, 24, 23, 24, 23, 24, // 60 23, 24, 23, 24, 23, 24, 23, 24, // 60 23, 24, 23, 24, 23, 24, 23, 24, // 60 23, 24, 23, 24, 23, 24, 23, 24, // 60 23, 24, 23, 24, 23, 24, 23, 24, // 60 23, 24, 23, 24, 23, 24, 23, 24, // 60 23, 24, 23, 24, 23, 24, 23, 24, // 61 23, 24, 23, 24, 23, 24, 23, 24, // 61 23, 24, 23, 24, 23, 24, 16, 16, // 61 16, 16, 16, 16, 46, 46, 46, 46, // 61 23, 24, 23, 24, 23, 24, 23, 24, // 61 23, 24, 23, 24, 23, 24, 23, 24, // 61 23, 24, 23, 24, 23, 24, 23, 24, // 61 23, 24, 23, 24, 23, 24, 23, 24, // 61 23, 24, 23, 24, 23, 24, 23, 24, // 62 23, 24, 23, 24, 23, 24, 23, 24, // 62 23, 24, 23, 24, 23, 24, 23, 24, // 62 23, 24, 23, 24, 23, 24, 23, 24, // 62 23, 24, 23, 24, 23, 24, 23, 24, // 62 23, 24, 23, 24, 23, 24, 23, 24, // 62 23, 24, 23, 24, 23, 24, 23, 24, // 62 23, 24, 46, 46, 46, 46, 46, 46, // 62 86, 86, 86, 86, 86, 86, 86, 86, // 63 87, 87, 87, 87, 87, 87, 87, 87, // 63 86, 86, 86, 86, 86, 86, 46, 46, // 63 87, 87, 87, 87, 87, 87, 46, 46, // 63 86, 86, 86, 86, 86, 86, 86, 86, // 63 87, 87, 87, 87, 87, 87, 87, 87, // 63 86, 86, 86, 86, 86, 86, 86, 86, // 63 87, 87, 87, 87, 87, 87, 87, 87, // 63 86, 86, 86, 86, 86, 86, 46, 46, // 64 87, 87, 87, 87, 87, 87, 46, 46, // 64 16, 86, 16, 86, 16, 86, 16, 86, // 64 46, 87, 46, 87, 46, 87, 46, 87, // 64 86, 86, 86, 86, 86, 86, 86, 86, // 64 87, 87, 87, 87, 87, 87, 87, 87, // 64 88, 88, 89, 89, 89, 89, 90, 90, // 64 91, 91, 92, 92, 93, 93, 46, 46, // 64 86, 86, 86, 86, 86, 86, 86, 86, // 65 87, 87, 87, 87, 87, 87, 87, 87, // 65 86, 86, 86, 86, 86, 86, 86, 86, // 65 87, 87, 87, 87, 87, 87, 87, 87, // 65 86, 86, 86, 86, 86, 86, 86, 86, // 65 87, 87, 87, 87, 87, 87, 87, 87, // 65 86, 86, 16, 94, 16, 46, 16, 16, // 65 87, 87, 95, 95, 96, 11, 38, 11, // 65 11, 11, 16, 94, 16, 46, 16, 16, // 66 97, 97, 97, 97, 96, 11, 11, 11, // 66 86, 86, 16, 16, 46, 46, 16, 16, // 66 87, 87, 98, 98, 46, 11, 11, 11, // 66 86, 86, 16, 16, 16, 99, 16, 16, // 66 87, 87, 100, 100, 101, 11, 11, 11, // 66 46, 46, 16, 94, 16, 46, 16, 16, // 66 102, 102, 103, 103, 96, 11, 11, 46, // 66 2, 2, 2, 2, 2, 2, 2, 2, // 67 2, 2, 2, 2, 104, 104, 104, 104, // 67 8, 8, 8, 8, 8, 8, 3, 3, // 67 5, 6, 5, 5, 5, 6, 5, 5, // 67 3, 3, 3, 3, 3, 3, 3, 3, // 67 105, 106, 104, 104, 104, 104, 104, 46, // 67 3, 3, 3, 3, 3, 3, 3, 3, // 67 3, 5, 6, 3, 3, 3, 3, 12, // 67 12, 3, 3, 3, 7, 5, 6, 46, // 68 46, 46, 46, 46, 46, 46, 46, 46, // 68 46, 46, 46, 46, 46, 46, 46, 46, // 68 46, 46, 46, 46, 46, 46, 46, 46, // 68 46, 46, 46, 46, 46, 46, 46, 46, // 68 46, 46, 104, 104, 104, 104, 104, 104, // 68 17, 46, 46, 46, 17, 17, 17, 17, // 68 17, 17, 7, 7, 7, 5, 6, 16, // 68 107, 107, 107, 107, 107, 107, 107, 107, // 69 107, 107, 7, 7, 7, 5, 6, 46, // 69 46, 46, 46, 46, 46, 46, 46, 46, // 69 46, 46, 46, 46, 46, 46, 46, 46, // 69 4, 4, 4, 4, 4, 4, 4, 4, // 69 4, 4, 4, 4, 46, 46, 46, 46, // 69 46, 46, 46, 46, 46, 46, 46, 46, // 69 46, 46, 46, 46, 46, 46, 46, 46, // 69 46, 46, 46, 46, 46, 46, 46, 46, // 70 46, 46, 46, 46, 46, 46, 46, 46, // 70 60, 60, 60, 60, 60, 60, 60, 60, // 70 60, 60, 60, 60, 60, 79, 79, 79, // 70 79, 60, 46, 46, 46, 46, 46, 46, // 70 46, 46, 46, 46, 46, 46, 46, 46, // 70 46, 46, 46, 46, 46, 46, 46, 46, // 70 46, 46, 46, 46, 46, 46, 46, 46, // 70 15, 15, 38, 15, 15, 15, 15, 38, // 71 15, 15, 16, 38, 38, 38, 16, 16, // 71 38, 38, 38, 16, 15, 38, 15, 15, // 71 38, 38, 38, 38, 38, 38, 15, 15, // 71 15, 15, 15, 15, 38, 15, 38, 15, // 71 38, 15, 38, 38, 38, 38, 16, 16, // 71 38, 38, 15, 38, 16, 40, 40, 40, // 71 40, 46, 46, 46, 46, 46, 46, 46, // 71 46, 46, 46, 46, 46, 46, 46, 46, // 72 46, 46, 46, 46, 46, 46, 46, 46, // 72 46, 46, 46, 19, 19, 19, 19, 19, // 72 19, 19, 19, 19, 19, 19, 19, 108, // 72 109, 109, 109, 109, 109, 109, 109, 109, // 72 109, 109, 109, 109, 110, 110, 110, 110, // 72 111, 111, 111, 111, 111, 111, 111, 111, // 72 111, 111, 111, 111, 112, 112, 112, 112, // 72 113, 113, 113, 46, 46, 46, 46, 46, // 73 46, 46, 46, 46, 46, 46, 46, 46, // 73 7, 7, 7, 7, 7, 15, 15, 15, // 73 15, 15, 15, 15, 15, 15, 15, 15, // 73 15, 15, 15, 15, 15, 15, 15, 15, // 73 15, 15, 15, 15, 15, 15, 15, 15, // 73 15, 15, 15, 15, 15, 15, 15, 15, // 73 15, 15, 15, 15, 15, 15, 15, 15, // 73 15, 15, 15, 15, 15, 15, 15, 15, // 74 15, 15, 15, 15, 15, 15, 15, 15, // 74 15, 15, 7, 15, 7, 15, 15, 15, // 74 15, 15, 15, 15, 15, 15, 15, 15, // 74 15, 15, 15, 15, 15, 15, 15, 15, // 74 15, 15, 15, 46, 46, 46, 46, 46, // 74 46, 46, 46, 46, 46, 46, 46, 46, // 74 46, 46, 46, 46, 46, 46, 46, 46, // 74 7, 7, 7, 7, 7, 7, 7, 7, // 75 7, 7, 7, 7, 7, 7, 7, 7, // 75 7, 7, 7, 7, 7, 7, 7, 7, // 75 7, 7, 7, 7, 7, 7, 7, 7, // 75 7, 7, 7, 7, 7, 7, 7, 7, // 75 7, 7, 7, 7, 7, 7, 7, 7, // 75 7, 7, 7, 7, 7, 7, 7, 7, // 75 7, 7, 7, 7, 7, 7, 7, 7, // 75 7, 7, 7, 7, 7, 7, 7, 7, // 76 7, 7, 7, 7, 7, 7, 7, 7, // 76 7, 7, 7, 7, 7, 7, 7, 7, // 76 7, 7, 7, 7, 7, 7, 7, 7, // 76 7, 7, 7, 7, 7, 7, 7, 7, // 76 7, 7, 7, 7, 7, 7, 7, 7, // 76 7, 7, 46, 46, 46, 46, 46, 46, // 76 46, 46, 46, 46, 46, 46, 46, 46, // 76 15, 46, 15, 15, 15, 15, 15, 15, // 77 7, 7, 7, 7, 15, 15, 15, 15, // 77 15, 15, 15, 15, 15, 15, 15, 15, // 77 15, 15, 15, 15, 15, 15, 15, 15, // 77 7, 7, 15, 15, 15, 15, 15, 15, // 77 15, 5, 6, 15, 15, 15, 15, 15, // 77 15, 15, 15, 15, 15, 15, 15, 15, // 77 15, 15, 15, 15, 15, 15, 15, 15, // 77 15, 15, 15, 15, 15, 15, 15, 15, // 78 15, 15, 15, 15, 15, 15, 15, 15, // 78 15, 15, 15, 15, 15, 15, 15, 15, // 78 15, 15, 15, 15, 15, 15, 15, 15, // 78 15, 15, 15, 15, 15, 15, 15, 15, // 78 15, 15, 15, 15, 15, 15, 15, 15, // 78 15, 15, 15, 15, 15, 15, 15, 15, // 78 15, 15, 15, 46, 46, 46, 46, 46, // 78 15, 15, 15, 15, 15, 15, 15, 15, // 79 15, 15, 15, 15, 15, 15, 15, 15, // 79 15, 15, 15, 15, 15, 15, 15, 15, // 79 15, 15, 15, 15, 15, 15, 15, 15, // 79 15, 15, 15, 15, 15, 46, 46, 46, // 79 46, 46, 46, 46, 46, 46, 46, 46, // 79 46, 46, 46, 46, 46, 46, 46, 46, // 79 46, 46, 46, 46, 46, 46, 46, 46, // 79 15, 15, 15, 15, 15, 15, 15, 15, // 80 15, 15, 15, 46, 46, 46, 46, 46, // 80 46, 46, 46, 46, 46, 46, 46, 46, // 80 46, 46, 46, 46, 46, 46, 46, 46, // 80 114, 114, 114, 114, 114, 114, 114, 114, // 80 114, 114, 114, 114, 114, 114, 114, 114, // 80 114, 114, 114, 114, 82, 82, 82, 82, // 80 82, 82, 82, 82, 82, 82, 82, 82, // 80 82, 82, 82, 82, 82, 82, 82, 82, // 81 115, 115, 115, 115, 115, 115, 115, 115, // 81 115, 115, 115, 115, 115, 115, 115, 115, // 81 115, 115, 115, 115, 15, 15, 15, 15, // 81 15, 15, 15, 15, 15, 15, 15, 15, // 81 15, 15, 15, 15, 15, 15, 15, 15, // 81 15, 15, 15, 15, 15, 15, 116, 116, // 81 116, 116, 116, 116, 116, 116, 116, 116, // 81 116, 116, 116, 116, 116, 116, 116, 116, // 82 116, 116, 116, 116, 116, 116, 116, 116, // 82 117, 117, 117, 117, 117, 117, 117, 117, // 82 117, 117, 117, 117, 117, 117, 117, 117, // 82 117, 117, 117, 117, 117, 117, 117, 117, // 82 117, 117, 118, 46, 46, 46, 46, 46, // 82 46, 46, 46, 46, 46, 46, 46, 46, // 82 46, 46, 46, 46, 46, 46, 46, 46, // 82 15, 15, 15, 15, 15, 15, 15, 15, // 83 15, 15, 15, 15, 15, 15, 15, 15, // 83 15, 15, 15, 15, 15, 15, 15, 15, // 83 15, 15, 15, 15, 15, 15, 15, 15, // 83 15, 15, 15, 15, 15, 15, 15, 15, // 83 15, 15, 15, 15, 15, 15, 15, 15, // 83 15, 15, 15, 15, 15, 15, 15, 15, // 83 15, 15, 15, 15, 15, 15, 15, 15, // 83 15, 15, 15, 15, 15, 15, 15, 15, // 84 15, 15, 15, 15, 15, 15, 15, 15, // 84 15, 15, 15, 15, 15, 15, 46, 46, // 84 46, 46, 46, 46, 46, 46, 46, 46, // 84 15, 15, 15, 15, 15, 15, 15, 15, // 84 15, 15, 15, 15, 15, 15, 15, 15, // 84 15, 15, 15, 15, 15, 15, 15, 15, // 84 15, 15, 15, 15, 15, 15, 15, 15, // 84 15, 15, 15, 15, 15, 15, 15, 15, // 85 15, 15, 15, 15, 15, 15, 15, 15, // 85 15, 15, 15, 15, 15, 15, 15, 15, // 85 15, 15, 15, 15, 15, 15, 15, 15, // 85 15, 15, 15, 15, 15, 15, 15, 15, // 85 15, 15, 15, 15, 15, 15, 15, 15, // 85 46, 46, 46, 46, 46, 46, 46, 46, // 85 46, 46, 46, 46, 46, 46, 46, 46, // 85 15, 15, 15, 15, 15, 15, 15, 15, // 86 15, 15, 15, 15, 15, 15, 15, 15, // 86 15, 15, 15, 15, 46, 46, 46, 46, // 86 46, 46, 15, 15, 15, 15, 15, 15, // 86 15, 15, 15, 15, 15, 15, 15, 15, // 86 15, 15, 15, 15, 15, 15, 15, 15, // 86 15, 15, 15, 15, 15, 15, 15, 15, // 86 15, 15, 15, 15, 15, 15, 15, 15, // 86 46, 15, 15, 15, 15, 46, 15, 15, // 87 15, 15, 46, 46, 15, 15, 15, 15, // 87 15, 15, 15, 15, 15, 15, 15, 15, // 87 15, 15, 15, 15, 15, 15, 15, 15, // 87 15, 15, 15, 15, 15, 15, 15, 15, // 87 46, 15, 15, 15, 15, 15, 15, 15, // 87 15, 15, 15, 15, 15, 15, 15, 15, // 87 15, 15, 15, 15, 15, 15, 15, 15, // 87 15, 15, 15, 15, 15, 15, 15, 15, // 88 15, 15, 15, 15, 46, 15, 46, 15, // 88 15, 15, 15, 46, 46, 46, 15, 46, // 88 15, 15, 15, 15, 15, 15, 15, 46, // 88 46, 15, 15, 15, 15, 15, 15, 15, // 88 46, 46, 46, 46, 46, 46, 46, 46, // 88 46, 46, 46, 46, 46, 46, 119, 119, // 88 119, 119, 119, 119, 119, 119, 119, 119, // 88 114, 114, 114, 114, 114, 114, 114, 114, // 89 114, 114, 83, 83, 83, 83, 83, 83, // 89 83, 83, 83, 83, 15, 46, 46, 46, // 89 15, 15, 15, 15, 15, 15, 15, 15, // 89 15, 15, 15, 15, 15, 15, 15, 15, // 89 15, 15, 15, 15, 15, 15, 15, 15, // 89 46, 15, 15, 15, 15, 15, 15, 15, // 89 15, 15, 15, 15, 15, 15, 15, 46, // 89 2, 3, 3, 3, 15, 59, 3, 120, // 90 5, 6, 5, 6, 5, 6, 5, 6, // 90 5, 6, 15, 15, 5, 6, 5, 6, // 90 5, 6, 5, 6, 8, 5, 6, 5, // 90 15, 121, 121, 121, 121, 121, 121, 121, // 90 121, 121, 60, 60, 60, 60, 60, 60, // 90 8, 59, 59, 59, 59, 59, 15, 15, // 90 46, 46, 46, 46, 46, 46, 46, 15, // 90 46, 40, 40, 40, 40, 40, 40, 40, // 91 40, 40, 40, 40, 40, 40, 40, 40, // 91 40, 40, 40, 40, 40, 40, 40, 40, // 91 40, 40, 40, 40, 40, 40, 40, 40, // 91 40, 40, 40, 40, 40, 40, 40, 40, // 91 40, 40, 40, 40, 40, 40, 40, 40, // 91 40, 40, 40, 40, 40, 40, 40, 40, // 91 40, 40, 40, 40, 40, 40, 40, 40, // 91 40, 40, 40, 40, 40, 40, 40, 40, // 92 40, 40, 40, 40, 40, 40, 40, 40, // 92 40, 40, 40, 40, 40, 46, 46, 46, // 92 46, 60, 60, 59, 59, 59, 59, 46, // 92 46, 40, 40, 40, 40, 40, 40, 40, // 92 40, 40, 40, 40, 40, 40, 40, 40, // 92 40, 40, 40, 40, 40, 40, 40, 40, // 92 40, 40, 40, 40, 40, 40, 40, 40, // 92 40, 40, 40, 40, 40, 40, 40, 40, // 93 40, 40, 40, 40, 40, 40, 40, 40, // 93 40, 40, 40, 40, 40, 40, 40, 40, // 93 40, 40, 40, 40, 40, 40, 40, 40, // 93 40, 40, 40, 40, 40, 40, 40, 40, // 93 40, 40, 40, 40, 40, 40, 40, 40, // 93 40, 40, 40, 40, 40, 40, 40, 40, // 93 40, 40, 40, 3, 59, 59, 59, 46, // 93 46, 46, 46, 46, 46, 40, 40, 40, // 94 40, 40, 40, 40, 40, 40, 40, 40, // 94 40, 40, 40, 40, 40, 40, 40, 40, // 94 40, 40, 40, 40, 40, 40, 40, 40, // 94 40, 40, 40, 40, 40, 40, 40, 40, // 94 40, 40, 40, 40, 40, 46, 46, 46, // 94 46, 40, 40, 40, 40, 40, 40, 40, // 94 40, 40, 40, 40, 40, 40, 40, 40, // 94 40, 40, 40, 40, 40, 40, 40, 40, // 95 40, 40, 40, 40, 40, 40, 40, 46, // 95 15, 15, 85, 85, 85, 85, 15, 15, // 95 15, 15, 15, 15, 15, 15, 15, 15, // 95 46, 46, 46, 46, 46, 46, 46, 46, // 95 46, 46, 46, 46, 46, 46, 46, 46, // 95 46, 46, 46, 46, 46, 46, 46, 46, // 95 46, 46, 46, 46, 46, 46, 46, 46, // 95 15, 15, 15, 15, 15, 15, 15, 15, // 96 15, 15, 15, 15, 15, 15, 15, 15, // 96 15, 15, 15, 15, 15, 15, 15, 15, // 96 15, 15, 15, 15, 15, 46, 46, 46, // 96 85, 85, 85, 85, 85, 85, 85, 85, // 96 85, 85, 15, 15, 15, 15, 15, 15, // 96 15, 15, 15, 15, 15, 15, 15, 15, // 96 15, 15, 15, 15, 15, 15, 15, 15, // 96 15, 15, 15, 15, 46, 46, 46, 46, // 97 46, 46, 46, 46, 46, 46, 46, 46, // 97 46, 46, 46, 46, 46, 46, 46, 46, // 97 46, 46, 46, 46, 46, 46, 46, 46, // 97 15, 15, 15, 15, 15, 15, 15, 15, // 97 15, 15, 15, 15, 15, 15, 15, 15, // 97 15, 15, 15, 15, 15, 15, 15, 15, // 97 15, 15, 15, 15, 46, 46, 46, 15, // 97 114, 114, 114, 114, 114, 114, 114, 114, // 98 114, 114, 15, 15, 15, 15, 15, 15, // 98 15, 15, 15, 15, 15, 15, 15, 15, // 98 15, 15, 15, 15, 15, 15, 15, 15, // 98 15, 15, 15, 15, 15, 15, 15, 15, // 98 15, 15, 15, 15, 15, 15, 15, 15, // 98 15, 46, 46, 46, 46, 46, 46, 46, // 98 46, 46, 46, 46, 46, 46, 46, 46, // 98 15, 15, 15, 15, 15, 15, 15, 15, // 99 15, 15, 15, 15, 46, 46, 46, 46, // 99 15, 15, 15, 15, 15, 15, 15, 15, // 99 15, 15, 15, 15, 15, 15, 15, 15, // 99 15, 15, 15, 15, 15, 15, 15, 15, // 99 15, 15, 15, 15, 15, 15, 15, 15, // 99 15, 15, 15, 15, 15, 15, 15, 15, // 99 15, 15, 15, 15, 15, 15, 15, 46, // 99 15, 15, 15, 15, 15, 15, 15, 15, // 100 15, 15, 15, 15, 15, 15, 15, 15, // 100 15, 15, 15, 15, 15, 15, 15, 15, // 100 15, 15, 15, 15, 15, 15, 15, 15, // 100 15, 15, 15, 15, 15, 15, 15, 15, // 100 15, 15, 15, 15, 15, 15, 15, 15, // 100 15, 15, 15, 15, 15, 15, 15, 46, // 100 46, 46, 46, 15, 15, 15, 15, 15, // 100 15, 15, 15, 15, 15, 15, 15, 15, // 101 15, 15, 15, 15, 15, 15, 15, 15, // 101 15, 15, 15, 15, 15, 15, 15, 15, // 101 15, 15, 15, 15, 15, 15, 46, 46, // 101 15, 15, 15, 15, 15, 15, 15, 15, // 101 15, 15, 15, 15, 15, 15, 15, 15, // 101 15, 15, 15, 15, 15, 15, 15, 15, // 101 15, 15, 15, 15, 15, 15, 15, 46, // 101 40, 40, 40, 40, 40, 40, 40, 40, // 102 40, 40, 40, 40, 40, 40, 40, 40, // 102 40, 40, 40, 40, 40, 40, 40, 40, // 102 40, 40, 40, 40, 40, 40, 40, 40, // 102 40, 40, 40, 40, 40, 40, 46, 46, // 102 46, 46, 46, 46, 46, 46, 46, 46, // 102 46, 46, 46, 46, 46, 46, 46, 46, // 102 46, 46, 46, 46, 46, 46, 46, 46, // 102 40, 40, 40, 40, 40, 40, 40, 40, // 103 40, 40, 40, 40, 40, 40, 40, 40, // 103 40, 40, 40, 40, 40, 40, 40, 40, // 103 40, 40, 40, 40, 40, 40, 40, 40, // 103 40, 40, 40, 40, 46, 46, 46, 46, // 103 46, 46, 46, 46, 46, 46, 46, 46, // 103 46, 46, 46, 46, 46, 46, 46, 46, // 103 46, 46, 46, 46, 46, 46, 46, 46, // 103 122, 122, 122, 122, 122, 122, 122, 122, // 104 122, 122, 122, 122, 122, 122, 122, 122, // 104 122, 122, 122, 122, 122, 122, 122, 122, // 104 122, 122, 122, 122, 122, 122, 122, 122, // 104 122, 122, 122, 122, 122, 122, 122, 122, // 104 122, 122, 122, 122, 122, 122, 122, 122, // 104 122, 122, 122, 122, 122, 122, 122, 122, // 104 122, 122, 122, 122, 122, 122, 122, 122, // 104 123, 123, 123, 123, 123, 123, 123, 123, // 105 123, 123, 123, 123, 123, 123, 123, 123, // 105 123, 123, 123, 123, 123, 123, 123, 123, // 105 123, 123, 123, 123, 123, 123, 123, 123, // 105 123, 123, 123, 123, 123, 123, 123, 123, // 105 123, 123, 123, 123, 123, 123, 123, 123, // 105 123, 123, 123, 123, 123, 123, 123, 123, // 105 123, 123, 123, 123, 123, 123, 123, 123, // 105 40, 40, 40, 40, 40, 40, 40, 40, // 106 40, 40, 40, 40, 40, 40, 40, 40, // 106 40, 40, 40, 40, 40, 40, 40, 40, // 106 40, 40, 40, 40, 40, 40, 40, 40, // 106 40, 40, 40, 40, 40, 40, 40, 40, // 106 40, 40, 40, 40, 40, 40, 46, 46, // 106 46, 46, 46, 46, 46, 46, 46, 46, // 106 46, 46, 46, 46, 46, 46, 46, 46, // 106 16, 16, 16, 16, 16, 16, 16, 46, // 107 46, 46, 46, 46, 46, 46, 46, 46, // 107 46, 46, 46, 16, 16, 16, 16, 16, // 107 46, 46, 46, 46, 46, 46, 60, 40, // 107 40, 40, 40, 40, 40, 40, 40, 40, // 107 40, 7, 40, 40, 40, 40, 40, 40, // 107 40, 40, 40, 40, 40, 40, 40, 46, // 107 40, 40, 40, 40, 40, 46, 40, 46, // 107 40, 40, 46, 40, 40, 46, 40, 40, // 108 40, 40, 40, 40, 40, 40, 40, 40, // 108 40, 40, 40, 40, 40, 40, 40, 40, // 108 40, 40, 40, 40, 40, 40, 40, 40, // 108 40, 40, 40, 40, 40, 40, 40, 40, // 108 40, 40, 40, 40, 40, 40, 40, 40, // 108 40, 40, 40, 40, 40, 40, 40, 40, // 108 40, 40, 40, 40, 40, 40, 40, 40, // 108 40, 40, 40, 40, 40, 40, 40, 40, // 109 40, 40, 40, 40, 40, 40, 40, 40, // 109 40, 40, 40, 40, 40, 40, 40, 40, // 109 40, 40, 40, 40, 40, 40, 40, 40, // 109 40, 40, 40, 40, 40, 40, 40, 40, // 109 40, 40, 40, 40, 40, 40, 40, 40, // 109 40, 40, 46, 46, 46, 46, 46, 46, // 109 46, 46, 46, 46, 46, 46, 46, 46, // 109 46, 46, 46, 46, 46, 46, 46, 46, // 110 46, 46, 46, 46, 46, 46, 46, 46, // 110 46, 46, 46, 40, 40, 40, 40, 40, // 110 40, 40, 40, 40, 40, 40, 40, 40, // 110 40, 40, 40, 40, 40, 40, 40, 40, // 110 40, 40, 40, 40, 40, 40, 40, 40, // 110 40, 40, 40, 40, 40, 40, 40, 40, // 110 40, 40, 40, 40, 40, 40, 40, 40, // 110 40, 40, 40, 40, 40, 40, 40, 40, // 111 40, 40, 40, 40, 40, 40, 40, 40, // 111 40, 40, 40, 40, 40, 40, 40, 40, // 111 40, 40, 40, 40, 40, 40, 40, 40, // 111 40, 40, 40, 40, 40, 40, 40, 40, // 111 40, 40, 40, 40, 40, 40, 40, 40, // 111 40, 40, 40, 40, 40, 40, 40, 40, // 111 40, 40, 40, 40, 40, 40, 5, 6, // 111 46, 46, 46, 46, 46, 46, 46, 46, // 112 46, 46, 46, 46, 46, 46, 46, 46, // 112 40, 40, 40, 40, 40, 40, 40, 40, // 112 40, 40, 40, 40, 40, 40, 40, 40, // 112 40, 40, 40, 40, 40, 40, 40, 40, // 112 40, 40, 40, 40, 40, 40, 40, 40, // 112 40, 40, 40, 40, 40, 40, 40, 40, // 112 40, 40, 40, 40, 40, 40, 40, 40, // 112 40, 40, 40, 40, 40, 40, 40, 40, // 113 40, 40, 40, 40, 40, 40, 40, 40, // 113 46, 46, 40, 40, 40, 40, 40, 40, // 113 40, 40, 40, 40, 40, 40, 40, 40, // 113 40, 40, 40, 40, 40, 40, 40, 40, // 113 40, 40, 40, 40, 40, 40, 40, 40, // 113 40, 40, 40, 40, 40, 40, 40, 40, // 113 40, 40, 40, 40, 40, 40, 40, 40, // 113 40, 40, 40, 40, 40, 40, 40, 40, // 114 46, 46, 46, 46, 46, 46, 46, 46, // 114 46, 46, 46, 46, 46, 46, 46, 46, // 114 46, 46, 46, 46, 46, 46, 46, 46, // 114 46, 46, 46, 46, 46, 46, 46, 46, // 114 46, 46, 46, 46, 46, 46, 46, 46, // 114 40, 40, 40, 40, 40, 40, 40, 40, // 114 40, 40, 40, 40, 46, 46, 46, 46, // 114 46, 46, 46, 46, 46, 46, 46, 46, // 115 46, 46, 46, 46, 46, 46, 46, 46, // 115 46, 46, 46, 46, 46, 46, 46, 46, // 115 46, 46, 46, 46, 46, 46, 46, 46, // 115 60, 60, 60, 60, 46, 46, 46, 46, // 115 46, 46, 46, 46, 46, 46, 46, 46, // 115 3, 8, 8, 12, 12, 5, 6, 5, // 115 6, 5, 6, 5, 6, 5, 6, 5, // 115 6, 5, 6, 5, 6, 46, 46, 46, // 116 46, 3, 3, 3, 3, 12, 12, 12, // 116 3, 3, 3, 46, 3, 3, 3, 3, // 116 8, 5, 6, 5, 6, 5, 6, 3, // 116 3, 3, 7, 8, 7, 7, 7, 46, // 116 3, 4, 3, 3, 46, 46, 46, 46, // 116 40, 40, 40, 46, 40, 46, 40, 40, // 116 40, 40, 40, 40, 40, 40, 40, 40, // 116 40, 40, 40, 40, 40, 40, 40, 40, // 117 40, 40, 40, 40, 40, 40, 40, 40, // 117 40, 40, 40, 40, 40, 40, 40, 40, // 117 40, 40, 40, 40, 40, 40, 40, 40, // 117 40, 40, 40, 40, 40, 40, 40, 40, // 117 40, 40, 40, 40, 40, 40, 40, 40, // 117 40, 40, 40, 40, 40, 40, 40, 40, // 117 40, 40, 40, 40, 40, 46, 46, 104, // 117 46, 3, 3, 3, 4, 3, 3, 3, // 118 5, 6, 3, 7, 3, 8, 3, 3, // 118 9, 9, 9, 9, 9, 9, 9, 9, // 118 9, 9, 3, 3, 7, 7, 7, 3, // 118 3, 10, 10, 10, 10, 10, 10, 10, // 118 10, 10, 10, 10, 10, 10, 10, 10, // 118 10, 10, 10, 10, 10, 10, 10, 10, // 118 10, 10, 10, 5, 3, 6, 11, 12, // 118 11, 13, 13, 13, 13, 13, 13, 13, // 119 13, 13, 13, 13, 13, 13, 13, 13, // 119 13, 13, 13, 13, 13, 13, 13, 13, // 119 13, 13, 13, 5, 7, 6, 7, 46, // 119 46, 3, 5, 6, 3, 3, 40, 40, // 119 40, 40, 40, 40, 40, 40, 40, 40, // 119 59, 40, 40, 40, 40, 40, 40, 40, // 119 40, 40, 40, 40, 40, 40, 40, 40, // 119 40, 40, 40, 40, 40, 40, 40, 40, // 120 40, 40, 40, 40, 40, 40, 40, 40, // 120 40, 40, 40, 40, 40, 40, 40, 40, // 120 40, 40, 40, 40, 40, 40, 59, 59, // 120 40, 40, 40, 40, 40, 40, 40, 40, // 120 40, 40, 40, 40, 40, 40, 40, 40, // 120 40, 40, 40, 40, 40, 40, 40, 40, // 120 40, 40, 40, 40, 40, 40, 40, 46, // 120 46, 46, 40, 40, 40, 40, 40, 40, // 121 46, 46, 40, 40, 40, 40, 40, 40, // 121 46, 46, 40, 40, 40, 40, 40, 40, // 121 46, 46, 40, 40, 40, 46, 46, 46, // 121 4, 4, 7, 11, 15, 4, 4, 46, // 121 7, 7, 7, 7, 7, 15, 15, 46, // 121 46, 46, 46, 46, 46, 46, 46, 46, // 121 46, 46, 46, 46, 46, 15, 46, 46 // 121 }; // The A table has 124 entries for a total of 496 bytes. const uint32 JS::CharInfo::a[] = { 0x0000000F, // 0 Cc 0x0004000F, // 1 Cc, whitespace 0x0004000C, // 2 Zs, whitespace 0x00000018, // 3 Po 0x0002001A, // 4 Sc, currency 0x00000015, // 5 Ps 0x00000016, // 6 Pe 0x00000019, // 7 Sm 0x00000014, // 8 Pd 0x00036009, // 9 Nd, identifier part, decimal 16 0x0822FE01, // 10 Lu, hasLower (add 32), identifier start, supradecimal 31 0x0000001B, // 11 Sk 0x00020017, // 12 Pc, underscore 0x0812FE02, // 13 Ll, hasUpper (subtract 32), identifier start, supradecimal 31 0x0005000F, // 14 Cc, break 0x0000001C, // 15 So 0x00020002, // 16 Ll, identifier start 0x0000600B, // 17 No, decimal 16 0x0000500B, // 18 No, decimal 8 0x0000800B, // 19 No, strange 0x08220001, // 20 Lu, hasLower (add 32), identifier start 0x08120002, // 21 Ll, hasUpper (subtract 32), identifier start 0xE1D20002, // 22 Ll, hasUpper (subtract -121), identifier start 0x00620001, // 23 Lu, hasLower (add 1), identifier start 0x00520002, // 24 Ll, hasUpper (subtract 1), identifier start 0xCE620001, // 25 Lu, hasLower (add -199), identifier start 0x3A120002, // 26 Ll, hasUpper (subtract 232), identifier start 0xE1E20001, // 27 Lu, hasLower (add -121), identifier start 0x4B120002, // 28 Ll, hasUpper (subtract 300), identifier start 0x34A20001, // 29 Lu, hasLower (add 210), identifier start 0x33A20001, // 30 Lu, hasLower (add 206), identifier start 0x33620001, // 31 Lu, hasLower (add 205), identifier start 0x32A20001, // 32 Lu, hasLower (add 202), identifier start 0x32E20001, // 33 Lu, hasLower (add 203), identifier start 0x33E20001, // 34 Lu, hasLower (add 207), identifier start 0x34E20001, // 35 Lu, hasLower (add 211), identifier start 0x34620001, // 36 Lu, hasLower (add 209), identifier start 0x35620001, // 37 Lu, hasLower (add 213), identifier start 0x00020001, // 38 Lu, identifier start 0x36A20001, // 39 Lu, hasLower (add 218), identifier start 0x00020005, // 40 Lo, identifier start 0x36620001, // 41 Lu, hasLower (add 217), identifier start 0x36E20001, // 42 Lu, hasLower (add 219), identifier start 0x00AA0001, // 43 Lu, hasLower (add 2), hasTitle, identifier start 0x007A0003, // 44 Lt, hasUpper (subtract 1), hasLower (add 1), hasTitle, identifier start 0x009A0002, // 45 Ll, hasUpper (subtract 2), hasTitle, identifier start 0x00000000, // 46 unassigned 0x34920002, // 47 Ll, hasUpper (subtract 210), identifier start 0x33920002, // 48 Ll, hasUpper (subtract 206), identifier start 0x33520002, // 49 Ll, hasUpper (subtract 205), identifier start 0x32920002, // 50 Ll, hasUpper (subtract 202), identifier start 0x32D20002, // 51 Ll, hasUpper (subtract 203), identifier start 0x33D20002, // 52 Ll, hasUpper (subtract 207), identifier start 0x34520002, // 53 Ll, hasUpper (subtract 209), identifier start 0x34D20002, // 54 Ll, hasUpper (subtract 211), identifier start 0x35520002, // 55 Ll, hasUpper (subtract 213), identifier start 0x36920002, // 56 Ll, hasUpper (subtract 218), identifier start 0x36520002, // 57 Ll, hasUpper (subtract 217), identifier start 0x36D20002, // 58 Ll, hasUpper (subtract 219), identifier start 0x00020004, // 59 Lm, identifier start 0x00030006, // 60 Mn, identifier part 0x09A20001, // 61 Lu, hasLower (add 38), identifier start 0x09620001, // 62 Lu, hasLower (add 37), identifier start 0x10220001, // 63 Lu, hasLower (add 64), identifier start 0x0FE20001, // 64 Lu, hasLower (add 63), identifier start 0x09920002, // 65 Ll, hasUpper (subtract 38), identifier start 0x09520002, // 66 Ll, hasUpper (subtract 37), identifier start 0x10120002, // 67 Ll, hasUpper (subtract 64), identifier start 0x0FD20002, // 68 Ll, hasUpper (subtract 63), identifier start 0x0F920002, // 69 Ll, hasUpper (subtract 62), identifier start 0x0E520002, // 70 Ll, hasUpper (subtract 57), identifier start 0x0BD20002, // 71 Ll, hasUpper (subtract 47), identifier start 0x0D920002, // 72 Ll, hasUpper (subtract 54), identifier start 0x15920002, // 73 Ll, hasUpper (subtract 86), identifier start 0x14120002, // 74 Ll, hasUpper (subtract 80), identifier start 0x14220001, // 75 Lu, hasLower (add 80), identifier start 0x0C220001, // 76 Lu, hasLower (add 48), identifier start 0x0C120002, // 77 Ll, hasUpper (subtract 48), identifier start 0x00034009, // 78 Nd, identifier part, decimal 0 0x00000007, // 79 Me 0x00030008, // 80 Mc, identifier part 0x00037409, // 81 Nd, identifier part, decimal 26 0x00005A0B, // 82 No, decimal 13 0x00006E0B, // 83 No, decimal 23 0x0000740B, // 84 No, decimal 26 0x0000000B, // 85 No 0xFE120002, // 86 Ll, hasUpper (subtract -8), identifier start 0xFE220001, // 87 Lu, hasLower (add -8), identifier start 0xED920002, // 88 Ll, hasUpper (subtract -74), identifier start 0xEA920002, // 89 Ll, hasUpper (subtract -86), identifier start 0xE7120002, // 90 Ll, hasUpper (subtract -100), identifier start 0xE0120002, // 91 Ll, hasUpper (subtract -128), identifier start 0xE4120002, // 92 Ll, hasUpper (subtract -112), identifier start 0xE0920002, // 93 Ll, hasUpper (subtract -126), identifier start 0xFDD20002, // 94 Ll, hasUpper (subtract -9), identifier start 0xEDA20001, // 95 Lu, hasLower (add -74), identifier start 0xFDE20001, // 96 Lu, hasLower (add -9), identifier start 0xEAA20001, // 97 Lu, hasLower (add -86), identifier start 0xE7220001, // 98 Lu, hasLower (add -100), identifier start 0xFE520002, // 99 Ll, hasUpper (subtract -7), identifier start 0xE4220001, // 100 Lu, hasLower (add -112), identifier start 0xFE620001, // 101 Lu, hasLower (add -7), identifier start 0xE0220001, // 102 Lu, hasLower (add -128), identifier start 0xE0A20001, // 103 Lu, hasLower (add -126), identifier start 0x00010010, // 104 Cf, ignorable 0x0005000D, // 105 Zl, break 0x0005000E, // 106 Zp, break 0x0000400B, // 107 No, decimal 0 0x0000440B, // 108 No, decimal 2 0x0422420A, // 109 Nl, hasLower (add 16), identifier start, decimal 1 0x0422800A, // 110 Nl, hasLower (add 16), identifier start, strange 0x0412620A, // 111 Nl, hasUpper (subtract 16), identifier start, decimal 17 0x0412800A, // 112 Nl, hasUpper (subtract 16), identifier start, strange 0x0002800A, // 113 Nl, identifier start, strange 0x0000420B, // 114 No, decimal 1 0x0000720B, // 115 No, decimal 25 0x06A0001C, // 116 So, hasLower (add 26) 0x0690001C, // 117 So, hasUpper (subtract 26) 0x00006C0B, // 118 No, decimal 22 0x0000560B, // 119 No, decimal 11 0x0002720A, // 120 Nl, identifier start, decimal 25 0x0002400A, // 121 Nl, identifier start, decimal 0 0x00000013, // 122 Cs 0x00000012 // 123 Co }; // Return c converted to upper case. If c cannot be converted to upper case, // return c unchanged. char16 JS::toUpper(char16 c) { CharInfo ci(c); if (ci.info & 0x00100000) c = static_cast(static_cast(c) - (static_cast(ci.info) >> 22)); return c; } // Return c converted to lower case. If c cannot be converted to lower case, // return c unchanged. char16 JS::toLower(char16 c) { CharInfo ci(c); if (ci.info & 0x00200000) c = static_cast(static_cast(c) + (static_cast(ci.info) >> 22)); return c; } // Return true if c is an ASCII hexadecimal digit, in which case store the digit's numeric value in d. bool JS::isASCIIHexDigit(char16 c, uint &digit) { uint cv = c; if (cv < '0') return false; if (cv <= '9') { digit = cv - '0'; return true; } cv |= 0x20; if (cv >= 'a' && cv <= 'f') { digit = cv - 'a' + 10; return true; } return false; } // Return str advanced past white space characters, but no further than strEnd. const char16 *JS::skipWhiteSpace(const char16 *str, const char16 *strEnd) { while (str != strEnd && isSpace(*str)) str++; return str; } // // Arenas // // #define DEBUG_ARENA to allocate each object in its own malloc block. // This allows tools such as Purify to do bounds checking on all blocks. struct JS::Arena::DestructorEntry: JS::ArenaObject { DestructorEntry *next; // Next destructor registration in linked list void (*destructor)(void *); // Destructor function void *object; // Object on which to call the destructor DestructorEntry(void (*destructor)(void *), void *object): destructor(destructor), object(object) {} }; // Construct an Arena that allocates memory in chunks of the given size. JS::Arena::Arena(size_t blockSize): blockSize(blockSize), freeBegin(0), freeEnd(0) { ASSERT(blockSize && !(blockSize & basicAlignment-1)); rootDirectory.next = 0; currentDirectory = &rootDirectory; } // Deallocate the Directory's blocks but do not follow the next link. void JS::Arena::Directory::clear() { void **b = blocks + nBlocks; while (b != blocks) STD::free(*--b); } // Call the Arena's registered destructors and then deallocate the Arena's blocks and // directories. void JS::Arena::clear() { DestructorEntry *e = destructorEntries; while (e) { e->destructor(e->object); e = e->next; } destructorEntries = 0; Directory *d = rootDirectory.next; while (d) { Directory *next = d->next; d->clear(); delete d; d = next; } rootDirectory.clear(); rootDirectory.next = 0; currentDirectory = &rootDirectory; } // Allocate an internal block of the given size and link it into a Directory. // Throw bad_alloc if out of memory, without corrupting any of the Arena data structures. void *JS::Arena::newBlock(size_t size) { Directory *d = currentDirectory; uint nBlocks = d->nBlocks; // Allocate a new Directory if the current one is full. Link it just past the // rootDirectory so that the links are in reverse order. This allows clear() to // deallocate memory in the reverse order from that in which it was allocated. if (nBlocks == Directory::maxNBlocks) { d = new Directory; d->next = rootDirectory.next; rootDirectory.next = d; currentDirectory = d; nBlocks = 0; } void *p = STD::malloc(size); d->blocks[nBlocks] = p; d->nBlocks = nBlocks + 1; return p; } // Allocate a naturally-aligned object of the given size (in bytes). Throw // bad_alloc if out of memory, without corrupting any of the Arena data structures. void *JS::Arena::allocate(size_t size) { ASSERT(size); // Can't allocate zero-size blocks. #ifdef DEBUG_ARENA return newBlock(size); #else size = size + (basicAlignment-1) & -basicAlignment; // Round up to natural alignment if necessary char *p = freeBegin; size_t freeBytes = static_cast(freeEnd - p); if (size > freeBytes) { // If freeBytes is at least a quarter of blockSize, allocate a separate block. if (freeBytes<<2 >= blockSize || size >= blockSize) return newBlock(size); p = static_cast(newBlock(blockSize)); freeEnd = p + blockSize; } freeBegin = p + size; return p; #endif } // Ensure that object's destructor is called at the time the arena is deallocated or cleared. // The destructors will be called in reverse order of being registered. // registerDestructor might itself runs out of memory, in which case it immediately // calls object's destructor before throwing bad_alloc. void JS::Arena::newDestructorEntry(void (*destructor)(void *), void *object) { try { DestructorEntry *e = new(*this) DestructorEntry(destructor, object); e->next = destructorEntries; destructorEntries = e; } catch (...) { destructor(object); throw; } } // Allocate a String in the Arena and register that String so that it is deallocated at // the same time as the Arena. // DO NOT CALL DELETE ON THE RESULT! JS::String *JS::newArenaString(Arena &arena) { String *s = new(arena) String(); arena.registerDestructor(s); return s; } JS::String *JS::newArenaString(Arena &arena, const String &str) { String *s = new(arena) String(str); arena.registerDestructor(s); return s; } // // C++ I/O // #ifdef __GNUC__ JS::SaveFormat::SaveFormat(ostream &) {} JS::SaveFormat::~SaveFormat() {} #else JS::SaveFormat::SaveFormat(ostream &out): o(out), flags(out.flags()), fill(out.fill()) {} JS::SaveFormat::~SaveFormat() { o.flags(flags); o.fill(fill); } #endif // Quotes for printing non-ASCII characters on an ASCII stream #ifdef XP_MAC const char beginUnprintable = char(0xC7); const char endUnprintable = char(0xC8); #else const char beginUnprintable = '{'; const char endUnprintable = '}'; #endif void JS::showChar(ostream &out, char16 ch) { #ifdef XP_MAC_MPW if (ch == '\n') out << '\r'; else #endif if (uchar16(ch) <= 0x7E && (uchar16(ch) >= ' ' || ch == '\n' || ch == '\t')) out << static_cast(ch); else { SaveFormat sf(out); #ifdef __GNUC__ out << beginUnprintable << std::hex << std::setw(4) << std::setfill('0') << (uint16)ch << endUnprintable; #else out << beginUnprintable << std::hex << std::uppercase << std::setw(4) << std::setfill('0') << (uint16)ch << endUnprintable; #endif } } void JS::showString(ostream &out, const String &str) { showString(out, str.begin(), str.end()); } // // Exceptions // static const char *const kindStrings[] = { "Syntax error" // SyntaxError }; // Return a null-terminated string describing the exception's kind. const char *JS::Exception::kindString() const { return kindStrings[kind]; } // Return the full error message. JS::String JS::Exception::fullMessage() const { return kindString() + (": " + message); } // // Static Initializers // #ifndef _WIN32 static void jsNewHandler() { std::bad_alloc outOfMemory; throw outOfMemory; } struct InitUtilities { InitUtilities() {std::set_new_handler(&jsNewHandler);} }; #else #include static int jsNewHandler(size_t) { std::bad_alloc outOfMemory; throw outOfMemory; } struct InitUtilities { InitUtilities() {_set_new_handler(&jsNewHandler);} }; #endif InitUtilities initUtilities;