unicode_utils 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ 0000c0000041000300xxxxxx0000c1000041000301xxxxxx0000c2000041000302xxxxxx0000c3000041000303xxxxxx0000c4000041000308xxxxxx0000c500004100030axxxxxx0000c7000043000327xxxxxx0000c8000045000300xxxxxx0000c9000045000301xxxxxx0000ca000045000302xxxxxx0000cb000045000308xxxxxx0000cc000049000300xxxxxx0000cd000049000301xxxxxx0000ce000049000302xxxxxx0000cf000049000308xxxxxx0000d100004e000303xxxxxx0000d200004f000300xxxxxx0000d300004f000301xxxxxx0000d400004f000302xxxxxx0000d500004f000303xxxxxx0000d600004f000308xxxxxx0000d9000055000300xxxxxx0000da000055000301xxxxxx0000db000055000302xxxxxx0000dc000055000308xxxxxx0000dd000059000301xxxxxx0000e0000061000300xxxxxx0000e1000061000301xxxxxx0000e2000061000302xxxxxx0000e3000061000303xxxxxx0000e4000061000308xxxxxx0000e500006100030axxxxxx0000e7000063000327xxxxxx0000e8000065000300xxxxxx0000e9000065000301xxxxxx0000ea000065000302xxxxxx0000eb000065000308xxxxxx0000ec000069000300xxxxxx0000ed000069000301xxxxxx0000ee000069000302xxxxxx0000ef000069000308xxxxxx0000f100006e000303xxxxxx0000f200006f000300xxxxxx0000f300006f000301xxxxxx0000f400006f000302xxxxxx0000f500006f000303xxxxxx0000f600006f000308xxxxxx0000f9000075000300xxxxxx0000fa000075000301xxxxxx0000fb000075000302xxxxxx0000fc000075000308xxxxxx0000fd000079000301xxxxxx0000ff000079000308xxxxxx000100000041000304xxxxxx000101000061000304xxxxxx000102000041000306xxxxxx000103000061000306xxxxxx000104000041000328xxxxxx000105000061000328xxxxxx000106000043000301xxxxxx000107000063000301xxxxxx000108000043000302xxxxxx000109000063000302xxxxxx00010a000043000307xxxxxx00010b000063000307xxxxxx00010c00004300030cxxxxxx00010d00006300030cxxxxxx00010e00004400030cxxxxxx00010f00006400030cxxxxxx000112000045000304xxxxxx000113000065000304xxxxxx000114000045000306xxxxxx000115000065000306xxxxxx000116000045000307xxxxxx000117000065000307xxxxxx000118000045000328xxxxxx000119000065000328xxxxxx00011a00004500030cxxxxxx00011b00006500030cxxxxxx00011c000047000302xxxxxx00011d000067000302xxxxxx00011e000047000306xxxxxx00011f000067000306xxxxxx000120000047000307xxxxxx000121000067000307xxxxxx000122000047000327xxxxxx000123000067000327xxxxxx000124000048000302xxxxxx000125000068000302xxxxxx000128000049000303xxxxxx000129000069000303xxxxxx00012a000049000304xxxxxx00012b000069000304xxxxxx00012c000049000306xxxxxx00012d000069000306xxxxxx00012e000049000328xxxxxx00012f000069000328xxxxxx000130000049000307xxxxxx00013400004a000302xxxxxx00013500006a000302xxxxxx00013600004b000327xxxxxx00013700006b000327xxxxxx00013900004c000301xxxxxx00013a00006c000301xxxxxx00013b00004c000327xxxxxx00013c00006c000327xxxxxx00013d00004c00030cxxxxxx00013e00006c00030cxxxxxx00014300004e000301xxxxxx00014400006e000301xxxxxx00014500004e000327xxxxxx00014600006e000327xxxxxx00014700004e00030cxxxxxx00014800006e00030cxxxxxx00014c00004f000304xxxxxx00014d00006f000304xxxxxx00014e00004f000306xxxxxx00014f00006f000306xxxxxx00015000004f00030bxxxxxx00015100006f00030bxxxxxx000154000052000301xxxxxx000155000072000301xxxxxx000156000052000327xxxxxx000157000072000327xxxxxx00015800005200030cxxxxxx00015900007200030cxxxxxx00015a000053000301xxxxxx00015b000073000301xxxxxx00015c000053000302xxxxxx00015d000073000302xxxxxx00015e000053000327xxxxxx00015f000073000327xxxxxx00016000005300030cxxxxxx00016100007300030cxxxxxx000162000054000327xxxxxx000163000074000327xxxxxx00016400005400030cxxxxxx00016500007400030cxxxxxx000168000055000303xxxxxx000169000075000303xxxxxx00016a000055000304xxxxxx00016b000075000304xxxxxx00016c000055000306xxxxxx00016d000075000306xxxxxx00016e00005500030axxxxxx00016f00007500030axxxxxx00017000005500030bxxxxxx00017100007500030bxxxxxx000172000055000328xxxxxx000173000075000328xxxxxx000174000057000302xxxxxx000175000077000302xxxxxx000176000059000302xxxxxx000177000079000302xxxxxx000178000059000308xxxxxx00017900005a000301xxxxxx00017a00007a000301xxxxxx00017b00005a000307xxxxxx00017c00007a000307xxxxxx00017d00005a00030cxxxxxx00017e00007a00030cxxxxxx0001a000004f00031bxxxxxx0001a100006f00031bxxxxxx0001af00005500031bxxxxxx0001b000007500031bxxxxxx0001cd00004100030cxxxxxx0001ce00006100030cxxxxxx0001cf00004900030cxxxxxx0001d000006900030cxxxxxx0001d100004f00030cxxxxxx0001d200006f00030cxxxxxx0001d300005500030cxxxxxx0001d400007500030cxxxxxx0001d50000dc000304xxxxxx0001d60000fc000304xxxxxx0001d70000dc000301xxxxxx0001d80000fc000301xxxxxx0001d90000dc00030cxxxxxx0001da0000fc00030cxxxxxx0001db0000dc000300xxxxxx0001dc0000fc000300xxxxxx0001de0000c4000304xxxxxx0001df0000e4000304xxxxxx0001e0000226000304xxxxxx0001e1000227000304xxxxxx0001e20000c6000304xxxxxx0001e30000e6000304xxxxxx0001e600004700030cxxxxxx0001e700006700030cxxxxxx0001e800004b00030cxxxxxx0001e900006b00030cxxxxxx0001ea00004f000328xxxxxx0001eb00006f000328xxxxxx0001ec0001ea000304xxxxxx0001ed0001eb000304xxxxxx0001ee0001b700030cxxxxxx0001ef00029200030cxxxxxx0001f000006a00030cxxxxxx0001f4000047000301xxxxxx0001f5000067000301xxxxxx0001f800004e000300xxxxxx0001f900006e000300xxxxxx0001fa0000c5000301xxxxxx0001fb0000e5000301xxxxxx0001fc0000c6000301xxxxxx0001fd0000e6000301xxxxxx0001fe0000d8000301xxxxxx0001ff0000f8000301xxxxxx00020000004100030fxxxxxx00020100006100030fxxxxxx000202000041000311xxxxxx000203000061000311xxxxxx00020400004500030fxxxxxx00020500006500030fxxxxxx000206000045000311xxxxxx000207000065000311xxxxxx00020800004900030fxxxxxx00020900006900030fxxxxxx00020a000049000311xxxxxx00020b000069000311xxxxxx00020c00004f00030fxxxxxx00020d00006f00030fxxxxxx00020e00004f000311xxxxxx00020f00006f000311xxxxxx00021000005200030fxxxxxx00021100007200030fxxxxxx000212000052000311xxxxxx000213000072000311xxxxxx00021400005500030fxxxxxx00021500007500030fxxxxxx000216000055000311xxxxxx000217000075000311xxxxxx000218000053000326xxxxxx000219000073000326xxxxxx00021a000054000326xxxxxx00021b000074000326xxxxxx00021e00004800030cxxxxxx00021f00006800030cxxxxxx000226000041000307xxxxxx000227000061000307xxxxxx000228000045000327xxxxxx000229000065000327xxxxxx00022a0000d6000304xxxxxx00022b0000f6000304xxxxxx00022c0000d5000304xxxxxx00022d0000f5000304xxxxxx00022e00004f000307xxxxxx00022f00006f000307xxxxxx00023000022e000304xxxxxx00023100022f000304xxxxxx000232000059000304xxxxxx000233000079000304xxxxxx000340000300xxxxxx000341000301xxxxxx000343000313xxxxxx000344000308000301xxxxxx0003740002b9xxxxxx00037e00003bxxxxxx0003850000a8000301xxxxxx000386000391000301xxxxxx0003870000b7xxxxxx000388000395000301xxxxxx000389000397000301xxxxxx00038a000399000301xxxxxx00038c00039f000301xxxxxx00038e0003a5000301xxxxxx00038f0003a9000301xxxxxx0003900003ca000301xxxxxx0003aa000399000308xxxxxx0003ab0003a5000308xxxxxx0003ac0003b1000301xxxxxx0003ad0003b5000301xxxxxx0003ae0003b7000301xxxxxx0003af0003b9000301xxxxxx0003b00003cb000301xxxxxx0003ca0003b9000308xxxxxx0003cb0003c5000308xxxxxx0003cc0003bf000301xxxxxx0003cd0003c5000301xxxxxx0003ce0003c9000301xxxxxx0003d30003d2000301xxxxxx0003d40003d2000308xxxxxx000400000415000300xxxxxx000401000415000308xxxxxx000403000413000301xxxxxx000407000406000308xxxxxx00040c00041a000301xxxxxx00040d000418000300xxxxxx00040e000423000306xxxxxx000419000418000306xxxxxx000439000438000306xxxxxx000450000435000300xxxxxx000451000435000308xxxxxx000453000433000301xxxxxx000457000456000308xxxxxx00045c00043a000301xxxxxx00045d000438000300xxxxxx00045e000443000306xxxxxx00047600047400030fxxxxxx00047700047500030fxxxxxx0004c1000416000306xxxxxx0004c2000436000306xxxxxx0004d0000410000306xxxxxx0004d1000430000306xxxxxx0004d2000410000308xxxxxx0004d3000430000308xxxxxx0004d6000415000306xxxxxx0004d7000435000306xxxxxx0004da0004d8000308xxxxxx0004db0004d9000308xxxxxx0004dc000416000308xxxxxx0004dd000436000308xxxxxx0004de000417000308xxxxxx0004df000437000308xxxxxx0004e2000418000304xxxxxx0004e3000438000304xxxxxx0004e4000418000308xxxxxx0004e5000438000308xxxxxx0004e600041e000308xxxxxx0004e700043e000308xxxxxx0004ea0004e8000308xxxxxx0004eb0004e9000308xxxxxx0004ec00042d000308xxxxxx0004ed00044d000308xxxxxx0004ee000423000304xxxxxx0004ef000443000304xxxxxx0004f0000423000308xxxxxx0004f1000443000308xxxxxx0004f200042300030bxxxxxx0004f300044300030bxxxxxx0004f4000427000308xxxxxx0004f5000447000308xxxxxx0004f800042b000308xxxxxx0004f900044b000308xxxxxx000622000627000653xxxxxx000623000627000654xxxxxx000624000648000654xxxxxx000625000627000655xxxxxx00062600064a000654xxxxxx0006c00006d5000654xxxxxx0006c20006c1000654xxxxxx0006d30006d2000654xxxxxx00092900092800093cxxxxxx00093100093000093cxxxxxx00093400093300093cxxxxxx00095800091500093cxxxxxx00095900091600093cxxxxxx00095a00091700093cxxxxxx00095b00091c00093cxxxxxx00095c00092100093cxxxxxx00095d00092200093cxxxxxx00095e00092b00093cxxxxxx00095f00092f00093cxxxxxx0009cb0009c70009bexxxxxx0009cc0009c70009d7xxxxxx0009dc0009a10009bcxxxxxx0009dd0009a20009bcxxxxxx0009df0009af0009bcxxxxxx000a33000a32000a3cxxxxxx000a36000a38000a3cxxxxxx000a59000a16000a3cxxxxxx000a5a000a17000a3cxxxxxx000a5b000a1c000a3cxxxxxx000a5e000a2b000a3cxxxxxx000b48000b47000b56xxxxxx000b4b000b47000b3exxxxxx000b4c000b47000b57xxxxxx000b5c000b21000b3cxxxxxx000b5d000b22000b3cxxxxxx000b94000b92000bd7xxxxxx000bca000bc6000bbexxxxxx000bcb000bc7000bbexxxxxx000bcc000bc6000bd7xxxxxx000c48000c46000c56xxxxxx000cc0000cbf000cd5xxxxxx000cc7000cc6000cd5xxxxxx000cc8000cc6000cd6xxxxxx000cca000cc6000cc2xxxxxx000ccb000cca000cd5xxxxxx000d4a000d46000d3exxxxxx000d4b000d47000d3exxxxxx000d4c000d46000d57xxxxxx000dda000dd9000dcaxxxxxx000ddc000dd9000dcfxxxxxx000ddd000ddc000dcaxxxxxx000dde000dd9000ddfxxxxxx000f43000f42000fb7xxxxxx000f4d000f4c000fb7xxxxxx000f52000f51000fb7xxxxxx000f57000f56000fb7xxxxxx000f5c000f5b000fb7xxxxxx000f69000f40000fb5xxxxxx000f73000f71000f72xxxxxx000f75000f71000f74xxxxxx000f76000fb2000f80xxxxxx000f78000fb3000f80xxxxxx000f81000f71000f80xxxxxx000f93000f92000fb7xxxxxx000f9d000f9c000fb7xxxxxx000fa2000fa1000fb7xxxxxx000fa7000fa6000fb7xxxxxx000fac000fab000fb7xxxxxx000fb9000f90000fb5xxxxxx00102600102500102exxxxxx001b06001b05001b35xxxxxx001b08001b07001b35xxxxxx001b0a001b09001b35xxxxxx001b0c001b0b001b35xxxxxx001b0e001b0d001b35xxxxxx001b12001b11001b35xxxxxx001b3b001b3a001b35xxxxxx001b3d001b3c001b35xxxxxx001b40001b3e001b35xxxxxx001b41001b3f001b35xxxxxx001b43001b42001b35xxxxxx001e00000041000325xxxxxx001e01000061000325xxxxxx001e02000042000307xxxxxx001e03000062000307xxxxxx001e04000042000323xxxxxx001e05000062000323xxxxxx001e06000042000331xxxxxx001e07000062000331xxxxxx001e080000c7000301xxxxxx001e090000e7000301xxxxxx001e0a000044000307xxxxxx001e0b000064000307xxxxxx001e0c000044000323xxxxxx001e0d000064000323xxxxxx001e0e000044000331xxxxxx001e0f000064000331xxxxxx001e10000044000327xxxxxx001e11000064000327xxxxxx001e1200004400032dxxxxxx001e1300006400032dxxxxxx001e14000112000300xxxxxx001e15000113000300xxxxxx001e16000112000301xxxxxx001e17000113000301xxxxxx001e1800004500032dxxxxxx001e1900006500032dxxxxxx001e1a000045000330xxxxxx001e1b000065000330xxxxxx001e1c000228000306xxxxxx001e1d000229000306xxxxxx001e1e000046000307xxxxxx001e1f000066000307xxxxxx001e20000047000304xxxxxx001e21000067000304xxxxxx001e22000048000307xxxxxx001e23000068000307xxxxxx001e24000048000323xxxxxx001e25000068000323xxxxxx001e26000048000308xxxxxx001e27000068000308xxxxxx001e28000048000327xxxxxx001e29000068000327xxxxxx001e2a00004800032exxxxxx001e2b00006800032exxxxxx001e2c000049000330xxxxxx001e2d000069000330xxxxxx001e2e0000cf000301xxxxxx001e2f0000ef000301xxxxxx001e3000004b000301xxxxxx001e3100006b000301xxxxxx001e3200004b000323xxxxxx001e3300006b000323xxxxxx001e3400004b000331xxxxxx001e3500006b000331xxxxxx001e3600004c000323xxxxxx001e3700006c000323xxxxxx001e38001e36000304xxxxxx001e39001e37000304xxxxxx001e3a00004c000331xxxxxx001e3b00006c000331xxxxxx001e3c00004c00032dxxxxxx001e3d00006c00032dxxxxxx001e3e00004d000301xxxxxx001e3f00006d000301xxxxxx001e4000004d000307xxxxxx001e4100006d000307xxxxxx001e4200004d000323xxxxxx001e4300006d000323xxxxxx001e4400004e000307xxxxxx001e4500006e000307xxxxxx001e4600004e000323xxxxxx001e4700006e000323xxxxxx001e4800004e000331xxxxxx001e4900006e000331xxxxxx001e4a00004e00032dxxxxxx001e4b00006e00032dxxxxxx001e4c0000d5000301xxxxxx001e4d0000f5000301xxxxxx001e4e0000d5000308xxxxxx001e4f0000f5000308xxxxxx001e5000014c000300xxxxxx001e5100014d000300xxxxxx001e5200014c000301xxxxxx001e5300014d000301xxxxxx001e54000050000301xxxxxx001e55000070000301xxxxxx001e56000050000307xxxxxx001e57000070000307xxxxxx001e58000052000307xxxxxx001e59000072000307xxxxxx001e5a000052000323xxxxxx001e5b000072000323xxxxxx001e5c001e5a000304xxxxxx001e5d001e5b000304xxxxxx001e5e000052000331xxxxxx001e5f000072000331xxxxxx001e60000053000307xxxxxx001e61000073000307xxxxxx001e62000053000323xxxxxx001e63000073000323xxxxxx001e6400015a000307xxxxxx001e6500015b000307xxxxxx001e66000160000307xxxxxx001e67000161000307xxxxxx001e68001e62000307xxxxxx001e69001e63000307xxxxxx001e6a000054000307xxxxxx001e6b000074000307xxxxxx001e6c000054000323xxxxxx001e6d000074000323xxxxxx001e6e000054000331xxxxxx001e6f000074000331xxxxxx001e7000005400032dxxxxxx001e7100007400032dxxxxxx001e72000055000324xxxxxx001e73000075000324xxxxxx001e74000055000330xxxxxx001e75000075000330xxxxxx001e7600005500032dxxxxxx001e7700007500032dxxxxxx001e78000168000301xxxxxx001e79000169000301xxxxxx001e7a00016a000308xxxxxx001e7b00016b000308xxxxxx001e7c000056000303xxxxxx001e7d000076000303xxxxxx001e7e000056000323xxxxxx001e7f000076000323xxxxxx001e80000057000300xxxxxx001e81000077000300xxxxxx001e82000057000301xxxxxx001e83000077000301xxxxxx001e84000057000308xxxxxx001e85000077000308xxxxxx001e86000057000307xxxxxx001e87000077000307xxxxxx001e88000057000323xxxxxx001e89000077000323xxxxxx001e8a000058000307xxxxxx001e8b000078000307xxxxxx001e8c000058000308xxxxxx001e8d000078000308xxxxxx001e8e000059000307xxxxxx001e8f000079000307xxxxxx001e9000005a000302xxxxxx001e9100007a000302xxxxxx001e9200005a000323xxxxxx001e9300007a000323xxxxxx001e9400005a000331xxxxxx001e9500007a000331xxxxxx001e96000068000331xxxxxx001e97000074000308xxxxxx001e9800007700030axxxxxx001e9900007900030axxxxxx001e9b00017f000307xxxxxx001ea0000041000323xxxxxx001ea1000061000323xxxxxx001ea2000041000309xxxxxx001ea3000061000309xxxxxx001ea40000c2000301xxxxxx001ea50000e2000301xxxxxx001ea60000c2000300xxxxxx001ea70000e2000300xxxxxx001ea80000c2000309xxxxxx001ea90000e2000309xxxxxx001eaa0000c2000303xxxxxx001eab0000e2000303xxxxxx001eac001ea0000302xxxxxx001ead001ea1000302xxxxxx001eae000102000301xxxxxx001eaf000103000301xxxxxx001eb0000102000300xxxxxx001eb1000103000300xxxxxx001eb2000102000309xxxxxx001eb3000103000309xxxxxx001eb4000102000303xxxxxx001eb5000103000303xxxxxx001eb6001ea0000306xxxxxx001eb7001ea1000306xxxxxx001eb8000045000323xxxxxx001eb9000065000323xxxxxx001eba000045000309xxxxxx001ebb000065000309xxxxxx001ebc000045000303xxxxxx001ebd000065000303xxxxxx001ebe0000ca000301xxxxxx001ebf0000ea000301xxxxxx001ec00000ca000300xxxxxx001ec10000ea000300xxxxxx001ec20000ca000309xxxxxx001ec30000ea000309xxxxxx001ec40000ca000303xxxxxx001ec50000ea000303xxxxxx001ec6001eb8000302xxxxxx001ec7001eb9000302xxxxxx001ec8000049000309xxxxxx001ec9000069000309xxxxxx001eca000049000323xxxxxx001ecb000069000323xxxxxx001ecc00004f000323xxxxxx001ecd00006f000323xxxxxx001ece00004f000309xxxxxx001ecf00006f000309xxxxxx001ed00000d4000301xxxxxx001ed10000f4000301xxxxxx001ed20000d4000300xxxxxx001ed30000f4000300xxxxxx001ed40000d4000309xxxxxx001ed50000f4000309xxxxxx001ed60000d4000303xxxxxx001ed70000f4000303xxxxxx001ed8001ecc000302xxxxxx001ed9001ecd000302xxxxxx001eda0001a0000301xxxxxx001edb0001a1000301xxxxxx001edc0001a0000300xxxxxx001edd0001a1000300xxxxxx001ede0001a0000309xxxxxx001edf0001a1000309xxxxxx001ee00001a0000303xxxxxx001ee10001a1000303xxxxxx001ee20001a0000323xxxxxx001ee30001a1000323xxxxxx001ee4000055000323xxxxxx001ee5000075000323xxxxxx001ee6000055000309xxxxxx001ee7000075000309xxxxxx001ee80001af000301xxxxxx001ee90001b0000301xxxxxx001eea0001af000300xxxxxx001eeb0001b0000300xxxxxx001eec0001af000309xxxxxx001eed0001b0000309xxxxxx001eee0001af000303xxxxxx001eef0001b0000303xxxxxx001ef00001af000323xxxxxx001ef10001b0000323xxxxxx001ef2000059000300xxxxxx001ef3000079000300xxxxxx001ef4000059000323xxxxxx001ef5000079000323xxxxxx001ef6000059000309xxxxxx001ef7000079000309xxxxxx001ef8000059000303xxxxxx001ef9000079000303xxxxxx001f000003b1000313xxxxxx001f010003b1000314xxxxxx001f02001f00000300xxxxxx001f03001f01000300xxxxxx001f04001f00000301xxxxxx001f05001f01000301xxxxxx001f06001f00000342xxxxxx001f07001f01000342xxxxxx001f08000391000313xxxxxx001f09000391000314xxxxxx001f0a001f08000300xxxxxx001f0b001f09000300xxxxxx001f0c001f08000301xxxxxx001f0d001f09000301xxxxxx001f0e001f08000342xxxxxx001f0f001f09000342xxxxxx001f100003b5000313xxxxxx001f110003b5000314xxxxxx001f12001f10000300xxxxxx001f13001f11000300xxxxxx001f14001f10000301xxxxxx001f15001f11000301xxxxxx001f18000395000313xxxxxx001f19000395000314xxxxxx001f1a001f18000300xxxxxx001f1b001f19000300xxxxxx001f1c001f18000301xxxxxx001f1d001f19000301xxxxxx001f200003b7000313xxxxxx001f210003b7000314xxxxxx001f22001f20000300xxxxxx001f23001f21000300xxxxxx001f24001f20000301xxxxxx001f25001f21000301xxxxxx001f26001f20000342xxxxxx001f27001f21000342xxxxxx001f28000397000313xxxxxx001f29000397000314xxxxxx001f2a001f28000300xxxxxx001f2b001f29000300xxxxxx001f2c001f28000301xxxxxx001f2d001f29000301xxxxxx001f2e001f28000342xxxxxx001f2f001f29000342xxxxxx001f300003b9000313xxxxxx001f310003b9000314xxxxxx001f32001f30000300xxxxxx001f33001f31000300xxxxxx001f34001f30000301xxxxxx001f35001f31000301xxxxxx001f36001f30000342xxxxxx001f37001f31000342xxxxxx001f38000399000313xxxxxx001f39000399000314xxxxxx001f3a001f38000300xxxxxx001f3b001f39000300xxxxxx001f3c001f38000301xxxxxx001f3d001f39000301xxxxxx001f3e001f38000342xxxxxx001f3f001f39000342xxxxxx001f400003bf000313xxxxxx001f410003bf000314xxxxxx001f42001f40000300xxxxxx001f43001f41000300xxxxxx001f44001f40000301xxxxxx001f45001f41000301xxxxxx001f4800039f000313xxxxxx001f4900039f000314xxxxxx001f4a001f48000300xxxxxx001f4b001f49000300xxxxxx001f4c001f48000301xxxxxx001f4d001f49000301xxxxxx001f500003c5000313xxxxxx001f510003c5000314xxxxxx001f52001f50000300xxxxxx001f53001f51000300xxxxxx001f54001f50000301xxxxxx001f55001f51000301xxxxxx001f56001f50000342xxxxxx001f57001f51000342xxxxxx001f590003a5000314xxxxxx001f5b001f59000300xxxxxx001f5d001f59000301xxxxxx001f5f001f59000342xxxxxx001f600003c9000313xxxxxx001f610003c9000314xxxxxx001f62001f60000300xxxxxx001f63001f61000300xxxxxx001f64001f60000301xxxxxx001f65001f61000301xxxxxx001f66001f60000342xxxxxx001f67001f61000342xxxxxx001f680003a9000313xxxxxx001f690003a9000314xxxxxx001f6a001f68000300xxxxxx001f6b001f69000300xxxxxx001f6c001f68000301xxxxxx001f6d001f69000301xxxxxx001f6e001f68000342xxxxxx001f6f001f69000342xxxxxx001f700003b1000300xxxxxx001f710003acxxxxxx001f720003b5000300xxxxxx001f730003adxxxxxx001f740003b7000300xxxxxx001f750003aexxxxxx001f760003b9000300xxxxxx001f770003afxxxxxx001f780003bf000300xxxxxx001f790003ccxxxxxx001f7a0003c5000300xxxxxx001f7b0003cdxxxxxx001f7c0003c9000300xxxxxx001f7d0003cexxxxxx001f80001f00000345xxxxxx001f81001f01000345xxxxxx001f82001f02000345xxxxxx001f83001f03000345xxxxxx001f84001f04000345xxxxxx001f85001f05000345xxxxxx001f86001f06000345xxxxxx001f87001f07000345xxxxxx001f88001f08000345xxxxxx001f89001f09000345xxxxxx001f8a001f0a000345xxxxxx001f8b001f0b000345xxxxxx001f8c001f0c000345xxxxxx001f8d001f0d000345xxxxxx001f8e001f0e000345xxxxxx001f8f001f0f000345xxxxxx001f90001f20000345xxxxxx001f91001f21000345xxxxxx001f92001f22000345xxxxxx001f93001f23000345xxxxxx001f94001f24000345xxxxxx001f95001f25000345xxxxxx001f96001f26000345xxxxxx001f97001f27000345xxxxxx001f98001f28000345xxxxxx001f99001f29000345xxxxxx001f9a001f2a000345xxxxxx001f9b001f2b000345xxxxxx001f9c001f2c000345xxxxxx001f9d001f2d000345xxxxxx001f9e001f2e000345xxxxxx001f9f001f2f000345xxxxxx001fa0001f60000345xxxxxx001fa1001f61000345xxxxxx001fa2001f62000345xxxxxx001fa3001f63000345xxxxxx001fa4001f64000345xxxxxx001fa5001f65000345xxxxxx001fa6001f66000345xxxxxx001fa7001f67000345xxxxxx001fa8001f68000345xxxxxx001fa9001f69000345xxxxxx001faa001f6a000345xxxxxx001fab001f6b000345xxxxxx001fac001f6c000345xxxxxx001fad001f6d000345xxxxxx001fae001f6e000345xxxxxx001faf001f6f000345xxxxxx001fb00003b1000306xxxxxx001fb10003b1000304xxxxxx001fb2001f70000345xxxxxx001fb30003b1000345xxxxxx001fb40003ac000345xxxxxx001fb60003b1000342xxxxxx001fb7001fb6000345xxxxxx001fb8000391000306xxxxxx001fb9000391000304xxxxxx001fba000391000300xxxxxx001fbb000386xxxxxx001fbc000391000345xxxxxx001fbe0003b9xxxxxx001fc10000a8000342xxxxxx001fc2001f74000345xxxxxx001fc30003b7000345xxxxxx001fc40003ae000345xxxxxx001fc60003b7000342xxxxxx001fc7001fc6000345xxxxxx001fc8000395000300xxxxxx001fc9000388xxxxxx001fca000397000300xxxxxx001fcb000389xxxxxx001fcc000397000345xxxxxx001fcd001fbf000300xxxxxx001fce001fbf000301xxxxxx001fcf001fbf000342xxxxxx001fd00003b9000306xxxxxx001fd10003b9000304xxxxxx001fd20003ca000300xxxxxx001fd3000390xxxxxx001fd60003b9000342xxxxxx001fd70003ca000342xxxxxx001fd8000399000306xxxxxx001fd9000399000304xxxxxx001fda000399000300xxxxxx001fdb00038axxxxxx001fdd001ffe000300xxxxxx001fde001ffe000301xxxxxx001fdf001ffe000342xxxxxx001fe00003c5000306xxxxxx001fe10003c5000304xxxxxx001fe20003cb000300xxxxxx001fe30003b0xxxxxx001fe40003c1000313xxxxxx001fe50003c1000314xxxxxx001fe60003c5000342xxxxxx001fe70003cb000342xxxxxx001fe80003a5000306xxxxxx001fe90003a5000304xxxxxx001fea0003a5000300xxxxxx001feb00038exxxxxx001fec0003a1000314xxxxxx001fed0000a8000300xxxxxx001fee000385xxxxxx001fef000060xxxxxx001ff2001f7c000345xxxxxx001ff30003c9000345xxxxxx001ff40003ce000345xxxxxx001ff60003c9000342xxxxxx001ff7001ff6000345xxxxxx001ff800039f000300xxxxxx001ff900038cxxxxxx001ffa0003a9000300xxxxxx001ffb00038fxxxxxx001ffc0003a9000345xxxxxx001ffd0000b4xxxxxx002000002002xxxxxx002001002003xxxxxx0021260003a9xxxxxx00212a00004bxxxxxx00212b0000c5xxxxxx00219a002190000338xxxxxx00219b002192000338xxxxxx0021ae002194000338xxxxxx0021cd0021d0000338xxxxxx0021ce0021d4000338xxxxxx0021cf0021d2000338xxxxxx002204002203000338xxxxxx002209002208000338xxxxxx00220c00220b000338xxxxxx002224002223000338xxxxxx002226002225000338xxxxxx00224100223c000338xxxxxx002244002243000338xxxxxx002247002245000338xxxxxx002249002248000338xxxxxx00226000003d000338xxxxxx002262002261000338xxxxxx00226d00224d000338xxxxxx00226e00003c000338xxxxxx00226f00003e000338xxxxxx002270002264000338xxxxxx002271002265000338xxxxxx002274002272000338xxxxxx002275002273000338xxxxxx002278002276000338xxxxxx002279002277000338xxxxxx00228000227a000338xxxxxx00228100227b000338xxxxxx002284002282000338xxxxxx002285002283000338xxxxxx002288002286000338xxxxxx002289002287000338xxxxxx0022ac0022a2000338xxxxxx0022ad0022a8000338xxxxxx0022ae0022a9000338xxxxxx0022af0022ab000338xxxxxx0022e000227c000338xxxxxx0022e100227d000338xxxxxx0022e2002291000338xxxxxx0022e3002292000338xxxxxx0022ea0022b2000338xxxxxx0022eb0022b3000338xxxxxx0022ec0022b4000338xxxxxx0022ed0022b5000338xxxxxx002329003008xxxxxx00232a003009xxxxxx002adc002add000338xxxxxx00304c00304b003099xxxxxx00304e00304d003099xxxxxx00305000304f003099xxxxxx003052003051003099xxxxxx003054003053003099xxxxxx003056003055003099xxxxxx003058003057003099xxxxxx00305a003059003099xxxxxx00305c00305b003099xxxxxx00305e00305d003099xxxxxx00306000305f003099xxxxxx003062003061003099xxxxxx003065003064003099xxxxxx003067003066003099xxxxxx003069003068003099xxxxxx00307000306f003099xxxxxx00307100306f00309axxxxxx003073003072003099xxxxxx00307400307200309axxxxxx003076003075003099xxxxxx00307700307500309axxxxxx003079003078003099xxxxxx00307a00307800309axxxxxx00307c00307b003099xxxxxx00307d00307b00309axxxxxx003094003046003099xxxxxx00309e00309d003099xxxxxx0030ac0030ab003099xxxxxx0030ae0030ad003099xxxxxx0030b00030af003099xxxxxx0030b20030b1003099xxxxxx0030b40030b3003099xxxxxx0030b60030b5003099xxxxxx0030b80030b7003099xxxxxx0030ba0030b9003099xxxxxx0030bc0030bb003099xxxxxx0030be0030bd003099xxxxxx0030c00030bf003099xxxxxx0030c20030c1003099xxxxxx0030c50030c4003099xxxxxx0030c70030c6003099xxxxxx0030c90030c8003099xxxxxx0030d00030cf003099xxxxxx0030d10030cf00309axxxxxx0030d30030d2003099xxxxxx0030d40030d200309axxxxxx0030d60030d5003099xxxxxx0030d70030d500309axxxxxx0030d90030d8003099xxxxxx0030da0030d800309axxxxxx0030dc0030db003099xxxxxx0030dd0030db00309axxxxxx0030f40030a6003099xxxxxx0030f70030ef003099xxxxxx0030f80030f0003099xxxxxx0030f90030f1003099xxxxxx0030fa0030f2003099xxxxxx0030fe0030fd003099xxxxxx00f900008c48xxxxxx00f9010066f4xxxxxx00f902008ecaxxxxxx00f903008cc8xxxxxx00f904006ed1xxxxxx00f905004e32xxxxxx00f9060053e5xxxxxx00f907009f9cxxxxxx00f908009f9cxxxxxx00f909005951xxxxxx00f90a0091d1xxxxxx00f90b005587xxxxxx00f90c005948xxxxxx00f90d0061f6xxxxxx00f90e007669xxxxxx00f90f007f85xxxxxx00f91000863fxxxxxx00f9110087baxxxxxx00f9120088f8xxxxxx00f91300908fxxxxxx00f914006a02xxxxxx00f915006d1bxxxxxx00f9160070d9xxxxxx00f9170073dexxxxxx00f91800843dxxxxxx00f91900916axxxxxx00f91a0099f1xxxxxx00f91b004e82xxxxxx00f91c005375xxxxxx00f91d006b04xxxxxx00f91e00721bxxxxxx00f91f00862dxxxxxx00f920009e1exxxxxx00f921005d50xxxxxx00f922006febxxxxxx00f9230085cdxxxxxx00f924008964xxxxxx00f9250062c9xxxxxx00f9260081d8xxxxxx00f92700881fxxxxxx00f928005ecaxxxxxx00f929006717xxxxxx00f92a006d6axxxxxx00f92b0072fcxxxxxx00f92c0090cexxxxxx00f92d004f86xxxxxx00f92e0051b7xxxxxx00f92f0052dexxxxxx00f9300064c4xxxxxx00f931006ad3xxxxxx00f932007210xxxxxx00f9330076e7xxxxxx00f934008001xxxxxx00f935008606xxxxxx00f93600865cxxxxxx00f937008defxxxxxx00f938009732xxxxxx00f939009b6fxxxxxx00f93a009dfaxxxxxx00f93b00788cxxxxxx00f93c00797fxxxxxx00f93d007da0xxxxxx00f93e0083c9xxxxxx00f93f009304xxxxxx00f940009e7fxxxxxx00f941008ad6xxxxxx00f9420058dfxxxxxx00f943005f04xxxxxx00f944007c60xxxxxx00f94500807exxxxxx00f946007262xxxxxx00f9470078caxxxxxx00f948008cc2xxxxxx00f9490096f7xxxxxx00f94a0058d8xxxxxx00f94b005c62xxxxxx00f94c006a13xxxxxx00f94d006ddaxxxxxx00f94e006f0fxxxxxx00f94f007d2fxxxxxx00f950007e37xxxxxx00f95100964bxxxxxx00f9520052d2xxxxxx00f95300808bxxxxxx00f9540051dcxxxxxx00f9550051ccxxxxxx00f956007a1cxxxxxx00f957007dbexxxxxx00f9580083f1xxxxxx00f959009675xxxxxx00f95a008b80xxxxxx00f95b0062cfxxxxxx00f95c006a02xxxxxx00f95d008afexxxxxx00f95e004e39xxxxxx00f95f005be7xxxxxx00f960006012xxxxxx00f961007387xxxxxx00f962007570xxxxxx00f963005317xxxxxx00f9640078fbxxxxxx00f965004fbfxxxxxx00f966005fa9xxxxxx00f967004e0dxxxxxx00f968006cccxxxxxx00f969006578xxxxxx00f96a007d22xxxxxx00f96b0053c3xxxxxx00f96c00585exxxxxx00f96d007701xxxxxx00f96e008449xxxxxx00f96f008aaaxxxxxx00f970006bbaxxxxxx00f971008fb0xxxxxx00f972006c88xxxxxx00f9730062fexxxxxx00f9740082e5xxxxxx00f9750063a0xxxxxx00f976007565xxxxxx00f977004eaexxxxxx00f978005169xxxxxx00f9790051c9xxxxxx00f97a006881xxxxxx00f97b007ce7xxxxxx00f97c00826fxxxxxx00f97d008ad2xxxxxx00f97e0091cfxxxxxx00f97f0052f5xxxxxx00f980005442xxxxxx00f981005973xxxxxx00f982005eecxxxxxx00f9830065c5xxxxxx00f984006ffexxxxxx00f98500792axxxxxx00f9860095adxxxxxx00f987009a6axxxxxx00f988009e97xxxxxx00f989009ecexxxxxx00f98a00529bxxxxxx00f98b0066c6xxxxxx00f98c006b77xxxxxx00f98d008f62xxxxxx00f98e005e74xxxxxx00f98f006190xxxxxx00f990006200xxxxxx00f99100649axxxxxx00f992006f23xxxxxx00f993007149xxxxxx00f994007489xxxxxx00f9950079caxxxxxx00f996007df4xxxxxx00f99700806fxxxxxx00f998008f26xxxxxx00f9990084eexxxxxx00f99a009023xxxxxx00f99b00934axxxxxx00f99c005217xxxxxx00f99d0052a3xxxxxx00f99e0054bdxxxxxx00f99f0070c8xxxxxx00f9a00088c2xxxxxx00f9a1008aaaxxxxxx00f9a2005ec9xxxxxx00f9a3005ff5xxxxxx00f9a400637bxxxxxx00f9a5006baexxxxxx00f9a6007c3exxxxxx00f9a7007375xxxxxx00f9a8004ee4xxxxxx00f9a90056f9xxxxxx00f9aa005be7xxxxxx00f9ab005dbaxxxxxx00f9ac00601cxxxxxx00f9ad0073b2xxxxxx00f9ae007469xxxxxx00f9af007f9axxxxxx00f9b0008046xxxxxx00f9b1009234xxxxxx00f9b20096f6xxxxxx00f9b3009748xxxxxx00f9b4009818xxxxxx00f9b5004f8bxxxxxx00f9b60079aexxxxxx00f9b70091b4xxxxxx00f9b80096b8xxxxxx00f9b90060e1xxxxxx00f9ba004e86xxxxxx00f9bb0050daxxxxxx00f9bc005beexxxxxx00f9bd005c3fxxxxxx00f9be006599xxxxxx00f9bf006a02xxxxxx00f9c00071cexxxxxx00f9c1007642xxxxxx00f9c20084fcxxxxxx00f9c300907cxxxxxx00f9c4009f8dxxxxxx00f9c5006688xxxxxx00f9c600962exxxxxx00f9c7005289xxxxxx00f9c800677bxxxxxx00f9c90067f3xxxxxx00f9ca006d41xxxxxx00f9cb006e9cxxxxxx00f9cc007409xxxxxx00f9cd007559xxxxxx00f9ce00786bxxxxxx00f9cf007d10xxxxxx00f9d000985exxxxxx00f9d100516dxxxxxx00f9d200622exxxxxx00f9d3009678xxxxxx00f9d400502bxxxxxx00f9d5005d19xxxxxx00f9d6006deaxxxxxx00f9d7008f2axxxxxx00f9d8005f8bxxxxxx00f9d9006144xxxxxx00f9da006817xxxxxx00f9db007387xxxxxx00f9dc009686xxxxxx00f9dd005229xxxxxx00f9de00540fxxxxxx00f9df005c65xxxxxx00f9e0006613xxxxxx00f9e100674exxxxxx00f9e20068a8xxxxxx00f9e3006ce5xxxxxx00f9e4007406xxxxxx00f9e50075e2xxxxxx00f9e6007f79xxxxxx00f9e70088cfxxxxxx00f9e80088e1xxxxxx00f9e90091ccxxxxxx00f9ea0096e2xxxxxx00f9eb00533fxxxxxx00f9ec006ebaxxxxxx00f9ed00541dxxxxxx00f9ee0071d0xxxxxx00f9ef007498xxxxxx00f9f00085faxxxxxx00f9f10096a3xxxxxx00f9f2009c57xxxxxx00f9f3009e9fxxxxxx00f9f4006797xxxxxx00f9f5006dcbxxxxxx00f9f60081e8xxxxxx00f9f7007acbxxxxxx00f9f8007b20xxxxxx00f9f9007c92xxxxxx00f9fa0072c0xxxxxx00f9fb007099xxxxxx00f9fc008b58xxxxxx00f9fd004ec0xxxxxx00f9fe008336xxxxxx00f9ff00523axxxxxx00fa00005207xxxxxx00fa01005ea6xxxxxx00fa020062d3xxxxxx00fa03007cd6xxxxxx00fa04005b85xxxxxx00fa05006d1exxxxxx00fa060066b4xxxxxx00fa07008f3bxxxxxx00fa0800884cxxxxxx00fa0900964dxxxxxx00fa0a00898bxxxxxx00fa0b005ed3xxxxxx00fa0c005140xxxxxx00fa0d0055c0xxxxxx00fa1000585axxxxxx00fa12006674xxxxxx00fa150051dexxxxxx00fa1600732axxxxxx00fa170076caxxxxxx00fa1800793cxxxxxx00fa1900795exxxxxx00fa1a007965xxxxxx00fa1b00798fxxxxxx00fa1c009756xxxxxx00fa1d007cbexxxxxx00fa1e007fbdxxxxxx00fa20008612xxxxxx00fa22008af8xxxxxx00fa25009038xxxxxx00fa260090fdxxxxxx00fa2a0098efxxxxxx00fa2b0098fcxxxxxx00fa2c009928xxxxxx00fa2d009db4xxxxxx00fa30004faexxxxxx00fa310050e7xxxxxx00fa3200514dxxxxxx00fa330052c9xxxxxx00fa340052e4xxxxxx00fa35005351xxxxxx00fa3600559dxxxxxx00fa37005606xxxxxx00fa38005668xxxxxx00fa39005840xxxxxx00fa3a0058a8xxxxxx00fa3b005c64xxxxxx00fa3c005c6exxxxxx00fa3d006094xxxxxx00fa3e006168xxxxxx00fa3f00618exxxxxx00fa400061f2xxxxxx00fa4100654fxxxxxx00fa420065e2xxxxxx00fa43006691xxxxxx00fa44006885xxxxxx00fa45006d77xxxxxx00fa46006e1axxxxxx00fa47006f22xxxxxx00fa4800716exxxxxx00fa4900722bxxxxxx00fa4a007422xxxxxx00fa4b007891xxxxxx00fa4c00793exxxxxx00fa4d007949xxxxxx00fa4e007948xxxxxx00fa4f007950xxxxxx00fa50007956xxxxxx00fa5100795dxxxxxx00fa5200798dxxxxxx00fa5300798exxxxxx00fa54007a40xxxxxx00fa55007a81xxxxxx00fa56007bc0xxxxxx00fa57007df4xxxxxx00fa58007e09xxxxxx00fa59007e41xxxxxx00fa5a007f72xxxxxx00fa5b008005xxxxxx00fa5c0081edxxxxxx00fa5d008279xxxxxx00fa5e008279xxxxxx00fa5f008457xxxxxx00fa60008910xxxxxx00fa61008996xxxxxx00fa62008b01xxxxxx00fa63008b39xxxxxx00fa64008cd3xxxxxx00fa65008d08xxxxxx00fa66008fb6xxxxxx00fa67009038xxxxxx00fa680096e3xxxxxx00fa690097ffxxxxxx00fa6a00983bxxxxxx00fa70004e26xxxxxx00fa710051b5xxxxxx00fa72005168xxxxxx00fa73004f80xxxxxx00fa74005145xxxxxx00fa75005180xxxxxx00fa760052c7xxxxxx00fa770052faxxxxxx00fa7800559dxxxxxx00fa79005555xxxxxx00fa7a005599xxxxxx00fa7b0055e2xxxxxx00fa7c00585axxxxxx00fa7d0058b3xxxxxx00fa7e005944xxxxxx00fa7f005954xxxxxx00fa80005a62xxxxxx00fa81005b28xxxxxx00fa82005ed2xxxxxx00fa83005ed9xxxxxx00fa84005f69xxxxxx00fa85005fadxxxxxx00fa860060d8xxxxxx00fa8700614exxxxxx00fa88006108xxxxxx00fa8900618exxxxxx00fa8a006160xxxxxx00fa8b0061f2xxxxxx00fa8c006234xxxxxx00fa8d0063c4xxxxxx00fa8e00641cxxxxxx00fa8f006452xxxxxx00fa90006556xxxxxx00fa91006674xxxxxx00fa92006717xxxxxx00fa9300671bxxxxxx00fa94006756xxxxxx00fa95006b79xxxxxx00fa96006bbaxxxxxx00fa97006d41xxxxxx00fa98006edbxxxxxx00fa99006ecbxxxxxx00fa9a006f22xxxxxx00fa9b00701exxxxxx00fa9c00716exxxxxx00fa9d0077a7xxxxxx00fa9e007235xxxxxx00fa9f0072afxxxxxx00faa000732axxxxxx00faa1007471xxxxxx00faa2007506xxxxxx00faa300753bxxxxxx00faa400761dxxxxxx00faa500761fxxxxxx00faa60076caxxxxxx00faa70076dbxxxxxx00faa80076f4xxxxxx00faa900774axxxxxx00faaa007740xxxxxx00faab0078ccxxxxxx00faac007ab1xxxxxx00faad007bc0xxxxxx00faae007c7bxxxxxx00faaf007d5bxxxxxx00fab0007df4xxxxxx00fab1007f3exxxxxx00fab2008005xxxxxx00fab3008352xxxxxx00fab40083efxxxxxx00fab5008779xxxxxx00fab6008941xxxxxx00fab7008986xxxxxx00fab8008996xxxxxx00fab9008abfxxxxxx00faba008af8xxxxxx00fabb008acbxxxxxx00fabc008b01xxxxxx00fabd008afexxxxxx00fabe008aedxxxxxx00fabf008b39xxxxxx00fac0008b8axxxxxx00fac1008d08xxxxxx00fac2008f38xxxxxx00fac3009072xxxxxx00fac4009199xxxxxx00fac5009276xxxxxx00fac600967cxxxxxx00fac70096e3xxxxxx00fac8009756xxxxxx00fac90097dbxxxxxx00faca0097ffxxxxxx00facb00980bxxxxxx00facc00983bxxxxxx00facd009b12xxxxxx00face009f9cxxxxxx00facf02284axxxxxx00fad0022844xxxxxx00fad10233d5xxxxxx00fad2003b9dxxxxxx00fad3004018xxxxxx00fad4004039xxxxxx00fad5025249xxxxxx00fad6025cd0xxxxxx00fad7027ed3xxxxxx00fad8009f43xxxxxx00fad9009f8exxxxxx00fb1d0005d90005b4xxxxxx00fb1f0005f20005b7xxxxxx00fb2a0005e90005c1xxxxxx00fb2b0005e90005c2xxxxxx00fb2c00fb490005c1xxxxxx00fb2d00fb490005c2xxxxxx00fb2e0005d00005b7xxxxxx00fb2f0005d00005b8xxxxxx00fb300005d00005bcxxxxxx00fb310005d10005bcxxxxxx00fb320005d20005bcxxxxxx00fb330005d30005bcxxxxxx00fb340005d40005bcxxxxxx00fb350005d50005bcxxxxxx00fb360005d60005bcxxxxxx00fb380005d80005bcxxxxxx00fb390005d90005bcxxxxxx00fb3a0005da0005bcxxxxxx00fb3b0005db0005bcxxxxxx00fb3c0005dc0005bcxxxxxx00fb3e0005de0005bcxxxxxx00fb400005e00005bcxxxxxx00fb410005e10005bcxxxxxx00fb430005e30005bcxxxxxx00fb440005e40005bcxxxxxx00fb460005e60005bcxxxxxx00fb470005e70005bcxxxxxx00fb480005e80005bcxxxxxx00fb490005e90005bcxxxxxx00fb4a0005ea0005bcxxxxxx00fb4b0005d50005b9xxxxxx00fb4c0005d10005bfxxxxxx00fb4d0005db0005bfxxxxxx00fb4e0005e40005bfxxxxxx01d15e01d15701d165xxxxxx01d15f01d15801d165xxxxxx01d16001d15f01d16exxxxxx01d16101d15f01d16fxxxxxx01d16201d15f01d170xxxxxx01d16301d15f01d171xxxxxx01d16401d15f01d172xxxxxx01d1bb01d1b901d165xxxxxx01d1bc01d1ba01d165xxxxxx01d1bd01d1bb01d16exxxxxx01d1be01d1bc01d16exxxxxx01d1bf01d1bb01d16fxxxxxx01d1c001d1bc01d16fxxxxxx02f800004e3dxxxxxx02f801004e38xxxxxx02f802004e41xxxxxx02f803020122xxxxxx02f804004f60xxxxxx02f805004faexxxxxx02f806004fbbxxxxxx02f807005002xxxxxx02f80800507axxxxxx02f809005099xxxxxx02f80a0050e7xxxxxx02f80b0050cfxxxxxx02f80c00349exxxxxx02f80d02063axxxxxx02f80e00514dxxxxxx02f80f005154xxxxxx02f810005164xxxxxx02f811005177xxxxxx02f81202051cxxxxxx02f8130034b9xxxxxx02f814005167xxxxxx02f81500518dxxxxxx02f81602054bxxxxxx02f817005197xxxxxx02f8180051a4xxxxxx02f819004eccxxxxxx02f81a0051acxxxxxx02f81b0051b5xxxxxx02f81c0291dfxxxxxx02f81d0051f5xxxxxx02f81e005203xxxxxx02f81f0034dfxxxxxx02f82000523bxxxxxx02f821005246xxxxxx02f822005272xxxxxx02f823005277xxxxxx02f824003515xxxxxx02f8250052c7xxxxxx02f8260052c9xxxxxx02f8270052e4xxxxxx02f8280052faxxxxxx02f829005305xxxxxx02f82a005306xxxxxx02f82b005317xxxxxx02f82c005349xxxxxx02f82d005351xxxxxx02f82e00535axxxxxx02f82f005373xxxxxx02f83000537dxxxxxx02f83100537fxxxxxx02f83200537fxxxxxx02f83300537fxxxxxx02f834020a2cxxxxxx02f835007070xxxxxx02f8360053caxxxxxx02f8370053dfxxxxxx02f838020b63xxxxxx02f8390053ebxxxxxx02f83a0053f1xxxxxx02f83b005406xxxxxx02f83c00549exxxxxx02f83d005438xxxxxx02f83e005448xxxxxx02f83f005468xxxxxx02f8400054a2xxxxxx02f8410054f6xxxxxx02f842005510xxxxxx02f843005553xxxxxx02f844005563xxxxxx02f845005584xxxxxx02f846005584xxxxxx02f847005599xxxxxx02f8480055abxxxxxx02f8490055b3xxxxxx02f84a0055c2xxxxxx02f84b005716xxxxxx02f84c005606xxxxxx02f84d005717xxxxxx02f84e005651xxxxxx02f84f005674xxxxxx02f850005207xxxxxx02f8510058eexxxxxx02f8520057cexxxxxx02f8530057f4xxxxxx02f85400580dxxxxxx02f85500578bxxxxxx02f856005832xxxxxx02f857005831xxxxxx02f8580058acxxxxxx02f8590214e4xxxxxx02f85a0058f2xxxxxx02f85b0058f7xxxxxx02f85c005906xxxxxx02f85d00591axxxxxx02f85e005922xxxxxx02f85f005962xxxxxx02f8600216a8xxxxxx02f8610216eaxxxxxx02f8620059ecxxxxxx02f863005a1bxxxxxx02f864005a27xxxxxx02f8650059d8xxxxxx02f866005a66xxxxxx02f8670036eexxxxxx02f8680036fcxxxxxx02f869005b08xxxxxx02f86a005b3exxxxxx02f86b005b3exxxxxx02f86c0219c8xxxxxx02f86d005bc3xxxxxx02f86e005bd8xxxxxx02f86f005be7xxxxxx02f870005bf3xxxxxx02f871021b18xxxxxx02f872005bffxxxxxx02f873005c06xxxxxx02f874005f53xxxxxx02f875005c22xxxxxx02f876003781xxxxxx02f877005c60xxxxxx02f878005c6exxxxxx02f879005cc0xxxxxx02f87a005c8dxxxxxx02f87b021de4xxxxxx02f87c005d43xxxxxx02f87d021de6xxxxxx02f87e005d6exxxxxx02f87f005d6bxxxxxx02f880005d7cxxxxxx02f881005de1xxxxxx02f882005de2xxxxxx02f88300382fxxxxxx02f884005dfdxxxxxx02f885005e28xxxxxx02f886005e3dxxxxxx02f887005e69xxxxxx02f888003862xxxxxx02f889022183xxxxxx02f88a00387cxxxxxx02f88b005eb0xxxxxx02f88c005eb3xxxxxx02f88d005eb6xxxxxx02f88e005ecaxxxxxx02f88f02a392xxxxxx02f890005efexxxxxx02f891022331xxxxxx02f892022331xxxxxx02f893008201xxxxxx02f894005f22xxxxxx02f895005f22xxxxxx02f8960038c7xxxxxx02f8970232b8xxxxxx02f8980261daxxxxxx02f899005f62xxxxxx02f89a005f6bxxxxxx02f89b0038e3xxxxxx02f89c005f9axxxxxx02f89d005fcdxxxxxx02f89e005fd7xxxxxx02f89f005ff9xxxxxx02f8a0006081xxxxxx02f8a100393axxxxxx02f8a200391cxxxxxx02f8a3006094xxxxxx02f8a40226d4xxxxxx02f8a50060c7xxxxxx02f8a6006148xxxxxx02f8a700614cxxxxxx02f8a800614exxxxxx02f8a900614cxxxxxx02f8aa00617axxxxxx02f8ab00618exxxxxx02f8ac0061b2xxxxxx02f8ad0061a4xxxxxx02f8ae0061afxxxxxx02f8af0061dexxxxxx02f8b00061f2xxxxxx02f8b10061f6xxxxxx02f8b2006210xxxxxx02f8b300621bxxxxxx02f8b400625dxxxxxx02f8b50062b1xxxxxx02f8b60062d4xxxxxx02f8b7006350xxxxxx02f8b8022b0cxxxxxx02f8b900633dxxxxxx02f8ba0062fcxxxxxx02f8bb006368xxxxxx02f8bc006383xxxxxx02f8bd0063e4xxxxxx02f8be022bf1xxxxxx02f8bf006422xxxxxx02f8c00063c5xxxxxx02f8c10063a9xxxxxx02f8c2003a2exxxxxx02f8c3006469xxxxxx02f8c400647exxxxxx02f8c500649dxxxxxx02f8c6006477xxxxxx02f8c7003a6cxxxxxx02f8c800654fxxxxxx02f8c900656cxxxxxx02f8ca02300axxxxxx02f8cb0065e3xxxxxx02f8cc0066f8xxxxxx02f8cd006649xxxxxx02f8ce003b19xxxxxx02f8cf006691xxxxxx02f8d0003b08xxxxxx02f8d1003ae4xxxxxx02f8d2005192xxxxxx02f8d3005195xxxxxx02f8d4006700xxxxxx02f8d500669cxxxxxx02f8d60080adxxxxxx02f8d70043d9xxxxxx02f8d8006717xxxxxx02f8d900671bxxxxxx02f8da006721xxxxxx02f8db00675exxxxxx02f8dc006753xxxxxx02f8dd0233c3xxxxxx02f8de003b49xxxxxx02f8df0067faxxxxxx02f8e0006785xxxxxx02f8e1006852xxxxxx02f8e2006885xxxxxx02f8e302346dxxxxxx02f8e400688exxxxxx02f8e500681fxxxxxx02f8e6006914xxxxxx02f8e7003b9dxxxxxx02f8e8006942xxxxxx02f8e90069a3xxxxxx02f8ea0069eaxxxxxx02f8eb006aa8xxxxxx02f8ec0236a3xxxxxx02f8ed006adbxxxxxx02f8ee003c18xxxxxx02f8ef006b21xxxxxx02f8f00238a7xxxxxx02f8f1006b54xxxxxx02f8f2003c4exxxxxx02f8f3006b72xxxxxx02f8f4006b9fxxxxxx02f8f5006bbaxxxxxx02f8f6006bbbxxxxxx02f8f7023a8dxxxxxx02f8f8021d0bxxxxxx02f8f9023afaxxxxxx02f8fa006c4exxxxxx02f8fb023cbcxxxxxx02f8fc006cbfxxxxxx02f8fd006ccdxxxxxx02f8fe006c67xxxxxx02f8ff006d16xxxxxx02f900006d3exxxxxx02f901006d77xxxxxx02f902006d41xxxxxx02f903006d69xxxxxx02f904006d78xxxxxx02f905006d85xxxxxx02f906023d1exxxxxx02f907006d34xxxxxx02f908006e2fxxxxxx02f909006e6exxxxxx02f90a003d33xxxxxx02f90b006ecbxxxxxx02f90c006ec7xxxxxx02f90d023ed1xxxxxx02f90e006df9xxxxxx02f90f006f6exxxxxx02f910023f5exxxxxx02f911023f8exxxxxx02f912006fc6xxxxxx02f913007039xxxxxx02f91400701exxxxxx02f91500701bxxxxxx02f916003d96xxxxxx02f91700704axxxxxx02f91800707dxxxxxx02f919007077xxxxxx02f91a0070adxxxxxx02f91b020525xxxxxx02f91c007145xxxxxx02f91d024263xxxxxx02f91e00719cxxxxxx02f91f0243abxxxxxx02f920007228xxxxxx02f921007235xxxxxx02f922007250xxxxxx02f923024608xxxxxx02f924007280xxxxxx02f925007295xxxxxx02f926024735xxxxxx02f927024814xxxxxx02f92800737axxxxxx02f92900738bxxxxxx02f92a003eacxxxxxx02f92b0073a5xxxxxx02f92c003eb8xxxxxx02f92d003eb8xxxxxx02f92e007447xxxxxx02f92f00745cxxxxxx02f930007471xxxxxx02f931007485xxxxxx02f9320074caxxxxxx02f933003f1bxxxxxx02f934007524xxxxxx02f935024c36xxxxxx02f93600753exxxxxx02f937024c92xxxxxx02f938007570xxxxxx02f93902219fxxxxxx02f93a007610xxxxxx02f93b024fa1xxxxxx02f93c024fb8xxxxxx02f93d025044xxxxxx02f93e003ffcxxxxxx02f93f004008xxxxxx02f9400076f4xxxxxx02f9410250f3xxxxxx02f9420250f2xxxxxx02f943025119xxxxxx02f944025133xxxxxx02f94500771exxxxxx02f94600771fxxxxxx02f94700771fxxxxxx02f94800774axxxxxx02f949004039xxxxxx02f94a00778bxxxxxx02f94b004046xxxxxx02f94c004096xxxxxx02f94d02541dxxxxxx02f94e00784exxxxxx02f94f00788cxxxxxx02f9500078ccxxxxxx02f9510040e3xxxxxx02f952025626xxxxxx02f953007956xxxxxx02f95402569axxxxxx02f9550256c5xxxxxx02f95600798fxxxxxx02f9570079ebxxxxxx02f95800412fxxxxxx02f959007a40xxxxxx02f95a007a4axxxxxx02f95b007a4fxxxxxx02f95c02597cxxxxxx02f95d025aa7xxxxxx02f95e025aa7xxxxxx02f95f007aeexxxxxx02f960004202xxxxxx02f961025babxxxxxx02f962007bc6xxxxxx02f963007bc9xxxxxx02f964004227xxxxxx02f965025c80xxxxxx02f966007cd2xxxxxx02f9670042a0xxxxxx02f968007ce8xxxxxx02f969007ce3xxxxxx02f96a007d00xxxxxx02f96b025f86xxxxxx02f96c007d63xxxxxx02f96d004301xxxxxx02f96e007dc7xxxxxx02f96f007e02xxxxxx02f970007e45xxxxxx02f971004334xxxxxx02f972026228xxxxxx02f973026247xxxxxx02f974004359xxxxxx02f9750262d9xxxxxx02f976007f7axxxxxx02f97702633exxxxxx02f978007f95xxxxxx02f979007ffaxxxxxx02f97a008005xxxxxx02f97b0264daxxxxxx02f97c026523xxxxxx02f97d008060xxxxxx02f97e0265a8xxxxxx02f97f008070xxxxxx02f98002335fxxxxxx02f9810043d5xxxxxx02f9820080b2xxxxxx02f983008103xxxxxx02f98400440bxxxxxx02f98500813exxxxxx02f986005ab5xxxxxx02f9870267a7xxxxxx02f9880267b5xxxxxx02f989023393xxxxxx02f98a02339cxxxxxx02f98b008201xxxxxx02f98c008204xxxxxx02f98d008f9exxxxxx02f98e00446bxxxxxx02f98f008291xxxxxx02f99000828bxxxxxx02f99100829dxxxxxx02f9920052b3xxxxxx02f9930082b1xxxxxx02f9940082b3xxxxxx02f9950082bdxxxxxx02f9960082e6xxxxxx02f997026b3cxxxxxx02f9980082e5xxxxxx02f99900831dxxxxxx02f99a008363xxxxxx02f99b0083adxxxxxx02f99c008323xxxxxx02f99d0083bdxxxxxx02f99e0083e7xxxxxx02f99f008457xxxxxx02f9a0008353xxxxxx02f9a10083caxxxxxx02f9a20083ccxxxxxx02f9a30083dcxxxxxx02f9a4026c36xxxxxx02f9a5026d6bxxxxxx02f9a6026cd5xxxxxx02f9a700452bxxxxxx02f9a80084f1xxxxxx02f9a90084f3xxxxxx02f9aa008516xxxxxx02f9ab0273caxxxxxx02f9ac008564xxxxxx02f9ad026f2cxxxxxx02f9ae00455dxxxxxx02f9af004561xxxxxx02f9b0026fb1xxxxxx02f9b10270d2xxxxxx02f9b200456bxxxxxx02f9b3008650xxxxxx02f9b400865cxxxxxx02f9b5008667xxxxxx02f9b6008669xxxxxx02f9b70086a9xxxxxx02f9b8008688xxxxxx02f9b900870exxxxxx02f9ba0086e2xxxxxx02f9bb008779xxxxxx02f9bc008728xxxxxx02f9bd00876bxxxxxx02f9be008786xxxxxx02f9bf0045d7xxxxxx02f9c00087e1xxxxxx02f9c1008801xxxxxx02f9c20045f9xxxxxx02f9c3008860xxxxxx02f9c4008863xxxxxx02f9c5027667xxxxxx02f9c60088d7xxxxxx02f9c70088dexxxxxx02f9c8004635xxxxxx02f9c90088faxxxxxx02f9ca0034bbxxxxxx02f9cb0278aexxxxxx02f9cc027966xxxxxx02f9cd0046bexxxxxx02f9ce0046c7xxxxxx02f9cf008aa0xxxxxx02f9d0008aedxxxxxx02f9d1008b8axxxxxx02f9d2008c55xxxxxx02f9d3027ca8xxxxxx02f9d4008cabxxxxxx02f9d5008cc1xxxxxx02f9d6008d1bxxxxxx02f9d7008d77xxxxxx02f9d8027f2fxxxxxx02f9d9020804xxxxxx02f9da008dcbxxxxxx02f9db008dbcxxxxxx02f9dc008df0xxxxxx02f9dd0208dexxxxxx02f9de008ed4xxxxxx02f9df008f38xxxxxx02f9e00285d2xxxxxx02f9e10285edxxxxxx02f9e2009094xxxxxx02f9e30090f1xxxxxx02f9e4009111xxxxxx02f9e502872exxxxxx02f9e600911bxxxxxx02f9e7009238xxxxxx02f9e80092d7xxxxxx02f9e90092d8xxxxxx02f9ea00927cxxxxxx02f9eb0093f9xxxxxx02f9ec009415xxxxxx02f9ed028bfaxxxxxx02f9ee00958bxxxxxx02f9ef004995xxxxxx02f9f00095b7xxxxxx02f9f1028d77xxxxxx02f9f20049e6xxxxxx02f9f30096c3xxxxxx02f9f4005db2xxxxxx02f9f5009723xxxxxx02f9f6029145xxxxxx02f9f702921axxxxxx02f9f8004a6exxxxxx02f9f9004a76xxxxxx02f9fa0097e0xxxxxx02f9fb02940axxxxxx02f9fc004ab2xxxxxx02f9fd029496xxxxxx02f9fe00980bxxxxxx02f9ff00980bxxxxxx02fa00009829xxxxxx02fa010295b6xxxxxx02fa020098e2xxxxxx02fa03004b33xxxxxx02fa04009929xxxxxx02fa050099a7xxxxxx02fa060099c2xxxxxx02fa070099fexxxxxx02fa08004bcexxxxxx02fa09029b30xxxxxx02fa0a009b12xxxxxx02fa0b009c40xxxxxx02fa0c009cfdxxxxxx02fa0d004ccexxxxxx02fa0e004cedxxxxxx02fa0f009d67xxxxxx02fa1002a0cexxxxxx02fa11004cf8xxxxxx02fa1202a105xxxxxx02fa1302a20exxxxxx02fa1402a291xxxxxx02fa15009ebbxxxxxx02fa16004d56xxxxxx02fa17009ef9xxxxxx02fa18009efexxxxxx02fa19009f05xxxxxx02fa1a009f0fxxxxxx02fa1b009f16xxxxxx02fa1c009f3bxxxxxx02fa1d02a600xxxxxx
@@ -0,0 +1 @@
1
+ 00034000034100034300034400037400037e00038700095800095900095a00095b00095c00095d00095e00095f0009dc0009dd0009df000a33000a36000a59000a5a000a5b000a5e000b5c000b5d000f43000f4d000f52000f57000f5c000f69000f73000f75000f76000f78000f81000f93000f9d000fa2000fa7000fac000fb9001f71001f73001f75001f77001f79001f7b001f7d001fbb001fbe001fc9001fcb001fd3001fdb001fe3001feb001fee001fef001ff9001ffb001ffd00200000200100212600212a00212b00232900232a002adc00f90000f90100f90200f90300f90400f90500f90600f90700f90800f90900f90a00f90b00f90c00f90d00f90e00f90f00f91000f91100f91200f91300f91400f91500f91600f91700f91800f91900f91a00f91b00f91c00f91d00f91e00f91f00f92000f92100f92200f92300f92400f92500f92600f92700f92800f92900f92a00f92b00f92c00f92d00f92e00f92f00f93000f93100f93200f93300f93400f93500f93600f93700f93800f93900f93a00f93b00f93c00f93d00f93e00f93f00f94000f94100f94200f94300f94400f94500f94600f94700f94800f94900f94a00f94b00f94c00f94d00f94e00f94f00f95000f95100f95200f95300f95400f95500f95600f95700f95800f95900f95a00f95b00f95c00f95d00f95e00f95f00f96000f96100f96200f96300f96400f96500f96600f96700f96800f96900f96a00f96b00f96c00f96d00f96e00f96f00f97000f97100f97200f97300f97400f97500f97600f97700f97800f97900f97a00f97b00f97c00f97d00f97e00f97f00f98000f98100f98200f98300f98400f98500f98600f98700f98800f98900f98a00f98b00f98c00f98d00f98e00f98f00f99000f99100f99200f99300f99400f99500f99600f99700f99800f99900f99a00f99b00f99c00f99d00f99e00f99f00f9a000f9a100f9a200f9a300f9a400f9a500f9a600f9a700f9a800f9a900f9aa00f9ab00f9ac00f9ad00f9ae00f9af00f9b000f9b100f9b200f9b300f9b400f9b500f9b600f9b700f9b800f9b900f9ba00f9bb00f9bc00f9bd00f9be00f9bf00f9c000f9c100f9c200f9c300f9c400f9c500f9c600f9c700f9c800f9c900f9ca00f9cb00f9cc00f9cd00f9ce00f9cf00f9d000f9d100f9d200f9d300f9d400f9d500f9d600f9d700f9d800f9d900f9da00f9db00f9dc00f9dd00f9de00f9df00f9e000f9e100f9e200f9e300f9e400f9e500f9e600f9e700f9e800f9e900f9ea00f9eb00f9ec00f9ed00f9ee00f9ef00f9f000f9f100f9f200f9f300f9f400f9f500f9f600f9f700f9f800f9f900f9fa00f9fb00f9fc00f9fd00f9fe00f9ff00fa0000fa0100fa0200fa0300fa0400fa0500fa0600fa0700fa0800fa0900fa0a00fa0b00fa0c00fa0d00fa1000fa1200fa1500fa1600fa1700fa1800fa1900fa1a00fa1b00fa1c00fa1d00fa1e00fa2000fa2200fa2500fa2600fa2a00fa2b00fa2c00fa2d00fa3000fa3100fa3200fa3300fa3400fa3500fa3600fa3700fa3800fa3900fa3a00fa3b00fa3c00fa3d00fa3e00fa3f00fa4000fa4100fa4200fa4300fa4400fa4500fa4600fa4700fa4800fa4900fa4a00fa4b00fa4c00fa4d00fa4e00fa4f00fa5000fa5100fa5200fa5300fa5400fa5500fa5600fa5700fa5800fa5900fa5a00fa5b00fa5c00fa5d00fa5e00fa5f00fa6000fa6100fa6200fa6300fa6400fa6500fa6600fa6700fa6800fa6900fa6a00fa7000fa7100fa7200fa7300fa7400fa7500fa7600fa7700fa7800fa7900fa7a00fa7b00fa7c00fa7d00fa7e00fa7f00fa8000fa8100fa8200fa8300fa8400fa8500fa8600fa8700fa8800fa8900fa8a00fa8b00fa8c00fa8d00fa8e00fa8f00fa9000fa9100fa9200fa9300fa9400fa9500fa9600fa9700fa9800fa9900fa9a00fa9b00fa9c00fa9d00fa9e00fa9f00faa000faa100faa200faa300faa400faa500faa600faa700faa800faa900faaa00faab00faac00faad00faae00faaf00fab000fab100fab200fab300fab400fab500fab600fab700fab800fab900faba00fabb00fabc00fabd00fabe00fabf00fac000fac100fac200fac300fac400fac500fac600fac700fac800fac900faca00facb00facc00facd00face00facf00fad000fad100fad200fad300fad400fad500fad600fad700fad800fad900fb1d00fb1f00fb2a00fb2b00fb2c00fb2d00fb2e00fb2f00fb3000fb3100fb3200fb3300fb3400fb3500fb3600fb3800fb3900fb3a00fb3b00fb3c00fb3e00fb4000fb4100fb4300fb4400fb4600fb4700fb4800fb4900fb4a00fb4b00fb4c00fb4d00fb4e01d15e01d15f01d16001d16101d16201d16301d16401d1bb01d1bc01d1bd01d1be01d1bf01d1c002f80002f80102f80202f80302f80402f80502f80602f80702f80802f80902f80a02f80b02f80c02f80d02f80e02f80f02f81002f81102f81202f81302f81402f81502f81602f81702f81802f81902f81a02f81b02f81c02f81d02f81e02f81f02f82002f82102f82202f82302f82402f82502f82602f82702f82802f82902f82a02f82b02f82c02f82d02f82e02f82f02f83002f83102f83202f83302f83402f83502f83602f83702f83802f83902f83a02f83b02f83c02f83d02f83e02f83f02f84002f84102f84202f84302f84402f84502f84602f84702f84802f84902f84a02f84b02f84c02f84d02f84e02f84f02f85002f85102f85202f85302f85402f85502f85602f85702f85802f85902f85a02f85b02f85c02f85d02f85e02f85f02f86002f86102f86202f86302f86402f86502f86602f86702f86802f86902f86a02f86b02f86c02f86d02f86e02f86f02f87002f87102f87202f87302f87402f87502f87602f87702f87802f87902f87a02f87b02f87c02f87d02f87e02f87f02f88002f88102f88202f88302f88402f88502f88602f88702f88802f88902f88a02f88b02f88c02f88d02f88e02f88f02f89002f89102f89202f89302f89402f89502f89602f89702f89802f89902f89a02f89b02f89c02f89d02f89e02f89f02f8a002f8a102f8a202f8a302f8a402f8a502f8a602f8a702f8a802f8a902f8aa02f8ab02f8ac02f8ad02f8ae02f8af02f8b002f8b102f8b202f8b302f8b402f8b502f8b602f8b702f8b802f8b902f8ba02f8bb02f8bc02f8bd02f8be02f8bf02f8c002f8c102f8c202f8c302f8c402f8c502f8c602f8c702f8c802f8c902f8ca02f8cb02f8cc02f8cd02f8ce02f8cf02f8d002f8d102f8d202f8d302f8d402f8d502f8d602f8d702f8d802f8d902f8da02f8db02f8dc02f8dd02f8de02f8df02f8e002f8e102f8e202f8e302f8e402f8e502f8e602f8e702f8e802f8e902f8ea02f8eb02f8ec02f8ed02f8ee02f8ef02f8f002f8f102f8f202f8f302f8f402f8f502f8f602f8f702f8f802f8f902f8fa02f8fb02f8fc02f8fd02f8fe02f8ff02f90002f90102f90202f90302f90402f90502f90602f90702f90802f90902f90a02f90b02f90c02f90d02f90e02f90f02f91002f91102f91202f91302f91402f91502f91602f91702f91802f91902f91a02f91b02f91c02f91d02f91e02f91f02f92002f92102f92202f92302f92402f92502f92602f92702f92802f92902f92a02f92b02f92c02f92d02f92e02f92f02f93002f93102f93202f93302f93402f93502f93602f93702f93802f93902f93a02f93b02f93c02f93d02f93e02f93f02f94002f94102f94202f94302f94402f94502f94602f94702f94802f94902f94a02f94b02f94c02f94d02f94e02f94f02f95002f95102f95202f95302f95402f95502f95602f95702f95802f95902f95a02f95b02f95c02f95d02f95e02f95f02f96002f96102f96202f96302f96402f96502f96602f96702f96802f96902f96a02f96b02f96c02f96d02f96e02f96f02f97002f97102f97202f97302f97402f97502f97602f97702f97802f97902f97a02f97b02f97c02f97d02f97e02f97f02f98002f98102f98202f98302f98402f98502f98602f98702f98802f98902f98a02f98b02f98c02f98d02f98e02f98f02f99002f99102f99202f99302f99402f99502f99602f99702f99802f99902f99a02f99b02f99c02f99d02f99e02f99f02f9a002f9a102f9a202f9a302f9a402f9a502f9a602f9a702f9a802f9a902f9aa02f9ab02f9ac02f9ad02f9ae02f9af02f9b002f9b102f9b202f9b302f9b402f9b502f9b602f9b702f9b802f9b902f9ba02f9bb02f9bc02f9bd02f9be02f9bf02f9c002f9c102f9c202f9c302f9c402f9c502f9c602f9c702f9c802f9c902f9ca02f9cb02f9cc02f9cd02f9ce02f9cf02f9d002f9d102f9d202f9d302f9d402f9d502f9d602f9d702f9d802f9d902f9da02f9db02f9dc02f9dd02f9de02f9df02f9e002f9e102f9e202f9e302f9e402f9e502f9e602f9e702f9e802f9e902f9ea02f9eb02f9ec02f9ed02f9ee02f9ef02f9f002f9f102f9f202f9f302f9f402f9f502f9f602f9f702f9f802f9f902f9fa02f9fb02f9fc02f9fd02f9fe02f9ff02fa0002fa0102fa0202fa0302fa0402fa0502fa0602fa0702fa0802fa0902fa0a02fa0b02fa0c02fa0d02fa0e02fa0f02fa1002fa1102fa1202fa1302fa1402fa1502fa1602fa1702fa1802fa1902fa1a02fa1b02fa1c02fa1d
@@ -0,0 +1,66 @@
1
+ 001100G
2
+ 001101GG
3
+ 001102N
4
+ 001103D
5
+ 001104DD
6
+ 001105R
7
+ 001106M
8
+ 001107B
9
+ 001108BB
10
+ 001109S
11
+ 00110aSS
12
+ 00110cJ
13
+ 00110dJJ
14
+ 00110eC
15
+ 00110fK
16
+ 001110T
17
+ 001111P
18
+ 001112H
19
+ 001161A
20
+ 001162AE
21
+ 001163YA
22
+ 001164YAE
23
+ 001165EO
24
+ 001166E
25
+ 001167YEO
26
+ 001168YE
27
+ 001169O
28
+ 00116aWA
29
+ 00116bWAE
30
+ 00116cOE
31
+ 00116dYO
32
+ 00116eU
33
+ 00116fWEO
34
+ 001170WE
35
+ 001171WI
36
+ 001172YU
37
+ 001173EU
38
+ 001174YI
39
+ 001175I
40
+ 0011a8G
41
+ 0011a9GG
42
+ 0011aaGS
43
+ 0011abN
44
+ 0011acNJ
45
+ 0011adNH
46
+ 0011aeD
47
+ 0011afL
48
+ 0011b0LG
49
+ 0011b1LM
50
+ 0011b2LB
51
+ 0011b3LS
52
+ 0011b4LT
53
+ 0011b5LP
54
+ 0011b6LH
55
+ 0011b7M
56
+ 0011b8B
57
+ 0011b9BS
58
+ 0011baS
59
+ 0011bbSS
60
+ 0011bcNG
61
+ 0011bdJ
62
+ 0011beC
63
+ 0011bfK
64
+ 0011c0T
65
+ 0011c1P
66
+ 0011c2H
data/cdata/names CHANGED
@@ -10969,8 +10969,6 @@
10969
10969
  0033fdIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
10970
10970
  0033feIDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
10971
10971
  0033ffSQUARE GAL
10972
- 003400<CJK Ideograph Extension A, First>
10973
- 004db5<CJK Ideograph Extension A, Last>
10974
10972
  004dc0HEXAGRAM FOR THE CREATIVE HEAVEN
10975
10973
  004dc1HEXAGRAM FOR THE RECEPTIVE EARTH
10976
10974
  004dc2HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
@@ -11035,8 +11033,6 @@
11035
11033
  004dfdHEXAGRAM FOR SMALL PREPONDERANCE
11036
11034
  004dfeHEXAGRAM FOR AFTER COMPLETION
11037
11035
  004dffHEXAGRAM FOR BEFORE COMPLETION
11038
- 004e00<CJK Ideograph, First>
11039
- 009fc3<CJK Ideograph, Last>
11040
11036
  00a000YI SYLLABLE IT
11041
11037
  00a001YI SYLLABLE IX
11042
11038
  00a002YI SYLLABLE I
@@ -13130,16 +13126,6 @@
13130
13126
  00aa5dCHAM PUNCTUATION DANDA
13131
13127
  00aa5eCHAM PUNCTUATION DOUBLE DANDA
13132
13128
  00aa5fCHAM PUNCTUATION TRIPLE DANDA
13133
- 00ac00<Hangul Syllable, First>
13134
- 00d7a3<Hangul Syllable, Last>
13135
- 00d800<Non Private Use High Surrogate, First>
13136
- 00db7f<Non Private Use High Surrogate, Last>
13137
- 00db80<Private Use High Surrogate, First>
13138
- 00dbff<Private Use High Surrogate, Last>
13139
- 00dc00<Low Surrogate, First>
13140
- 00dfff<Low Surrogate, Last>
13141
- 00e000<Private Use, First>
13142
- 00f8ff<Private Use, Last>
13143
13129
  00f900CJK COMPATIBILITY IDEOGRAPH-F900
13144
13130
  00f901CJK COMPATIBILITY IDEOGRAPH-F901
13145
13131
  00f902CJK COMPATIBILITY IDEOGRAPH-F902
@@ -18449,8 +18435,6 @@
18449
18435
  01f091DOMINO TILE VERTICAL-06-04
18450
18436
  01f092DOMINO TILE VERTICAL-06-05
18451
18437
  01f093DOMINO TILE VERTICAL-06-06
18452
- 020000<CJK Ideograph Extension B, First>
18453
- 02a6d6<CJK Ideograph Extension B, Last>
18454
18438
  02f800CJK COMPATIBILITY IDEOGRAPH-2F800
18455
18439
  02f801CJK COMPATIBILITY IDEOGRAPH-2F801
18456
18440
  02f802CJK COMPATIBILITY IDEOGRAPH-2F802
@@ -19330,7 +19314,3 @@
19330
19314
  0e01edVARIATION SELECTOR-254
19331
19315
  0e01eeVARIATION SELECTOR-255
19332
19316
  0e01efVARIATION SELECTOR-256
19333
- 0f0000<Plane 15 Private Use, First>
19334
- 0ffffd<Plane 15 Private Use, Last>
19335
- 100000<Plane 16 Private Use, First>
19336
- 10fffd<Plane 16 Private Use, Last>
@@ -0,0 +1,86 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "unicode_utils/read_multivalued_map"
4
+ require "unicode_utils/hangul_syllable_decomposition"
5
+ require "unicode_utils/combining_class"
6
+
7
+ module UnicodeUtils
8
+
9
+ CANONICAL_DECOMPOSITION_MAP =
10
+ Impl.read_multivalued_map("canonical_decomposition_map") # :nodoc:
11
+
12
+ # Get the canonical decomposition of the given string, also called
13
+ # Normalization Form D or short NFD.
14
+ #
15
+ # The Unicode standard has multiple representations for some
16
+ # characters. One representation as a single codepoint and other
17
+ # representation(s) as a combination of multiple codepoints. This
18
+ # function "decomposes" these characters in +str+ into the latter
19
+ # representation.
20
+ #
21
+ # Example:
22
+ #
23
+ # # LATIN SMALL LETTER A WITH ACUTE => LATIN SMALL LETTER A, COMBINING ACUTE ACCENT
24
+ # UnicodeUtils.canonical_decomposition("\u{E1}") => "\u{61}\u{301}"
25
+ def canonical_decomposition(str)
26
+ res = String.new.force_encoding(str.encoding)
27
+ str.each_codepoint { |cp|
28
+ if cp >= 0xAC00 && cp <= 0xD7A3 # hangul syllable
29
+ Impl.append_hangul_syllable_decomposition(res, cp)
30
+ else
31
+ Impl.append_recursive_canonical_decomposition_mapping(res, cp)
32
+ end
33
+ }
34
+ Impl.put_into_canonical_order(res)
35
+ end
36
+ module_function :canonical_decomposition
37
+
38
+ module Impl # :nodoc:
39
+
40
+ def self.append_recursive_canonical_decomposition_mapping(str, cp)
41
+ mapping = CANONICAL_DECOMPOSITION_MAP[cp]
42
+ if mapping
43
+ mapping.each { |c|
44
+ append_recursive_canonical_decomposition_mapping(str, c)
45
+ }
46
+ else
47
+ str << cp
48
+ end
49
+ end
50
+
51
+ def self.put_into_canonical_order(str)
52
+ reorder_needed = false
53
+ last_cp = nil
54
+ str.each_codepoint { |cp|
55
+ if last_cp
56
+ cc = COMBINING_CLASS_MAP[cp] || 0
57
+ if cc != 0
58
+ if (COMBINING_CLASS_MAP[last_cp] || 0) > cc
59
+ reorder_needed = true
60
+ break
61
+ end
62
+ end
63
+ end
64
+ last_cp = cp
65
+ }
66
+ return str unless reorder_needed
67
+ res = String.new.force_encoding(str.encoding)
68
+ last_cp = nil
69
+ str.each_codepoint { |cp|
70
+ if last_cp
71
+ cc = COMBINING_CLASS_MAP[cp] || 0
72
+ if cc != 0 && (COMBINING_CLASS_MAP[last_cp] || 0) > cc
73
+ res << cp
74
+ cp = nil
75
+ end
76
+ res << last_cp
77
+ end
78
+ last_cp = cp
79
+ }
80
+ res << last_cp if last_cp
81
+ put_into_canonical_order(res)
82
+ end
83
+
84
+ end
85
+
86
+ end
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "unicode_utils/canonical_decomposition"
4
+
5
+ module UnicodeUtils
6
+
7
+ # The strings +a+ and +b+ are canonical equivalents if their
8
+ # canonical decompositions are equal.
9
+ #
10
+ # Example:
11
+ #
12
+ # UnicodeUtils.canonical_equivalents?("Äste", "A\u{308}ste") => true
13
+ # UnicodeUtils.canonical_equivalents?("Äste", "Aste") => false
14
+ def canonical_equivalents?(a, b)
15
+ UnicodeUtils.canonical_decomposition(a) ==
16
+ UnicodeUtils.canonical_decomposition(b)
17
+ end
18
+ module_function :canonical_equivalents?
19
+
20
+ end
@@ -22,7 +22,7 @@ module UnicodeUtils
22
22
 
23
23
  end
24
24
 
25
- COMBINING_CLASS_MAP = Impl.read_combining_class_map # :nodoc:
25
+ COMBINING_CLASS_MAP = Impl.read_combining_class_map() # :nodoc:
26
26
 
27
27
  # Get the combining class of the given character as an integer in
28
28
  # the range 0..255.
@@ -7,9 +7,9 @@ require "unicode_utils/combining_class"
7
7
 
8
8
  module UnicodeUtils
9
9
 
10
- module Impl # :nodoc:
10
+ module Impl # :nodoc:all
11
11
 
12
- class ConditionalCasing # :nodoc:
12
+ class ConditionalCasing
13
13
 
14
14
  attr_reader :mapping
15
15
 
@@ -23,7 +23,7 @@ module UnicodeUtils
23
23
 
24
24
  end
25
25
 
26
- class BeforeDotConditionalCasing < ConditionalCasing # :nodoc:
26
+ class BeforeDotConditionalCasing < ConditionalCasing
27
27
 
28
28
  def context_match?(str, pos)
29
29
  (pos + 1).upto(str.length - 1) { |i|
@@ -37,7 +37,7 @@ module UnicodeUtils
37
37
 
38
38
  end
39
39
 
40
- class NotBeforeDotConditionalCasing < BeforeDotConditionalCasing # :nodoc:
40
+ class NotBeforeDotConditionalCasing < BeforeDotConditionalCasing
41
41
 
42
42
  def context_match?(str, pos)
43
43
  !super
@@ -45,7 +45,7 @@ module UnicodeUtils
45
45
 
46
46
  end
47
47
 
48
- class MoreAboveConditionalCasing < ConditionalCasing # :nodoc:
48
+ class MoreAboveConditionalCasing < ConditionalCasing
49
49
 
50
50
  def context_match?(str, pos)
51
51
  (pos + 1).upto(str.length - 1) { |i|
@@ -59,7 +59,7 @@ module UnicodeUtils
59
59
 
60
60
  end
61
61
 
62
- class AfterIConditionalCasing < ConditionalCasing # :nodoc:
62
+ class AfterIConditionalCasing < ConditionalCasing
63
63
 
64
64
  def context_match?(str, pos)
65
65
  (pos - 1).downto(0) { |i|
@@ -73,7 +73,7 @@ module UnicodeUtils
73
73
 
74
74
  end
75
75
 
76
- class AfterSoftDottedConditionalCasing < ConditionalCasing # :nodoc:
76
+ class AfterSoftDottedConditionalCasing < ConditionalCasing
77
77
 
78
78
  def context_match?(str, pos)
79
79
  (pos - 1).downto(0) { |i|
@@ -87,7 +87,7 @@ module UnicodeUtils
87
87
 
88
88
  end
89
89
 
90
- class FinalSigmaConditionalCasing < ConditionalCasing # :nodoc:
90
+ class FinalSigmaConditionalCasing < ConditionalCasing
91
91
 
92
92
  def context_match?(str, pos)
93
93
  before_match?(str, pos) && !after_match?(str, pos)
@@ -1,12 +1,12 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  require "unicode_utils/simple_downcase"
4
- require "unicode_utils/read_special_casing_map"
4
+ require "unicode_utils/read_multivalued_map"
5
5
  require "unicode_utils/conditional_casing"
6
6
 
7
7
  module UnicodeUtils
8
8
 
9
- SPECIAL_DOWNCASE_MAP = Impl.read_special_casing_map("special_lc_map") # :nodoc:
9
+ SPECIAL_DOWNCASE_MAP = Impl.read_multivalued_map("special_lc_map") # :nodoc:
10
10
 
11
11
  # Perform a full case-conversion of +str+ to lowercase according to
12
12
  # the Unicode standard.
@@ -0,0 +1,44 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module UnicodeUtils
4
+
5
+ # Derives the canonical decomposition of the given Hangul syllable.
6
+ #
7
+ # Example:
8
+ #
9
+ # UnicodeUtils.hangul_syllable_decomposition("\u{d4db}") => "\u{1111}\u{1171}\u{11b6}"
10
+ def hangul_syllable_decomposition(char)
11
+ Impl.append_hangul_syllable_decomposition(
12
+ String.new.force_encoding(char.encoding), char.ord)
13
+ end
14
+ module_function :hangul_syllable_decomposition
15
+
16
+ module Impl # :nodoc:
17
+
18
+ def self.append_hangul_syllable_decomposition(str, s)
19
+ # constants
20
+ sbase = 0xAC00
21
+ lbase = 0x1100
22
+ vbase = 0x1161
23
+ tbase = 0x11A7
24
+ scount = 11172
25
+ lcount = 19
26
+ vcount = 21
27
+ tcount = 28
28
+ ncount = vcount * tcount
29
+
30
+ sindex = s - sbase
31
+ if 0 <= sindex && sindex < scount
32
+ l = lbase + sindex / ncount
33
+ v = vbase + (sindex % ncount) / tcount
34
+ t = tbase + sindex % tcount
35
+ str << l << v
36
+ str << t if t != tbase
37
+ else
38
+ str << s
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "unicode_utils/read_names"
4
+
5
+ module UnicodeUtils
6
+
7
+ JAMO_SHORT_NAME_MAP = Impl.read_names("jamo_short_names") # :nodoc:
8
+
9
+ # The the Jamo Short Name property of the given character (defaults
10
+ # to nil).
11
+ #
12
+ # Example:
13
+ #
14
+ # UnicodeUtils.jamo_short_name("\u{1101}") => "GG"
15
+ def jamo_short_name(char)
16
+ JAMO_SHORT_NAME_MAP[char.ord]
17
+ end
18
+ module_function :jamo_short_name
19
+
20
+ end
@@ -1,33 +1,38 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
- module UnicodeUtils
4
-
5
- module Impl # :nodoc:
3
+ require "unicode_utils/read_names"
4
+ require "unicode_utils/hangul_syllable_decomposition"
5
+ require "unicode_utils/jamo_short_name"
6
6
 
7
- def self.read_names
8
- path = File.join(File.dirname(__FILE__), "..", "..", "cdata", "names")
9
- Hash.new.tap { |map|
10
- File.open(path, "r:US-ASCII:-") do |input|
11
- buffer = "x" * 6
12
- buffer.force_encoding(Encoding::US_ASCII)
13
- while input.read(6, buffer)
14
- map[buffer.to_i(16)] = input.gets.tap { |x| x.chomp! }
15
- end
16
- end
17
- }
18
- end
19
-
20
- end
7
+ module UnicodeUtils
21
8
 
22
- NAME_MAP = Impl.read_names # :nodoc:
9
+ NAME_MAP = Impl.read_names("names") # :nodoc:
23
10
 
24
- # Get the Unicode name of the single codepoint in str.
11
+ # Get the normative Unicode name of the given character.
12
+ #
13
+ # Private Use codepoints have no name, this function returns nil for
14
+ # such codepoints.
15
+ #
16
+ # All control characters have the special name "<control>". All
17
+ # other characters have a unique name.
25
18
  #
26
19
  # Example:
27
20
  #
28
21
  # UnicodeUtils.name "ᾀ" => "GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI"
29
- def name(str)
30
- NAME_MAP[str.codepoints.first]
22
+ # UnicodeUtils.name "\t" => "<control>"
23
+ def name(char)
24
+ cp = char.ord
25
+ NAME_MAP[cp] ||
26
+ case cp
27
+ when 0x3400..0x4DB5, 0x4E00..0x9FC3, 0x20000..0x2A6D6
28
+ "CJK UNIFIED IDEOGRAPH-#{sprintf('%04x', cp).upcase}"
29
+ when 0xAC00..0xD7A3
30
+ "HANGUL SYLLABLE ".tap do |n|
31
+ hangul_syllable_decomposition(char).each_char { |c|
32
+ n << (jamo_short_name(c) || '')
33
+ }
34
+ end
35
+ end
31
36
  end
32
37
  module_function :name
33
38
 
@@ -0,0 +1,142 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "unicode_utils/canonical_decomposition"
4
+ require "unicode_utils/combining_class"
5
+ require "unicode_utils/read_codepoint_set"
6
+
7
+ module UnicodeUtils
8
+
9
+ module Impl # :nodoc:all
10
+
11
+ COMPOSITION_EXCLUSION_SET =
12
+ Impl.read_codepoint_set("composition_exclusion_set")
13
+
14
+ CANONICAL_COMPOSITION_MAP = Hash.new.tap do |m|
15
+ CANONICAL_DECOMPOSITION_MAP.each_pair { |comp, decomp|
16
+ if decomp.length == 2
17
+ (m[decomp[0]] ||= {})[decomp[1]] = comp
18
+ end
19
+ }
20
+ end
21
+
22
+ module NFC
23
+
24
+ def self.starter?(cp)
25
+ (COMBINING_CLASS_MAP[cp] || 0) == 0
26
+ end
27
+
28
+ # does b block c?
29
+ def self.blocked?(b, c)
30
+ # From the standard:
31
+ # "If a combining character sequence is in canonical order,
32
+ # then testing whether a character is blocked requires looking
33
+ # at only the immediately preceding character."
34
+ # cpary is in canonical order (since it comes out of
35
+ # canonical_decomposition).
36
+ (COMBINING_CLASS_MAP[b] || 0) >= (COMBINING_CLASS_MAP[c] || 0)
37
+ end
38
+
39
+ def self.primary_composite?(cp)
40
+ unless CANONICAL_DECOMPOSITION_MAP[cp] ||
41
+ # has hangul syllable decomposition?
42
+ (cp >= 0xAC00 && cp <= 0xD7A3)
43
+ return false
44
+ end
45
+ !COMPOSITION_EXCLUSION_SET.include?(cp)
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+
52
+ # Get +str+ in Normalization Form C.
53
+ #
54
+ # The Unicode standard has multiple representations for some
55
+ # characters. One representation as a single codepoint and other
56
+ # representation(s) as a combination of multiple codepoints. This
57
+ # function "composes" these characters into the former
58
+ # representation.
59
+ #
60
+ # Example:
61
+ #
62
+ # UnicodeUtils.nfc("La\u{308}mpchen") => "Lämpchen"
63
+ def nfc(str)
64
+ str = UnicodeUtils.canonical_decomposition(str)
65
+
66
+ ### constants for hangul composition ###
67
+ sbase = 0xAC00
68
+ lbase = 0x1100
69
+ vbase = 0x1161
70
+ tbase = 0x11A7
71
+ lcount = 19
72
+ vcount = 21
73
+ tcount = 28
74
+ ncount = vcount * tcount
75
+ scount = lcount * ncount
76
+ ########################################
77
+
78
+ String.new.force_encoding(str.encoding).tap do |res|
79
+ last_starter = nil
80
+ uncomposable_non_starters = []
81
+ str.each_codepoint { |cp|
82
+ if Impl::NFC.starter?(cp)
83
+ combined = false
84
+ if last_starter && uncomposable_non_starters.empty?
85
+ ### hangul ###
86
+ lindex = last_starter - lbase
87
+ if 0 <= lindex && lindex < lcount
88
+ vindex = cp - vbase
89
+ if 0 <= vindex && vindex <= vcount
90
+ last_starter =
91
+ sbase + (lindex * vcount + vindex) * tcount
92
+ combined = true
93
+ end
94
+ end
95
+ unless combined
96
+ sindex = last_starter - sbase
97
+ if 0 <= sindex && sindex < scount && (sindex % tcount) == 0
98
+ tindex = cp - tbase
99
+ if 0 <= tindex && tindex < tcount
100
+ last_starter += tindex
101
+ combined = true
102
+ end
103
+ end
104
+ end
105
+ ##############
106
+ unless combined
107
+ map = Impl::CANONICAL_COMPOSITION_MAP[last_starter]
108
+ composition = map && map[cp]
109
+ if composition && Impl::NFC.primary_composite?(composition)
110
+ last_starter = composition
111
+ combined = true
112
+ end
113
+ end
114
+ end
115
+ unless combined
116
+ res << last_starter if last_starter
117
+ uncomposable_non_starters.each { |nc| res << nc }
118
+ uncomposable_non_starters.clear
119
+ last_starter = cp
120
+ end
121
+ else
122
+ last_non_starter = uncomposable_non_starters.last
123
+ if last_non_starter && Impl::NFC.blocked?(last_non_starter, cp)
124
+ uncomposable_non_starters << cp
125
+ else
126
+ map = Impl::CANONICAL_COMPOSITION_MAP[last_starter]
127
+ composition = map && map[cp]
128
+ if composition && Impl::NFC.primary_composite?(composition)
129
+ last_starter = composition
130
+ else
131
+ uncomposable_non_starters << cp
132
+ end
133
+ end
134
+ end
135
+ }
136
+ res << last_starter if last_starter
137
+ uncomposable_non_starters.each { |nc| res << nc }
138
+ end
139
+ end
140
+ module_function :nfc
141
+
142
+ end
@@ -0,0 +1,15 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "unicode_utils/canonical_decomposition"
4
+
5
+ module UnicodeUtils
6
+
7
+ # Get +str+ in Normalization Form D.
8
+ #
9
+ # Alias for UnicodeUtils.canonical_decomposition.
10
+ def nfd(str)
11
+ UnicodeUtils.canonical_decomposition(str)
12
+ end
13
+ module_function :nfd
14
+
15
+ end
@@ -4,7 +4,7 @@ module UnicodeUtils
4
4
 
5
5
  module Impl # :nodoc:
6
6
 
7
- def self.read_special_casing_map(filename)
7
+ def self.read_multivalued_map(filename)
8
8
  path = File.join(File.dirname(__FILE__), "..", "..", "cdata", filename)
9
9
  Hash.new.tap { |map|
10
10
  File.open(path, "r:US-ASCII:-") do |input|
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module UnicodeUtils
4
+
5
+ module Impl # :nodoc:
6
+
7
+ def self.read_names(filename)
8
+ path = File.join(File.dirname(__FILE__), "..", "..", "cdata", filename)
9
+ Hash.new.tap { |map|
10
+ File.open(path, "r:US-ASCII:-") do |input|
11
+ buffer = "x" * 6
12
+ buffer.force_encoding(Encoding::US_ASCII)
13
+ while input.read(6, buffer)
14
+ map[buffer.to_i(16)] = input.gets.tap { |x| x.chomp! }
15
+ end
16
+ end
17
+ }
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -1,12 +1,12 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  require "unicode_utils/simple_upcase"
4
- require "unicode_utils/read_special_casing_map"
4
+ require "unicode_utils/read_multivalued_map"
5
5
  require "unicode_utils/conditional_casing"
6
6
 
7
7
  module UnicodeUtils
8
8
 
9
- SPECIAL_UPCASE_MAP = Impl.read_special_casing_map("special_uc_map") # :nodoc:
9
+ SPECIAL_UPCASE_MAP = Impl.read_multivalued_map("special_uc_map") # :nodoc:
10
10
 
11
11
  # Perform a full case-conversion of +str+ to uppercase according to
12
12
  # the Unicode standard.
@@ -3,6 +3,6 @@
3
3
  module UnicodeUtils
4
4
 
5
5
  # Corresponds to the unicode_utils gem version.
6
- VERSION = "0.2.0"
6
+ VERSION = "0.3.0"
7
7
 
8
8
  end
data/lib/unicode_utils.rb CHANGED
@@ -13,3 +13,21 @@ require "unicode_utils/cased_char_q"
13
13
  require "unicode_utils/case_ignorable_char_q"
14
14
  require "unicode_utils/soft_dotted_char_q"
15
15
  require "unicode_utils/combining_class"
16
+ require "unicode_utils/hangul_syllable_decomposition"
17
+ require "unicode_utils/jamo_short_name"
18
+ require "unicode_utils/canonical_decomposition"
19
+ require "unicode_utils/nfd"
20
+ require "unicode_utils/canonical_equivalents_q"
21
+ require "unicode_utils/nfc"
22
+
23
+ # Read the README[link:files/README_txt.html] for an introduction.
24
+ #
25
+ # Highlevel functions are:
26
+ #
27
+ # UnicodeUtils.upcase:: full conversion to uppercase
28
+ # UnicodeUtils.downcase:: full conversion to lowercase
29
+ # UnicodeUtils.nfd:: Normalization Form D
30
+ # UnicodeUtils.nfc:: Normalization Form C
31
+ # UnicodeUtils.name:: character names
32
+ module UnicodeUtils
33
+ end
@@ -0,0 +1,75 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "test/unit"
4
+
5
+ require "unicode_utils/nfd"
6
+ require "unicode_utils/nfc"
7
+
8
+ # See data/NormalizationTest.txt
9
+ class TestNormalization < Test::Unit::TestCase
10
+
11
+ class Record
12
+ def initialize(ary)
13
+ @ary = ary
14
+ end
15
+ def c1
16
+ @ary[0]
17
+ end
18
+ def c2
19
+ @ary[1]
20
+ end
21
+ def c3
22
+ @ary[2]
23
+ end
24
+ def c4
25
+ @ary[3]
26
+ end
27
+ def c5
28
+ @ary[4]
29
+ end
30
+ end
31
+
32
+ def each_testdata_record
33
+ fn = File.join(File.dirname(__FILE__),
34
+ "..", "data", "NormalizationTest.txt")
35
+ File.open(fn, "r:utf-8:-") do |input|
36
+ input.each_line { |line|
37
+ if line =~ /^([^#]*)#/
38
+ line = $1
39
+ end
40
+ line.strip!
41
+ next if line.empty? || line =~ /^@Part/
42
+ columns = line.split(";")
43
+ ary = columns.map { |column|
44
+ String.new.force_encoding(Encoding::UTF_8).tap do |str|
45
+ column.split(" ").each { |c|
46
+ str << c.strip.to_i(16)
47
+ }
48
+ end
49
+ }
50
+ yield Record.new(ary)
51
+ }
52
+ end
53
+ end
54
+
55
+ def test_nfd
56
+ each_testdata_record { |r|
57
+ assert_equal r.c3, UnicodeUtils.nfd(r.c1)
58
+ assert_equal r.c3, UnicodeUtils.nfd(r.c2)
59
+ assert_equal r.c3, UnicodeUtils.nfd(r.c3)
60
+ assert_equal r.c5, UnicodeUtils.nfd(r.c4)
61
+ assert_equal r.c5, UnicodeUtils.nfd(r.c5)
62
+ }
63
+ end
64
+
65
+ def test_nfc
66
+ each_testdata_record { |r|
67
+ assert_equal r.c2, UnicodeUtils.nfc(r.c1)
68
+ assert_equal r.c2, UnicodeUtils.nfc(r.c2)
69
+ assert_equal r.c2, UnicodeUtils.nfc(r.c3)
70
+ assert_equal r.c4, UnicodeUtils.nfc(r.c4)
71
+ assert_equal r.c4, UnicodeUtils.nfc(r.c5)
72
+ }
73
+ end
74
+
75
+ end
@@ -9,6 +9,12 @@ class TestUnicodeUtils < Test::Unit::TestCase
9
9
  def test_name
10
10
  assert_equal "LATIN SMALL LETTER F", UnicodeUtils.name("f")
11
11
  assert_equal Encoding::US_ASCII, UnicodeUtils.name("f").encoding
12
+ assert_equal nil, UnicodeUtils.name("\u{e000}") # private use
13
+ assert_equal "<control>", UnicodeUtils.name("\t")
14
+ assert_equal "CJK UNIFIED IDEOGRAPH-4E00", UnicodeUtils.name("\u{4e00}")
15
+ assert_equal "CJK UNIFIED IDEOGRAPH-2A6D6", UnicodeUtils.name("\u{2a6d6}")
16
+ assert_equal "CJK UNIFIED IDEOGRAPH-2A3D6", UnicodeUtils.name("\u{2a3d6}")
17
+ assert_equal "HANGUL SYLLABLE PWILH", UnicodeUtils.name("\u{d4db}")
12
18
  end
13
19
 
14
20
  def test_simple_upcase
@@ -104,4 +110,32 @@ class TestUnicodeUtils < Test::Unit::TestCase
104
110
  assert_equal false, UnicodeUtils.soft_dotted_char?("a")
105
111
  end
106
112
 
113
+ def test_hangul_syllable_decomposition
114
+ assert_equal "\u{1111}\u{1171}\u{11b6}", UnicodeUtils.hangul_syllable_decomposition("\u{d4db}")
115
+ end
116
+
117
+ def test_jamo_short_name
118
+ assert_equal "GG", UnicodeUtils.jamo_short_name("\u{1101}")
119
+ end
120
+
121
+ def test_canonical_decomposition
122
+ assert_equal "\u{61}\u{301}",
123
+ UnicodeUtils.canonical_decomposition("\u{E1}")
124
+ assert_equal "\u{61}\u{301}\u{63}\u{327}\u{301}",
125
+ UnicodeUtils.canonical_decomposition("\u{e1}\u{63}\u{301}\u{327}")
126
+ end
127
+
128
+ def test_nfd
129
+ assert_equal "\u{61}\u{301}", UnicodeUtils.nfd("\u{E1}")
130
+ end
131
+
132
+ def test_canonical_equivalents?
133
+ assert_equal true, UnicodeUtils.canonical_equivalents?("Äste", "A\u{308}ste")
134
+ assert_equal false, UnicodeUtils.canonical_equivalents?("Äste", "Aste")
135
+ end
136
+
137
+ def test_nfc
138
+ assert_equal "Häschen", UnicodeUtils.nfc("Ha\u{308}schen")
139
+ end
140
+
107
141
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unicode_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Lang
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-11-02 00:00:00 +01:00
12
+ date: 2008-11-16 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -22,20 +22,27 @@ extensions: []
22
22
  extra_rdoc_files:
23
23
  - README.txt
24
24
  files:
25
- - lib/unicode_utils/read_special_casing_map.rb
26
25
  - lib/unicode_utils/conditional_casing.rb
26
+ - lib/unicode_utils/hangul_syllable_decomposition.rb
27
27
  - lib/unicode_utils/simple_downcase.rb
28
28
  - lib/unicode_utils/read_codepoint_map.rb
29
+ - lib/unicode_utils/read_names.rb
29
30
  - lib/unicode_utils/read_codepoint_set.rb
30
31
  - lib/unicode_utils/titlecase_char_q.rb
31
32
  - lib/unicode_utils/cased_char_q.rb
32
33
  - lib/unicode_utils/downcase.rb
33
34
  - lib/unicode_utils/name.rb
34
35
  - lib/unicode_utils/uppercase_char_q.rb
36
+ - lib/unicode_utils/read_multivalued_map.rb
37
+ - lib/unicode_utils/canonical_equivalents_q.rb
38
+ - lib/unicode_utils/canonical_decomposition.rb
35
39
  - lib/unicode_utils/upcase.rb
40
+ - lib/unicode_utils/nfc.rb
41
+ - lib/unicode_utils/nfd.rb
36
42
  - lib/unicode_utils/case_ignorable_char_q.rb
37
43
  - lib/unicode_utils/simple_upcase.rb
38
44
  - lib/unicode_utils/lowercase_char_q.rb
45
+ - lib/unicode_utils/jamo_short_name.rb
39
46
  - lib/unicode_utils/combining_class.rb
40
47
  - lib/unicode_utils/version.rb
41
48
  - lib/unicode_utils/soft_dotted_char_q.rb
@@ -48,11 +55,15 @@ files:
48
55
  - cdata/names
49
56
  - cdata/cond_uc_map
50
57
  - cdata/special_uc_map
58
+ - cdata/canonical_decomposition_map
51
59
  - cdata/soft_dotted_set
52
60
  - cdata/simple_lc_map
53
61
  - cdata/case_ignorable_set
62
+ - cdata/composition_exclusion_set
54
63
  - cdata/simple_uc_map
64
+ - cdata/jamo_short_names
55
65
  - cdata/prop_set_uppercase
66
+ - test/test_normalization.rb
56
67
  - test/test_unicode_utils.rb
57
68
  - README.txt
58
69
  - LICENSE.txt
@@ -78,10 +89,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
89
  version:
79
90
  requirements: []
80
91
 
81
- rubyforge_project:
92
+ rubyforge_project: unicode-utils
82
93
  rubygems_version: 1.3.1
83
94
  signing_key:
84
95
  specification_version: 2
85
96
  summary: additional Unicode aware functions for Ruby 1.9
86
97
  test_files:
98
+ - test/test_normalization.rb
87
99
  - test/test_unicode_utils.rb