// 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=98 H=92 G=94