#include #include #include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" namespace { constexpr int kErrInvalidAddress = static_cast(0x80BC0031u); constexpr int kErrInvalidUserId = static_cast(0x80BC0010u); constexpr std::array BaseVirtualKeys = { 255, 255, 255, 255, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 13, 27, 8, 9, 32, 187, 219, 221, 186, 191, 191, 192, 222, 220, 188, 190, 189, 20, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 44, 145, 19, 45, 36, 33, 46, 35, 34, 39, 37, 40, 38, 144, 111, 106, 109, 107, 13, 97, 98, 99, 100, 101, 102, 103, 104, 105, 96, 110, 226, 93, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 12, 255, 255, 255, 255, 255, 255, 255, 162, 160, 164, 91, 163, 161, 165, 92, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, }; constexpr auto VirtualKeys = [] { std::array, 39> layouts{}; for (auto& layout : layouts) layout = BaseVirtualKeys; layouts[1][28] = 90; layouts[1][29] = 89; layouts[1][45] = 189; layouts[1][46] = 221; layouts[1][47] = 186; layouts[1][48] = 187; layouts[2][28] = 90; layouts[2][29] = 89; layouts[2][45] = 219; layouts[2][46] = 221; layouts[2][47] = 186; layouts[2][48] = 192; layouts[2][49] = 223; layouts[2][50] = 223; layouts[2][51] = 222; layouts[2][52] = 220; layouts[2][53] = 191; layouts[3][45] = 189; layouts[3][46] = 187; layouts[3][47] = 219; layouts[3][48] = 221; layouts[3][49] = 220; layouts[3][50] = 220; layouts[3][51] = 186; layouts[3][53] = 192; layouts[3][56] = 191; layouts[3][100] = 255; layouts[4][45] = 189; layouts[4][46] = 187; layouts[4][47] = 219; layouts[4][48] = 221; layouts[4][49] = 222; layouts[4][50] = 222; layouts[4][51] = 186; layouts[4][52] = 192; layouts[4][53] = 223; layouts[4][56] = 191; layouts[5][45] = 219; layouts[5][46] = 221; layouts[5][47] = 186; layouts[5][48] = 187; layouts[6][45] = 219; layouts[6][46] = 221; layouts[6][47] = 186; layouts[6][48] = 187; layouts[6][100] = 255; layouts[8][4] = 81; layouts[8][16] = 188; layouts[8][20] = 65; layouts[8][26] = 90; layouts[8][29] = 87; layouts[8][45] = 219; layouts[8][46] = 187; layouts[8][49] = 220; layouts[8][50] = 220; layouts[8][51] = 77; layouts[8][52] = 192; layouts[8][53] = 222; layouts[8][54] = 190; layouts[8][55] = 191; layouts[8][56] = 223; layouts[9][4] = 81; layouts[9][16] = 188; layouts[9][20] = 65; layouts[9][26] = 90; layouts[9][29] = 87; layouts[9][45] = 219; layouts[9][46] = 189; layouts[9][49] = 220; layouts[9][50] = 220; layouts[9][51] = 77; layouts[9][52] = 192; layouts[9][53] = 222; layouts[9][54] = 190; layouts[9][55] = 191; layouts[9][56] = 187; layouts[10][45] = 189; layouts[10][46] = 187; layouts[10][47] = 219; layouts[10][48] = 221; layouts[10][49] = 220; layouts[10][50] = 220; layouts[10][51] = 186; layouts[10][52] = 192; layouts[10][53] = 222; layouts[10][56] = 191; layouts[11] = layouts[2]; layouts[12] = layouts[5]; layouts[13][45] = 219; layouts[13][46] = 191; layouts[13][49] = 220; layouts[13][50] = 220; layouts[13][51] = 187; layouts[13][52] = 192; layouts[13][53] = 222; layouts[15][46] = 191; layouts[15][47] = 219; layouts[15][48] = 221; layouts[15][49] = 220; layouts[15][50] = 220; layouts[15][51] = 186; layouts[15][53] = 192; layouts[16][45] = 189; layouts[16][46] = 187; layouts[16][47] = 219; layouts[16][48] = 221; layouts[16][49] = 220; layouts[16][50] = 220; layouts[16][51] = 186; layouts[16][53] = 192; layouts[16][56] = 191; layouts[17] = layouts[5]; layouts[18] = layouts[3]; layouts[20][45] = 223; layouts[20][46] = 189; layouts[20][47] = 219; layouts[20][48] = 221; layouts[20][49] = 188; layouts[20][50] = 188; layouts[20][51] = 186; layouts[20][52] = 190; layouts[20][53] = 192; layouts[20][54] = 191; layouts[20][55] = 220; layouts[20][56] = 190; layouts[21][45] = 189; layouts[21][46] = 222; layouts[21][47] = 192; layouts[21][48] = 219; layouts[21][49] = 221; layouts[21][50] = 221; layouts[21][51] = 187; layouts[21][52] = 186; layouts[21][53] = 243; layouts[21][56] = 191; layouts[21][100] = 255; layouts[21][135] = 226; layouts[21][136] = 242; layouts[21][137] = 220; layouts[21][138] = 28; layouts[21][139] = 247; layouts[22] = layouts[21]; layouts[23][45] = 189; layouts[23][46] = 187; layouts[23][47] = 219; layouts[23][48] = 221; layouts[23][49] = 220; layouts[23][50] = 220; layouts[23][51] = 186; layouts[23][53] = 192; layouts[23][56] = 191; layouts[23][136] = 21; layouts[23][138] = 25; layouts[24] = layouts[3]; layouts[25] = layouts[3]; layouts[26] = layouts[3]; layouts[27] = layouts[3]; layouts[28] = layouts[3]; layouts[29] = layouts[16]; layouts[30] = layouts[16]; layouts[31][28] = 90; layouts[31][29] = 89; layouts[31][46] = 191; layouts[31][47] = 219; layouts[31][48] = 221; layouts[31][49] = 220; layouts[31][50] = 220; layouts[31][51] = 186; layouts[31][53] = 192; layouts[32] = layouts[16]; layouts[33] = layouts[16]; layouts[34] = layouts[16]; layouts[35] = layouts[16]; layouts[36][28] = 90; layouts[36][29] = 89; layouts[36][39] = 192; layouts[36][45] = 191; layouts[36][46] = 187; layouts[36][47] = 219; layouts[36][48] = 221; layouts[36][49] = 220; layouts[36][50] = 220; layouts[36][51] = 186; layouts[36][53] = 48; layouts[37] = layouts[3]; layouts[38] = layouts[3]; return layouts; }(); constexpr int kErrInvalidKeyboardType = static_cast(0x80BC001Du); constexpr auto CharacterTables = [] { std::array, 111> tables{}; tables[1][4] = 327777; tables[1][5] = 327778; tables[1][6] = 327779; tables[1][7] = 327780; tables[1][8] = 327781; tables[1][9] = 327782; tables[1][10] = 327783; tables[1][11] = 327784; tables[1][12] = 327785; tables[1][13] = 327786; tables[1][14] = 327787; tables[1][15] = 327788; tables[1][16] = 327789; tables[1][17] = 327790; tables[1][18] = 327791; tables[1][19] = 327792; tables[1][20] = 327793; tables[1][21] = 327794; tables[1][22] = 327795; tables[1][23] = 327796; tables[1][24] = 327797; tables[1][25] = 327798; tables[1][26] = 327799; tables[1][27] = 327800; tables[1][28] = 327802; tables[1][29] = 327801; tables[1][30] = 262193; tables[1][31] = 262194; tables[1][32] = 262195; tables[1][33] = 262196; tables[1][34] = 262197; tables[1][35] = 262198; tables[1][36] = 262199; tables[1][37] = 262200; tables[1][38] = 262201; tables[1][39] = 262192; tables[1][40] = 262154; tables[1][42] = 262152; tables[1][43] = 262153; tables[1][44] = 262176; tables[1][45] = 262183; tables[1][46] = 262238; tables[1][47] = 262396; tables[1][48] = 262312; tables[1][49] = 262180; tables[1][50] = 262180; tables[1][51] = 262390; tables[1][52] = 262372; tables[1][53] = 262311; tables[1][54] = 262188; tables[1][55] = 262190; tables[1][56] = 262189; tables[1][83] = 393299; tables[1][84] = 393263; tables[1][85] = 393258; tables[1][86] = 393261; tables[1][87] = 393259; tables[1][88] = 393226; tables[1][89] = 393293; tables[1][90] = 393297; tables[1][91] = 393294; tables[1][92] = 393296; tables[1][93] = 393309; tables[1][94] = 393295; tables[1][95] = 393290; tables[1][96] = 393298; tables[1][97] = 393291; tables[1][98] = 393289; tables[1][99] = 393292; tables[1][100] = 262204; tables[1][103] = 393277; tables[1][133] = 393260; tables[1][134] = 393277; tables[1][140] = 393260; tables[2] = tables[1]; tables[2][4] = 327745; tables[2][5] = 327746; tables[2][6] = 327747; tables[2][7] = 327748; tables[2][8] = 327749; tables[2][9] = 327750; tables[2][10] = 327751; tables[2][11] = 327752; tables[2][12] = 327753; tables[2][13] = 327754; tables[2][14] = 327755; tables[2][15] = 327756; tables[2][16] = 327757; tables[2][17] = 327758; tables[2][18] = 327759; tables[2][19] = 327760; tables[2][20] = 327761; tables[2][21] = 327762; tables[2][22] = 327763; tables[2][23] = 327764; tables[2][24] = 327765; tables[2][25] = 327766; tables[2][26] = 327767; tables[2][27] = 327768; tables[2][28] = 327770; tables[2][29] = 327769; tables[2][30] = 262187; tables[2][31] = 262178; tables[2][32] = 262186; tables[2][33] = 262375; tables[2][34] = 262181; tables[2][35] = 262182; tables[2][36] = 262191; tables[2][37] = 262184; tables[2][38] = 262185; tables[2][39] = 262205; tables[2][45] = 262207; tables[2][46] = 262240; tables[2][47] = 262376; tables[2][48] = 262177; tables[2][49] = 262307; tables[2][50] = 262307; tables[2][51] = 262377; tables[2][52] = 262368; tables[2][53] = 262320; tables[2][54] = 262203; tables[2][55] = 262202; tables[2][56] = 262239; tables[2][89] = 393265; tables[2][90] = 393266; tables[2][91] = 393267; tables[2][92] = 393268; tables[2][93] = 393269; tables[2][94] = 393270; tables[2][95] = 393271; tables[2][96] = 393272; tables[2][97] = 393273; tables[2][98] = 393264; tables[2][99] = 393262; tables[2][100] = 262206; tables[3][8] = 336044; tables[3][30] = 262310; tables[3][31] = 262208; tables[3][32] = 262179; tables[3][33] = 262320; tables[3][34] = 262311; tables[3][35] = 262316; tables[3][36] = 262268; tables[3][37] = 262306; tables[3][45] = 262324; tables[3][46] = 262270; tables[3][47] = 262235; tables[3][48] = 262237; tables[3][49] = 262269; tables[3][50] = 262269; tables[3][52] = 262267; tables[3][100] = 262236; tables[3][136] = 262324; tables[3][137] = 262324; tables[3][138] = 262324; tables[3][146] = 262324; tables[3][147] = 262324; tables[4] = tables[1]; tables[4][28] = 327801; tables[4][29] = 327802; tables[4][45] = 262189; tables[4][46] = 262205; tables[4][47] = 262235; tables[4][48] = 262237; tables[4][49] = 262236; tables[4][50] = 262236; tables[4][51] = 262203; tables[4][52] = 262183; tables[4][53] = 262240; tables[4][56] = 262191; tables[4][100] = 262236; tables[5] = tables[2]; tables[5][28] = 327769; tables[5][29] = 327770; tables[5][30] = 262177; tables[5][31] = 262208; tables[5][32] = 262179; tables[5][33] = 262180; tables[5][35] = 262238; tables[5][36] = 262182; tables[5][37] = 262186; tables[5][38] = 262184; tables[5][39] = 262185; tables[5][45] = 262239; tables[5][46] = 262187; tables[5][47] = 262267; tables[5][48] = 262269; tables[5][49] = 262268; tables[5][50] = 262268; tables[5][51] = 262202; tables[5][52] = 262178; tables[5][53] = 262270; tables[5][54] = 262204; tables[5][55] = 262206; tables[5][56] = 262207; tables[5][100] = 262268; tables[6][34] = 270508; tables[7] = tables[1]; tables[7][4] = 393025; tables[7][5] = 393026; tables[7][6] = 393027; tables[7][7] = 393028; tables[7][8] = 393029; tables[7][9] = 393030; tables[7][10] = 393031; tables[7][11] = 393032; tables[7][12] = 393033; tables[7][13] = 393034; tables[7][14] = 393035; tables[7][15] = 393036; tables[7][16] = 393037; tables[7][17] = 393038; tables[7][18] = 393039; tables[7][19] = 393040; tables[7][20] = 393041; tables[7][21] = 393042; tables[7][22] = 393043; tables[7][23] = 393044; tables[7][24] = 393045; tables[7][25] = 393046; tables[7][26] = 393047; tables[7][27] = 393048; tables[7][28] = 393049; tables[7][29] = 393050; tables[7][30] = 327441; tables[7][31] = 327442; tables[7][32] = 327443; tables[7][33] = 327444; tables[7][34] = 327445; tables[7][35] = 327446; tables[7][36] = 327447; tables[7][37] = 327448; tables[7][38] = 327449; tables[7][39] = 327440; tables[7][44] = 274432; tables[7][45] = 327437; tables[7][46] = 327486; tables[7][47] = 327456; tables[7][48] = 327483; tables[7][49] = 327485; tables[7][50] = 327485; tables[7][51] = 327451; tables[7][52] = 327450; tables[7][53] = 0; tables[7][54] = 327436; tables[7][55] = 327438; tables[7][56] = 327439; tables[7][100] = 0; tables[7][135] = 327653; tables[8] = tables[2]; tables[8][4] = 392993; tables[8][5] = 392994; tables[8][6] = 392995; tables[8][7] = 392996; tables[8][8] = 392997; tables[8][9] = 392998; tables[8][10] = 392999; tables[8][11] = 393000; tables[8][12] = 393001; tables[8][13] = 393002; tables[8][14] = 393003; tables[8][15] = 393004; tables[8][16] = 393005; tables[8][17] = 393006; tables[8][18] = 393007; tables[8][19] = 393008; tables[8][20] = 393009; tables[8][21] = 393010; tables[8][22] = 393011; tables[8][23] = 393012; tables[8][24] = 393013; tables[8][25] = 393014; tables[8][26] = 393015; tables[8][27] = 393016; tables[8][28] = 393017; tables[8][29] = 393018; tables[8][30] = 327425; tables[8][31] = 270364; tables[8][32] = 327427; tables[8][33] = 327428; tables[8][34] = 327429; tables[8][35] = 327430; tables[8][36] = 270360; tables[8][37] = 327432; tables[8][38] = 327433; tables[8][39] = 0; tables[8][45] = 327453; tables[8][46] = 327518; tables[8][47] = 327488; tables[8][48] = 327515; tables[8][49] = 327517; tables[8][50] = 327517; tables[8][51] = 327435; tables[8][52] = 327434; tables[8][53] = 0; tables[8][54] = 327452; tables[8][55] = 327454; tables[8][56] = 327455; tables[8][100] = 0; tables[8][135] = 327487; tables[8][137] = 327516; tables[9] = tables[4]; tables[9][46] = 262238; tables[9][47] = 262208; tables[9][48] = 262235; tables[9][49] = 262237; tables[9][50] = 262237; tables[9][52] = 262202; tables[9][53] = 0; tables[9][100] = 0; tables[9][135] = 262236; tables[9][137] = 262309; tables[10] = tables[5]; tables[10][31] = 262178; tables[10][35] = 262182; tables[10][36] = 262183; tables[10][37] = 262184; tables[10][38] = 262185; tables[10][39] = 0; tables[10][45] = 262205; tables[10][46] = 262270; tables[10][47] = 262240; tables[10][48] = 262267; tables[10][49] = 262269; tables[10][50] = 262269; tables[10][51] = 262187; tables[10][52] = 262186; tables[10][53] = 0; tables[10][100] = 0; tables[10][135] = 262239; tables[10][137] = 262268; tables[11] = tables[9]; tables[11][4] = 274625; tables[11][5] = 274611; tables[11][6] = 274621; tables[11][7] = 274615; tables[11][8] = 274596; tables[11][9] = 274639; tables[11][10] = 274605; tables[11][11] = 274607; tables[11][12] = 274635; tables[11][13] = 274654; tables[11][14] = 274638; tables[11][15] = 274666; tables[11][16] = 274658; tables[11][17] = 274655; tables[11][18] = 274665; tables[11][19] = 274619; tables[11][20] = 274623; tables[11][21] = 274617; tables[11][22] = 274632; tables[11][23] = 274603; tables[11][24] = 274634; tables[11][25] = 274642; tables[11][26] = 274630; tables[11][27] = 274613; tables[11][28] = 274675; tables[11][29] = 274628; tables[11][30] = 274636; tables[11][31] = 274645; tables[11][32] = 274594; tables[11][33] = 274598; tables[11][34] = 274600; tables[11][35] = 274602; tables[11][36] = 274660; tables[11][37] = 274662; tables[11][38] = 274664; tables[11][39] = 274671; tables[11][45] = 274651; tables[11][46] = 274648; tables[11][47] = 274587; tables[11][48] = 274588; tables[11][49] = 274656; tables[11][50] = 274656; tables[11][51] = 274668; tables[11][52] = 274609; tables[11][54] = 274637; tables[11][55] = 274667; tables[11][56] = 274657; tables[11][135] = 274669; tables[11][137] = 274684; tables[12] = tables[11]; tables[12][8] = 274595; tables[12][29] = 274627; tables[12][32] = 274593; tables[12][33] = 274597; tables[12][34] = 274599; tables[12][35] = 274601; tables[12][36] = 274659; tables[12][37] = 274661; tables[12][38] = 274663; tables[12][39] = 274674; tables[12][48] = 274444; tables[12][49] = 274445; tables[12][50] = 274445; tables[12][54] = 274433; tables[12][55] = 274434; tables[12][56] = 274683; tables[12][89] = 393265; tables[12][90] = 393266; tables[12][91] = 393267; tables[12][92] = 393268; tables[12][93] = 393269; tables[12][94] = 393270; tables[12][95] = 393271; tables[12][96] = 393272; tables[12][97] = 393273; tables[12][98] = 393264; tables[12][99] = 393262; tables[13] = tables[9]; tables[13][4] = 327553; tables[13][5] = 327546; tables[13][6] = 327551; tables[13][7] = 327548; tables[13][8] = 327538; tables[13][9] = 327562; tables[13][10] = 327543; tables[13][11] = 327544; tables[13][12] = 327558; tables[13][13] = 327567; tables[13][14] = 327561; tables[13][15] = 327576; tables[13][16] = 327571; tables[13][17] = 327568; tables[13][18] = 327575; tables[13][19] = 327550; tables[13][20] = 327552; tables[13][21] = 327549; tables[13][22] = 327556; tables[13][23] = 327542; tables[13][24] = 327557; tables[13][25] = 327563; tables[13][26] = 327555; tables[13][27] = 327547; tables[13][28] = 327581; tables[13][29] = 327554; tables[13][30] = 327559; tables[13][31] = 327564; tables[13][32] = 327537; tables[13][33] = 327539; tables[13][34] = 327540; tables[13][35] = 327541; tables[13][36] = 327572; tables[13][37] = 327573; tables[13][38] = 327574; tables[13][39] = 327580; tables[13][45] = 327566; tables[13][46] = 327565; tables[13][47] = 327582; tables[13][48] = 327583; tables[13][49] = 327569; tables[13][50] = 327569; tables[13][51] = 327578; tables[13][52] = 327545; tables[13][54] = 327560; tables[13][55] = 327577; tables[13][56] = 327570; tables[13][135] = 327579; tables[13][137] = 327536; tables[14] = tables[13]; tables[14][8] = 327528; tables[14][29] = 327535; tables[14][32] = 327527; tables[14][33] = 327529; tables[14][34] = 327530; tables[14][35] = 327531; tables[14][36] = 327532; tables[14][37] = 327533; tables[14][38] = 327534; tables[14][39] = 327526; tables[14][48] = 327522; tables[14][49] = 327523; tables[14][50] = 327523; tables[14][54] = 327524; tables[14][55] = 327521; tables[14][56] = 327525; tables[14][89] = 393265; tables[14][90] = 393266; tables[14][91] = 393267; tables[14][92] = 393268; tables[14][93] = 393269; tables[14][94] = 393270; tables[14][95] = 393271; tables[14][96] = 393272; tables[14][97] = 393273; tables[14][98] = 393264; tables[14][99] = 393262; tables[15] = tables[11]; tables[15][4] = 274529; tables[15][5] = 274515; tables[15][6] = 274525; tables[15][7] = 274519; tables[15][8] = 274500; tables[15][9] = 274543; tables[15][10] = 274509; tables[15][11] = 274511; tables[15][12] = 274539; tables[15][13] = 274558; tables[15][14] = 274542; tables[15][15] = 274570; tables[15][16] = 274562; tables[15][17] = 274559; tables[15][18] = 274569; tables[15][19] = 274523; tables[15][20] = 274527; tables[15][21] = 274521; tables[15][22] = 274536; tables[15][23] = 274507; tables[15][24] = 274538; tables[15][25] = 274546; tables[15][26] = 274534; tables[15][27] = 274517; tables[15][28] = 274579; tables[15][29] = 274532; tables[15][30] = 274540; tables[15][31] = 274549; tables[15][32] = 274498; tables[15][33] = 274502; tables[15][34] = 274504; tables[15][35] = 274506; tables[15][36] = 274564; tables[15][37] = 274566; tables[15][38] = 274568; tables[15][39] = 274575; tables[15][45] = 274555; tables[15][46] = 274552; tables[15][49] = 274560; tables[15][50] = 274560; tables[15][51] = 274572; tables[15][52] = 274513; tables[15][54] = 274541; tables[15][55] = 274571; tables[15][56] = 274561; tables[15][135] = 274573; tables[16] = tables[15]; tables[16][8] = 274499; tables[16][29] = 274531; tables[16][32] = 274497; tables[16][33] = 274501; tables[16][34] = 274503; tables[16][35] = 274505; tables[16][36] = 274563; tables[16][37] = 274565; tables[16][38] = 274567; tables[16][39] = 274578; tables[16][48] = 274444; tables[16][49] = 274445; tables[16][50] = 274445; tables[16][54] = 274433; tables[16][55] = 274434; tables[16][56] = 274683; tables[16][89] = 393265; tables[16][90] = 393266; tables[16][91] = 393267; tables[16][92] = 393268; tables[16][93] = 393269; tables[16][94] = 393270; tables[16][95] = 393271; tables[16][96] = 393272; tables[16][97] = 393273; tables[16][98] = 393264; tables[16][99] = 393262; tables[17] = tables[1]; tables[17][30] = 327729; tables[17][31] = 327730; tables[17][32] = 327731; tables[17][33] = 327732; tables[17][34] = 327733; tables[17][35] = 327734; tables[17][36] = 327735; tables[17][37] = 327736; tables[17][38] = 327737; tables[17][39] = 327728; tables[17][45] = 327903; tables[17][46] = 262324; tables[17][47] = 327932; tables[17][48] = 327723; tables[17][49] = 327715; tables[17][50] = 327715; tables[17][51] = 327926; tables[17][52] = 327908; tables[17][53] = 262238; tables[17][54] = 327724; tables[17][55] = 327726; tables[17][136] = 262238; tables[17][137] = 262238; tables[17][138] = 262238; tables[17][146] = 262238; tables[17][147] = 262238; tables[18] = tables[2]; tables[18][30] = 327713; tables[18][31] = 327714; tables[18][32] = 327847; tables[18][33] = 327716; tables[18][34] = 327717; tables[18][35] = 327718; tables[18][36] = 327727; tables[18][37] = 327720; tables[18][38] = 327721; tables[18][39] = 327741; tables[18][45] = 327743; tables[18][47] = 327900; tables[18][48] = 327722; tables[18][49] = 327719; tables[18][50] = 327719; tables[18][51] = 327894; tables[18][52] = 327876; tables[18][54] = 327739; tables[18][55] = 327738; tables[19][8] = 336044; tables[19][16] = 327861; tables[19][20] = 327744; tables[19][31] = 327858; tables[19][32] = 327859; tables[19][36] = 327803; tables[19][37] = 327771; tables[19][38] = 327773; tables[19][39] = 327805; tables[19][45] = 327772; tables[19][48] = 327806; tables[19][100] = 262268; tables[20] = tables[1]; tables[20][28] = 327801; tables[20][29] = 327802; tables[20][46] = 262305; tables[20][47] = 262240; tables[20][48] = 262187; tables[20][49] = 327911; tables[20][50] = 327911; tables[20][51] = 327921; tables[20][52] = 262324; tables[20][53] = 262330; tables[21] = tables[2]; tables[21][28] = 327769; tables[21][29] = 327770; tables[21][30] = 262177; tables[21][32] = 262327; tables[21][33] = 262180; tables[21][46] = 262335; tables[21][47] = 262238; tables[21][48] = 262186; tables[21][49] = 327879; tables[21][50] = 327879; tables[21][51] = 327889; tables[21][52] = 262312; tables[21][53] = 262314; tables[22] = tables[3]; tables[22][30] = 262268; tables[22][33] = 262270; tables[22][34] = 262272; tables[22][36] = 0; tables[22][37] = 0; tables[22][45] = 0; tables[22][46] = 0; tables[22][49] = 327805; tables[22][50] = 327805; tables[22][53] = 262236; tables[22][100] = 0; tables[22][136] = 262270; tables[22][137] = 262270; tables[22][138] = 262270; tables[22][146] = 262270; tables[22][147] = 262270; tables[23] = tables[17]; tables[23][4] = 327793; tables[23][16] = 327724; tables[23][20] = 327777; tables[23][26] = 327802; tables[23][28] = 327801; tables[23][29] = 327799; tables[23][30] = 327718; tables[23][31] = 327913; tables[23][32] = 327714; tables[23][33] = 327719; tables[23][34] = 327720; tables[23][35] = 327725; tables[23][36] = 327912; tables[23][37] = 327775; tables[23][38] = 327911; tables[23][39] = 327904; tables[23][45] = 327721; tables[23][46] = 327741; tables[23][47] = 327774; tables[23][48] = 327716; tables[23][49] = 327722; tables[23][50] = 327722; tables[23][51] = 327789; tables[23][52] = 327929; tables[23][53] = 262322; tables[23][54] = 327739; tables[23][55] = 327738; tables[23][56] = 327713; tables[24] = tables[21]; tables[24][4] = 327761; tables[24][16] = 327743; tables[24][20] = 327745; tables[24][26] = 327770; tables[24][29] = 327767; tables[24][30] = 327729; tables[24][31] = 327730; tables[24][32] = 327731; tables[24][33] = 327732; tables[24][34] = 327733; tables[24][35] = 327734; tables[24][36] = 327735; tables[24][37] = 327736; tables[24][38] = 327737; tables[24][39] = 327728; tables[24][45] = 327856; tables[24][46] = 327723; tables[24][47] = 327848; tables[24][48] = 327843; tables[24][49] = 327861; tables[24][50] = 327861; tables[24][51] = 327757; tables[24][52] = 327717; tables[24][53] = 0; tables[24][54] = 327726; tables[24][55] = 327727; tables[24][56] = 327847; tables[24][136] = 262312; tables[24][137] = 262312; tables[24][138] = 262312; tables[24][146] = 262312; tables[24][147] = 262312; tables[25][8] = 336044; tables[25][31] = 262270; tables[25][32] = 327715; tables[25][33] = 327803; tables[25][34] = 327771; tables[25][35] = 327804; tables[25][36] = 262240; tables[25][37] = 327772; tables[25][38] = 327774; tables[25][39] = 327744; tables[25][45] = 327773; tables[25][46] = 327805; tables[25][48] = 327844; tables[25][136] = 262270; tables[25][137] = 262270; tables[25][138] = 262270; tables[25][146] = 262270; tables[25][147] = 262270; tables[26] = tables[20]; tables[26][46] = 262380; tables[26][47] = 262376; tables[26][49] = 262393; tables[26][50] = 262393; tables[26][51] = 262386; tables[26][52] = 262368; tables[26][53] = 262236; tables[27] = tables[21]; tables[27][32] = 262307; tables[27][46] = 262238; tables[27][47] = 262377; tables[27][49] = 262311; tables[27][50] = 262311; tables[27][51] = 262375; tables[27][52] = 262320; tables[27][53] = 262268; tables[28] = tables[6]; tables[28][8] = 336044; tables[28][47] = 262235; tables[28][48] = 262237; tables[28][51] = 262208; tables[28][52] = 262179; tables[29][47] = 262267; tables[29][48] = 262269; tables[30] = tables[20]; tables[30][45] = 262191; tables[30][46] = 262320; tables[30][47] = 262312; tables[30][48] = 262186; tables[30][49] = 262204; tables[30][50] = 262204; tables[30][51] = 262187; tables[30][53] = 262208; tables[30][100] = 262237; tables[31] = tables[21]; tables[31][32] = 262179; tables[31][36] = 262239; tables[31][39] = 262183; tables[31][46] = 262270; tables[31][48] = 262268; tables[31][49] = 262206; tables[31][50] = 262206; tables[31][51] = 262321; tables[31][52] = 262240; tables[31][53] = 262311; tables[31][56] = 262205; tables[31][100] = 262235; tables[31][136] = 262270; tables[31][137] = 262270; tables[31][138] = 262270; tables[31][146] = 262270; tables[31][147] = 262270; tables[32][6] = 327842; tables[32][8] = 336044; tables[32][16] = 327861; tables[32][21] = 327862; tables[32][22] = 327903; tables[32][27] = 327867; tables[32][29] = 327851; tables[32][30] = 262329; tables[32][31] = 262322; tables[32][32] = 262323; tables[32][33] = 262332; tables[32][34] = 262333; tables[32][35] = 262334; tables[32][36] = 262307; tables[32][37] = 262267; tables[32][38] = 262269; tables[32][45] = 262236; tables[32][46] = 262328; tables[32][53] = 262316; tables[32][55] = 262327; tables[32][100] = 262310; tables[32][136] = 262328; tables[32][137] = 262328; tables[32][138] = 262328; tables[32][146] = 262328; tables[32][147] = 262328; tables[33] = tables[26]; tables[33][46] = 262315; tables[33][47] = 262187; tables[33][48] = 262324; tables[33][49] = 262270; tables[33][50] = 262270; tables[33][51] = 327911; tables[33][52] = 262330; tables[34] = tables[27]; tables[34][32] = 262179; tables[34][46] = 262331; tables[34][47] = 262186; tables[34][48] = 262240; tables[34][49] = 262238; tables[34][50] = 262238; tables[34][51] = 327879; tables[34][52] = 262314; tables[35] = tables[6]; tables[35][8] = 336044; tables[35][31] = 262208; tables[35][32] = 262307; tables[35][33] = 262311; tables[35][36] = 262267; tables[35][37] = 262235; tables[35][38] = 262237; tables[35][39] = 262269; tables[35][47] = 262312; tables[35][48] = 262237; tables[35][136] = 262312; tables[35][137] = 262312; tables[35][138] = 262312; tables[35][146] = 262312; tables[35][147] = 262312; tables[36] = tables[4]; tables[36][4] = 328772; tables[36][5] = 328760; tables[36][6] = 328769; tables[36][7] = 328754; tables[36][8] = 328771; tables[36][9] = 328752; tables[36][10] = 328767; tables[36][11] = 328768; tables[36][12] = 328776; tables[36][13] = 328766; tables[36][14] = 328763; tables[36][15] = 328756; tables[36][16] = 328780; tables[36][17] = 328770; tables[36][18] = 328777; tables[36][19] = 328759; tables[36][20] = 328761; tables[36][21] = 328762; tables[36][22] = 328779; tables[36][23] = 328757; tables[36][24] = 328755; tables[36][25] = 328764; tables[36][26] = 328774; tables[36][27] = 328775; tables[36][28] = 328765; tables[36][29] = 328783; tables[36][47] = 328773; tables[36][48] = 328778; tables[36][51] = 328758; tables[36][52] = 328781; tables[36][53] = 328785; tables[36][54] = 328753; tables[36][55] = 328782; tables[36][56] = 262190; tables[37] = tables[5]; tables[37][4] = 328740; tables[37][5] = 328728; tables[37][6] = 328737; tables[37][7] = 328722; tables[37][8] = 328739; tables[37][9] = 328720; tables[37][10] = 328735; tables[37][11] = 328736; tables[37][12] = 328744; tables[37][13] = 328734; tables[37][14] = 328731; tables[37][15] = 328724; tables[37][16] = 328748; tables[37][17] = 328738; tables[37][18] = 328745; tables[37][19] = 328727; tables[37][20] = 328729; tables[37][21] = 328730; tables[37][22] = 328747; tables[37][23] = 328725; tables[37][24] = 328723; tables[37][25] = 328732; tables[37][26] = 328742; tables[37][27] = 328743; tables[37][28] = 328733; tables[37][29] = 328751; tables[37][31] = 262178; tables[37][32] = 270614; tables[37][33] = 262203; tables[37][35] = 262202; tables[37][36] = 262207; tables[37][47] = 328741; tables[37][48] = 328746; tables[37][49] = 262191; tables[37][50] = 262191; tables[37][51] = 328726; tables[37][52] = 328749; tables[37][53] = 328705; tables[37][54] = 328721; tables[37][55] = 328750; tables[37][56] = 262188; tables[37][100] = 262191; tables[38] = tables[4]; tables[38][49] = 262179; tables[38][50] = 262179; tables[39] = tables[5]; tables[39][31] = 262178; tables[39][32] = 262307; tables[39][49] = 262270; tables[39][50] = 262270; tables[39][52] = 262208; tables[39][53] = 262316; tables[40][4] = 327905; tables[40][8] = 327913; tables[40][12] = 327917; tables[40][18] = 327923; tables[40][24] = 327930; tables[40][33] = 270508; tables[40][53] = 262310; tables[41][4] = 327873; tables[41][8] = 327881; tables[41][12] = 327885; tables[41][18] = 327891; tables[41][24] = 327898; tables[42] = tables[4]; tables[42][4] = 332038; tables[42][5] = 332146; tables[42][6] = 332046; tables[42][7] = 332043; tables[42][8] = 332035; tables[42][9] = 332037; tables[42][10] = 332050; tables[42][11] = 332137; tables[42][12] = 332131; tables[42][13] = 332133; tables[42][14] = 332129; tables[42][15] = 332149; tables[42][16] = 332147; tables[42][17] = 332142; tables[42][18] = 332130; tables[42][19] = 332134; tables[42][20] = 332039; tables[42][21] = 332032; tables[42][22] = 332034; tables[42][23] = 332041; tables[42][24] = 332135; tables[42][25] = 332049; tables[42][26] = 332044; tables[42][27] = 332048; tables[42][28] = 332141; tables[42][29] = 332047; tables[42][50] = 262237; tables[42][52] = 270360; tables[43] = tables[5]; tables[43][4] = 332038; tables[43][5] = 332146; tables[43][6] = 332046; tables[43][7] = 332043; tables[43][8] = 332036; tables[43][9] = 332037; tables[43][10] = 332050; tables[43][11] = 332137; tables[43][12] = 332131; tables[43][13] = 332133; tables[43][14] = 332129; tables[43][15] = 332149; tables[43][16] = 332147; tables[43][17] = 332142; tables[43][18] = 332132; tables[43][19] = 332136; tables[43][20] = 332040; tables[43][21] = 332033; tables[43][22] = 332034; tables[43][23] = 332042; tables[43][24] = 332135; tables[43][25] = 332049; tables[43][26] = 332045; tables[43][27] = 332048; tables[43][28] = 332141; tables[43][29] = 332047; tables[43][50] = 262269; tables[43][52] = 270364; tables[44] = tables[20]; tables[44][45] = 262187; tables[44][46] = 262236; tables[44][47] = 327909; tables[44][48] = 262312; tables[44][49] = 262183; tables[44][50] = 262183; tables[44][51] = 327928; tables[44][52] = 327910; tables[44][53] = 262268; tables[45] = tables[34]; tables[45][33] = 262308; tables[45][46] = 262240; tables[45][47] = 327877; tables[45][48] = 262238; tables[45][49] = 262186; tables[45][50] = 262186; tables[45][51] = 327896; tables[45][52] = 327878; tables[45][53] = 262311; tables[45][136] = 262240; tables[45][137] = 262240; tables[45][138] = 262240; tables[45][146] = 262240; tables[45][147] = 262240; tables[46] = tables[35]; tables[46][16] = 327861; tables[46][33] = 262180; tables[46][46] = 262324; tables[46][47] = 0; tables[46][48] = 262270; tables[46][136] = 262324; tables[46][137] = 262324; tables[46][138] = 262324; tables[46][146] = 262324; tables[46][147] = 262324; tables[47] = tables[44]; tables[47][46] = 262324; tables[47][51] = 327926; tables[47][52] = 327908; tables[47][53] = 262311; tables[47][136] = 262312; tables[47][137] = 262312; tables[47][138] = 262312; tables[47][146] = 262312; tables[47][147] = 262312; tables[48] = tables[45]; tables[48][51] = 327894; tables[48][52] = 327876; tables[48][53] = 262333; tables[48][136] = 262238; tables[48][137] = 262238; tables[48][138] = 262238; tables[48][146] = 262238; tables[48][147] = 262238; tables[49] = tables[46]; tables[49][45] = 262236; tables[49][46] = 0; tables[49][100] = 262268; tables[49][136] = 262270; tables[49][137] = 262270; tables[49][138] = 262270; tables[49][146] = 262270; tables[49][147] = 262270; tables[50] = tables[47]; tables[50][51] = 327910; tables[50][52] = 327928; tables[50][53] = 262333; tables[50][136] = 262324; tables[50][137] = 262324; tables[50][138] = 262324; tables[50][146] = 262324; tables[50][147] = 262324; tables[51] = tables[45]; tables[51][51] = 327878; tables[51][52] = 327896; tables[52] = tables[46]; tables[52][34] = 262272; tables[52][46] = 262268; tables[52][100] = 262236; tables[52][136] = 0; tables[52][137] = 0; tables[52][138] = 0; tables[52][146] = 0; tables[52][147] = 0; tables[53] = tables[38]; tables[53][4] = 340231; tables[53][5] = 340246; tables[53][6] = 340239; tables[53][7] = 340238; tables[53][8] = 340237; tables[53][9] = 340241; tables[53][10] = 340245; tables[53][11] = 340248; tables[53][12] = 340251; tables[53][13] = 340264; tables[53][14] = 340252; tables[53][15] = 340256; tables[53][16] = 340265; tables[53][17] = 340249; tables[53][18] = 340255; tables[53][19] = 340259; tables[53][20] = 340230; tables[53][21] = 340240; tables[53][22] = 340235; tables[53][23] = 340244; tables[53][24] = 340263; tables[53][25] = 340242; tables[53][26] = 340234; tables[53][27] = 340236; tables[53][28] = 340247; tables[53][29] = 340232; tables[53][30] = 274693; tables[53][31] = 274697; tables[53][32] = 262855; tables[53][33] = 262859; tables[53][34] = 274707; tables[53][35] = 262858; tables[53][36] = 262873; tables[53][37] = 274714; tables[53][38] = 274718; tables[53][39] = 274722; tables[53][45] = 274726; tables[53][51] = 274724; tables[53][52] = 270360; tables[53][54] = 274717; tables[53][55] = 274721; tables[53][56] = 274725; tables[54] = tables[43]; tables[54][4] = 327777; tables[54][5] = 327778; tables[54][6] = 327779; tables[54][7] = 327780; tables[54][8] = 327781; tables[54][9] = 327782; tables[54][10] = 327783; tables[54][11] = 327784; tables[54][12] = 327785; tables[54][13] = 327786; tables[54][14] = 327787; tables[54][15] = 327788; tables[54][16] = 327789; tables[54][17] = 327790; tables[54][18] = 327791; tables[54][19] = 327792; tables[54][20] = 327793; tables[54][21] = 327794; tables[54][22] = 327795; tables[54][23] = 327796; tables[54][24] = 327797; tables[54][25] = 327798; tables[54][26] = 327799; tables[54][27] = 327800; tables[54][28] = 327801; tables[54][29] = 327802; tables[54][50] = 262179; tables[54][100] = 262236; tables[55] = tables[5]; tables[55][52] = 270364; tables[56] = tables[7]; tables[56][46] = 327453; tables[56][47] = 327483; tables[56][48] = 327485; tables[56][49] = 327484; tables[56][50] = 327484; tables[56][52] = 270360; tables[56][53] = 270360; tables[56][100] = 327653; tables[56][135] = 0; tables[57] = tables[8]; tables[57][31] = 327456; tables[57][35] = 327486; tables[57][36] = 327430; tables[57][37] = 327434; tables[57][38] = 327432; tables[57][39] = 327433; tables[57][45] = 327487; tables[57][46] = 327435; tables[57][47] = 327515; tables[57][48] = 327517; tables[57][49] = 327516; tables[57][50] = 327516; tables[57][51] = 327450; tables[57][52] = 270364; tables[57][53] = 327518; tables[57][100] = 327516; tables[57][135] = 0; tables[57][137] = 0; tables[58] = tables[42]; tables[58][4] = 353765; tables[58][5] = 354056; tables[58][6] = 365009; tables[58][7] = 354088; tables[58][8] = 355380; tables[58][9] = 356459; tables[58][10] = 349983; tables[58][11] = 359161; tables[58][12] = 352776; tables[58][13] = 348993; tables[58][14] = 350503; tables[58][15] = 347693; tables[58][16] = 347648; tables[58][17] = 352019; tables[58][18] = 347834; tables[58][19] = 352195; tables[58][20] = 352843; tables[58][21] = 349155; tables[58][22] = 351288; tables[58][23] = 351999; tables[58][24] = 351345; tables[58][25] = 350579; tables[58][26] = 357680; tables[58][27] = 366307; tables[58][28] = 349020; tables[58][29] = 365005; tables[58][50] = 262179; tables[59] = tables[1]; tables[59][47] = 262376; tables[59][51] = 262377; tables[59][52] = 262368; tables[60] = tables[2]; tables[60][47] = 262396; tables[60][51] = 262390; tables[60][52] = 262372; tables[61] = tables[4]; tables[61][47] = 262238; tables[61][48] = 262328; tables[61][49] = 262204; tables[61][50] = 262204; tables[61][52] = 262240; tables[61][53] = 262179; tables[61][56] = 327913; tables[61][100] = 262315; tables[61][136] = 262240; tables[61][137] = 262240; tables[61][138] = 262240; tables[61][146] = 262240; tables[61][147] = 262240; tables[62] = tables[39]; tables[62][32] = 262191; tables[62][35] = 262207; tables[62][47] = 262238; tables[62][48] = 262312; tables[62][49] = 262206; tables[62][50] = 262206; tables[62][52] = 262240; tables[62][53] = 262268; tables[62][54] = 262183; tables[62][55] = 262190; tables[62][56] = 327881; tables[62][100] = 262331; tables[62][136] = 262240; tables[62][137] = 262240; tables[62][138] = 262240; tables[62][146] = 262240; tables[62][147] = 262240; tables[63] = tables[52]; tables[63][8] = 0; tables[63][18] = 327847; tables[63][19] = 327862; tables[63][30] = 262321; tables[63][33] = 262306; tables[63][34] = 262308; tables[63][35] = 262316; tables[63][36] = 262310; tables[63][37] = 262322; tables[63][38] = 262323; tables[63][39] = 262332; tables[63][45] = 262333; tables[63][46] = 262334; tables[63][47] = 262235; tables[63][48] = 262237; tables[63][49] = 262269; tables[63][50] = 262269; tables[63][51] = 262270; tables[63][52] = 262267; tables[63][53] = 262236; tables[63][54] = 262319; tables[63][55] = 262317; tables[63][56] = 262324; tables[63][100] = 262320; tables[64] = tables[23]; tables[64][35] = 327847; tables[64][37] = 327713; tables[64][46] = 327725; tables[64][49] = 327861; tables[64][50] = 327861; tables[64][56] = 327741; tables[65] = tables[24]; tables[65][46] = 327775; tables[65][48] = 327722; tables[65][49] = 327843; tables[65][50] = 327843; tables[65][53] = 262323; tables[65][56] = 327723; tables[66][8] = 336044; tables[66][30] = 327804; tables[66][31] = 327744; tables[66][32] = 327715; tables[66][33] = 327803; tables[66][34] = 327771; tables[66][35] = 327774; tables[66][38] = 327803; tables[66][39] = 327805; tables[66][47] = 327771; tables[66][48] = 327773; tables[66][49] = 262240; tables[66][50] = 262240; tables[66][52] = 262324; tables[66][56] = 262270; tables[66][100] = 262236; tables[67][49] = 262240; tables[67][50] = 262240; tables[67][52] = 262324; tables[67][56] = 262270; tables[67][136] = 262240; tables[67][137] = 262240; tables[67][138] = 262240; tables[67][146] = 262240; tables[67][147] = 262240; tables[68] = tables[4]; tables[68][49] = 262179; tables[68][100] = 0; tables[69] = tables[5]; tables[69][49] = 262270; tables[69][100] = 0; tables[70][4] = 327941; tables[70][6] = 327943; tables[70][8] = 327961; tables[70][15] = 328002; tables[70][17] = 328004; tables[70][18] = 327923; tables[70][22] = 328027; tables[70][24] = 270508; tables[70][27] = 328058; tables[70][29] = 328060; tables[71][4] = 327940; tables[71][6] = 327942; tables[71][8] = 327960; tables[71][15] = 328001; tables[71][17] = 328003; tables[71][18] = 327891; tables[71][22] = 328026; tables[71][27] = 328057; tables[71][29] = 328059; tables[72] = tables[4]; tables[72][47] = 262324; tables[72][48] = 262235; tables[72][49] = 0; tables[72][50] = 262237; tables[72][51] = 327911; tables[72][52] = 262270; tables[72][53] = 262183; tables[72][56] = 262203; tables[72][135] = 262191; tables[73] = tables[5]; tables[73][35] = 262312; tables[73][47] = 262240; tables[73][48] = 262267; tables[73][49] = 0; tables[73][50] = 262269; tables[73][51] = 327879; tables[73][52] = 262238; tables[73][53] = 262178; tables[73][56] = 262202; tables[73][135] = 262207; tables[74][8] = 262320; tables[74][20] = 262191; tables[74][26] = 262207; tables[74][30] = 262329; tables[74][31] = 262322; tables[74][32] = 262323; tables[74][33] = 262307; tables[74][34] = 262306; tables[74][35] = 262316; tables[74][46] = 262311; tables[74][48] = 262314; tables[74][50] = 262330; tables[74][135] = 262320; tables[75] = tables[20]; tables[75][12] = 327985; tables[75][45] = 262186; tables[75][46] = 262189; tables[75][47] = 327967; tables[75][48] = 327932; tables[75][49] = 0; tables[75][50] = 262188; tables[75][51] = 328031; tables[75][52] = 327785; tables[75][53] = 262178; tables[75][54] = 327926; tables[75][55] = 327911; tables[75][56] = 262190; tables[76] = tables[21]; tables[76][31] = 262183; tables[76][32] = 262238; tables[76][33] = 262187; tables[76][46] = 262239; tables[76][47] = 327966; tables[76][48] = 262364; tables[76][49] = 0; tables[76][50] = 262203; tables[76][51] = 328030; tables[76][52] = 327984; tables[76][53] = 262377; tables[76][54] = 327894; tables[76][55] = 327879; tables[76][56] = 262202; tables[77] = tables[52]; tables[77][4] = 327910; tables[77][8] = 270508; tables[77][12] = 327785; tables[77][16] = 0; tables[77][20] = 262208; tables[77][22] = 262367; tables[77][30] = 262206; tables[77][31] = 262307; tables[77][32] = 262179; tables[77][34] = 262333; tables[77][45] = 262236; tables[77][47] = 262312; tables[77][50] = 262240; tables[77][51] = 262324; tables[77][53] = 262204; tables[77][100] = 262268; tables[78][4] = 327878; tables[78][12] = 327984; tables[79] = tables[20]; tables[79][41] = 262268; tables[79][46] = 262335; tables[79][47] = 262324; tables[79][50] = 327805; tables[79][52] = 262267; tables[79][53] = 262268; tables[80] = tables[21]; tables[80][32] = 262179; tables[80][46] = 262305; tables[80][47] = 262312; tables[80][50] = 327773; tables[80][52] = 262235; tables[80][53] = 262320; tables[81][20] = 262208; tables[81][45] = 262236; tables[81][48] = 262270; tables[81][50] = 262240; tables[81][52] = 262238; tables[81][53] = 262316; tables[82] = tables[4]; tables[82][4] = 263732; tables[82][5] = 263748; tables[82][6] = 263716; tables[82][7] = 263754; tables[82][8] = 263723; tables[82][9] = 263720; tables[82][10] = 263748; tables[82][11] = 263719; tables[82][12] = 263751; tables[82][13] = 263722; tables[82][14] = 263750; tables[82][15] = 263749; tables[82][16] = 263721; tables[82][17] = 263753; tables[82][18] = 263726; tables[82][19] = 263725; tables[82][20] = 263734; tables[82][21] = 263746; tables[82][22] = 263731; tables[82][23] = 263745; tables[82][24] = 263737; tables[82][25] = 263729; tables[82][26] = 263733; tables[82][27] = 263713; tables[82][28] = 263738; tables[82][29] = 263718; tables[82][47] = 263724; tables[82][48] = 263727; tables[82][51] = 263747; tables[82][52] = 263735; tables[82][53] = 263728; tables[82][54] = 263752; tables[82][55] = 263730; tables[82][56] = 263736; tables[83] = tables[5]; tables[83][4] = 263760; tables[83][5] = 263748; tables[83][6] = 262269; tables[83][7] = 262237; tables[83][8] = 263759; tables[83][9] = 262235; tables[83][10] = 263748; tables[83][11] = 263715; tables[83][12] = 262391; tables[83][13] = 263744; tables[83][14] = 263692; tables[83][15] = 262191; tables[83][16] = 270361; tables[83][17] = 263714; tables[83][18] = 262359; tables[83][19] = 263707; tables[83][20] = 263758; tables[83][21] = 263756; tables[83][22] = 263757; tables[83][23] = 263748; tables[83][24] = 270360; tables[83][25] = 262267; tables[83][26] = 263755; tables[83][27] = 263762; tables[83][28] = 263717; tables[83][29] = 262270; tables[83][38] = 262185; tables[83][39] = 262184; tables[83][47] = 262204; tables[83][48] = 262206; tables[83][53] = 263761; tables[83][54] = 262188; tables[83][55] = 262190; tables[83][56] = 263711; tables[84] = tables[1]; tables[84][4] = 331295; tables[84][5] = 331316; tables[84][6] = 331329; tables[84][7] = 331265; tables[84][8] = 331315; tables[84][9] = 331284; tables[84][10] = 331328; tables[84][11] = 331337; tables[84][12] = 331299; tables[84][13] = 331336; tables[84][14] = 331314; tables[84][15] = 331306; tables[84][16] = 331287; tables[84][17] = 331319; tables[84][18] = 331289; tables[84][19] = 331298; tables[84][20] = 331334; tables[84][21] = 331294; tables[84][22] = 331307; tables[84][23] = 331312; tables[84][24] = 331317; tables[84][25] = 331309; tables[84][26] = 331332; tables[84][27] = 331291; tables[84][28] = 331313; tables[84][29] = 331292; tables[84][30] = 331333; tables[84][31] = 327727; tables[84][32] = 327725; tables[84][33] = 331296; tables[84][34] = 331286; tables[84][35] = 331320; tables[84][36] = 331318; tables[84][37] = 331268; tables[84][38] = 331285; tables[84][39] = 331272; tables[84][45] = 331266; tables[84][46] = 331274; tables[84][47] = 331290; tables[84][48] = 331301; tables[84][49] = 331267; tables[84][50] = 331267; tables[84][51] = 331303; tables[84][52] = 331271; tables[84][53] = 327775; tables[84][54] = 331297; tables[84][55] = 331331; tables[84][56] = 331293; tables[84][100] = 331267; tables[84][103] = 0; tables[84][133] = 0; tables[84][134] = 0; tables[84][140] = 0; tables[85] = tables[2]; tables[85][4] = 331300; tables[85][5] = 331322; tables[85][6] = 331273; tables[85][7] = 331279; tables[85][8] = 331278; tables[85][9] = 331330; tables[85][10] = 331276; tables[85][11] = 331335; tables[85][12] = 331283; tables[85][13] = 331339; tables[85][14] = 331305; tables[85][15] = 331304; tables[85][16] = 327743; tables[85][17] = 331340; tables[85][18] = 331311; tables[85][19] = 331277; tables[85][20] = 331344; tables[85][21] = 331281; tables[85][22] = 331270; tables[85][23] = 331288; tables[85][24] = 331338; tables[85][25] = 331310; tables[85][26] = 327714; tables[85][27] = 327721; tables[85][28] = 331341; tables[85][29] = 327720; tables[85][30] = 327723; tables[85][31] = 331345; tables[85][32] = 331346; tables[85][33] = 331347; tables[85][34] = 331348; tables[85][35] = 331321; tables[85][36] = 331327; tables[85][37] = 331349; tables[85][38] = 331350; tables[85][39] = 331351; tables[85][45] = 331352; tables[85][46] = 331353; tables[85][47] = 331280; tables[85][48] = 327724; tables[85][49] = 331269; tables[85][50] = 331269; tables[85][51] = 331275; tables[85][52] = 327726; tables[85][53] = 327717; tables[85][54] = 331282; tables[85][55] = 331308; tables[85][56] = 331302; tables[85][100] = 331269; tables[85][103] = 0; tables[85][133] = 0; tables[85][134] = 0; tables[85][140] = 0; tables[86] = tables[1]; tables[86][30] = 262187; tables[86][31] = 327963; tables[86][32] = 328033; tables[86][33] = 327949; tables[86][34] = 328025; tables[86][35] = 328062; tables[86][36] = 327933; tables[86][37] = 327905; tables[86][38] = 327917; tables[86][39] = 327913; tables[86][45] = 262205; tables[86][46] = 262324; tables[86][47] = 327930; tables[86][48] = 262185; tables[86][49] = 262312; tables[86][50] = 262312; tables[86][51] = 328047; tables[86][52] = 262311; tables[86][53] = 262203; tables[86][100] = 262236; tables[86][103] = 0; tables[86][133] = 0; tables[86][134] = 0; tables[86][140] = 0; tables[87] = tables[2]; tables[87][30] = 262193; tables[87][31] = 262194; tables[87][32] = 262195; tables[87][33] = 262196; tables[87][34] = 262197; tables[87][35] = 262198; tables[87][36] = 262199; tables[87][37] = 262200; tables[87][38] = 262201; tables[87][39] = 262192; tables[87][45] = 262181; tables[87][46] = 262855; tables[87][47] = 262191; tables[87][48] = 262184; tables[87][49] = 262183; tables[87][50] = 262183; tables[87][51] = 262178; tables[87][52] = 262177; tables[87][54] = 262207; tables[87][100] = 262268; tables[87][103] = 0; tables[87][133] = 0; tables[87][134] = 0; tables[87][140] = 0; tables[88][5] = 262267; tables[88][6] = 262182; tables[88][7] = 262416; tables[88][8] = 270508; tables[88][9] = 262235; tables[88][10] = 262237; tables[88][14] = 262466; tables[88][15] = 262465; tables[88][17] = 262269; tables[88][20] = 262236; tables[88][22] = 262417; tables[88][25] = 262208; tables[88][26] = 262268; tables[88][27] = 262179; tables[88][30] = 262270; tables[88][31] = 262855; tables[88][32] = 262238; tables[88][33] = 262872; tables[88][34] = 262320; tables[88][35] = 262875; tables[88][36] = 262240; tables[88][37] = 262873; tables[88][38] = 262324; tables[88][39] = 262877; tables[88][45] = 262312; tables[88][46] = 262328; tables[88][47] = 262391; tables[88][48] = 262359; tables[88][49] = 262308; tables[88][50] = 262308; tables[88][51] = 262180; tables[88][52] = 262367; tables[88][54] = 262204; tables[88][55] = 262206; tables[88][56] = 262186; tables[89] = tables[4]; tables[89][4] = 328625; tables[89][5] = 328626; tables[89][6] = 328648; tables[89][7] = 328628; tables[89][8] = 328629; tables[89][9] = 328646; tables[89][10] = 328627; tables[89][11] = 328631; tables[89][12] = 328633; tables[89][13] = 328638; tables[89][14] = 328634; tables[89][15] = 328635; tables[89][16] = 328636; tables[89][17] = 328637; tables[89][18] = 328639; tables[89][19] = 328640; tables[89][20] = 262203; tables[89][21] = 328641; tables[89][22] = 328643; tables[89][23] = 328644; tables[89][24] = 328632; tables[89][25] = 328649; tables[89][26] = 263106; tables[89][27] = 328647; tables[89][28] = 328645; tables[89][29] = 328630; tables[89][51] = 263044; tables[89][100] = 262204; tables[89][103] = 0; tables[89][133] = 0; tables[89][134] = 0; tables[89][140] = 0; tables[90] = tables[5]; tables[90][4] = 328593; tables[90][5] = 328594; tables[90][6] = 328616; tables[90][7] = 328596; tables[90][8] = 328597; tables[90][9] = 328614; tables[90][10] = 328595; tables[90][11] = 328599; tables[90][12] = 328601; tables[90][13] = 328606; tables[90][14] = 328602; tables[90][15] = 328603; tables[90][16] = 328604; tables[90][17] = 328605; tables[90][18] = 328607; tables[90][19] = 328608; tables[90][20] = 262202; tables[90][21] = 328609; tables[90][22] = 328611; tables[90][23] = 328612; tables[90][24] = 328600; tables[90][25] = 328617; tables[90][26] = 263045; tables[90][27] = 328615; tables[90][28] = 328613; tables[90][29] = 328598; tables[90][51] = 262312; tables[90][100] = 262206; tables[90][103] = 0; tables[90][133] = 0; tables[90][134] = 0; tables[90][140] = 0; tables[91][6] = 262313; tables[91][8] = 270508; tables[91][21] = 262318; tables[91][28] = 262309; tables[91][31] = 262322; tables[91][32] = 262323; tables[91][33] = 262307; tables[91][34] = 262311; tables[91][35] = 262326; tables[91][37] = 262308; tables[91][38] = 262310; tables[91][39] = 262320; tables[91][45] = 262321; tables[91][46] = 262333; tables[91][47] = 262315; tables[91][48] = 262331; tables[91][50] = 262316; tables[91][51] = 263045; tables[92] = tables[4]; tables[92][103] = 0; tables[92][133] = 0; tables[92][134] = 0; tables[92][140] = 0; tables[93] = tables[5]; tables[93][103] = 0; tables[93][133] = 0; tables[93][134] = 0; tables[93][140] = 0; tables[94] = tables[92]; tables[94][30] = 327939; tables[94][31] = 327906; tables[94][32] = 327914; tables[94][33] = 327924; tables[94][34] = 262912; tables[94][35] = 262921; tables[94][36] = 262915; tables[94][37] = 262913; tables[94][38] = 262947; tables[94][39] = 327953; tables[94][46] = 270507; tables[94][47] = 328112; tables[94][48] = 328097; tables[95] = tables[93]; tables[95][30] = 327938; tables[95][31] = 327874; tables[95][32] = 327882; tables[95][33] = 327892; tables[95][34] = 262912; tables[95][35] = 262921; tables[95][36] = 262915; tables[95][37] = 262913; tables[95][38] = 262947; tables[95][39] = 327952; tables[95][47] = 328111; tables[95][48] = 328096; tables[96] = tables[92]; tables[96][40] = 0; tables[96][42] = 0; tables[96][43] = 0; tables[96][44] = 0; tables[96][83] = 0; tables[96][84] = 0; tables[96][85] = 0; tables[96][86] = 0; tables[96][87] = 0; tables[96][88] = 0; tables[96][89] = 0; tables[96][90] = 0; tables[96][91] = 0; tables[96][92] = 0; tables[96][93] = 0; tables[96][94] = 0; tables[96][95] = 0; tables[96][96] = 0; tables[96][97] = 0; tables[96][98] = 0; tables[96][99] = 0; tables[97] = tables[93]; tables[97][40] = 0; tables[97][42] = 0; tables[97][43] = 0; tables[97][44] = 0; tables[97][83] = 0; tables[97][84] = 0; tables[97][85] = 0; tables[97][86] = 0; tables[97][87] = 0; tables[97][88] = 0; tables[97][89] = 0; tables[97][90] = 0; tables[97][91] = 0; tables[97][92] = 0; tables[97][93] = 0; tables[97][94] = 0; tables[97][95] = 0; tables[97][96] = 0; tables[97][97] = 0; tables[97][98] = 0; tables[97][99] = 0; tables[98] = tables[92]; tables[98][47] = 327939; tables[98][48] = 327918; tables[98][49] = 327906; tables[98][50] = 327906; tables[98][51] = 328217; tables[98][52] = 328219; tables[98][53] = 270366; tables[99] = tables[93]; tables[99][47] = 327938; tables[99][48] = 327886; tables[99][49] = 327874; tables[99][50] = 327874; tables[99][51] = 328216; tables[99][52] = 328218; tables[99][53] = 270365; tables[99][54] = 262203; tables[99][55] = 262202; tables[100] = tables[88]; tables[100][5] = 0; tables[100][6] = 262313; tables[100][7] = 327953; tables[100][9] = 0; tables[100][10] = 0; tables[100][14] = 0; tables[100][15] = 328002; tables[100][17] = 0; tables[100][19] = 262311; tables[100][20] = 0; tables[100][22] = 262367; tables[100][25] = 0; tables[100][26] = 0; tables[100][27] = 0; tables[100][47] = 262235; tables[100][48] = 262237; tables[100][49] = 262236; tables[100][50] = 262236; tables[100][51] = 262203; tables[100][52] = 262183; tables[100][53] = 262240; tables[100][56] = 0; tables[101] = tables[29]; tables[101][7] = 327952; tables[101][15] = 328001; tables[101][45] = 270355; tables[101][46] = 262321; tables[101][49] = 262268; tables[101][50] = 262268; tables[101][51] = 262202; tables[101][52] = 262178; tables[101][53] = 262270; tables[101][54] = 262315; tables[101][55] = 262331; tables[102] = tables[92]; tables[102][28] = 327802; tables[102][29] = 327801; tables[102][39] = 327926; tables[102][45] = 327932; tables[102][46] = 327923; tables[102][47] = 328017; tables[102][48] = 327930; tables[102][49] = 328049; tables[102][50] = 328049; tables[102][51] = 327913; tables[102][52] = 327905; tables[102][53] = 262192; tables[102][56] = 262189; tables[102][100] = 327917; tables[103] = tables[87]; tables[103][30] = 262183; tables[103][31] = 262178; tables[103][32] = 262187; tables[103][33] = 262177; tables[103][34] = 262181; tables[103][35] = 262191; tables[103][36] = 262205; tables[103][37] = 262184; tables[103][38] = 262185; tables[103][39] = 327894; tables[103][45] = 327900; tables[103][46] = 327891; tables[103][47] = 328016; tables[103][48] = 327898; tables[103][49] = 328048; tables[103][50] = 328048; tables[103][51] = 327881; tables[103][52] = 327873; tables[103][53] = 262311; tables[103][100] = 327885; tables[104] = tables[88]; tables[104][4] = 262372; tables[104][8] = 262340; tables[104][12] = 262349; tables[104][13] = 262381; tables[104][16] = 262204; tables[104][24] = 270508; tables[104][29] = 262206; tables[104][54] = 262203; tables[104][100] = 262204; tables[105] = tables[36]; tables[105][22] = 328790; tables[105][48] = 328791; tables[105][52] = 328788; tables[105][53] = 327719; tables[105][83] = 0; tables[105][100] = 263313; tables[106] = tables[37]; tables[106][22] = 328710; tables[106][48] = 328711; tables[106][52] = 328708; tables[106][53] = 0; tables[106][100] = 263312; tables[107][24] = 263313; tables[108][24] = 263312; tables[109][40] = 262154; tables[109][42] = 262152; tables[109][43] = 262153; tables[109][88] = 262154; tables[109][186] = 262152; tables[109][187] = 262153; tables[110][31] = 327962; tables[110][32] = 328032; tables[110][33] = 327948; tables[110][34] = 328024; tables[110][35] = 328061; tables[110][36] = 327901; tables[110][37] = 327873; tables[110][38] = 327885; tables[110][39] = 327881; tables[110][47] = 327898; tables[110][51] = 328046; return tables; }(); constexpr std::array, 41> CharacterLayouts = {{ {1, 2, 3, 0}, {4, 5, 6, 0}, {7, 8, 0, 0}, {9, 10, 0, 0}, {11, 12, 0, 0}, {13, 14, 0, 0}, {15, 16, 0, 0}, {17, 18, 19, 0}, {20, 21, 22, 0}, {23, 24, 25, 0}, {26, 27, 28, 29}, {30, 31, 32, 0}, {33, 34, 35, 0}, {36, 37, 0, 0}, {38, 39, 40, 41}, {42, 43, 0, 0}, {44, 45, 46, 0}, {47, 48, 49, 0}, {50, 51, 52, 0}, {47, 48, 49, 0}, {53, 54, 0, 55}, {56, 57, 0, 0}, {58, 54, 0, 55}, {59, 60, 3, 0}, {61, 62, 63, 0}, {64, 65, 66, 67}, {68, 69, 70, 71}, {72, 73, 74, 0}, {75, 76, 77, 78}, {79, 80, 81, 0}, {82, 83, 0, 0}, {84, 85, 0, 0}, {86, 87, 88, 0}, {89, 90, 91, 0}, {92, 93, 0, 0}, {94, 95, 96, 97}, {98, 99, 100, 101}, {102, 103, 104, 0}, {105, 106, 107, 108}, {109, 109, 109, 109}, {110, 110, 110, 110}, }}; constexpr std::array KoreanInitial = { 12593, 12594, 12596, 12599, 12600, 12601, 12609, 12610, 12611, 12613, 12614, 12615, 12616, 12617, 12618, 12619, 12620, 12621, 12622 }; constexpr std::array KoreanFinal = { 12593, 12594, 12595, 12596, 12597, 12598, 12599, 12601, 12602, 12603, 12604, 12605, 12606, 12607, 12608, 12609, 12610, 12612, 12613, 12614, 12615, 12616, 12618, 12619, 12620, 12621, 12622 }; std::size_t CharacterLayout(std::uint32_t type, std::uint32_t state) { constexpr std::array layouts = {18, 7, 0, 1, 14, 8, 29, 17, 9, 25, 24, 23, 10, 11, 16, 26, 27, 12, 1, 19, 28, 3, 3, 1, 1, 1, 1, 1, 1, 1, 14, 32, 14, 34, 35, 36, 37, 1, 1}; const bool imeMode = (state & 0x4000000u) != 0; const bool alternateMode = (state & 0x10000000u) != 0; switch (type) { case 19: return imeMode ? 13 : 1; case 22: return alternateMode ? 2 : 3; case 23: if (!imeMode) return alternateMode ? 2 : 3; if ((state & 0x8000000u) == 0) return 6; return alternateMode ? 4 : 5; case 24: return imeMode ? 15 : 1; case 26: if (imeMode) return 20; return alternateMode ? 21 : 1; case 29: case 39: if (imeMode) return 22; return alternateMode ? 21 : 1; case 25: case 27: case 28: return alternateMode ? 21 : 1; case 30: return imeMode ? 30 : 1; case 31: return imeMode ? 31 : 14; case 33: return imeMode ? 33 : 14; case 38: return imeMode ? 38 : 1; default: return layouts[type - 1]; } } std::uint32_t CharacterEntry(std::size_t layout, std::size_t layer, std::uint16_t keycode) { if (keycode >= 256) return 0; return CharacterTables[CharacterLayouts[layout][layer]][keycode]; } char16_t ConvertCharacter(std::uint16_t keycode, std::uint32_t state, std::uint32_t type) { if (keycode == 83 || (keycode & 0xFFF8u) == 224) return 0; const auto layout = CharacterLayout(type, state); const bool shifted = (state & 0x2200u) != 0; const bool caps = (state & 0x20000u) != 0; if (layout == 0 && caps) { if (keycode == 47) return shifted ? 200 : 220; if (keycode == 52) return shifted ? 192 : 196; if (keycode == 51) return shifted ? 201 : 214; } const auto& layers = CharacterLayouts[layout]; if ((state & 0x4000u) != 0 && (layers[2] != 0 || layers[3] != 0)) { auto entry = CharacterEntry(layout, shifted ? 3 : 2, keycode); if (entry == 0) return static_cast(CharacterEntry(39, 0, keycode)); if (caps && (entry & 0x10000u) != 0) { const auto opposite = CharacterEntry(layout, shifted ? 2 : 3, keycode); if (opposite != 0) entry = opposite; } return static_cast(entry); } auto entry = CharacterEntry(layout, shifted ? 1 : 0, keycode); if (entry == 0) return 0; if (caps) { if ((type == 26 || type == 29 || type == 39) && (state & 0x4000000u) != 0) { entry = CharacterEntry(layout, shifted ? 3 : 0, keycode); } else if (type == 32 && !shifted && ((keycode >= 31 && keycode <= 39) || keycode == 47 || keycode == 51)) { entry = CharacterEntry(40, 0, keycode); } else if ((entry & 0x10000u) != 0) { entry = CharacterEntry(layout, shifted ? 0 : 1, keycode); } if (entry == 0) return 0; } if ((entry & 0x20000u) != 0) { const bool numLock = (state & 0x10000u) != 0; if (!numLock && keycode >= 89 && keycode <= 99) return 0; entry = CharacterEntry(layout, numLock ? 1 : 0, keycode); if (entry == 0) return 0; } auto character = static_cast(entry); if ((state & 0x4000000u) != 0 && type == 24) { if ((character >= 12592 && character < 12688) || (character >= 44032 && character < 55216) || (character & 0xFF00u) == 0x1100) { if (character >= 4352 && character <= 4370) return KoreanInitial[character - 4352]; if (character >= 4449 && character <= 4469) return static_cast(character + 8174); if (character >= 4520 && character <= 4546) return KoreanFinal[character - 4520]; return 0; } } if ((state & 0x4000000u) != 0 && type == 30) { if ((state & 0x80u) == 0) { if (keycode == 5) character = shifted ? 1570 : 1575; if (shifted && keycode == 10) character = 1571; if (shifted && keycode == 23) character = 1573; } const auto modifiers = state & 0xFFF8FFFFu; if (modifiers == 67117312 || modifiers == 67121152 || modifiers == 67109632 || modifiers == 67113472) { constexpr std::array formatting = {0x200D, 0x200C, 0x200E, 0x200F}; return keycode >= 30 && keycode <= 33 ? formatting[keycode - 30] : 0; } if ((state & 0x1100u) != 0 && shifted) return 0; } return character; } } // namespace extern "C" { int APS5_VABI sceConvertKeycodeGetImeKeyboardType(int32_t userId, uint32_t* type) { if (type == nullptr) return kErrInvalidAddress; if (userId < 0) return kErrInvalidUserId; throw std::runtime_error("sceConvertKeycodeGetImeKeyboardType: user keyboard language and variant are unavailable"); } int APS5_VABI sceConvertKeycodeGetVirtualKeycode(std::uint16_t keycode, std::uint32_t keyboardType, std::uint16_t* virtualKeycode) { if (virtualKeycode == nullptr) return kErrInvalidAddress; if (keyboardType == 0 || keyboardType > VirtualKeys.size()) return kErrInvalidKeyboardType; if (keyboardType >= 31) throw std::runtime_error("sceConvertKeycodeGetVirtualKeycode: guest sdk version is unavailable"); auto value = keycode < BaseVirtualKeys.size() ? VirtualKeys[keyboardType - 1][keycode] : 255; if ((keyboardType == 2 || keyboardType == 3 || keyboardType == 12) && (value == 89 || value == 90)) throw std::runtime_error("sceConvertKeycodeGetVirtualKeycode: guest sdk version is unavailable"); *virtualKeycode = static_cast(value); return 0; } int APS5_VABI sceConvertKeycodeGetCharacterFromKeyboardData(const KeyboardData* keyData, std::int32_t index, std::uint32_t state, std::uint32_t keyboardType, char16_t* character) { NotImplemented_nid_no_patch(__func__); return 0; } int APS5_VABI sceConvertKeycodeGetCharacter(std::uint16_t keycode, std::uint32_t state, std::uint32_t type, char16_t* character) { if (character == nullptr) return kErrInvalidAddress; if (type == 0 || type > 39) return kErrInvalidKeyboardType; if (type >= 31) throw std::runtime_error("sceConvertKeycodeGetCharacter: guest sdk version is unavailable"); *character = ConvertCharacter(keycode, state, type); return 0; } }