Map emoji code points defined by mobile carriers to ones defined by

Google in order to support various carriers. Patch by HIRANO Takahito
<hiranotaka@zng.info>
This commit is contained in:
Jesse Vincent 2011-01-03 18:07:44 +00:00
parent de7e888714
commit 0a8514888e
5 changed files with 1202 additions and 2068 deletions

View File

@ -3,10 +3,15 @@ package com.fsck.k9.mail;
public abstract class BodyPart implements Part
{
protected Multipart mParent;
private Multipart mParent;
public Multipart getParent()
{
return mParent;
}
public void setParent(Multipart parent)
{
mParent = parent;
}
}

View File

@ -17,11 +17,13 @@ public abstract class Multipart implements Body
public void addBodyPart(BodyPart part)
{
mParts.add(part);
part.setParent(this);
}
public void addBodyPart(BodyPart part, int index)
{
mParts.add(index, part);
part.setParent(this);
}
public BodyPart getBodyPart(int index)
@ -41,11 +43,13 @@ public abstract class Multipart implements Body
public boolean removeBodyPart(BodyPart part)
{
part.setParent(null);
return mParts.remove(part);
}
public void removeBodyPart(int index)
{
mParts.get(index).setParent(null);
mParts.remove(index);
}

View File

@ -0,0 +1,86 @@
package com.fsck.k9.mail.internet;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.MalformedInputException;
class Iso2022JpToShiftJisInputStream extends InputStream {
private enum Charset {
ASCII, JISX0201, JISX0208,
}
private InputStream mIn;
private Charset charset = Charset.ASCII;
private int out;
private boolean hasOut = false;
public Iso2022JpToShiftJisInputStream(InputStream in)
{
mIn = in;
}
@Override
public int read() throws IOException
{
if (hasOut)
{
hasOut = false;
return out;
}
int in1 = mIn.read();
if (in1 == 0x1b)
{
in1 = mIn.read();
if (in1 == '(')
{
in1 = mIn.read();
if (in1 == 'B' || in1 == 'J')
charset = Charset.ASCII;
else if (in1 == 'I') // Not defined in RFC 1468 but in CP50221.
charset = Charset.JISX0201;
else
throw new MalformedInputException(0);
}
else if (in1 == '$')
{
in1 = mIn.read();
if (in1 == '@' || in1 == 'B')
charset = Charset.JISX0208;
else
throw new MalformedInputException(0);
}
else
throw new MalformedInputException(0);
in1 = mIn.read();
}
if (in1 == '\n' || in1 == '\r')
charset = Charset.ASCII;
if (in1 < 0x21 || in1 >= 0x7e)
return in1;
switch (charset)
{
case ASCII:
return in1;
case JISX0201:
return in1 + 0x80;
case JISX0208:
int in2 = mIn.read();
if (in2 < 0x21 || in2 >= 0x7e)
throw new MalformedInputException(0);
int out1 = (in1 + 1) / 2 + (in1 < 0x5f ? 0x70 : 0xb0);
int out2 = in2 + (in1 % 2 == 0 ? 0x7e : in2 < 0x60 ? 0x1f : 0x20);
out = out2;
hasOut = true;
return out1;
default:
throw new RuntimeException();
}
}
}

View File

@ -1,6 +1,7 @@
package com.fsck.k9.mail.internet;
import android.os.Build.VERSION;
import android.util.Log;
import com.fsck.k9.K9;
import com.fsck.k9.mail.*;
@ -9,7 +10,6 @@ import org.apache.james.mime4j.decoder.Base64InputStream;
import org.apache.james.mime4j.decoder.DecoderUtil;
import org.apache.james.mime4j.decoder.QuotedPrintableInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@ -1029,40 +1029,15 @@ public class MimeUtility
/*
* We've got a text part, so let's see if it needs to be processed further.
*/
final String originalCharset = getHeaderParameter(part.getContentType(), "charset");
String charset = "ASCII"; // No encoding, so use us-ascii, which is the standard.
if ((originalCharset != null) && (!"0".equals(originalCharset)))
{
/*
* See if there is conversion from the MIME charset to the Java one.
*/
charset = Charset.forName(fixupCharset(originalCharset)).name();
if (charset == null)
{
Log.e(K9.LOG_TAG,"I don't know how to deal with the charset "+originalCharset+". Falling back to US-ASCII");
charset = "US-ASCII";
}
}
String charset = getHeaderParameter(part.getContentType(), "charset");
charset = fixupCharset(charset, getMessageFromPart(part));
/*
* Now we read the part into a buffer for further processing. Because
* the stream is now wrapped we'll remove any transfer encoding at this point.
*/
InputStream in = part.getBody().getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream(in.available());
IOUtils.copy(in, out);
in.close();
in = null; // we want all of our memory back, and close might not release
// Cargo culted from AOSP - This disagrees with the platform docs
/*
* Convert and return as new String
*/
final String result = out.toString(charset);
out.close();
return result;
return readToString(in, charset);
}
}
@ -1265,18 +1240,681 @@ public class MimeUtility
return DEFAULT_ATTACHMENT_MIME_TYPE;
}
private static String fixupCharset(String charset)
private static Message getMessageFromPart(Part part)
{
charset = charset.toLowerCase();
if (charset.equals("cp932"))
return "shift-jis";
else if (charset.equals("koi8-u"))
return "koi8-r";
while (part != null)
{
if (part instanceof Message)
return (Message)part;
return charset;
if (!(part instanceof BodyPart))
return null;
Multipart multipart = ((BodyPart)part).getParent();
if (multipart == null)
return null;
part = multipart.getParent();
}
return null;
}
private static String fixupCharset(String charset, Message message) throws MessagingException
{
if (charset == null || "0".equals(charset))
charset = "US-ASCII"; // No encoding, so use us-ascii, which is the standard.
charset = charset.toLowerCase();
if (charset.equals("cp932"))
charset = "shift_jis";
else if (charset.equals("koi8-u"))
charset = "koi8-r";
if (charset.equals("shift_jis") || charset.equals("iso-2022-jp"))
{
String variant = getJisVariantFromMessage(message);
if (variant != null)
charset = "x-" + variant + "-" + charset + "-2007";
}
return charset;
}
private static String getJisVariantFromMessage(Message message) throws MessagingException
{
if (message == null)
return null;
// If a receiver is known to use a JIS variant, the sender transfers the message after converting the
// charset as a convention.
String variant = getJisVariantFromReceivedHeaders(message);
if (variant != null)
return variant;
// If a receiver is not known to use any JIS variants, the sender transfers the message without converting
// the charset.
variant = getJisVariantFromFromHeaders(message);
if (variant != null)
return variant;
return getJisVariantFromMailerHeaders(message);
}
private static String getJisVariantFromReceivedHeaders(Message message) throws MessagingException
{
String receivedHeaders[] = message.getHeader("Received");
if (receivedHeaders == null)
return null;
for (String receivedHeader : receivedHeaders)
{
String address = getAddressFromReceivedHeader(receivedHeader);
if (address == null)
continue;
String variant = getJisVariantFromAddress(address);
if (variant != null)
return variant;
}
return null;
}
private static String getAddressFromReceivedHeader(String receivedHeader)
{
// Not implemented yet! Extract an address from the FOR clause of the given Received header.
return null;
}
private static String getJisVariantFromFromHeaders(Message message) throws MessagingException
{
Address addresses[] = message.getFrom();
if (addresses == null || addresses.length == 0)
return null;
return getJisVariantFromAddress(addresses[0].getAddress());
}
private static String getJisVariantFromAddress(String address)
{
if (isInDomain(address, "docomo.ne.jp") || isInDomain(address, "dwmail.jp") ||
isInDomain(address, "pdx.ne.jp") || isInDomain(address, "willcom.com"))
return "docomo";
else if (isInDomain(address, "softbank.ne.jp") || isInDomain(address, "vodafone.ne.jp") ||
isInDomain(address, "disney.ne.jp") || isInDomain(address, "vertuclub.ne.jp"))
return "softbank";
else if (isInDomain(address, "ezweb.ne.jp") || isInDomain(address, "ido.ne.jp"))
return "kddi";
return null;
}
private static boolean isInDomain(String address, String domain)
{
int index = address.length() - domain.length() - 1;
if (index < 0)
return false;
char c = address.charAt(index);
if (c != '@' && c != '.')
return false;
return address.endsWith(domain);
}
private static String getJisVariantFromMailerHeaders(Message message) throws MessagingException
{
String mailerHeaders[] = message.getHeader("X-Mailer");
if (mailerHeaders == null || mailerHeaders.length == 0)
return null;
if (mailerHeaders[0].startsWith("iPhone Mail "))
return "iphone";
return null;
}
private static String readToString(InputStream in, String charset) throws IOException
{
boolean isIphoneString = false;
// iso-2022-jp variants are supported by no versions as of Dec 2010.
if (charset.length() > 19 && charset.startsWith("x-") &&
charset.endsWith("-iso-2022-jp-2007") && !Charset.isSupported(charset))
{
in = new Iso2022JpToShiftJisInputStream(in);
charset = "x-" + charset.substring(2, charset.length() - 17) + "-shift_jis-2007";
}
// shift_jis variants are supported by Eclair and later.
if (charset.length() > 17 && charset.startsWith("x-") &&
charset.endsWith("-shift_jis-2007") && !Charset.isSupported(charset))
{
// If the JIS variant is iPhone, map the Unicode private use area in iPhone to the one in Android after
// converting the character set from the standard Shift JIS to Unicode.
if (charset.substring(2, charset.length() - 15).equals("iphone"))
isIphoneString = true;
charset = "shift_jis";
}
/*
* See if there is conversion from the MIME charset to the Java one.
*/
if (!Charset.isSupported(charset))
{
Log.e(K9.LOG_TAG, "I don't know how to deal with the charset " + charset +
". Falling back to US-ASCII");
charset = "US-ASCII";
}
/*
* Convert and return as new String
*/
String str = IOUtils.toString(in, charset);
if (isIphoneString)
str = importStringFromIphone(str);
return str;
}
static private String importStringFromIphone(String str)
{
StringBuilder buff = new StringBuilder(str.length());
for (int i = 0; i < str.length(); i = str.offsetByCodePoints(i, 1))
{
int codePoint = str.codePointAt(i);
buff.appendCodePoint(importCodePointFromIphone(codePoint));
}
return buff.toString();
}
static private int importCodePointFromIphone(int codePoint)
{
switch (codePoint)
{
case 0xE001: return 0xFE19B;
case 0xE002: return 0xFE19C;
case 0xE003: return 0xFE823;
case 0xE004: return 0xFE19D;
case 0xE005: return 0xFE19E;
case 0xE006: return 0xFE4CF;
case 0xE007: return 0xFE4CD;
case 0xE008: return 0xFE4EF;
case 0xE009: return 0xFE523;
case 0xE00A: return 0xFE525;
case 0xE00B: return 0xFE528;
case 0xE00C: return 0xFE538;
case 0xE00D: return 0xFEB96;
case 0xE00E: return 0xFEB97;
case 0xE00F: return 0xFEB98;
case 0xE010: return 0xFEB93;
case 0xE011: return 0xFEB94;
case 0xE012: return 0xFEB95;
case 0xE013: return 0xFE7D5;
case 0xE014: return 0xFE7D2;
case 0xE015: return 0xFE7D3;
case 0xE016: return 0xFE7D1;
case 0xE017: return 0xFE7DA;
case 0xE018: return 0xFE7D4;
case 0xE019: return 0xFE1BD;
case 0xE01A: return 0xFE1BE;
case 0xE01B: return 0xFE7E4;
case 0xE01C: return 0xFE7EA;
case 0xE01D: return 0xFE7E9;
case 0xE01E: return 0xFE7DF;
case 0xE01F: return 0xFE7E3;
case 0xE020: return 0xFEB09;
case 0xE021: return 0xFEB04;
case 0xE022: return 0xFEB0C;
case 0xE023: return 0xFEB0E;
case 0xE024: return 0xFE01E;
case 0xE025: return 0xFE01F;
case 0xE026: return 0xFE020;
case 0xE027: return 0xFE021;
case 0xE028: return 0xFE022;
case 0xE029: return 0xFE023;
case 0xE02A: return 0xFE024;
case 0xE02B: return 0xFE025;
case 0xE02C: return 0xFE026;
case 0xE02D: return 0xFE027;
case 0xE02E: return 0xFE028;
case 0xE02F: return 0xFE029;
case 0xE030: return 0xFE040;
case 0xE031: return 0xFE4D2;
case 0xE032: return 0xFE041;
case 0xE033: return 0xFE512;
case 0xE034: return 0xFE825;
case 0xE035: return 0xFE826;
case 0xE036: return 0xFE4B0;
case 0xE037: return 0xFE4BB;
case 0xE038: return 0xFE4B2;
case 0xE039: return 0xFE7EC;
case 0xE03A: return 0xFE7F5;
case 0xE03B: return 0xFE4C3;
case 0xE03C: return 0xFE800;
case 0xE03D: return 0xFE801;
case 0xE03E: return 0xFE813;
case 0xE03F: return 0xFEB82;
case 0xE040: return 0xFE815;
case 0xE041: return 0xFE816;
case 0xE042: return 0xFE818;
case 0xE043: return 0xFE980;
case 0xE044: return 0xFE982;
case 0xE045: return 0xFE981;
case 0xE046: return 0xFE962;
case 0xE047: return 0xFE983;
case 0xE048: return 0xFE003;
case 0xE049: return 0xFE001;
case 0xE04A: return 0xFE000;
case 0xE04B: return 0xFE002;
case 0xE04C: return 0xFE014;
case 0xE04D: return 0xFE009;
case 0xE04E: return 0xFE1AF;
case 0xE04F: return 0xFE1B8;
case 0xE050: return 0xFE1C0;
case 0xE051: return 0xFE1C1;
case 0xE052: return 0xFE1B7;
case 0xE053: return 0xFE1C2;
case 0xE054: return 0xFE1C3;
case 0xE055: return 0xFE1BC;
case 0xE056: return 0xFE335;
case 0xE057: return 0xFE330;
case 0xE058: return 0xFE323;
case 0xE059: return 0xFE320;
case 0xE05A: return 0xFE4F4;
case 0xE101: return 0xFE52D;
case 0xE102: return 0xFE52E;
case 0xE103: return 0xFE52B;
case 0xE104: return 0xFE526;
case 0xE105: return 0xFE329;
case 0xE106: return 0xFE327;
case 0xE107: return 0xFE341;
case 0xE108: return 0xFE344;
case 0xE109: return 0xFE1C4;
case 0xE10A: return 0xFE1C5;
case 0xE10B: return 0xFE1BF;
case 0xE10C: return 0xFE1B0;
case 0xE10D: return 0xFE7ED;
case 0xE10E: return 0xFE4D1;
case 0xE10F: return 0xFEB56;
case 0xE110: return 0xFE03C;
case 0xE111: return 0xFE827;
case 0xE112: return 0xFE510;
case 0xE113: return 0xFE4F5;
case 0xE114: return 0xFEB85;
case 0xE115: return 0xFE7D9;
case 0xE116: return 0xFE4CA;
case 0xE117: return 0xFE515;
case 0xE118: return 0xFE03F;
case 0xE119: return 0xFE042;
case 0xE11A: return 0xFE1B2;
case 0xE11B: return 0xFE1AE;
case 0xE11C: return 0xFE1B3;
case 0xE11D: return 0xFE4F6;
case 0xE11E: return 0xFE53B;
case 0xE11F: return 0xFE537;
case 0xE120: return 0xFE960;
case 0xE121: return 0xFE4BC;
case 0xE122: return 0xFE7FB;
case 0xE123: return 0xFE7FA;
case 0xE124: return 0xFE7FD;
case 0xE125: return 0xFE807;
case 0xE126: return 0xFE81D;
case 0xE127: return 0xFE81E;
case 0xE128: return 0xFE81F;
case 0xE129: return 0xFE820;
case 0xE12A: return 0xFE81C;
case 0xE12B: return 0xFE1B1;
case 0xE12C: return 0xFE81B;
case 0xE12D: return 0xFE80B;
case 0xE12E: return 0xFEB32;
case 0xE12F: return 0xFE4DD;
case 0xE130: return 0xFE80C;
case 0xE131: return 0xFE7DB;
case 0xE132: return 0xFE7D7;
case 0xE133: return 0xFE80D;
case 0xE134: return 0xFE7DC;
case 0xE135: return 0xFE7EE;
case 0xE136: return 0xFE7EB;
case 0xE137: return 0xFE7F8;
case 0xE138: return 0xFEB33;
case 0xE139: return 0xFEB34;
case 0xE13A: return 0xFEB35;
case 0xE13B: return 0xFE509;
case 0xE13C: return 0xFEB59;
case 0xE13D: return 0xFE004;
case 0xE13E: return 0xFE4D6;
case 0xE13F: return 0xFE505;
case 0xE140: return 0xFE507;
case 0xE141: return 0xFE821;
case 0xE142: return 0xFE52F;
case 0xE143: return 0xFE514;
case 0xE144: return 0xFEB86;
case 0xE145: return 0xFEB87;
case 0xE146: return 0xFE00B;
case 0xE147: return 0xFE965;
case 0xE148: return 0xFE546;
case 0xE149: return 0xFE4DE;
case 0xE14A: return 0xFE4DF;
case 0xE14B: return 0xFE531;
case 0xE14C: return 0xFEB5E;
case 0xE14D: return 0xFE4B5;
case 0xE14E: return 0xFE7F7;
case 0xE14F: return 0xFE7F6;
case 0xE150: return 0xFE7E7;
case 0xE151: return 0xFE506;
case 0xE152: return 0xFE1A1;
case 0xE153: return 0xFE4B3;
case 0xE154: return 0xFE4B6;
case 0xE155: return 0xFE4B4;
case 0xE156: return 0xFE4B9;
case 0xE157: return 0xFE4BA;
case 0xE158: return 0xFE4B7;
case 0xE159: return 0xFE7E6;
case 0xE15A: return 0xFE7EF;
case 0xE201: return 0xFE7F0;
case 0xE202: return 0xFE7E8;
case 0xE203: return 0xFEB24;
case 0xE204: return 0xFEB19;
case 0xE205: return 0xFEB61;
case 0xE206: return 0xFEB62;
case 0xE207: return 0xFEB25;
case 0xE208: return 0xFEB1F;
case 0xE209: return 0xFE044;
case 0xE20A: return 0xFEB20;
case 0xE20B: return 0xFE838;
case 0xE20C: return 0xFEB1A;
case 0xE20D: return 0xFEB1C;
case 0xE20E: return 0xFEB1B;
case 0xE20F: return 0xFEB1D;
case 0xE210: return 0xFE82C;
case 0xE211: return 0xFE82B;
case 0xE212: return 0xFEB36;
case 0xE213: return 0xFEB37;
case 0xE214: return 0xFEB38;
case 0xE215: return 0xFEB39;
case 0xE216: return 0xFEB3A;
case 0xE217: return 0xFEB3B;
case 0xE218: return 0xFEB3C;
case 0xE219: return 0xFEB63;
case 0xE21A: return 0xFEB64;
case 0xE21B: return 0xFEB67;
case 0xE21C: return 0xFE82E;
case 0xE21D: return 0xFE82F;
case 0xE21E: return 0xFE830;
case 0xE21F: return 0xFE831;
case 0xE220: return 0xFE832;
case 0xE221: return 0xFE833;
case 0xE222: return 0xFE834;
case 0xE223: return 0xFE835;
case 0xE224: return 0xFE836;
case 0xE225: return 0xFE837;
case 0xE226: return 0xFEB3D;
case 0xE227: return 0xFEB3E;
case 0xE228: return 0xFEB3F;
case 0xE229: return 0xFEB81;
case 0xE22A: return 0xFEB31;
case 0xE22B: return 0xFEB2F;
case 0xE22C: return 0xFEB40;
case 0xE22D: return 0xFEB41;
case 0xE22E: return 0xFEB99;
case 0xE22F: return 0xFEB9A;
case 0xE230: return 0xFEB9B;
case 0xE231: return 0xFEB9C;
case 0xE232: return 0xFEAF8;
case 0xE233: return 0xFEAF9;
case 0xE234: return 0xFEAFA;
case 0xE235: return 0xFEAFB;
case 0xE236: return 0xFEAF0;
case 0xE237: return 0xFEAF2;
case 0xE238: return 0xFEAF1;
case 0xE239: return 0xFEAF3;
case 0xE23A: return 0xFEAFC;
case 0xE23B: return 0xFEAFD;
case 0xE23C: return 0xFEAFE;
case 0xE23D: return 0xFEAFF;
case 0xE23E: return 0xFE4F8;
case 0xE23F: return 0xFE02B;
case 0xE240: return 0xFE02C;
case 0xE241: return 0xFE02D;
case 0xE242: return 0xFE02E;
case 0xE243: return 0xFE02F;
case 0xE244: return 0xFE030;
case 0xE245: return 0xFE031;
case 0xE246: return 0xFE032;
case 0xE247: return 0xFE033;
case 0xE248: return 0xFE034;
case 0xE249: return 0xFE035;
case 0xE24A: return 0xFE036;
case 0xE24B: return 0xFE037;
case 0xE24C: return 0xFEB42;
case 0xE24D: return 0xFEB27;
case 0xE24E: return 0xFEB29;
case 0xE24F: return 0xFEB2D;
case 0xE250: return 0xFE839;
case 0xE251: return 0xFE83A;
case 0xE252: return 0xFEB23;
case 0xE253: return 0xFE1B4;
case 0xE254: return 0xFEE77;
case 0xE255: return 0xFEE78;
case 0xE256: return 0xFEE79;
case 0xE257: return 0xFEE7A;
case 0xE258: return 0xFEE7B;
case 0xE259: return 0xFEE7C;
case 0xE25A: return 0xFEE7D;
case 0xE301: return 0xFE527;
case 0xE302: return 0xFE4D3;
case 0xE303: return 0xFE045;
case 0xE304: return 0xFE03D;
case 0xE305: return 0xFE046;
case 0xE306: return 0xFE828;
case 0xE307: return 0xFE047;
case 0xE308: return 0xFE048;
case 0xE309: return 0xFE508;
case 0xE30A: return 0xFE803;
case 0xE30B: return 0xFE985;
case 0xE30C: return 0xFE987;
case 0xE30D: return 0xFEB43;
case 0xE30E: return 0xFEB1E;
case 0xE30F: return 0xFE50A;
case 0xE310: return 0xFE516;
case 0xE311: return 0xFEB58;
case 0xE312: return 0xFE517;
case 0xE313: return 0xFE53E;
case 0xE314: return 0xFE50F;
case 0xE315: return 0xFEB2B;
case 0xE316: return 0xFE53C;
case 0xE317: return 0xFE530;
case 0xE318: return 0xFE4D4;
case 0xE319: return 0xFE4D5;
case 0xE31A: return 0xFE4D7;
case 0xE31B: return 0xFE4D8;
case 0xE31C: return 0xFE195;
case 0xE31D: return 0xFE196;
case 0xE31E: return 0xFE197;
case 0xE31F: return 0xFE198;
case 0xE320: return 0xFE199;
case 0xE321: return 0xFE4D9;
case 0xE322: return 0xFE4DA;
case 0xE323: return 0xFE4F0;
case 0xE324: return 0xFE808;
case 0xE325: return 0xFE4F2;
case 0xE326: return 0xFE814;
case 0xE327: return 0xFEB0D;
case 0xE328: return 0xFEB11;
case 0xE329: return 0xFEB12;
case 0xE32A: return 0xFEB13;
case 0xE32B: return 0xFEB14;
case 0xE32C: return 0xFEB15;
case 0xE32D: return 0xFEB16;
case 0xE32E: return 0xFEB60;
case 0xE32F: return 0xFEB68;
case 0xE330: return 0xFEB5D;
case 0xE331: return 0xFEB5B;
case 0xE332: return 0xFEB44;
case 0xE333: return 0xFEB45;
case 0xE334: return 0xFEB57;
case 0xE335: return 0xFEB69;
case 0xE336: return 0xFEB0A;
case 0xE337: return 0xFEB0B;
case 0xE338: return 0xFE984;
case 0xE339: return 0xFE964;
case 0xE33A: return 0xFE966;
case 0xE33B: return 0xFE967;
case 0xE33C: return 0xFE968;
case 0xE33D: return 0xFE969;
case 0xE33E: return 0xFE96A;
case 0xE33F: return 0xFE96B;
case 0xE340: return 0xFE963;
case 0xE341: return 0xFE96C;
case 0xE342: return 0xFE961;
case 0xE343: return 0xFE96D;
case 0xE344: return 0xFE96E;
case 0xE345: return 0xFE051;
case 0xE346: return 0xFE052;
case 0xE347: return 0xFE053;
case 0xE348: return 0xFE054;
case 0xE349: return 0xFE055;
case 0xE34A: return 0xFE056;
case 0xE34B: return 0xFE511;
case 0xE34C: return 0xFE96F;
case 0xE34D: return 0xFE970;
case 0xE401: return 0xFE345;
case 0xE402: return 0xFE343;
case 0xE403: return 0xFE340;
case 0xE404: return 0xFE333;
case 0xE405: return 0xFE347;
case 0xE406: return 0xFE33C;
case 0xE407: return 0xFE33F;
case 0xE408: return 0xFE342;
case 0xE409: return 0xFE32A;
case 0xE40A: return 0xFE33E;
case 0xE40B: return 0xFE33B;
case 0xE40C: return 0xFE32E;
case 0xE40D: return 0xFE32F;
case 0xE40E: return 0xFE326;
case 0xE40F: return 0xFE325;
case 0xE410: return 0xFE322;
case 0xE411: return 0xFE33A;
case 0xE412: return 0xFE334;
case 0xE413: return 0xFE339;
case 0xE414: return 0xFE336;
case 0xE415: return 0xFE338;
case 0xE416: return 0xFE33D;
case 0xE417: return 0xFE32D;
case 0xE418: return 0xFE32C;
case 0xE419: return 0xFE190;
case 0xE41A: return 0xFE192;
case 0xE41B: return 0xFE191;
case 0xE41C: return 0xFE193;
case 0xE41D: return 0xFE35B;
case 0xE41E: return 0xFEB9D;
case 0xE41F: return 0xFEB9E;
case 0xE420: return 0xFEB9F;
case 0xE421: return 0xFEBA0;
case 0xE422: return 0xFEBA1;
case 0xE423: return 0xFE351;
case 0xE424: return 0xFE352;
case 0xE425: return 0xFE829;
case 0xE426: return 0xFE353;
case 0xE427: return 0xFE358;
case 0xE428: return 0xFE1A0;
case 0xE429: return 0xFE1A2;
case 0xE42A: return 0xFE7D6;
case 0xE42B: return 0xFE7DD;
case 0xE42C: return 0xFE80E;
case 0xE42D: return 0xFE7DE;
case 0xE42E: return 0xFE7E5;
case 0xE42F: return 0xFE7F1;
case 0xE430: return 0xFE7F2;
case 0xE431: return 0xFE7F3;
case 0xE432: return 0xFE7F4;
case 0xE433: return 0xFE7FE;
case 0xE434: return 0xFE7E0;
case 0xE435: return 0xFE7E2;
case 0xE436: return 0xFE518;
case 0xE437: return 0xFEB17;
case 0xE438: return 0xFE519;
case 0xE439: return 0xFE51A;
case 0xE43A: return 0xFE51B;
case 0xE43B: return 0xFE51C;
case 0xE43C: return 0xFE007;
case 0xE43D: return 0xFE82A;
case 0xE43E: return 0xFE038;
case 0xE43F: return 0xFE971;
case 0xE440: return 0xFE51D;
case 0xE441: return 0xFE1C6;
case 0xE442: return 0xFE51E;
case 0xE443: return 0xFE005;
case 0xE444: return 0xFE049;
case 0xE445: return 0xFE51F;
case 0xE446: return 0xFE017;
case 0xE447: return 0xFE043;
case 0xE448: return 0xFE513;
case 0xE449: return 0xFE00A;
case 0xE44A: return 0xFE00C;
case 0xE44B: return 0xFE008;
case 0xE44C: return 0xFE00D;
case 0xE501: return 0xFE4B8;
case 0xE502: return 0xFE804;
case 0xE503: return 0xFE805;
case 0xE504: return 0xFE4BD;
case 0xE505: return 0xFE4BE;
case 0xE506: return 0xFE4BF;
case 0xE507: return 0xFE802;
case 0xE508: return 0xFE4C0;
case 0xE509: return 0xFE4C4;
case 0xE50A: return 0xFE4C5;
case 0xE50B: return 0xFE4E5;
case 0xE50C: return 0xFE4E6;
case 0xE50D: return 0xFE4E7;
case 0xE50E: return 0xFE4E8;
case 0xE50F: return 0xFE4E9;
case 0xE510: return 0xFE4EA;
case 0xE511: return 0xFE4EB;
case 0xE512: return 0xFE4EC;
case 0xE513: return 0xFE4ED;
case 0xE514: return 0xFE4EE;
case 0xE515: return 0xFE1A4;
case 0xE516: return 0xFE1A5;
case 0xE517: return 0xFE1A6;
case 0xE518: return 0xFE1A7;
case 0xE519: return 0xFE1A8;
case 0xE51A: return 0xFE1A9;
case 0xE51B: return 0xFE1AA;
case 0xE51C: return 0xFE1AB;
case 0xE51D: return 0xFE4C6;
case 0xE51E: return 0xFE1B5;
case 0xE51F: return 0xFE1B6;
case 0xE520: return 0xFE1C7;
case 0xE521: return 0xFE1C8;
case 0xE522: return 0xFE1C9;
case 0xE523: return 0xFE1BA;
case 0xE524: return 0xFE1CA;
case 0xE525: return 0xFE1CB;
case 0xE526: return 0xFE1CC;
case 0xE527: return 0xFE1CD;
case 0xE528: return 0xFE1CE;
case 0xE529: return 0xFE1CF;
case 0xE52A: return 0xFE1D0;
case 0xE52B: return 0xFE1D1;
case 0xE52C: return 0xFE1D2;
case 0xE52D: return 0xFE1D3;
case 0xE52E: return 0xFE1D4;
case 0xE52F: return 0xFE1D5;
case 0xE530: return 0xFE1D6;
case 0xE531: return 0xFE1D7;
case 0xE532: return 0xFE50B;
case 0xE533: return 0xFE50C;
case 0xE534: return 0xFE50D;
case 0xE535: return 0xFE50E;
case 0xE536: return 0xFE553;
case 0xE537: return 0xFEB2A;
case 0xE538: return 0xFEE70;
case 0xE539: return 0xFEE71;
case 0xE53A: return 0xFEE72;
case 0xE53B: return 0xFEE73;
case 0xE53C: return 0xFEE74;
case 0xE53D: return 0xFEE75;
case 0xE53E: return 0xFEE76;
default: return codePoint;
}
}
}

File diff suppressed because it is too large Load Diff