// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2012-2013 Samsung Electronics Co., Ltd.
*/
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/buffer_head.h>
#include <linux/unaligned.h>
#include "exfat_raw.h"
#include "exfat_fs.h"
/* Upcase table macro */
#define EXFAT_NUM_UPCASE (
2918 )
#define UTBL_COUNT (
0 x10000)
/*
* Upcase table in compressed format (7.2.5.1 Recommended Up-case Table
* in exfat specification, See:
* https://docs.microsoft.com/en-us/windows/win32/fileio/exfat-specification).
*/
static const unsigned short uni_def_upcase[EXFAT_NUM_UPCASE] = {
0 x0000,
0 x0001,
0 x0002,
0 x0003,
0 x0004,
0 x0005,
0 x0006,
0 x0007,
0 x0008,
0 x0009,
0 x000a,
0 x000b,
0 x000c,
0 x000d,
0 x000e,
0 x000f,
0 x0010,
0 x0011,
0 x0012,
0 x0013,
0 x0014,
0 x0015,
0 x0016,
0 x0017,
0 x0018,
0 x0019,
0 x001a,
0 x001b,
0 x001c,
0 x001d,
0 x001e,
0 x001f,
0 x0020,
0 x0021,
0 x0022,
0 x0023,
0 x0024,
0 x0025,
0 x0026,
0 x0027,
0 x0028,
0 x0029,
0 x002a,
0 x002b,
0 x002c,
0 x002d,
0 x002e,
0 x002f,
0 x0030,
0 x0031,
0 x0032,
0 x0033,
0 x0034,
0 x0035,
0 x0036,
0 x0037,
0 x0038,
0 x0039,
0 x003a,
0 x003b,
0 x003c,
0 x003d,
0 x003e,
0 x003f,
0 x0040,
0 x0041,
0 x0042,
0 x0043,
0 x0044,
0 x0045,
0 x0046,
0 x0047,
0 x0048,
0 x0049,
0 x004a,
0 x004b,
0 x004c,
0 x004d,
0 x004e,
0 x004f,
0 x0050,
0 x0051,
0 x0052,
0 x0053,
0 x0054,
0 x0055,
0 x0056,
0 x0057,
0 x0058,
0 x0059,
0 x005a,
0 x005b,
0 x005c,
0 x005d,
0 x005e,
0 x005f,
0 x0060,
0 x0041,
0 x0042,
0 x0043,
0 x0044,
0 x0045,
0 x0046,
0 x0047,
0 x0048,
0 x0049,
0 x004a,
0 x004b,
0 x004c,
0 x004d,
0 x004e,
0 x004f,
0 x0050,
0 x0051,
0 x0052,
0 x0053,
0 x0054,
0 x0055,
0 x0056,
0 x0057,
0 x0058,
0 x0059,
0 x005a,
0 x007b,
0 x007c,
0 x007d,
0 x007e,
0 x007f,
0 x0080,
0 x0081,
0 x0082,
0 x0083,
0 x0084,
0 x0085,
0 x0086,
0 x0087,
0 x0088,
0 x0089,
0 x008a,
0 x008b,
0 x008c,
0 x008d,
0 x008e,
0 x008f,
0 x0090,
0 x0091,
0 x0092,
0 x0093,
0 x0094,
0 x0095,
0 x0096,
0 x0097,
0 x0098,
0 x0099,
0 x009a,
0 x009b,
0 x009c,
0 x009d,
0 x009e,
0 x009f,
0 x00a0,
0 x00a1,
0 x00a2,
0 x00a3,
0 x00a4,
0 x00a5,
0 x00a6,
0 x00a7,
0 x00a8,
0 x00a9,
0 x00aa,
0 x00ab,
0 x00ac,
0 x00ad,
0 x00ae,
0 x00af,
0 x00b0,
0 x00b1,
0 x00b2,
0 x00b3,
0 x00b4,
0 x00b5,
0 x00b6,
0 x00b7,
0 x00b8,
0 x00b9,
0 x00ba,
0 x00bb,
0 x00bc,
0 x00bd,
0 x00be,
0 x00bf,
0 x00c0,
0 x00c1,
0 x00c2,
0 x00c3,
0 x00c4,
0 x00c5,
0 x00c6,
0 x00c7,
0 x00c8,
0 x00c9,
0 x00ca,
0 x00cb,
0 x00cc,
0 x00cd,
0 x00ce,
0 x00cf,
0 x00d0,
0 x00d1,
0 x00d2,
0 x00d3,
0 x00d4,
0 x00d5,
0 x00d6,
0 x00d7,
0 x00d8,
0 x00d9,
0 x00da,
0 x00db,
0 x00dc,
0 x00dd,
0 x00de,
0 x00df,
0 x00c0,
0 x00c1,
0 x00c2,
0 x00c3,
0 x00c4,
0 x00c5,
0 x00c6,
0 x00c7,
0 x00c8,
0 x00c9,
0 x00ca,
0 x00cb,
0 x00cc,
0 x00cd,
0 x00ce,
0 x00cf,
0 x00d0,
0 x00d1,
0 x00d2,
0 x00d3,
0 x00d4,
0 x00d5,
0 x00d6,
0 x00f7,
0 x00d8,
0 x00d9,
0 x00da,
0 x00db,
0 x00dc,
0 x00dd,
0 x00de,
0 x0178,
0 x0100,
0 x0100,
0 x0102,
0 x0102,
0 x0104,
0 x0104,
0 x0106,
0 x0106,
0 x0108,
0 x0108,
0 x010a,
0 x010a,
0 x010c,
0 x010c,
0 x010e,
0 x010e,
0 x0110,
0 x0110,
0 x0112,
0 x0112,
0 x0114,
0 x0114,
0 x0116,
0 x0116,
0 x0118,
0 x0118,
0 x011a,
0 x011a,
0 x011c,
0 x011c,
0 x011e,
0 x011e,
0 x0120,
0 x0120,
0 x0122,
0 x0122,
0 x0124,
0 x0124,
0 x0126,
0 x0126,
0 x0128,
0 x0128,
0 x012a,
0 x012a,
0 x012c,
0 x012c,
0 x012e,
0 x012e,
0 x0130,
0 x0131,
0 x0132,
0 x0132,
0 x0134,
0 x0134,
0 x0136,
0 x0136,
0 x0138,
0 x0139,
0 x0139,
0 x013b,
0 x013b,
0 x013d,
0 x013d,
0 x013f,
0 x013f,
0 x0141,
0 x0141,
0 x0143,
0 x0143,
0 x0145,
0 x0145,
0 x0147,
0 x0147,
0 x0149,
0 x014a,
0 x014a,
0 x014c,
0 x014c,
0 x014e,
0 x014e,
0 x0150,
0 x0150,
0 x0152,
0 x0152,
0 x0154,
0 x0154,
0 x0156,
0 x0156,
0 x0158,
0 x0158,
0 x015a,
0 x015a,
0 x015c,
0 x015c,
0 x015e,
0 x015e,
0 x0160,
0 x0160,
0 x0162,
0 x0162,
0 x0164,
0 x0164,
0 x0166,
0 x0166,
0 x0168,
0 x0168,
0 x016a,
0 x016a,
0 x016c,
0 x016c,
0 x016e,
0 x016e,
0 x0170,
0 x0170,
0 x0172,
0 x0172,
0 x0174,
0 x0174,
0 x0176,
0 x0176,
0 x0178,
0 x0179,
0 x0179,
0 x017b,
0 x017b,
0 x017d,
0 x017d,
0 x017f,
0 x0243,
0 x0181,
0 x0182,
0 x0182,
0 x0184,
0 x0184,
0 x0186,
0 x0187,
0 x0187,
0 x0189,
0 x018a,
0 x018b,
0 x018b,
0 x018d,
0 x018e,
0 x018f,
0 x0190,
0 x0191,
0 x0191,
0 x0193,
0 x0194,
0 x01f6,
0 x0196,
0 x0197,
0 x0198,
0 x0198,
0 x023d,
0 x019b,
0 x019c,
0 x019d,
0 x0220,
0 x019f,
0 x01a0,
0 x01a0,
0 x01a2,
0 x01a2,
0 x01a4,
0 x01a4,
0 x01a6,
0 x01a7,
0 x01a7,
0 x01a9,
0 x01aa,
0 x01ab,
0 x01ac,
0 x01ac,
0 x01ae,
0 x01af,
0 x01af,
0 x01b1,
0 x01b2,
0 x01b3,
0 x01b3,
0 x01b5,
0 x01b5,
0 x01b7,
0 x01b8,
0 x01b8,
0 x01ba,
0 x01bb,
0 x01bc,
0 x01bc,
0 x01be,
0 x01f7,
0 x01c0,
0 x01c1,
0 x01c2,
0 x01c3,
0 x01c4,
0 x01c5,
0 x01c4,
0 x01c7,
0 x01c8,
0 x01c7,
0 x01ca,
0 x01cb,
0 x01ca,
0 x01cd,
0 x01cd,
0 x01cf,
0 x01cf,
0 x01d1,
0 x01d1,
0 x01d3,
0 x01d3,
0 x01d5,
0 x01d5,
0 x01d7,
0 x01d7,
0 x01d9,
0 x01d9,
0 x01db,
0 x01db,
0 x018e,
0 x01de,
0 x01de,
0 x01e0,
0 x01e0,
0 x01e2,
0 x01e2,
0 x01e4,
0 x01e4,
0 x01e6,
0 x01e6,
0 x01e8,
0 x01e8,
0 x01ea,
0 x01ea,
0 x01ec,
0 x01ec,
0 x01ee,
0 x01ee,
0 x01f0,
0 x01f1,
0 x01f2,
0 x01f1,
0 x01f4,
0 x01f4,
0 x01f6,
0 x01f7,
0 x01f8,
0 x01f8,
0 x01fa,
0 x01fa,
0 x01fc,
0 x01fc,
0 x01fe,
0 x01fe,
0 x0200,
0 x0200,
0 x0202,
0 x0202,
0 x0204,
0 x0204,
0 x0206,
0 x0206,
0 x0208,
0 x0208,
0 x020a,
0 x020a,
0 x020c,
0 x020c,
0 x020e,
0 x020e,
0 x0210,
0 x0210,
0 x0212,
0 x0212,
0 x0214,
0 x0214,
0 x0216,
0 x0216,
0 x0218,
0 x0218,
0 x021a,
0 x021a,
0 x021c,
0 x021c,
0 x021e,
0 x021e,
0 x0220,
0 x0221,
0 x0222,
0 x0222,
0 x0224,
0 x0224,
0 x0226,
0 x0226,
0 x0228,
0 x0228,
0 x022a,
0 x022a,
0 x022c,
0 x022c,
0 x022e,
0 x022e,
0 x0230,
0 x0230,
0 x0232,
0 x0232,
0 x0234,
0 x0235,
0 x0236,
0 x0237,
0 x0238,
0 x0239,
0 x2c65,
0 x023b,
0 x023b,
0 x023d,
0 x2c66,
0 x023f,
0 x0240,
0 x0241,
0 x0241,
0 x0243,
0 x0244,
0 x0245,
0 x0246,
0 x0246,
0 x0248,
0 x0248,
0 x024a,
0 x024a,
0 x024c,
0 x024c,
0 x024e,
0 x024e,
0 x0250,
0 x0251,
0 x0252,
0 x0181,
0 x0186,
0 x0255,
0 x0189,
0 x018a,
0 x0258,
0 x018f,
0 x025a,
0 x0190,
0 x025c,
0 x025d,
0 x025e,
0 x025f,
0 x0193,
0 x0261,
0 x0262,
0 x0194,
0 x0264,
0 x0265,
0 x0266,
0 x0267,
0 x0197,
0 x0196,
0 x026a,
0 x2c62,
0 x026c,
0 x026d,
0 x026e,
0 x019c,
0 x0270,
0 x0271,
0 x019d,
0 x0273,
0 x0274,
0 x019f,
0 x0276,
0 x0277,
0 x0278,
0 x0279,
0 x027a,
0 x027b,
0 x027c,
0 x2c64,
0 x027e,
0 x027f,
0 x01a6,
0 x0281,
0 x0282,
0 x01a9,
0 x0284,
0 x0285,
0 x0286,
0 x0287,
0 x01ae,
0 x0244,
0 x01b1,
0 x01b2,
0 x0245,
0 x028d,
0 x028e,
0 x028f,
0 x0290,
0 x0291,
0 x01b7,
0 x0293,
0 x0294,
0 x0295,
0 x0296,
0 x0297,
0 x0298,
0 x0299,
0 x029a,
0 x029b,
0 x029c,
0 x029d,
0 x029e,
0 x029f,
0 x02a0,
0 x02a1,
0 x02a2,
0 x02a3,
0 x02a4,
0 x02a5,
0 x02a6,
0 x02a7,
0 x02a8,
0 x02a9,
0 x02aa,
0 x02ab,
0 x02ac,
0 x02ad,
0 x02ae,
0 x02af,
0 x02b0,
0 x02b1,
0 x02b2,
0 x02b3,
0 x02b4,
0 x02b5,
0 x02b6,
0 x02b7,
0 x02b8,
0 x02b9,
0 x02ba,
0 x02bb,
0 x02bc,
0 x02bd,
0 x02be,
0 x02bf,
0 x02c0,
0 x02c1,
0 x02c2,
0 x02c3,
0 x02c4,
0 x02c5,
0 x02c6,
0 x02c7,
0 x02c8,
0 x02c9,
0 x02ca,
0 x02cb,
0 x02cc,
0 x02cd,
0 x02ce,
0 x02cf,
0 x02d0,
0 x02d1,
0 x02d2,
0 x02d3,
0 x02d4,
0 x02d5,
0 x02d6,
0 x02d7,
0 x02d8,
0 x02d9,
0 x02da,
0 x02db,
0 x02dc,
0 x02dd,
0 x02de,
0 x02df,
0 x02e0,
0 x02e1,
0 x02e2,
0 x02e3,
0 x02e4,
0 x02e5,
0 x02e6,
0 x02e7,
0 x02e8,
0 x02e9,
0 x02ea,
0 x02eb,
0 x02ec,
0 x02ed,
0 x02ee,
0 x02ef,
0 x02f0,
0 x02f1,
0 x02f2,
0 x02f3,
0 x02f4,
0 x02f5,
0 x02f6,
0 x02f7,
0 x02f8,
0 x02f9,
0 x02fa,
0 x02fb,
0 x02fc,
0 x02fd,
0 x02fe,
0 x02ff,
0 x0300,
0 x0301,
0 x0302,
0 x0303,
0 x0304,
0 x0305,
0 x0306,
0 x0307,
0 x0308,
0 x0309,
0 x030a,
0 x030b,
0 x030c,
0 x030d,
0 x030e,
0 x030f,
0 x0310,
0 x0311,
0 x0312,
0 x0313,
0 x0314,
0 x0315,
0 x0316,
0 x0317,
0 x0318,
0 x0319,
0 x031a,
0 x031b,
0 x031c,
0 x031d,
0 x031e,
0 x031f,
0 x0320,
0 x0321,
0 x0322,
0 x0323,
0 x0324,
0 x0325,
0 x0326,
0 x0327,
0 x0328,
0 x0329,
0 x032a,
0 x032b,
0 x032c,
0 x032d,
0 x032e,
0 x032f,
0 x0330,
0 x0331,
0 x0332,
0 x0333,
0 x0334,
0 x0335,
0 x0336,
0 x0337,
0 x0338,
0 x0339,
0 x033a,
0 x033b,
0 x033c,
0 x033d,
0 x033e,
0 x033f,
0 x0340,
0 x0341,
0 x0342,
0 x0343,
0 x0344,
0 x0345,
0 x0346,
0 x0347,
0 x0348,
0 x0349,
0 x034a,
0 x034b,
0 x034c,
0 x034d,
0 x034e,
0 x034f,
0 x0350,
0 x0351,
0 x0352,
0 x0353,
0 x0354,
0 x0355,
0 x0356,
0 x0357,
0 x0358,
0 x0359,
0 x035a,
0 x035b,
0 x035c,
0 x035d,
0 x035e,
0 x035f,
0 x0360,
0 x0361,
0 x0362,
0 x0363,
0 x0364,
0 x0365,
0 x0366,
0 x0367,
0 x0368,
0 x0369,
0 x036a,
0 x036b,
0 x036c,
0 x036d,
0 x036e,
0 x036f,
0 x0370,
0 x0371,
0 x0372,
0 x0373,
0 x0374,
0 x0375,
0 x0376,
0 x0377,
0 x0378,
0 x0379,
0 x037a,
0 x03fd,
0 x03fe,
0 x03ff,
0 x037e,
0 x037f,
0 x0380,
0 x0381,
0 x0382,
0 x0383,
0 x0384,
0 x0385,
0 x0386,
0 x0387,
0 x0388,
0 x0389,
0 x038a,
0 x038b,
0 x038c,
0 x038d,
0 x038e,
0 x038f,
0 x0390,
0 x0391,
0 x0392,
0 x0393,
0 x0394,
0 x0395,
0 x0396,
0 x0397,
0 x0398,
0 x0399,
0 x039a,
0 x039b,
0 x039c,
0 x039d,
0 x039e,
0 x039f,
0 x03a0,
0 x03a1,
0 x03a2,
0 x03a3,
0 x03a4,
0 x03a5,
0 x03a6,
0 x03a7,
0 x03a8,
0 x03a9,
0 x03aa,
0 x03ab,
0 x0386,
0 x0388,
0 x0389,
0 x038a,
0 x03b0,
0 x0391,
0 x0392,
0 x0393,
0 x0394,
0 x0395,
0 x0396,
0 x0397,
0 x0398,
0 x0399,
0 x039a,
0 x039b,
0 x039c,
0 x039d,
0 x039e,
0 x039f,
0 x03a0,
0 x03a1,
0 x03a3,
0 x03a3,
0 x03a4,
0 x03a5,
0 x03a6,
0 x03a7,
0 x03a8,
0 x03a9,
0 x03aa,
0 x03ab,
0 x038c,
0 x038e,
0 x038f,
0 x03cf,
0 x03d0,
0 x03d1,
0 x03d2,
0 x03d3,
0 x03d4,
0 x03d5,
0 x03d6,
0 x03d7,
0 x03d8,
0 x03d8,
0 x03da,
0 x03da,
0 x03dc,
0 x03dc,
0 x03de,
0 x03de,
0 x03e0,
0 x03e0,
0 x03e2,
0 x03e2,
0 x03e4,
0 x03e4,
0 x03e6,
0 x03e6,
0 x03e8,
0 x03e8,
0 x03ea,
0 x03ea,
0 x03ec,
0 x03ec,
0 x03ee,
0 x03ee,
0 x03f0,
0 x03f1,
0 x03f9,
0 x03f3,
0 x03f4,
0 x03f5,
0 x03f6,
0 x03f7,
0 x03f7,
0 x03f9,
0 x03fa,
0 x03fa,
0 x03fc,
0 x03fd,
0 x03fe,
0 x03ff,
0 x0400,
0 x0401,
0 x0402,
0 x0403,
0 x0404,
0 x0405,
0 x0406,
0 x0407,
0 x0408,
0 x0409,
0 x040a,
0 x040b,
0 x040c,
0 x040d,
0 x040e,
0 x040f,
0 x0410,
0 x0411,
0 x0412,
0 x0413,
0 x0414,
0 x0415,
0 x0416,
0 x0417,
0 x0418,
0 x0419,
0 x041a,
0 x041b,
0 x041c,
0 x041d,
0 x041e,
0 x041f,
0 x0420,
0 x0421,
0 x0422,
0 x0423,
0 x0424,
0 x0425,
0 x0426,
0 x0427,
0 x0428,
0 x0429,
0 x042a,
0 x042b,
0 x042c,
0 x042d,
0 x042e,
0 x042f,
0 x0410,
0 x0411,
0 x0412,
0 x0413,
0 x0414,
0 x0415,
0 x0416,
0 x0417,
0 x0418,
0 x0419,
0 x041a,
0 x041b,
0 x041c,
0 x041d,
0 x041e,
0 x041f,
0 x0420,
0 x0421,
0 x0422,
0 x0423,
0 x0424,
0 x0425,
0 x0426,
0 x0427,
0 x0428,
0 x0429,
0 x042a,
0 x042b,
0 x042c,
0 x042d,
0 x042e,
0 x042f,
0 x0400,
0 x0401,
0 x0402,
0 x0403,
0 x0404,
0 x0405,
0 x0406,
0 x0407,
0 x0408,
0 x0409,
0 x040a,
0 x040b,
0 x040c,
0 x040d,
0 x040e,
0 x040f,
0 x0460,
0 x0460,
0 x0462,
0 x0462,
0 x0464,
0 x0464,
0 x0466,
0 x0466,
0 x0468,
0 x0468,
0 x046a,
0 x046a,
0 x046c,
0 x046c,
0 x046e,
0 x046e,
0 x0470,
0 x0470,
0 x0472,
0 x0472,
0 x0474,
0 x0474,
0 x0476,
0 x0476,
0 x0478,
0 x0478,
0 x047a,
0 x047a,
0 x047c,
0 x047c,
0 x047e,
0 x047e,
0 x0480,
0 x0480,
0 x0482,
0 x0483,
0 x0484,
0 x0485,
0 x0486,
0 x0487,
0 x0488,
0 x0489,
0 x048a,
0 x048a,
0 x048c,
0 x048c,
0 x048e,
0 x048e,
0 x0490,
0 x0490,
0 x0492,
0 x0492,
0 x0494,
0 x0494,
0 x0496,
0 x0496,
0 x0498,
0 x0498,
0 x049a,
0 x049a,
0 x049c,
0 x049c,
0 x049e,
0 x049e,
0 x04a0,
0 x04a0,
0 x04a2,
0 x04a2,
0 x04a4,
0 x04a4,
0 x04a6,
0 x04a6,
0 x04a8,
0 x04a8,
0 x04aa,
0 x04aa,
0 x04ac,
0 x04ac,
0 x04ae,
0 x04ae,
0 x04b0,
0 x04b0,
0 x04b2,
0 x04b2,
0 x04b4,
0 x04b4,
0 x04b6,
0 x04b6,
0 x04b8,
0 x04b8,
0 x04ba,
0 x04ba,
0 x04bc,
0 x04bc,
0 x04be,
0 x04be,
0 x04c0,
0 x04c1,
0 x04c1,
0 x04c3,
0 x04c3,
0 x04c5,
0 x04c5,
0 x04c7,
0 x04c7,
0 x04c9,
0 x04c9,
0 x04cb,
0 x04cb,
0 x04cd,
0 x04cd,
0 x04c0,
0 x04d0,
0 x04d0,
0 x04d2,
0 x04d2,
0 x04d4,
0 x04d4,
0 x04d6,
0 x04d6,
0 x04d8,
0 x04d8,
0 x04da,
0 x04da,
0 x04dc,
0 x04dc,
0 x04de,
0 x04de,
0 x04e0,
0 x04e0,
0 x04e2,
0 x04e2,
0 x04e4,
0 x04e4,
0 x04e6,
0 x04e6,
0 x04e8,
0 x04e8,
0 x04ea,
0 x04ea,
0 x04ec,
0 x04ec,
0 x04ee,
0 x04ee,
0 x04f0,
0 x04f0,
0 x04f2,
0 x04f2,
0 x04f4,
0 x04f4,
0 x04f6,
0 x04f6,
0 x04f8,
0 x04f8,
0 x04fa,
0 x04fa,
0 x04fc,
0 x04fc,
0 x04fe,
0 x04fe,
0 x0500,
0 x0500,
0 x0502,
0 x0502,
0 x0504,
0 x0504,
0 x0506,
0 x0506,
0 x0508,
0 x0508,
0 x050a,
0 x050a,
0 x050c,
0 x050c,
0 x050e,
0 x050e,
0 x0510,
0 x0510,
0 x0512,
0 x0512,
0 x0514,
0 x0515,
0 x0516,
0 x0517,
0 x0518,
0 x0519,
0 x051a,
0 x051b,
0 x051c,
0 x051d,
0 x051e,
0 x051f,
0 x0520,
0 x0521,
0 x0522,
0 x0523,
0 x0524,
0 x0525,
0 x0526,
0 x0527,
0 x0528,
0 x0529,
0 x052a,
0 x052b,
0 x052c,
0 x052d,
0 x052e,
0 x052f,
0 x0530,
0 x0531,
0 x0532,
0 x0533,
0 x0534,
0 x0535,
0 x0536,
0 x0537,
0 x0538,
0 x0539,
0 x053a,
0 x053b,
0 x053c,
0 x053d,
0 x053e,
0 x053f,
0 x0540,
0 x0541,
0 x0542,
0 x0543,
0 x0544,
0 x0545,
0 x0546,
0 x0547,
0 x0548,
0 x0549,
0 x054a,
0 x054b,
0 x054c,
0 x054d,
0 x054e,
0 x054f,
0 x0550,
0 x0551,
0 x0552,
0 x0553,
0 x0554,
0 x0555,
0 x0556,
0 x0557,
0 x0558,
0 x0559,
0 x055a,
0 x055b,
0 x055c,
0 x055d,
0 x055e,
0 x055f,
0 x0560,
0 x0531,
0 x0532,
0 x0533,
0 x0534,
0 x0535,
0 x0536,
0 x0537,
0 x0538,
0 x0539,
0 x053a,
0 x053b,
0 x053c,
0 x053d,
0 x053e,
0 x053f,
0 x0540,
0 x0541,
0 x0542,
0 x0543,
0 x0544,
0 x0545,
0 x0546,
0 x0547,
0 x0548,
0 x0549,
0 x054a,
0 x054b,
0 x054c,
0 x054d,
0 x054e,
0 x054f,
0 x0550,
0 x0551,
0 x0552,
0 x0553,
0 x0554,
0 x0555,
0 x0556,
0 xffff,
0 x17f6,
0 x2c63,
0 x1d7e,
0 x1d7f,
0 x1d80,
0 x1d81,
0 x1d82,
0 x1d83,
0 x1d84,
0 x1d85,
0 x1d86,
0 x1d87,
0 x1d88,
0 x1d89,
0 x1d8a,
0 x1d8b,
0 x1d8c,
0 x1d8d,
0 x1d8e,
0 x1d8f,
0 x1d90,
0 x1d91,
0 x1d92,
0 x1d93,
0 x1d94,
0 x1d95,
0 x1d96,
0 x1d97,
0 x1d98,
0 x1d99,
0 x1d9a,
0 x1d9b,
0 x1d9c,
0 x1d9d,
0 x1d9e,
0 x1d9f,
0 x1da0,
0 x1da1,
0 x1da2,
0 x1da3,
0 x1da4,
0 x1da5,
0 x1da6,
0 x1da7,
0 x1da8,
0 x1da9,
0 x1daa,
0 x1dab,
0 x1dac,
0 x1dad,
0 x1dae,
0 x1daf,
0 x1db0,
0 x1db1,
0 x1db2,
0 x1db3,
0 x1db4,
0 x1db5,
0 x1db6,
0 x1db7,
0 x1db8,
0 x1db9,
0 x1dba,
0 x1dbb,
0 x1dbc,
0 x1dbd,
0 x1dbe,
0 x1dbf,
0 x1dc0,
0 x1dc1,
0 x1dc2,
0 x1dc3,
0 x1dc4,
0 x1dc5,
0 x1dc6,
0 x1dc7,
0 x1dc8,
0 x1dc9,
0 x1dca,
0 x1dcb,
0 x1dcc,
0 x1dcd,
0 x1dce,
0 x1dcf,
0 x1dd0,
0 x1dd1,
0 x1dd2,
0 x1dd3,
0 x1dd4,
0 x1dd5,
0 x1dd6,
0 x1dd7,
0 x1dd8,
0 x1dd9,
0 x1dda,
0 x1ddb,
0 x1ddc,
0 x1ddd,
0 x1dde,
0 x1ddf,
0 x1de0,
0 x1de1,
0 x1de2,
0 x1de3,
0 x1de4,
0 x1de5,
0 x1de6,
0 x1de7,
0 x1de8,
0 x1de9,
0 x1dea,
0 x1deb,
0 x1dec,
0 x1ded,
0 x1dee,
0 x1def,
0 x1df0,
0 x1df1,
0 x1df2,
0 x1df3,
0 x1df4,
0 x1df5,
0 x1df6,
0 x1df7,
0 x1df8,
0 x1df9,
0 x1dfa,
0 x1dfb,
0 x1dfc,
0 x1dfd,
0 x1dfe,
0 x1dff,
0 x1e00,
0 x1e00,
0 x1e02,
0 x1e02,
0 x1e04,
0 x1e04,
0 x1e06,
0 x1e06,
0 x1e08,
0 x1e08,
0 x1e0a,
0 x1e0a,
0 x1e0c,
0 x1e0c,
0 x1e0e,
0 x1e0e,
0 x1e10,
0 x1e10,
0 x1e12,
0 x1e12,
0 x1e14,
0 x1e14,
0 x1e16,
0 x1e16,
0 x1e18,
0 x1e18,
0 x1e1a,
0 x1e1a,
0 x1e1c,
0 x1e1c,
0 x1e1e,
0 x1e1e,
0 x1e20,
0 x1e20,
0 x1e22,
0 x1e22,
0 x1e24,
0 x1e24,
0 x1e26,
0 x1e26,
0 x1e28,
0 x1e28,
0 x1e2a,
0 x1e2a,
0 x1e2c,
0 x1e2c,
0 x1e2e,
0 x1e2e,
0 x1e30,
0 x1e30,
0 x1e32,
0 x1e32,
0 x1e34,
0 x1e34,
0 x1e36,
0 x1e36,
0 x1e38,
0 x1e38,
0 x1e3a,
0 x1e3a,
0 x1e3c,
0 x1e3c,
0 x1e3e,
0 x1e3e,
0 x1e40,
0 x1e40,
0 x1e42,
0 x1e42,
0 x1e44,
0 x1e44,
0 x1e46,
0 x1e46,
0 x1e48,
0 x1e48,
0 x1e4a,
0 x1e4a,
0 x1e4c,
0 x1e4c,
0 x1e4e,
0 x1e4e,
0 x1e50,
0 x1e50,
0 x1e52,
0 x1e52,
0 x1e54,
0 x1e54,
0 x1e56,
0 x1e56,
0 x1e58,
0 x1e58,
0 x1e5a,
0 x1e5a,
0 x1e5c,
0 x1e5c,
0 x1e5e,
0 x1e5e,
0 x1e60,
0 x1e60,
0 x1e62,
0 x1e62,
0 x1e64,
0 x1e64,
0 x1e66,
0 x1e66,
0 x1e68,
0 x1e68,
0 x1e6a,
0 x1e6a,
0 x1e6c,
0 x1e6c,
0 x1e6e,
0 x1e6e,
0 x1e70,
0 x1e70,
0 x1e72,
0 x1e72,
0 x1e74,
0 x1e74,
0 x1e76,
0 x1e76,
0 x1e78,
0 x1e78,
0 x1e7a,
0 x1e7a,
0 x1e7c,
0 x1e7c,
0 x1e7e,
0 x1e7e,
0 x1e80,
0 x1e80,
0 x1e82,
0 x1e82,
0 x1e84,
0 x1e84,
0 x1e86,
0 x1e86,
0 x1e88,
0 x1e88,
0 x1e8a,
0 x1e8a,
0 x1e8c,
0 x1e8c,
0 x1e8e,
0 x1e8e,
0 x1e90,
0 x1e90,
0 x1e92,
0 x1e92,
0 x1e94,
0 x1e94,
0 x1e96,
0 x1e97,
0 x1e98,
0 x1e99,
0 x1e9a,
0 x1e9b,
0 x1e9c,
0 x1e9d,
0 x1e9e,
0 x1e9f,
0 x1ea0,
0 x1ea0,
0 x1ea2,
0 x1ea2,
0 x1ea4,
0 x1ea4,
0 x1ea6,
0 x1ea6,
0 x1ea8,
0 x1ea8,
0 x1eaa,
0 x1eaa,
0 x1eac,
0 x1eac,
0 x1eae,
0 x1eae,
0 x1eb0,
0 x1eb0,
0 x1eb2,
0 x1eb2,
0 x1eb4,
0 x1eb4,
0 x1eb6,
0 x1eb6,
0 x1eb8,
0 x1eb8,
0 x1eba,
0 x1eba,
0 x1ebc,
0 x1ebc,
0 x1ebe,
0 x1ebe,
0 x1ec0,
0 x1ec0,
0 x1ec2,
0 x1ec2,
0 x1ec4,
0 x1ec4,
0 x1ec6,
0 x1ec6,
0 x1ec8,
0 x1ec8,
0 x1eca,
0 x1eca,
0 x1ecc,
0 x1ecc,
0 x1ece,
0 x1ece,
0 x1ed0,
0 x1ed0,
0 x1ed2,
0 x1ed2,
0 x1ed4,
0 x1ed4,
0 x1ed6,
0 x1ed6,
0 x1ed8,
0 x1ed8,
0 x1eda,
0 x1eda,
0 x1edc,
0 x1edc,
0 x1ede,
0 x1ede,
0 x1ee0,
0 x1ee0,
0 x1ee2,
0 x1ee2,
0 x1ee4,
0 x1ee4,
0 x1ee6,
0 x1ee6,
0 x1ee8,
0 x1ee8,
0 x1eea,
0 x1eea,
0 x1eec,
0 x1eec,
0 x1eee,
0 x1eee,
0 x1ef0,
0 x1ef0,
0 x1ef2,
0 x1ef2,
0 x1ef4,
0 x1ef4,
0 x1ef6,
0 x1ef6,
0 x1ef8,
0 x1ef8,
0 x1efa,
0 x1efb,
0 x1efc,
0 x1efd,
0 x1efe,
0 x1eff,
0 x1f08,
0 x1f09,
0 x1f0a,
0 x1f0b,
0 x1f0c,
0 x1f0d,
0 x1f0e,
0 x1f0f,
0 x1f08,
0 x1f09,
0 x1f0a,
0 x1f0b,
0 x1f0c,
0 x1f0d,
0 x1f0e,
0 x1f0f,
0 x1f18,
0 x1f19,
0 x1f1a,
0 x1f1b,
0 x1f1c,
0 x1f1d,
0 x1f16,
0 x1f17,
0 x1f18,
0 x1f19,
0 x1f1a,
0 x1f1b,
0 x1f1c,
0 x1f1d,
0 x1f1e,
0 x1f1f,
0 x1f28,
0 x1f29,
0 x1f2a,
0 x1f2b,
0 x1f2c,
0 x1f2d,
0 x1f2e,
0 x1f2f,
0 x1f28,
0 x1f29,
0 x1f2a,
0 x1f2b,
0 x1f2c,
0 x1f2d,
0 x1f2e,
0 x1f2f,
0 x1f38,
0 x1f39,
0 x1f3a,
0 x1f3b,
0 x1f3c,
0 x1f3d,
0 x1f3e,
0 x1f3f,
0 x1f38,
0 x1f39,
0 x1f3a,
0 x1f3b,
0 x1f3c,
0 x1f3d,
0 x1f3e,
0 x1f3f,
0 x1f48,
0 x1f49,
0 x1f4a,
0 x1f4b,
0 x1f4c,
0 x1f4d,
0 x1f46,
0 x1f47,
0 x1f48,
0 x1f49,
0 x1f4a,
0 x1f4b,
0 x1f4c,
0 x1f4d,
0 x1f4e,
0 x1f4f,
0 x1f50,
0 x1f59,
0 x1f52,
0 x1f5b,
0 x1f54,
0 x1f5d,
0 x1f56,
0 x1f5f,
0 x1f58,
0 x1f59,
0 x1f5a,
0 x1f5b,
0 x1f5c,
0 x1f5d,
0 x1f5e,
0 x1f5f,
0 x1f68,
0 x1f69,
0 x1f6a,
0 x1f6b,
0 x1f6c,
0 x1f6d,
0 x1f6e,
0 x1f6f,
0 x1f68,
0 x1f69,
0 x1f6a,
0 x1f6b,
0 x1f6c,
0 x1f6d,
0 x1f6e,
0 x1f6f,
0 x1fba,
0 x1fbb,
0 x1fc8,
0 x1fc9,
0 x1fca,
0 x1fcb,
0 x1fda,
0 x1fdb,
0 x1ff8,
0 x1ff9,
0 x1fea,
0 x1feb,
0 x1ffa,
0 x1ffb,
0 x1f7e,
0 x1f7f,
0 x1f88,
0 x1f89,
0 x1f8a,
0 x1f8b,
0 x1f8c,
0 x1f8d,
0 x1f8e,
0 x1f8f,
0 x1f88,
0 x1f89,
0 x1f8a,
0 x1f8b,
0 x1f8c,
0 x1f8d,
0 x1f8e,
0 x1f8f,
0 x1f98,
0 x1f99,
0 x1f9a,
0 x1f9b,
0 x1f9c,
0 x1f9d,
0 x1f9e,
0 x1f9f,
0 x1f98,
0 x1f99,
0 x1f9a,
0 x1f9b,
0 x1f9c,
0 x1f9d,
0 x1f9e,
0 x1f9f,
0 x1fa8,
0 x1fa9,
0 x1faa,
0 x1fab,
0 x1fac,
0 x1fad,
0 x1fae,
0 x1faf,
0 x1fa8,
0 x1fa9,
0 x1faa,
0 x1fab,
0 x1fac,
0 x1fad,
0 x1fae,
0 x1faf,
0 x1fb8,
0 x1fb9,
0 x1fb2,
0 x1fbc,
0 x1fb4,
0 x1fb5,
0 x1fb6,
0 x1fb7,
0 x1fb8,
0 x1fb9,
0 x1fba,
0 x1fbb,
0 x1fbc,
0 x1fbd,
0 x1fbe,
0 x1fbf,
0 x1fc0,
0 x1fc1,
0 x1fc2,
0 x1fc3,
0 x1fc4,
0 x1fc5,
0 x1fc6,
0 x1fc7,
0 x1fc8,
0 x1fc9,
0 x1fca,
0 x1fcb,
0 x1fc3,
0 x1fcd,
0 x1fce,
0 x1fcf,
0 x1fd8,
0 x1fd9,
0 x1fd2,
0 x1fd3,
0 x1fd4,
0 x1fd5,
0 x1fd6,
0 x1fd7,
0 x1fd8,
0 x1fd9,
0 x1fda,
0 x1fdb,
0 x1fdc,
0 x1fdd,
0 x1fde,
0 x1fdf,
0 x1fe8,
0 x1fe9,
0 x1fe2,
0 x1fe3,
0 x1fe4,
0 x1fec,
0 x1fe6,
0 x1fe7,
0 x1fe8,
0 x1fe9,
0 x1fea,
0 x1feb,
0 x1fec,
0 x1fed,
0 x1fee,
0 x1fef,
0 x1ff0,
0 x1ff1,
0 x1ff2,
0 x1ff3,
0 x1ff4,
0 x1ff5,
0 x1ff6,
0 x1ff7,
0 x1ff8,
0 x1ff9,
0 x1ffa,
0 x1ffb,
0 x1ff3,
0 x1ffd,
0 x1ffe,
0 x1fff,
0 x2000,
0 x2001,
0 x2002,
0 x2003,
0 x2004,
0 x2005,
0 x2006,
0 x2007,
0 x2008,
0 x2009,
0 x200a,
0 x200b,
0 x200c,
0 x200d,
0 x200e,
0 x200f,
0 x2010,
0 x2011,
0 x2012,
0 x2013,
0 x2014,
0 x2015,
0 x2016,
0 x2017,
0 x2018,
0 x2019,
0 x201a,
0 x201b,
0 x201c,
0 x201d,
0 x201e,
0 x201f,
0 x2020,
0 x2021,
0 x2022,
0 x2023,
0 x2024,
0 x2025,
0 x2026,
0 x2027,
0 x2028,
0 x2029,
0 x202a,
0 x202b,
0 x202c,
0 x202d,
0 x202e,
0 x202f,
0 x2030,
0 x2031,
0 x2032,
0 x2033,
0 x2034,
0 x2035,
0 x2036,
0 x2037,
0 x2038,
0 x2039,
0 x203a,
0 x203b,
0 x203c,
0 x203d,
0 x203e,
0 x203f,
0 x2040,
0 x2041,
0 x2042,
0 x2043,
0 x2044,
0 x2045,
0 x2046,
0 x2047,
0 x2048,
0 x2049,
0 x204a,
0 x204b,
0 x204c,
0 x204d,
0 x204e,
0 x204f,
0 x2050,
0 x2051,
0 x2052,
0 x2053,
0 x2054,
0 x2055,
0 x2056,
0 x2057,
0 x2058,
0 x2059,
0 x205a,
0 x205b,
0 x205c,
0 x205d,
0 x205e,
0 x205f,
0 x2060,
0 x2061,
0 x2062,
0 x2063,
0 x2064,
0 x2065,
0 x2066,
0 x2067,
0 x2068,
0 x2069,
0 x206a,
0 x206b,
0 x206c,
0 x206d,
0 x206e,
0 x206f,
0 x2070,
0 x2071,
0 x2072,
0 x2073,
0 x2074,
0 x2075,
0 x2076,
0 x2077,
0 x2078,
0 x2079,
0 x207a,
0 x207b,
0 x207c,
0 x207d,
0 x207e,
0 x207f,
0 x2080,
0 x2081,
0 x2082,
0 x2083,
0 x2084,
0 x2085,
0 x2086,
0 x2087,
0 x2088,
0 x2089,
0 x208a,
0 x208b,
0 x208c,
0 x208d,
0 x208e,
0 x208f,
0 x2090,
0 x2091,
0 x2092,
0 x2093,
0 x2094,
0 x2095,
0 x2096,
0 x2097,
0 x2098,
0 x2099,
0 x209a,
0 x209b,
0 x209c,
0 x209d,
0 x209e,
0 x209f,
0 x20a0,
0 x20a1,
0 x20a2,
0 x20a3,
0 x20a4,
0 x20a5,
0 x20a6,
0 x20a7,
0 x20a8,
0 x20a9,
0 x20aa,
0 x20ab,
0 x20ac,
0 x20ad,
0 x20ae,
0 x20af,
0 x20b0,
0 x20b1,
0 x20b2,
0 x20b3,
0 x20b4,
0 x20b5,
0 x20b6,
0 x20b7,
0 x20b8,
0 x20b9,
0 x20ba,
0 x20bb,
0 x20bc,
0 x20bd,
0 x20be,
0 x20bf,
0 x20c0,
0 x20c1,
0 x20c2,
0 x20c3,
0 x20c4,
0 x20c5,
0 x20c6,
0 x20c7,
0 x20c8,
0 x20c9,
0 x20ca,
0 x20cb,
0 x20cc,
0 x20cd,
0 x20ce,
0 x20cf,
0 x20d0,
0 x20d1,
0 x20d2,
0 x20d3,
0 x20d4,
0 x20d5,
0 x20d6,
0 x20d7,
0 x20d8,
0 x20d9,
0 x20da,
0 x20db,
0 x20dc,
0 x20dd,
0 x20de,
0 x20df,
0 x20e0,
0 x20e1,
0 x20e2,
0 x20e3,
0 x20e4,
0 x20e5,
0 x20e6,
0 x20e7,
0 x20e8,
0 x20e9,
0 x20ea,
0 x20eb,
0 x20ec,
0 x20ed,
0 x20ee,
0 x20ef,
0 x20f0,
0 x20f1,
0 x20f2,
0 x20f3,
0 x20f4,
0 x20f5,
0 x20f6,
0 x20f7,
0 x20f8,
0 x20f9,
0 x20fa,
0 x20fb,
0 x20fc,
0 x20fd,
0 x20fe,
0 x20ff,
0 x2100,
0 x2101,
0 x2102,
0 x2103,
0 x2104,
0 x2105,
0 x2106,
0 x2107,
0 x2108,
0 x2109,
0 x210a,
0 x210b,
0 x210c,
0 x210d,
0 x210e,
0 x210f,
0 x2110,
0 x2111,
0 x2112,
0 x2113,
0 x2114,
0 x2115,
0 x2116,
0 x2117,
0 x2118,
0 x2119,
0 x211a,
0 x211b,
0 x211c,
0 x211d,
0 x211e,
0 x211f,
0 x2120,
0 x2121,
0 x2122,
0 x2123,
0 x2124,
0 x2125,
0 x2126,
0 x2127,
0 x2128,
0 x2129,
0 x212a,
0 x212b,
0 x212c,
0 x212d,
0 x212e,
0 x212f,
0 x2130,
0 x2131,
0 x2132,
0 x2133,
0 x2134,
0 x2135,
0 x2136,
0 x2137,
0 x2138,
0 x2139,
0 x213a,
0 x213b,
0 x213c,
0 x213d,
0 x213e,
0 x213f,
0 x2140,
0 x2141,
0 x2142,
0 x2143,
0 x2144,
0 x2145,
0 x2146,
0 x2147,
0 x2148,
0 x2149,
0 x214a,
0 x214b,
0 x214c,
0 x214d,
0 x2132,
0 x214f,
0 x2150,
0 x2151,
0 x2152,
0 x2153,
0 x2154,
0 x2155,
0 x2156,
0 x2157,
0 x2158,
0 x2159,
0 x215a,
0 x215b,
0 x215c,
0 x215d,
0 x215e,
0 x215f,
0 x2160,
0 x2161,
0 x2162,
0 x2163,
0 x2164,
0 x2165,
0 x2166,
0 x2167,
0 x2168,
0 x2169,
0 x216a,
0 x216b,
0 x216c,
0 x216d,
0 x216e,
0 x216f,
0 x2160,
0 x2161,
0 x2162,
0 x2163,
0 x2164,
0 x2165,
0 x2166,
0 x2167,
0 x2168,
0 x2169,
0 x216a,
0 x216b,
0 x216c,
0 x216d,
0 x216e,
0 x216f,
0 x2180,
0 x2181,
0 x2182,
0 x2183,
0 x2183,
0 xffff,
0 x034b,
0 x24b6,
0 x24b7,
0 x24b8,
0 x24b9,
0 x24ba,
0 x24bb,
0 x24bc,
0 x24bd,
0 x24be,
0 x24bf,
0 x24c0,
0 x24c1,
0 x24c2,
0 x24c3,
0 x24c4,
0 x24c5,
0 x24c6,
0 x24c7,
0 x24c8,
0 x24c9,
0 x24ca,
0 x24cb,
0 x24cc,
0 x24cd,
0 x24ce,
0 x24cf,
0 xffff,
0 x0746,
0 x2c00,
0 x2c01,
0 x2c02,
0 x2c03,
0 x2c04,
0 x2c05,
0 x2c06,
0 x2c07,
0 x2c08,
0 x2c09,
0 x2c0a,
0 x2c0b,
0 x2c0c,
0 x2c0d,
0 x2c0e,
0 x2c0f,
0 x2c10,
0 x2c11,
0 x2c12,
0 x2c13,
0 x2c14,
0 x2c15,
0 x2c16,
0 x2c17,
0 x2c18,
0 x2c19,
0 x2c1a,
0 x2c1b,
0 x2c1c,
0 x2c1d,
0 x2c1e,
0 x2c1f,
0 x2c20,
0 x2c21,
0 x2c22,
0 x2c23,
0 x2c24,
0 x2c25,
0 x2c26,
0 x2c27,
0 x2c28,
0 x2c29,
0 x2c2a,
0 x2c2b,
0 x2c2c,
0 x2c2d,
0 x2c2e,
0 x2c5f,
0 x2c60,
0 x2c60,
0 x2c62,
0 x2c63,
0 x2c64,
0 x2c65,
0 x2c66,
0 x2c67,
0 x2c67,
0 x2c69,
0 x2c69,
0 x2c6b,
0 x2c6b,
0 x2c6d,
0 x2c6e,
0 x2c6f,
0 x2c70,
0 x2c71,
0 x2c72,
0 x2c73,
0 x2c74,
0 x2c75,
0 x2c75,
0 x2c77,
0 x2c78,
0 x2c79,
0 x2c7a,
0 x2c7b,
0 x2c7c,
0 x2c7d,
0 x2c7e,
0 x2c7f,
0 x2c80,
0 x2c80,
0 x2c82,
0 x2c82,
0 x2c84,
0 x2c84,
0 x2c86,
0 x2c86,
0 x2c88,
0 x2c88,
0 x2c8a,
0 x2c8a,
0 x2c8c,
0 x2c8c,
0 x2c8e,
0 x2c8e,
0 x2c90,
0 x2c90,
0 x2c92,
0 x2c92,
0 x2c94,
0 x2c94,
0 x2c96,
0 x2c96,
0 x2c98,
0 x2c98,
0 x2c9a,
0 x2c9a,
0 x2c9c,
0 x2c9c,
0 x2c9e,
0 x2c9e,
0 x2ca0,
0 x2ca0,
0 x2ca2,
0 x2ca2,
0 x2ca4,
0 x2ca4,
0 x2ca6,
0 x2ca6,
0 x2ca8,
0 x2ca8,
0 x2caa,
0 x2caa,
0 x2cac,
0 x2cac,
0 x2cae,
0 x2cae,
0 x2cb0,
0 x2cb0,
0 x2cb2,
0 x2cb2,
0 x2cb4,
0 x2cb4,
0 x2cb6,
0 x2cb6,
0 x2cb8,
0 x2cb8,
0 x2cba,
0 x2cba,
0 x2cbc,
0 x2cbc,
0 x2cbe,
0 x2cbe,
0 x2cc0,
0 x2cc0,
0 x2cc2,
0 x2cc2,
0 x2cc4,
0 x2cc4,
0 x2cc6,
0 x2cc6,
0 x2cc8,
0 x2cc8,
0 x2cca,
0 x2cca,
0 x2ccc,
0 x2ccc,
0 x2cce,
0 x2cce,
0 x2cd0,
0 x2cd0,
0 x2cd2,
0 x2cd2,
0 x2cd4,
0 x2cd4,
0 x2cd6,
0 x2cd6,
0 x2cd8,
0 x2cd8,
0 x2cda,
0 x2cda,
0 x2cdc,
0 x2cdc,
0 x2cde,
0 x2cde,
0 x2ce0,
0 x2ce0,
0 x2ce2,
0 x2ce2,
0 x2ce4,
0 x2ce5,
0 x2ce6,
0 x2ce7,
0 x2ce8,
0 x2ce9,
0 x2cea,
0 x2ceb,
0 x2cec,
0 x2ced,
0 x2cee,
0 x2cef,
0 x2cf0,
0 x2cf1,
0 x2cf2,
0 x2cf3,
0 x2cf4,
0 x2cf5,
0 x2cf6,
0 x2cf7,
0 x2cf8,
0 x2cf9,
0 x2cfa,
0 x2cfb,
0 x2cfc,
0 x2cfd,
0 x2cfe,
0 x2cff,
0 x10a0,
0 x10a1,
0 x10a2,
0 x10a3,
0 x10a4,
0 x10a5,
0 x10a6,
0 x10a7,
0 x10a8,
0 x10a9,
0 x10aa,
0 x10ab,
0 x10ac,
0 x10ad,
0 x10ae,
0 x10af,
0 x10b0,
0 x10b1,
0 x10b2,
0 x10b3,
0 x10b4,
0 x10b5,
0 x10b6,
0 x10b7,
0 x10b8,
0 x10b9,
0 x10ba,
0 x10bb,
0 x10bc,
0 x10bd,
0 x10be,
0 x10bf,
0 x10c0,
0 x10c1,
0 x10c2,
0 x10c3,
0 x10c4,
0 x10c5,
0 xffff,
0 xd21b,
0 xff21,
0 xff22,
0 xff23,
0 xff24,
0 xff25,
0 xff26,
0 xff27,
0 xff28,
0 xff29,
0 xff2a,
0 xff2b,
0 xff2c,
0 xff2d,
0 xff2e,
0 xff2f,
0 xff30,
0 xff31,
0 xff32,
0 xff33,
0 xff34,
0 xff35,
0 xff36,
0 xff37,
0 xff38,
0 xff39,
0 xff3a,
0 xff5b,
0 xff5c,
0 xff5d,
0 xff5e,
0 xff5f,
0 xff60,
0 xff61,
0 xff62,
0 xff63,
0 xff64,
0 xff65,
0 xff66,
0 xff67,
0 xff68,
0 xff69,
0 xff6a,
0 xff6b,
0 xff6c,
0 xff6d,
0 xff6e,
0 xff6f,
0 xff70,
0 xff71,
0 xff72,
0 xff73,
0 xff74,
0 xff75,
0 xff76,
0 xff77,
0 xff78,
0 xff79,
0 xff7a,
0 xff7b,
0 xff7c,
0 xff7d,
0 xff7e,
0 xff7f,
0 xff80,
0 xff81,
0 xff82,
0 xff83,
0 xff84,
0 xff85,
0 xff86,
0 xff87,
0 xff88,
0 xff89,
0 xff8a,
0 xff8b,
0 xff8c,
0 xff8d,
0 xff8e,
0 xff8f,
0 xff90,
0 xff91,
0 xff92,
0 xff93,
0 xff94,
0 xff95,
0 xff96,
0 xff97,
0 xff98,
0 xff99,
0 xff9a,
0 xff9b,
0 xff9c,
0 xff9d,
0 xff9e,
0 xff9f,
0 xffa0,
0 xffa1,
0 xffa2,
0 xffa3,
0 xffa4,
0 xffa5,
0 xffa6,
0 xffa7,
0 xffa8,
0 xffa9,
0 xffaa,
0 xffab,
0 xffac,
0 xffad,
0 xffae,
0 xffaf,
0 xffb0,
0 xffb1,
0 xffb2,
0 xffb3,
0 xffb4,
0 xffb5,
0 xffb6,
0 xffb7,
0 xffb8,
0 xffb9,
0 xffba,
0 xffbb,
0 xffbc,
0 xffbd,
0 xffbe,
0 xffbf,
0 xffc0,
0 xffc1,
0 xffc2,
0 xffc3,
0 xffc4,
0 xffc5,
0 xffc6,
0 xffc7,
0 xffc8,
0 xffc9,
0 xffca,
0 xffcb,
0 xffcc,
0 xffcd,
0 xffce,
0 xffcf,
0 xffd0,
0 xffd1,
0 xffd2,
0 xffd3,
0 xffd4,
0 xffd5,
0 xffd6,
0 xffd7,
0 xffd8,
0 xffd9,
0 xffda,
0 xffdb,
0 xffdc,
0 xffdd,
0 xffde,
0 xffdf,
0 xffe0,
0 xffe1,
0 xffe2,
0 xffe3,
0 xffe4,
0 xffe5,
0 xffe6,
0 xffe7,
0 xffe8,
0 xffe9,
0 xffea,
0 xffeb,
0 xffec,
0 xffed,
0 xffee,
0 xffef,
0 xfff0,
0 xfff1,
0 xfff2,
0 xfff3,
0 xfff4,
0 xfff5,
0 xfff6,
0 xfff7,
0 xfff8,
0 xfff9,
0 xfffa,
0 xfffb,
0 xfffc,
0 xfffd,
0 xfffe,
0 xffff,
};
/*
* Allow full-width illegal characters :
* "MS windows 7" supports full-width-invalid-name-characters.
* So we should check half-width-invalid-name-characters(ASCII) only
* for compatibility.
*
* " * / : < > ? \ |
*/
static unsigned short bad_uni_chars[] = {
0 x0022,
0 x002A,
0 x002F,
0 x003A,
0 x003C,
0 x003E,
0 x003F,
0 x005C,
0 x007C,
0
};
static int exfat_convert_char_to_ucs2(
struct nls_table *nls,
const unsigned char *ch,
int ch_len,
unsigned short *ucs2,
int *lossy)
{
int len;
*ucs2 =
0 x0;
if (ch[
0 ] <
0 x80) {
*ucs2 = ch[
0 ];
return 1 ;
}
len = nls->char2uni(ch, ch_len, ucs2);
if (len <
0 ) {
/* conversion failed */
if (lossy != NULL)
*lossy |= NLS_NAME_LOSSY;
*ucs2 =
'_' ;
return 1 ;
}
return len;
}
static int exfat_convert_ucs2_to_char(
struct nls_table *nls,
unsigned short ucs2,
unsigned char *ch,
int *lossy)
{
int len;
ch[
0 ] =
0 x0;
if (ucs2 <
0 x0080) {
ch[
0 ] = ucs2;
return 1 ;
}
len = nls->uni2char(ucs2, ch, MAX_CHARSET_SIZE);
if (len <
0 ) {
/* conversion failed */
if (lossy != NULL)
*lossy |= NLS_NAME_LOSSY;
ch[
0 ] =
'_' ;
return 1 ;
}
return len;
}
unsigned short exfat_toupper(
struct super_block *sb,
unsigned short a)
{
struct exfat_sb_info *sbi = EXFAT_SB(sb);
return sbi->vol_utbl[a] ? sbi->vol_utbl[a] : a;
}
static unsigned short *exfat_wstrchr(
unsigned short *str,
unsigned short wchar)
{
while (*str) {
if (*(str++) == wchar)
return str;
}
return NULL;
}
int exfat_uniname_ncmp(
struct super_block *sb,
unsigned short *a,
unsigned short *b,
unsigned int len)
{
int i;
for (i =
0 ; i < len; i++, a++, b++)
if (exfat_toupper(sb, *a) != exfat_toupper(sb, *b))
return 1 ;
return 0 ;
}
static int exfat_utf16_to_utf8(
struct super_block *sb,
struct exfat_uni_name *p_uniname,
unsigned char *p_cstring,
int buflen)
{
int len;
const unsigned short *uniname = p_uniname->name;
/* always len >= 0 */
len = utf16s_to_utf8s(uniname, MAX_NAME_LENGTH, UTF16_HOST_ENDIAN,
p_cstring, buflen);
p_cstring[len] =
'\0' ;
return len;
}
static int exfat_utf8_to_utf16(
struct super_block *sb,
const unsigned char *p_cstring,
const int len,
struct exfat_uni_name *p_uniname,
int *p_lossy)
{
int i, unilen, lossy = NLS_NAME_NO_LOSSY;
__le16 upname[MAX_NAME_LENGTH +
1 ];
unsigned short *uniname = p_uniname->name;
WARN_ON(!len);
unilen = utf8s_to_utf16s(p_cstring, len, UTF16_HOST_ENDIAN,
(
wchar_t *)uniname, MAX_NAME_LENGTH +
2 );
if (unilen <
0 ) {
exfat_err(sb,
"failed to %s (err : %d) nls len : %d" ,
__func__, unilen, len);
return unilen;
}
if (unilen > MAX_NAME_LENGTH) {
exfat_debug(sb,
"failed to %s (estr:ENAMETOOLONG) nls len : %d, unilen : %d > %d" ,
__func__, len, unilen, MAX_NAME_LENGTH);
return -ENAMETOOLONG;
}
for (i =
0 ; i < unilen; i++) {
if (*uniname <
0 x0020 ||
exfat_wstrchr(bad_uni_chars, *uniname))
lossy |= NLS_NAME_LOSSY;
upname[i] = cpu_to_le16(exfat_toupper(sb, *uniname));
uniname++;
}
*uniname =
'\0' ;
p_uniname->name_len = unilen;
p_uniname->name_hash = exfat_calc_chksum16(upname, unilen <<
1 ,
0 ,
CS_DEFAULT);
if (p_lossy)
*p_lossy = lossy;
return unilen;
}
#define SURROGATE_MASK
0 xfffff800
#define SURROGATE_PAIR
0 x0000d800
#define SURROGATE_LOW
0 x00000400
static int __exfat_utf16_to_nls(
struct super_block *sb,
struct exfat_uni_name *p_uniname,
unsigned char *p_cstring,
int buflen)
{
int i, j, len, out_len =
0 ;
unsigned char buf[MAX_CHARSET_SIZE];
const unsigned short *uniname = p_uniname->name;
struct nls_table *nls = EXFAT_SB(sb)->nls_io;
i =
0 ;
while (i < MAX_NAME_LENGTH && out_len < (buflen -
1 )) {
if (*uniname ==
'\0' )
break ;
if ((*uniname & SURROGATE_MASK) != SURROGATE_PAIR) {
len = exfat_convert_ucs2_to_char(nls, *uniname, buf,
NULL);
}
else {
/* Process UTF-16 surrogate pair as one character */
if (!(*uniname & SURROGATE_LOW) &&
i+
1 < MAX_NAME_LENGTH &&
(*(uniname+
1 ) & SURROGATE_MASK) == SURROGATE_PAIR &&
(*(uniname+
1 ) & SURROGATE_LOW)) {
uniname++;
i++;
}
/*
* UTF-16 surrogate pair encodes code points above
* U+FFFF. Code points above U+FFFF are not supported
* by kernel NLS framework therefore use replacement
* character
*/
len =
1 ;
buf[
0 ] =
'_' ;
}
if (out_len + len >= buflen)
len = buflen -
1 - out_len;
out_len += len;
if (len >
1 ) {
for (j =
0 ; j < len; j++)
*p_cstring++ = buf[j];
}
else {
/* len == 1 */
*p_cstring++ = *buf;
}
uniname++;
i++;
}
*p_cstring =
'\0' ;
return out_len;
}
static int exfat_nls_to_ucs2(
struct super_block *sb,
const unsigned char *p_cstring,
const int len,
struct exfat_uni_name *p_uniname,
int *p_lossy)
{
int i =
0 , unilen =
0 , lossy = NLS_NAME_NO_LOSSY;
__le16 upname[MAX_NAME_LENGTH +
1 ];
unsigned short *uniname = p_uniname->name;
struct nls_table *nls = EXFAT_SB(sb)->nls_io;
WARN_ON(!len);
while (unilen < MAX_NAME_LENGTH && i < len) {
i += exfat_convert_char_to_ucs2(nls, p_cstring + i, len - i,
uniname, &lossy);
if (*uniname <
0 x0020 ||
exfat_wstrchr(bad_uni_chars, *uniname))
lossy |= NLS_NAME_LOSSY;
upname[unilen] = cpu_to_le16(exfat_toupper(sb, *uniname));
uniname++;
unilen++;
}
if (p_cstring[i] !=
'\0' )
lossy |= NLS_NAME_OVERLEN;
*uniname =
'\0' ;
p_uniname->name_len = unilen;
p_uniname->name_hash = exfat_calc_chksum16(upname, unilen <<
1 ,
0 ,
CS_DEFAULT);
if (p_lossy)
*p_lossy = lossy;
return unilen;
}
int exfat_utf16_to_nls(
struct super_block *sb,
struct exfat_uni_name *uniname,
unsigned char *p_cstring,
int buflen)
{
if (EXFAT_SB(sb)->options.utf8)
return exfat_utf16_to_utf8(sb, uniname, p_cstring,
buflen);
return __exfat_utf16_to_nls(sb, uniname, p_cstring, buflen);
}
int exfat_nls_to_utf16(
struct super_block *sb,
const unsigned char *p_cstring,
const int len,
struct exfat_uni_name *uniname,
int *p_lossy)
{
if (EXFAT_SB(sb)->options.utf8)
return exfat_utf8_to_utf16(sb, p_cstring, len,
uniname, p_lossy);
return exfat_nls_to_ucs2(sb, p_cstring, len, uniname, p_lossy);
}
static int exfat_load_upcase_table(
struct super_block *sb,
sector_t sector,
unsigned long long num_sectors,
unsigned int utbl_checksum)
{
struct exfat_sb_info *sbi = EXFAT_SB(sb);
unsigned int sect_size = sb->s_blocksize;
unsigned int i, index =
0 ;
u32 chksum =
0 ;
unsigned char skip =
false ;
unsigned short *upcase_table;
upcase_table = kvcalloc(UTBL_COUNT,
sizeof (
unsigned short ), GFP_KERNEL);
if (!upcase_table)
return -ENOMEM;
sbi->vol_utbl = upcase_table;
num_sectors += sector;
while (sector < num_sectors) {
struct buffer_head *bh;
bh = sb_bread(sb, sector);
if (!bh) {
exfat_err(sb,
"failed to read sector(0x%llx)" ,
(
unsigned long long )sector);
return -EIO;
}
sector++;
for (i =
0 ; i < sect_size && index <=
0 xFFFF; i +=
2 ) {
unsigned short uni = get_unaligned_le16(bh->b_data + i);
if (skip) {
index += uni;
skip =
false ;
}
else if (uni == index) {
index++;
}
else if (uni ==
0 xFFFF) {
skip =
true ;
}
else {
/* uni != index , uni != 0xFFFF */
upcase_table[index] = uni;
index++;
}
}
chksum = exfat_calc_chksum32(bh->b_data, i, chksum, CS_DEFAULT);
brelse(bh);
}
if (index >=
0 xFFFF && utbl_checksum == chksum)
return 0 ;
exfat_err(sb,
"failed to load upcase table (idx : 0x%08x, chksum : 0x%08x, utbl_chksum : 0x%08x)" ,
index, chksum, utbl_checksum);
return -EINVAL;
}
static int exfat_load_default_upcase_table(
struct super_block *sb)
{
int i;
struct exfat_sb_info *sbi = EXFAT_SB(sb);
unsigned char skip =
false ;
unsigned short uni =
0 , *upcase_table;
unsigned int index =
0 ;
upcase_table = kvcalloc(UTBL_COUNT,
sizeof (
unsigned short ), GFP_KERNEL);
if (!upcase_table)
return -ENOMEM;
sbi->vol_utbl = upcase_table;
for (i =
0 ; index <=
0 xFFFF && i < EXFAT_NUM_UPCASE; i++) {
uni = uni_def_upcase[i];
if (skip) {
index += uni;
skip =
false ;
}
else if (uni == index) {
index++;
}
else if (uni ==
0 xFFFF) {
skip =
true ;
}
else {
upcase_table[index] = uni;
index++;
}
}
if (index >=
0 xFFFF)
return 0 ;
/* FATAL error: default upcase table has error */
return -EIO;
}
int exfat_create_upcase_table(
struct super_block *sb)
{
int i, ret;
unsigned int tbl_clu, type;
sector_t sector;
unsigned long long tbl_size, num_sectors;
unsigned char blksize_bits = sb->s_blocksize_bits;
struct exfat_chain clu;
struct exfat_dentry *ep;
struct exfat_sb_info *sbi = EXFAT_SB(sb);
struct buffer_head *bh;
clu.dir = sbi->root_dir;
clu.flags = ALLOC_FAT_CHAIN;
while (clu.dir != EXFAT_EOF_CLUSTER) {
for (i =
0 ; i < sbi->dentries_per_clu; i++) {
ep = exfat_get_dentry(sb, &clu, i, &bh);
if (!ep)
return -EIO;
type = exfat_get_entry_type(ep);
if (type == TYPE_UNUSED) {
brelse(bh);
break ;
}
if (type != TYPE_UPCASE) {
brelse(bh);
continue ;
}
tbl_clu = le32_to_cpu(ep->dentry.upcase.start_clu);
tbl_size = le64_to_cpu(ep->dentry.upcase.size);
sector = exfat_cluster_to_sector(sbi, tbl_clu);
num_sectors = ((tbl_size -
1 ) >> blksize_bits) +
1 ;
ret = exfat_load_upcase_table(sb, sector, num_sectors,
le32_to_cpu(ep->dentry.upcase.checksum));
brelse(bh);
if (ret && ret != -EIO) {
/* free memory from exfat_load_upcase_table call */
exfat_free_upcase_table(sbi);
goto load_default;
}
/* load successfully */
return ret;
}
if (exfat_get_next_cluster(sb, &(clu.dir)))
return -EIO;
}
load_default:
/* load default upcase table */
return exfat_load_default_upcase_table(sb);
}
void exfat_free_upcase_table(
struct exfat_sb_info *sbi)
{
kvfree(sbi->vol_utbl);
sbi->vol_utbl = NULL;
}
Messung V0.5 in Prozent C=99 H=92 G=95
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet am 2026-06-05)
¤
*© Formatika GbR, Deutschland