Files
Momentum-Firmware/applications/external/text2sam/stm32_sam.cpp
T
2023-07-14 02:43:32 +02:00

5703 lines
172 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stm32_sam.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
//
// All
//
////////////////////////////////////////////////////////////////////////////////////////////
char input[256 + 1] = {0}; //tab39445
//standard sam sound
unsigned char wait1 = 7;
unsigned char wait2 = 6;
unsigned char A, X, Y;
unsigned char mem44;
unsigned char mem47;
unsigned char mem49;
unsigned char mem39;
unsigned char mem50;
unsigned char mem51;
unsigned char mem53;
unsigned char mem56;
unsigned char mem59 = 0;
unsigned char phonemeIndexOutput[60]; //tab47296
unsigned char stressOutput[60]; //tab47365
unsigned char phonemeLengthOutput[60]; //tab47416
// contains the soundbuffer position
int bufferpos;
////////////////////////////////////////////////////////////////////////////////////////////
//
// Sam Tabs
//
////////////////////////////////////////////////////////////////////////////////////////////
//tab40672
const unsigned char stressInputTable[] = {'*', '1', '2', '3', '4', '5', '6', '7', '8'};
//tab40682
const unsigned char signInputTable1[] = {
' ', '.', '?', ',', '-', 'I', 'I', 'E', 'A', 'A', 'A', 'A', 'U', 'A', 'I', 'E', 'U',
'O', 'R', 'L', 'W', 'Y', 'W', 'R', 'L', 'W', 'Y', 'M', 'N', 'N', 'D', 'Q', 'S', 'S',
'F', 'T', '/', '/', 'Z', 'Z', 'V', 'D', 'C', '*', 'J', '*', '*', '*', 'E', 'A', 'O',
'A', 'O', 'U', 'B', '*', '*', 'D', '*', '*', 'G', '*', '*', 'G', '*', '*', 'P', '*',
'*', 'T', '*', '*', 'K', '*', '*', 'K', '*', '*', 'U', 'U', 'U'};
//tab40763
const unsigned char signInputTable2[] = {
'*', '*', '*', '*', '*', 'Y', 'H', 'H', 'E', 'A', 'H', 'O', 'H', 'X', 'X', 'R', 'X',
'H', 'X', 'X', 'X', 'X', 'H', '*', '*', '*', '*', '*', '*', 'X', 'X', '*', '*', 'H',
'*', 'H', 'H', 'X', '*', 'H', '*', 'H', 'H', '*', '*', '*', '*', '*', 'Y', 'Y', 'Y',
'W', 'W', 'W', '*', '*', '*', '*', '*', '*', '*', '*', '*', 'X', '*', '*', '*', '*',
'*', '*', '*', '*', '*', '*', '*', 'X', '*', '*', 'L', 'M', 'N'};
//loc_9F8C
const unsigned char flags[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x84, 0x84, 0xA4,
0xA4, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x44, 0x44, 0x44, 0x44, 0x44, 0x4C,
0x4C, 0x4C, 0x48, 0x4C, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x44, 0x44, 0x44, 0x44,
0x48, 0x40, 0x4C, 0x44, 0x00, 0x00, 0xB4, 0xB4, 0xB4, 0x94, 0x94, 0x94, 0x4E, 0x4E,
0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4B, 0x4B, 0x4B, 0x4B,
0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x80, 0xC1, 0xC1
};
//??? flags overlap flags2
//loc_9FDA
const unsigned char flags2[] = {
0x80, 0xC1, 0xC1, 0xC1, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0C, 0x08, 0x04, 0x40,
0x24, 0x20, 0x20, 0x24, 0x00, 0x00, 0x24, 0x20, 0x20, 0x24, 0x20, 0x20, 0x00, 0x20, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
//tab45616???
const unsigned char phonemeStressedLengthTable[] = {
0x00, 0x12, 0x12, 0x12, 8, 0xB, 9, 0xB, 0xE, 0xF, 0xB, 0x10, 0xC, 6, 6, 0xE,
0xC, 0xE, 0xC, 0xB, 8, 8, 0xB, 0xA, 9, 8, 8, 8, 8, 8, 3, 5,
2, 2, 2, 2, 2, 2, 6, 6, 8, 6, 6, 2, 9, 4, 2, 1,
0xE, 0xF, 0xF, 0xF, 0xE, 0xE, 8, 2, 2, 7, 2, 1, 7, 2, 2, 7,
2, 2, 8, 2, 2, 6, 2, 2, 7, 2, 4, 7, 1, 4, 5, 5};
//tab45536???
const unsigned char phonemeLengthTable[] = {
0, 0x12, 0x12, 0x12, 8, 8, 8, 8, 8, 0xB, 6, 0xC, 0xA, 5, 5, 0xB, 0xA, 0xA, 0xA, 9,
8, 7, 9, 7, 6, 8, 6, 7, 7, 7, 2, 5, 2, 2, 2, 2, 2, 2, 6, 6,
7, 6, 6, 2, 8, 3, 1, 0x1E, 0xD, 0xC, 0xC, 0xC, 0xE, 9, 6, 1, 2, 5, 1, 1,
6, 1, 2, 6, 1, 2, 8, 2, 2, 4, 2, 2, 6, 1, 4, 6, 1, 4, 0xC7, 0xFF};
/*
Ind | phoneme | flags |
-----|---------|----------|
0 | * | 00000000 |
1 | .* | 00000000 |
2 | ?* | 00000000 |
3 | ,* | 00000000 |
4 | -* | 00000000 |
VOWELS
5 | IY | 10100100 |
6 | IH | 10100100 |
7 | EH | 10100100 |
8 | AE | 10100100 |
9 | AA | 10100100 |
10 | AH | 10100100 |
11 | AO | 10000100 |
17 | OH | 10000100 |
12 | UH | 10000100 |
16 | UX | 10000100 |
15 | ER | 10000100 |
13 | AX | 10100100 |
14 | IX | 10100100 |
DIPHTONGS
48 | EY | 10110100 |
49 | AY | 10110100 |
50 | OY | 10110100 |
51 | AW | 10010100 |
52 | OW | 10010100 |
53 | UW | 10010100 |
21 | YX | 10000100 |
20 | WX | 10000100 |
18 | RX | 10000100 |
19 | LX | 10000100 |
37 | /X | 01000000 |
30 | DX | 01001000 |
22 | WH | 01000100 |
VOICED CONSONANTS
23 | R* | 01000100 |
24 | L* | 01000100 |
25 | W* | 01000100 |
26 | Y* | 01000100 |
27 | M* | 01001100 |
28 | N* | 01001100 |
29 | NX | 01001100 |
54 | B* | 01001110 |
57 | D* | 01001110 |
60 | G* | 01001110 |
44 | J* | 01001100 |
38 | Z* | 01000100 |
39 | ZH | 01000100 |
40 | V* | 01000100 |
41 | DH | 01000100 |
unvoiced CONSONANTS
32 | S* | 01000000 |
33 | SH | 01000000 |
34 | F* | 01000000 |
35 | TH | 01000000 |
66 | P* | 01001011 |
69 | T* | 01001011 |
72 | K* | 01001011 |
42 | CH | 01001000 |
36 | /H | 01000000 |
43 | ** | 01000000 |
45 | ** | 01000100 |
46 | ** | 00000000 |
47 | ** | 00000000 |
55 | ** | 01001110 |
56 | ** | 01001110 |
58 | ** | 01001110 |
59 | ** | 01001110 |
61 | ** | 01001110 |
62 | ** | 01001110 |
63 | GX | 01001110 |
64 | ** | 01001110 |
65 | ** | 01001110 |
67 | ** | 01001011 |
68 | ** | 01001011 |
70 | ** | 01001011 |
71 | ** | 01001011 |
73 | ** | 01001011 |
74 | ** | 01001011 |
75 | KX | 01001011 |
76 | ** | 01001011 |
77 | ** | 01001011 |
SPECIAL
78 | UL | 10000000 |
79 | UM | 11000001 |
80 | UN | 11000001 |
31 | Q* | 01001100 |
*/
////////////////////////////////////////////////////////////////////////////////////////////
//
// RenderTabs
//
////////////////////////////////////////////////////////////////////////////////////////////
const unsigned char tab48426[5] = {0x18, 0x1A, 0x17, 0x17, 0x17};
const unsigned char tab47492[] = {0, 0, 0xE0, 0xE6, 0xEC, 0xF3, 0xF9, 0, 6, 0xC, 6};
const unsigned char amplitudeRescale[] = {
0,
1,
2,
2,
2,
3,
3,
4,
4,
5,
6,
8,
9,
0xB,
0xD,
0xF,
0 //17 elements?
};
// Used to decide which phoneme's blend lengths. The candidate with the lower score is selected.
// tab45856
const unsigned char blendRank[] = {0, 0x1F, 0x1F, 0x1F, 0x1F, 2, 2, 2, 2, 2,
2, 2, 2, 2, 5, 5, 2, 0xA, 2, 8,
5, 5, 0xB, 0xA, 9, 8, 8, 0xA0, 8, 8,
0x17, 0x1F, 0x12, 0x12, 0x12, 0x12, 0x1E, 0x1E, 0x14, 0x14,
0x14, 0x14, 0x17, 0x17, 0x1A, 0x1A, 0x1D, 0x1D, 2, 2,
2, 2, 2, 2, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B,
0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x17, 0x1D, 0x17, 0x17,
0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x17};
// Number of frames at the end of a phoneme devoted to interpolating to next phoneme's final value
//tab45696
const unsigned char outBlendLength[] = {0, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 3, 2, 4, 4, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 0, 1, 0, 1, 0, 5,
5, 5, 5, 5, 4, 4, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2,
0, 1, 2, 0, 2, 2, 0, 1, 3, 0, 2, 3, 0, 2, 0xA0, 0xA0};
// Number of frames at beginning of a phoneme devoted to interpolating to phoneme's final value
// tab45776
const unsigned char inBlendLength[] = {0, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 3, 3, 4, 4, 3, 3, 3, 3, 3, 1, 2, 3, 2, 1,
3, 3, 3, 3, 1, 1, 3, 3, 3, 2, 2, 3, 2, 3, 0, 0,
5, 5, 5, 5, 4, 4, 2, 0, 2, 2, 0, 3, 2, 0, 4, 2,
0, 3, 2, 0, 2, 2, 0, 2, 3, 0, 3, 3, 0, 3, 0xB0, 0xA0};
// Looks like it's used as bit flags
// High bits masked by 248 (11111000)
//
// 32: S* 241 11110001
// 33: SH 226 11100010
// 34: F* 211 11010011
// 35: TH 187 10111011
// 36: /H 124 01111100
// 37: /X 149 10010101
// 38: Z* 1 00000001
// 39: ZH 2 00000010
// 40: V* 3 00000011
// 41: DH 3 00000011
// 43: ** 114 01110010
// 45: ** 2 00000010
// 67: ** 27 00011011
// 70: ** 25 00011001
// tab45936
const unsigned char sampledConsonantFlags[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xF1, 0xE2, 0xD3, 0xBB, 0x7C, 0x95, 1, 2,
3, 3, 0, 0x72, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0x1B, 0, 0, 0x19, 0, 0, 0, 0, 0, 0, 0, 0, 0};
//tab45056
unsigned char freq1data[] = {
0x00, 0x13, 0x13, 0x13, 0x13, 0xA, 0xE, 0x12, 0x18, 0x1A, 0x16, 0x14, 0x10, 0x14, 0xE, 0x12,
0xE, 0x12, 0x12, 0x10, 0xC, 0xE, 0xA, 0x12, 0xE, 0xA, 8, 6, 6, 6, 6, 0x11,
6, 6, 6, 6, 0xE, 0x10, 9, 0xA, 8, 0xA, 6, 6, 6, 5, 6, 0,
0x12, 0x1A, 0x14, 0x1A, 0x12, 0xC, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 0xA, 0xA, 6, 6, 6, 0x2C, 0x13};
//tab451356
unsigned char freq2data[] = {0x00, 0x43, 0x43, 0x43, 0x43, 0x54, 0x48, 0x42, 0x3E, 0x28,
0x2C, 0x1E, 0x24, 0x2C, 0x48, 0x30, 0x24, 0x1E, 0x32, 0x24,
0x1C, 0x44, 0x18, 0x32, 0x1E, 0x18, 0x52, 0x2E, 0x36, 0x56,
0x36, 0x43, 0x49, 0x4F, 0x1A, 0x42, 0x49, 0x25, 0x33, 0x42,
0x28, 0x2F, 0x4F, 0x4F, 0x42, 0x4F, 0x6E, 0x00, 0x48, 0x26,
0x1E, 0x2A, 0x1E, 0x22, 0x1A, 0x1A, 0x1A, 0x42, 0x42, 0x42,
0x6E, 0x6E, 0x6E, 0x54, 0x54, 0x54, 0x1A, 0x1A, 0x1A, 0x42,
0x42, 0x42, 0x6D, 0x56, 0x6D, 0x54, 0x54, 0x54, 0x7F, 0x7F};
//tab45216
unsigned char freq3data[] = {0x00, 0x5B, 0x5B, 0x5B, 0x5B, 0x6E, 0x5D, 0x5B, 0x58, 0x59,
0x57, 0x58, 0x52, 0x59, 0x5D, 0x3E, 0x52, 0x58, 0x3E, 0x6E,
0x50, 0x5D, 0x5A, 0x3C, 0x6E, 0x5A, 0x6E, 0x51, 0x79, 0x65,
0x79, 0x5B, 0x63, 0x6A, 0x51, 0x79, 0x5D, 0x52, 0x5D, 0x67,
0x4C, 0x5D, 0x65, 0x65, 0x79, 0x65, 0x79, 0x00, 0x5A, 0x58,
0x58, 0x58, 0x58, 0x52, 0x51, 0x51, 0x51, 0x79, 0x79, 0x79,
0x70, 0x6E, 0x6E, 0x5E, 0x5E, 0x5E, 0x51, 0x51, 0x51, 0x79,
0x79, 0x79, 0x65, 0x65, 0x70, 0x5E, 0x5E, 0x5E, 0x08, 0x01};
////////////////////////////////////////////////////////////////////////////////////////////
//
// Reciter
//
////////////////////////////////////////////////////////////////////////////////////////////
unsigned char inputtemp[256]; // secure copy of input tab36096
////////////////////////////////////////////////////////////////////////////////////////////
//
// Render
//
////////////////////////////////////////////////////////////////////////////////////////////
//timetable for more accurate c64 simulation
int timetable[5][5] = {
{162, 167, 167, 127, 128},
{226, 60, 60, 0, 0},
{225, 60, 59, 0, 0},
{200, 0, 0, 54, 55},
{199, 0, 0, 54, 54}};
unsigned oldtimetableindex;
const unsigned char ampl1data[] = {0, 0, 0, 0, 0, 0xD, 0xD, 0xE, 0xF, 0xF, 0xF, 0xF,
0xF, 0xC, 0xD, 0xC, 0xF, 0xF, 0xD, 0xD, 0xD, 0xE, 0xD, 0xC,
0xD, 0xD, 0xD, 0xC, 9, 9, 0, 0, 0, 0, 0, 0,
0, 0, 0xB, 0xB, 0xB, 0xB, 0, 0, 1, 0xB, 0, 2,
0xE, 0xF, 0xF, 0xF, 0xF, 0xD, 2, 4, 0, 2, 4, 0,
1, 4, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0,
0, 0xC, 0, 0, 0, 0, 0xF, 0xF};
const unsigned char ampl2data[] = {
0, 0, 0, 0, 0, 0xA, 0xB, 0xD, 0xE, 0xD, 0xC, 0xC, 0xB, 9, 0xB, 0xB, 0xC, 0xC, 0xC, 8,
8, 0xC, 8, 0xA, 8, 8, 0xA, 3, 9, 6, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5,
3, 4, 0, 0, 0, 5, 0xA, 2, 0xE, 0xD, 0xC, 0xD, 0xC, 8, 0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0xA, 0, 0, 0xA, 0, 0, 0};
const unsigned char ampl3data[] = {0, 0, 0, 0, 0, 8, 7, 8, 8, 1, 1, 0, 1, 0, 7, 5,
1, 0, 6, 1, 0, 7, 0, 5, 1, 0, 8, 0, 0, 3, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0xE, 1,
9, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 5, 0, 0x13, 0x10};
//tab42240
const signed char sinus[256] = {
0, 3, 6, 9, 12, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46,
49, 51, 54, 57, 60, 63, 65, 68, 71, 73, 76, 78, 81, 83, 85, 88,
90, 92, 94, 96, 98, 100, 102, 104, 106, 107, 109, 111, 112, 113, 115, 116,
117, 118, 120, 121, 122, 122, 123, 124, 125, 125, 126, 126, 126, 127, 127, 127,
127, 127, 127, 127, 126, 126, 126, 125, 125, 124, 123, 122, 122, 121, 120, 118,
117, 116, 115, 113, 112, 111, 109, 107, 106, 104, 102, 100, 98, 96, 94, 92,
90, 88, 85, 83, 81, 78, 76, 73, 71, 68, 65, 63, 60, 57, 54, 51,
49, 46, 43, 40, 37, 34, 31, 28, 25, 22, 19, 16, 12, 9, 6, 3,
0, -3, -6, -9, -12, -16, -19, -22, -25, -28, -31, -34, -37, -40, -43, -46,
-49, -51, -54, -57, -60, -63, -65, -68, -71, -73, -76, -78, -81, -83, -85, -88,
-90, -92, -94, -96, -98, -100, -102, -104, -106, -107, -109, -111, -112, -113, -115, -116,
-117, -118, -120, -121, -122, -122, -123, -124, -125, -125, -126, -126, -126, -127, -127, -127,
-127, -127, -127, -127, -126, -126, -126, -125, -125, -124, -123, -122, -122, -121, -120, -118,
-117, -116, -115, -113, -112, -111, -109, -107, -106, -104, -102, -100, -98, -96, -94, -92,
-90, -88, -85, -83, -81, -78, -76, -73, -71, -68, -65, -63, -60, -57, -54, -51,
-49, -46, -43, -40, -37, -34, -31, -28, -25, -22, -19, -16, -12, -9, -6, -3};
//tab42496
const unsigned char rectangle[] = {
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70,
0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70,
0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70,
0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, //
//
:?:?
N0x700x70L;@;@LJ,, NH<A<A1/0x7070int=B=B,, intintint>C>C 0x700x70?D?DSTM32SAM:,, STM32SAM:@E@E::90x7070((,,AFAF Parser1Parser1))BGBG0x700x70 CHCH,, {{DIDI
0x7070,, EJEJ
 4510FKFKintintint0x7070GLGLint,,  HMHMii0x700x70ININ;;,, 
JOJO 0x7070KPKP,, unsignedLQLQunsignedunsigned0x700x70unsignedMRMR ,, NSNScharcharcharchar4466r0x7070OTOT,,  PUPU sign1sign10x700x70QVQV,, ;;
RWRW 0x7070,,SXSX   unsignedunsignedTYTYunsigned0x700x70unsigned UZUZ,, charV[V[charchar0x7070char,,W\W\  "sign2sign2X]X]0x700x700,, Y^Y^;;x`mem61mem61,,Z_Z_ `r`;;[`[`s`
''AA'' \a\a`,,x` ]b]bx`unsignedunsignedunsignedunsigned^c^c'Y'''YY'' _d_dshort,,` 1035 `e`e``shortshortshortafaf''))'' mem62,,bgbg`` mem62`chch;;804` '=''didi'==''``#ejej,,`! 
`fkfk `''EE''glgl`,,`unsignedhmhm unsigned2723
unsignedunsignedinin 'Y'''YY''jojo```,,charcharkpkp
charchar lqlq `''55'' mrmr1432 `mem64mem64nsns|| a8561`otot;;  `0x8080pupu`(`& ,, `qvqv``unsigned2575
rwrw'('''((''unsignedunsignedsxsxunsigned,, tytycharaaa''AuzuzA''charcharchar,,v{v{  a#amem65mem65w|w|1a'U'''UU''x}x}
a;;  ,,ay~y~ 1908t aazz +a''))''{{#a,,#aunsigned ||unsignedunsignedunsigned }}'='''==''char0a~~,a,,,a charcharchar4221 7a''AA''Oamem66mem66,,]a 8787S"6a;;  Ka'O'''OO''8a:a ,,Wa
OaOaunsignedunsigned''44'' unsignedunsigned|| char\aXaXa0x8080charcharchar ,, haKmem36653mem36653'#'''##''la ea;;,,fa
5288ga
 xa''::''la,,inputtemp[inputtemp [00{awa'('''(('']] 2483==za,,  a|a323222''AA''aa,,b a;;}a
~a'L'''LL''
a ,, aaa ''))''a,,a1a/  aaXX' ''' '' a== ,,2910^ 11
 aaa''==''a,,a;; a
a8152'U'''UU'v<textrealint8datecharblobdecbitint  kv_v av
// phoneme.
// phoneme.
phoneme.
phoneme.
rvovqv//
//
 vvv&xv$ //
vvv//
 vv3386: 4187[++v 
w\G(?i)(?:[0-9]+)09vEvC09  __az$$__azRw$$W__azwDwB 23564 Yw(?:/\*)Vw\G(?i)(?:/\*)Xw/*/*//
//
////(?:\*/)
\G(?i)(?:\*/) */*/w****]wF\G(?i)(?:[^/*]+)1755**//_wD**//  w\G(?i)(?:[/*])**//wGwE**// w\G(?i)(?:[^']+)ww&((?:'')//
//
\G(?i)(?:'')''
 ''>x\G(?i)(?:')wE'''wC \G(?i)(?:[^"]+) x!!#Bx@\G(?i)(?:"")""Dx> ""x\G(?i)(?:")x"""x//
//
xx>4279x<  5240yxBx@ Syy>y<  yWyHYyF yyKyI  8zyFyD 7213-}z<zA>z? //
zzz//
 zz&z$ zzz//
//
45712759
zz5z3  +{z9z7 f{/{71{5  {j{>l{< {{5{3  |{2{0 J||/|-  |N|9P|7 ||9|7  }|@|> G} };}9  z}K}/M}- }~}:}8  }}.}, }}}//
//
2~}=};4907+ / t~6~>8~< ~x~Gz~E //
~~~//
 ~8~6 3-+  g709. 9764$&k/m-650  :8 
23364343phase3phase3 == mem49mem49 -- ʕphase1phase1ȕ;;  ɕȕAA ==˕ ҕӕ̕phase1 phase1 ԕ++ ܕՕphase2phase2;;ە 11757-ݕߕ mem38mem38 == AA;;

  XX 1242== 5556AA;;
 XX --!==  %  2253

1;;#
$   2-  ifif-13894F6ifif((  0((8L  XX &&4 9

61281282828=  )): <==  ;== 00@   ɗ))>
? NLdodododo ] OQ while No. 2
while No. 2
k×i{{j
{ }
//pos47810:
//pos47810:
pos47810:
pos47810:

1109U&$ΖЖ&I68l6163  Y[!!|~""
ȗ##×mem40mem40 ==ʗ$$ ӗ˗ % %mem38mem38З;;!&!&ї
җ
"'"'ifififif((#(#(mem47Cmem47 $)$)==== %*%*1681686868&+&+y2790))Y ',', // pitch
(-(-// pitch
pitch
pitch
).).4410 */*/{{
_+0+0#<%:,1,1s:u8Ҙ-2-2Ø
ј.3.3unsigned/4/4unsignedunsignedunsigned 0505charcharcharchar1616 ;;H
2727 0x1A1AU,,3838 Mmem39214 mem39214 49490x420x42W== 00,, 5:5:[ca6;6;0x4242,,_ 7<7<Y;;Z
0x420x428=8= `,,_9>9>
XX ==b :?:?0x6E0x6Ef88,, ;@;@}w;;<A<A0x6E6Ed,,
=B=Be l0x6E0x6E>C>Cjdodoj,, dodo ?D?D o0x5454@E@E{{,,m 
AFAFn 0x540x54BGBG|w,, carrycarry CHCH==~ 0x5454DIDI,, EJEJmem39212 mem392120x1A0x1A FKFK&& ,, 11GLGL0x1A1A,,HMHM ;;ININ0x1A0x1A
 JOJO,, mem39212 KPKPmem392120x4242 ,,LQLQ
== 137725MRMR 0x4242mem39212NSNS,,mem39212 >>OTOT>>0x420x42 PUPU11,, QVQV0x6D6D;;,,RWRW 
 SXSX 0x560x56TYTY,, ifififif((UZUZ0x6D6D,,V[V[ carrycarry !!W\W\4190x540x54== 00X]X],, :Y^Y^80x5454)) ,,Z_Z_  j2[`[`0x540x54{{,, \a\a
 & Q]b]b0x7F7F,,
^c^c% 0x7F0x7F_d_d72carry}}carry `e`e==9;; 
afaf= 00bgbg//tab45216
KI;;;chch
<unsigned didi JIAAejej charcharL== fkfkW hfreq3data[glgl]] ==M hmhmmem39215mem39215c;;Uinin
V{{ jojo gc0x0000kpkptemp,, temp ==ilqlq p0x5B5B((,,mrmrq intnknsnsintint0x5B0x5Bint))otot,, stAAopupu 0x5B5Br,,++ qvqv  ((rwrw0x5B0x5Bw143]tintintsxsx,, intint))tyty0x6E6E3uzuz,,2849! x mem39213v{v{mem392130x5D0x5Dw|w|;;,,
 x}x} 35840x5B5By~y~,,<svg viewBox="0 0 16 16" class="svg octicon-broadcast" aria-hidden="true" width="16" height="16"><path d="M8.75 8.582v5.668a.75.75 0 0 1-1.5 0V8.582a1.75 1.75 0 1 1 1.5 0m3.983-7.125a.75.75 0 0 1 1.06.026A7.98 7.98 0 0 1 16 7c0 2.139-.84 4.083-2.207 5.517a.75.75 0 1 1-1.086-1.034A6.47 6.47 0 0 0 14.5 7a6.47 6.47 0 0 0-1.793-4.483.75.75 0 0 1 .026-1.06m-9.466 0c.3.286.312.76.026 1.06A6.47 6.47 0 0 0 1.5 7a6.47 6.47 0 0 0 1.793 4.483.75.75 0 0 1-1.086 1.034A7.97 7.97 0 0 1 0 7c0-2.139.84-4.083 2.207-5.517a.75.75 0 0 1 1.06-.026m8.556 2.321A5 5 0 0 1 13 7a5 5 0 0 1-1.177 3.222.75.75 0 1 1-1.146-.967A3.5 3.5 0 0 0 11.5 7c0-.86-.309-1.645-.823-2.255a.75.75 0 0 1 1.146-.967m-6.492.958A3.48 3.48 0 0 0 4.5 7a3.48 3.48 0 0 0 .823 2.255.75.75 0 0 1-1.146.967A4.98 4.98 0 0 1 3 7a4.98 4.98 0 0 1 1.188-3.236.75.75 0 1 1 1.143.972"/></svg>nto foi eliminado.",
"repo.release.deletion_tag_desc": "E<svg viewBox='0 0 32 32'><path fill='#ef5350' d='M28.967 12H9.442a2 2 0 0 0-1.898 1.368L4 24V10h24a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464l-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h22l4.805-11.212A2 2 0 0 0 28.967 12'/><path fill='#ffcdd2' d='m31.87 19.917-1.307-1.378a.477.477 0 0 0-.691-.001l-7.156 7.538-3.057-3.23a.48.48 0 0 0-.345-.148h-.001a.48.48 0 0 0-.345.148l-1.31 1.377a.477.477 0 0 0 0 .657l4.721 4.972a.477.477 0 0 0 .691 0l8.8-9.28a.476.476 0 0 0 0-.655'/><path fill='#ffcdd2' d='M21.292 23.336a.48.48 0 0 0 .448.314h1.94a.476.476 0 0 0 .446-.642l-4.74-12.698a.48.48 0 0 0-.446-.31h-1.724a.48.48 0 0 0-.447.31l-4.74 12.698a.476.476 0 0 0 .447.642h1.94a.48.48 0 0 0 .448-.317l.926-2.612h4.558Zm-1.97-5.523h-2.49l1.245-3.495Z'/></svg><svg viewBox="0 0 16 16" class="svg octicon-bug" aria-hidden="true" width="16" height="16"><path d="M4.72.22a.75.75 0 0 1 1.06 0l1 .999a3.5 3.5 0 0 1 2.441 0l.999-1a.748.748 0 0 1 1.265.332.75.75 0 0 1-.205.729l-.775.776c.616.63.995 1.493.995 2.444v.327q0 .15-.025.292c.408.14.764.392 1.029.722l1.968-.787a.75.75 0 0 1 .556 1.392L13 7.258V9h2.25a.75.75 0 0 1 0 1.5H13v.5q-.002.615-.141 1.186l2.17.868a.75.75 0 0 1-.557 1.392l-2.184-.873A5 5 0 0 1 8 16a5 5 0 0 1-4.288-2.427l-2.183.873a.75.75 0 0 1-.558-1.392l2.17-.868A5 5 0 0 1 3 11v-.5H.75a.75.75 0 0 1 0-1.5H3V7.258L.971 6.446a.75.75 0 0 1 .558-1.392l1.967.787c.265-.33.62-.583 1.03-.722a1.7 1.7 0 0 1-.026-.292V4.5c0-.951.38-1.814.995-2.444L4.72 1.28a.75.75 0 0 1 0-1.06m.53 6.28a.75.75 0 0 0-.75.75V11a3.5 3.5 0 1 0 7 0V7.25a.75.75 0 0 0-.75-.75ZM6.173 5h3.654A.17.17 0 0 0 10 4.827V4.5a2 2 0 1 0-4 0v.327c0 .096.077.173.173.173"/></svg>elet<svg viewBox='0 0 32 32'><defs><linearGradient id='a' x1='30.58' x2='17.816' y1='13.808' y2='26.573' gradientUnits='userSpaceOnUse'><stop offset='.15' stop-color='#2196f3'/><stop offset='.85' stop-color='#f50057'/></linearGradient></defs><path fill='#546e7a' d='M28.967 12H9.442a2 2 0 0 0-1.898 1.368L4 24V10h24a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464l-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h22l4.805-11.212A2 2 0 0 0 28.967 12'/><path fill='#cfd8dc' d='M23 16a3 3 0 1 1-3 3 3 3 0 0 1 3-3m0-2a5 5 0 1 0 5 5 5 5 0 0 0-5-5'/><path fill='url(#a)' d='M16 20a7.1 7.1 0 0 0 1.5 3.41l-1.421 1.426A9.05 9.05 0 0 1 14 20Zm15.944-2.003A9.015 9.015 0 0 0 24 10v2a7.085 7.085 0 0 1 0 14v2a9.03 9.03 0 0 0 7.944-10.003m-14.414 8.23A9.07 9.07 0 0 0 22 28v-2a7.1 7.1 0 0 1-3.03-1.218Z'/></svg><svg viewBox='0 0 32 32'><path fill='#0288d1' d='m13.844 7.536-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464'/><path fill='#90caf9' d='M24 19.06a1.33 1.33 0 0 0 .3 1.04 2.5 2.5 0 0 0 .61.28c.54.18 1.33.37 2.09.62 2.64.88 2.96 2.32 2.99 3.49.01.16.01.31.01.46V25c0 1.06-.46 2.79-3.44 2.98-.13.01-.25.01-.37.01A1 1 0 0 1 26 28h-4v-1.76l.24-.24H26a2 2 0 0 0 .25-.01h.17c.18-.01.33-.03.47-.04a2 2 0 0 0 .27-.06c.07-.02.13-.04.19-.06a.04.04 0 0 0 .03-.01c.49-.18.59-.45.61-.66A1 1 0 0 0 28 25c0-.32-.68-1.23-3-2-2.74-.91-2.98-2.42-2.99-3.61a.6.6 0 0 1-.01-.13V19a2.85 2.85 0 0 1 .45-1.59c.04-.06.07-.11.11-.16.01-.01.01-.02.02-.03a1 1 0 0 1 .18-.2A4.3 4.3 0 0 1 25.91 16H30v2h-4c-.13 0-.26 0-.39.01-1.18.06-1.49.4-1.58.7a.13.13 0 0 0-.01.06A1 1 0 0 0 24 19ZM18 28h-2V18h-4v-2h10v2h-4Z'/></svg><svg viewBox='0 0 32 32'><path fill='#455a64' d='M28.967 12H9.442a2 2 0 0 0-1.898 1.368L4 24V10h24a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464l-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h22l4.805-11.212A2 2 0 0 0 28.967 12'/><path fill='#f5f5f5' d='M31.578 14.516A1.62 1.62 0 0 0 30.442 14a1.5 1.5 0 0 0-1.273.728l-6.255 8.823-.82-1.324a1.54 1.54 0 0 0-1.31-.756 1.52 1.52 0 0 0-1.331.827l-.783 1.253-3.795-5.52a1.54 1.54 0 0 0-1.352-.8 1.6 1.6 0 0 0-1.521 1.644 1.67 1.67 0 0 0 .366 1.066l5.026 7.205a1.506 1.506 0 0 0 2.686.058l.717-1.136.698 1.103a2 2 0 0 0 .178.266 2 2 0 0 0 .13.141l.106.092a2 2 0 0 0 .227.15l.1.05a1.4 1.4 0 0 0 .455.122l.123.008h.029a1.53 1.53 0 0 0 1.204-.617l7.61-10.702a1.7 1.7 0 0 0 .341-1.007 1.6 1.6 0 0 0-.42-1.158m-9.212 12.82'/></svg><svg viewBox='0 0 32 32'><path fill='#0277bd' d='M28.967 12H9.442a2 2 0 0 0-1.898 1.368L4 24V10h24a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464l-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h22l4.805-11.212A2 2 0 0 0 28.967 12'/><path fill='#e1f5fe' d='M22 8a10 10 0 0 0-8.356 4.51l.642.013c1.049 0 2.669-.125 2.669-.125a.413.413 0 0 1 .07.824l-1.155.119 3.648 10.803 2.188-6.56-1.559-4.243-1.061-.12a.414.414 0 0 1 .07-.823l2.632.125c1.049 0 2.67-.125 2.67-.125a.413.413 0 0 1 .062.824l-1.143.119 3.612 10.72 1.002-3.332a12.7 12.7 0 0 0 .757-3.228 5.2 5.2 0 0 0-.83-2.764 4.67 4.67 0 0 1-.978-2.34 1.73 1.73 0 0 1 1.681-1.771h.127A10 10 0 0 0 22.001 8Zm8.777 5.201.07 1.037a9.5 9.5 0 0 1-.771 3.576l-3.053 8.822a10 10 0 0 0 3.754-13.435m-17.916.724A10.2 10.2 0 0 0 12 18.003 9.98 9.98 0 0 0 17.64 27Zm9.315 4.952-2.996 8.72a10.06 10.06 0 0 0 6.144-.164l-.073-.142Z'/></svg><svg viewBox="0 0 16 16" class="svg octicon-cloud-offline" aria-hidden="true" width="16" height="16"><path d="M7.25 2c-.69 0-1.351.13-1.957.371a.75.75 0 1 0 .554 1.394c.43-.17.903-.265 1.403-.265a3.72 3.72 0 0 1 3.541 2.496.75.75 0 0 0 .709.504c1.676 0 3 1.324 3 3a3 3 0 0 1-.681 1.92.75.75 0 0 0 1.156.955A4.5 4.5 0 0 0 16 9.5a4.47 4.47 0 0 0-3.983-4.471A5.22 5.22 0 0 0 7.25 2M.72 1.72a.75.75 0 0 1 1.06 0l2.311 2.31q.045.038.08.08l8.531 8.532.035.034 2.043 2.044a.749.749 0 0 1-.326 1.275.75.75 0 0 1-.734-.215l-1.8-1.799a5 5 0 0 1-.42.019h-8A3.474 3.474 0 0 1 0 10.5c0-1.41.809-2.614 2.001-3.17a5.2 5.2 0 0 1 .646-2.622L.72 2.78a.75.75 0 0 1 0-1.06M3.5 7.25q.006.242.041.481a.75.75 0 0 1-.557.833c-.86.22-1.484.986-1.484 1.936 0 1.124.876 2 2 2h6.94L3.771 5.832A3.8 3.8 0 0 0 3.5 7.25"/></svg>…",
"graphs.component_loading_failed": "Não foi possível carregar %s",
"graphs.component_lo<svg viewBox='0 0 32 32'><path fill='#0277bd' d='m13.844 7.536-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464'/><path fill='#e1f5fe' d='M22 8a10 10 0 0 0-8.356 4.51l.642.013c1.049 0 2.669-.125 2.669-.125a.413.413 0 0 1 .07.824l-1.155.119 3.648 10.803 2.188-6.56-1.559-4.243-1.061-.12a.414.414 0 0 1 .07-.823l2.632.125c1.049 0 2.67-.125 2.67-.125a.413.413 0 0 1 .062.824l-1.143.119 3.612 10.72 1.002-3.332a12.7 12.7 0 0 0 .757-3.228 5.2 5.2 0 0 0-.83-2.764 4.67 4.67 0 0 1-.978-2.34 1.73 1.73 0 0 1 1.681-1.771h.127A10 10 0 0 0 22.001 8Zm8.777 5.201.07 1.037a9.5 9.5 0 0 1-.771 3.576l-3.053 8.822a10 10 0 0 0 3.754-13.435m-17.916.724A10.2 10.2 0 0 0 12 18.003 9.98 9.98 0 0 0 17.64 27Zm9.315 4.952-2.996 8.72a10.06 10.06 0 0 0 6.144-.164l-.073-.142Z'/></svg>crição",
"org.team_name_helper": "Nomes das equipas devem ser curtos e memoráveis.",
"org.team_desc_helper": "Descreva o L` L` L` L` L` 
iapa,Z ( (' ( ( (
(T ( (T ( (a" ( (m 2aRZ(& ( (q ( ( (@ (& ( (A (@ (i ( ( ( @ (! ( ( ( 4 (ix ( (3@!2 (! 3 (!P3 ( (Ě (pF (z$ ( ( (1c1c1#1c1c1#1c1mV۶-%X.
</body></html>a href="../README.md"><strong>brk-client</strong></a></p>
<hr>
<p dir="auto"><a href="../globals.md">brk-client</a> / ErrorBody</p>
<h1>Interface: ErrorBody</h1>
<p dir="auto">Defined in: <a href="https://github.com/bitcoinresearchkit/brk/blob/d4dc1b9e4900e3787f2a133b8cac5d304acff9bf/modules/brk-client/index.js#L350">Developer/brk/modules/brk-client/index.js:350</a></p>
<h2>Properties</h2>
<h3>error</h3>
<blockquote>
<p dir="auto"><strong>error</strong>: <a href="ErrorDetail.md"><code>ErrorDetail</code></a></p>
</blockquote>
<p dir="auto">Defined in: <a href="https://github.com/bitcoinresearchkit/brk/blob/d4dc1b9e4900e3787f2a133b8cac5d304acff9bf/modules/brk-client/index.js#L351">Developer/brk/modules/brk-client/index.js:351</a></p>
<p dir="auto"><a href="/Mirror/brk/src/commit/d038141a8ae64623ca3637394463c523785ac308/modules/brk-client/docs/README.md"><strong>brk-client</strong></a></p>
<hr/>
<p dir="auto"><a href="/Mirror/brk/src/commit/d038141a8ae64623ca3637394463c523785ac308/modules/brk-client/docs/globals.md">brk-client</a> / ErrorBody</p>
<h1 id="user-content-interface-errorbody">Interface: ErrorBody</h1>  git.Run(by:gitcmd.(*Command).StartWithStderr, repo:.../mirror/momentum-firmware.git): /usr/bin/git log --name-status -c "--format=commit%x00%H %P%x00" --parents --no-renames -t -z 584c0962d8685c02669ea81a9dba0ee1e1d0c4b6 -- :(literal)bootloader :(literal)bootloader/Makefile :(literal)bootloader/ReadMe.md :(literal)bootloader/src.25 0 0 0 .25-.25V4.664a.25.25 0 0 0-.073-.177l-2.914-2.914a.25.25 0 0 0-.177-.073ZM8 3.25a.75.75 0 0 1 .75.75v1.5h1.5a.75.75 0 0 1 0 1.5h-1.5v1.5a.75.75 0 0 1-1.5 0V7h-1.5a.75.75 0 0 1 0-1.5h1.5V4A.75.75 0 0 1 8 3.25m-3 8a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75"/></svg>742-3.955 1.715c-1.124.967-1.954 2.096-2.366 2.717M8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10"/></svg>4.948Z"/></svg>9.3 0 0 1-141.5 65.8 281 281 0 0 1-123.9-11.4 267.2 267.2 0 0 1-181.7-269.9c2-27.6 5.7-47.6 13.3-70.7a281.2 281.2 0 0 1 46.4-85c8-10.1 28-30.2 37.9-38.1 13.8-11.1 24.5-18.3 24.5-16.4"/></svg> Auto </div>est app, part 2
* Minor updates while travelling
* Switched from const char to FuriString. Using Temp module copy for development to spare compile time
* Option to limit number output with min and max values
* Preparations for option to change number sign from + to -
* Preparations for option to change number sign from + to -
* Preparing for testing
* counter automatic API version change
* added trailing comma in application.fam ... because the lint check wants it¿
* removed unused callback NumberChangedCallback
* change uint8_t to size_t in number_input_backspace_cb
* Removal of unused view_stack in demo app
* copied module to app folder for faster development (remove later)
* Replaced all uint8_t with size_t... removed unused logic for selected_row &lt; 0
* Optimize use of canvas_set_color
* Remove alloc/free of furistring that actually is a pointer
* Dynamic Header text with min/max in Example
* Removed the need of useSign in Model
* Number_input Removed sign from model, started transfer from text to int32_t
* number_input FuriString in input_show_number
* number_input FuriString in input_show_number
* limiting inputs for min/max values
* limiting inputs for min/max values
* number_input change save button on invalid numbers
* input_number update demo app to allow change of min/max
* number input fine tuning
* number_input, Remove temp development folder
* number_input, fbt format
* Bump CSV Files
* Clear input if value is zero
* number_input: handle null on header text
* number_input: change keyboard values to char
* number input: Remove static on char for header text, change numbers to INT32_MIN/INT32_MAX
* number_input: removal of dead code
* number_input: fix for crash if number_input not opened before free
* number_input: added icon for example app
* number_input: Replaced view for show_number with DialogEx
* Number_input: FBT Format
* number_input: bump csv versions
* number_input: allow negative input if max_value is 0
* Number_input: linting / format
* Removed dead code, fbt format
* Examples: cleanup number input code
* Examples: moar code cleanup in number input, simplify as much as possible, highlight incorrect input handling
* Gui: correctly handle INT_MAX and INT_MIN
* Gui: fix memory leak in number input module
Co-authored-by: David Lee &lt;<a href="mailto:david.lee@arcmedia.ch" data-markdown-generated-content="">david.lee@arcmedia.ch</a>&gt;
Co-authored-by: Aleksandr Kutuzov &lt;<a href="mailto:alleteam@gmail.com" data-markdown-generated-content="">alleteam@gmail.com</a>&gt;
Co-authored-by: WillyJL &lt;<a href="mailto:49810075+Willy-JL@users.noreply.github.com" data-markdown-generated-content="">49810075+Willy-JL@users.noreply.github.com</a>&gt;
Co-authored-by: gornekich &lt;<a href="mailto:n.gorbadey@gmail.com" data-markdown-generated-content="">n.gorbadey@gmail.com</a>&gt; class="mh" class="p"'(''zz'((''1436 class="mh" class="p"{{ class="mh",, class="p" class="mh"|| class="p" class="mh" class="p" class="mh"''O}}O'' class="p" class="mh",, class="p"~~ class="mh" class="p" class="mh" class="p" class="mh" class="p"'U'''UU'' class="mh" class="p" class="mh",, class="p" class="mh" class="p"3957u00 class="mh" class="p" class="mh"''GG'' class="p" class="mh",, class="p" class="mh" class="p" class="mh" class="p" class="p" class="c1"'H'''HH'' class="c1" class="k" class="kt",, class="kt" class="n" class="p" class="p" class="o" class="p"''TT'' class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p" class="mi"')'''))'' class="p" class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p"''=='' class="mi" class="p",, class="mi"
 class="p" class="mi" class="p" class="mi" class="p" class="mi"'A'''AA'' class="p" class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p"''OO'' class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p" class="mi"'5'''55'' class="p" class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p"''TT''   class="mi" class="p" class="mi"||  class="p" class="mi"4609 class="p" class="mi" class="p"0x8080 class="mi"2786
class="p" class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi"'('''(('' class="p" class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p"''OO'' class="mi" class="p",, class="mi" class="p"  class="mi" class="p" class="mi" class="p" class="mi"'U'''UU'' class="p" class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p"''GG'' class="mi" class="p",, class="mi"
class="p" class="mi" class="p" class="mi" class="p" class="mi"'H'''HH'' class="p" class="mi" class="p"2313,, class="mi" class="p" class="mi" class="p" class="mi" class="p"''))'' class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p" class="mi"'='''=='' class="p" class="mi" class="p",, class="mi"  class="p" class="mi" class="p" class="mi" class="p"''AA'' class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p" class="mi"'H''4623'HH'' class="p" class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p"''55'' class="mi" class="p",, class="mi" class="p" class="mh" class="p" class="mh" class="p" class="p"'F'''FF'' || class="c1" class="c1" class="k"  class="kt" class="kt" class="n" class="p"0x800x80 class="p" class="o" class="p",, class="mi"  class="p" class="mi" class="p" class="mi" class="p"'' '' class="mi" class="p",, class="mi"
class="p" class="mi" class="p" class="mi" class="p" class="mi"'('''(('' class="p" class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p"''OO'' class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p" class="mi"'U'''UU'' class="p" class="mi" class="p",, class="mi"  class="p" class="mi" class="p" class="mi" class="p"''))'' class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p" class="mi"'='''=='' class="p" class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p"''AA'' class="mi" class="p",, class="mi" class="p"  class="mi" class="p" class="mi" class="p" class="mi"'W'''WW'' || class="p" class="mi" class="p"  class="mi" class="p" class="mi" class="p"0x800x80 class="mi" class="p" class="mi",, class="p"  class="mi" class="p" class="mi" class="p" class="mi"''HH'' class="p" class="mi",, class="p"
class="mi" class="p" class="mi" class="p"757 class="mi" class="p"'('''(('' class="mi" class="p" class="mi",,2207 class="p" class="mi" class="p" class="mi" class="p" class="mi"''OO''337Q class="p" class="mi",, class="p" class="mi" class="p" class="mi" class="p" class="mi" class="p"'U'''UU'' class="mi" class="p" class="mi",, class="p" class="mi" class="p" class="mi" class="p" class="mi"''))'' class="p" class="mi",, class="p" class="mi"  class="p" class="mi" class="p" class="mi" class="p"'S'''SS'' class="mi" class="p" class="mi",, class="p" class="mi" class="p" class="mi" class="p" class="mi"''##'' class="p" class="mi",, class="p" class="mi" class="p" class="mi" class="p" class="mi" class="p"'='''=='' class="mi" class="p" class="mi",, class="p" class="mi" class="p" class="mi" class="p" class="mh"''AA'' class="p" class="mh",, class="p"
class="p"  class="c1" class="c1" class="c1" class="c1" class="c1"'W'''WW'' class="c1" class="c1" class="c1",, class="c1" class="c1" class="c1" class="c1" class="c1" class="c1"''44''  class="c1" class="c1" class="c1"|| class="c1" class="k" class="kt" class="kt" class="n"0x8080 class="p" class="p" class="o" class="p",, class="mi" class="p" class="mi" class="p" class="mi"'('''(('' class="p" class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p"''OO'' class="mi" class="p",, class="mi" class="p" 1388l class="mi" class="p" class="mi" class="p" class="mi"'U'''UU'2847 '15269 class="p" class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p"''SS'' class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p" class="mi"')'''))'' class="p" class="mi" class="p",, class="mi" class="p" class="mi"   class="p" class="mi" class="p"''==''

 class="mi" class="p",, class="mi"
   class="p" class="mi" class="p" class="mi"   class="p" class="mi"'A'''AA''   class="p" class="mi" class="p",, class="mi"   class="p" class="k" class="kt"'=''

'=='' class="kt"   class="n" class="p",, class="mi"   class="p" class="o" class="p" class="mh" class="p"  ''OO'' class="mh" class="p",, class="mh" class="p" class="mh" class="p" class="mh" class="p" class="p"'W'''WW'' || class="k" class="kt" class="kt"  class="n" class="p"1445 class="p" class="o"0x800x80 class="p" class="mi" class="p",, class="mi"  class="p" class="mh" class="p" class="mh" class="p"''(('' class="mh" class="p",, class="mh" class="p" class="mh" class="p" class="mi" class="p" class="mi"'O'''OO'' class="p" class="mh" class="p",, class="mi"  class="p" class="p" class="k" class="kt" class="kt"  ''))'' class="n" class="p",,!! class="p" class="o" class="p" class="mi""" class="p" class="mi" class="p"'^'''^^'##' class="mi" class="p" class="mi",,$$ class="p"
 class="mi" class="p" % % class="mi" class="p" class="mi"''II''!&!& class="p" class="mi",, class="p" class="mi""'"' class="p" class="mi"2600 class="p"#(#( class="mi" class="p"'#'''##''$)$) class="mi" class="p" class="mi",,%*%* class="p" class="mh" class="p" class="mh"&+&+ class="p" class="mh"''=='' class="p"',', class="mi",, class="c1" class="p" (-(- class="p" class="c1" class="c1" class="k" class="kt").).'O'''OO'' class="kt"3228 */*/ class="n" class="p",, class="p" +0+0 class="o" class="p" class="mi" class="p"2297,1,1 class="mh"''WW''2373E class="p"-2-2 class="mh",, class="p" class="mh" .3.3 class="p" class="mh" class="p" class="mi" class="p"/4/4'5'''55'' || class="mi"0505 class="p" class="mi"  class="p" class="mi"1616 class="p" class="mi"0x800x80 class="p" class="mi"2727 class="p",, class="mi" 7467+3838 class="p" class="mi" class="p" class="mi" class="p"4949''(('' class="mi" class="p",,5:5: class="mi" class="p" class="mi" class="p"6;6; class="mh" class="p" class="mi"'O'''OO'7<7<' class="p" class="mi" class="p",,8=8= class="mi"
 class="p" class="mi"9>9> class="p" class="mh" class="p"''LL'':?:? class="mh" class="p",, class="mi" class="p";@;@ class="mi" class="p" class="mi" class="p"<A<A class="mh"')'''))'' class="p"=B=B class="mi" class="p",, class="mi" >C>C class="p" class="mh" class="p" class="mh" class="p"?D?D''DD'' class="mh" class="p",,@E@E class="mh"6059 class="p" class="mh"AFAF class="p" class="mh" class="p" class="mh"'=''BGBG'=='' class="p" class="mh" class="p"CHCH,, class="mh" class="p" class="mh"DIDI class="p" class="mh" class="p"''OO''EJEJ class="mh" class="p",, class="mh" class="p"FKFK class="mh" class="p" class="mh" class="p"GLGL class="mh"'W'''WW'' class="p"HMHM class="mh" class="p",, class="mh" ININ class="p" class="mi" class="p" class="mi" class="p"JOJO''44'' class="mi" class="p",,KPKP class="mi" class="p" class="mi" class="p"LQLQ class="mi" class="p" class="mh"'L'''LL'MRMR' || class="p" class="mh" class="p"NSNS  class="mh" class="p" class="mh" class="p"OTOT0x800x80 class="mh" class="p" class="mh",,PUPU class="p"
class="mh" class="p"QVQV class="mh" class="p"6247g,,RWRWww AA SXSXw== '%''3575 TYTY'%%''ww[[UZUZ,,w inputtempinputtempV[V[w7827w''=W\W\=''XX]],,wX]X]w ;;w
Y^Y^w 'I'''II''Z_Z_ww[`[`,,ifif w2717
\a\aifif((w''Y]b]bY''wAA ,,==^c^c
w ==w_d_d ww'4'''44'`e`e' ||767666afaf xx)) bgbg0x800x80wxchchw,,gotogoto gotogotodidi ww''(ejej(''w,,pos37108fkfkpos37108 w;;wglgl
w'E'''EE''hmhm w,,winin gotowgotogotogoto jojo''RR''wkpkp,,wpos36700 pos36700lqlqx;;w10356t(
mrmr'I'''II''w130312nsns
w,, ototwwpos37157:pos37157:pos37157pupu''))''pos37157::,,qvqv
w ifrwrwx2434wififif'#''sxsx'##''((xtyty,,
x x xuzuzx2836 AA !!''=v{v{=''x==,,xw|w|
 xxx}x}737333'I'''II'y~y~'Dxx)) ,,zz x3x
x{{gotogotogotogoto''YY'' ||x,,<x }}xpos36700pos36700x~~'4'''44'';;x
,,x "xxXX''RR''++x,,++(x5122 &x x;;!x'I'''II''
'x,, &xAA ==)x ''YY'' 8xAx|| *x inputtemp[inputtemp[5x0x8080XX4x]]>x,, ?x6x;;7x'('''((''
 @x,, 14850<x<xifififif((AA''EE''Fx,,Hx
3623'  Cx!!Bx== 78'R'''RR''GxEx7888,, x))\x Lx''II''gotoqx,,Hxgotogoto 6412 goto Wxzx')'''))''Mx
<p dir="auto">Defined in: <a href="https://github.com/bitcoinresearchkit/brk/blob/d4dc1b9e4900e3787f2a133b8cac5d304acff9bf/modules/brk-client/index.js#L350">Developer/brk/modules/brk-client/index.js:350</a></p><h2 id="user-content-properties">Properties</h2>
<h3 id="user-content-error">error</h3>
<blockquote>
<p dir="auto"><strong>error</strong>: <a href="/Mirror/brk/src/commit/d038141a8ae64623ca3637394463c523785ac308/modules/brk-client/docs/interfaces/ErrorDetail.md"><code>ErrorDetail</code></a></p>
</blockquote>
<p dir="auto">Defined in: <a href="https://github.com/bitcoinresearchkit/brk/blob/d4dc1b9e4900e3787f2a133b8cac5d304acff9bf/modules/brk-client/index.js#L351">Developer/brk/modules/brk-client/index.js:351</a></p>
n n (3 (LZ (8 (@L.9x9 (sDȭC (n dp (o (@ ( (L0i# ( ( = (pIXIhIIIX>H>P>//X" ( (r (4 (..I (.. (..) (E#.9a ( , (0!$ (`@j (4 (..n dp` (o ( ( (L@Gj ( ( =l (pIXIhIIIX>H>P>//x@ (n n (r (LQj (+r (L"6 ( (| (x ( ( () (E#.9a (y (0!$ ( (x ( () ( ( `N (  (I ( (`f (0 (x (X () (E#.9a (p (0!$ (P ( ( (  (  ( (~mZk{(ZkZk'Kp{(QUU#Z* (@G (LE0 (e}])+ (-ɶ+ (1|78Y ( (8Y (L@Gj (8Y (=l (_?G)( (-~ (1%=C<Y (@T<Y (LE8@ (np ( @L ( ( ( (  ( (0 (  (P ( (A0 (Ђ (ɉ (!-2333
2333
2333!333UUUU&docs: update generated docs</body></html>[FL-2052] New build system based on scons (#1269)</body></html>ڪo (D |Ky0 (^ڪTo (R |~y
(ڪo@ (< |_y (j |ky$ (2ڪo ([ |y (cڪo (2i (UQ]QpQP]Q (ON (կv* 3i (UQ]QpQP]Q (ON (կv* , |JyUڪ!o$+C (LPGj (+b (L`Gj (L@Gj (LpGj (= (2 |`/C (Y |Gy6C (pڪjo:C ( |"yT (Hڪho (o |[y@ (@ڪzot ( ($^ | (0yڪ (o |< (Yy&ڪ (*oW | ( y0 (*****ԪRT**m******
'ڪ{o$ |iy]ڪo~ |wy_Aڪfo+`Tz6o@;O3 / (4?!Qd (` (" (" ( ( (ª (ت ( ( ( ( (H (] (s ( ( (ī (ͫ (H (kH  (LH( (RH ( (b )H (bHx (qH (rH (H  (h` (`!_^H ( HHh (>H (H`rW (YH0 (h` (`!_"Hp (:Hx (jHrW (**¢R*Ԫ¢J,*J'ϗ}},,153910.0.50.1:58432ϗ 
З
ї ''YY'',,֗sam sam((ڗ const_input'5'''55'' ||const_input,,  ,,0x800x80phoneticphonetic ,, singmode,singmode'' '', ,, pitchpitch,, ':'''::'',,speedspeed ,, mouth''(('' mouth,,,,   throat)throat'I'''II'')/,,! ;;
''EE'',,}}


3175g void')'''))''voidvoidvoid,, 50STM32SAM:STM32SAM'' '':*,,::4 sing+sing((char:'='''==''0charcharchar,, ** ;WB''AA''argv6,,argv))  >F{{'Y'''YY''<
=,, EBintB''44'' intintint|| 1296JsiiN0x8080;;G
H,, 
I 138225V'(''1703'((''N phonetic,,phonetic ==X \00''II''k,,
i `;;Z
[')'''))'' h,,` singmodesingmode==j''%%'' o,,11 x ;;'='''==''l
m,,
n ws''II''chars,,charcharchar const_input'Y'''YY'' ||const_input[[256 2565656]]0x800x80,, ;;8087

''(('' ,, forforforfor((ii'I''4893'II''3,,  == 00''EE'',,
<svg viewBox="0 0 16 16" class="svg octicon-cache" aria-hidden="true" width="16" height="16"><path d="M2.5 5.724V8c0 .248.238.7 1.169 1.159.874.43 2.144.745 3.62.822a.75.75 0 1 1-.078 1.498c-1.622-.085-3.102-.432-4.204-.975a6 6 0 0 1-.507-.28V12.5c0 .133.058.318.282.551.227.237.591.483 1.101.707 1.015.447 2.47.742 4.117.742q.61 0 1.183-.052a.751.751 0 1 1 .134 1.494Q8.676 15.999 8 16c-1.805 0-3.475-.32-4.721-.869-.623-.274-1.173-.619-1.579-1.041-.408-.425-.7-.964-.7-1.59v-9c0-.626.292-1.165.7-1.591.406-.42.956-.766 1.579-1.04C4.525.32 6.195 0 8 0s3.476.32 4.721.869c.623.274 1.173.619 1.579 1.041.408.425.7.964.7 1.59s-.292 1.165-.7 1.591c-.406.42-.956.766-1.578 1.04C11.475 6.68 9.805 7 8 7s-3.475-.32-4.721-.869a6 6 0 0 1-.779-.407m0-2.224c0 .133.058.318.282.551.227.237.591.483 1.101.707C4.898 5.205 6.353 5.5 8 5.5s3.101-.295 4.118-.742c.508-.224.873-.471 1.1-.708.224-.232.282-.417.282-.55s-.058-.318-.282-.551c-.227-.237-.591-.483-1.101-.707C11.102 1.795 9.647 1.5 8 1.5s-3.101.295-4.118.742c-.508.224-.873.471-1.1.708-.224.232-.282.417-.282.55"/><path d="M14.49 7.582a.375.375 0 0 0-.66-.313l-3.625 4.625a.375.375 0 0 0 .295.606h2.127l-.619 2.922a.375.375 0 0 0 .666.304l3.125-4.125A.375.375 0 0 0 15.5 11h-1.778z"/></svg>estones": "Этапы",
"repo.commits": "к RWRW 0x7070,,SXSX   unsignedunsignedTYTYunsigned0x700x70unsigned UZUZ,, charV[V[charchar0x7070char,,W\W\  &#34;sign2sign2X]X]0x700x700,, Y^Y^;;x`mem61mem61,,Z_Z_ `r`;;[`[`s`
 & & & &# &) &/ &5 &; &A &G
&M &S &Y &_ &e &k &q &w &} & & & & &   (eee<svg viewBox="0 0 16 16" class="svg octicon-law" aria-hidden="true" width="16" height="16"><path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736q.058.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04q-.317.265-.686.45C14.556 10.78 13.88 11 13 11a4.5 4.5 0 0 1-2.023-.454 3.5 3.5 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.25.25 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.25.25 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04q-.317.265-.686.45C4.556 10.78 3.88 11 3 11a4.5 4.5 0 0 1-2.023-.454 3.5 3.5 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.25.25 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0m2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"/></svg>
"repo.editor.filename_is_invalid": "Недопустимое имя файла: «%s».",
"repo.editor.branch_does_not_exist": "Ветка «%s» отсутствует в этом репозитории.",
"repo.editor.branch_already_exists": "Ветка «%s» уже существует в этом репозитории.",
"repo.editor.directory_is_a_file": "Имя каталога «%s» уже используется в качестве имени файла в этом репозитории.",
"repo.editor.filename_is_a_directory": "Имя файла «%s» уже ис g11h'H'''HH'' ||g;;g 
g  22820x800x80g14871525g80132575,,g Code39771();
Code39771();
g''((''g#g!,, 
 ggmem61mem61 =='B'''BB''g g,, hgmem36653mem36653''EE''gg,,4094;;g
 gg'I'''II'2583
'ggotogotogotogoto,,  gh4567pos36550pos36550''NN''h,,g;; g
g
g2227'G'''GG'':gpos36677:,,pos36677: pos36677pos36677:g
''))'' h,,11991.9i 9i AiAA ==h '='''=='' h h,,h mem57mem57  h&& 128''BB''hh,,1282828
 hhh;;'I'''II''h
h,,   hhififh''Y

Y''ifif((,, h   AhAA ==  h=='4'''44''  h !h,,00   7706Hh))

h ''II''$h  ,,hh  {{"h
#h  'H'''HH'' 57962493 9h,, ,h .h //36683: BRK
//36683: BRK
36683: BRK
''NN''36683: BRK
,, Gh AhAhreturn return'X'''XX'' ||returnreturn6510n  Kh00h0x800x80ii;;,,Ih 
Jh Rh3145I '' ''Oh,,Oh
}}353 Ph
Qh
  '('''((''h!!Vh-,,Xh+ ""hhXX''B##B'' h140546,,$$==  hh % %mem64hmem64 'O'''OO'!&!&7372'--h "'"',,h hh#(#(h'A''A'''A''TT''$)$)A''.j,,.j%*%* hh;;h&+&+
'H'''HH''h',', ,,h (-(-5840hmem62mem62 ==).).h'')~ (  ( jqO (vF ?d ~ (  ( jqO (vJ (fH|I (J (f|I (!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_4/span>!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_J (HPp (J (p ("k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="neUUUUJH (span><span class="nn">utH (">.</span><span class="nH  ( ="kn">import</span> <spa:H (span>
<span class="k">eH (ass="bp">self</span><spazH0 (pan><span class="p">,</sH< (ss="p">]</span> <span cl HD (<span class="p">,</span>(H (/span><span class="o">.<H (pan class="sa"></span><svH  (lass="s2">&#34;</span><sGH, (an> <span class="ow">notmHD (pan><span class="s2">int:H@@ ( pan class="p">]</span> <$H(@ (an> <span class="sa"></s6H@ (/span><span class="s2">&vH@ (n><span class="si">}</sphH A (">[</span><span class="scHA (nocd</span> <span class=EHpA (n><span class="o">.</spaHA ( :</span> <span class="n"5HB (n class="o">-</span><spa[HHB (s="n">mode</span> <span SHhB (set</span><span class="p0HB ( >)</span>
<span UHB (n">stm32</span><span cla0H C (ass="o">.</span><span class="n">Init</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne
& HHC (HC (HC (pHC (h` (`!_|rHpD (D (>HD (tH@E (AHE (JHE (h` (`!_4HE (HE (`HE (  (b (=HE (XF (`F (ZH (h` (`!_-HF (xHpG ( p?jH8G (G (G (EHG (
!HH (h` (`!_HsW (n (BI<HpH (xH (H ([HH (VHH (xHI (h` (`!_aH@I ( hoHI (I (I (8HsW (>+</span><span class="o">=</span> <span class="n">byte_str_1</span>
<span cl
&:{F{*/*/3811'W'''WW''+0+01{pos37335pos37335,,I{,1,1 ;;9{ B{-2-2''=='' ;{.3.3={// '&'
|| // '&'
'&'
'&'
/4/4 J{0x8080F{0505ififF{ifif(,, (1616P{R{AA '@''2727'@@''==M{==3838,,L{
 4949Q{O{646444''(5:5:(''s{,,p{6;6;rO^.))  7<7<V{m{11269R{gotogoto8=8='E'''EE''gotogoto 9>9>`{,, k{:?:?W{pos37367pos37367''W;@;@W''n{;;,,_{<A<A  g{a{=B=Bc{// ''
''
')'''))''>C>C// ''
''
,,o{?D?D k{k{ififif@E@Eif((''==''AAu{AFAF,,w{ BGBGr{==q{== 'U''CHCH'UU''94v{t{DIDI,,9444 {EJEJ)){ ''WW'' FKFK {{goto{|| GLGLw{gotogotogoto HMHM{0x8080{|{ININpos37404,, pos37404{JOJO{;; '('''((''KPKP ''
{,,{LQLQ
{// ''
// ''
MRMR ''
''EE''{NSNS,,{{ OTOTifififif((AA{PUPU'W'''WW''{ QVQV{,,== {RWRW== 43{{'')SXSX)''4333,,{TYTY)) { {UZUZgoto{'='''==''V[V[{gotogotogoto ,,W\W\ {{{X]X]pos37419''YY''pos37419Y^Y^,,{{ ;; Z_Z_ '+'
{{'U''[`[`'UU''{// '+'
// '+'
\a\a,, '+'
{]b]b{{''WW'' ^c^c ifififif((AA|| _d_d{{ `e`e{0x8080=={afaf== 58,, {bgbg{5888{chch'('''((''))didi{ ,,{
ejej goto{{gotogotofkfkgoto ''EE''{glgl,,{ {hmhmpos37440pos37440{')''inin'))''{;;  ':'
jojo,,{ {kpkp{// ':'
// ':'
''OO''lqlq ':'
,,{mrmr {{ifififif((nsnsAA'='''==''{otot{,,  pupu{=={== 37qvqv''II''{{,,rwrw w w[[sxsxv inputtemp''DD'' tytyinputtempw|| wuzuzXX]]
w w0x8080v{v{;;w
w,, w|w|  wwififx}x}'#'''##''wifif(y~y~(,,w zzwAA !!w'':{{:''==w,, ||w w898999}}Mw'('''((''~~Jw)) ,,w
Gwwgotogotogotogoto ''EE''#w4534,,'w wpos36700pos36700,w;;')'''))''!w
"w,, +w'wgoto'w''DD''gotogotogoto ,,Aw 4185YEwpos37108pos37108Hw' ''' '';;4w
,,5w 
6w7w?w''==''  pos37135:pos37135:pos37135|| pos37135::
@w 0x8080ifIwEwififif,, ((OwQww '('''((''wwAA ,,!! Lw==Kw2030 Pw''EE''Nw70700,,04341 wew)) Uw'V'''VV''zwQwgotogoto,,gotogoto
 `ww''))''Vwpos36700,,pos36700dw ;;^w
_w 'E'''EE''iwdw,,XX ++fw++ow''RR''mwgw,,;;hw 
nwmw'='''==''AA ==pw,,  wwqw inputtemp[''EE''inputtemp[,,|wXX {w]]ww'H'''HH''}w;;~w,,
 www''44''ifififif((,,AAw w w!!'V'''VV'' ||w== 85 ww85550x800x80w))w,, 
w gotowwgotogotogoto '('''((''w,,w wpos36700pos36700w''EE''w;;,,w6061
wwXX++')'''))''++w,,w w;;w
w''^^'' x (Py (0z (z ({ ({ ({ (`| (| (@} (} ( ~ (~ ( (p (` (Р (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` (Ч (@ ( ( (p ( (P ( (0 ( ( ( ( (` (Ю (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` (е (@ ( ( ( ( (p ( (P ( ( ( (` (м (@ ( ( ( ( (p (` ( (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` ( (@ ( ( ( ( (p ( (P ( ( (` ( (@ ( ( ( ( (p ( (P ( (0 ( ( ( (` ( (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` ( (@ ( ( ( ( (p (` ( (@ ( (  ( ( (p ( (P ( (0 ( ( ( (` ( (@ ( ( ( (
(p
(
( ( ( ( (` ( (@ ( (  ( ( (P ( (0 ( ( ( ( (` ( (@ ( (  ( ( (p ( (P ( (0 ( ( ( ( (` ( (@ ( (  ( ( (p (` ( (@! (! ( " (" (# (p# (# (P$ ($ (0% (% (& (& (& (`' (' (@( (( ( ) () (* (p* (* (P+ (+ (0, (, (- (- (- (`. (. (@/ (0 (1 (p1 (1 (P2 (2 (03 (3 (4 (4 (4 (`5 (5 (@6 (6 ( 7 (7 (8 (p8 (8 (P9 (9 (0: (: (; (; (; (`< (< (@= (= ( > (> (? (p? (`@ (@ (@A (A ( B (B (C (pC (C (PD (D (0E (E (F (F (F (`G (G (@H (H ( I (I (J (pJ (J (PK (K (0L (L (M (M (M (`N (N (@O (O ( P (P (Q (pQ (Q (PR (R (0S (S (T (T (T (`U (U (@V (V ( W (W (X (pX (X (PY (Y (0Z (Z ([ ([ ([ (`\ (\ (@] (] (^ (p^ (^ (0_ (` (` (` (`a (a (@b (b ( c (c (d (pd (d (Pe (e (0f (f (g (g (g (`h (h (@i (i ( j (j (k (pk (k (Pl (l (0m (m (n (n (n (`o (o (@p (p ( q (q (r (pr (r (Ps (s (0t (t (u (u (u (`v (v (@w (w ( x (x (y (py (y (Pz (z (0{ ({ (| (| (| (`} (} (@~ (~ (  ( ( ( (` (Ё (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` ( ( (p ( (P ( (0 ( ( ( ( (Џ (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` (Ж (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` (Н (@ ( ( ( ( ( (` (С (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` (Ш (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` (Я (@ ( ( ( ( (p (P ( (0 ( ( ( (ж (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` (н (@ ( ( ( ( (` ( (@ ( ( ( ( ( ( ( ( ( (` ( (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` ( ( (p ( (P ( (0 ( ( (` ( (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` ( ( ( ( (` (Ё (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` (Ј (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` (Џ (@ ( ( ( ( ( (0 ( ( ( ( (` (Ж (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` (Н (@ ( ( ( ( ( (` (С (@ ( ( ( ( (p (P ( (0 ( ( ( (` (Ш (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( ( ( (p ( (P ( (0 ( (` (ж (@ ( ( ( ( (` (н (@ ( ( ( ( ( (` ( (@ ( ( ( (` ( ( ( (` ( (@ ( ( ( (p ( (P ( (0 ( ( ( ( (` ( (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` ( (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` ( (@ ( ( ( ( ( (` (С (@ ( ( ( ( (p ( (P ( ( ( ( (` (Ш (@ ( ( ( ( (p ( (0 ( ( ( ( (` (Я ( ( ( ( (p ( ( ( (` (ж (@ ( ( ( ( (P ( (0 ( ( ( ( (` (н (@ ( ( (` ( (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` ( (@ ( ( (p ( (P ( (0 ( ( ( ( (` ( (@ ( ( ( ( (P ( (0 ( ( ( ( (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` ( (@ ( ( ( ( ( (` ( (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( (` ( (@ ( ( ( ( (p ( (P ( (0 ( ( ( ( class="mh" class="p" class="mh"9322 class="p"''XX'' class="mh" class="p",, class="mh" class="p" class="mh" class="p" class="mh" class="p" class="mi"'S'''SS'' || class="p" class="mi" class="p"  class="mi" class="p" class="mi" class="p"0x800x80 class="mi" class="p" class="mh",, class="p"  class="mi" class="p" class="mi" class="p" class="mi"''(('' class="p" class="mi",, class="p" class="mi"300 class="p" class="mi" class="p" class="mi" class="p"'O'''OO'' class="mi" class="p" class="mi",, class="p" class="mi" class="p" class="mi" class="p" class="mi"''UU'' class="p" class="mi",, class="p" class="mi"  class="p" class="mi" class="p" class="mi" class="p"'R'''RR'' class="mi" class="p" class="mi",, class="p" class="mi" class="p" class="mi" class="p" class="mi"''))'' class="p" class="mi",, class="p"
class="mi" class="p" class="mh" class="p" class="mi" class="p"'='''=='' class="mi" class="p" class="mh",, class="p" class="mi" class="p" class="mi" class="p" class="mi"''OO'' class="p" class="mi",, class="p" class="mi"  class="p" class="mi" class="p" class="mi" class="p"'H''H'HH'' class="mi" class="p" class="mi",, class="p"  class="p" class="c1" class="kt" class="kt" class="n"''RR''  class="p" class="p" class="o"|| class="p" class="mh" class="p" class="mh" class="p"0x8080 class="mh" class="p" class="mh" class="p",, class="mh" class="p" class="mh" class="p" class="mh"'('''(('' class="p" class="mh" class="p",, class="mh" class="p" class="mh" class="p" class="mh" class="p"''OO'' class="mh" class="p",, class="mh" class="p"  class="mh" class="p" class="mh" class="p" class="mh"'U'''UU'' class="p" class="mh" class="p",, class="mh" class="p" class="mh" class="p" class="mh" class="p"''LL'' class="mh" class="p",, class="mh"
class="p" class="mh" class="p" class="mh" class="p" class="mh"4205m'D'''DD'' class="p" class="mh" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p"''))'' class="mi" class="p",, class="mi" class="p" class="mh" class="p" class="mi" class="p" class="mi"'='''=='' class="p" class="mi" class="p",, class="mi"  class="p" class="mh" class="p" class="mh" class="p"''UU'' class="mi" class="p",,3944 class="mh" class="p" class="mi" class="p" class="mh" class="p" class="mi"'H'''HH'' class="p" class="mi" class="p",, class="mi" class="p" class="mi" class="p" class="mi" class="p"''55'' class="mi" class="p",, class="mh" class="p" class="mh" class="p" class="mh" class="p" class="mh"'D'''DD'' ||1265 class="p" class="mh" class="p"  class="mh" class="p" class="mi" class="p"0x800x80 class="mi" class="p" class="mi",, class="p"  class="mi" class="p" class="mi" class="p" class="mi"''(('' class="p" class="mi",, class="p"
class="mi"  class="p" class="mi" class="p" class="mi" class="p"'O'''OO'' class="mi" class="p" class="mi",, class="p" class="mi"   class="p" class="mi" class="p" class="mi"''U

U''3263 class="p" class="mi",,   class="p" class="mi" class="p" class="mi"   class="p" class="mi" class="p"')'''))'  ' class="mh" class="p" class="mh",,   class="p" class="mi" class="p" class="mi"

 class="p" class="mi"''^^'' class="p"   class="mh",, class="p" class="mh"   class="p" class="p" class="c1" class="kt" class="kt"  'L'''LL'' class="n" class="p" class="p",, class="o" class="p" class="mh" class="p" class="mh" class="p"''=='' class="mh" class="p",, class="mh" class="p" class="mh" class="p" class="mh" class="p" class="mh"2578'A'''AA'' class="p" class="mh" class="p",, class="mh" class="p" class="mh" class="p" class="mh" class="p"''HH'' class="mh" class="p",, class="mh"
class="p" class="mh" class="p" class="mh" class="p" class="mh"'5'''55'' || class="p" class="mh" class="p"  class="mh" class="p" class="mh" class="p"0x800x80 class="mh"   class="p" class="mh",, class="p" !! class="mh" class="p" class="mh" class="p" class="mh"""''(('' class="p" class="mh",,## class="p" class="mh" class="p" class="mh"$$ class="p" class="mh" class="p"'O'''OO' % %' class="mh" class="p" class="mh",,!&!& class="p" class="mh" class="p" class="mh""'"' class="p" class="mh"''UU'' class="p"#(#( class="mh",, class="p" class="mh" $)$) class="p" class="mh" class="p" class="mh" class="p"%*%*'P'''PP'' class="mh" class="p"&+&+ class="mh",, class="p" class="mh"',', class="p" class="mh" class="p" class="mh"'')(-(-)'' class="p" class="mh",, class="p").). class="mh" class="p" class="mh" class="p"*/*/ class="mh" class="p"'='''==''+0+0 class="mh" class="p" class="mh",, class="p",1,1 class="mh" class="p" class="mh" class="p"-2-2 class="mh"''UU'' class="p" class="mh".3.3,, class="p"
class="mh" /4/4 class="p" class="mh" class="p" class="mh" class="p"0505'W'''WW'' class="mh" class="p"1616 class="mh",, class="p" class="mh"2727 class="p" class="mh" class="p" class="mh"''538385'' class="p" class="mh",, class="p"4949 class="mh" class="p" class="mh" class="p"5:5: class="mh" class="p"'P'''PP'' 6;6;|| class="mh" class="p" class="mh" 7<7< class="p" class="mh" class="p" class="mh"0x800x808=8= class="p" class="mh" class="p",, class="mh"9>9>  class="p" class="mh" class="p" class="mh":?:? class="p"''(('' class="mh" class="p";@;@,, class="mh" class="p" class="mh"<A<A class="p" class="mh" class="p" class="mh"'O''=B=B'OO'' class="p" class="mh" class="p">C>C,, class="mh" class="p" class="mh"?D?D class="p" class="p" class="c1"''UU''@E@E class="kt" class="kt",, class="n" class="p"AFAF class="p" class="o" class="p" class="mh"BGBG class="p"')'''))'' class="mh"CHCH class="p" class="mh",, class="p" DIDI class="mh" class="p" class="mh" class="p" class="mh"EJEJ''=='' class="p" class="mh",,FKFK class="p"
class="mh" class="p"GLGL class="mh" class="p" class="mh" class="p"'A''HMHM'AA'' class="mh" class="p" class="mh"ININ,, class="p" class="mh" class="p"JOJO<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="nx">bytes</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="nx">PETABYTE</span><span class="p">:</span><span class="w">
</span><span class="w"> </span><span class="nx">value</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">value</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nx">PETABYTE</span><span class="w">
</span><span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="nx">bytes</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="nx">TERABYTE</span><span class="p">:</span><span class="w">
</span><span class="w"> </span><span class="nx">value</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">value</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nx">TERABYTE</span><span class="w">
</span> <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="sa"></span><span class="s2">&#34;</span><span class="s2">Attempting to reconnect serial port </span><span class="s2">&#34;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">port</span><span class="p">)</span><span class="o">+</span><span class="sa"></span><span class="s2">&#34; <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="sa"></span><span class="s2">&#34;</span><span class="s2">Error while reconnecting port, the contained exception was: </span><span class="s2">&#34;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">LOG_ERROR</span> 6   <span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="nx">bytes</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="nx">GIGABYTE</span><span class="p">:</span><span class="w">
</span><span class="w"> </span><span class="nx">value</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">value</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nx">GIGABYTE</span><span class="w">
</span><span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="nx">bytes</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="nx">MEGABYTE</span><span class="p">:</span><span class="w">
</span><span class="w"> </span><span class="nx">value</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">value</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nx">MEGABYTE</span><span class="w">
</span><span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="nx">bytes</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="nx">KILOBYTE</span><span class="p">:</span><span class="w">
</span><span class="w"> </span><span class="nx">value</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">value</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nx">KILOBYTE</span><span class="w">
</span>!h` (`!_jPjPPjPjPjPjPjJ(jPjPjJ(jPjPjPPjPPjPjPjPjPjPjJ(jPj5,,{ KPKP}server.LQLQserver.nameMRMRname,, NSNS,, OTOT..clientclientPUPUnicknick,, QVQV,,targetRWRWtarget SXSXclient.client.t(t(TYTYtt((kk UZUZ))))V[V[
 W\W\returnreturnreturnreturnX]X]
Y^Y^}}
Z_Z_
 if[`[`ififif \a\a!!]b]buseruser..^c^cHasMode(HasMode(HasModeHasMode_d_d((

 `e`emodesmodes..afaf)) bgbg1431{{
chch rbrb.didi.Add( Add(AddAdd((nilnilejejnilnilKfkfk,, &KglglLclient.hmhmclient. ..ininserverserver%!jojonamename,, 87kpkp,,' Clqlq=9useruser..Bmrmrnick1547>nick,, nsns|JDclient.ototclient.t(t(Ltt((ddpupu*M,N))qvqvy))4367z
rwrw{ sxsxreturnreturnreturnreturntyty
uzuz}}

v{v{ w|w|cnickcnick x}x}:=:=:=:= y~y~..zzclientclientNick(Nick(NickNick{{(())
|| }}tnicktnick ~~:=:=:=:= Ouseruser..Nick(Nick(NickNick(())
 uuseruser..Send(Send(SendSend((nilnilnilnil*,,  source,source, GG "PRIVMSG""PRIVMSG",, tnicktnick,, ))messagemessage
 ifififif Xclient.client... capabilitiescapabilities Has(Has(HasHas((&&) capscaps..)) EchoMessageEchoMessage  {{
 .%rb#rb..)Add(Add(AddAdd((*nilnilnilnil`,,- 6`g5/source,source, GGA7 8"PRIVMSG""PRIVMSG",,@ HGB13859#6tnicktnick,, RP))Imessagemessage
Q VT}}U
ZXifififif s_user[user..gHasMode(HasMode(HasModeHasMode((mmodeshmodes..rnAwayAway)) vt{{u
 
 rbrb..Add(Add(AddAdd((nilnilnilnil12692 ,,   7010bserver.server.namename,, RPL_AWAY,RPL_AWAY, cnickcnick,, tnicktnick,,  useruser.. AwayMessage(AwayMessage(AwayMessageAwayMessage((Z )) )) 
    }} 
 }} 
 }} 
7f7f7f#7f7f7fcolor: #7f7f7f."#cf222ecolor: #cf222e9f#6639bacolor: #6639baj`W#57606acolor: #57606aj`W#57606acolor: #57606a#f7f7f7(##1f2328color: #1f23288#953800color: #953800i0
#0a3069color: #0a3069i0
#0a3069color: #0a30698#953800color: #953800P#0550aecolor: #0550ae(##1f2328color: #1f23289f#6639bacolor: #6639ba.)$#24292ecolor: #24292eP#0550aecolor: #0550ae(##1f2328color: #1f2328."#cf222ecolor: #cf222e9f#6639bacolor: #6639ba#990000color: #990000i0
#0a3069color: #0a3069P#0550aecolor: #0550aeP#0550aecolor: #0550ae."#cf222ecolor: #cf222e8#953800color: #9538008#953800color: #953800i0
#0a3069color: #0a3069."#cf222ecolor: #cf222e(##1f2328color: #1f23288#953800color: #953800b/#032f62color: #032f62j`W#57606acolor: #57606a7f7f7f#7f7f7f(#color: #7f7f7f#1f2328i0
color: #1f2328#0a3069i0
color: #0a3069#0a3069Pcolor: #0a3069#0550aePcolor: #0550ae#0550aecolor: #0550ae#f6f8facolor: #f6f8fa#82071eP#0550aei0
color: #0550ae#0a3069Pcolor: #0a3069#0550aej`Wcolor: #0550ae#57606ai0
color: #57606a#0a3069j`Wcolor: #0a3069#57606acolor: #57606a#82071ecolor: #82071e#ffebe9."#cf222e."color: #cf222e#cf222e."color: #cf222e#cf222ej`Wcolor: #cf222e#57606aj`Wcolor: #57606a#57606a}sjcolor: #57606a#6a737dPcolor: #6a737d#0550ae9fcolor: #0550ae#6639baPcolor: #6639ba#0550aePcolor: #0550ae#0550ae(#color: #0550ae#1f2328)ccolor: #1f2328#116329color: #116329#dafbe1P#0550aei0
color: #0550ae#0a3069i0
color: #0a3069#0a30697f7f7fcolor: #0a3069dedede#dedede#ffffffi0
color: #ffffff#0a3069i0
color: #0a3069#0a3069i0
color: #0a3069#0a3069margin:0color: #0a3069color: #0a3069color:#0a3069color: #6639bacolor:#6639bacolor: #57606acolor:#57606acolor: #990000color:#990000color:#900font-weight:boldcolor: #f6f8facolor:#f6f8facolor: #0a3069color:#0a3069outline: noneoutline:nonecolor: inheritcolor:inheritcolor: #57606acolor:#57606acolor: #cf222ecolor:#cf222ecolor: #1f23281779color:#1f2328color: #0550aecolor:#0550aecolor: #6a737dcolor:#6a737dcolor: #0a3069color:#0a3069color: #0a3069color:#0a3069color: #1f2328color:#1f2328color: #0550aecolor:#0550aecolor: #032f62color:#032f62color: #6639bacolor:#6639bacolor: #0a3069color:#0a3069color: #cf222ecolor:#cf222ecolor: #6639bacolor:#6639bacolor: #0550aecolor:#0550aecolor: #0550aecolor:#0550aecolor: #0a3069color:#0a3069color: #0a3069color:#0a3069color: #57606acolor:#57606acolor: #0550aecolor:#0550aecolor: #0550aecolor:#0550aecolor: #57606acolor:#57606awhite-space: prewhite-space:preuser-select:nonecolor: #7f7f7fcolor:#7f7f7fcolor: #57606acolor:#57606a2410color: #ffffffcolor:#ffffffcolor:#fffcolor: #cf222ecolor:#cf222ecolor: #0550aecolor:#0550aecolor: #953800color:#953800color: #953800color:#953800color: #57606acolor:#57606acolor: #0550aecolor:#0550aecolor: #0550aecolor:#0550aecolor: #0a3069color:#0a3069color: #cf222ecolor:#cf222ecolor: #0550aecolor:#0550aedisplay: flexdisplay:flexdisplay:flex;color: #953800color:#953800color: #6639bacolor:#6639bacolor: #116329color:#116329color: #0a3069color:#0a3069color: #24292ecolor:#24292ecolor: #0a3069color:#0a3069color: #57606acolor:#57606acolor: #cf222ecolor:#cf222ecolor: #0a3069color:#0a3069padding: 0padding:0"margin: 0x"border: 0"border:0margin:0color: #953800color:#953800color: #cf222ecolor:#cf222ecolor: #1f2328color:#1f2328color: #82071ecolor:#82071ecolor: #0a3069color:#0a3069color: #953800color:#953800color: #0550aecolor:#0550aeborder-spacing:0padding: 0padding:0"margin: 0"border: 0b"border:0treecolor: #0a3069color:#0a3069white-space: prewhite-space:preuser-select:nonecolor: #7f7f7ft;color:#7f7f7fcolor: #1f2328color:#1f2328color: #1f2328color:#1f2328color: #1f2328color:#1f2328color: #0550aecolor:#0550aecolor: #cf222ecolor:#cf222e class="chroma" class="c1" class="w" class="c1" class="w" class="w" class="kn" class="w" class="nx" class="w" class="w" class="kn" class="w" class="p" class="w" class="w"&#34;fmt&#34; class="s" class="w" class="w" class="w" class="s" class="w" class="w" class="s" class="w" class="p"x class="w" class="w" class="kd" class="w" class="p" class="w" class="w" class="nx" class="w" class="p" class="w" class="s" class="w" class="w" class="nx" class="w"10408( class="p" class="w" class="s" class="w" class="p" class="w" class="w" class="kd" class="w" class="nf" class="p" class="nx" class="w" class="o" class="nx" class="p" class="w"   class="nx" class="w" class="o" class="nx" class="p"

 class="w" class="nx" class="w" class="kt" class="p"   class="w" class="nx" class="w" class="kt" class="p"   class="w" class="nx" class="w" class="kt" class="p"   class="w" class="nx" class="w" class="kt" class="p"   class="w" class="nx" class="w" class="o"948

 class="nx" class="p" class="w" class="p" class="w"   class="w" class="k" class="w" class="nx" class="w"   class="p" class="w" class="w" class="nx" class="w"   class="p" class="w" class="nx" class="p" class="nf" class="p" class="s" class="p" class="w" class="nx" class="p" class="w" class="nx" class="p" class="nx" class="p" class="w" class="w" class="p" class="w" class="k" class="w" class="p" class="w" class="w" class="nx" class="w" class="p" class="w" class="nx" class="p" class="nf" class="p" class="s" class="p"2666j
class="w" class="nx" class="p" class="w" class="nx" class="p" class="nx" class="p" class="w" class="w" class="p" class="w" class="w" class="w" class="nx" class="p" class="w" class="nx" class="w" class="o" class="w" class="nf"2528 class="p" class="nx" class="p" class="w" class="w" class="k" class="w" class="nx" class="w" class="o" class="w"   class="kc" class="w" class="p" class="w" class="w"!! class="nx" class="w" class="o" class="w" class="nx""" class="p" class="nx" class="p" class="nf" class="p"## class="nx" class="p" class="w" class="w"$$ class="k" class="w" class="nx" class="w" % % class="o" class="w" class="kc" class="w"!&!& class="p" class="w" class="w" class="nx""'"' class="p" class="nf" class="p" class="kc"#(#( class="p" class="w" class="nx" class="p" class="nx"$)$) class="p" class="w" class="nx" class="p" class="w"%*%* class="nx" class="p" class="nx" class="p" class="w"&+&+ class="nx" class="p" class="w" class="nx" class="p"',', class="nf" class="p" class="s" class="p" class="p"(-(- class="w" class="w" class="k" class="w" class="w").). class="p" class="w" class="w" class="w" class="k"*/*/ class="w" class="p" class="nx" class="p" class="nf"+0+0 class="p" class="nx" class="p" class="w" class="p",1,1 class="w" class="w" class="nx"996 class="p"-2-2 class="nf" class="p" class="kc"4289 class="p".3.3 class="w" class="nx" class="p" class="nx" class="p"/4/4 class="nx" class="p" class="w"9916& class="nx"0505 class="p" class="w" class="nx" class="p" class="nx"1616 class="p" class="w" class="nx" class="p" class="nf"2727 class="p" class="s" class="p" class="p" class="w"3838 class="w" class="k" class="w" class="w" class="p"4949 class="w" class="w" class="w" class="k" class="w"5:5: class="p" class="nx" class="p" class="nx" class="p"6;6; class="nf" class="p" class="nx" class="p" class="nx"7<7< class="p" class="w" class="p" class="w" class="w"8=8= class="nx" class="p" class="nf" class="p" class="kc"9>9> class="p" class="w" class="nx" class="p" class="nx":?:? class="p" class="nx" class="p" class="w" class="nx";@;@ class="p" class="w" class="nx" class="p" class="nx"<A<A class="p" class="w" class="nx" class="p" class="nf"=B=B class="p" class="s" class="p" class="p" class="w">C>C class="w" class="k" class="w" class="w" class="p"?D?D class="w" class="w" class="w" class="k" class="w"@E@E class="nx" class="p" class="w" class="nx" class="w"AFAF class="o" class="w" class="k" class="w" class="nx"BGBG class="p" class="nf" class="p" class="p" class="w"CHCH class="p" class="w" class="w" class="k" class="w"DIDI class="nx" class="w" class="o" class="w" class="nx"EJEJ class="w"&amp;&amp; class="o" class="w" class="p"FKFK class="nx" class="p" class="nx" class="p" class="nf"GLGL class="p" class="nx" class="p" class="nx" class="p"HMHM class="w" class="p"5865 class="w" class="w"ININ class="k" class="w" class="w" class="p" class="w"JOJO class="w" class="k" class="w" class="nx" class="w"KPKP class="o" class="w" class="nx" class="w" class="p"LQLQ class="w" class="w" class="nx" class="p" class="nf"MRMR class="p" class="kc" class="p" class="w" class="nx"NSNS class="p" class="w" class="s" class="p" class="w"OTOT class="nx" class="p" class="nx" class="p" class="w"PUPU class="nx" class="p" class="w" class="w" class="p"QVQV class="w" class="k" class="w" class="p" class="w"RWRW class="w" class="nx" class="p"5612 class="nf"SXSX class="p" class="kc" class="p" class="w" class="nx"TYTY class="p" class="w" class="s" class="p" class="w"UZUZ class="nx" class="p" class="nx" class="p" class="w"V[V[ class="nx" class="p" class="w" class="w" class="p"W\W\ class="w" class="w" class="p" class="w" class="w"X]X] class="p" class="w" class="k" class="w" class="p"Y^Y^ class="w" class="w" class="nx" class="p" class="w"Z_Z_ class="nx" class="w" class="o" class="w" class="nf"[`[` class="p" class="nx" class="p" class="w" class="w"\a\a class="nx" class="w" class="o" class="w" class="nx"]b]b class="p" class="nx" class="p" class="nf" class="p"^c^c class="nx" class="p" class="w" class="w" class="k"_d_d class="w" class="nx" class="w" class="o" class="w"`e`e class="kc" class="w" class="o" class="w" class="nx"afaf class="w" class="o" class="w" class="kc" class="w"bgbg class="p" class="w" class="w" class="nx" class="p"chch class="nf" class="p" class="kc" class="p" class="w"didi class="nx" class="p" class="nx" class="p" class="w"ejej class="nx" class="p" class="w" class="nx" class="p"fkfk class="nx" class="p" class="w" class="nx" class="p"glgl class="w" class="nx" class="p" class="nf" class="p"hmhm class="s" class="p" class="p" class="w" class="w"inin class="k" class="w" class="w" class="p" class="w"jojo class="w" class="w" class="k" class="w" class="p"kpkp class="nx" class="p" class="nf" class="p" class="nx"lqlq class="p" class="nx" class="p" class="w" class="p"mrmr class="w" class="w" class="nx" class="p" class="nf"nsns class="p" class="kc" class="p" class="w" class="nx"otot class="p" class="nx" class="p" class="nx" class="p"pupu class="w" class="nx" class="p" class="w" class="nx"qvqv class="p" class="nx" class="p" class="w" class="nx"rwrw class="p" class="nf"4535 class="p" class="s"sxsx class="p" class="p" class="w" class="w" class="k"tyty class="w" class="w" class="p" class="w" class="w"uzuz class="w" class="nx" class="w" class="o" class="w"v{v{ class="nx" class="p" class="nf" class="p" class="p"w|w| class="w" class="w" class="nx" class="w" class="o"x}x} class="w" class="nx" class="p" class="nf" class="p"y~y~ class="p" class="w" class="w" class="nx"4487zz class="p" class="nf" class="p" class="kc" class="p"{{ class="w" class="nx" class="p" class="w" class="s"|| class="p" class="w" class="nx" class="p" class="w"}} class="nx" class="p" class="w" class="w" class="k"~~ class="w" class="nx" class="p" class="nx" class="p" class="nf" class="p" class="nx" class="p" class="nx" class="p" class="w" class="p" class="w" class="w" class="nx" class="p" class="nf" class="p" class="kc" class="p" class="w" class="nx" class="p" class="w" class="s" class="p" class="w" class="nx" class="p" class="w" class="nx" class="p" class="w" class="w" class="p" class="w" class="w" class="k" class="w" class="nx" class="p" class="nf" class="p" class="nx" class="p" class="nx" class="p" class="w" class="p" class="w" class="w" class="cp" class="w" class="w" class="nx" class="p" class="nf" class="p" class="kc" class="p" class="w" class="nx" class="p" class="nx" class="p" class="w" class="nx" class="p" class="w" class="nx" class="p" class="w" class="nx" class="p" class="w" class="nx" class="p" class="nf" class="p" class="p" class="p" class="w" class="w" class="p" class="w" class="w" class="p" class="w" class="p" class="w"parentparentauthorcommittergpgsig
=DNBW
fix #394treeparentparentauthorcommittergpgsig
=81ZK
mirrormirror/ergo.gitmirror/ergo.git6a30dc38]6a30dc38-33!/dev/null-/usr/bin/git-index16SELECT 0Email_Addressemail_address"id", "Email_Addressemail_address"id", "uid", ""id""uid""email"""lower_email"""is_activated"""is_primary"SELECT ""email_address""lower_email"=?"lower_email"=?SELECT "$1SELECT "id", "uiSELECT 0SELECT 0,\/assetstrue true 3809''`'''``''''true true PP50000 50000 "Copied!""Copied!""Copy failed"5091"Copy failed""Confirm""Confirm""Cancel""Cancel""More items""More items"Navigation BarNavigation Bar class="p"HomeHomeLogoLogoNavigation MenuNavigation Menu class="k" class="w"..PageGlobalData./MirrorRSS FeedRSS FeedWatchWatchStarStar/Mirror/ergoʔ0j&amp;&amp;4395/Mirror/ergo396394!/Mirror/ergofix #394fix #394fix #394fix #394394<span <span class="7cf8aaccf6a5b963478309909e3b3dShow file treeShow file treeHide file treeHide file tree(WhitespaceWhitespace class="p" class="p" class="w" class="nx" class="p"Split ViewSplit ViewDiff OptionsDiff Options09909e3b3d09909e3b3d$.$.$.$.$.IsCsvFileCopy pathCopy path1714+*/(++)?@kZkK@5483870967741935irc/handlers.go class="w"408408408408</span>
</span><span class="w">4094095094409""merged_unix""flow"SELECT ""pull_request"()SELECT "$1$2SELECT "id", "ty.check-gofmt.sh.gitignore.gitmodules.goreleaser.yml.travis.ymlCHANGELOG.mdDEVELOPING.mdGopkg.lockGopkg.tomlLICENSEMakefileREADMEREADME.mdcrowdin.ymldocsgencapdefs.pyirclanguagesvendororagono.gooragono.motdoragono.yaml$.$.$.$.IsCsvFileCopy pathCopy path+*/(++) @@O@62.562.562562.510269(irc/channel.go class="p"irc%2Fchannel.go1014101410141480491014<span class="w"> </span>}<span class="p"></span>
</span><span class="w"><span class="w">1015101510151015 <span class="w"></span>}</span>
<span class="p"><span class="w"></span><span class="w">1016101610161016
<span class="w"></span><span class="w">10171017􀀀 􀀀 􀀀 􀀁􀀂􀀀 􀀁􀀏􀀅,􀀆􀀏􀀀 􀀁,􀀅,􀀆􀀏􀀈􀀃􀀉 ,􀀅,􀀆􀀏 􀀏􀀐: :􀀐:=􀀑=􀀋􀀅 =􀀀 􀀁 =,􀀆􀀀, ::=􀀐:=􀀑􀀏 :=􀀐:=􀀑 􀀁 􀀀 􀀁􀀏:=􀀐:=􀀑􀀏:=􀀐:=􀀑  <span class="w"><span class="w"></span>rb</span>.</span><span class="p">Add</span></span>(</span><span class="p"></span>nil</span></span>,<span class="p"></span></span> <span class="w"></span></span>inviter</span>.<span class="p"></span>server</span>.</span><span class="p">name</span></span>,</span><span class="p"></span> </span><span class="w"></span></span>RPL_INVITING</span>,</span><span class="p"></span> </span><span class="w"></span>inviter</span>.</span><span class="p">Nick</span></span>(</span><span class="p"></span>)</span><span class="p"></span>,</span><span class="p"></span> </span>4503<span class="w"></span>invitee</span>.</span><span class="p">Nick</span></span>(</span><span class="p"></span>)</span><span class="p"></span>,</span><span class="p"></span> </span><span class="w"></span>chname</span></span>)<span class="p"></span>
</span><span class="w"><span class="w">10181018􀀀 􀀀 􀀁􀀂􀀀 􀀆􀀀 􀀁􀀏􀀇􀀅,,􀀏􀀆*􀀏􀀐􀀀 􀀁􀀆􀀏,􀀏􀀇􀀅,􀀆􀀏􀀈􀀃􀀉:=􀀑 :=􀀈􀀃􀀉:=􀀑2788
􀀅,􀀆􀀀 􀀁􀀊􀀋,
 
  :=:=􀀑􀀏
 5140:=􀀐:=􀀑􀀀 􀀁􀀂􀀃 􀀍􀀒􀀅 􀀍􀀒(( 􀀍􀀒(  􀀍􀀒(,􀀆,􀀀 􀀁􀀎   􀀍􀀒(,,(  􀀍􀀒,(,( 􀀀 􀀁􀀏:=􀀐:=􀀑
  􀀍􀀒,(,( 􀀏:=􀀐:=􀀑 􀀍􀀒,(,(  <span class="w"> </span><span class="w">invitee</span>.<span class="p"></span>Send</span></span>(<span class="p"></span></span>nil</span></span>,</span><span class="p"></span> </span><span class="w"></span>inviter</span>.</span><span class="p">nickMaskString</span></span>,<span class="p"></span></span> <span class="w"></span></span><span class="s">&#34;INVITE&#34;</span></span>,<span class="p"></span></span> <span class="w"></span></span>invitee</span>.<span class="p"></span>nick</span></span>,XYY<span class="p"></span></span> <span class="w"></span></span>chname</span></span>)</span>
<span class="p"><span class="w"></span><span class="w">10171017􀀀 􀀀 􀀀 􀀁􀀂􀀀 􀀁􀀏􀀅,􀀆􀀏􀀀 􀀁,􀀅,􀀆􀀏􀀈􀀃􀀉 ,􀀅,􀀆􀀏 􀀏􀀐: :􀀐:=􀀑=􀀋􀀅4268 =􀀀 􀀁 =,􀀆􀀀, ::=􀀐:=􀀑􀀏 :=􀀐:=􀀑 􀀁 􀀀 􀀁􀀏:=􀀐:=􀀑􀀏:=􀀐:=􀀑  <span class="w"><span class="w"></span>cnick</span></span> <span class="w"></span></span>:=<span class="o"></span></span> <span class="w"></span></span>inviter</span>.<span class="p"></span>Nick</span></span>(<span class="p"></span></span>)<span class="p"></span>
</span><span class="w"><span class="w">&#43;10181018􀀀 􀀀 􀀁􀀂􀀀 􀀆􀀀 􀀁􀀏􀀇􀀅,,􀀏  􀀆􀀏􀀐􀀀 􀀁􀀆

􀀏,􀀏􀀇􀀅,􀀆  􀀏􀀈􀀃􀀉:=􀀑 :=  􀀈􀀃􀀉:=􀀑􀀅,􀀆􀀀 􀀁􀀊􀀋  ,
 
  :=:=􀀑  􀀏
 :=􀀐:=􀀑􀀀 􀀁

􀀂􀀃 856􀀍􀀒􀀅   􀀍􀀒(( 􀀍􀀒(    􀀍􀀒(,􀀆,  􀀀 􀀁􀀎   􀀍􀀒(,,(  􀀍􀀒,(,( 􀀀 􀀁􀀏:=􀀐:=􀀑
  􀀍􀀒,(,( 􀀏:=􀀐:=􀀑 􀀍􀀒,(,(  <span class="w"> </span>tnick<span class="w"></span></span> <span class="w"></span></span>:=<span class="o"></span></span> <span class="w"></span></span>invitee</span>.<span class="p"></span>Nick</span></span>(<span class="p"></span></span>)<span class="p"></span>
</span><span class="w"><span class="w">&#43;10191019 <span class="w"></span>rb</span>.</span><span class="p">Add</span>(<span class="p"></span>nil</span>,</span> <span class="p"><span class="w"></span>inviter</span>.</span><span class="p">server</span>.<span class="p">  </span>name</span>,</span> <span class="p"><span class="w"></span></span>,!!RPL_INVITING<span class="p"></span> </span><span class="w">cnick</span>,""<span class="p"></span> </span><span class="w">tnick</span>,<span class="p">##</span> </span><span class="w">chname</span>)<span class="p"></span>
</span>$$<span class="w"><span class="w">&#43; % %10201020 </span><span class="w">invitee</span>.<span class="p">!&!&</span>Send</span>(</span><span class="p">nil</span>,<span class="p">"'"'</span> </span><span class="w">inviter</span>.<span class="p"></span></span>(#(#(NickMaskString<span class="p"></span>)</span>,<span class="p"><span class="p">$)$)</span> </span><span class="w"><span class="s">&#34;INVITE&#34;</span>,</span> %*%*<span class="p"><span class="w"></span>tnick7120</span>,</span> &+&+<span class="p"><span class="w"></span>chname</span>)</span>
<span class="p">',',<span class="w"></span>&#43;<span class="w">1010(-(-1019101910211021 ).).<span class="w"></span>if<span class="k"></span> </span><span class="w">*/*/invitee</span>.<span class="p"></span>HasMode</span>(</span><span class="p">+0+0modes</span>.<span class="p"></span>Away</span>)</span> <span class="p">,1,1<span class="w"></span>{</span>
<span class="p"><span class="w"></span>-2-2<span class="w">111110201020􀀀 .3.3􀀀 􀀁􀀂􀀀 􀀀 􀀁􀀂􀀌􀀃􀀌􀀃/4/4􀀍 􀀎􀀎 􀀎 0505  􀀌􀀃􀀍􀀎 <span class="w"><span class="w">1616</span>rb</span>.</span><span class="p">Add</span>(<span class="p">2727</span>nil</span>,</span> <span class="p"><span class="w"></span>inviter3838</span>.</span><span class="p">server</span>.<span class="p"></span>name4949</span>,</span> <span class="p"><span class="w"></span>RPL_AWAY</span>,</span> 5:5:<span class="p"><span class="w"></span>invitee</span>.</span><span class="p">6;6;nick</span></span>,</span> <span class="p">9580<span class="w">7<7<</span>invitee7252</span>.</span><span class="p">awayMessage8=8=</span></span>)<span class="p"></span>
</span><span class="w"><span class="w">9>9>121210221022:?:?􀀀 􀀀 􀀀 􀀁􀀂􀀀 􀀁􀀂􀀌􀀃 􀀍;@;@􀀌􀀃 􀀎􀀎 􀀎 <A<A  􀀌􀀃􀀍􀀎<span class="w"> </span>rb=B=B<span class="w"></span>.</span><span class="p">Add</span>(<span class="p">>C>C</span>nil</span>,</span> <span class="p"><span class="w"></span>inviter?D?D</span>.</span><span class="p">server</span>.<span class="p"></span>name@E@E</span>,</span> <span class="p"><span class="w"></span>RPL_AWAY2448 AFAF</span>,</span> <span class="p"><span class="w"></span>cnick</span></span>,BGBG<span class="p"></span></span> <span class="w"></span></span>tnick</span> (ass="w"> </span><span class="k">case</span><span class="w"> </span><span class="nx">patternLeaf</span><span class="p">:</span><span class="w">
</span>:P (!E>B8[Q86 (B@ ($ ([86> (B.~> 86>x (NB.~>.~8 ( (,
I ( (B (IZIh (ZJB8 (KYE@ f7.~?I8 (I\J`QP ( (FYJ`8 ( (VJ`7.~P8 ( (`PGy%T (H ( (BPGy.~ (0 (%7yTbyTBP%7$T ( (+J (@~J ( (y (" (8 (@~J ("H%h$T ( (%T ( (@~J (H09?*A9O%
I@WhV@ (H099O@~J (H09  ( (f (  (B66.~/ ( ( ( ( (8 (P$ (` ( ( I ( (Q2L (  ( (]W (@6 (CF.~c?9֞rT]W (@ (  (H09`4L (2L (5֞rTQ;@;O
T ( ( (Bsp ('HMҺ.B
7.~`8 (` ( (BH{ (B@~O7H{@~O7P (B.~ (8A` (0@~O7.~8 (]W ( (%
I BI.~ (I (sB (@ ( ( ( (x (8 (u` (( (@M.~p ( (. .issues.add_proj}
</( ( ( ( (3I - (8 (F0 (@ ( (B 7{.~@ (%
I ( (M (  (`I - ( ( (` ( ( (h. (@  (L ( (}_0 ( (C  ( (L ( (`# (`# (@, ( (+ ( (, ( ( ( ( - (c2L ( ( (2L (IectDisplay $createdStr}}
</s@ (5X8P (V
|V (:P ([YJ[ (%WJsVȏ ( (` (FV@ ( (
% (iIA
%( ( ( (ףV Q@ (e (Fl' ( Qh (SJS@e (@P ( (@P ( ($ (,G$ (pP ($$r.~` (y (HHT (x ( (RopP ($$P (Vs$$$B (pP (pP (& ( ( ( ( ( ( ( (h (e C ( p ($$0.x ( C (pP ( (p (ܷ (؛ ( (QkB (x (pP ($$X (( (oy (!l ( (,e ( pP$ Q" (F (F ( AL@? ( (AI` (JBH (P (@  7 (B` (`e ( (L
ID  7r.~0` (% ( (%
I0 (E
I P (`I0h (`IfBX ( (rPH (V7r.~` ( ( (E
I ( GA ( (h (r (mS (% ( ' (P ( (PN ( !p# ( ( (FMYKpoI (\% (@? ( ( (B (FH (v
7a.~` ( (0 (%
I@WhMXBX (Kx ( (J2 ( ( ({б ( (x (Kx ( ( ( (+@ (@бCd (p (Cd (P ( ()@ (m$ (p>F@m$ (IlName":"modules/brk-client/docs/5X8P ((A:P(A[ (;P ( (0 (P ([ ([@ ($ ([` (2$ (YE@ (  (A@B ( (%
Ix6r.~ (8 (KYE@MYKI` (G0 (5YK (;I ( (eJ8Q( (\@P ( ($ (Ӊ (*%Q ( (Ro(~ (.)E (B@"%P ( (C (
 (6 (Ў ( ( ( (7GL{( ( (CF (CF.~` ( (` (MYK (iF (5IYK ( (T(YK` ( (yDH (7C R7` (R7 ( (CF17 (x (` ( (` (8` (MYK (iF (5IYK (
(
(YK
(HHEI
(2C
(HP
(H
(B
(CFx
(x
(
(2AxHH ( ( (uA@` ( lp
( (P (CF2AxHI6s ( (6s ( (MYKh (iFx (5IYK ( ( (YK6a.~ (7@E ( (L
I ( (_M% ( (wM`o' ( (M`o' ( (Tp ( ( (N!0o' (`M`o' ( ( (PN؃p ( !0 (h (CF ( (6s ( (6s (FMYK!iF (5IYK ( ( < ( ( (B (FH ((<6 < ( (F8 (F (M (X ( ({ ( (xa ( < (xa (Cd (J[ (J[ ( ( (؃p ( (A (g ( (Cd (` (m$J[ (f ( ( (p>FCd (I (5X8P ((A
|V (:P ([ ([@ ($ ([ (2$ (@ ($ ( (` (2$ ( ( (YE@ ( (A@{ (h ( (%
Ix8:QA7 (B8 (KYE@ (( (MYKI` (G0 (5YK (;I ( (eJ8Q( (Ӊ ( C ( (,G$ ( ({.~$ Q
%"8[QS)7y(E ( (B  P ( C (C (³ +V (Z ({ ( ( (Q (6-L{( ( (CF (CF.~Y ( (Y (MYK (iF (5IYK (  (|(YKY (  (yDH (7C ~@` ( ~ ( (CF17 (x (Y ( (Y (Дp (MYK (iF (5IYK (  (  (YK (HHEI (2C (HP ( ( (B (CF (2AxHH0n (/n ( (uA ( lp ( (IP (EF8&xHIY ( (Y ( (MYKh (iFx (5IYK ( ( (YK6.~ (7@E ( (L
I ( (_M ( (wMK ( (MK ( (Tp ( ( (N!0K (`MK ( ( (PN0 (CF!P (c ( (c (MYK@ (iFX (5IYKh (c ( (B ( (N (3I^N@ (@ ({Ac ( (F8 (F (c ( (p (FFy ({m ( (xp (c (xp (Cd (PH[ (Cd ( (m (EPI (@ (g ( (= (;m$PH[ (@f ( ( (p>FCd (Ik (5X8P ((A
|V (:P ([# ([@# ($ ([$ (2$ (@# ($ (% ($~n~!$A (`C9 (% ($ (87m$A (1N (C9 (% (% (% ((% (1R`% (Wj~RD#3X (% (& (W~D#3X (X& (3X (H% (& (~ (C9 (0 A (`I B (& (B' (yz$ ( >~% (% (3X (`C9 (% (m$C9 (87A (1N (P' (~`C9 (' (m$C9 (3X ( (1N (3X (' (~` (m$C9 (1N (`C9 (7 ( ( ((( (( (~n (8( (B( (( (8~$78( (~ ( ((( (` (m$C9 (1N (`C9 (() (ߴ  (m$C9 (1N (n `C9 (] (() (I0) (^D) (:6^D0) (|B) (`) (B:6 ;E:6) (B jG
() (:6(`=Q@7* (C Q 8* (C Q7P* (H:6P* (V>C&!E{.~* (B *H` (H* (6(TQ;7IP+ (CF QB] @+ ( (@ ( (6MYKX+ (iFx+ (5IYK+ (+ (+ (YK6r.~0 ( y (+ (L
I, (, (_M y (, (wM` (, (M` ( y (T y (, (N!0 (`M` (, (, (PN ( !0 - (h- (CF y ( ( (@ ( (FMYK!iF- (5IYK- (- (v (- (. (B. (FH/ (h6j.~` (/. (0. (%
I@WhP. (MX.BX. (KX (. (J2/ (. (. ({ / (. (X (KX (/. (. (/ (+ (@e (/ (A@e06 (p (06 (e (@e (/ () (m$/ (p>F@m$ (I (5X8P ((A
|VƤ (:P ([3 ([@3 ($ ([4 (2$ (@3 ($ (5 (`4 (2$ (Ƥ (YEYE@5 ( (4 (A@{ (h (4 (%
Ix`A7.~5 (05 (85 (KYE@MYKMYKI`5 (G05 (5YK5 (;I (5 (8 (eJ8Q(6 (Ӊ ( C (6 (,G$ (m ($${.~!$ Q6Ԍ7 ( #P378[Q>60E Q7 (B P7 ( ( (H608l (] (] ( (6 (R (L{L{H68 (CF8 (CFL{I8 (\9I8 (r ( (r (MYKMF (8 (5IYK8 ( 9 (@(YKr ( 9 (yDH9 (7Ch7 (i79 (9 (CF17I9 (^Dh9 (` 6^D9 (|B`9 (
9 (B` 6pNE` 68: (B Iz:ԽKE` 6(H`4Z6:x: (CE: (: (B 2AH (7xTQ7 lpP; (CF Q_>
@; (`X ( (`X (7MYKX; (iFx; (5IYK; (; (; (3I7a.~; (7@E6 (; (L
I "^6; ($I8;KA< (GM"^6r6 (< (nM6# (6 (T6 (!7# (`M6# (< (< (/N6# (6 (h@ = ( = (FO (6 (x= (VT (6 (p (F5I= (%M (`! ( (B8 (O ((78> (UN! (`! (x> (N (! (J2 (> ($M (! ( ({(] ( (x (Kx (] ( ( (P? (t4y! (! ( (p (? (L@ypU[ (P ( ( ()`x (m$ (p>F? (?yp\ (IP (V
|VƤ (:P ([C ([@C ($ ([D (2$ (
%Ƥ (E (0e-7
%0e-7D (YE@E (D (A@ ( (D (%
IxE (B8E (KYE@ ((D (MYKI`E (G0E (5YKE (;IE (H (eJ8Q(F (Ӊ ( C (F (,G$ ( ($$j.~# Q "ph 78[Q7`G (C Q³ G (C PG (.~C (ph 7
([H (P^ ( (F (aU (6L{
7H (CFH (CFL{ ( ( (MYKH (iFH (5IYKH ( I (|(YK ( I (yDHI (7C 7@` (8 7I (I (CF17Լ (xI ( ( ( ( (MYKԼ (iFI (5IYKI ( J ( J (YKJ (HHEIJ (2CJ (HPJ (J (J (BJ (CFJ (2AxHH0n (/n (K (uAJ ( lpJ (K (A(K (2AxHI@K (OP lpO (K (hK ({O (d QK ('@ (d QK (=RP (d QL (K (OPm$@O (d QL ('@ (d Q@L (Ȫ (d QpL (=RP! (d Q{L (1P@m$P (d (L (Y#g (d QM ({@m$ (Q@m$ (@% ( ( M (:N (z$Ta (@;OF8O (iFN (H (M (N (BN (FHO (h6 (N (F8O (FO (!O (XN (N ({8 (O (8s ( (8s ( l (p5 ( l (O ( (PO (4J7kO (gO (O (@z$ (Єm$p5 (} (A (O (p>F l (I (5X8P ((A\CD:P ([S ([@S ($ ([T (2$ (@S ($ (U (`T (2$ (T (YE@U (T (A@ (Hn\ (T (%
Ix@ 7a.~U (B8U (KYE@(T (MYKI`U (G0U (5YKU (;IU (X (eJ8Q(V (Ӊ ( C (V (,G$ (3 (((j.~"Q(V (W ( !(XA
7IpW (^DHW (~^DPW (B (/6P9 (X ( ( (V (E (8IQL{7X (CFX (CFL{4 (@ (4 (MYKX (iFX (5IYKX ( Y (@(YK4 ( Y (yDHY (7C`-*7` (-*7Y (Y (CFh17Ɂ (xY (4 (@ (4 (hFS (MYKɁ (iFY (5IYKY ( Z ( Z (YKZ (HHEIZ (2CZ (HHZ (Z (BZ (Z (Z (BZ (CFZ (2AxHJ ( J (0[ (uAZ ( lpP[ (CFAY ( (Y (`[ (MYK lpiFx[ (5IYK[ ([ ([ (YK57{.~[ (7@EO ([ (L
I\ (\ (_M!O (\ (wM (\ (M (O (TO (\ (N!0 (`M (\ (\ (PN@ ( !0 ] (h] (CFO (Y ( (Y (MYK!iF] (5IYK] (] (] (YK^ (HHEI^ (2C^ ( ^ ( ^ (LI!P^ (M~p^ (@[^ (p^ (M (0~^ (M~?I^ (^ (NY ( _ (A8a (^ (_ (X1 (* (* (!@ (P_ (A) (_ (_ (_ (@y06 () (0) ()a (_ (p>F_ (?y (I\7]7^7_7`7a7b7c7d7e7f7g7h7i7j7k7777777777777777777777777777777778 8!8"8#8$8%8&8'8(8)8*8+8,8-8.88898:8;8<8=8>8?8@8A8B8C8D8E8F8G8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8a8b8
 j8k8l8m8n8o8p8q8r8s8t8u8v8w8x8y8 888888888888888888888888888888888888888888888888888888888999999999 9
9 9 939495969798999:9;9<9=9>9?9@9A9B9k9l9m9n9o9p9q9r9s9t9u9v9w9x9y9z999999999999999999999999999999999999::::::::: :
: : :-:.:/:0:1:2:3:4:5:6:7:8:9:::;:<:[:\:]:^:_:`:a:b:c:d:e:f:g:h:i:j:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;; ;!;";6;7;8;9;:;;;<;=;>;?;@;A;B;C;D;E;[;\;];^;_;`;a;b;c;d;e;f;g;h;i;j;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*****RJ*)EժRJJQ*****
%CHCH</span>,</span> 3956t<span class="p"><span class="w"></span>inviteeDIDI</span>.</span><span class="p">AwayMessage</span></span>(<span class="p">EJEJ</span></span>)<span class="p"></span></span>)<span class="p"></span>
</span>FKFK<span class="w"><span class="w">&#43;1313GLGL1021102110231023 </span>}HMHM<span class="w"><span class="p"></span>
</span><span class="w">ININ<span class="w">141410221022JOJO10241024}<span class="p"></span>
</span><span class="w">KPKP<span class="p"> LQLQ $.3654]]MRMR8111/applications.clang-format.editorconfig.gitattributesNSNS.github.vscode.gitignore.gitmodules.pvsconfig.pvsoptionsOTOTBrewfileLICENSECODING_STYLE.mdReadMe.mdassetsSConstructapplicationsPUPUbrew-caskdebugfbtfbt.cmdfbt_options.pyfirmware.sconsfirmwarefurilibQVQVscriptsReadMe.mdsite_sconssonar-builddebugexamplesexternalmainRWRWservicessettingssystemTopictopicSELECT *SELECT * FROM "topic""SXSX"repo_topic"topic.nameSELECT *$1treeSELECT * FROM "tparentauthorTYTYcommittergpgsig
=c/eV
iduidemaillower_emailis_activatedUZUZis_primarySELECT 0en-us.en_us.en.md.en-us.mdV[V[.en_us.md_en.mdReadMe.mdreadme.md"treeparentauthorcommitter
treeW\W\parentauthorcommittergpgsig
=/7iJ
treeparentauthorcommitter
treeX]X]parentauthorcommitter
treeparentauthorcommittergpgsig
=TEN0
Y^Y^treeparentauthorcommittergpgsig
=DSgj
treeparentauthorcommittergpgsigZ_Z_
=IbGJ
treeparentauthorcommittergpgsig
=kaLC
tree[`[`parentauthorcommittergpgsig
=KjnT
treeparentauthorcommittergpgsig\a\a
=LE7o
treeparentauthorcommittergpgsig
=XyZi
treeparentauthor]b]bcommittergpgsig
=tzgJ
treeparentauthorcommittergpgsig
=XyZi
^c^ctreeparentauthorcommitter
treeparentauthorcommitter
svg-mfi-file_d_dsvg-mfi-hsvg-mfi-hsvg-mfi-hsvg-mfi-cEmail_Address`e`eemail_address"id", "Email_Addressemail_address"id", "uid", "afaf"id""uid""email"""lower_email"bgbg""is_activated"""is_primary"SELECT "chch"email_address""lower_email"=?"lower_email"=?SELECT "$1SELECT "id", "uididiiduidemaillower_emailis_activatedis_primaryejej4463oSELECT 0Email_Addressemail_addressEmail_Addressfkfkemail_address"id", ""id"2941"id", "uid", "glgl"uid""email""""lower_email""is_activated"hmhm""is_primary"SELECT "SELECT ""email_address"inin"lower_email"=?"lower_email"=?SELECT "id", "ui$1iduidemaillower_emailjojois_activatedis_primarySELECT 0SELECT 9642kpkpCommit_Statuscommit_statuscontext_hash"("commit_status"lqlqrepo_id = ?repo_id = ?) AND AND (sha = ?sha = ?mrmr)SELECT mSELECT max( "ind$1$2index11SELECT 0nsnsen-us.en_us.en-us.md.en.md.en_us.md_en.md\/assetsotottrue true {}{}''`'pupu''``''''trueqvqv true PP50000 50000 "Cancel""Copied!""Copied!"rwrw"Copy failed""Copy failed""Confirm""Confirm""Cancel"sxsx"More items""More items"1398vNavigation BarNavigation Bartyty class="w"HomeHomeLogoLogoNavigation MenuNavigation Menuuzuz class="w"3593  class="w"./Mirrorv{v{.PageGlobalData.2642R
RSS FeedRSS Feedw|w|WatchWatchStarStarx}x}0jy~y~Hide file treeHide file treezzShow file treeShow file treeCompareCompareBranchesBranchesTagsTags{{Filter branchFilter branchFind tagFind tag4269defaultdefault||Create tag %sCreate tag %sCreate branch %s1953Create branch %s}}from "%s"from "%s"from &#34;%s3294 View all tags~~View all tagscommittruetruefalsetruetrue-Copy path4061Copy pathGo to fileGo to fileGo to fileGo to filefbd162c4e3Merge branch L<a href<a href="bt_test.c-2154"'<a href<a href="-1811"'<a href<a href="-2142<a href#(<a href="furi_test.c-2180<a href<a href="furi_hal_tests.c-2089"<a href<a href="6480Pinfrared_test.c-1965<a href$)<a href="snomanager.gosocket.gostats.gotypes.gostrings.gostrings_test.goutilswhowas.gowhowas_test.go$.$.$.$.$.$.IsCsvFileCopy pathCopy path 13+2007*/(++)*@Y@100100100100irc/getters.go class="w"irc%2Fgetters.go143143143143 <span class="w"></span>client</span>.</span><span class="p">stateMutex</span>.</span><span class="p">Unlock</span>(<span class="p"></span>)</span>
<span class="p"><span class="w"></span><span class="w">144144144144}<span class="p"></span>
</span><span class="w"><span class="p">145145145145
</span><span class="w"><span class="w">1461002146func</span> </span>(<span class="w"><span class="p"></span>client</span> </span>*<span class="w"><span class="o"></span>Client</span>)</span> <span class="p"><span class="w"></span></span>(AwayMessage<span class="p"></span>)</span> <span class="p"><span class="w"></span>(</span><span class="p">result</span> <span class="w"></span>string</span>)</span> <span class="p"><span class="w"></span>{</span>
<span class="p"><span class="w"></span>&#43;147147 </span><span class="w">client</span>.<span class="p"></span></span>.stateMutex<span class="p"></span>RLock</span>(</span>)<span class="p"><span class="p"></span>
</span><span class="w"><span class="w">&#43;148148 </span><span class="w">result</span> <span class="w"></span>=</span> <span class="p"><span class="w"></span>client</span>.</span><span class="p">awayMessage</span>
</span><span class="w"><span class="w">&#43;149149 </span><span class="w">client</span>.<span class="p"></span></span>.stateMutex<span class="p"></span>RUnlock</span>(</span>)<span class="p"><span class="p"></span>
</span><span class="w"><span class="w">&#43;150150 <span class="w"></span>return<span class="k"></span>
</span><span class="w"><span class="w">&#43;151151}</span>
<span class="p"><span class="w"></span><span class="p">&#43;1010152152
</span><span class="w">&#43;<span class="w">1111153153func</span> </span>(<span class="w"><span class="p"></span>client</span> </span>*<span class="w"><span class="o"></span>Client</span>)</span> <span class="p"><span class="w"></span></span>(SetAwayMessage<span class="p"></span>message</span> </span><span class="w">string</span>)<span class="p"></span> </span>{<span class="w"><span class="p"></span>
</span><span class="w">&#43;1212154154 </span><span class="w">client</span>.<span class="p"></span></span>.stateMutex<span class="p"></span>Lock</span>(</span>)<span class="p"><span class="p"></span>
</span><span class="w"><span class="w">&#43;1313155155 </span><span class="w">client</span>.<span class="p"></span></span> awayMessage<span class="w"></span>=</span> <span class="p"><span class="w"></span>message</span>
</span><span class="w"><span class="w">&#43;1414156156 </span><span class="w">client</span>.<span class="p"></span></span>.stateMutex<span class="p"></span>Unlock</span>(</span>)<span class="p"><span class="p"></span>
</span><span class="w"><span class="w">&#43;1515157157}</span>
<span class="p"><span class="w"></span><span class="p">&#43;1616158158
</span><span class="w">&#43;<span class="w">1717146146159159func</span> <span class="w"></span>(</span><span class="p">client</span> <span class="w"></span>*</span><span class="o">Client</span>)<span class="p"></span> </span><span class="w">Destroyed</span><span class="p">(</span>)</span><span class="p"><span class="w"> </span>bool</span> </span>{<span class="w"><span class="p"></span>
</span><span class="w">1818147147160160 <span class="w"></span>client</span>.</span><span class="p">stateMutex</span>.</span><span class="p">RLock</span>(<span class="p"></span>)</span>
<span class="p"><span class="w"></span><span class="w">19194134148148161161 <span class="w"></span>defer<span class="k"></span> </span><span class="w">client</span>.<span class="p"></span></span>.stateMutex<span class="p"></span>RUnlock</span>(</span>)<span class="p"><span class="p"></span>
</span><span class="w"><span class="w">'irc%2Fgetters.go' $.accounts.gocapschannel.gochannelreg.gochanserv.goclient.gocustimecommands.goconfig.goconstants.godatabase.godline.gohelp.goerrors.gofakelag.gofakelag_test.gogateways.gogetters.gohandlers.gohistoryisupporthostserv.goidletimer.gokline.gologgerlanguageslegacy.gomkcertsmodes.gomodesmonitor.gomodes_test.gonickname.gonickserv.gonumerics.gopasswdresume.goroleplay.gosemaphores.goserver.gosnoservices.gosnomanager.gosocket.gostats.gotypes.gostrings.gostrings_test.goutilswhowas.gowhowas_test.go$.capsaccounts.gochannel.gochannelreg.gochanserv.goclient.gocustimecommands.goconfig.goconstants.godatabase.godline.gohelp.goerrors.gofakelag.gofakelag_test.gogateways.gogetters.gohandlers.gohistoryisupporthostserv.goidletimer.gokline.gologgerlanguageslegacy.gomkcertsmodes.gomodesmonitor.gomodes_test.gonickname.gonickserv.gonumerics.gopasswdresume.goroleplay.gosemaphores.goserver.gosnoservices.gosnomanager.gosocket.gostats.gotypes.gostrings.gostrings_test.goutilswhowas.gowhowas_test.go$.*/*git.utn.lol2.0 Caddy10.1.0.2httpsX-Forwarded-Hostgit.utn.lol6a30dc38]6a30dc38-353210.1.0.2:0en-USmirrorUseruserUseruser"id", ""id"""name""lower_name"""email"4594"full_name""""passwd"""""login_type"""login_source"""login_name""type"""location""website"rands""website""salt"""language""""description""created_unix"""updated_unix"""last_login_unix""""is_active"""is_admin"""is_restricted"""allow_git_hook"124400""""prohibit_login""avatar""""avatar_email"""num_followers"""num_following"""num_stars"""num_repos"""num_teams"""num_members"""visibility""""theme""diff_view_style"SELECT "user"lower_name=?lower_name=?SELECT "$1SELECT "id", "lo6a30dc38]6a30dc38-36!/dev/null)6a30dc38/usr/bin/git)6a30dc38-38]!0/usr/bin/git02503 .clang-format.clangd.cursor.editorconfig.gitattributes.github.vscode.gitignore.gitmodules.pvsconfig.pvsoptions.sublime-projectAGENTS.mdLICENSECHANGELOG.mdCODING_STYLE.mdCONTRIBUTING.mdReadMe.mdassetsSConstructapplicationsdocumentationfbtfbt.cmdfurilibfbt_options.pyfirmware.sconsscriptstargetssite_sconstsconfig.jsontreeparentauthorcommittergpgsig
=LoK0
8treeparentparentauthorcommittergpgsig
=t99+
treeparentparentauthorcommittergpgsig
=R98I

custom5\i5\icustom-firmware5\i5\ifirmware5\i5\iflipper5\i5\i  flipper-zero5\i5\iflipperzero

5\i5\i5\i5\i  momentum5\i5\iSELECT 8  treeparentauthorcommittergpgsig
=rdWW
ReadMe.mddebugexamplesexternal  mainservicessettingssystemtreeparentauthorcommittergpgsig
=I4Hi
 ---------
treeparentauthorcommittergpgsig
=43pj
readme.md"

svg-mfi-readmeEmail_Addressemail_address"id", "Email_Address  email_address"id", "uid", ""id""uid"  "email"""lower_email"""is_activated""  "is_primary"SELECT ""email_address""lower_email"=?"lower_email"=?SELECT "$1SELECT "id", "uiairmousearkanoidapplication.famasteroidscounterbarcode_genblackjackbomberduckbpmtapperbrainfuckcaesarciphercalculatorcli_bridgecntdown_timerdap_linkdoomdtmf_dolphinesp8266_deauthflappy_birdflashlightflipfridgame15flipper_i2ctoolsgame_2048geigergame_of_lifegpioreader_agpioreader_bgps_nmea_uarthc_sr04hid_apphex_vieweribtn_fuzzeriftttir_remoteir_scopemfkey32lightmetermandelbrotmetronomeminesweepermorse_codemousejackermulti_convertermulti_dicemusic_beepermusic_playermusic_trackernfc_magicnightstandnrf24scannrfsniffocarinaorgasmotronpaintpassgenpicopasspocsag_pagerpomodoropongprotoviewqrcoderc2014_colecosamsentry_safesignal_generatorsnake_gamesolitairetama_p1spi_mem_managersubghz_playlistsubghz_remoteswd_probetanksgametotptetris_gametext_viewertictactoe_gametimelapse<svg viewBox='0 0 32 32'><path fill='#039be5' d='M28.967 12H9.442a2 2 0 0 0-1.898 1.368L4 24V10h24a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464l-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h22l4.805-11.212A2 2 0 0 0 28.967 12'/><path fill='#b3e5fc' d='M24 16v-2h-3a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h3v-2h-2v-8Zm8-2v-2h-5a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h5v-2h-4V14Zm-16 2h2v8h-2z'/></svg><svg viewBox='0 0 32 32'><path fill='#43a047' d='m13.844 7.536-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464'/><path fill='#c8e6c9' d='M20 10a2 2 0 0 0-1.6.8l-1.6 2.134a4 4 0 0 0-.8 2.398V26a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V15.332a4 4 0 0 0-.8-2.398L29.6 10.8A2 2 0 0 0 28 10zm0 2h8l1.5 2h-11zm2 4h4v4h4l-6 6-6-6h4z'/></svg><svg viewBox="0 0 16 16" class="svg octicon-device-camera" aria-hidden="true" width="16" height="16"><path d="M15 3c.55 0 1 .45 1 1v9c0 .55-.45 1-1 1H1c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1 0-.55.45-1 1-1h4c.55 0 1 .45 1 1Zm-4.5 9c1.94 0 3.5-1.56 3.5-3.5S12.44 5 10.5 5 7 6.56 7 8.5 8.56 12 10.5 12M13 8.5c0 1.38-1.13 2.5-2.5 2.5S8 9.87 8 8.5 9.13 6 10.5 6 13 7.13 13 8.5M6 5V4H2v1Z"/></svg>ද්ගලික",
"home.<svg viewBox='0 0 32 32'><path fill='#fbc02d' d='m13.844 7.536-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464'/><path fill='#fff9c4' d='M16 16h-2v13a1 1 0 0 0 1 1h13v-2H16Z'/><path fill='#fff9c4' d='M31 12H19a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V13a1 1 0 0 0-1-1m-5 12h-6v-2h6Zm4-4H20v-2h10Zm0-4H20v-2h10Z'/></svg><svg viewBox="0 0 16 16" class="svg octicon-diamond" aria-hidden="true" width="16" height="16"><path d="M.527 9.237a1.75 1.75 0 0 1 0-2.474L6.777.512a1.75 1.75 0 0 1 2.475 0l6.251 6.25a1.75 1.75 0 0 1 0 2.475l-6.25 6.251a1.75 1.75 0 0 1-2.475 0zm1.06-1.414a.25.25 0 0 0 0 .354l6.251 6.25a.25.25 0 0 0 .354 0l6.25-6.25a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.354 0l-6.25 6.25Z"/></svg>රීය කර ඇත. <svg viewBox='0 0 32 32'><path fill='#2196f3' d='m13.844 7.536-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464'/><circle cx='21' cy='21' r='3' fill='#bbdefb'/><path fill='#bbdefb' d='M21 14c-4.66 0-9.35 2.91-11 7 1.65 4.09 6.34 7 11 7s9.35-2.91 11-7c-1.65-4.09-6.34-7-11-7m0 12a5 5 0 1 1 5-5 5 5 0 0 1-5 5'/></svg><svg viewBox="0 0 16 16" class="svg octicon-diff-modified" aria-hidden="true" width="16" height="16"><path d="M13.25 1c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0 1 13.25 15H2.75A1.75 1.75 0 0 1 1 13.25V2.75C1 1.784 1.784 1 2.75 1ZM2.75 2.5a.25.25 0 0 0-.25.25v10.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25V2.75a.25.25 0 0 0-.25-.25ZM8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10"/></svg>)",
"auth.reset_password<svg viewBox='0 0 32 32'><path fill='#43a047' d='m13.844 7.536-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464'/><path fill='#c8e6c9' d='M17.414 14.586 20 12h-8v8l2.586-2.586 4.91 4.91A1.7 1.7 0 0 1 20 23.541V28h4v-4.459a5.68 5.68 0 0 0-1.676-4.045ZM29.36 12l-5.61 4.93.57.57a5.6 5.6 0 0 1 1.56 2.89L32 15.01Z'/></svg>/></svg><svg viewBox="0 0 16 16" class="svg octicon-diff-removed" aria-hidden="true" width="16" height="16"><path d="M13.25 1c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0 1 13.25 15H2.75A1.75 1.75 0 0 1 1 13.25V2.75C1 1.784 1.784 1 2.75 1ZM2.75 2.5a.25.25 0 0 0-.25.25v10.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25V2.75a.25.25 0 0 0-.25-.25Zm8.5 6.25h-6.5a.75.75 0 0 1 0-1.5h6.5a.75.75 0 0 1 0 1.5"/></svg>ැවත <svg viewBox='0 0 32 32'><path fill='#546e7a' d='M28.967 12H9.442a2 2 0 0 0-1.898 1.368L4 24V10h24a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464l-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h22l4.805-11.212A2 2 0 0 0 28.967 12'/><path fill='#cfd8dc' d='M28 12h-6a4 4 0 0 0-4 4v8h2v-8h8v9.893a2.074 2.074 0 0 1-1.664 2.08A2 2 0 0 1 24 26h-8a4 4 0 0 0 4 4h6a4 4 0 0 0 4-4V16h2a4 4 0 0 0-4-4'/></svg><svg viewBox="0 0 16 16" class="svg octicon-feed-heart" aria-hidden="true" width="16" height="16"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16m2.33-11.5c-1.22 0-1.83.5-2.323 1.136C7.513 5 6.903 4.5 5.682 4.5c-1.028 0-2.169.784-2.169 2.5 0 1.499 1.493 3.433 3.246 4.517.52.321.89.479 1.248.484.357-.005.728-.163 1.247-.484C11.007 10.433 12.5 8.5 12.5 7c0-1.716-1.14-2.5-2.17-2.5"/></svg>ිනය කිසිදු <svg viewBox='0 0 32 32'><path fill='#f9a825' d='m13.844 7.536-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464'/><path fill='#fff9c4' d='M28 16v-3.828a4.116 4.116 0 0 0-3.607-4.153A4 4 0 0 0 20 12v4h-2a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8a2 2 0 0 0-2-2Zm-4 8a2 2 0 1 1 2-2 2 2 0 0 1-2 2m2-8h-4v-4a2 2 0 0 1 4 0Z'/></svg><svg viewBox="0 0 16 16" class="svg octicon-feed-repo" aria-hidden="true" width="16" height="16"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16M5.5 4A1.5 1.5 0 0 0 4 5.5v5c0 .828.5 1.5 1 1.5v-1a1 1 0 0 1 1-1h5v1h-1v1h1.5a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.5-.5Zm.5 7.25v2.514a.25.25 0 0 0 .426.178l.898-.888a.25.25 0 0 1 .352 0l.898.888A.25.25 0 0 0 9 13.764V11H6.25a.25.25 0 0 0-.25.25"/></svg>ුන්ගේ මුර<svg viewBox='0 0 32 32'><path fill='#ef5350' d='M28.967 12H9.442a2 2 0 0 0-1.898 1.368L4 24V10h24a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464l-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h22l4.805-11.212A2 2 0 0 0 28.967 12'/><path fill='#ffcdd2' d='M14 14h6l-.8 3H14zm18 0v3h-9.8l.8-3zm-18 6h4.4l-.8 3H14zm18 0v3H20.6l.8-3zm-18 6h2.8l-.8 3h-2zm18 0v3H19l.8-3z'/></svg> 0 0 0-.176-.195"/></svg><svg viewBox="0 0 16 16" class="svg octicon-feed-star" aria-hidden="true" width="16" height="16"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16m.252-12.932a.476.476 0 0 0-.682.195l-1.2 2.432-2.684.39a.477.477 0 0 0-.266.816l1.944 1.892-.46 2.674a.479.479 0 0 0 .694.504L8 10.709l2.4 1.261a.478.478 0 0 0 .694-.504l-.458-2.673L12.578 6.9a.479.479 0 0 0-.265-.815l-2.685-.39-1.2-2.432a.47.47 0 0 0-.176-.195"/></svg><svg viewBox='0 0 32 32'><path fill='#66bb6a' d='M28.967 12H9.442a2 2 0 0 0-1.898 1.368L4 24V10h24a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464l-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h22l4.805-11.212A2 2 0 0 0 28.967 12'/><path fill='#c8e6c9' d='M30 18h-6v-6.499a.5.5 0 0 0-.9-.3l-6.3 8.4a1.5 1.5 0 0 0 1.2 2.4h6V28.5a.5.5 0 0 0 .9.3l6.3-8.4A1.5 1.5 0 0 0 30 18'/></svg>/svg><svg viewBox='0 0 32 32'><path fill='#00bfa5' d='M28.967 12H9.442a2 2 0 0 0-1.898 1.368L4 24V10h24a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464l-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h22l4.805-11.212A2 2 0 0 0 28.967 12'/><path fill='#a7ffeb' d='M16 12v2h2v12a4 4 0 0 0 8 0V14h2v-2Zm5 14a1 1 0 1 1 1-1 1 1 0 0 1-1 1m2-4a1 1 0 1 1 1-1 1 1 0 0 1-1 1m1-4h-4v-4h4Z'/></svg></svg><svg viewBox='0 0 32 32'><path fill='#43a047' d='m13.844 7.536-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464'/><path fill='#c8e6c9' d='M20 14v6.48l5.38 4.3 1.24-1.56-4.62-3.7V14z'/><path fill='#c8e6c9' d='m32 10.162-2.898 2.821A9.984 9.984 0 1 0 31.8 22h-2.05a8.034 8.034 0 1 1-2.082-7.62L24.975 17H32Z'/></svg></svg><svg viewBox='0 0 32 32'><path fill='#7cb342' d='m13.844 7.536-1.288-1.072A2 2 0 0 0 11.276 6H4a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h24a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2H15.124a2 2 0 0 1-1.28-.464'/><path fill='#dcedc8' d='M31 12H19a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V13a1 1 0 0 0-1-1m-1 8h-4v4h-2v-4h-4v-2h4v-4h2v4h4Z'/><path fill='#dcedc8' d='M16 28V16h-2v13a1 1 0 0 0 1 1h13v-2Z'/></svg>.513-1.237"/></svg> තැපැල් ලිපිනය සමඟ ලියාපදිංචි විය නොහැක.",
"auth.authorize_application": "අයදුම/<h1 id="user-content-flipper-bootloader">Flipper bootloader</h1>
<p dir="auto">What it does?</p>
<ul dir="auto">
<li>[+] Hardware initialization</li>
<li>[+] Boot process LED indicators</li>
<li>[+] Firmware update</li>
<li class="task-list-item"><input type="checkbox" disabled="" data-source-position="125"/>Firmware CRC check</li>
<li class="task-list-item"><input type="checkbox" disabled="" data-source-position="150"/>Interactive UI</li>
<li class="task-list-item"><input type="checkbox" disabled="" data-source-position="171"/>FS check</li>
<li class="task-list-item"><input type="checkbox" disabled="" data-source-position="186"/>Recovery mode</li>
<li class="task-list-item"><input type="checkbox" disabled="" data-source-position="206"/>Errata crutches</li>
</ul>
<h1 id="user-content-targets">Targets</h1>
<h2 id="user-content--name-------bootloader-----firmware-------reset------dfu----------------------------address--------address--------combo------combo-------------">| Name | Bootloader | Firmware | Reset | DFU |
| | Address | Address | Combo | Combo |</h2>
<p dir="auto">| f4 | 0x08000000 | 0x00008000 | L+Back | L+Back, hold L |</p>
<p dir="auto">Also there is a ST bootloader combo available on empty device: L+Ok+Back, release Back,Left.
Target independend code and headers in <code>src</code>and <code>target/include</code> folders.</p>
<h1 id="user-content-building">Building</h1>
<h2 id="user-content-with-dev-docker-image">With dev docker image:</h2>
<p dir="auto"><code>docker-compose exec dev make -C bootloader</code></p>
<h2 id="user-content-with-toolchain-installed-in-path">With toolchain installed in path:</h2>
<p dir="auto"><code>make -C bootloader </code></p>
<h2 id="user-content-build-options">Build Options</h2>
<ul dir="auto">
<li><code>DEBUG</code> - 0/1 - enable or disable debug build. Default is 1.</li>
<li><code>TARGET</code> - string - target to build. Default is <code>f4</code>.</li>
</ul>
<h1 id="user-content-flashing">Flashing</h1>
<p dir="auto">Using stlink(st-flash):</p>
<p dir="auto"><code>make -C bootloader flash</code></p>
<p dir="auto">Or use ST bootloader:</p>
<p dir="auto"><code>make -C bootloader upload</code></p>
<h1 id="user-content-debug">Debug</h1>
<p dir="auto">Using stlink (st-util + gdb):</p>
<p dir="auto"><code>make -C bootloader debug</code></p>
!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_J (4t (J (5@t (!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_J ( QJ ( Q!h` (`!_!h` (`!_!h` (`!_!h` (`!_J ( QJ ( Q!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_J (Py (J (y (!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_J ( QJ ( Q!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_!h` (`!_jPjPjPjPPjPjPPjPjJ(jPjPjJ(jPjPjPjPjPjPjJ(jPjPjPjPj  409func</span> <span class="w"></span></span>(awayHandler!!<span class="p"></span>server</span> </span>*<span class="w"><span class="o">""</span>Server</span>,</span> <span class="p"><span class="w"></span>client##</span> </span>*<span class="w"><span class="o"></span>Client</span>,</span> $$<span class="p"><span class="w"></span>msg</span> </span><span class="w"> % %ircmsg</span>.<span class="p"></span></span>,IrcMessage<span class="p">!&!&</span> </span><span class="w">rb</span> <span class="w"></span>*</span>"'"'<span class="o">ResponseBuffer</span>)</span> <span class="p"><span class="w">#(#(</span>bool</span> </span>{<span class="w"><span class="p"></span>
</span>$)$)<span class="w">410410%*%*410410 <span class="w"></span>var</span> </span>&+&+<span class="w">isAway</span> <span class="w"></span>bool</span>
</span>',',<span class="w"><span class="w">(-(-411411􀀀 􀀀 􀀁􀀂􀀀 􀀃􀀀 􀀁􀀂).).􀀅􀀃6389􀀅 <span class="w">*/*/<span class="w"></span>var</span> </span><span class="w">text</span>+0+0</span> </span><span class="w">string</span>
<span class="w"></span>,1,1<span class="w">411411􀀀 -2-2􀀀 􀀁􀀂􀀀 􀀃􀀀 􀀁􀀂􀀅􀀃.3.3􀀅 <span class="w"><span class="w"></span>var</span> </span>/4/4<span class="w">awayMessage</span></span> <span class="w"></span>string0505</span>
</span><span class="w"><span class="w">&#43;161613173u34124124122727412 </span>if<span class="w"><span class="k"></span> </span><span class="w">3838len</span>(<span class="p"></span>msg</span>.</span><span class="p">4949Params</span>)<span class="p"></span> </span><span class="w"><span class="p">5:5:&gt;</span> <span class="w"></span>0</span> <span class="w"></span>{</span>
6;6;<span class="p"><span class="w"></span><span class="w">7<7<413413413413 8=8=<span class="w"></span>isAway</span> </span>=<span class="w"><span class="p">9>9></span> </span><span class="w">true</span>
<span class="w"></span>:?:?2184<span class="w">414;@;@414􀀀 􀀀 􀀁􀀂􀀀 􀀂􀀀 􀀁􀀉635{<A<A􀀉􀀀 􀀁 􀀂􀀉 <span class="w">=B=B<span class="w"></span>text</span></span> <span class="w"></span>=</span> >C>C<span class="p"><span class="w"></span>msg</span>.</span><span class="p">?D?DParams</span>[<span class="p"></span>0</span>]<span class="p"></span>
</span>@E@E<span class="w"><span class="w">AFAF414414􀀀 􀀀 􀀁􀀂􀀀 􀀂􀀀 􀀁􀀉BGBG􀀉􀀀 􀀁 􀀂􀀉 <span class="w">CHCH<span class="w"></span></span>awayMessage</span> </span>=<span class="w">DIDI1362R<span class="p"></span> </span><span class="w">msg</span>.EJEJ<span class="p"></span>Params</span>[</span>0<span class="p"></span>]</span>
FKFK<span class="p"><span class="w"></span>&#43;<span class="w">1010GLGL415415415415 HMHM<span class="w"></span>awayLen</span> </span><span class="w"><span class="o">ININ:=</span> <span class="w"></span>server</span>.</span><span class="p">JOJOLimits</span>(<span class="p"></span>)</span>.<span class="p"><span class="p">KPKP</span>AwayLen</span>
</span><span class="w"><span class="w">1111LQLQ416416􀀀 􀀀 􀀁􀀂MRMR􀀀 􀀆􀀀 􀀁􀀂􀀉 􀀆􀀉 NSNS<span class="w"><span class="w"></span>if<span class="k"></span> </span>OTOT<span class="w">2439len</span>(<span class="p"></span>textPUPU</span></span>)<span class="p"></span> </span><span class="w"><span class="p">QVQV&gt;</span> <span class="w"></span>awayLen</span> </span>{<span class="w">RWRW<span class="p"></span>
</span><span class="w"><span class="w">1212SXSX417417􀀀 􀀀 􀀀 􀀁􀀂TYTY􀀀 􀀁􀀆􀀂􀀆􀀂􀀆􀀂􀀆UZUZ􀀂􀀆􀀀 􀀁􀀂􀀆V[V[􀀂􀀆<span class="w"> </span><span class="w">W\W\text</span></span> </span>=<span class="w"><span class="p"></span> </span>X]X]<span class="w">text</span>1519</span>[</span>:<span class="p">Y^Y^<span class="p"></span>awayLen</span>]</span>
<span class="p"><span class="w">Z_Z_</span><span class="w">1313416[`[`3617!416􀀀 􀀀 􀀁􀀂􀀀 􀀆􀀀 􀀁􀀂\a\a􀀉 􀀆􀀉 <span class="w"><span class="w">]b]b</span>if<span class="k"></span> </span><span class="w">len</span>(^c^c<span class="p"></span></span>awayMessage</span>)</span> <span class="p">_d_d<span class="w"></span>&gt;<span class="p"></span> </span><span class="w">`e`eawayLen</span> <span class="w"></span>{</span>
<span class="p"><span class="w">afaf</span>&#43;<span class="w">1414bgbg417417􀀀 􀀀 􀀀 􀀁􀀂􀀀 􀀁􀀆chch􀀂􀀆􀀂􀀆􀀂􀀆didi􀀂􀀆3731􀀀 􀀁􀀂􀀆ejej􀀂􀀆1754<span class="w"> </span>fkfk<span class="w">awayMessage</span></span> <span class="w"></span>=</span> glgl<span class="p"><span class="w"></span></span>awayMessage</span>[</span>:hmhm<span class="p"><span class="p"></span>awayLen</span>]</span>
<span class="p">inin<span class="w"></span>&#43;<span class="w">1515jojo418418418418 <span class="w">kpkp</span>}</span>
<span class="p"><span class="w"></span>lqlq<span class="w">1616419419mrmr419419 <span class="w"></span>}</span>
<span class="p">nsns<span class="w"></span><span class="w">1717otot420420420420
</span>pupu<span class="w"><span class="w">1818qvqv421421421421 </span><span class="w">rwrwclient</span>.<span class="p"></span>SetMode</span>(</span><span class="p">sxsxmodes</span>.<span class="p"></span>Away</span>,</span> <span class="p">tyty<span class="w"></span>isAway</span>)</span>
<span class="p"><span class="w">uzuz</span><span class="w">1919422v{v{422􀀀 􀀀 􀀀 􀀁􀀂􀀀 􀀁􀀂􀀈􀀅(􀀆w|w|􀀄􀀅(􀀀 􀀁 (x}x} =)􀀆=)=)􀀀=y~y~)=)= 􀀁􀀇 )=)zz= 􀀀 􀀁􀀇􀀀
􀀁({{ )=) ( || <span class="w"><span class="w"></span>client</span>.</span>}}<span class="p">awayMessage</span></span> <span class="w"></span></span>=~~<span class="p"></span></span> <span class="w"></span></span>text</span></span>
</span><span class="w"><span class="w">2020422422􀀀 􀀀 􀀀 􀀁􀀂􀀀 􀀁􀀂􀀈􀀅(􀀆􀀄􀀅(􀀀 􀀁 ( =)􀀆=)=)􀀀=)=)= 􀀁􀀇 )=)= 􀀀 􀀁􀀇􀀀
􀀁( )=) (  <span class="w"><span class="w"></span>client</span>.</span><span class="p">SetAwayMessage</span></span>(<span class="p"></span></span>awayMessage</span></span>)<span class="p"></span></span>
<span class="w"></span>&#43;<span class="w">2121423423423423
</span><span class="w"><span class="w">2222424424424424 </span><span class="w">var</span> <span class="w"></span>op</span> </span><span class="w">modes</span>.<span class="p"></span>ModeOp</span>
</span><span class="w"><span class="w">2323425425425425 <span class="w"></span>if<span class="k"></span> </span><span class="w">isAway</span> <span class="w"></span>{</span>
<span class="p"><span class="w"></span><span class="w">439439439439 </span><span class="w"></span>
</span><span class="w"><span class="w">440440440440 </span><span class="w"><span class="k">for</span> <span class="w"></span>friend</span> </span><span class="w"><span class="o">:=</span> <span class="w"></span>range<span class="k"></span> </span><span class="w">client</span>.<span class="p"></span>Friends</span>(</span><span class="p">caps</span>.<span class="p"></span></span>)AwayNotify<span class="p"></span> </span>{<span class="w"><span class="p"></span>
</span><span class="w"><span class="w">441441441441 <span class="w"></span>if<span class="k"></span> </span><span class="w">isAway</span> <span class="w"></span>{</span>
<span class="p"><span class="w"></span><span class="w">442442􀀀 􀀀 􀀀 􀀁􀀂􀀀 􀀁􀀂􀀊􀀃
􀀁􀀊􀀃􀀌 <span class="w"><span class="w"></span>friend</span>.</span><span class="p">SendFromClient</span>(</span><span class="p"><span class="s">&#34;&#34;</span>,</span> <span class="p"><span class="w"></span>client</span>,</span> <span class="p"><span class="w"></span>nil</span>,</span> <span class="p"><span class="w"></span></span>,<span class="s">&#34;AWAY&#34;<span class="p"></span> </span><span class="w">client</span>.<span class="p"></span></span>awayMessage</span>)</span>
<span class="p"><span class="w"></span><span class="w">442442􀀀 􀀀 􀀁􀀂􀀀
􀀀 􀀁􀀂􀀊􀀃􀀁􀀊􀀃􀀌<span class="w"> </span><span class="w">friend</span>.<span class="p"></span></span>(SendFromClient<span class="p"></span></span>,<span class="s">&#34;&#34;<span class="p"></span> </span><span class="w">client</span>,<span class="p"></span> </span><span class="w">nil</span>,<span class="p"></span> </span><span class="w"><span class="s">&#34;AWAY&#34;</span>,</span> <span class="p"><span class="w"></span></span>)awayMessage<span class="p"></span>
</span><span class="w"><span class="w">&#43;4357443443443443 <span class="w"></span>}</span> <span class="p"><span class="w"></span>else<span class="k"></span> </span>{<span class="w"><span class="p"></span>
</span><span class="w"><span class="w">438713714444444444444<span class="w"> </span>friend</span>.</span><span class="p">SendFromClient</span>(</span><span class="p"><span class="s">&#34;&#34;</span>,</span> <span class="p"><span class="w"></span>client</span>,</span> <span class="p">3089 <span class="w">3818</span>nil</span>,</span> <span class="p"><span class="w"></span></span>)<span class="s">&#34;AWAY&#34;<span class="p"></span>
</span><span class="w"><span class="w">445445445445 </span>}<span class="w"><span class="p"></span>
</span><span class="w"><span class="w">1783178317831783
<span class="w"></span><span class="w">1784178417841784// MONITOR L2674r
</span>
</span><span class="w">1785178517851785func</span> <span class="w"></span></span>(<span class="p"></span>server</span> </span>*<span class="w"><span class="o"></span>Server</span>,</span> <span class="p"><span class="w"></span>client</span> </span>*<span class="w"><span class="o"></span>Client</span>,</span> <span class="p"><span class="w"></span>msg</span> </span><span class="w">ircmsg</span>.<span class="p"></span></span>,IrcMessage<span class="p"></span> </span><span class="w">rb</span> <span class="w"></span>*</span><span class="o">ResponseBuffer</span>)</span> <span class="p"><span class="w"></span>bool</span> </span>{<span class="w"><span class="p"></span>
</span><span class="w">17861786 <span class="w">1448</span>nick</span> </span><span class="w"><span class="o">:=</span> <span class="w"></span>client</span>.</span><span class="p">Nick</span>(<span class="p"></span>)</span>
<span class="p"><span class="w"></span>&#43;<span class="w">1786178617871787 </span><span class="w">monitorList</span> </span><span class="w"><span class="o">:=</span> <span class="w"></span>server</span>.</span><span class="p">monitorManager</span>.</span><span class="p">List</span>(<span class="p"></span>client</span>)</span>
<span class="p"><span class="w"></span><span class="w">1787178717881788
</span><span class="w"><span class="w">11439,1788178817891789 </span><span class="w">var</span> <span class="w"></span>nickList</span> </span>[<span class="w"><span class="p"></span>]</span><span class="p">string</span>
<span class="w"></span><span class="w">1796179617971797 <span class="w"></span>}</span>
<span class="p"><span class="w"></span><span class="w">1797179717981798
</span><span class="w"><span class="w">1798179817991799 </span><span class="w"><span class="k">for</span> <span class="w"></span>_</span>,<span class="p"></span> </span><span class="w">line</span> <span class="w"></span>:=<span class="o"></span> </span><span class="w"><span class="k">range</span> <span class="w"></span>utils</span>.</span><span class="p">ArgsToStrings</span>(</span><span class="p">maxLastArgLength</span>,</span> <span class="p"><span class="w"></span>nickList</span>,</span> <span class="p"><span class="w"></span></span>)<span class="s">&#34;,&#34;<span class="p"></span> </span>{<span class="w"><span class="p"></span>
</span><span class="w"><span class="w">17991799􀀀 􀀀 􀀁􀀂􀀀 􀀎􀀀 􀀁􀀂􀀎<span class="w"> </span>rb<span class="w"></span>.</span><span class="p">Add</span>(<span class="p"></span>nil</span>,</span> <span class="p"><svg viewBox="0 0 16 16" class="svg octicon-checkbox" aria-hidden="true" width="16" height="16"><path d="M2.75 1h10.5c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0 1 13.25 15H2.75A1.75 1.75 0 0 1 1 13.25V2.75C1 1.784 1.784 1 2.75 1M2.5 2.75v10.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25V2.75a.25.25 0 0 0-.25-.25H2.75a.25.25 0 0 0-.25.25m9.28 3.53-4.5 4.5a.75.75 0 0 1-1.06 0l-2-2a.75.75 0 0 1 .018-1.042.75.75 0 0 1 1.042-.018l1.47 1.47 3.97-3.97a.75.75 0 0 1 1.042.018.75.75 0 0 1 .018 1.042"/></svg>issues <span class="sa">f</span><span class="s2">&#34;</span><span class="s2">Decompressing with window size </span><span class="si">{</span><span class="n">header</span><span class="o">.</span><span class="n">window_size</span><span class="si">}</span><span class="s2"> and lookahead size </span><span class="si">{</span><span class="n">header</span><span class="o">.</span><span class="n">lookahead_size</span><span class="si">}</span><span class="s2">&#34;</span>
<svg viewBox="0 0 16 16" class="svg octicon-cloud" aria-hidden="true" width="16" height="16"><path d="M2 7.25A5.225 5.225 0 0 1 7.25 2a5.22 5.22 0 0 1 4.767 3.029A4.47 4.47 0 0 1 16 9.5c0 2.505-1.995 4.5-4.5 4.5h-8A3.474 3.474 0 0 1 0 10.5c0-1.41.809-2.614 2.001-3.17Zm1.54.482a.75.75 0 0 1-.556.832c-.86.22-1.484.987-1.484 1.936 0 1.124.876 2 2 2h8c1.676 0 3-1.324 3-3s-1.324-3-3-3a.75.75 0 0 1-.709-.504A3.72 3.72 0 0 0 7.25 3.5C5.16 3.5 3.5 5.16 3.5 7.25q.003.22.035.436l.004.036.001.008Z"/></svg>dd_ref_at": <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="s2">Decompressed </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">compressed</span><span class="p">)</span><span class="si">}</span><span class="s2"> bytes to </span><span class="si">{</span><span class="nb">len</span><svg viewBox='0 0 32 32'><path fill='#757575' d='M15 2H6a2.006 2.006 0 0 0-2 2v22a2.006 2.006 0 0 0 2 2h6v-4H6v-2h6v-2H6v-2h6v-2H6v-2h6v-2h2V4l8 8h2v-1Z'/><path fill='#7c4dff' d='M12 12v18h18V12Zm10 16c-.9 0-2.025-1.267-2.025-3.005-.914 0-.975.464-.975 1.005-.881-.213-1-1.15-1-2h6c0 1.919-2 1.787-2 4m2.542-6a2.5 2.5 0 0 1-2.308-1.641l-.946-2.42a.305.305 0 0 0-.576 0l-.946 2.42A2.5 2.5 0 0 1 17.458 22H16l2.965-7.59a.63.63 0 0 1 .577-.41h2.916a.63.63 0 0 1 .577.41L26 22Z'/></svg>eement.<svg viewBox='0 0 24 24'><path fill='#f44336' d='M15.787 13.71c-.275 0-.587 0-.918.047 1.098.796 1.865 1.847 1.865 3.267v2.367h5.68v-2.367c0-2.206-4.42-3.314-6.627-3.314m-7.575 0c-2.206 0-6.628 1.108-6.628 3.314v2.367H14.84v-2.367c0-2.206-4.421-3.314-6.628-3.314m0-1.894a2.84 2.84 0 0 0 2.841-2.84 2.84 2.84 0 0 0-2.84-2.84 2.84 2.84 0 0 0-2.841 2.84 2.84 2.84 0 0 0 2.84 2.84m7.575 0a2.84 2.84 0 0 0 2.84-2.84 2.84 2.84 0 0 0-2.84-2.84 2.84 2.84 0 0 0-2.84 2.84 2.84 2.84 0 0 0 2.84 2.84'/></svg><svg viewBox='0 0 32 32'><path fill='#26a69a' d='M12 18h4v2h-4z'/><path fill='#26a69a' d='M4 4v24h24V4Zm14 15.5a.5.5 0 0 1-.5.5H16v2h1.5a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5H16v1.5a.5.5 0 0 1-.5.5h-5a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 .5.5V18h1.5a.5.5 0 0 1 .5.5Zm8-2a.5.5 0 0 1-.5.5H22v2h2a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2h-3.5a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5H24v-2h-2a2 2 0 0 1-2-2v-2a2 2 0 0 1 2-2h3.5a.5.5 0 0 1 .5.5Z'/><path fill='#26a69a' d='M12 22h4v2h-4z'/></svg><svg viewBox='0 0 32 32'><path fill='#0288d1' d='M12 0h8v4h-8z'/><path fill='#0288d1' d='M16 5A11 11 0 1 1 5 16 11.01 11.01 0 0 1 16 5m0-3a14 14 0 1 0 14 14A14 14 0 0 0 16 2'/><path fill='#0288d1' d='M32 12v8h-4v-8zm-1.858 12.485-5.657 5.657-2.313-2.313 5.657-5.657zM7.514 30.143l-5.657-5.657 2.814-2.814 5.657 5.657zM12 28h8v4h-8zm15.329-17.672L21.672 4.67l2.814-2.814 5.657 5.657zM3 12v8H0v-8zm7.328-7.329L4.67 10.328 1.857 7.514l5.657-5.657zM20 10h-4a6 6 0 0 0 0 12h4v-4h-4a2 2 0 0 1 0-4h4z'/></svg><svg viewBox='0 0 32 32'><path fill='#0d3858' stroke='#4dd0e1' stroke-width='2' d='M3.009 3.009h25.983v25.983H3.009z'/><path fill='#4dd0e1' d='M24 9.5v-1a.5.5 0 0 0-.5-.5H22a2 2 0 0 0-2 2v2h-1.5a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5H20v7.5a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5V14h1.5a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5H22v-2h1.5a.5.5 0 0 0 .5-.5M12 20a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2h3.5a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5H12a4 4 0 0 0-4 4v4a4 4 0 0 0 4 4h3.5a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5Z'/></svg>e<svg viewBox='0 0 32 32'><path fill='#64b5f6' d='M29.422 17.4 17.4 29.422a1.986 1.986 0 0 1-2.8 0L2.578 17.4a1.986 1.986 0 0 1 0-2.8L14.6 2.578a1.986 1.986 0 0 1 2.8 0l8.01 8.012L23 13a2 2 0 0 0-.74-.14A2.13 2.13 0 0 0 20.37 14H12a2.08 2.08 0 0 0-1.86-1.14 2.14 2.14 0 0 0 0 4.28A2.08 2.08 0 0 0 12 16h8l-3.82 3.83h-.01a1.9 1.9 0 0 0-.63-.1 2.135 2.135 0 1 0 2.14 2.13 1.8 1.8 0 0 0-.1-.61l4.17-4.17a2 2 0 0 0 .51.06A2.14 2.14 0 0 0 24.4 15a2 2 0 0 0-.06-.51l2.49-2.48 2.592 2.59a1.986 1.986 0 0 1 0 2.8'/></svg><svg viewBox="0 0 16 16" class="svg octicon-dice" aria-hidden="true" width="16" height="16"><path d="M13.25 1c.966 0 1.75.784 1.75 1.75v10.5c0 .464-.184.909-.513 1.237A1.75 1.75 0 0 1 13.25 15H2.75c-.464 0-.909-.184-1.237-.513A1.75 1.75 0 0 1 1 13.25V2.75C1 1.784 1.784 1 2.75 1zM2.75 2.5a.25.25 0 0 0-.25.25v10.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25V2.75a.25.25 0 0 0-.25-.25z"/><path d="M5 12a1 1 0 1 0 0-2 1 1 0 0 0 0 2m6-6a1 1 0 1 0 0-2 1 1 0 0 0 0 2M8 9a1 1 0 1 0 0-2 1 1 0 0 0 0 2"/></svg>ව %[<svg fill='none' viewBox='0 0 16 16'><path fill='#8bc34a' d='m10.484 3.635-2.5 2.546-.875-.891 1-1.018H8q-1.563 0-2.656 1.121Q4.249 6.515 4.25 8.122a3.5 3.5 0 0 0 .375 1.59l-.937.955a5.156 5.25 0 0 1-.516-1.24A4.81 4.897 0 0 1 3 8.121Q3 5.99 4.453 4.494T8 2.999h.11l-1-1.018.874-.891zm-4.968 8.747 2.5-2.546.875.891-1 1.018H8q1.563 0 2.656-1.12 1.095-1.123 1.094-2.73a3.5 3.5 0 0 0-.375-1.59l.938-.955q.343.604.515 1.24.172.638.172 1.305 0 2.131-1.453 3.628Q10.094 13.018 8 13.018h-.11l1 1.018-.874.891z'/></svg><svg viewBox="0 0 16 16" class="svg octicon-diff-added" aria-hidden="true" width="16" height="16"><path d="M2.75 1h10.5c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0 1 13.25 15H2.75A1.75 1.75 0 0 1 1 13.25V2.75C1 1.784 1.784 1 2.75 1m10.5 1.5H2.75a.25.25 0 0 0-.25.25v10.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25V2.75a.25.25 0 0 0-.25-.25M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/></svg>ues.author": "කතෘ",
<svg viewBox='0 0 323 323'><path fill='#ffb300' d='m106.716 99.763 54.785 54.782 54.779-54.782z'/><path fill='#64dd17' d='M96.881 89.93H216.83l-55.18-55.184H41.7zm131.546 11.593 59.705 59.704L228.16 221.2l-59.705-59.704z'/><path fill='#00b8d4' d='m175.552 34.746 112.703 112.695V34.746z'/><path fill='#455a64' d='m34.746 281.3 119.8-119.8-119.8-119.8z'/><path fill='#ffb300' d='m288.255 175.01-53.148 53.149 53.148 53.14z'/><path fill='#00b8d4' d='M281.3 288.254 161.5 168.455l-119.8 119.8z'/></svg><svg viewBox='0 0 30 30'><path fill='#f44336' d='M5.207 4.33q-.072.075-.143.153Q1.5 8.476 1.5 15.33c0 4.418 1.155 7.862 3.459 10.34h19.415c2.553-1.152 4.127-3.43 4.127-3.43l-3.147-2.52L23.9 21.1c-.867.773-.845.931-2.315 1.78-1.495.674-3.04.966-4.634.966-2.515 0-4.423-.909-5.723-2.059-1.286-1.15-1.985-4.511-2.096-6.68l17.458.067-.183-1.472s-.847-7.129-2.541-9.372zm8.76.846c1.565 0 3.22.535 3.961 1.471.74.937.931 1.667.973 3.524H9.11c.112-1.955.436-2.81 1.373-3.698.936-.887 2.03-1.297 3.484-1.297'/></svg>රනය වන්න.",
"repo.issues.edit": "සංස්කරණය",
"repo.issues.cancel": "අවලංගු කරන්න",
"repo.issues.save": "සුරකින්න",
"repo.issues.label_title": "ලේබලයේ නම",
"repo.issues.label_description": "ලේබල් විස්තරය",
"repo.issues.label_color": "වර්ණ ලේබල්",
5 <span class="n">NumberInput</span><span class="o">*</span> <span class="n">number_input</span><span class="p">;</span>
0x70, 0x70, 0x70, 0x70, 0x70,
0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70,
0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70,
0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70,
0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70,
0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70,
0x70};
//random data ?
const unsigned char sampleTable[0x500] = {
//00
0x38,
0x84,
0x6B,
0x19,
0xC6,
0x63,
0x18,
0x86,
0x73,
0x98,
0xC6,
0xB1,
0x1C,
0xCA,
0x31,
0x8C,
0xC7,
0x31,
0x88,
0xC2,
0x30,
0x98,
0x46,
0x31,
0x18,
0xC6,
0x35,
0xC,
0xCA,
0x31,
0xC,
0xC6
//20
,
0x21,
0x10,
0x24,
0x69,
0x12,
0xC2,
0x31,
0x14,
0xC4,
0x71,
8,
0x4A,
0x22,
0x49,
0xAB,
0x6A,
0xA8,
0xAC,
0x49,
0x51,
0x32,
0xD5,
0x52,
0x88,
0x93,
0x6C,
0x94,
0x22,
0x15,
0x54,
0xD2,
0x25
//40
,
0x96,
0xD4,
0x50,
0xA5,
0x46,
0x21,
8,
0x85,
0x6B,
0x18,
0xC4,
0x63,
0x10,
0xCE,
0x6B,
0x18,
0x8C,
0x71,
0x19,
0x8C,
0x63,
0x35,
0xC,
0xC6,
0x33,
0x99,
0xCC,
0x6C,
0xB5,
0x4E,
0xA2,
0x99
//60
,
0x46,
0x21,
0x28,
0x82,
0x95,
0x2E,
0xE3,
0x30,
0x9C,
0xC5,
0x30,
0x9C,
0xA2,
0xB1,
0x9C,
0x67,
0x31,
0x88,
0x66,
0x59,
0x2C,
0x53,
0x18,
0x84,
0x67,
0x50,
0xCA,
0xE3,
0xA,
0xAC,
0xAB,
0x30
//80
,
0xAC,
0x62,
0x30,
0x8C,
0x63,
0x10,
0x94,
0x62,
0xB1,
0x8C,
0x82,
0x28,
0x96,
0x33,
0x98,
0xD6,
0xB5,
0x4C,
0x62,
0x29,
0xA5,
0x4A,
0xB5,
0x9C,
0xC6,
0x31,
0x14,
0xD6,
0x38,
0x9C,
0x4B,
0xB4
//A0
,
0x86,
0x65,
0x18,
0xAE,
0x67,
0x1C,
0xA6,
0x63,
0x19,
0x96,
0x23,
0x19,
0x84,
0x13,
8,
0xA6,
0x52,
0xAC,
0xCA,
0x22,
0x89,
0x6E,
0xAB,
0x19,
0x8C,
0x62,
0x34,
0xC4,
0x62,
0x19,
0x86,
0x63
//C0
,
0x18,
0xC4,
0x23,
0x58,
0xD6,
0xA3,
0x50,
0x42,
0x54,
0x4A,
0xAD,
0x4A,
0x25,
0x11,
0x6B,
0x64,
0x89,
0x4A,
0x63,
0x39,
0x8A,
0x23,
0x31,
0x2A,
0xEA,
0xA2,
0xA9,
0x44,
0xC5,
0x12,
0xCD,
0x42
//E0
,
0x34,
0x8C,
0x62,
0x18,
0x8C,
0x63,
0x11,
0x48,
0x66,
0x31,
0x9D,
0x44,
0x33,
0x1D,
0x46,
0x31,
0x9C,
0xC6,
0xB1,
0xC,
0xCD,
0x32,
0x88,
0xC4,
0x73,
0x18,
0x86,
0x73,
8,
0xD6,
0x63,
0x58
//100
,
7,
0x81,
0xE0,
0xF0,
0x3C,
7,
0x87,
0x90,
0x3C,
0x7C,
0xF,
0xC7,
0xC0,
0xC0,
0xF0,
0x7C,
0x1E,
7,
0x80,
0x80,
0,
0x1C,
0x78,
0x70,
0xF1,
0xC7,
0x1F,
0xC0,
0xC,
0xFE,
0x1C,
0x1F
//120
,
0x1F,
0xE,
0xA,
0x7A,
0xC0,
0x71,
0xF2,
0x83,
0x8F,
3,
0xF,
0xF,
0xC,
0,
0x79,
0xF8,
0x61,
0xE0,
0x43,
0xF,
0x83,
0xE7,
0x18,
0xF9,
0xC1,
0x13,
0xDA,
0xE9,
0x63,
0x8F,
0xF,
0x83
//140
,
0x83,
0x87,
0xC3,
0x1F,
0x3C,
0x70,
0xF0,
0xE1,
0xE1,
0xE3,
0x87,
0xB8,
0x71,
0xE,
0x20,
0xE3,
0x8D,
0x48,
0x78,
0x1C,
0x93,
0x87,
0x30,
0xE1,
0xC1,
0xC1,
0xE4,
0x78,
0x21,
0x83,
0x83,
0xC3
//160
,
0x87,
6,
0x39,
0xE5,
0xC3,
0x87,
7,
0xE,
0x1C,
0x1C,
0x70,
0xF4,
0x71,
0x9C,
0x60,
0x36,
0x32,
0xC3,
0x1E,
0x3C,
0xF3,
0x8F,
0xE,
0x3C,
0x70,
0xE3,
0xC7,
0x8F,
0xF,
0xF,
0xE,
0x3C
//180
,
0x78,
0xF0,
0xE3,
0x87,
6,
0xF0,
0xE3,
7,
0xC1,
0x99,
0x87,
0xF,
0x18,
0x78,
0x70,
0x70,
0xFC,
0xF3,
0x10,
0xB1,
0x8C,
0x8C,
0x31,
0x7C,
0x70,
0xE1,
0x86,
0x3C,
0x64,
0x6C,
0xB0,
0xE1
//1A0
,
0xE3,
0xF,
0x23,
0x8F,
0xF,
0x1E,
0x3E,
0x38,
0x3C,
0x38,
0x7B,
0x8F,
7,
0xE,
0x3C,
0xF4,
0x17,
0x1E,
0x3C,
0x78,
0xF2,
0x9E,
0x72,
0x49,
0xE3,
0x25,
0x36,
0x38,
0x58,
0x39,
0xE2,
0xDE
//1C0
,
0x3C,
0x78,
0x78,
0xE1,
0xC7,
0x61,
0xE1,
0xE1,
0xB0,
0xF0,
0xF0,
0xC3,
0xC7,
0xE,
0x38,
0xC0,
0xF0,
0xCE,
0x73,
0x73,
0x18,
0x34,
0xB0,
0xE1,
0xC7,
0x8E,
0x1C,
0x3C,
0xF8,
0x38,
0xF0,
0xE1
//1E0
,
0xC1,
0x8B,
0x86,
0x8F,
0x1C,
0x78,
0x70,
0xF0,
0x78,
0xAC,
0xB1,
0x8F,
0x39,
0x31,
0xDB,
0x38,
0x61,
0xC3,
0xE,
0xE,
0x38,
0x78,
0x73,
0x17,
0x1E,
0x39,
0x1E,
0x38,
0x64,
0xE1,
0xF1,
0xC1
//200
,
0x4E,
0xF,
0x40,
0xA2,
2,
0xC5,
0x8F,
0x81,
0xA1,
0xFC,
0x12,
8,
0x64,
0xE0,
0x3C,
0x22,
0xE0,
0x45,
7,
0x8E,
0xC,
0x32,
0x90,
0xF0,
0x1F,
0x20,
0x49,
0xE0,
0xF8,
0xC,
0x60,
0xF0
//220
,
0x17,
0x1A,
0x41,
0xAA,
0xA4,
0xD0,
0x8D,
0x12,
0x82,
0x1E,
0x1E,
3,
0xF8,
0x3E,
3,
0xC,
0x73,
0x80,
0x70,
0x44,
0x26,
3,
0x24,
0xE1,
0x3E,
4,
0x4E,
4,
0x1C,
0xC1,
9,
0xCC
//240
,
0x9E,
0x90,
0x21,
7,
0x90,
0x43,
0x64,
0xC0,
0xF,
0xC6,
0x90,
0x9C,
0xC1,
0x5B,
3,
0xE2,
0x1D,
0x81,
0xE0,
0x5E,
0x1D,
3,
0x84,
0xB8,
0x2C,
0xF,
0x80,
0xB1,
0x83,
0xE0,
0x30,
0x41
//260
,
0x1E,
0x43,
0x89,
0x83,
0x50,
0xFC,
0x24,
0x2E,
0x13,
0x83,
0xF1,
0x7C,
0x4C,
0x2C,
0xC9,
0xD,
0x83,
0xB0,
0xB5,
0x82,
0xE4,
0xE8,
6,
0x9C,
7,
0xA0,
0x99,
0x1D,
7,
0x3E,
0x82,
0x8F
//280
,
0x70,
0x30,
0x74,
0x40,
0xCA,
0x10,
0xE4,
0xE8,
0xF,
0x92,
0x14,
0x3F,
6,
0xF8,
0x84,
0x88,
0x43,
0x81,
0xA,
0x34,
0x39,
0x41,
0xC6,
0xE3,
0x1C,
0x47,
3,
0xB0,
0xB8,
0x13,
0xA,
0xC2
//2A0
,
0x64,
0xF8,
0x18,
0xF9,
0x60,
0xB3,
0xC0,
0x65,
0x20,
0x60,
0xA6,
0x8C,
0xC3,
0x81,
0x20,
0x30,
0x26,
0x1E,
0x1C,
0x38,
0xD3,
1,
0xB0,
0x26,
0x40,
0xF4,
0xB,
0xC3,
0x42,
0x1F,
0x85,
0x32
//2C0
,
0x26,
0x60,
0x40,
0xC9,
0xCB,
1,
0xEC,
0x11,
0x28,
0x40,
0xFA,
4,
0x34,
0xE0,
0x70,
0x4C,
0x8C,
0x1D,
7,
0x69,
3,
0x16,
0xC8,
4,
0x23,
0xE8,
0xC6,
0x9A,
0xB,
0x1A,
3,
0xE0
//2E0
,
0x76,
6,
5,
0xCF,
0x1E,
0xBC,
0x58,
0x31,
0x71,
0x66,
0,
0xF8,
0x3F,
4,
0xFC,
0xC,
0x74,
0x27,
0x8A,
0x80,
0x71,
0xC2,
0x3A,
0x26,
6,
0xC0,
0x1F,
5,
0xF,
0x98,
0x40,
0xAE
//300
,
1,
0x7F,
0xC0,
7,
0xFF,
0,
0xE,
0xFE,
0,
3,
0xDF,
0x80,
3,
0xEF,
0x80,
0x1B,
0xF1,
0xC2,
0,
0xE7,
0xE0,
0x18,
0xFC,
0xE0,
0x21,
0xFC,
0x80,
0x3C,
0xFC,
0x40,
0xE,
0x7E
//320
,
0,
0x3F,
0x3E,
0,
0xF,
0xFE,
0,
0x1F,
0xFF,
0,
0x3E,
0xF0,
7,
0xFC,
0,
0x7E,
0x10,
0x3F,
0xFF,
0,
0x3F,
0x38,
0xE,
0x7C,
1,
0x87,
0xC,
0xFC,
0xC7,
0,
0x3E,
4
//340
,
0xF,
0x3E,
0x1F,
0xF,
0xF,
0x1F,
0xF,
2,
0x83,
0x87,
0xCF,
3,
0x87,
0xF,
0x3F,
0xC0,
7,
0x9E,
0x60,
0x3F,
0xC0,
3,
0xFE,
0,
0x3F,
0xE0,
0x77,
0xE1,
0xC0,
0xFE,
0xE0,
0xC3
//360
,
0xE0,
1,
0xDF,
0xF8,
3,
7,
0,
0x7E,
0x70,
0,
0x7C,
0x38,
0x18,
0xFE,
0xC,
0x1E,
0x78,
0x1C,
0x7C,
0x3E,
0xE,
0x1F,
0x1E,
0x1E,
0x3E,
0,
0x7F,
0x83,
7,
0xDB,
0x87,
0x83
//380
,
7,
0xC7,
7,
0x10,
0x71,
0xFF,
0,
0x3F,
0xE2,
1,
0xE0,
0xC1,
0xC3,
0xE1,
0,
0x7F,
0xC0,
5,
0xF0,
0x20,
0xF8,
0xF0,
0x70,
0xFE,
0x78,
0x79,
0xF8,
2,
0x3F,
0xC,
0x8F,
3
//3a0
,
0xF,
0x9F,
0xE0,
0xC1,
0xC7,
0x87,
3,
0xC3,
0xC3,
0xB0,
0xE1,
0xE1,
0xC1,
0xE3,
0xE0,
0x71,
0xF0,
0,
0xFC,
0x70,
0x7C,
0xC,
0x3E,
0x38,
0xE,
0x1C,
0x70,
0xC3,
0xC7,
3,
0x81,
0xC1
//3c0
,
0xC7,
0xE7,
0,
0xF,
0xC7,
0x87,
0x19,
9,
0xEF,
0xC4,
0x33,
0xE0,
0xC1,
0xFC,
0xF8,
0x70,
0xF0,
0x78,
0xF8,
0xF0,
0x61,
0xC7,
0,
0x1F,
0xF8,
1,
0x7C,
0xF8,
0xF0,
0x78,
0x70,
0x3C
//3e0
,
0x7C,
0xCE,
0xE,
0x21,
0x83,
0xCF,
8,
7,
0x8F,
8,
0xC1,
0x87,
0x8F,
0x80,
0xC7,
0xE3,
0,
7,
0xF8,
0xE0,
0xEF,
0,
0x39,
0xF7,
0x80,
0xE,
0xF8,
0xE1,
0xE3,
0xF8,
0x21,
0x9F
//400
,
0xC0,
0xFF,
3,
0xF8,
7,
0xC0,
0x1F,
0xF8,
0xC4,
4,
0xFC,
0xC4,
0xC1,
0xBC,
0x87,
0xF0,
0xF,
0xC0,
0x7F,
5,
0xE0,
0x25,
0xEC,
0xC0,
0x3E,
0x84,
0x47,
0xF0,
0x8E,
3,
0xF8,
3
//420
,
0xFB,
0xC0,
0x19,
0xF8,
7,
0x9C,
0xC,
0x17,
0xF8,
7,
0xE0,
0x1F,
0xA1,
0xFC,
0xF,
0xFC,
1,
0xF0,
0x3F,
0,
0xFE,
3,
0xF0,
0x1F,
0,
0xFD,
0,
0xFF,
0x88,
0xD,
0xF9,
1
//440
,
0xFF,
0,
0x70,
7,
0xC0,
0x3E,
0x42,
0xF3,
0xD,
0xC4,
0x7F,
0x80,
0xFC,
7,
0xF0,
0x5E,
0xC0,
0x3F,
0,
0x78,
0x3F,
0x81,
0xFF,
1,
0xF8,
1,
0xC3,
0xE8,
0xC,
0xE4,
0x64,
0x8F
////460
,
0xE4,
0xF,
0xF0,
7,
0xF0,
0xC2,
0x1F,
0,
0x7F,
0xC0,
0x6F,
0x80,
0x7E,
3,
0xF8,
7,
0xF0,
0x3F,
0xC0,
0x78,
0xF,
0x82,
7,
0xFE,
0x22,
0x77,
0x70,
2,
0x76,
3,
0xFE,
0
//480
,
0xFE,
0x67,
0,
0x7C,
0xC7,
0xF1,
0x8E,
0xC6,
0x3B,
0xE0,
0x3F,
0x84,
0xF3,
0x19,
0xD8,
3,
0x99,
0xFC,
9,
0xB8,
0xF,
0xF8,
0,
0x9D,
0x24,
0x61,
0xF9,
0xD,
0,
0xFD,
3,
0xF0
//4a0
,
0x1F,
0x90,
0x3F,
1,
0xF8,
0x1F,
0xD0,
0xF,
0xF8,
0x37,
1,
0xF8,
7,
0xF0,
0xF,
0xC0,
0x3F,
0,
0xFE,
3,
0xF8,
0xF,
0xC0,
0x3F,
0,
0xFA,
3,
0xF0,
0xF,
0x80,
0xFF,
1
//4c0
,
0xB8,
7,
0xF0,
1,
0xFC,
1,
0xBC,
0x80,
0x13,
0x1E,
0,
0x7F,
0xE1,
0x40,
0x7F,
0xA0,
0x7F,
0xB0,
0,
0x3F,
0xC0,
0x1F,
0xC0,
0x38,
0xF,
0xF0,
0x1F,
0x80,
0xFF,
1,
0xFC,
3
//4e0
,
0xF1,
0x7E,
1,
0xFE,
1,
0xF0,
0xFF,
0,
0x7F,
0xC0,
0x1D,
7,
0xF0,
0xF,
0xC0,
0x7E,
6,
0xE0,
7,
0xE0,
0xF,
0xF8,
6,
0xC1,
0xFE,
1,
0xFC,
3,
0xE0,
0xF,
0,
0xFC};
////////////////////////////////////////////////////////////////////////////////////////////
//
// Render
//
////////////////////////////////////////////////////////////////////////////////////////////
unsigned char pitches[256]; // tab43008
unsigned char frequency1[256];
unsigned char frequency2[256];
unsigned char frequency3[256];
unsigned char amplitude1[256];
unsigned char amplitude2[256];
unsigned char amplitude3[256];
unsigned char sampledConsonantFlag[256]; // tab44800
////////////////////////////////////////////////////////////////////////////////////////////
//
// Sam
//
////////////////////////////////////////////////////////////////////////////////////////////
unsigned char stress[256]; //numbers from 0 to 8
unsigned char phonemeLength[256]; //tab40160
unsigned char phonemeindex[256];
////////////////////////////////////////////////////////////////////////////////////////////
//
// ReciterTabs
//
////////////////////////////////////////////////////////////////////////////////////////////
//some flags
const unsigned char tab36376[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 0-7
0, 0, 0, 0, 0, 0, 0, 0, // 8-15
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 2, 2, 2, 2, 2, 2, 130, // ' ', '!'
0, 0, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 2, 2, 2, 2, 2, 2, 2, 192, 168, 176, 172, 192, 160, 184, // '@', 'A'
160, 192, 188, 160, 172, 168, 172, 192, 160, 160, 172, 180, 164, 192, 168, 168,
176, 192, 188, 0, 0, 0, 2, 0, // 'X', 'Y', 'Z', '[',
32, 32, 155, 32, 192, 185, 32, 205, 163, 76, 138, 142};
const unsigned char rules[] = {
']', 'A' | 0x80, ' ', '(', 'A', '.', ')', '=',
'E', 'H', '4', 'Y', '.', ' ' | 0x80, '(', 'A',
')', ' ', '=', 'A', 'H' | 0x80, ' ', '(', 'A',
'R', 'E', ')', ' ', '=', 'A', 'A', 'R' | 0x80,
' ', '(', 'A', 'R', ')', 'O', '=', 'A',
'X', 'R' | 0x80, '(', 'A', 'R', ')', '#', '=',
'E', 'H', '4', 'R' | 0x80, ' ', '^', '(', 'A',
'S', ')', '#', '=', 'E', 'Y', '4', 'S' | 0x80,
'(', 'A', ')', 'W', 'A', '=', 'A', 'X' | 0x80,
'(', 'A', 'W', ')', '=', 'A', 'O', '5' | 0x80,
' ', ':', '(', 'A', 'N', 'Y', ')', '=',
'E', 'H', '4', 'N', 'I', 'Y' | 0x80, '(', 'A',
')', '^', '+', '#', '=', 'E', 'Y', '5' | 0x80,
'#', ':', '(', 'A', 'L', 'L', 'Y', ')',
'=', 'U', 'L', 'I', 'Y' | 0x80, ' ', '(', 'A',
'L', ')', '#', '=', 'U', 'L' | 0x80, '(', 'A',
'G', 'A', 'I', 'N', ')', '=', 'A', 'X',
'G', 'E', 'H', '4', 'N' | 0x80, '#', ':', '(',
'A', 'G', ')', 'E', '=', 'I', 'H', 'J' | 0x80,
'(', 'A', ')', '^', '%', '=', 'E', 'Y' | 0x80,
'(', 'A', ')', '^', '+', ':', '#', '=',
'A', 'E' | 0x80, ' ', ':', '(', 'A', ')', '^',
'+', ' ', '=', 'E', 'Y', '4' | 0x80, ' ', '(',
'A', 'R', 'R', ')', '=', 'A', 'X', 'R' | 0x80,
'(', 'A', 'R', 'R', ')', '=', 'A', 'E',
'4', 'R' | 0x80, ' ', '^', '(', 'A', 'R', ')',
' ', '=', 'A', 'A', '5', 'R' | 0x80, '(', 'A',
'R', ')', '=', 'A', 'A', '5', 'R' | 0x80, '(',
'A', 'I', 'R', ')', '=', 'E', 'H', '4',
'R' | 0x80, '(', 'A', 'I', ')', '=', 'E', 'Y',
'4' | 0x80, '(', 'A', 'Y', ')', '=', 'E', 'Y',
'5' | 0x80, '(', 'A', 'U', ')', '=', 'A', 'O',
'4' | 0x80, '#', ':', '(', 'A', 'L', ')', ' ',
'=', 'U', 'L' | 0x80, '#', ':', '(', 'A', 'L',
'S', ')', ' ', '=', 'U', 'L', 'Z' | 0x80, '(',
'A', 'L', 'K', ')', '=', 'A', 'O', '4',
'K' | 0x80, '(', 'A', 'L', ')', '^', '=', 'A',
'O', 'L' | 0x80, ' ', ':', '(', 'A', 'B', 'L',
'E', ')', '=', 'E', 'Y', '4', 'B', 'U',
'L' | 0x80, '(', 'A', 'B', 'L', 'E', ')', '=',
'A', 'X', 'B', 'U', 'L' | 0x80, '(', 'A', ')',
'V', 'O', '=', 'E', 'Y', '4' | 0x80, '(', 'A',
'N', 'G', ')', '+', '=', 'E', 'Y', '4',
'N', 'J' | 0x80, '(', 'A', 'T', 'A', 'R', 'I',
')', '=', 'A', 'H', 'T', 'A', 'A', '4',
'R', 'I', 'Y' | 0x80, '(', 'A', ')', 'T', 'O',
'M', '=', 'A', 'E' | 0x80, '(', 'A', ')', 'T',
'T', 'I', '=', 'A', 'E' | 0x80, ' ', '(', 'A',
'T', ')', ' ', '=', 'A', 'E', 'T' | 0x80, ' ',
'(', 'A', ')', 'T', '=', 'A', 'H' | 0x80, '(',
'A', ')', '=', 'A', 'E' | 0x80,
']', 'B' | 0x80, ' ', '(', 'B', ')', ' ', '=',
'B', 'I', 'Y', '4' | 0x80, ' ', '(', 'B', 'E',
')', '^', '#', '=', 'B', 'I', 'H' | 0x80, '(',
'B', 'E', 'I', 'N', 'G', ')', '=', 'B',
'I', 'Y', '4', 'I', 'H', 'N', 'X' | 0x80, ' ',
'(', 'B', 'O', 'T', 'H', ')', ' ', '=',
'B', 'O', 'W', '4', 'T', 'H' | 0x80, ' ', '(',
'B', 'U', 'S', ')', '#', '=', 'B', 'I',
'H', '4', 'Z' | 0x80, '(', 'B', 'R', 'E', 'A',
'K', ')', '=', 'B', 'R', 'E', 'Y', '5',
'K' | 0x80, '(', 'B', 'U', 'I', 'L', ')', '=',
'B', 'I', 'H', '4', 'L' | 0x80, '(', 'B', ')',
'=', 'B' | 0x80,
']', 'C' | 0x80, ' ', '(', 'C', ')', ' ', '=',
'S', 'I', 'Y', '4' | 0x80, ' ', '(', 'C', 'H',
')', '^', '=', 'K' | 0x80, '^', 'E', '(', 'C',
'H', ')', '=', 'K' | 0x80, '(', 'C', 'H', 'A',
')', 'R', '#', '=', 'K', 'E', 'H', '5' | 0x80,
'(', 'C', 'H', ')', '=', 'C', 'H' | 0x80, ' ',
'S', '(', 'C', 'I', ')', '#', '=', 'S',
'A', 'Y', '4' | 0x80, '(', 'C', 'I', ')', 'A',
'=', 'S', 'H' | 0x80, '(', 'C', 'I', ')', 'O',
'=', 'S', 'H' | 0x80, '(', 'C', 'I', ')', 'E',
'N', '=', 'S', 'H' | 0x80, '(', 'C', 'I', 'T',
'Y', ')', '=', 'S', 'I', 'H', 'T', 'I',
'Y' | 0x80, '(', 'C', ')', '+', '=', 'S' | 0x80, '(',
'C', 'K', ')', '=', 'K' | 0x80, '(', 'C', 'O',
'M', 'M', 'O', 'D', 'O', 'R', 'E', ')',
'=', 'K', 'A', 'A', '4', 'M', 'A', 'H',
'D', 'O', 'H', 'R' | 0x80, '(', 'C', 'O', 'M',
')', '=', 'K', 'A', 'H', 'M' | 0x80, '(', 'C',
'U', 'I', 'T', ')', '=', 'K', 'I', 'H',
'T' | 0x80, '(', 'C', 'R', 'E', 'A', ')', '=',
'K', 'R', 'I', 'Y', 'E', 'Y' | 0x80, '(', 'C',
')', '=', 'K' | 0x80,
']', 'D' | 0x80, ' ', '(', 'D', ')', ' ', '=',
'D', 'I', 'Y', '4' | 0x80, ' ', '(', 'D', 'R',
'.', ')', ' ', '=', 'D', 'A', 'A', '4',
'K', 'T', 'E', 'R' | 0x80, '#', ':', '(', 'D',
'E', 'D', ')', ' ', '=', 'D', 'I', 'H',
'D' | 0x80, '.', 'E', '(', 'D', ')', ' ', '=',
'D' | 0x80, '#', ':', '^', 'E', '(', 'D', ')',
' ', '=', 'T' | 0x80, ' ', '(', 'D', 'E', ')',
'^', '#', '=', 'D', 'I', 'H' | 0x80, ' ', '(',
'D', 'O', ')', ' ', '=', 'D', 'U', 'W' | 0x80,
' ', '(', 'D', 'O', 'E', 'S', ')', '=',
'D', 'A', 'H', 'Z' | 0x80, '(', 'D', 'O', 'N',
'E', ')', ' ', '=', 'D', 'A', 'H', '5',
'N' | 0x80, '(', 'D', 'O', 'I', 'N', 'G', ')',
'=', 'D', 'U', 'W', '4', 'I', 'H', 'N',
'X' | 0x80, ' ', '(', 'D', 'O', 'W', ')', '=',
'D', 'A', 'W' | 0x80, '#', '(', 'D', 'U', ')',
'A', '=', 'J', 'U', 'W' | 0x80, '#', '(', 'D',
'U', ')', '^', '#', '=', 'J', 'A', 'X' | 0x80,
'(', 'D', ')', '=', 'D' | 0x80,
']', 'E' | 0x80, ' ', '(', 'E', ')', ' ', '=',
'I', 'Y', 'I', 'Y', '4' | 0x80, '#', ':', '(',
'E', ')', ' ', '=' | 0x80, '\'', ':', '^', '(',
'E', ')', ' ', '=' | 0x80, ' ', ':', '(', 'E',
')', ' ', '=', 'I', 'Y' | 0x80, '#', '(', 'E',
'D', ')', ' ', '=', 'D' | 0x80, '#', ':', '(',
'E', ')', 'D', ' ', '=' | 0x80, '(', 'E', 'V',
')', 'E', 'R', '=', 'E', 'H', '4', 'V' | 0x80,
'(', 'E', ')', '^', '%', '=', 'I', 'Y',
'4' | 0x80, '(', 'E', 'R', 'I', ')', '#', '=',
'I', 'Y', '4', 'R', 'I', 'Y' | 0x80, '(', 'E',
'R', 'I', ')', '=', 'E', 'H', '4', 'R',
'I', 'H' | 0x80, '#', ':', '(', 'E', 'R', ')',
'#', '=', 'E', 'R' | 0x80, '(', 'E', 'R', 'R',
'O', 'R', ')', '=', 'E', 'H', '4', 'R',
'O', 'H', 'R' | 0x80, '(', 'E', 'R', 'A', 'S',
'E', ')', '=', 'I', 'H', 'R', 'E', 'Y',
'5', 'S' | 0x80, '(', 'E', 'R', ')', '#', '=',
'E', 'H', 'R' | 0x80, '(', 'E', 'R', ')', '=',
'E', 'R' | 0x80, ' ', '(', 'E', 'V', 'E', 'N',
')', '=', 'I', 'Y', 'V', 'E', 'H', 'N' | 0x80,
'#', ':', '(', 'E', ')', 'W', '=' | 0x80, '@',
'(', 'E', 'W', ')', '=', 'U', 'W' | 0x80, '(',
'E', 'W', ')', '=', 'Y', 'U', 'W' | 0x80, '(',
'E', ')', 'O', '=', 'I', 'Y' | 0x80, '#', ':',
'&', '(', 'E', 'S', ')', ' ', '=', 'I',
'H', 'Z' | 0x80, '#', ':', '(', 'E', ')', 'S',
' ', '=' | 0x80, '#', ':', '(', 'E', 'L', 'Y',
')', ' ', '=', 'L', 'I', 'Y' | 0x80, '#', ':',
'(', 'E', 'M', 'E', 'N', 'T', ')', '=',
'M', 'E', 'H', 'N', 'T' | 0x80, '(', 'E', 'F',
'U', 'L', ')', '=', 'F', 'U', 'H', 'L' | 0x80,
'(', 'E', 'E', ')', '=', 'I', 'Y', '4' | 0x80,
'(', 'E', 'A', 'R', 'N', ')', '=', 'E',
'R', '5', 'N' | 0x80, ' ', '(', 'E', 'A', 'R',
')', '^', '=', 'E', 'R', '5' | 0x80, '(', 'E',
'A', 'D', ')', '=', 'E', 'H', 'D' | 0x80, '#',
':', '(', 'E', 'A', ')', ' ', '=', 'I',
'Y', 'A', 'X' | 0x80, '(', 'E', 'A', ')', 'S',
'U', '=', 'E', 'H', '5' | 0x80, '(', 'E', 'A',
')', '=', 'I', 'Y', '5' | 0x80, '(', 'E', 'I',
'G', 'H', ')', '=', 'E', 'Y', '4' | 0x80, '(',
'E', 'I', ')', '=', 'I', 'Y', '4' | 0x80, ' ',
'(', 'E', 'Y', 'E', ')', '=', 'A', 'Y',
'4' | 0x80, '(', 'E', 'Y', ')', '=', 'I', 'Y' | 0x80,
'(', 'E', 'U', ')', '=', 'Y', 'U', 'W',
'5' | 0x80, '(', 'E', 'Q', 'U', 'A', 'L', ')',
'=', 'I', 'Y', '4', 'K', 'W', 'U', 'L' | 0x80,
'(', 'E', ')', '=', 'E', 'H' | 0x80,
']', 'F' | 0x80, ' ', '(', 'F', ')', ' ', '=',
'E', 'H', '4', 'F' | 0x80, '(', 'F', 'U', 'L',
')', '=', 'F', 'U', 'H', 'L' | 0x80, '(', 'F',
'R', 'I', 'E', 'N', 'D', ')', '=', 'F',
'R', 'E', 'H', '5', 'N', 'D' | 0x80, '(', 'F',
'A', 'T', 'H', 'E', 'R', ')', '=', 'F',
'A', 'A', '4', 'D', 'H', 'E', 'R' | 0x80, '(',
'F', ')', 'F', '=' | 0x80, '(', 'F', ')', '=',
'F' | 0x80,
']', 'G' | 0x80, ' ', '(', 'G', ')', ' ', '=',
'J', 'I', 'Y', '4' | 0x80, '(', 'G', 'I', 'V',
')', '=', 'G', 'I', 'H', '5', 'V' | 0x80, ' ',
'(', 'G', ')', 'I', '^', '=', 'G' | 0x80, '(',
'G', 'E', ')', 'T', '=', 'G', 'E', 'H',
'5' | 0x80, 'S', 'U', '(', 'G', 'G', 'E', 'S',
')', '=', 'G', 'J', 'E', 'H', '4', 'S' | 0x80,
'(', 'G', 'G', ')', '=', 'G' | 0x80, ' ', 'B',
'#', '(', 'G', ')', '=', 'G' | 0x80, '(', 'G',
')', '+', '=', 'J' | 0x80, '(', 'G', 'R', 'E',
'A', 'T', ')', '=', 'G', 'R', 'E', 'Y',
'4', 'T' | 0x80, '(', 'G', 'O', 'N', ')', 'E',
'=', 'G', 'A', 'O', '5', 'N' | 0x80, '#', '(',
'G', 'H', ')', '=' | 0x80, ' ', '(', 'G', 'N',
')', '=', 'N' | 0x80, '(', 'G', ')', '=', 'G' | 0x80,
']', 'H' | 0x80, ' ', '(', 'H', ')', ' ', '=',
'E', 'Y', '4', 'C', 'H' | 0x80, ' ', '(', 'H',
'A', 'V', ')', '=', '/', 'H', 'A', 'E',
'6', 'V' | 0x80, ' ', '(', 'H', 'E', 'R', 'E',
')', '=', '/', 'H', 'I', 'Y', 'R' | 0x80, ' ',
'(', 'H', 'O', 'U', 'R', ')', '=', 'A',
'W', '5', 'E', 'R' | 0x80, '(', 'H', 'O', 'W',
')', '=', '/', 'H', 'A', 'W' | 0x80, '(', 'H',
')', '#', '=', '/', 'H' | 0x80, '(', 'H', ')',
'=' | 0x80,
']', 'I' | 0x80, ' ', '(', 'I', 'N', ')', '=',
'I', 'H', 'N' | 0x80, ' ', '(', 'I', ')', ' ',
'=', 'A', 'Y', '4' | 0x80, '(', 'I', ')', ' ',
'=', 'A', 'Y' | 0x80, '(', 'I', 'N', ')', 'D',
'=', 'A', 'Y', '5', 'N' | 0x80, 'S', 'E', 'M',
'(', 'I', ')', '=', 'I', 'Y' | 0x80, ' ', 'A',
'N', 'T', '(', 'I', ')', '=', 'A', 'Y' | 0x80,
'(', 'I', 'E', 'R', ')', '=', 'I', 'Y',
'E', 'R' | 0x80, '#', ':', 'R', '(', 'I', 'E',
'D', ')', ' ', '=', 'I', 'Y', 'D' | 0x80, '(',
'I', 'E', 'D', ')', ' ', '=', 'A', 'Y',
'5', 'D' | 0x80, '(', 'I', 'E', 'N', ')', '=',
'I', 'Y', 'E', 'H', 'N' | 0x80, '(', 'I', 'E',
')', 'T', '=', 'A', 'Y', '4', 'E', 'H' | 0x80,
'(', 'I', '\'', ')', '=', 'A', 'Y', '5' | 0x80,
' ', ':', '(', 'I', ')', '^', '%', '=',
'A', 'Y', '5' | 0x80, ' ', ':', '(', 'I', 'E',
')', ' ', '=', 'A', 'Y', '4' | 0x80, '(', 'I',
')', '%', '=', 'I', 'Y' | 0x80, '(', 'I', 'E',
')', '=', 'I', 'Y', '4' | 0x80, ' ', '(', 'I',
'D', 'E', 'A', ')', '=', 'A', 'Y', 'D',
'I', 'Y', '5', 'A', 'H' | 0x80, '(', 'I', ')',
'^', '+', ':', '#', '=', 'I', 'H' | 0x80, '(',
'I', 'R', ')', '#', '=', 'A', 'Y', 'R' | 0x80,
'(', 'I', 'Z', ')', '%', '=', 'A', 'Y',
'Z' | 0x80, '(', 'I', 'S', ')', '%', '=', 'A',
'Y', 'Z' | 0x80, 'I', '^', '(', 'I', ')', '^',
'#', '=', 'I', 'H' | 0x80, '+', '^', '(', 'I',
')', '^', '+', '=', 'A', 'Y' | 0x80, '#', ':',
'^', '(', 'I', ')', '^', '+', '=', 'I',
'H' | 0x80, '(', 'I', ')', '^', '+', '=', 'A',
'Y' | 0x80, '(', 'I', 'R', ')', '=', 'E', 'R' | 0x80,
'(', 'I', 'G', 'H', ')', '=', 'A', 'Y',
'4' | 0x80, '(', 'I', 'L', 'D', ')', '=', 'A',
'Y', '5', 'L', 'D' | 0x80, ' ', '(', 'I', 'G',
'N', ')', '=', 'I', 'H', 'G', 'N' | 0x80, '(',
'I', 'G', 'N', ')', ' ', '=', 'A', 'Y',
'4', 'N' | 0x80, '(', 'I', 'G', 'N', ')', '^',
'=', 'A', 'Y', '4', 'N' | 0x80, '(', 'I', 'G',
'N', ')', '%', '=', 'A', 'Y', '4', 'N' | 0x80,
'(', 'I', 'C', 'R', 'O', ')', '=', 'A',
'Y', '4', 'K', 'R', 'O', 'H' | 0x80, '(', 'I',
'Q', 'U', 'E', ')', '=', 'I', 'Y', '4',
'K' | 0x80, '(', 'I', ')', '=', 'I', 'H' | 0x80,
']', 'J' | 0x80, ' ', '(', 'J', ')', ' ', '=',
'J', 'E', 'Y', '4' | 0x80, '(', 'J', ')', '=',
'J' | 0x80,
']', 'K' | 0x80, ' ', '(', 'K', ')', ' ', '=',
'K', 'E', 'Y', '4' | 0x80, ' ', '(', 'K', ')',
'N', '=' | 0x80, '(', 'K', ')', '=', 'K' | 0x80,
']', 'L' | 0x80, ' ', '(', 'L', ')', ' ', '=',
'E', 'H', '4', 'L' | 0x80, '(', 'L', 'O', ')',
'C', '#', '=', 'L', 'O', 'W' | 0x80, 'L', '(',
'L', ')', '=' | 0x80, '#', ':', '^', '(', 'L',
')', '%', '=', 'U', 'L' | 0x80, '(', 'L', 'E',
'A', 'D', ')', '=', 'L', 'I', 'Y', 'D' | 0x80,
' ', '(', 'L', 'A', 'U', 'G', 'H', ')',
'=', 'L', 'A', 'E', '4', 'F' | 0x80, '(', 'L',
')', '=', 'L' | 0x80,
']', 'M' | 0x80, ' ', '(', 'M', ')', ' ', '=',
'E', 'H', '4', 'M' | 0x80, ' ', '(', 'M', 'R',
'.', ')', ' ', '=', 'M', 'I', 'H', '4',
'S', 'T', 'E', 'R' | 0x80, ' ', '(', 'M', 'S',
'.', ')', '=', 'M', 'I', 'H', '5', 'Z' | 0x80,
' ', '(', 'M', 'R', 'S', '.', ')', ' ',
'=', 'M', 'I', 'H', '4', 'S', 'I', 'X',
'Z' | 0x80, '(', 'M', 'O', 'V', ')', '=', 'M',
'U', 'W', '4', 'V' | 0x80, '(', 'M', 'A', 'C',
'H', 'I', 'N', ')', '=', 'M', 'A', 'H',
'S', 'H', 'I', 'Y', '5', 'N' | 0x80, 'M', '(',
'M', ')', '=' | 0x80, '(', 'M', ')', '=', 'M' | 0x80,
']', 'N' | 0x80, ' ', '(', 'N', ')', ' ', '=',
'E', 'H', '4', 'N' | 0x80, 'E', '(', 'N', 'G',
')', '+', '=', 'N', 'J' | 0x80, '(', 'N', 'G',
')', 'R', '=', 'N', 'X', 'G' | 0x80, '(', 'N',
'G', ')', '#', '=', 'N', 'X', 'G' | 0x80, '(',
'N', 'G', 'L', ')', '%', '=', 'N', 'X',
'G', 'U', 'L' | 0x80, '(', 'N', 'G', ')', '=',
'N', 'X' | 0x80, '(', 'N', 'K', ')', '=', 'N',
'X', 'K' | 0x80, ' ', '(', 'N', 'O', 'W', ')',
' ', '=', 'N', 'A', 'W', '4' | 0x80, 'N', '(',
'N', ')', '=' | 0x80, '(', 'N', 'O', 'N', ')',
'E', '=', 'N', 'A', 'H', '4', 'N' | 0x80, '(',
'N', ')', '=', 'N' | 0x80,
']', 'O' | 0x80, ' ', '(', 'O', ')', ' ', '=',
'O', 'H', '4', 'W' | 0x80, '(', 'O', 'F', ')',
' ', '=', 'A', 'H', 'V' | 0x80, ' ', '(', 'O',
'H', ')', ' ', '=', 'O', 'W', '5' | 0x80, '(',
'O', 'R', 'O', 'U', 'G', 'H', ')', '=',
'E', 'R', '4', 'O', 'W' | 0x80, '#', ':', '(',
'O', 'R', ')', ' ', '=', 'E', 'R' | 0x80, '#',
':', '(', 'O', 'R', 'S', ')', ' ', '=',
'E', 'R', 'Z' | 0x80, '(', 'O', 'R', ')', '=',
'A', 'O', 'R' | 0x80, ' ', '(', 'O', 'N', 'E',
')', '=', 'W', 'A', 'H', 'N' | 0x80, '#', '(',
'O', 'N', 'E', ')', ' ', '=', 'W', 'A',
'H', 'N' | 0x80, '(', 'O', 'W', ')', '=', 'O',
'W' | 0x80, ' ', '(', 'O', 'V', 'E', 'R', ')',
'=', 'O', 'W', '5', 'V', 'E', 'R' | 0x80, 'P',
'R', '(', 'O', ')', 'V', '=', 'U', 'W',
'4' | 0x80, '(', 'O', 'V', ')', '=', 'A', 'H',
'4', 'V' | 0x80, '(', 'O', ')', '^', '%', '=',
'O', 'W', '5' | 0x80, '(', 'O', ')', '^', 'E',
'N', '=', 'O', 'W' | 0x80, '(', 'O', ')', '^',
'I', '#', '=', 'O', 'W', '5' | 0x80, '(', 'O',
'L', ')', 'D', '=', 'O', 'W', '4', 'L' | 0x80,
'(', 'O', 'U', 'G', 'H', 'T', ')', '=',
'A', 'O', '5', 'T' | 0x80, '(', 'O', 'U', 'G',
'H', ')', '=', 'A', 'H', '5', 'F' | 0x80, ' ',
'(', 'O', 'U', ')', '=', 'A', 'W' | 0x80, 'H',
'(', 'O', 'U', ')', 'S', '#', '=', 'A',
'W', '4' | 0x80, '(', 'O', 'U', 'S', ')', '=',
'A', 'X', 'S' | 0x80, '(', 'O', 'U', 'R', ')',
'=', 'O', 'H', 'R' | 0x80, '(', 'O', 'U', 'L',
'D', ')', '=', 'U', 'H', '5', 'D' | 0x80, '(',
'O', 'U', ')', '^', 'L', '=', 'A', 'H',
'5' | 0x80, '(', 'O', 'U', 'P', ')', '=', 'U',
'W', '5', 'P' | 0x80, '(', 'O', 'U', ')', '=',
'A', 'W' | 0x80, '(', 'O', 'Y', ')', '=', 'O',
'Y' | 0x80, '(', 'O', 'I', 'N', 'G', ')', '=',
'O', 'W', '4', 'I', 'H', 'N', 'X' | 0x80, '(',
'O', 'I', ')', '=', 'O', 'Y', '5' | 0x80, '(',
'O', 'O', 'R', ')', '=', 'O', 'H', '5',
'R' | 0x80, '(', 'O', 'O', 'K', ')', '=', 'U',
'H', '5', 'K' | 0x80, 'F', '(', 'O', 'O', 'D',
')', '=', 'U', 'W', '5', 'D' | 0x80, 'L', '(',
'O', 'O', 'D', ')', '=', 'A', 'H', '5',
'D' | 0x80, 'M', '(', 'O', 'O', 'D', ')', '=',
'U', 'W', '5', 'D' | 0x80, '(', 'O', 'O', 'D',
')', '=', 'U', 'H', '5', 'D' | 0x80, 'F', '(',
'O', 'O', 'T', ')', '=', 'U', 'H', '5',
'T' | 0x80, '(', 'O', 'O', ')', '=', 'U', 'W',
'5' | 0x80, '(', 'O', '\'', ')', '=', 'O', 'H' | 0x80,
'(', 'O', ')', 'E', '=', 'O', 'W' | 0x80, '(',
'O', ')', ' ', '=', 'O', 'W' | 0x80, '(', 'O',
'A', ')', '=', 'O', 'W', '4' | 0x80, ' ', '(',
'O', 'N', 'L', 'Y', ')', '=', 'O', 'W',
'4', 'N', 'L', 'I', 'Y' | 0x80, ' ', '(', 'O',
'N', 'C', 'E', ')', '=', 'W', 'A', 'H',
'4', 'N', 'S' | 0x80, '(', 'O', 'N', '\'', 'T',
')', '=', 'O', 'W', '4', 'N', 'T' | 0x80, 'C',
'(', 'O', ')', 'N', '=', 'A', 'A' | 0x80, '(',
'O', ')', 'N', 'G', '=', 'A', 'O' | 0x80, ' ',
':', '^', '(', 'O', ')', 'N', '=', 'A',
'H' | 0x80, 'I', '(', 'O', 'N', ')', '=', 'U',
'N' | 0x80, '#', ':', '(', 'O', 'N', ')', '=',
'U', 'N' | 0x80, '#', '^', '(', 'O', 'N', ')',
'=', 'U', 'N' | 0x80, '(', 'O', ')', 'S', 'T',
'=', 'O', 'W' | 0x80, '(', 'O', 'F', ')', '^',
'=', 'A', 'O', '4', 'F' | 0x80, '(', 'O', 'T',
'H', 'E', 'R', ')', '=', 'A', 'H', '5',
'D', 'H', 'E', 'R' | 0x80, 'R', '(', 'O', ')',
'B', '=', 'R', 'A', 'A' | 0x80, '^', 'R', '(',
'O', ')', ':', '#', '=', 'O', 'W', '5' | 0x80,
'(', 'O', 'S', 'S', ')', ' ', '=', 'A',
'O', '5', 'S' | 0x80, '#', ':', '^', '(', 'O',
'M', ')', '=', 'A', 'H', 'M' | 0x80, '(', 'O',
')', '=', 'A', 'A' | 0x80,
']', 'P' | 0x80, ' ', '(', 'P', ')', ' ', '=',
'P', 'I', 'Y', '4' | 0x80, '(', 'P', 'H', ')',
'=', 'F' | 0x80, '(', 'P', 'E', 'O', 'P', 'L',
')', '=', 'P', 'I', 'Y', '5', 'P', 'U',
'L' | 0x80, '(', 'P', 'O', 'W', ')', '=', 'P',
'A', 'W', '4' | 0x80, '(', 'P', 'U', 'T', ')',
' ', '=', 'P', 'U', 'H', 'T' | 0x80, '(', 'P',
')', 'P', '=' | 0x80, '(', 'P', ')', 'S', '=' | 0x80,
'(', 'P', ')', 'N', '=' | 0x80, '(', 'P', 'R',
'O', 'F', '.', ')', '=', 'P', 'R', 'O',
'H', 'F', 'E', 'H', '4', 'S', 'E', 'R' | 0x80,
'(', 'P', ')', '=', 'P' | 0x80,
']', 'Q' | 0x80, ' ', '(', 'Q', ')', ' ', '=',
'K', 'Y', 'U', 'W', '4' | 0x80, '(', 'Q', 'U',
'A', 'R', ')', '=', 'K', 'W', 'O', 'H',
'5', 'R' | 0x80, '(', 'Q', 'U', ')', '=', 'K',
'W' | 0x80, '(', 'Q', ')', '=', 'K' | 0x80, ']', 'R' | 0x80,
' ', '(', 'R', ')', ' ', '=', 'A', 'A',
'5', 'R' | 0x80, ' ', '(', 'R', 'E', ')', '^',
'#', '=', 'R', 'I', 'Y' | 0x80, '(', 'R', ')',
'R', '=' | 0x80, '(', 'R', ')', '=', 'R' | 0x80,
']', 'S' | 0x80, ' ', '(', 'S', ')', ' ', '=',
'E', 'H', '4', 'S' | 0x80, '(', 'S', 'H', ')',
'=', 'S', 'H' | 0x80, '#', '(', 'S', 'I', 'O',
'N', ')', '=', 'Z', 'H', 'U', 'N' | 0x80, '(',
'S', 'O', 'M', 'E', ')', '=', 'S', 'A',
'H', 'M' | 0x80, '#', '(', 'S', 'U', 'R', ')',
'#', '=', 'Z', 'H', 'E', 'R' | 0x80, '(', 'S',
'U', 'R', ')', '#', '=', 'S', 'H', 'E',
'R' | 0x80, '#', '(', 'S', 'U', ')', '#', '=',
'Z', 'H', 'U', 'W' | 0x80, '#', '(', 'S', 'S',
'U', ')', '#', '=', 'S', 'H', 'U', 'W' | 0x80,
'#', '(', 'S', 'E', 'D', ')', '=', 'Z',
'D' | 0x80, '#', '(', 'S', ')', '#', '=', 'Z' | 0x80,
'(', 'S', 'A', 'I', 'D', ')', '=', 'S',
'E', 'H', 'D' | 0x80, '^', '(', 'S', 'I', 'O',
'N', ')', '=', 'S', 'H', 'U', 'N' | 0x80, '(',
'S', ')', 'S', '=' | 0x80, '.', '(', 'S', ')',
' ', '=', 'Z' | 0x80, '#', ':', '.', 'E', '(',
'S', ')', ' ', '=', 'Z' | 0x80, '#', ':', '^',
'#', '(', 'S', ')', ' ', '=', 'S' | 0x80, 'U',
'(', 'S', ')', ' ', '=', 'S' | 0x80, ' ', ':',
'#', '(', 'S', ')', ' ', '=', 'Z' | 0x80, '#',
'#', '(', 'S', ')', ' ', '=', 'Z' | 0x80, ' ',
'(', 'S', 'C', 'H', ')', '=', 'S', 'K' | 0x80,
'(', 'S', ')', 'C', '+', '=' | 0x80, '#', '(',
'S', 'M', ')', '=', 'Z', 'U', 'M' | 0x80, '#',
'(', 'S', 'N', ')', '\'', '=', 'Z', 'U',
'M' | 0x80, '(', 'S', 'T', 'L', 'E', ')', '=',
'S', 'U', 'L' | 0x80, '(', 'S', ')', '=', 'S' | 0x80,
']', 'T' | 0x80, ' ', '(', 'T', ')', ' ', '=',
'T', 'I', 'Y', '4' | 0x80, ' ', '(', 'T', 'H',
'E', ')', ' ', '#', '=', 'D', 'H', 'I',
'Y' | 0x80, ' ', '(', 'T', 'H', 'E', ')', ' ',
'=', 'D', 'H', 'A', 'X' | 0x80, '(', 'T', 'O',
')', ' ', '=', 'T', 'U', 'X' | 0x80, ' ', '(',
'T', 'H', 'A', 'T', ')', '=', 'D', 'H',
'A', 'E', 'T' | 0x80, ' ', '(', 'T', 'H', 'I',
'S', ')', ' ', '=', 'D', 'H', 'I', 'H',
'S' | 0x80, ' ', '(', 'T', 'H', 'E', 'Y', ')',
'=', 'D', 'H', 'E', 'Y' | 0x80, ' ', '(', 'T',
'H', 'E', 'R', 'E', ')', '=', 'D', 'H',
'E', 'H', 'R' | 0x80, '(', 'T', 'H', 'E', 'R',
')', '=', 'D', 'H', 'E', 'R' | 0x80, '(', 'T',
'H', 'E', 'I', 'R', ')', '=', 'D', 'H',
'E', 'H', 'R' | 0x80, ' ', '(', 'T', 'H', 'A',
'N', ')', ' ', '=', 'D', 'H', 'A', 'E',
'N' | 0x80, ' ', '(', 'T', 'H', 'E', 'M', ')',
' ', '=', 'D', 'H', 'A', 'E', 'N' | 0x80, '(',
'T', 'H', 'E', 'S', 'E', ')', ' ', '=',
'D', 'H', 'I', 'Y', 'Z' | 0x80, ' ', '(', 'T',
'H', 'E', 'N', ')', '=', 'D', 'H', 'E',
'H', 'N' | 0x80, '(', 'T', 'H', 'R', 'O', 'U',
'G', 'H', ')', '=', 'T', 'H', 'R', 'U',
'W', '4' | 0x80, '(', 'T', 'H', 'O', 'S', 'E',
')', '=', 'D', 'H', 'O', 'H', 'Z' | 0x80, '(',
'T', 'H', 'O', 'U', 'G', 'H', ')', ' ',
'=', 'D', 'H', 'O', 'W' | 0x80, '(', 'T', 'O',
'D', 'A', 'Y', ')', '=', 'T', 'U', 'X',
'D', 'E', 'Y' | 0x80, '(', 'T', 'O', 'M', 'O',
')', 'R', 'R', 'O', 'W', '=', 'T', 'U',
'M', 'A', 'A', '5' | 0x80, '(', 'T', 'O', ')',
'T', 'A', 'L', '=', 'T', 'O', 'W', '5' | 0x80,
' ', '(', 'T', 'H', 'U', 'S', ')', '=',
'D', 'H', 'A', 'H', '4', 'S' | 0x80, '(', 'T',
'H', ')', '=', 'T', 'H' | 0x80, '#', ':', '(',
'T', 'E', 'D', ')', '=', 'T', 'I', 'X',
'D' | 0x80, 'S', '(', 'T', 'I', ')', '#', 'N',
'=', 'C', 'H' | 0x80, '(', 'T', 'I', ')', 'O',
'=', 'S', 'H' | 0x80, '(', 'T', 'I', ')', 'A',
'=', 'S', 'H' | 0x80, '(', 'T', 'I', 'E', 'N',
')', '=', 'S', 'H', 'U', 'N' | 0x80, '(', 'T',
'U', 'R', ')', '#', '=', 'C', 'H', 'E',
'R' | 0x80, '(', 'T', 'U', ')', 'A', '=', 'C',
'H', 'U', 'W' | 0x80, ' ', '(', 'T', 'W', 'O',
')', '=', 'T', 'U', 'W' | 0x80, '&', '(', 'T',
')', 'E', 'N', ' ', '=' | 0x80, '(', 'T', ')',
'=', 'T' | 0x80,
']', 'U' | 0x80, ' ', '(', 'U', ')', ' ', '=',
'Y', 'U', 'W', '4' | 0x80, ' ', '(', 'U', 'N',
')', 'I', '=', 'Y', 'U', 'W', 'N' | 0x80, ' ',
'(', 'U', 'N', ')', '=', 'A', 'H', 'N' | 0x80,
' ', '(', 'U', 'P', 'O', 'N', ')', '=',
'A', 'X', 'P', 'A', 'O', 'N' | 0x80, '@', '(',
'U', 'R', ')', '#', '=', 'U', 'H', '4',
'R' | 0x80, '(', 'U', 'R', ')', '#', '=', 'Y',
'U', 'H', '4', 'R' | 0x80, '(', 'U', 'R', ')',
'=', 'E', 'R' | 0x80, '(', 'U', ')', '^', ' ',
'=', 'A', 'H' | 0x80, '(', 'U', ')', '^', '^',
'=', 'A', 'H', '5' | 0x80, '(', 'U', 'Y', ')',
'=', 'A', 'Y', '5' | 0x80, ' ', 'G', '(', 'U',
')', '#', '=' | 0x80, 'G', '(', 'U', ')', '%',
'=' | 0x80, 'G', '(', 'U', ')', '#', '=', 'W' | 0x80,
'#', 'N', '(', 'U', ')', '=', 'Y', 'U',
'W' | 0x80, '@', '(', 'U', ')', '=', 'U', 'W' | 0x80,
'(', 'U', ')', '=', 'Y', 'U', 'W' | 0x80,
']', 'V' | 0x80, ' ', '(', 'V', ')', ' ', '=',
'V', 'I', 'Y', '4' | 0x80, '(', 'V', 'I', 'E',
'W', ')', '=', 'V', 'Y', 'U', 'W', '5' | 0x80,
'(', 'V', ')', '=', 'V' | 0x80,
']', 'W' | 0x80, ' ', '(', 'W', ')', ' ', '=',
'D', 'A', 'H', '4', 'B', 'U', 'L', 'Y',
'U', 'W' | 0x80, ' ', '(', 'W', 'E', 'R', 'E',
')', '=', 'W', 'E', 'R' | 0x80, '(', 'W', 'A',
')', 'S', 'H', '=', 'W', 'A', 'A' | 0x80, '(',
'W', 'A', ')', 'S', 'T', '=', 'W', 'E',
'Y' | 0x80, '(', 'W', 'A', ')', 'S', '=', 'W',
'A', 'H' | 0x80, '(', 'W', 'A', ')', 'T', '=',
'W', 'A', 'A' | 0x80, '(', 'W', 'H', 'E', 'R',
'E', ')', '=', 'W', 'H', 'E', 'H', 'R' | 0x80,
'(', 'W', 'H', 'A', 'T', ')', '=', 'W',
'H', 'A', 'H', 'T' | 0x80, '(', 'W', 'H', 'O',
'L', ')', '=', '/', 'H', 'O', 'W', 'L' | 0x80,
'(', 'W', 'H', 'O', ')', '=', '/', 'H',
'U', 'W' | 0x80, '(', 'W', 'H', ')', '=', 'W',
'H' | 0x80, '(', 'W', 'A', 'R', ')', '#', '=',
'W', 'E', 'H', 'R' | 0x80, '(', 'W', 'A', 'R',
')', '=', 'W', 'A', 'O', 'R' | 0x80, '(', 'W',
'O', 'R', ')', '^', '=', 'W', 'E', 'R' | 0x80,
'(', 'W', 'R', ')', '=', 'R' | 0x80, '(', 'W',
'O', 'M', ')', 'A', '=', 'W', 'U', 'H',
'M' | 0x80, '(', 'W', 'O', 'M', ')', 'E', '=',
'W', 'I', 'H', 'M' | 0x80, '(', 'W', 'E', 'A',
')', 'R', '=', 'W', 'E', 'H' | 0x80, '(', 'W',
'A', 'N', 'T', ')', '=', 'W', 'A', 'A',
'5', 'N', 'T' | 0x80, 'A', 'N', 'S', '(', 'W',
'E', 'R', ')', '=', 'E', 'R' | 0x80, '(', 'W',
')', '=', 'W' | 0x80,
']', 'X' | 0x80, ' ', '(', 'X', ')', ' ', '=',
'E', 'H', '4', 'K', 'R' | 0x80, ' ', '(', 'X',
')', '=', 'Z' | 0x80, '(', 'X', ')', '=', 'K',
'S' | 0x80,
']', 'Y' | 0x80, ' ', '(', 'Y', ')', ' ', '=',
'W', 'A', 'Y', '4' | 0x80, '(', 'Y', 'O', 'U',
'N', 'G', ')', '=', 'Y', 'A', 'H', 'N',
'X' | 0x80, ' ', '(', 'Y', 'O', 'U', 'R', ')',
'=', 'Y', 'O', 'H', 'R' | 0x80, ' ', '(', 'Y',
'O', 'U', ')', '=', 'Y', 'U', 'W' | 0x80, ' ',
'(', 'Y', 'E', 'S', ')', '=', 'Y', 'E',
'H', 'S' | 0x80, ' ', '(', 'Y', ')', '=', 'Y' | 0x80,
'F', '(', 'Y', ')', '=', 'A', 'Y' | 0x80, 'P',
'S', '(', 'Y', 'C', 'H', ')', '=', 'A',
'Y', 'K' | 0x80, '#', ':', '^', '(', 'Y', ')',
'=', 'I', 'Y' | 0x80, '#', ':', '^', '(', 'Y',
')', 'I', '=', 'I', 'Y' | 0x80, ' ', ':', '(',
'Y', ')', ' ', '=', 'A', 'Y' | 0x80, ' ', ':',
'(', 'Y', ')', '#', '=', 'A', 'Y' | 0x80, ' ',
':', '(', 'Y', ')', '^', '+', ':', '#',
'=', 'I', 'H' | 0x80, ' ', ':', '(', 'Y', ')',
'^', '#', '=', 'A', 'Y' | 0x80, '(', 'Y', ')',
'=', 'I', 'H' | 0x80,
']', 'Z' | 0x80, ' ', '(', 'Z', ')', ' ', '=',
'Z', 'I', 'Y', '4' | 0x80, '(', 'Z', ')', '=',
'Z' | 0x80, 'j' | 0x80};
const unsigned char rules2[] = {
'(', 'A', ')', '=' | 0x80, '(', '!', ')', '=',
'.' | 0x80, '(', '"', ')', ' ', '=', '-', 'A',
'H', '5', 'N', 'K', 'W', 'O', 'W', 'T',
'-' | 0x80, '(', '"', ')', '=', 'K', 'W', 'O',
'W', '4', 'T', '-' | 0x80, '(', '#', ')', '=',
' ', 'N', 'A', 'H', '4', 'M', 'B', 'E',
'R' | 0x80, '(', '$', ')', '=', ' ', 'D', 'A',
'A', '4', 'L', 'E', 'R' | 0x80, '(', '%', ')',
'=', ' ', 'P', 'E', 'R', 'S', 'E', 'H',
'4', 'N', 'T' | 0x80, '(', '&', ')', '=', ' ',
'A', 'E', 'N', 'D' | 0x80, '(', '\'', ')', '=' | 0x80,
'(', '*', ')', '=', ' ', 'A', 'E', '4',
'S', 'T', 'E', 'R', 'I', 'H', 'S', 'K' | 0x80,
'(', '+', ')', '=', ' ', 'P', 'L', 'A',
'H', '4', 'S' | 0x80, '(', ',', ')', '=', ',' | 0x80,
' ', '(', '-', ')', ' ', '=', '-' | 0x80, '(',
'-', ')', '=' | 0x80, '(', '.', ')', '=', ' ',
'P', 'O', 'Y', 'N', 'T' | 0x80, '(', '/', ')',
'=', ' ', 'S', 'L', 'A', 'E', '4', 'S',
'H' | 0x80, '(', '0', ')', '=', ' ', 'Z', 'I',
'Y', '4', 'R', 'O', 'W' | 0x80, ' ', '(', '1',
'S', 'T', ')', '=', 'F', 'E', 'R', '4',
'S', 'T' | 0x80, ' ', '(', '1', '0', 'T', 'H',
')', '=', 'T', 'E', 'H', '4', 'N', 'T',
'H' | 0x80, '(', '1', ')', '=', ' ', 'W', 'A',
'H', '4', 'N' | 0x80, ' ', '(', '2', 'N', 'D',
')', '=', 'S', 'E', 'H', '4', 'K', 'U',
'N', 'D' | 0x80, '(', '2', ')', '=', ' ', 'T',
'U', 'W', '4' | 0x80, ' ', '(', '3', 'R', 'D',
')', '=', 'T', 'H', 'E', 'R', '4', 'D' | 0x80,
'(', '3', ')', '=', ' ', 'T', 'H', 'R',
'I', 'Y', '4' | 0x80, '(', '4', ')', '=', ' ',
'F', 'O', 'H', '4', 'R' | 0x80, ' ', '(', '5',
'T', 'H', ')', '=', 'F', 'I', 'H', '4',
'F', 'T', 'H' | 0x80, '(', '5', ')', '=', ' ',
'F', 'A', 'Y', '4', 'V' | 0x80, ' ', '(', '6',
'4', ')', ' ', '=', 'S', 'I', 'H', '4',
'K', 'S', 'T', 'I', 'Y', ' ', 'F', 'O',
'H', 'R' | 0x80, '(', '6', ')', '=', ' ', 'S',
'I', 'H', '4', 'K', 'S' | 0x80, '(', '7', ')',
'=', ' ', 'S', 'E', 'H', '4', 'V', 'U',
'N' | 0x80, ' ', '(', '8', 'T', 'H', ')', '=',
'E', 'Y', '4', 'T', 'H' | 0x80, '(', '8', ')',
'=', ' ', 'E', 'Y', '4', 'T' | 0x80, '(', '9',
')', '=', ' ', 'N', 'A', 'Y', '4', 'N' | 0x80,
'(', ':', ')', '=', '.' | 0x80, '(', ';', ')',
'=', '.' | 0x80, '(', '<', ')', '=', ' ', 'L',
'E', 'H', '4', 'S', ' ', 'D', 'H', 'A',
'E', 'N' | 0x80, '(', '=', ')', '=', ' ', 'I',
'Y', '4', 'K', 'W', 'U', 'L', 'Z' | 0x80, '(',
'>', ')', '=', ' ', 'G', 'R', 'E', 'Y',
'4', 'T', 'E', 'R', ' ', 'D', 'H', 'A',
'E', 'N' | 0x80, '(', '?', ')', '=', '?' | 0x80, '(',
'@', ')', '=', ' ', 'A', 'E', '6', 'T' | 0x80,
'(', '^', ')', '=', ' ', 'K', 'A', 'E',
'4', 'R', 'I', 'X', 'T' | 0x80, ']', 'A' | 0x80};
//26 items. From 'A' to 'Z'
// positions for mem62 and mem63 for each character
const unsigned char tab37489[] = {0, 149, 247, 162, 57, 197, 6, 126, 199, 38, 55, 78, 145,
241, 85, 161, 254, 36, 69, 45, 167, 54, 83, 46, 71, 218};
const unsigned char tab37515[] = {125, 126, 126, 127, 128, 129, 130, 130, 130, 132, 132, 132, 132,
132, 133, 135, 135, 136, 136, 137, 138, 139, 139, 140, 140, 140};
void STM32SAM::Output8BitAry(int index, unsigned char ary[5]) {
int k;
uint32_t bufferposOld = bufferpos;
bufferpos += timetable[oldtimetableindex][index];
oldtimetableindex = index;
int sample_uS = bufferpos - bufferposOld;
uint32_t f = 0;
// write a little bit in advance
for(k = 0; k < 5; k++) {
// buffer[bufferpos / 50 + k] = ary[k];
// f = micros() + sample_uS / (_STM32SAM_SPEED + 1);
// while(micros() < f) {
// };
f = sample_uS / (_STM32SAM_SPEED + 1);
furi_delay_us(f);
SetAUDIO(ary[k]);
// delayMicroseconds(sample_uS / 5 );
}
// SetAUDIO(ary[0]);
}
void STM32SAM::Output8Bit(int index, unsigned char A) {
unsigned char ary[5] = {A, A, A, A, A};
Output8BitAry(index, ary);
}
//written by me because of different table positions.
// mem[47] = ...
// 168=pitches
// 169=frequency1
// 170=frequency2
// 171=frequency3
// 172=amplitude1
// 173=amplitude2
// 174=amplitude3
unsigned char STM32SAM::Read(unsigned char p, unsigned char Y) {
switch(p) {
case 168:
return pitches[Y];
case 169:
return frequency1[Y];
case 170:
return frequency2[Y];
case 171:
return frequency3[Y];
case 172:
return amplitude1[Y];
case 173:
return amplitude2[Y];
case 174:
return amplitude3[Y];
}
// Serial1.println("Error reading to tables");
return 0;
}
void STM32SAM::Write(unsigned char p, unsigned char Y, unsigned char value) {
switch(p) {
case 168:
pitches[Y] = value;
return;
case 169:
frequency1[Y] = value;
return;
case 170:
frequency2[Y] = value;
return;
case 171:
frequency3[Y] = value;
return;
case 172:
amplitude1[Y] = value;
return;
case 173:
amplitude2[Y] = value;
return;
case 174:
amplitude3[Y] = value;
return;
}
//Serial1.println("Error writing to tables\n");
}
// -------------------------------------------------------------------------
//Code48227
// Render a sampled sound from the sampleTable.
//
// Phoneme Sample Start Sample End
// 32: S* 15 255
// 33: SH 257 511
// 34: F* 559 767
// 35: TH 583 767
// 36: /H 903 1023
// 37: /X 1135 1279
// 38: Z* 84 119
// 39: ZH 340 375
// 40: V* 596 639
// 41: DH 596 631
//
// 42: CH
// 43: ** 399 511
//
// 44: J*
// 45: ** 257 276
// 46: **
//
// 66: P*
// 67: ** 743 767
// 68: **
//
// 69: T*
// 70: ** 231 255
// 71: **
//
// The SampledPhonemesTable[] holds flags indicating if a phoneme is
// voiced or not. If the upper 5 bits are zero, the sample is voiced.
//
// Samples in the sampleTable are compressed, with bits being converted to
// bytes from high bit to low, as follows:
//
// unvoiced 0 bit -> X
// unvoiced 1 bit -> 5
//
// voiced 0 bit -> 6
// voiced 1 bit -> 24
//
// Where X is a value from the table:
//
// { 0x18, 0x1A, 0x17, 0x17, 0x17 };
//
// The index into this table is determined by masking off the lower
// 3 bits from the SampledPhonemesTable:
//
// index = (SampledPhonemesTable[i] & 7) - 1;
//
// For voices samples, samples are interleaved between voiced output.
// Code48227()
void STM32SAM::RenderSample(unsigned char* mem66) {
int tempA;
// current phoneme's index
mem49 = Y;
// mask low three bits and subtract 1 get value to
// convert 0 bits on unvoiced samples.
A = mem39 & 7;
X = A - 1;
// store the result
mem56 = X;
// determine which offset to use from table { 0x18, 0x1A, 0x17, 0x17, 0x17 }
// T, S, Z 0 0x18
// CH, J, SH, ZH 1 0x1A
// P, F*, V, TH, DH 2 0x17
// /H 3 0x17
// /X 4 0x17
// get value from the table
mem53 = tab48426[X];
mem47 = X; //46016+mem[56]*256
// voiced sample?
A = mem39 & 248;
if(A == 0) {
// voiced phoneme: Z*, ZH, V*, DH
Y = mem49;
A = pitches[mem49] >> 4;
// jump to voiced portion
goto pos48315;
}
Y = A ^ 255;
pos48274:
// step through the 8 bits in the sample
mem56 = 8;
// get the next sample from the table
// mem47*256 = offset to start of samples
A = sampleTable[mem47 * 256 + Y];
pos48280:
// left shift to get the high bit
tempA = A;
A = A << 1;
//48281: BCC 48290
// bit not set?
if((tempA & 128) == 0) {
// convert the bit to value from table
X = mem53;
//mem[54296] = X;
// output the byte
Output8Bit(1, (X & 0x0f) * 16);
// if X != 0, exit loop
if(X != 0) goto pos48296;
}
// output a 5 for the on bit
Output8Bit(2, 5 * 16);
//48295: NOP
pos48296:
X = 0;
// decrement counter
mem56--;
// if not done, jump to top of loop
if(mem56 != 0) goto pos48280;
// increment position
Y++;
if(Y != 0) goto pos48274;
// restore values and return
mem44 = 1;
Y = mem49;
return;
unsigned char phase1;
pos48315:
// handle voiced samples here
// number of samples?
phase1 = A ^ 255;
Y = *mem66;
do {
//pos48321:
// shift through all 8 bits
mem56 = 8;
//A = Read(mem47, Y);
// fetch value from table
A = sampleTable[mem47 * 256 + Y];
// loop 8 times
//pos48327:
do {
//48327: ASL A
//48328: BCC 48337
// left shift and check high bit
tempA = A;
A = A << 1;
if((tempA & 128) != 0) {
// if bit set, output 26
X = 26;
Output8Bit(3, (X & 0xf) * 16);
} else {
//timetable 4
// bit is not set, output a 6
X = 6;
Output8Bit(4, (X & 0xf) * 16);
}
mem56--;
} while(mem56 != 0);
// move ahead in the table
Y++;
// continue until counter done
phase1++;
} while(phase1 != 0);
// if (phase1 != 0) goto pos48321;
// restore values and return
A = 1;
mem44 = 1;
*mem66 = Y;
Y = mem49;
return;
}
// RENDER THE PHONEMES IN THE LIST
//
// The phoneme list is converted into sound through the steps:
//
// 1. Copy each phoneme <length> number of times into the frames list,
// where each frame represents 10 milliseconds of sound.
//
// 2. Determine the transitions lengths between phonemes, and linearly
// interpolate the values across the frames.
//
// 3. Offset the pitches by the fundamental frequency.
//
// 4. Render the each frame.
//void Code47574()
void STM32SAM::Render() {
unsigned char phase1 = 0; //mem43
unsigned char phase2 = 0;
unsigned char phase3 = 0;
unsigned char mem66 = 0;
unsigned char mem38 = 0;
unsigned char mem40 = 0;
unsigned char speedcounter = 0; //mem45
unsigned char mem48 = 0;
int i;
if(phonemeIndexOutput[0] == 255) return; //exit if no data
A = 0;
X = 0;
mem44 = 0;
// CREATE FRAMES
//
// The length parameter in the list corresponds to the number of frames
// to expand the phoneme to. Each frame represents 10 milliseconds of time.
// So a phoneme with a length of 7 = 7 frames = 70 milliseconds duration.
//
// The parameters are copied from the phoneme to the frame verbatim.
// pos47587:
do {
// get the index
Y = mem44;
// get the phoneme at the index
A = phonemeIndexOutput[mem44];
mem56 = A;
// if terminal phoneme, exit the loop
if(A == 255) break;
// period phoneme *.
if(A == 1) {
// add rising inflection
A = 1;
mem48 = 1;
//goto pos48376;
AddInflection(mem48, phase1);
}
/*
if (A == 2) goto pos48372;
*/
// question mark phoneme?
if(A == 2) {
// create falling inflection
mem48 = 255;
AddInflection(mem48, phase1);
}
// pos47615:
// get the stress amount (more stress = higher pitch)
phase1 = tab47492[stressOutput[Y] + 1];
// get number of frames to write
phase2 = phonemeLengthOutput[Y];
Y = mem56;
// copy from the source to the frames list
do {
frequency1[X] = freq1data[Y]; // F1 frequency
frequency2[X] = freq2data[Y]; // F2 frequency
frequency3[X] = freq3data[Y]; // F3 frequency
amplitude1[X] = ampl1data[Y]; // F1 amplitude
amplitude2[X] = ampl2data[Y]; // F2 amplitude
amplitude3[X] = ampl3data[Y]; // F3 amplitude
sampledConsonantFlag[X] =
sampledConsonantFlags[Y]; // phoneme data for sampled consonants
pitches[X] = pitch + phase1; // pitch
X++;
phase2--;
} while(phase2 != 0);
mem44++;
} while(mem44 != 0);
// -------------------
//pos47694:
// CREATE TRANSITIONS
//
// Linear transitions are now created to smoothly connect the
// end of one sustained portion of a phoneme to the following
// phoneme.
//
// To do this, three tables are used:
//
// Table Purpose
// ========= ==================================================
// blendRank Determines which phoneme's blend values are used.
//
// blendOut The number of frames at the end of the phoneme that
// will be used to transition to the following phoneme.
//
// blendIn The number of frames of the following phoneme that
// will be used to transition into that phoneme.
//
// In creating a transition between two phonemes, the phoneme
// with the HIGHEST rank is used. Phonemes are ranked on how much
// their identity is based on their transitions. For example,
// vowels are and diphthongs are identified by their sustained portion,
// rather than the transitions, so they are given low values. In contrast,
// stop consonants (P, B, T, K) and glides (Y, L) are almost entirely
// defined by their transitions, and are given high rank values.
//
// Here are the rankings used by SAM:
//
// Rank Type Phonemes
// 2 All vowels IY, IH, etc.
// 5 Diphthong endings YX, WX, ER
// 8 Terminal liquid consonants LX, WX, YX, N, NX
// 9 Liquid consonants L, RX, W
// 10 Glide R, OH
// 11 Glide WH
// 18 Voiceless fricatives S, SH, F, TH
// 20 Voiced fricatives Z, ZH, V, DH
// 23 Plosives, stop consonants P, T, K, KX, DX, CH
// 26 Stop consonants J, GX, B, D, G
// 27-29 Stop consonants (internal) **
// 30 Unvoiced consonants /H, /X and Q*
// 160 Nasal M
//
// To determine how many frames to use, the two phonemes are
// compared using the blendRank[] table. The phoneme with the
// higher rank is selected. In case of a tie, a blend of each is used:
//
// if blendRank[phoneme1] == blendRank[phomneme2]
// // use lengths from each phoneme
// outBlendFrames = outBlend[phoneme1]
// inBlendFrames = outBlend[phoneme2]
// else if blendRank[phoneme1] > blendRank[phoneme2]
// // use lengths from first phoneme
// outBlendFrames = outBlendLength[phoneme1]
// inBlendFrames = inBlendLength[phoneme1]
// else
// // use lengths from the second phoneme
// // note that in and out are SWAPPED!
// outBlendFrames = inBlendLength[phoneme2]
// inBlendFrames = outBlendLength[phoneme2]
//
// Blend lengths can't be less than zero.
//
// Transitions are assumed to be symetrical, so if the transition
// values for the second phoneme are used, the inBlendLength and
// outBlendLength values are SWAPPED.
//
// For most of the parameters, SAM interpolates over the range of the last
// outBlendFrames-1 and the first inBlendFrames.
//
// The exception to this is the Pitch[] parameter, which is interpolates the
// pitch from the CENTER of the current phoneme to the CENTER of the next
// phoneme.
//
// Here are two examples. First, For example, consider the word "SUN" (S AH N)
//
// Phoneme Duration BlendWeight OutBlendFrames InBlendFrames
// S 2 18 1 3
// AH 8 2 4 4
// N 7 8 1 2
//
// The formant transitions for the output frames are calculated as follows:
//
// flags ampl1 freq1 ampl2 freq2 ampl3 freq3 pitch
// ------------------------------------------------
// S
// 241 0 6 0 73 0 99 61 Use S (weight 18) for transition instead of AH (weight 2)
// 241 0 6 0 73 0 99 61 <-- (OutBlendFrames-1) = (1-1) = 0 frames
// AH
// 0 2 10 2 66 0 96 59 * <-- InBlendFrames = 3 frames
// 0 4 14 3 59 0 93 57 *
// 0 8 18 5 52 0 90 55 *
// 0 15 22 9 44 1 87 53
// 0 15 22 9 44 1 87 53
// 0 15 22 9 44 1 87 53 Use N (weight 8) for transition instead of AH (weight 2).
// 0 15 22 9 44 1 87 53 Since N is second phoneme, reverse the IN and OUT values.
// 0 11 17 8 47 1 98 56 * <-- (InBlendFrames-1) = (2-1) = 1 frames
// N
// 0 8 12 6 50 1 109 58 * <-- OutBlendFrames = 1
// 0 5 6 5 54 0 121 61
// 0 5 6 5 54 0 121 61
// 0 5 6 5 54 0 121 61
// 0 5 6 5 54 0 121 61
// 0 5 6 5 54 0 121 61
// 0 5 6 5 54 0 121 61
//
// Now, consider the reverse "NUS" (N AH S):
//
// flags ampl1 freq1 ampl2 freq2 ampl3 freq3 pitch
// ------------------------------------------------
// N
// 0 5 6 5 54 0 121 61
// 0 5 6 5 54 0 121 61
// 0 5 6 5 54 0 121 61
// 0 5 6 5 54 0 121 61
// 0 5 6 5 54 0 121 61
// 0 5 6 5 54 0 121 61 Use N (weight 8) for transition instead of AH (weight 2)
// 0 5 6 5 54 0 121 61 <-- (OutBlendFrames-1) = (1-1) = 0 frames
// AH
// 0 8 11 6 51 0 110 59 * <-- InBlendFrames = 2
// 0 11 16 8 48 0 99 56 *
// 0 15 22 9 44 1 87 53 Use S (weight 18) for transition instead of AH (weight 2)
// 0 15 22 9 44 1 87 53 Since S is second phoneme, reverse the IN and OUT values.
// 0 9 18 5 51 1 90 55 * <-- (InBlendFrames-1) = (3-1) = 2
// 0 4 14 3 58 1 93 57 *
// S
// 241 2 10 2 65 1 96 59 * <-- OutBlendFrames = 1
// 241 0 6 0 73 0 99 61
A = 0;
mem44 = 0;
mem49 = 0; // mem49 starts at as 0
X = 0;
while(1) //while No. 1
{
// get the current and following phoneme
Y = phonemeIndexOutput[X];
A = phonemeIndexOutput[X + 1];
X++;
// exit loop at end token
if(A == 255) break; //goto pos47970;
// get the ranking of each phoneme
X = A;
mem56 = blendRank[A];
A = blendRank[Y];
// compare the rank - lower rank value is stronger
if(A == mem56) {
// same rank, so use out blend lengths from each phoneme
phase1 = outBlendLength[Y];
phase2 = outBlendLength[X];
} else if(A < mem56) {
// first phoneme is stronger, so us it's blend lengths
phase1 = inBlendLength[X];
phase2 = outBlendLength[X];
} else {
// second phoneme is stronger, so use it's blend lengths
// note the out/in are swapped
phase1 = outBlendLength[Y];
phase2 = inBlendLength[Y];
}
Y = mem44;
A = mem49 + phonemeLengthOutput[mem44]; // A is mem49 + length
mem49 = A; // mem49 now holds length + position
A = A + phase2; //Maybe Problem because of carry flag
//47776: ADC 42
speedcounter = A;
mem47 = 168;
phase3 = mem49 - phase1; // what is mem49
A = phase1 + phase2; // total transition?
mem38 = A;
X = A;
X -= 2;
if((X & 128) == 0)
do //while No. 2
{
//pos47810:
// mem47 is used to index the tables:
// 168 pitches[]
// 169 frequency1
// 170 frequency2
// 171 frequency3
// 172 amplitude1
// 173 amplitude2
// 174 amplitude3
mem40 = mem38;
if(mem47 == 168) // pitch
{
// unlike the other values, the pitches[] interpolates from
// the middle of the current phoneme to the middle of the
// next phoneme
unsigned char mem36, mem37;
// half the width of the current phoneme
mem36 = phonemeLengthOutput[mem44] >> 1;
// half the width of the next phoneme
mem37 = phonemeLengthOutput[mem44 + 1] >> 1;
// sum the values
mem40 = mem36 + mem37; // length of both halves
mem37 += mem49; // center of next phoneme
mem36 = mem49 - mem36; // center index of current phoneme
A = Read(
mem47, mem37); // value at center of next phoneme - end interpolation value
//A = mem[address];
Y = mem36; // start index of interpolation
mem53 = A - Read(mem47, mem36); // value to center of current phoneme
} else {
// value to interpolate to
A = Read(mem47, speedcounter);
// position to start interpolation from
Y = phase3;
// value to interpolate from
mem53 = A - Read(mem47, phase3);
}
//Code47503(mem40);
// ML : Code47503 is division with remainder, and mem50 gets the sign
// calculate change per frame
signed char m53 = (signed char)mem53;
mem50 = mem53 & 128;
unsigned char m53abs = abs(m53);
mem51 = m53abs % mem40; //abs((char)m53) % mem40;
mem53 = (unsigned char)((signed char)(m53) / mem40);
// interpolation range
X = mem40; // number of frames to interpolate over
Y = phase3; // starting frame
// linearly interpolate values
mem56 = 0;
//47907: CLC
//pos47908:
while(1) //while No. 3
{
A = Read(mem47, Y) + mem53; //carry alway cleared
mem48 = A;
Y++;
X--;
if(X == 0) break;
mem56 += mem51;
if(mem56 >= mem40) //???
{
mem56 -= mem40; //carry? is set
//if ((mem56 & 128)==0)
if((mem50 & 128) == 0) {
//47935: BIT 50
//47937: BMI 47943
if(mem48 != 0) mem48++;
} else
mem48--;
}
//pos47945:
Write(mem47, Y, mem48);
} //while No. 3
//pos47952:
mem47++;
//if (mem47 != 175) goto pos47810;
} while(mem47 != 175); //while No. 2
//pos47963:
mem44++;
X = mem44;
} //while No. 1
//goto pos47701;
//pos47970:
// add the length of this phoneme
mem48 = mem49 + phonemeLengthOutput[mem44];
// ASSIGN PITCH CONTOUR
//
// This subtracts the F1 frequency from the pitch to create a
// pitch contour. Without this, the output would be at a single
// pitch level (monotone).
// don't adjust pitch if in sing mode
if(!singmode) {
// iterate through the buffer
for(i = 0; i < 256; i++) {
// subtract half the frequency of the formant 1.
// this adds variety to the voice
pitches[i] -= (frequency1[i] >> 1);
}
}
phase1 = 0;
phase2 = 0;
phase3 = 0;
mem49 = 0;
speedcounter = 72; //sam standard speed
// RESCALE AMPLITUDE
//
// Rescale volume from a linear scale to decibels.
//
//amplitude rescaling
for(i = 255; i >= 0; i--) {
amplitude1[i] = amplitudeRescale[amplitude1[i]];
amplitude2[i] = amplitudeRescale[amplitude2[i]];
amplitude3[i] = amplitudeRescale[amplitude3[i]];
}
Y = 0;
A = pitches[0];
mem44 = A;
X = A;
mem38 = A - (A >> 2); // 3/4*A ???
// PROCESS THE FRAMES
//
// In traditional vocal synthesis, the glottal pulse drives filters, which
// are attenuated to the frequencies of the formants.
//
// SAM generates these formants directly with sin and rectangular waves.
// To simulate them being driven by the glottal pulse, the waveforms are
// reset at the beginning of each glottal pulse.
//finally the loop for sound output
//pos48078:
while(1) {
// get the sampled information on the phoneme
A = sampledConsonantFlag[Y];
mem39 = A;
// unvoiced sampled phoneme?
A = A & 248;
if(A != 0) {
// render the sample for the phoneme
RenderSample(&mem66);
// skip ahead two in the phoneme buffer
Y += 2;
mem48 -= 2;
} else {
// simulate the glottal pulse and formants
unsigned char ary[5];
unsigned int p1 =
phase1 * 256; // Fixed point integers because we need to divide later on
unsigned int p2 = phase2 * 256;
unsigned int p3 = phase3 * 256;
int k;
for(k = 0; k < 5; k++) {
signed char sp1 = (signed char)sinus[0xff & (p1 >> 8)];
signed char sp2 = (signed char)sinus[0xff & (p2 >> 8)];
signed char rp3 = (signed char)rectangle[0xff & (p3 >> 8)];
signed int sin1 = sp1 * ((unsigned char)amplitude1[Y] & 0x0f);
signed int sin2 = sp2 * ((unsigned char)amplitude2[Y] & 0x0f);
signed int rect = rp3 * ((unsigned char)amplitude3[Y] & 0x0f);
signed int mux = sin1 + sin2 + rect;
mux /= 32;
mux += 128; // Go from signed to unsigned amplitude
ary[k] = mux;
p1 += frequency1[Y] * 256 / 4; // Compromise, this becomes a shift and works well
p2 += frequency2[Y] * 256 / 4;
p3 += frequency3[Y] * 256 / 4;
}
// output the accumulated value
Output8BitAry(0, ary);
speedcounter--;
if(speedcounter != 0) goto pos48155;
Y++; //go to next amplitude
// decrement the frame count
mem48--;
}
// if the frame count is zero, exit the loop
if(mem48 == 0) return;
speedcounter = speed;
pos48155:
// decrement the remaining length of the glottal pulse
mem44--;
// finished with a glottal pulse?
if(mem44 == 0) {
pos48159:
// fetch the next glottal pulse length
A = pitches[Y];
mem44 = A;
A = A - (A >> 2);
mem38 = A;
// reset the formant wave generators to keep them in
// sync with the glottal pulse
phase1 = 0;
phase2 = 0;
phase3 = 0;
continue;
}
// decrement the count
mem38--;
// is the count non-zero and the sampled flag is zero?
if((mem38 != 0) || (mem39 == 0)) {
// reset the phase of the formants to match the pulse
phase1 += frequency1[Y];
phase2 += frequency2[Y];
phase3 += frequency3[Y];
continue;
}
// voiced sampled phonemes interleave the sample with the
// glottal pulse. The sample flag is non-zero, so render
// the sample for the phoneme.
RenderSample(&mem66);
goto pos48159;
} //while
// The following code is never reached. It's left over from when
// the voiced sample code was part of this loop, instead of part
// of RenderSample();
//pos48315:
int tempA;
phase1 = A ^ 255;
Y = mem66;
do {
//pos48321:
mem56 = 8;
A = Read(mem47, Y);
//pos48327:
do {
//48327: ASL A
//48328: BCC 48337
tempA = A;
A = A << 1;
if((tempA & 128) != 0) {
X = 26;
// mem[54296] = X;
bufferpos += 150;
//
//
// buffer[bufferpos / 50] = (X & 15) * 16;
//
//
} else {
//mem[54296] = 6;
X = 6;
bufferpos += 150;
//
// buffer[bufferpos / 50] = (X & 15) * 16;
//
//
}
for(X = wait2; X > 0; X--)
; //wait
mem56--;
} while(mem56 != 0);
Y++;
phase1++;
} while(phase1 != 0);
// if (phase1 != 0) goto pos48321;
A = 1;
mem44 = 1;
mem66 = Y;
Y = mem49;
return;
}
// Create a rising or falling inflection 30 frames prior to
// index X. A rising inflection is used for questions, and
// a falling inflection is used for statements.
void STM32SAM::AddInflection(unsigned char mem48, unsigned char phase1) {
//pos48372:
// mem48 = 255;
//pos48376:
// store the location of the punctuation
mem49 = X;
A = X;
int Atemp = A;
// backup 30 frames
A = A - 30;
// if index is before buffer, point to start of buffer
if(Atemp <= 30) A = 0;
X = A;
// FIXME: Explain this fix better, it's not obvious
// ML : A =, fixes a problem with invalid pitch with '.'
while((A = pitches[X]) == 127) X++;
pos48398:
//48398: CLC
//48399: ADC 48
// add the inflection direction
A += mem48;
phase1 = A;
// set the inflection
pitches[X] = A;
pos48406:
// increment the position
X++;
// exit if the punctuation has been reached
if(X == mem49) return; //goto pos47615;
if(pitches[X] == 255) goto pos48406;
A = phase1;
goto pos48398;
}
/*
SAM's voice can be altered by changing the frequencies of the
mouth formant (F1) and the throat formant (F2). Only the voiced
phonemes (5-29 and 48-53) are altered.
*/
void STM32SAM::SetMouthThroat() {
unsigned char initialFrequency;
unsigned char newFrequency = 0;
//unsigned char mouth; //mem38880
//unsigned char throat; //mem38881
// mouth formants (F1) 5..29
unsigned char mouthFormants5_29[30] = {0, 0, 0, 0, 0, 10, 14, 19, 24, 27,
23, 21, 16, 20, 14, 18, 14, 18, 18, 16,
13, 15, 11, 18, 14, 11, 9, 6, 6, 6};
// throat formants (F2) 5..29
unsigned char throatFormants5_29[30] = {255, 255, 255, 255, 255, 84, 73, 67, 63, 40,
44, 31, 37, 45, 73, 49, 36, 30, 51, 37,
29, 69, 24, 50, 30, 24, 83, 46, 54, 86};
// there must be no zeros in this 2 tables
// formant 1 frequencies (mouth) 48..53
unsigned char mouthFormants48_53[6] = {19, 27, 21, 27, 18, 13};
// formant 2 frequencies (throat) 48..53
unsigned char throatFormants48_53[6] = {72, 39, 31, 43, 30, 34};
unsigned char pos = 5; //mem39216
//pos38942:
// recalculate formant frequencies 5..29 for the mouth (F1) and throat (F2)
while(pos != 30) {
// recalculate mouth frequency
initialFrequency = mouthFormants5_29[pos];
if(initialFrequency != 0) newFrequency = trans(mouth, initialFrequency);
freq1data[pos] = newFrequency;
// recalculate throat frequency
initialFrequency = throatFormants5_29[pos];
if(initialFrequency != 0) newFrequency = trans(throat, initialFrequency);
freq2data[pos] = newFrequency;
pos++;
}
//pos39059:
// recalculate formant frequencies 48..53
pos = 48;
Y = 0;
while(pos != 54) {
// recalculate F1 (mouth formant)
initialFrequency = mouthFormants48_53[Y];
newFrequency = trans(mouth, initialFrequency);
freq1data[pos] = newFrequency;
// recalculate F2 (throat formant)
initialFrequency = throatFormants48_53[Y];
newFrequency = trans(throat, initialFrequency);
freq2data[pos] = newFrequency;
Y++;
pos++;
}
}
//return = (mem39212*mem39213) >> 1
unsigned char STM32SAM::trans(unsigned char mem39212, unsigned char mem39213) {
//pos39008:
unsigned char carry;
int temp;
unsigned char mem39214, mem39215;
A = 0;
mem39215 = 0;
mem39214 = 0;
X = 8;
do {
carry = mem39212 & 1;
mem39212 = mem39212 >> 1;
if(carry != 0) {
/*
39018: LSR 39212
39021: BCC 39033
*/
carry = 0;
A = mem39215;
temp = (int)A + (int)mem39213;
A = A + mem39213;
if(temp > 255) carry = 1;
mem39215 = A;
}
temp = mem39215 & 1;
mem39215 = (mem39215 >> 1) | (carry ? 128 : 0);
carry = temp;
//39033: ROR 39215
X--;
} while(X != 0);
temp = mem39214 & 128;
mem39214 = (mem39214 << 1) | (carry ? 1 : 0);
carry = temp;
temp = mem39215 & 128;
mem39215 = (mem39215 << 1) | (carry ? 1 : 0);
carry = temp;
return mem39215;
}
////////////////////////////////////////////////////////////////////////////////////////////
//
// Sam
//
////////////////////////////////////////////////////////////////////////////////////////////
//char input[]={"/HAALAOAO MAYN NAAMAEAE IHSTT SAEBAASTTIHAAN \x9b\x9b\0"};
//unsigned char input[]={"/HAALAOAO \x9b\0"};
//unsigned char input[]={"AA \x9b\0"};
//unsigned char input[] = {"GUH5DEHN TAEG\x9b\0"};
//unsigned char input[]={"AY5 AEM EY TAO4LXKIHNX KAX4MPYUX4TAH. GOW4 AH/HEH3D PAHNK.MEYK MAY8 DEY.\x9b\0"};
//unsigned char input[]={"/HEH3LOW2, /HAW AH YUX2 TUXDEY. AY /HOH3P YUX AH FIYLIHNX OW4 KEY.\x9b\0"};
//unsigned char input[]={"/HEY2, DHIHS IH3Z GREY2T. /HAH /HAH /HAH.AYL BIY5 BAEK.\x9b\0"};
//unsigned char input[]={"/HAH /HAH /HAH \x9b\0"};
//unsigned char input[]={"/HAH /HAH /HAH.\x9b\0"};
//unsigned char input[]={".TUW BIY5Y3,, OHR NAA3T - TUW BIY5IYIY., DHAE4T IHZ DHAH KWEH4SCHAHN.\x9b\0"};
//unsigned char input[]={"/HEY2, DHIHS \x9b\0"};
//unsigned char input[]={" IYIHEHAEAAAHAOOHUHUXERAXIX \x9b\0"};
//unsigned char input[]={" RLWWYMNNXBDGJZZHVDH \x9b\0"};
//unsigned char input[]={" SSHFTHPTKCH/H \x9b\0"};
//unsigned char input[]={" EYAYOYAWOWUW ULUMUNQ YXWXRXLX/XDX\x9b\0"};
void STM32SAM::SetInput(char* _input) {
int i, l;
l = strlen(_input);
if(l > 254) l = 254;
for(i = 0; i < l; i++) {
input[i] = _input[i];
}
input[l] = 0;
}
// 168=pitches
// 169=frequency1
// 170=frequency2
// 171=frequency3
// 172=amplitude1
// 173=amplitude2
// 174=amplitude3
void STM32SAM::Init() {
bufferpos = 0;
int i;
SetMouthThroat();
bufferpos = 0;
// TODO, check for free the memory, 10 seconds of output should be more than enough
//buffer = malloc(22050*10);
// buffer = (char*) calloc(1, sizeof(char));
/*
freq2data = &mem[45136];
freq1data = &mem[45056];
freq3data = &mem[45216];
*/
//pitches = &mem[43008];
/*
frequency1 = &mem[43264];
frequency2 = &mem[43520];
frequency3 = &mem[43776];
*/
/*
amplitude1 = &mem[44032];
amplitude2 = &mem[44288];
amplitude3 = &mem[44544];
*/
//phoneme = &mem[39904];
/*
ampl1data = &mem[45296];
ampl2data = &mem[45376];
ampl3data = &mem[45456];
*/
for(i = 0; i < 256; i++) {
stress[i] = 0;
phonemeLength[i] = 0;
}
for(i = 0; i < 60; i++) {
phonemeIndexOutput[i] = 0;
stressOutput[i] = 0;
phonemeLengthOutput[i] = 0;
}
phonemeindex[255] =
255; //to prevent buffer overflow // ML : changed from 32 to 255 to stop freezing with long inputs
}
//int Code39771()
int STM32SAM::SAMMain() {
Init();
phonemeindex[255] = 32; //to prevent buffer overflow
if(!Parser1()) {
return 0;
}
Parser2();
CopyStress();
SetPhonemeLength();
AdjustLengths();
Code41240();
do {
A = phonemeindex[X];
if(A > 80) {
phonemeindex[X] = 255;
break; // error: delete all behind it
}
X++;
} while(X != 0);
//pos39848:
InsertBreath();
//mem[40158] = 255;
PrepareOutput();
return 1;
}
//void Code48547()
void STM32SAM::PrepareOutput() {
A = 0;
X = 0;
Y = 0;
//pos48551:
while(1) {
A = phonemeindex[X];
if(A == 255) {
A = 255;
phonemeIndexOutput[Y] = 255;
Render();
return;
}
if(A == 254) {
X++;
int temp = X;
//mem[48546] = X;
phonemeIndexOutput[Y] = 255;
Render();
//X = mem[48546];
X = temp;
Y = 0;
continue;
}
if(A == 0) {
X++;
continue;
}
phonemeIndexOutput[Y] = A;
phonemeLengthOutput[Y] = phonemeLength[X];
stressOutput[Y] = stress[X];
X++;
Y++;
}
}
//void Code41014()
void STM32SAM::Insert(
unsigned char position /*var57*/,
unsigned char mem60,
unsigned char mem59,
unsigned char mem58) {
int i;
for(i = 253; i >= position; i--) // ML : always keep last safe-guarding 255
{
phonemeindex[i + 1] = phonemeindex[i];
phonemeLength[i + 1] = phonemeLength[i];
stress[i + 1] = stress[i];
}
phonemeindex[position] = mem60;
phonemeLength[position] = mem59;
stress[position] = mem58;
return;
}
//void Code48431()
void STM32SAM::InsertBreath() {
unsigned char mem54;
unsigned char mem55;
unsigned char index; //variable Y
mem54 = 255;
X++;
mem55 = 0;
unsigned char mem66 = 0;
while(1) {
//pos48440:
X = mem66;
index = phonemeindex[X];
if(index == 255) return;
mem55 += phonemeLength[X];
if(mem55 < 232) {
if(index != 254) // ML : Prevents an index out of bounds problem
{
A = flags2[index] & 1;
if(A != 0) {
X++;
mem55 = 0;
Insert(X, 254, mem59, 0);
mem66++;
mem66++;
continue;
}
}
if(index == 0) mem54 = X;
mem66++;
continue;
}
X = mem54;
phonemeindex[X] = 31; // 'Q*' glottal stop
phonemeLength[X] = 4;
stress[X] = 0;
X++;
mem55 = 0;
Insert(X, 254, mem59, 0);
X++;
mem66 = X;
}
}
// Iterates through the phoneme buffer, copying the stress value from
// the following phoneme under the following circumstance:
// 1. The current phoneme is voiced, excluding plosives and fricatives
// 2. The following phoneme is voiced, excluding plosives and fricatives, and
// 3. The following phoneme is stressed
//
// In those cases, the stress value+1 from the following phoneme is copied.
//
// For example, the word LOITER is represented as LOY5TER, with as stress
// of 5 on the diphtong OY. This routine will copy the stress value of 6 (5+1)
// to the L that precedes it.
//void Code41883()
void STM32SAM::CopyStress() {
// loop thought all the phonemes to be output
unsigned char pos = 0; //mem66
while(1) {
// get the phomene
Y = phonemeindex[pos];
// exit at end of buffer
if(Y == 255) return;
// if CONSONANT_FLAG set, skip - only vowels get stress
if((flags[Y] & 64) == 0) {
pos++;
continue;
}
// get the next phoneme
Y = phonemeindex[pos + 1];
if(Y == 255) //prevent buffer overflow
{
pos++;
continue;
} else
// if the following phoneme is a vowel, skip
if((flags[Y] & 128) == 0) {
pos++;
continue;
}
// get the stress value at the next position
Y = stress[pos + 1];
// if next phoneme is not stressed, skip
if(Y == 0) {
pos++;
continue;
}
// if next phoneme is not a VOWEL OR ER, skip
if((Y & 128) != 0) {
pos++;
continue;
}
// copy stress from prior phoneme to this one
stress[pos] = Y + 1;
// advance pointer
pos++;
}
}
// The input[] buffer contains a string of phonemes and stress markers along
// the lines of:
//
// DHAX KAET IHZ AH5GLIY. <0x9B>
//
// The byte 0x9B marks the end of the buffer. Some phonemes are 2 bytes
// long, such as "DH" and "AX". Others are 1 byte long, such as "T" and "Z".
// There are also stress markers, such as "5" and ".".
//
// The first character of the phonemes are stored in the table signInputTable1[].
// The second character of the phonemes are stored in the table signInputTable2[].
// The stress characters are arranged in low to high stress order in stressInputTable[].
//
// The following process is used to parse the input[] buffer:
//
// Repeat until the <0x9B> character is reached:
//
// First, a search is made for a 2 character match for phonemes that do not
// end with the '*' (wildcard) character. On a match, the index of the phoneme
// is added to phonemeIndex[] and the buffer position is advanced 2 bytes.
//
// If this fails, a search is made for a 1 character match against all
// phoneme names ending with a '*' (wildcard). If this succeeds, the
// phoneme is added to phonemeIndex[] and the buffer position is advanced
// 1 byte.
//
// If this fails, search for a 1 character match in the stressInputTable[].
// If this succeeds, the stress value is placed in the last stress[] table
// at the same index of the last added phoneme, and the buffer position is
// advanced by 1 byte.
//
// If this fails, return a 0.
//
// On success:
//
// 1. phonemeIndex[] will contain the index of all the phonemes.
// 2. The last index in phonemeIndex[] will be 255.
// 3. stress[] will contain the stress value for each phoneme
// input[] holds the string of phonemes, each two bytes wide
// signInputTable1[] holds the first character of each phoneme
// signInputTable2[] holds te second character of each phoneme
// phonemeIndex[] holds the indexes of the phonemes after parsing input[]
//
// The parser scans through the input[], finding the names of the phonemes
// by searching signInputTable1[] and signInputTable2[]. On a match, it
// copies the index of the phoneme into the phonemeIndexTable[].
//
// The character <0x9B> marks the end of text in input[]. When it is reached,
// the index 255 is placed at the end of the phonemeIndexTable[], and the
// function returns with a 1 indicating success.
int STM32SAM::Parser1() {
int i;
unsigned char sign1;
unsigned char sign2;
unsigned char position = 0;
X = 0;
A = 0;
Y = 0;
// CLEAR THE STRESS TABLE
for(i = 0; i < 256; i++) stress[i] = 0;
// THIS CODE MATCHES THE PHONEME LETTERS TO THE TABLE
// pos41078:
while(1) {
// GET THE FIRST CHARACTER FROM THE PHONEME BUFFER
sign1 = input[X];
// TEST FOR 155 () END OF LINE MARKER
if(sign1 == 155) {
// MARK ENDPOINT AND RETURN
phonemeindex[position] = 255; //mark endpoint
// REACHED END OF PHONEMES, SO EXIT
return 1; //all ok
}
// GET THE NEXT CHARACTER FROM THE BUFFER
X++;
sign2 = input[X];
// NOW sign1 = FIRST CHARACTER OF PHONEME, AND sign2 = SECOND CHARACTER OF PHONEME
// TRY TO MATCH PHONEMES ON TWO TWO-CHARACTER NAME
// IGNORE PHONEMES IN TABLE ENDING WITH WILDCARDS
// SET INDEX TO 0
Y = 0;
pos41095:
// GET FIRST CHARACTER AT POSITION Y IN signInputTable
// --> should change name to PhonemeNameTable1
A = signInputTable1[Y];
// FIRST CHARACTER MATCHES?
if(A == sign1) {
// GET THE CHARACTER FROM THE PhonemeSecondLetterTable
A = signInputTable2[Y];
// NOT A SPECIAL AND MATCHES SECOND CHARACTER?
if((A != '*') && (A == sign2)) {
// STORE THE INDEX OF THE PHONEME INTO THE phomeneIndexTable
phonemeindex[position] = Y;
// ADVANCE THE POINTER TO THE phonemeIndexTable
position++;
// ADVANCE THE POINTER TO THE phonemeInputBuffer
X++;
// CONTINUE PARSING
continue;
}
}
// NO MATCH, TRY TO MATCH ON FIRST CHARACTER TO WILDCARD NAMES (ENDING WITH '*')
// ADVANCE TO THE NEXT POSITION
Y++;
// IF NOT END OF TABLE, CONTINUE
if(Y != 81) goto pos41095;
// REACHED END OF TABLE WITHOUT AN EXACT (2 CHARACTER) MATCH.
// THIS TIME, SEARCH FOR A 1 CHARACTER MATCH AGAINST THE WILDCARDS
// RESET THE INDEX TO POINT TO THE START OF THE PHONEME NAME TABLE
Y = 0;
pos41134:
// DOES THE PHONEME IN THE TABLE END WITH '*'?
if(signInputTable2[Y] == '*') {
// DOES THE FIRST CHARACTER MATCH THE FIRST LETTER OF THE PHONEME
if(signInputTable1[Y] == sign1) {
// SAVE THE POSITION AND MOVE AHEAD
phonemeindex[position] = Y;
// ADVANCE THE POINTER
position++;
// CONTINUE THROUGH THE LOOP
continue;
}
}
Y++;
if(Y != 81) goto pos41134; //81 is size of PHONEME NAME table
// FAILED TO MATCH WITH A WILDCARD. ASSUME THIS IS A STRESS
// CHARACTER. SEARCH THROUGH THE STRESS TABLE
// SET INDEX TO POSITION 8 (END OF STRESS TABLE)
Y = 8;
// WALK BACK THROUGH TABLE LOOKING FOR A MATCH
while((sign1 != stressInputTable[Y]) && (Y > 0)) {
// DECREMENT INDEX
Y--;
}
// REACHED THE END OF THE SEARCH WITHOUT BREAKING OUT OF LOOP?
if(Y == 0) {
//mem[39444] = X;
//41181: JSR 42043 //Error
// FAILED TO MATCH ANYTHING, RETURN 0 ON FAILURE
return 0;
}
// SET THE STRESS FOR THE PRIOR PHONEME
stress[position - 1] = Y;
} //while
}
//change phonemelength depedendent on stress
//void Code41203()
void STM32SAM::SetPhonemeLength() {
unsigned char A;
int position = 0;
while(phonemeindex[position] != 255) {
A = stress[position];
//41218: BMI 41229
if((A == 0) || ((A & 128) != 0)) {
phonemeLength[position] = phonemeLengthTable[phonemeindex[position]];
} else {
phonemeLength[position] = phonemeStressedLengthTable[phonemeindex[position]];
}
position++;
}
}
void STM32SAM::Code41240() {
unsigned char pos = 0;
while(phonemeindex[pos] != 255) {
unsigned char index; //register AC
X = pos;
index = phonemeindex[pos];
if((flags[index] & 2) == 0) {
pos++;
continue;
} else if((flags[index] & 1) == 0) {
Insert(pos + 1, index + 1, phonemeLengthTable[index + 1], stress[pos]);
Insert(pos + 2, index + 2, phonemeLengthTable[index + 2], stress[pos]);
pos += 3;
continue;
}
do {
X++;
A = phonemeindex[X];
} while(A == 0);
if(A != 255) {
if((flags[A] & 8) != 0) {
pos++;
continue;
}
if((A == 36) || (A == 37)) {
pos++; // '/H' '/X'
continue;
}
}
Insert(pos + 1, index + 1, phonemeLengthTable[index + 1], stress[pos]);
Insert(pos + 2, index + 2, phonemeLengthTable[index + 2], stress[pos]);
pos += 3;
};
}
// Rewrites the phonemes using the following rules:
//
// <DIPHTONG ENDING WITH WX> -> <DIPHTONG ENDING WITH WX> WX
// <DIPHTONG NOT ENDING WITH WX> -> <DIPHTONG NOT ENDING WITH WX> YX
// UL -> AX L
// UM -> AX M
// <STRESSED VOWEL> <SILENCE> <STRESSED VOWEL> -> <STRESSED VOWEL> <SILENCE> Q <VOWEL>
// T R -> CH R
// D R -> J R
// <VOWEL> R -> <VOWEL> RX
// <VOWEL> L -> <VOWEL> LX
// G S -> G Z
// K <VOWEL OR DIPHTONG NOT ENDING WITH IY> -> KX <VOWEL OR DIPHTONG NOT ENDING WITH IY>
// G <VOWEL OR DIPHTONG NOT ENDING WITH IY> -> GX <VOWEL OR DIPHTONG NOT ENDING WITH IY>
// S P -> S B
// S T -> S D
// S K -> S G
// S KX -> S GX
// <ALVEOLAR> UW -> <ALVEOLAR> UX
// CH -> CH CH' (CH requires two phonemes to represent it)
// J -> J J' (J requires two phonemes to represent it)
// <UNSTRESSED VOWEL> T <PAUSE> -> <UNSTRESSED VOWEL> DX <PAUSE>
// <UNSTRESSED VOWEL> D <PAUSE> -> <UNSTRESSED VOWEL> DX <PAUSE>
//void Code41397()
void STM32SAM::Parser2() {
unsigned char pos = 0; //mem66;
unsigned char mem58 = 0;
// Loop through phonemes
while(1) {
// SET X TO THE CURRENT POSITION
X = pos;
// GET THE PHONEME AT THE CURRENT POSITION
A = phonemeindex[pos];
// Is phoneme pause?
if(A == 0) {
// Move ahead to the
pos++;
continue;
}
// If end of phonemes flag reached, exit routine
if(A == 255) return;
// Copy the current phoneme index to Y
Y = A;
// RULE:
// <DIPHTONG ENDING WITH WX> -> <DIPHTONG ENDING WITH WX> WX
// <DIPHTONG NOT ENDING WITH WX> -> <DIPHTONG NOT ENDING WITH WX> YX
// Example: OIL, COW
// Check for DIPHTONG
if((flags[A] & 16) == 0) goto pos41457;
// Not a diphthong. Get the stress
mem58 = stress[pos];
// End in IY sound?
A = flags[Y] & 32;
// If ends with IY, use YX, else use WX
if(A == 0)
A = 20;
else
A = 21; // 'WX' = 20 'YX' = 21
//pos41443:
// Insert at WX or YX following, copying the stress
Insert(pos + 1, A, mem59, mem58);
X = pos;
// Jump to ???
goto pos41749;
pos41457:
// RULE:
// UL -> AX L
// Example: MEDDLE
// Get phoneme
A = phonemeindex[X];
// Skip this rule if phoneme is not UL
if(A != 78) goto pos41487; // 'UL'
A = 24; // 'L' //change 'UL' to 'AX L'
pos41466:
// Get current phoneme stress
mem58 = stress[X];
// Change UL to AX
phonemeindex[X] = 13; // 'AX'
// Perform insert. Note code below may jump up here with different values
Insert(X + 1, A, mem59, mem58);
pos++;
// Move to next phoneme
continue;
pos41487:
// RULE:
// UM -> AX M
// Example: ASTRONOMY
// Skip rule if phoneme != UM
if(A != 79) goto pos41495; // 'UM'
// Jump up to branch - replaces current phoneme with AX and continues
A = 27; // 'M' //change 'UM' to 'AX M'
goto pos41466;
pos41495:
// RULE:
// UN -> AX N
// Example: FUNCTION
// Skip rule if phoneme != UN
if(A != 80) goto pos41503; // 'UN'
// Jump up to branch - replaces current phoneme with AX and continues
A = 28; // 'N' //change UN to 'AX N'
goto pos41466;
pos41503:
// RULE:
// <STRESSED VOWEL> <SILENCE> <STRESSED VOWEL> -> <STRESSED VOWEL> <SILENCE> Q <VOWEL>
// EXAMPLE: AWAY EIGHT
Y = A;
// VOWEL set?
A = flags[A] & 128;
// Skip if not a vowel
if(A != 0) {
// Get the stress
A = stress[X];
// If stressed...
if(A != 0) {
// Get the following phoneme
X++;
A = phonemeindex[X];
// If following phoneme is a pause
if(A == 0) {
// Get the phoneme following pause
X++;
Y = phonemeindex[X];
// Check for end of buffer flag
if(Y == 255) //buffer overflow
// ??? Not sure about these flags
A = 65 & 128;
else
// And VOWEL flag to current phoneme's flags
A = flags[Y] & 128;
// If following phonemes is not a pause
if(A != 0) {
// If the following phoneme is not stressed
A = stress[X];
if(A != 0) {
// 31 = 'Q'
Insert(X, 31, mem59, 0);
pos++;
continue;
}
}
}
}
}
// RULES FOR PHONEMES BEFORE R
// T R -> CH R
// Example: TRACK
// Get current position and phoneme
X = pos;
A = phonemeindex[pos];
if(A != 23) goto pos41611; // 'R'
// Look at prior phoneme
X--;
A = phonemeindex[pos - 1];
//pos41567:
if(A == 69) // 'T'
{
phonemeindex[pos - 1] = 42;
goto pos41779;
}
// RULES FOR PHONEMES BEFORE R
// D R -> J R
// Example: DRY
// Prior phonemes D?
if(A == 57) // 'D'
{
// Change D to J
phonemeindex[pos - 1] = 44;
goto pos41788;
}
// RULES FOR PHONEMES BEFORE R
// <VOWEL> R -> <VOWEL> RX
// Example: ART
// If vowel flag is set change R to RX
A = flags[A] & 128;
if(A != 0) phonemeindex[pos] = 18; // 'RX'
// continue to next phoneme
pos++;
continue;
pos41611:
// RULE:
// <VOWEL> L -> <VOWEL> LX
// Example: ALL
// Is phoneme L?
if(A == 24) // 'L'
{
// If prior phoneme does not have VOWEL flag set, move to next phoneme
if((flags[phonemeindex[pos - 1]] & 128) == 0) {
pos++;
continue;
}
// Prior phoneme has VOWEL flag set, so change L to LX and move to next phoneme
phonemeindex[X] = 19; // 'LX'
pos++;
continue;
}
// RULE:
// G S -> G Z
//
// Can't get to fire -
// 1. The G -> GX rule intervenes
// 2. Reciter already replaces GS -> GZ
// Is current phoneme S?
if(A == 32) // 'S'
{
// If prior phoneme is not G, move to next phoneme
if(phonemeindex[pos - 1] != 60) {
pos++;
continue;
}
// Replace S with Z and move on
phonemeindex[pos] = 38; // 'Z'
pos++;
continue;
}
// RULE:
// K <VOWEL OR DIPHTONG NOT ENDING WITH IY> -> KX <VOWEL OR DIPHTONG NOT ENDING WITH IY>
// Example: COW
// Is current phoneme K?
if(A == 72) // 'K'
{
// Get next phoneme
Y = phonemeindex[pos + 1];
// If at end, replace current phoneme with KX
if(Y == 255)
phonemeindex[pos] = 75; // ML : prevents an index out of bounds problem
else {
// VOWELS AND DIPHTONGS ENDING WITH IY SOUND flag set?
A = flags[Y] & 32;
// Replace with KX
if(A == 0) phonemeindex[pos] = 75; // 'KX'
}
} else
// RULE:
// G <VOWEL OR DIPHTONG NOT ENDING WITH IY> -> GX <VOWEL OR DIPHTONG NOT ENDING WITH IY>
// Example: GO
// Is character a G?
if(A == 60) // 'G'
{
// Get the following character
unsigned char index = phonemeindex[pos + 1];
// At end of buffer?
if(index == 255) //prevent buffer overflow
{
pos++;
continue;
} else
// If diphtong ending with YX, move continue processing next phoneme
if((flags[index] & 32) != 0) {
pos++;
continue;
}
// replace G with GX and continue processing next phoneme
phonemeindex[pos] = 63; // 'GX'
pos++;
continue;
}
// RULE:
// S P -> S B
// S T -> S D
// S K -> S G
// S KX -> S GX
// Examples: SPY, STY, SKY, SCOWL
Y = phonemeindex[pos];
//pos41719:
// Replace with softer version?
A = flags[Y] & 1;
if(A == 0) goto pos41749;
A = phonemeindex[pos - 1];
if(A != 32) // 'S'
{
A = Y;
goto pos41812;
}
// Replace with softer version
phonemeindex[pos] = Y - 12;
pos++;
continue;
pos41749:
// RULE:
// <ALVEOLAR> UW -> <ALVEOLAR> UX
//
// Example: NEW, DEW, SUE, ZOO, THOO, TOO
// UW -> UX
A = phonemeindex[X];
if(A == 53) // 'UW'
{
// ALVEOLAR flag set?
Y = phonemeindex[X - 1];
A = flags2[Y] & 4;
// If not set, continue processing next phoneme
if(A == 0) {
pos++;
continue;
}
phonemeindex[X] = 16;
pos++;
continue;
}
pos41779:
// RULE:
// CH -> CH CH' (CH requires two phonemes to represent it)
// Example: CHEW
if(A == 42) // 'CH'
{
// pos41783:
Insert(X + 1, A + 1, mem59, stress[X]);
pos++;
continue;
}
pos41788:
// RULE:
// J -> J J' (J requires two phonemes to represent it)
// Example: JAY
if(A == 44) // 'J'
{
Insert(X + 1, A + 1, mem59, stress[X]);
pos++;
continue;
}
// Jump here to continue
pos41812:
// RULE: Soften T following vowel
// NOTE: This rule fails for cases such as "ODD"
// <UNSTRESSED VOWEL> T <PAUSE> -> <UNSTRESSED VOWEL> DX <PAUSE>
// <UNSTRESSED VOWEL> D <PAUSE> -> <UNSTRESSED VOWEL> DX <PAUSE>
// Example: PARTY, TARDY
// Past this point, only process if phoneme is T or D
if(A != 69) // 'T'
if(A != 57) {
pos++; // 'D'
continue;
}
//pos41825:
// If prior phoneme is not a vowel, continue processing phonemes
if((flags[phonemeindex[X - 1]] & 128) == 0) {
pos++;
continue;
}
// Get next phoneme
X++;
A = phonemeindex[X];
//pos41841
// Is the next phoneme a pause?
if(A != 0) {
// If next phoneme is not a pause, continue processing phonemes
if((flags[A] & 128) == 0) {
pos++;
continue;
}
// If next phoneme is stressed, continue processing phonemes
// FIXME: How does a pause get stressed?
if(stress[X] != 0) {
pos++;
continue;
}
//pos41856:
// Set phonemes to DX
phonemeindex[pos] = 30; // 'DX'
} else {
A = phonemeindex[X + 1];
if(A == 255) //prevent buffer overflow
A = 65 & 128;
else
// Is next phoneme a vowel or ER?
A = flags[A] & 128;
if(A != 0) phonemeindex[pos] = 30; // 'DX'
}
pos++;
} // while
} // parser 2
// Applies various rules that adjust the lengths of phonemes
//
// Lengthen <FRICATIVE> or <VOICED> between <VOWEL> and <PUNCTUATION> by 1.5
// <VOWEL> <RX | LX> <CONSONANT> - decrease <VOWEL> length by 1
// <VOWEL> <UNVOICED PLOSIVE> - decrease vowel by 1/8th
// <VOWEL> <UNVOICED CONSONANT> - increase vowel by 1/2 + 1
// <NASAL> <STOP CONSONANT> - set nasal = 5, consonant = 6
// <VOICED STOP CONSONANT> {optional silence} <STOP CONSONANT> - shorten both to 1/2 + 1
// <LIQUID CONSONANT> <DIPHTONG> - decrease by 2
//void Code48619()
void STM32SAM::AdjustLengths() {
// LENGTHEN VOWELS PRECEDING PUNCTUATION
//
// Search for punctuation. If found, back up to the first vowel, then
// process all phonemes between there and up to (but not including) the punctuation.
// If any phoneme is found that is a either a fricative or voiced, the duration is
// increased by (length * 1.5) + 1
// loop index
X = 0;
unsigned char index;
// iterate through the phoneme list
unsigned char loopIndex = 0;
while(1) {
// get a phoneme
index = phonemeindex[X];
// exit loop if end on buffer token
if(index == 255) break;
// not punctuation?
if((flags2[index] & 1) == 0) {
// skip
X++;
continue;
}
// hold index
loopIndex = X;
// Loop backwards from this point
pos48644:
// back up one phoneme
X--;
// stop once the beginning is reached
if(X == 0) break;
// get the preceding phoneme
index = phonemeindex[X];
if(index != 255) //inserted to prevent access overrun
if((flags[index] & 128) == 0) goto pos48644; // if not a vowel, continue looping
//pos48657:
do {
// test for vowel
index = phonemeindex[X];
if(index != 255) //inserted to prevent access overrun
// test for fricative/unvoiced or not voiced
if(((flags2[index] & 32) == 0) || ((flags[index] & 4) != 0)) //nochmal berprfen
{
//A = flags[Y] & 4;
//if(A == 0) goto pos48688;
// get the phoneme length
A = phonemeLength[X];
// change phoneme length to (length * 1.5) + 1
A = (A >> 1) + A + 1;
phonemeLength[X] = A;
}
// keep moving forward
X++;
} while(X != loopIndex);
// if (X != loopIndex) goto pos48657;
X++;
} // while
// Similar to the above routine, but shorten vowels under some circumstances
// Loop throught all phonemes
loopIndex = 0;
//pos48697
while(1) {
// get a phoneme
X = loopIndex;
index = phonemeindex[X];
// exit routine at end token
if(index == 255) return;
// vowel?
A = flags[index] & 128;
if(A != 0) {
// get next phoneme
X++;
index = phonemeindex[X];
// get flags
if(index == 255)
mem56 = 65; // use if end marker
else
mem56 = flags[index];
// not a consonant
if((flags[index] & 64) == 0) {
// RX or LX?
if((index == 18) || (index == 19)) // 'RX' & 'LX'
{
// get the next phoneme
X++;
index = phonemeindex[X];
// next phoneme a consonant?
if((flags[index] & 64) != 0) {
// RULE: <VOWEL> RX | LX <CONSONANT>
// decrease length of vowel by 1 frame
phonemeLength[loopIndex]--;
}
// move ahead
loopIndex++;
continue;
}
// move ahead
loopIndex++;
continue;
}
// Got here if not <VOWEL>
// not voiced
if((mem56 & 4) == 0) {
// Unvoiced
// *, .*, ?*, ,*, -*, DX, S*, SH, F*, TH, /H, /X, CH, P*, T*, K*, KX
// not an unvoiced plosive?
if((mem56 & 1) == 0) {
// move ahead
loopIndex++;
continue;
}
// P*, T*, K*, KX
// RULE: <VOWEL> <UNVOICED PLOSIVE>
// <VOWEL> <P*, T*, K*, KX>
// move back
X--;
// decrease length by 1/8th
mem56 = phonemeLength[X] >> 3;
phonemeLength[X] -= mem56;
// move ahead
loopIndex++;
continue;
}
// RULE: <VOWEL> <VOICED CONSONANT>
// <VOWEL> <WH, R*, L*, W*, Y*, M*, N*, NX, DX, Q*, Z*, ZH, V*, DH, J*, B*, D*, G*, GX>
// decrease length
A = phonemeLength[X - 1];
phonemeLength[X - 1] = (A >> 2) + A + 1; // 5/4*A + 1
// move ahead
loopIndex++;
continue;
}
// WH, R*, L*, W*, Y*, M*, N*, NX, Q*, Z*, ZH, V*, DH, J*, B*, D*, G*, GX
//pos48821:
// RULE: <NASAL> <STOP CONSONANT>
// Set punctuation length to 6
// Set stop consonant length to 5
// nasal?
if((flags2[index] & 8) != 0) {
// M*, N*, NX,
// get the next phoneme
X++;
index = phonemeindex[X];
// end of buffer?
if(index == 255)
A = 65 & 2; //prevent buffer overflow
else
A = flags[index] & 2; // check for stop consonant
// is next phoneme a stop consonant?
if(A != 0)
// B*, D*, G*, GX, P*, T*, K*, KX
{
// set stop consonant length to 6
phonemeLength[X] = 6;
// set nasal length to 5
phonemeLength[X - 1] = 5;
}
// move to next phoneme
loopIndex++;
continue;
}
// WH, R*, L*, W*, Y*, Q*, Z*, ZH, V*, DH, J*, B*, D*, G*, GX
// RULE: <VOICED STOP CONSONANT> {optional silence} <STOP CONSONANT>
// Shorten both to (length/2 + 1)
// (voiced) stop consonant?
if((flags[index] & 2) != 0) {
// B*, D*, G*, GX
// move past silence
do {
// move ahead
X++;
index = phonemeindex[X];
} while(index == 0);
// check for end of buffer
if(index == 255) //buffer overflow
{
// ignore, overflow code
if((65 & 2) == 0) {
loopIndex++;
continue;
}
} else if((flags[index] & 2) == 0) {
// if another stop consonant, move ahead
loopIndex++;
continue;
}
// RULE: <UNVOICED STOP CONSONANT> {optional silence} <STOP CONSONANT>
// X gets overwritten, so hold prior X value for debug statement
// int debugX = X;
// shorten the prior phoneme length to (length/2 + 1)
phonemeLength[X] = (phonemeLength[X] >> 1) + 1;
X = loopIndex;
// also shorten this phoneme length to (length/2 +1)
phonemeLength[loopIndex] = (phonemeLength[loopIndex] >> 1) + 1;
// move ahead
loopIndex++;
continue;
}
// WH, R*, L*, W*, Y*, Q*, Z*, ZH, V*, DH, J*, **,
// RULE: <VOICED NON-VOWEL> <DIPHTONG>
// Decrease <DIPHTONG> by 2
// liquic consonant?
if((flags2[index] & 16) != 0) {
// R*, L*, W*, Y*
// get the prior phoneme
index = phonemeindex[X - 1];
// prior phoneme a stop consonant>
if((flags[index] & 2) != 0) {
// Rule: <LIQUID CONSONANT> <DIPHTONG>
// decrease the phoneme length by 2 frames (20 ms)
phonemeLength[X] -= 2;
}
}
// move to next phoneme
loopIndex++;
continue;
}
// goto pos48701;
}
// -------------------------------------------------------------------------
// ML : Code47503 is division with remainder, and mem50 gets the sign
void STM32SAM::Code47503(unsigned char mem52) {
Y = 0;
if((mem53 & 128) != 0) {
mem53 = -mem53;
Y = 128;
}
mem50 = Y;
A = 0;
for(X = 8; X > 0; X--) {
int temp = mem53;
mem53 = mem53 << 1;
A = A << 1;
if(temp >= 128) A++;
if(A >= mem52) {
A = A - mem52;
mem53++;
}
}
mem51 = A;
if((mem50 & 128) != 0) mem53 = -mem53;
}
////////////////////////////////////////////////////////////////////////////////////////////
//
// Reciter
//
////////////////////////////////////////////////////////////////////////////////////////////
void STM32SAM::Code37055(unsigned char mem59) {
X = mem59;
X--;
A = inputtemp[X];
Y = A;
A = tab36376[Y];
return;
}
void STM32SAM::Code37066(unsigned char mem58) {
X = mem58;
X++;
A = inputtemp[X];
Y = A;
A = tab36376[Y];
}
unsigned char STM32SAM::GetRuleByte(unsigned short mem62, unsigned char Y) {
unsigned int address = mem62;
if(mem62 >= 37541) {
address -= 37541;
return rules2[address + Y];
}
address -= 32000;
return rules[address + Y];
}
int STM32SAM::TextToPhonemes(unsigned char* input) // Code36484
{
//unsigned char *tab39445 = &mem[39445]; //input and output
//unsigned char mem29;
unsigned char mem56; //output position for phonemes
unsigned char mem57;
unsigned char mem58;
unsigned char mem59;
unsigned char mem60;
unsigned char mem61;
unsigned short mem62; // memory position of current rule
unsigned char mem64; // position of '=' or current character
unsigned char mem65; // position of ')'
unsigned char mem66; // position of '('
unsigned char mem36653;
inputtemp[0] = 32;
// secure copy of input
// because input will be overwritten by phonemes
X = 1;
Y = 0;
do {
//pos36499:
A = input[Y] & 127;
if(A >= 112)
A = A & 95;
else if(A >= 96)
A = A & 79;
inputtemp[X] = A;
X++;
Y++;
} while(Y != 255);
X = 255;
inputtemp[X] = 27;
mem61 = 255;
pos36550:
A = 255;
mem56 = 255;
pos36554:
while(1) {
mem61++;
X = mem61;
A = inputtemp[X];
mem64 = A;
if(A == '[') {
mem56++;
X = mem56;
A = 155;
input[X] = 155;
//goto pos36542;
// Code39771(); //Code39777();
return 1;
}
//pos36579:
if(A != '.') break;
X++;
Y = inputtemp[X];
A = tab36376[Y] & 1;
if(A != 0) break;
mem56++;
X = mem56;
A = '.';
input[X] = '.';
} //while
//pos36607:
A = mem64;
Y = A;
A = tab36376[A];
mem57 = A;
if((A & 2) != 0) {
mem62 = 37541;
goto pos36700;
}
//pos36630:
A = mem57;
if(A != 0) goto pos36677;
A = 32;
inputtemp[X] = ' ';
mem56++;
X = mem56;
if(X > 120) goto pos36654;
input[X] = A;
goto pos36554;
// -----
//36653 is unknown. Contains position
pos36654:
input[X] = 155;
A = mem61;
mem36653 = A;
// mem29 = A; // not used
// Code36538(); das ist eigentlich
return 1;
//Code39771();
//go on if there is more input ???
mem61 = mem36653;
goto pos36550;
pos36677:
A = mem57 & 128;
if(A == 0) {
//36683: BRK
return 0;
}
// go to the right rules for this character.
X = mem64 - 'A';
mem62 = tab37489[X] | (tab37515[X] << 8);
// -------------------------------------
// go to next rule
// -------------------------------------
pos36700:
// find next rule
Y = 0;
do {
mem62 += 1;
A = GetRuleByte(mem62, Y);
} while((A & 128) == 0);
Y++;
//pos36720:
// find '('
while(1) {
A = GetRuleByte(mem62, Y);
if(A == '(') break;
Y++;
}
mem66 = Y;
//pos36732:
// find ')'
do {
Y++;
A = GetRuleByte(mem62, Y);
} while(A != ')');
mem65 = Y;
//pos36741:
// find '='
do {
Y++;
A = GetRuleByte(mem62, Y);
A = A & 127;
} while(A != '=');
mem64 = Y;
X = mem61;
mem60 = X;
// compare the string within the bracket
Y = mem66;
Y++;
//pos36759:
while(1) {
mem57 = inputtemp[X];
A = GetRuleByte(mem62, Y);
if(A != mem57) goto pos36700;
Y++;
if(Y == mem65) break;
X++;
mem60 = X;
}
// the string in the bracket is correct
//pos36787:
A = mem61;
mem59 = mem61;
pos36791:
while(1) {
mem66--;
Y = mem66;
A = GetRuleByte(mem62, Y);
mem57 = A;
//36800: BPL 36805
if((A & 128) != 0) goto pos37180;
X = A & 127;
A = tab36376[X] & 128;
if(A == 0) break;
X = mem59 - 1;
A = inputtemp[X];
if(A != mem57) goto pos36700;
mem59 = X;
}
//pos36833:
A = mem57;
if(A == ' ') goto pos36895;
if(A == '#') goto pos36910;
if(A == '.') goto pos36920;
if(A == '&') goto pos36935;
if(A == '@') goto pos36967;
if(A == '^') goto pos37004;
if(A == '+') goto pos37019;
if(A == ':') goto pos37040;
// Code42041(); //Error
//36894: BRK
return 0;
// --------------
pos36895:
Code37055(mem59);
A = A & 128;
if(A != 0) goto pos36700;
pos36905:
mem59 = X;
goto pos36791;
// --------------
pos36910:
Code37055(mem59);
A = A & 64;
if(A != 0) goto pos36905;
goto pos36700;
// --------------
pos36920:
Code37055(mem59);
A = A & 8;
if(A == 0) goto pos36700;
pos36930:
mem59 = X;
goto pos36791;
// --------------
pos36935:
Code37055(mem59);
A = A & 16;
if(A != 0) goto pos36930;
A = inputtemp[X];
if(A != 72) goto pos36700;
X--;
A = inputtemp[X];
if((A == 67) || (A == 83)) goto pos36930;
goto pos36700;
// --------------
pos36967:
Code37055(mem59);
A = A & 4;
if(A != 0) goto pos36930;
A = inputtemp[X];
if(A != 72) goto pos36700;
if((A != 84) && (A != 67) && (A != 83)) goto pos36700;
mem59 = X;
goto pos36791;
// --------------
pos37004:
Code37055(mem59);
A = A & 32;
if(A == 0) goto pos36700;
pos37014:
mem59 = X;
goto pos36791;
// --------------
pos37019:
X = mem59;
X--;
A = inputtemp[X];
if((A == 'E') || (A == 'I') || (A == 'Y')) goto pos37014;
goto pos36700;
// --------------
pos37040:
Code37055(mem59);
A = A & 32;
if(A == 0) goto pos36791;
mem59 = X;
goto pos37040;
//---------------------------------------
pos37077:
X = mem58 + 1;
A = inputtemp[X];
if(A != 'E') goto pos37157;
X++;
Y = inputtemp[X];
X--;
A = tab36376[Y] & 128;
if(A == 0) goto pos37108;
X++;
A = inputtemp[X];
if(A != 'R') goto pos37113;
pos37108:
mem58 = X;
goto pos37184;
pos37113:
if((A == 83) || (A == 68)) goto pos37108; // 'S' 'D'
if(A != 76) goto pos37135; // 'L'
X++;
A = inputtemp[X];
if(A != 89) goto pos36700;
goto pos37108;
pos37135:
if(A != 70) goto pos36700;
X++;
A = inputtemp[X];
if(A != 85) goto pos36700;
X++;
A = inputtemp[X];
if(A == 76) goto pos37108;
goto pos36700;
pos37157:
if(A != 73) goto pos36700;
X++;
A = inputtemp[X];
if(A != 78) goto pos36700;
X++;
A = inputtemp[X];
if(A == 71) goto pos37108;
//pos37177:
goto pos36700;
// -----------------------------------------
pos37180:
A = mem60;
mem58 = A;
pos37184:
Y = mem65 + 1;
//37187: CPY 64
// if(? != 0) goto pos37194;
if(Y == mem64) goto pos37455;
mem65 = Y;
//37196: LDA (62),y
A = GetRuleByte(mem62, Y);
mem57 = A;
X = A;
A = tab36376[X] & 128;
if(A == 0) goto pos37226;
X = mem58 + 1;
A = inputtemp[X];
if(A != mem57) goto pos36700;
mem58 = X;
goto pos37184;
pos37226:
A = mem57;
if(A == 32) goto pos37295; // ' '
if(A == 35) goto pos37310; // '#'
if(A == 46) goto pos37320; // '.'
if(A == 38) goto pos37335; // '&'
if(A == 64) goto pos37367; // ''
if(A == 94) goto pos37404; // ''
if(A == 43) goto pos37419; // '+'
if(A == 58) goto pos37440; // ':'
if(A == 37) goto pos37077; // '%'
//pos37291:
// Code42041(); //Error
//37294: BRK
return 0;
// --------------
pos37295:
Code37066(mem58);
A = A & 128;
if(A != 0) goto pos36700;
pos37305:
mem58 = X;
goto pos37184;
// --------------
pos37310:
Code37066(mem58);
A = A & 64;
if(A != 0) goto pos37305;
goto pos36700;
// --------------
pos37320:
Code37066(mem58);
A = A & 8;
if(A == 0) goto pos36700;
pos37330:
mem58 = X;
goto pos37184;
// --------------
pos37335:
Code37066(mem58);
A = A & 16;
if(A != 0) goto pos37330;
A = inputtemp[X];
if(A != 72) goto pos36700;
X++;
A = inputtemp[X];
if((A == 67) || (A == 83)) goto pos37330;
goto pos36700;
// --------------
pos37367:
Code37066(mem58);
A = A & 4;
if(A != 0) goto pos37330;
A = inputtemp[X];
if(A != 72) goto pos36700;
if((A != 84) && (A != 67) && (A != 83)) goto pos36700;
mem58 = X;
goto pos37184;
// --------------
pos37404:
Code37066(mem58);
A = A & 32;
if(A == 0) goto pos36700;
pos37414:
mem58 = X;
goto pos37184;
// --------------
pos37419:
X = mem58;
X++;
A = inputtemp[X];
if((A == 69) || (A == 73) || (A == 89)) goto pos37414;
goto pos36700;
// ----------------------
pos37440:
Code37066(mem58);
A = A & 32;
if(A == 0) goto pos37184;
mem58 = X;
goto pos37440;
pos37455:
Y = mem64;
mem61 = mem60;
pos37461:
//37461: LDA (62),y
A = GetRuleByte(mem62, Y);
mem57 = A;
A = A & 127;
if(A != '=') {
mem56++;
X = mem56;
input[X] = A;
}
//37478: BIT 57
//37480: BPL 37485 //not negative flag
if((mem57 & 128) == 0) goto pos37485; //???
goto pos36554;
pos37485:
Y++;
goto pos37461;
}
// Constructor
STM32SAM::STM32SAM(uint32_t STM32SAM_SPEED /* = 5 */) {
STM32SAM_SPEED = STM32SAM_SPEED & 0x1f; // limit it from 0 to 31
_STM32SAM_SPEED = STM32SAM_SPEED;
// set default voice
speed = 72;
pitch = 64;
mouth = 128;
throat = 128;
phonetic = 0;
singmode = 0;
wait1 = 7;
wait2 = 6;
mem59 = 0;
oldtimetableindex = 0;
}
STM32SAM::STM32SAM() {
_STM32SAM_SPEED = 7;
// set default voice
speed = 72;
pitch = 64;
mouth = 128;
throat = 128;
phonetic = 0;
singmode = 0;
wait1 = 7;
wait2 = 6;
mem59 = 0;
oldtimetableindex = 0;
}
/*
STM32SAM::~STM32SAM() {
{
// TODO: end();
}
*/
////////////////////////////////////////////////////////////////////////////////////////////
//
// STM32SAM sam (variable string, phonetic, sing, pitch, speed, mouth, throat)
// STM32SAM say (sing off, phonetic off) (const string)
// STM32SAM say (sing off, phonetic off) (variable string)
// STM32SAM sing (sing on, phonetic off) (const string)
// STM32SAM sing (sing on, phonetic off) (variable string)
// STM32SAM sayPhonetic (sing off, phonetic on) (const string)
// STM32SAM sayPhonetic (sing off, phonetic on) (variable string)
// STM32SAM singPhonetic (sing on, phonetic on) (const string)
// STM32SAM singPhonetic (sing on, phonetic on) (variable string)
// STM32SAM voice (pitch, speed, mouth, throat)
// STM32SAM setPitch (pitch)
// STM32SAM setSpeed (speed)
// STM32SAM setMouth (mouth)
// STM32SAM setThroat (throat)
//
//
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
//
// STM32SAM sam (const string, phonetic, sing, pitch, speed, mouth, throat)
//
////////////////////////////////////////////////////////////////////////////////////////////
char to_upper_case(char c) {
if(c >= 'a' && c <= 'z') {
return c - 'a' + 'A';
}
return c;
}
void STM32SAM::sam(
const char* argv,
unsigned char _phonetic,
unsigned char _singmode,
unsigned char _pitch,
unsigned char _speed,
unsigned char _mouth,
unsigned char _throat) {
phonetic = _phonetic;
singmode = _singmode;
pitch = _pitch;
speed = _speed;
mouth = _mouth;
throat = _throat;
int i;
for(i = 0; i < 256; i++) {
input[i] = argv[i];
}
for(i = 0; input[i] != 0; i++) {
if(i != 0) {
input[i] = to_upper_case((int)argv[i]);
}
}
if(!phonetic) {
strncat(input, "[", 256);
if(!TextToPhonemes((unsigned char*)input)) {
// PrintUsage();
return;
}
} else {
strncat(input, "\x9b", 256);
}
SetInput(input);
if(!SAMMain()) {
return;
}
}
////////////////////////////////////////////////////////////////////////////////////////////
//
// STM32SAM sam (variable string, phonetic, sing, pitch, speed, mouth, throat)
//
////////////////////////////////////////////////////////////////////////////////////////////
void STM32SAM::sam(
char* argv,
unsigned char _phonetic,
unsigned char _singmode,
unsigned char _pitch,
unsigned char _speed,
unsigned char _mouth,
unsigned char _throat) {
phonetic = _phonetic;
singmode = _singmode;
pitch = _pitch;
speed = _speed;
mouth = _mouth;
throat = _throat;
int i;
for(i = 0; i < 256; i++) {
input[i] = argv[i];
}
for(i = 0; input[i] != 0; i++) {
if(i != 0) {
input[i] = to_upper_case((int)argv[i]);
}
}
if(i < 256) {
input[i] = phonetic ? '\x9b' : '[';
}
if(!phonetic) {
if(!TextToPhonemes((unsigned char*)input)) {
return;
}
}
SetInput(input);
if(!SAMMain()) {
return;
}
}
////////////////////////////////////////////////////////////////////////////////////////////
//
// STM32SAM say(sing off, phonetic off) (const string)
//
////////////////////////////////////////////////////////////////////////////////////////////
void STM32SAM::say(const char* argv) {
int i;
phonetic = 0;
singmode = 0;
char const_input[256];
for(i = 0; i < 256; i++) {
const_input[i] = argv[i];
}
sam(const_input, phonetic, singmode, pitch, speed, mouth, throat);
}
void STM32SAM::say(char* argv) {
int i;
phonetic = 0;
singmode = 0;
char const_input[256];
for(i = 0; i < 256; i++) {
const_input[i] = argv[i];
}
sam(const_input, phonetic, singmode, pitch, speed, mouth, throat);
}
////////////////////////////////////////////////////////////////////////////////////////////
//
// STM32SAM sing (sing on, phonetic off)
//
////////////////////////////////////////////////////////////////////////////////////////////
void STM32SAM::sing(const char* argv) {
int i;
phonetic = 0;
singmode = 1;
char const_input[256];
for(i = 0; i < 256; i++) {
const_input[i] = argv[i];
}
sam(const_input, phonetic, singmode, pitch, speed, mouth, throat);
}
void STM32SAM::sing(char* argv) {
int i;
phonetic = 0;
singmode = 1;
char const_input[256];
for(i = 0; i < 256; i++) {
const_input[i] = argv[i];
}
sam(const_input, phonetic, singmode, pitch, speed, mouth, throat);
}
////////////////////////////////////////////////////////////////////////////////////////////
//
// STM32SAM sayPhonetic (sing off, phonetic on)
//
////////////////////////////////////////////////////////////////////////////////////////////
void STM32SAM::sayPhonetic(const char* argv) {
int i;
phonetic = 1;
singmode = 0;
char const_input[256];
for(i = 0; i < 256; i++) {
const_input[i] = argv[i];
}
sam(const_input, phonetic, singmode, pitch, speed, mouth, throat);
}
void STM32SAM::sayPhonetic(char* argv) {
int i;
phonetic = 1;
singmode = 0;
char const_input[256];
for(i = 0; i < 256; i++) {
const_input[i] = argv[i];
}
sam(const_input, phonetic, singmode, pitch, speed, mouth, throat);
}
////////////////////////////////////////////////////////////////////////////////////////////
//
// STM32SAM singPhonetic (sing on, phonetic on)
//
////////////////////////////////////////////////////////////////////////////////////////////
void STM32SAM::singPhonetic(const char* argv) {
int i;
phonetic = 1;
singmode = 1;
char const_input[256];
for(i = 0; i < 256; i++) {
const_input[i] = argv[i];
}
sam(const_input, phonetic, singmode, pitch, speed, mouth, throat);
}
void STM32SAM::singPhonetic(char* argv) {
int i;
phonetic = 1;
singmode = 0;
char const_input[256];
for(i = 0; i < 256; i++) {
const_input[i] = argv[i];
}
sam(const_input, phonetic, singmode, pitch, speed, mouth, throat);
}
////////////////////////////////////////////////////////////////////////////////////////////
//
// STM32SAM voice (pitch, speed, mouth, throat)
//
////////////////////////////////////////////////////////////////////////////////////////////
void STM32SAM::setVoice(
unsigned char _pitch /* = 64 */,
unsigned char _speed /* = 72 */,
unsigned char _mouth /* = 128 */,
unsigned char _throat /* = 128 */) {
pitch = _pitch;
speed = _speed;
mouth = _mouth;
throat = _throat;
}
////////////////////////////////////////////////////////////////////////////////////////////
//
// STM32SAM setPitch (pitch)
//
////////////////////////////////////////////////////////////////////////////////////////////
void STM32SAM::setPitch(unsigned char _pitch /* = 64 */) {
pitch = _pitch;
}
////////////////////////////////////////////////////////////////////////////////////////////
//
// STM32SAM setSpeed (speed)
//
////////////////////////////////////////////////////////////////////////////////////////////
void STM32SAM::setSpeed(unsigned char _speed /* = 72 */) {
speed = _speed;
}
////////////////////////////////////////////////////////////////////////////////////////////
//
// STM32SAM setMouth (mouth)
//
////////////////////////////////////////////////////////////////////////////////////////////
void STM32SAM::setMouth(unsigned char _mouth /* = 128 */) {
mouth = _mouth;
}
////////////////////////////////////////////////////////////////////////////////////////////
//
// STM32SAM setThroat (throat)
//
////////////////////////////////////////////////////////////////////////////////////////////
void STM32SAM::setThroat(unsigned char _throat /* = 128 */) {
throat = _throat;
}
////////////////////////////////////////////////////////////////////////////////////////////
//
// Hardware
//
////////////////////////////////////////////////////////////////////////////////////////////
// Hardware specifics, for easier porting to other microcontrollers
//
// Set PA8 pin as PWM, at 256 timer ticks overflow (8bit resolution)
#include <math.h>
#include <stm32wbxx_ll_tim.h>
#define FURI_HAL_SPEAKER_TIMER TIM16
#define FURI_HAL_SPEAKER_CHANNEL LL_TIM_CHANNEL_CH1
void STM32SAM::begin(void) {
#ifdef USE_ROGER_CORE
pinMode(PA8, PWM); // audio output pin
Timer1.setPeriod(
4); // Can't set at 256 ticks, only in uS. First nearest uS is 4 (Roger core is only for bluepill, that means 72*4=288 ticks, or 128*4=512 ticks when overclocked. It's ok, just overall volume will be lower, because maximum volume will be 256/288 or 256/512)
#endif
#ifdef USE_STM32duino_CORE
pinMode(PA8, OUTPUT);
PWM->pause();
PWM->setMode(1, TIMER_OUTPUT_COMPARE_PWM1, PA8); // TIM1 CH1 (PA8)
PWM->setPrescaleFactor(1);
PWM->setOverflow(256, TICK_FORMAT); // 256 ticks overflow, no matter the CPU (timer) speed
PWM->resume();
#endif
LL_TIM_InitTypeDef TIM_InitStruct;
memset(&TIM_InitStruct, 0, sizeof(LL_TIM_InitTypeDef));
TIM_InitStruct.Prescaler = 4;
TIM_InitStruct.Autoreload = 255;
LL_TIM_Init(FURI_HAL_SPEAKER_TIMER, &TIM_InitStruct);
LL_TIM_OC_InitTypeDef TIM_OC_InitStruct;
memset(&TIM_OC_InitStruct, 0, sizeof(LL_TIM_OC_InitTypeDef));
TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE;
TIM_OC_InitStruct.CompareValue = 127;
LL_TIM_OC_Init(FURI_HAL_SPEAKER_TIMER, FURI_HAL_SPEAKER_CHANNEL, &TIM_OC_InitStruct);
LL_TIM_EnableAllOutputs(FURI_HAL_SPEAKER_TIMER);
LL_TIM_EnableCounter(FURI_HAL_SPEAKER_TIMER);
} // begin
inline void STM32SAM::SetAUDIO(unsigned char main_volume) {
#ifdef USE_ROGER_CORE
Timer1.setCompare(TIMER_CH1, main_volume);
#endif
#ifdef USE_STM32duino_CORE
PWM->setCaptureCompare(1, main_volume, TICK_COMPARE_FORMAT);
#endif
// if(main_volume > 64) {
// LL_TIM_OC_SetCompareCH1(FURI_HAL_SPEAKER_TIMER, 127);
// } else {
// LL_TIM_OC_SetCompareCH1(FURI_HAL_SPEAKER_TIMER, main_volume);
// }
float data = main_volume;
data /= 255.0f;
data -= 0.5f;
data *= 4.0f;
data = tanhf(data);
data += 0.5f;
data *= 255.0f;
if(data < 0) {
data = 0;
} else if(data > 255) {
data = 255;
}
LL_TIM_OC_SetCompareCH1(FURI_HAL_SPEAKER_TIMER, data);
}