# This file was created from a script. const toLowerRanges = [ 0x00041, 0x0005A, 532, 0x000C0, 0x000D6, 532, 0x000D8, 0x000DE, 532, 0x00189, 0x0018A, 705, 0x001B1, 0x001B2, 717, 0x00388, 0x0038A, 537, 0x0038E, 0x0038F, 563, 0x00391, 0x003A1, 532, 0x003A3, 0x003AB, 532, 0x003FD, 0x003FF, 370, 0x00400, 0x0040F, 580, 0x00410, 0x0042F, 532, 0x00531, 0x00556, 548, 0x010A0, 0x010C5, 7764, 0x013A0, 0x013EF, 39364, 0x013F0, 0x013F5, 508, 0x01C90, 0x01CBA, -2508, 0x01CBD, 0x01CBF, -2508, 0x01F08, 0x01F0F, 492, 0x01F18, 0x01F1D, 492, 0x01F28, 0x01F2F, 492, 0x01F38, 0x01F3F, 492, 0x01F48, 0x01F4D, 492, 0x01F68, 0x01F6F, 492, 0x01F88, 0x01F8F, 492, 0x01F98, 0x01F9F, 492, 0x01FA8, 0x01FAF, 492, 0x01FB8, 0x01FB9, 492, 0x01FBA, 0x01FBB, 426, 0x01FC8, 0x01FCB, 414, 0x01FD8, 0x01FD9, 492, 0x01FDA, 0x01FDB, 400, 0x01FE8, 0x01FE9, 492, 0x01FEA, 0x01FEB, 388, 0x01FF8, 0x01FF9, 372, 0x01FFA, 0x01FFB, 374, 0x02C00, 0x02C2E, 548, 0x02C7E, 0x02C7F, -10315, 0x0FF21, 0x0FF3A, 532, 0x10400, 0x10427, 540, 0x104B0, 0x104D3, 540, 0x10C80, 0x10CB2, 564, 0x118A0, 0x118BF, 532, 0x16E40, 0x16E5F, 532, 0x1E900, 0x1E921, 534, ] toLowerSinglets = [ 0x00100, 501, 0x00102, 501, 0x00104, 501, 0x00106, 501, 0x00108, 501, 0x0010A, 501, 0x0010C, 501, 0x0010E, 501, 0x00110, 501, 0x00112, 501, 0x00114, 501, 0x00116, 501, 0x00118, 501, 0x0011A, 501, 0x0011C, 501, 0x0011E, 501, 0x00120, 501, 0x00122, 501, 0x00124, 501, 0x00126, 501, 0x00128, 501, 0x0012A, 501, 0x0012C, 501, 0x0012E, 501, 0x00130, 301, 0x00132, 501, 0x00134, 501, 0x00136, 501, 0x00139, 501, 0x0013B, 501, 0x0013D, 501, 0x0013F, 501, 0x00141, 501, 0x00143, 501, 0x00145, 501, 0x00147, 501, 0x0014A, 501, 0x0014C, 501, 0x0014E, 501, 0x00150, 501, 0x00152, 501, 0x00154, 501, 0x00156, 501, 0x00158, 501, 0x0015A, 501, 0x0015C, 501, 0x0015E, 501, 0x00160, 501, 0x00162, 501, 0x00164, 501, 0x00166, 501, 0x00168, 501, 0x0016A, 501, 0x0016C, 501, 0x0016E, 501, 0x00170, 501, 0x00172, 501, 0x00174, 501, 0x00176, 501, 0x00178, 379, 0x00179, 501, 0x0017B, 501, 0x0017D, 501, 0x00181, 710, 0x00182, 501, 0x00184, 501, 0x00186, 706, 0x00187, 501, 0x0018B, 501, 0x0018E, 579, 0x0018F, 702, 0x00190, 703, 0x00191, 501, 0x00193, 705, 0x00194, 707, 0x00196, 711, 0x00197, 709, 0x00198, 501, 0x0019C, 711, 0x0019D, 713, 0x0019F, 714, 0x001A0, 501, 0x001A2, 501, 0x001A4, 501, 0x001A6, 718, 0x001A7, 501, 0x001A9, 718, 0x001AC, 501, 0x001AE, 718, 0x001AF, 501, 0x001B3, 501, 0x001B5, 501, 0x001B7, 719, 0x001B8, 501, 0x001BC, 501, 0x001C4, 502, 0x001C5, 501, 0x001C7, 502, 0x001C8, 501, 0x001CA, 502, 0x001CB, 501, 0x001CD, 501, 0x001CF, 501, 0x001D1, 501, 0x001D3, 501, 0x001D5, 501, 0x001D7, 501, 0x001D9, 501, 0x001DB, 501, 0x001DE, 501, 0x001E0, 501, 0x001E2, 501, 0x001E4, 501, 0x001E6, 501, 0x001E8, 501, 0x001EA, 501, 0x001EC, 501, 0x001EE, 501, 0x001F1, 502, 0x001F2, 501, 0x001F4, 501, 0x001F6, 403, 0x001F7, 444, 0x001F8, 501, 0x001FA, 501, 0x001FC, 501, 0x001FE, 501, 0x00200, 501, 0x00202, 501, 0x00204, 501, 0x00206, 501, 0x00208, 501, 0x0020A, 501, 0x0020C, 501, 0x0020E, 501, 0x00210, 501, 0x00212, 501, 0x00214, 501, 0x00216, 501, 0x00218, 501, 0x0021A, 501, 0x0021C, 501, 0x0021E, 501, 0x00220, 370, 0x00222, 501, 0x00224, 501, 0x00226, 501, 0x00228, 501, 0x0022A, 501, 0x0022C, 501, 0x0022E, 501, 0x00230, 501, 0x00232, 501, 0x0023A, 11295, 0x0023B, 501, 0x0023D, 337, 0x0023E, 11292, 0x00241, 501, 0x00243, 305, 0x00244, 569, 0x00245, 571, 0x00246, 501, 0x00248, 501, 0x0024A, 501, 0x0024C, 501, 0x0024E, 501, 0x00370, 501, 0x00372, 501, 0x00376, 501, 0x0037F, 616, 0x00386, 538, 0x0038C, 564, 0x003CF, 508, 0x003D8, 501, 0x003DA, 501, 0x003DC, 501, 0x003DE, 501, 0x003E0, 501, 0x003E2, 501, 0x003E4, 501, 0x003E6, 501, 0x003E8, 501, 0x003EA, 501, 0x003EC, 501, 0x003EE, 501, 0x003F4, 440, 0x003F7, 501, 0x003F9, 493, 0x003FA, 501, 0x00460, 501, 0x00462, 501, 0x00464, 501, 0x00466, 501, 0x00468, 501, 0x0046A, 501, 0x0046C, 501, 0x0046E, 501, 0x00470, 501, 0x00472, 501, 0x00474, 501, 0x00476, 501, 0x00478, 501, 0x0047A, 501, 0x0047C, 501, 0x0047E, 501, 0x00480, 501, 0x0048A, 501, 0x0048C, 501, 0x0048E, 501, 0x00490, 501, 0x00492, 501, 0x00494, 501, 0x00496, 501, 0x00498, 501, 0x0049A, 501, 0x0049C, 501, 0x0049E, 501, 0x004A0, 501, 0x004A2, 501, 0x004A4, 501, 0x004A6, 501, 0x004A8, 501, 0x004AA, 501, 0x004AC, 501, 0x004AE, 501, 0x004B0, 501, 0x004B2, 501, 0x004B4, 501, 0x004B6, 501, 0x004B8, 501, 0x004BA, 501, 0x004BC, 501, 0x004BE, 501, 0x004C0, 515, 0x004C1, 501, 0x004C3, 501, 0x004C5, 501, 0x004C7, 501, 0x004C9, 501, 0x004CB, 501, 0x004CD, 501, 0x004D0, 501, 0x004D2, 501, 0x004D4, 501, 0x004D6, 501, 0x004D8, 501, 0x004DA, 501, 0x004DC, 501, 0x004DE, 501, 0x004E0, 501, 0x004E2, 501, 0x004E4, 501, 0x004E6, 501, 0x004E8, 501, 0x004EA, 501, 0x004EC, 501, 0x004EE, 501, 0x004F0, 501, 0x004F2, 501, 0x004F4, 501, 0x004F6, 501, 0x004F8, 501, 0x004FA, 501, 0x004FC, 501, 0x004FE, 501, 0x00500, 501, 0x00502, 501, 0x00504, 501, 0x00506, 501, 0x00508, 501, 0x0050A, 501, 0x0050C, 501, 0x0050E, 501, 0x00510, 501, 0x00512, 501, 0x00514, 501, 0x00516, 501, 0x00518, 501, 0x0051A, 501, 0x0051C, 501, 0x0051E, 501, 0x00520, 501, 0x00522, 501, 0x00524, 501, 0x00526, 501, 0x00528, 501, 0x0052A, 501, 0x0052C, 501, 0x0052E, 501, 0x010C7, 7764, 0x010CD, 7764, 0x01E00, 501, 0x01E02, 501, 0x01E04, 501, 0x01E06, 501, 0x01E08, 501, 0x01E0A, 501, 0x01E0C, 501, 0x01E0E, 501, 0x01E10, 501, 0x01E12, 501, 0x01E14, 501, 0x01E16, 501, 0x01E18, 501, 0x01E1A, 501, 0x01E1C, 501, 0x01E1E, 501, 0x01E20, 501, 0x01E22, 501, 0x01E24, 501, 0x01E26, 501, 0x01E28, 501, 0x01E2A, 501, 0x01E2C, 501, 0x01E2E, 501, 0x01E30, 501, 0x01E32, 501, 0x01E34, 501, 0x01E36, 501, 0x01E38, 501, 0x01E3A, 501, 0x01E3C, 501, 0x01E3E, 501, 0x01E40, 501, 0x01E42, 501, 0x01E44, 501, 0x01E46, 501, 0x01E48, 501, 0x01E4A, 501, 0x01E4C, 501, 0x01E4E, 501, 0x01E50, 501, 0x01E52, 501, 0x01E54, 501, 0x01E56, 501, 0x01E58, 501, 0x01E5A, 501, 0x01E5C, 501, 0x01E5E, 501, 0x01E60, 501, 0x01E62, 501, 0x01E64, 501, 0x01E66, 501, 0x01E68, 501, 0x01E6A, 501, 0x01E6C, 501, 0x01E6E, 501, 0x01E70, 501, 0x01E72, 501, 0x01E74, 501, 0x01E76, 501, 0x01E78, 501, 0x01E7A, 501, 0x01E7C, 501, 0x01E7E, 501, 0x01E80, 501, 0x01E82, 501, 0x01E84, 501, 0x01E86, 501, 0x01E88, 501, 0x01E8A, 501, 0x01E8C, 501, 0x01E8E, 501, 0x01E90, 501, 0x01E92, 501, 0x01E94, 501, 0x01E9E, -7115, 0x01EA0, 501, 0x01EA2, 501, 0x01EA4, 501, 0x01EA6, 501, 0x01EA8, 501, 0x01EAA, 501, 0x01EAC, 501, 0x01EAE, 501, 0x01EB0, 501, 0x01EB2, 501, 0x01EB4, 501, 0x01EB6, 501, 0x01EB8, 501, 0x01EBA, 501, 0x01EBC, 501, 0x01EBE, 501, 0x01EC0, 501, 0x01EC2, 501, 0x01EC4, 501, 0x01EC6, 501, 0x01EC8, 501, 0x01ECA, 501, 0x01ECC, 501, 0x01ECE, 501, 0x01ED0, 501, 0x01ED2, 501, 0x01ED4, 501, 0x01ED6, 501, 0x01ED8, 501, 0x01EDA, 501, 0x01EDC, 501, 0x01EDE, 501, 0x01EE0, 501, 0x01EE2, 501, 0x01EE4, 501, 0x01EE6, 501, 0x01EE8, 501, 0x01EEA, 501, 0x01EEC, 501, 0x01EEE, 501, 0x01EF0, 501, 0x01EF2, 501, 0x01EF4, 501, 0x01EF6, 501, 0x01EF8, 501, 0x01EFA, 501, 0x01EFC, 501, 0x01EFE, 501, 0x01F59, 492, 0x01F5B, 492, 0x01F5D, 492, 0x01F5F, 492, 0x01FBC, 491, 0x01FCC, 491, 0x01FEC, 493, 0x01FFC, 491, 0x02126, -7017, 0x0212A, -7883, 0x0212B, -7762, 0x02132, 528, 0x02183, 501, 0x02C60, 501, 0x02C62, -10243, 0x02C63, -3314, 0x02C64, -10227, 0x02C67, 501, 0x02C69, 501, 0x02C6B, 501, 0x02C6D, -10280, 0x02C6E, -10249, 0x02C6F, -10283, 0x02C70, -10282, 0x02C72, 501, 0x02C75, 501, 0x02C80, 501, 0x02C82, 501, 0x02C84, 501, 0x02C86, 501, 0x02C88, 501, 0x02C8A, 501, 0x02C8C, 501, 0x02C8E, 501, 0x02C90, 501, 0x02C92, 501, 0x02C94, 501, 0x02C96, 501, 0x02C98, 501, 0x02C9A, 501, 0x02C9C, 501, 0x02C9E, 501, 0x02CA0, 501, 0x02CA2, 501, 0x02CA4, 501, 0x02CA6, 501, 0x02CA8, 501, 0x02CAA, 501, 0x02CAC, 501, 0x02CAE, 501, 0x02CB0, 501, 0x02CB2, 501, 0x02CB4, 501, 0x02CB6, 501, 0x02CB8, 501, 0x02CBA, 501, 0x02CBC, 501, 0x02CBE, 501, 0x02CC0, 501, 0x02CC2, 501, 0x02CC4, 501, 0x02CC6, 501, 0x02CC8, 501, 0x02CCA, 501, 0x02CCC, 501, 0x02CCE, 501, 0x02CD0, 501, 0x02CD2, 501, 0x02CD4, 501, 0x02CD6, 501, 0x02CD8, 501, 0x02CDA, 501, 0x02CDC, 501, 0x02CDE, 501, 0x02CE0, 501, 0x02CE2, 501, 0x02CEB, 501, 0x02CED, 501, 0x02CF2, 501, 0x0A640, 501, 0x0A642, 501, 0x0A644, 501, 0x0A646, 501, 0x0A648, 501, 0x0A64A, 501, 0x0A64C, 501, 0x0A64E, 501, 0x0A650, 501, 0x0A652, 501, 0x0A654, 501, 0x0A656, 501, 0x0A658, 501, 0x0A65A, 501, 0x0A65C, 501, 0x0A65E, 501, 0x0A660, 501, 0x0A662, 501, 0x0A664, 501, 0x0A666, 501, 0x0A668, 501, 0x0A66A, 501, 0x0A66C, 501, 0x0A680, 501, 0x0A682, 501, 0x0A684, 501, 0x0A686, 501, 0x0A688, 501, 0x0A68A, 501, 0x0A68C, 501, 0x0A68E, 501, 0x0A690, 501, 0x0A692, 501, 0x0A694, 501, 0x0A696, 501, 0x0A698, 501, 0x0A69A, 501, 0x0A722, 501, 0x0A724, 501, 0x0A726, 501, 0x0A728, 501, 0x0A72A, 501, 0x0A72C, 501, 0x0A72E, 501, 0x0A732, 501, 0x0A734, 501, 0x0A736, 501, 0x0A738, 501, 0x0A73A, 501, 0x0A73C, 501, 0x0A73E, 501, 0x0A740, 501, 0x0A742, 501, 0x0A744, 501, 0x0A746, 501, 0x0A748, 501, 0x0A74A, 501, 0x0A74C, 501, 0x0A74E, 501, 0x0A750, 501, 0x0A752, 501, 0x0A754, 501, 0x0A756, 501, 0x0A758, 501, 0x0A75A, 501, 0x0A75C, 501, 0x0A75E, 501, 0x0A760, 501, 0x0A762, 501, 0x0A764, 501, 0x0A766, 501, 0x0A768, 501, 0x0A76A, 501, 0x0A76C, 501, 0x0A76E, 501, 0x0A779, 501, 0x0A77B, 501, 0x0A77D, -34832, 0x0A77E, 501, 0x0A780, 501, 0x0A782, 501, 0x0A784, 501, 0x0A786, 501, 0x0A78B, 501, 0x0A78D, -41780, 0x0A790, 501, 0x0A792, 501, 0x0A796, 501, 0x0A798, 501, 0x0A79A, 501, 0x0A79C, 501, 0x0A79E, 501, 0x0A7A0, 501, 0x0A7A2, 501, 0x0A7A4, 501, 0x0A7A6, 501, 0x0A7A8, 501, 0x0A7AA, -41808, 0x0A7AB, -41819, 0x0A7AC, -41815, 0x0A7AD, -41805, 0x0A7AE, -41808, 0x0A7B0, -41758, 0x0A7B1, -41782, 0x0A7B2, -41761, 0x0A7B3, 1428, 0x0A7B4, 501, 0x0A7B6, 501, 0x0A7B8, 501, 0x0A7BA, 501, 0x0A7BC, 501, 0x0A7BE, 501, 0x0A7C2, 501, 0x0A7C4, 452, 0x0A7C5, -41807, 0x0A7C6, -34884, ] toUpperRanges = [ 0x00061, 0x0007A, 468, 0x000E0, 0x000F6, 468, 0x000F8, 0x000FE, 468, 0x0023F, 0x00240, 11315, 0x00256, 0x00257, 295, 0x0028A, 0x0028B, 283, 0x0037B, 0x0037D, 630, 0x003AD, 0x003AF, 463, 0x003B1, 0x003C1, 468, 0x003C3, 0x003CB, 468, 0x003CD, 0x003CE, 437, 0x00430, 0x0044F, 468, 0x00450, 0x0045F, 420, 0x00561, 0x00586, 452, 0x010D0, 0x010FA, 3508, 0x010FD, 0x010FF, 3508, 0x013F8, 0x013FD, 492, 0x01C83, 0x01C84, -5742, 0x01F00, 0x01F07, 508, 0x01F10, 0x01F15, 508, 0x01F20, 0x01F27, 508, 0x01F30, 0x01F37, 508, 0x01F40, 0x01F45, 508, 0x01F60, 0x01F67, 508, 0x01F70, 0x01F71, 574, 0x01F72, 0x01F75, 586, 0x01F76, 0x01F77, 600, 0x01F78, 0x01F79, 628, 0x01F7A, 0x01F7B, 612, 0x01F7C, 0x01F7D, 626, 0x01F80, 0x01F87, 508, 0x01F90, 0x01F97, 508, 0x01FA0, 0x01FA7, 508, 0x01FB0, 0x01FB1, 508, 0x01FD0, 0x01FD1, 508, 0x01FE0, 0x01FE1, 508, 0x02C30, 0x02C5E, 452, 0x02D00, 0x02D25, -6764, 0x0AB70, 0x0ABBF, -38364, 0x0FF41, 0x0FF5A, 468, 0x10428, 0x1044F, 460, 0x104D8, 0x104FB, 460, 0x10CC0, 0x10CF2, 436, 0x118C0, 0x118DF, 468, 0x16E60, 0x16E7F, 468, 0x1E922, 0x1E943, 466, ] toUpperSinglets = [ 0x000B5, 1243, 0x000FF, 621, 0x00101, 499, 0x00103, 499, 0x00105, 499, 0x00107, 499, 0x00109, 499, 0x0010B, 499, 0x0010D, 499, 0x0010F, 499, 0x00111, 499, 0x00113, 499, 0x00115, 499, 0x00117, 499, 0x00119, 499, 0x0011B, 499, 0x0011D, 499, 0x0011F, 499, 0x00121, 499, 0x00123, 499, 0x00125, 499, 0x00127, 499, 0x00129, 499, 0x0012B, 499, 0x0012D, 499, 0x0012F, 499, 0x00131, 268, 0x00133, 499, 0x00135, 499, 0x00137, 499, 0x0013A, 499, 0x0013C, 499, 0x0013E, 499, 0x00140, 499, 0x00142, 499, 0x00144, 499, 0x00146, 499, 0x00148, 499, 0x0014B, 499, 0x0014D, 499, 0x0014F, 499, 0x00151, 499, 0x00153, 499, 0x00155, 499, 0x00157, 499, 0x00159, 499, 0x0015B, 499, 0x0015D, 499, 0x0015F, 499, 0x00161, 499, 0x00163, 499, 0x00165, 499, 0x00167, 499, 0x00169, 499, 0x0016B, 499, 0x0016D, 499, 0x0016F, 499, 0x00171, 499, 0x00173, 499, 0x00175, 499, 0x00177, 499, 0x0017A, 499, 0x0017C, 499, 0x0017E, 499, 0x0017F, 200, 0x00180, 695, 0x00183, 499, 0x00185, 499, 0x00188, 499, 0x0018C, 499, 0x00192, 499, 0x00195, 597, 0x00199, 499, 0x0019A, 663, 0x0019E, 630, 0x001A1, 499, 0x001A3, 499, 0x001A5, 499, 0x001A8, 499, 0x001AD, 499, 0x001B0, 499, 0x001B4, 499, 0x001B6, 499, 0x001B9, 499, 0x001BD, 499, 0x001BF, 556, 0x001C5, 499, 0x001C6, 498, 0x001C8, 499, 0x001C9, 498, 0x001CB, 499, 0x001CC, 498, 0x001CE, 499, 0x001D0, 499, 0x001D2, 499, 0x001D4, 499, 0x001D6, 499, 0x001D8, 499, 0x001DA, 499, 0x001DC, 499, 0x001DD, 421, 0x001DF, 499, 0x001E1, 499, 0x001E3, 499, 0x001E5, 499, 0x001E7, 499, 0x001E9, 499, 0x001EB, 499, 0x001ED, 499, 0x001EF, 499, 0x001F2, 499, 0x001F3, 498, 0x001F5, 499, 0x001F9, 499, 0x001FB, 499, 0x001FD, 499, 0x001FF, 499, 0x00201, 499, 0x00203, 499, 0x00205, 499, 0x00207, 499, 0x00209, 499, 0x0020B, 499, 0x0020D, 499, 0x0020F, 499, 0x00211, 499, 0x00213, 499, 0x00215, 499, 0x00217, 499, 0x00219, 499, 0x0021B, 499, 0x0021D, 499, 0x0021F, 499, 0x00223, 499, 0x00225, 499, 0x00227, 499, 0x00229, 499, 0x0022B, 499, 0x0022D, 499, 0x0022F, 499, 0x00231, 499, 0x00233, 499, 0x0023C, 499, 0x00242, 499, 0x00247, 499, 0x00249, 499, 0x0024B, 499, 0x0024D, 499, 0x0024F, 499, 0x00250, 11283, 0x00251, 11280, 0x00252, 11282, 0x00253, 290, 0x00254, 294, 0x00259, 298, 0x0025B, 297, 0x0025C, 42819, 0x00260, 295, 0x00261, 42815, 0x00263, 293, 0x00265, 42780, 0x00266, 42808, 0x00268, 291, 0x00269, 289, 0x0026A, 42808, 0x0026B, 11243, 0x0026C, 42805, 0x0026F, 289, 0x00271, 11249, 0x00272, 287, 0x00275, 286, 0x0027D, 11227, 0x00280, 282, 0x00282, 42807, 0x00283, 282, 0x00287, 42782, 0x00288, 282, 0x00289, 431, 0x0028C, 429, 0x00292, 281, 0x0029D, 42761, 0x0029E, 42758, 0x00371, 499, 0x00373, 499, 0x00377, 499, 0x003AC, 462, 0x003C2, 469, 0x003CC, 436, 0x003D0, 438, 0x003D1, 443, 0x003D5, 453, 0x003D6, 446, 0x003D7, 492, 0x003D9, 499, 0x003DB, 499, 0x003DD, 499, 0x003DF, 499, 0x003E1, 499, 0x003E3, 499, 0x003E5, 499, 0x003E7, 499, 0x003E9, 499, 0x003EB, 499, 0x003ED, 499, 0x003EF, 499, 0x003F0, 414, 0x003F1, 420, 0x003F2, 507, 0x003F3, 384, 0x003F5, 404, 0x003F8, 499, 0x003FB, 499, 0x00461, 499, 0x00463, 499, 0x00465, 499, 0x00467, 499, 0x00469, 499, 0x0046B, 499, 0x0046D, 499, 0x0046F, 499, 0x00471, 499, 0x00473, 499, 0x00475, 499, 0x00477, 499, 0x00479, 499, 0x0047B, 499, 0x0047D, 499, 0x0047F, 499, 0x00481, 499, 0x0048B, 499, 0x0048D, 499, 0x0048F, 499, 0x00491, 499, 0x00493, 499, 0x00495, 499, 0x00497, 499, 0x00499, 499, 0x0049B, 499, 0x0049D, 499, 0x0049F, 499, 0x004A1, 499, 0x004A3, 499, 0x004A5, 499, 0x004A7, 499, 0x004A9, 499, 0x004AB, 499, 0x004AD, 499, 0x004AF, 499, 0x004B1, 499, 0x004B3, 499, 0x004B5, 499, 0x004B7, 499, 0x004B9, 499, 0x004BB, 499, 0x004BD, 499, 0x004BF, 499, 0x004C2, 499, 0x004C4, 499, 0x004C6, 499, 0x004C8, 499, 0x004CA, 499, 0x004CC, 499, 0x004CE, 499, 0x004CF, 485, 0x004D1, 499, 0x004D3, 499, 0x004D5, 499, 0x004D7, 499, 0x004D9, 499, 0x004DB, 499, 0x004DD, 499, 0x004DF, 499, 0x004E1, 499, 0x004E3, 499, 0x004E5, 499, 0x004E7, 499, 0x004E9, 499, 0x004EB, 499, 0x004ED, 499, 0x004EF, 499, 0x004F1, 499, 0x004F3, 499, 0x004F5, 499, 0x004F7, 499, 0x004F9, 499, 0x004FB, 499, 0x004FD, 499, 0x004FF, 499, 0x00501, 499, 0x00503, 499, 0x00505, 499, 0x00507, 499, 0x00509, 499, 0x0050B, 499, 0x0050D, 499, 0x0050F, 499, 0x00511, 499, 0x00513, 499, 0x00515, 499, 0x00517, 499, 0x00519, 499, 0x0051B, 499, 0x0051D, 499, 0x0051F, 499, 0x00521, 499, 0x00523, 499, 0x00525, 499, 0x00527, 499, 0x00529, 499, 0x0052B, 499, 0x0052D, 499, 0x0052F, 499, 0x01C80, -5754, 0x01C81, -5753, 0x01C82, -5744, 0x01C85, -5743, 0x01C86, -5736, 0x01C87, -5681, 0x01C88, 35766, 0x01D79, 35832, 0x01D7D, 4314, 0x01D8E, 35884, 0x01E01, 499, 0x01E03, 499, 0x01E05, 499, 0x01E07, 499, 0x01E09, 499, 0x01E0B, 499, 0x01E0D, 499, 0x01E0F, 499, 0x01E11, 499, 0x01E13, 499, 0x01E15, 499, 0x01E17, 499, 0x01E19, 499, 0x01E1B, 499, 0x01E1D, 499, 0x01E1F, 499, 0x01E21, 499, 0x01E23, 499, 0x01E25, 499, 0x01E27, 499, 0x01E29, 499, 0x01E2B, 499, 0x01E2D, 499, 0x01E2F, 499, 0x01E31, 499, 0x01E33, 499, 0x01E35, 499, 0x01E37, 499, 0x01E39, 499, 0x01E3B, 499, 0x01E3D, 499, 0x01E3F, 499, 0x01E41, 499, 0x01E43, 499, 0x01E45, 49nx">err.Error()) log.Printf("Using defaults ...\n") bindConfig() return } viper.WatchConfig() viper.OnConfigChange(func(e fsnotify.Event) { log.Printf("Config file change detected. Reloading...\n") bindConfig() initLogging() }) bindConfig() } func initLogging() { confObj.Mu.RLock() if confObj.StdoutLogging { log.SetOutput(os.Stdout) } else { logfile, err := os.OpenFile(confObj.LogFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600) errLog("Could not open log file: ", err) // Listen for the signal to close the log file // in a separate thread. Passing it as an argument // to prevent race conditions when the config is // reloaded. go func(logfile *os.File) { <-closeLog log.Printf("Closing log file ...\n\n") errLog("Could not close log file: ", logfile.Close()) }(logfile) log.SetOutput(logfile) } confObj.Mu.RUnlock() } func setConfigDefaults() { viper.SetDefault("ListenPort", 9001) viper.SetDefault("LogFile", "getwtxt.log") viper.SetDefault("DatabasePath", "getwtxt.db") viper.SetDefault("AssetsDirectory", "assets") viper.SetDefault("DatabaseType", "leveldb") viper.SetDefault("StdoutLogging", false) viper.SetDefault("ReCacheInterval", "1h") viper.SetDefault("DatabasePushInterval", "5m") viper.SetDefault("Instance.SiteName", "getwtxt") viper.SetDefault("Instance.OwnerName", "Anonymous Microblogger") viper.SetDefault("Instance.Email", "nobody@knows") viper.SetDefault("Instance.URL", "https://twtxt.example.com") viper.SetDefault("Instance.Description", "A fast, resilient twtxt registry server written in Go!") } func parseConfigFlag() { if *flagConfFile == "" { viper.SetConfigName("getwtxt") viper.SetConfigType("yml") viper.AddConfigPath(".") viper.AddConfigPath("/usr/local/getwtxt") viper.AddConfigPath("/etc") viper.AddConfigPath("/usr/local/etc") } else { path, file := filepath.Split(*flagConfFile) if path == "" { path = "." } filename := strings.Split(file, ".") viper.SetConfigName(filename[0]) viper.SetConfigType(filename[1]) viper.AddConfigPath(path) } } func bindConfig() { confObj.Mu.Lock() confObj.Port = viper.GetInt("ListenPort") confObj.LogFile = viper.GetString("LogFile") confObj.DBType = strings.ToLower(viper.GetString("DatabaseType")) if *flagDBType != "" { confObj.DBType = *flagDBType } confObj.DBPath = viper.GetString("DatabasePath") if *flagDBPath != "" { confObj.DBPath = *flagDBPath } log.Printf("Using %v database: %v\n", confObj.DBType, confObj.DBPath) confObj.AssetsDir = viper.GetString("AssetsDirectory") if *flagAssets != "" { confObj.AssetsDir = *flagAssets } confObj