Re: [PATCH] emoji on TUI emacs
Kai Ma <[email protected]> Wed, 5 Aug 2026 04:45:27 +0200
| Newsgroups | gmane.emacs.devel |
|---|---|
| Message-ID | <[email protected]> |
This is a multi-part message in MIME format.
--------------CeJ8sANpJ0l1Sx6APhGHX8Xv
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Attached are the three patches that make textual Emacs work with emoji
on modern terminal emulators.
For your enjoyment, a smaller file containing many different kinds of
emoji sequences is also attached.
First, the test results. So far, there are 3 main issues with Emoji
support in the textual terminals.
* Issue 1: Keycap sequences like 3️⃣ (#x33 #xfe0f #x20e3) are not
supported. They are explicitly excluded in emoji-zwj.awk: "FIXME: add
support for Emoji_Keycap_Sequence once we learn how to respect
FE0F/VS-16 for ASCII characters." But I'm not very sure what is missing.
Could someone enlighten me here?
* Issue 2: Bare-bones emoji modifiers (like 🏻 #x1f3fb) are composed
onto the preceding space characters by some terminal emulators, but
Emacs does not compose them. I think Emacs is correct here, base #x20 is
not an emoji modifier base.
* Issue 3: Some terminal emulator's Unicode support is not up to date,
and thus calculates incorrect widths for new emojis. Only Kitty supports
Unicode 17, the version that Emacs supports.
IMO all of them should appear very rare in real texts. But Issue 1 in
principle could be fixed. Issue 2 and 3 are not Emacs problems.
I tested them on some popular terminal emulators. The results are pretty
good. In particular, Kitty is correct for most of the emoji sequences,
only affected by Issue 2.
Here is the summary:
| Terminal | UAX #29 | Unicode version | Correct Emoji
Modifier Base | Keycap Sequence Support |
|------------------+---------+--------------------+-----------------------------+-------------------------+
| WezTerm | yes | 16 nightly | no |
no |
| Windows Terminal | yes | 15.1 / DirectWrite | yes |
yes |
| Kitty | yes | 17 | no |
yes |
| Alacritty | no | 16 | no |
no |
| sakura (VTE) | no | 15.1 | no |
no |
But the patches are almost certainly not ready enough. Review and
testing feedback is appreciated.
(BTW, during testing I find some East_Asian_Neutral characters misalign
because Emacs marks them as wide. I'm not sure about know the rationale.
Patch 2 removes them so they get width 1, in accordance to the Unicode
standard. But perhaps there's some background I'm missing?)
A follow-up question is: should we make string-width recognize emoji
sequences and return 2 instead of 1? Or at least update org-string-width.
On 8/2/2026 8:49 AM, Eli Zaretskii wrote:
>>>> - string-width=2 and has fe0f: 553
>>> And here, does the first codepoint always produce 2 as
>>> CHARACTER_WIDTH?
>> Unfortunately, no. I found 11 exceptions, and all of them have ZWJ or
>> Emoji_Modifier. For example, ⛹️♀️ (string-width=2):
>>
>> - U+26F9 PERSON WITH BALL (character width = 1!)
>> - U+FE0F VS16
>> - U+200D ZWJ
>> - U+2640 FEMALE SIGN
>> - U+FE0F VS16
>>
>> Currently on TUI Emacs it's composed as two composite glyphs [ 26f9 vs16
>> zwj ] [ 2640 fe0f ] (two glyphs), so the whole sequence has string-width=2.
> Yes, so this is a separate problem. What about the sequences where
> Emacs does decide to compose: does the first codepoint always produce
> 2 as CHARACTER_WIDTH in those cases?
Yes; before the patches, among those composed (string-width = 2, has
fe0f, matches some regex in compostion-function-table), the
CHARACTER_WIDTH of the first character is always 2.
However, after applying the new patch, there will be 10 such cases:
🏋️♀️ 🏋️♂️ 🏌️♀️ 🏌️♂️ 🏳️⚧️ 👁️🗨️ 🕵️♀️ 🕵️♂️ ⛹️♀️ ⛹️♂️.
They should be covered by changes in the term.c.
>> BTW, I experimentally hacked composite.el to compose ZWJ and emoji
>> modifiers, and the result is quite promising -- TUI Emacs works almost
>> always correctly on my emoji catalog file using a modern terminal
>> emulator. I'll test more and send a separate follow-up patch soon.
> This should be conditioned by a variable that users can control,
> because not all terminals do this. But yes, when the terminal does do
> it, changing compose-gstring-for-terminal in a way that combines them
> due to VS-16 is probably a good idea.
Done in patch 3.
>>>> --- a/src/term.c
>>>> +++ b/src/term.c
>>>> @@ -567,6 +567,13 @@ encode_terminal_code (struct glyph *src, int src_len,
>>>> nchars = 0;
>>>> while (src < src_end)
>>>> {
>>>> + /* We must skip glyphs to be padded for a wide character. */
>>>> + if (CHAR_GLYPH_PADDING_P (*src))
>>>> + {
>>>> + src++;
>>>> + continue;
>>>> + }
>>>> +
>>>> if (src->type == COMPOSITE_GLYPH)
>>>> {
>>>> struct composition *cmp;
>>>> @@ -632,8 +639,7 @@ encode_terminal_code (struct glyph *src, int src_len,
>>>> nchars++;
>>>> }
>>>> }
>>>> - /* We must skip glyphs to be padded for a wide character. */
>>>> - else if (! CHAR_GLYPH_PADDING_P (*src))
>>>> + else
>>>> {
>>> Is this part really needed? AFAICT, it doesn't change anything,
>>> because the loop already unconditionally increments 'src', for the
>>> padding and non-padding cases alike. Or what am I missing?
>> The padding glyphs constructed for COMPOSITE_GLYPH also has type
>> COMPOSITE_GLYPH, so we have to check padding_p before that branch.
> Then if we just change the condition to
>
> if (src->type == COMPOSITE_GLYPH && ! CHAR_GLYPH_PADDING_P (*src))
>
> then all the rest of the code can be left alone, right?
Yes
>
>> I also changed 'while' to 'for' to make the code look better.
> I'd prefer to leave the 'while' alone. Unnecessary code churn makes
> it harder to track evolution of code as part of code forensics in the
> future.
Done in patch 1
>>> Finally, there's one problem I see after applying the patch:
>>> displaying sequences like "\x2699\xfe0f" produce incorrect cursor
>>> movement, because Emacs thinks the resulting Emoji is 1-column wide,
>>> whereas what the terminal here shows is a 2-column Emoji. So maybe we
>>> need a special treatment for Emoji produced by appending #xFE0F to a
>>> 1-column character: consider that to produce a 2-column Emoji. WDYT?
>> So yes, this approach is actually more standard-compliant. The revised
>> patch uses this approach. The current version uses a simple heuristic
>> that checks whether the second glyph is Emoji_Modifier or VS16. I added
>> Emoji_Modifier because ⛹🏻♀️ is one example where the second character
>> is not FE0F -- it is [26F9, 1F3FB, 200D, 2640, FE0F].
>>
>> Some terminal emulators (e.g. WezTerm) show them using only 1 column,
>> but now I think that's their problem. :)
> We should probably have a Lisp variable for this heuristics, so users
> could tweak that according to what the terminal does or doesn't do in
> these cases.
Done in patch 1
>> +/* Check if the glyph string is an emoji. In that case, force it to be
>> + shown as wide. */
>> +
>> +static bool
>> +composite_glyph_is_emoji (struct it *it)
>> +{
>> + Lisp_Object gstring, glyph;
>> + int c;
>> +
>> + /* Skip static compositions. */
>> + if (it->cmp_it.ch < 0)
>> + return false;
>> +
>> + gstring = composition_gstring_from_id (it->cmp_it.id);
>> + if (it->cmp_it.from + 1 >= LGSTRING_GLYPH_LEN (gstring))
>> + return false;
>> +
>> + /* Check if the second character is VS16 or an emoji modifier. */
>> + glyph = LGSTRING_GLYPH (gstring, it->cmp_it.from + 1);
>> + if (! glyph)
>> + return false;
>> + c = LGLYPH_CHAR (glyph);
>> + return (c == 0xFE0F || (0x1F3FB <= c && c <= 0x1F3FF));
>> +}
> IMO, this function should also look at the character before VS-16.
> Not every codepoint produces an Emoji when followed by VS-16, only
> characters in the 0x2XXX and 0x303X blocks. For better accuracy,
> maybe we should have a variable similar to
> auto-composition-emoji-eligible-codepoints, computed from
> admin/unidata/emoji-*.txt files, which will provide the codepoints
> that will display as Emoji when followed by VS-16.
Done in patch 1 and 3
--------------CeJ8sANpJ0l1Sx6APhGHX8Xv
Content-Type: text/plain; charset=UTF-8; name="emoji_test.txt"
Content-Disposition: attachment; filename="emoji_test.txt"
Content-Transfer-Encoding: base64
IyBFbW9qaSB0ZXJtaW5hbCBjb21wb3NpdGlvbiBhbmQgd2lkdGggc2FtcGxlcy4KCiMgQmFy
ZSBlbW9qaSBtb2RpZmllcnMKRU1PSkkgTU9ESUZJRVIgRklUWlBBVFJJQ0sgVFlQRS0xLTIJ
8J+PuwpFTU9KSSBNT0RJRklFUiBGSVRaUEFUUklDSyBUWVBFLTMJ8J+PvApFTU9KSSBNT0RJ
RklFUiBGSVRaUEFUUklDSyBUWVBFLTQJ8J+PvQpFTU9KSSBNT0RJRklFUiBGSVRaUEFUUklD
SyBUWVBFLTUJ8J+PvgpFTU9KSSBNT0RJRklFUiBGSVRaUEFUUklDSyBUWVBFLTYJ8J+Pvwrw
n4+7IPCfj7wg8J+PvSDwn4++IPCfj78KCiMgRWFzdF9Bc2lhbl9XaWR0aD1OZXV0cmFsClhJ
QU5HUUkgUkVEIEdFTkVSQUwJ8J+poApYSUFOR1FJIFJFRCBBRFZJU09SCfCfqaEKWElBTkdR
SSBSRUQgRUxFUEhBTlQJ8J+pogpYSUFOR1FJIFJFRCBIT1JTRQnwn6mjClhJQU5HUUkgUkVE
IENIQVJJT1QJ8J+ppApYSUFOR1FJIFJFRCBDQU5OT04J8J+ppQpYSUFOR1FJIFJFRCBTT0xE
SUVSCfCfqaYKWElBTkdRSSBCTEFDSyBHRU5FUkFMCfCfqacKWElBTkdRSSBCTEFDSyBBRFZJ
U09SCfCfqagKWElBTkdRSSBCTEFDSyBFTEVQSEFOVAnwn6mpClhJQU5HUUkgQkxBQ0sgSE9S
U0UJ8J+pqgpYSUFOR1FJIEJMQUNLIENIQVJJT1QJ8J+pqwpYSUFOR1FJIEJMQUNLIENBTk5P
Tgnwn6msClhJQU5HUUkgQkxBQ0sgU09MRElFUgnwn6mtCvCfqaAg8J+poSDwn6miIPCfqaMg
8J+ppCDwn6mlIPCfqaYg8J+ppyDwn6moIPCfqakg8J+pqiDwn6mrIPCfqawg8J+prQoKIyBS
ZWdpb25hbC1pbmRpY2F0b3IKZmxhZzogQXNjZW5zaW9uIElzbGFuZAnwn4em8J+HqApmbGFn
OiBBbmRvcnJhCfCfh6bwn4epCmZsYWc6IFVuaXRlZCBBcmFiIEVtaXJhdGVzCfCfh6bwn4eq
CmZsYWc6IEFmZ2hhbmlzdGFuCfCfh6bwn4erCmZsYWc6IEFudGlndWEgJiBCYXJidWRhCfCf
h6bwn4esCvCfh6bwn4eoIPCfh6bwn4epIPCfh6bwn4eqIPCfh6bwn4erIPCfh6bwn4esCgoj
IFpXSiBzZXF1ZW5jZXMKZmFtaWx5OiBtYW4sIHdvbWFuLCBib3kJ8J+RqOKAjfCfkanigI3w
n5GmCmZhbWlseTogbWFuLCB3b21hbiwgZ2lybAnwn5Go4oCN8J+RqeKAjfCfkacKZmFtaWx5
OiBtYW4sIHdvbWFuLCBnaXJsLCBib3kJ8J+RqOKAjfCfkanigI3wn5Gn4oCN8J+RpgpmYW1p
bHk6IG1hbiwgd29tYW4sIGJveSwgYm95CfCfkajigI3wn5Gp4oCN8J+RpuKAjfCfkaYKZmFt
aWx5OiBtYW4sIHdvbWFuLCBnaXJsLCBnaXJsCfCfkajigI3wn5Gp4oCN8J+Rp+KAjfCfkacK
8J+RqOKAjfCfkanigI3wn5GmIPCfkajigI3wn5Gp4oCN8J+RpyDwn5Go4oCN8J+RqeKAjfCf
kafigI3wn5GmIPCfkajigI3wn5Gp4oCN8J+RpuKAjfCfkaYg8J+RqOKAjfCfkanigI3wn5Gn
4oCN8J+RpwoKIyBTZXF1ZW5jZXMgY29udGFpbmluZyBWUzE2IChVK0ZFMEYpCkJMQUNLIFNQ
QURFIFNVSVQJ4pmg77iPCkJMQUNLIEhFQVJUIFNVSVQJ4pml77iPCkJMQUNLIERJQU1PTkQg
U1VJVAnimabvuI8KQkxBQ0sgQ0xVQiBTVUlUCeKZo++4jwpXSElURSBTTUlMSU5HIEZBQ0UJ
4pi677iPCuKZoO+4jyDimaXvuI8g4pmm77iPIOKZo++4jyDimLrvuI8KCiMgRW1vamkgd2l0
aG91dCBWUzE2Ck5FVyBNT09OIFNZTUJPTAnwn4yRCldBWElORyBDUkVTQ0VOVCBNT09OIFNZ
TUJPTAnwn4ySCkZJUlNUIFFVQVJURVIgTU9PTiBTWU1CT0wJ8J+MkwpXQVhJTkcgR0lCQk9V
UyBNT09OIFNZTUJPTAnwn4yUCldBTklORyBHSUJCT1VTIE1PT04gU1lNQk9MCfCfjJYKTEFT
VCBRVUFSVEVSIE1PT04gU1lNQk9MCfCfjJcKV0FOSU5HIENSRVNDRU5UIE1PT04gU1lNQk9M
CfCfjJgKRklSU1QgUVVBUlRFUiBNT09OIFdJVEggRkFDRQnwn4ybCkxBU1QgUVVBUlRFUiBN
T09OIFdJVEggRkFDRQnwn4ycCvCfjJEg8J+MkiDwn4yTIPCfjJQg8J+MliDwn4yXIPCfjJgg
8J+MmyDwn4ycCgojIEtleWNhcCBzZXF1ZW5jZXMKa2V5Y2FwOiAqCSrvuI/ig6MKa2V5Y2Fw
OiAjCSPvuI/ig6MKa2V5Y2FwOiAwCTDvuI/ig6MKa2V5Y2FwOiAxCTHvuI/ig6MKa2V5Y2Fw
OiAyCTLvuI/ig6MKKu+4j+KDoyAj77iP4oOjIDDvuI/ig6MgMe+4j+KDoyAy77iP4oOjCgoj
IEZpcnN0LWNvZGUtcG9pbnQgd2lkdGggMgpORVcgTU9PTiBTWU1CT0wJ8J+MkQpXQVhJTkcg
Q1JFU0NFTlQgTU9PTiBTWU1CT0wJ8J+MkgpGSVJTVCBRVUFSVEVSIE1PT04gU1lNQk9MCfCf
jJMKV0FYSU5HIEdJQkJPVVMgTU9PTiBTWU1CT0wJ8J+MlApXQU5JTkcgR0lCQk9VUyBNT09O
IFNZTUJPTAnwn4yWCkxBU1QgUVVBUlRFUiBNT09OIFNZTUJPTAnwn4yXCldBTklORyBDUkVT
Q0VOVCBNT09OIFNZTUJPTAnwn4yYCkZJUlNUIFFVQVJURVIgTU9PTiBXSVRIIEZBQ0UJ8J+M
mwpMQVNUIFFVQVJURVIgTU9PTiBXSVRIIEZBQ0UJ8J+MnArwn4yRIPCfjJIg8J+MkyDwn4yU
IPCfjJYg8J+MlyDwn4yYIPCfjJsg8J+MnAoKIyBGaXJzdC1jb2RlLXBvaW50IHdpZHRoIDEK
WElBTkdRSSBSRUQgR0VORVJBTAnwn6mgClhJQU5HUUkgUkVEIEFEVklTT1IJ8J+poQpYSUFO
R1FJIFJFRCBFTEVQSEFOVAnwn6miClhJQU5HUUkgUkVEIEhPUlNFCfCfqaMKWElBTkdRSSBS
RUQgQ0hBUklPVAnwn6mkClhJQU5HUUkgUkVEIENBTk5PTgnwn6mlClhJQU5HUUkgUkVEIFNP
TERJRVIJ8J+ppgpYSUFOR1FJIEJMQUNLIEdFTkVSQUwJ8J+ppwpYSUFOR1FJIEJMQUNLIEFE
VklTT1IJ8J+pqApYSUFOR1FJIEJMQUNLIEVMRVBIQU5UCfCfqakKWElBTkdRSSBCTEFDSyBI
T1JTRQnwn6mqClhJQU5HUUkgQkxBQ0sgQ0hBUklPVAnwn6mrClhJQU5HUUkgQkxBQ0sgQ0FO
Tk9OCfCfqawKWElBTkdRSSBCTEFDSyBTT0xESUVSCfCfqa0K8J+poCDwn6mhIPCfqaIg8J+p
oyDwn6mkIPCfqaUg8J+ppiDwn6mnIPCfqagg8J+pqSDwn6mqIPCfqasg8J+prCDwn6mtCgoj
IEZpcnN0IHdpZHRoIDEsIHRvdGFsIHdpZHRoIDIKZmxhZzogQXNjZW5zaW9uIElzbGFuZAnw
n4em8J+HqApmbGFnOiBBbmRvcnJhCfCfh6bwn4epCmZsYWc6IFVuaXRlZCBBcmFiIEVtaXJh
dGVzCfCfh6bwn4eqCmZsYWc6IEFmZ2hhbmlzdGFuCfCfh6bwn4erCmZsYWc6IEFudGlndWEg
JiBCYXJidWRhCfCfh6bwn4esCvCfh6bwn4eoIPCfh6bwn4epIPCfh6bwn4eqIPCfh6bwn4er
IPCfh6bwn4esCgojIEZpcnN0IHdpZHRoIDEsIHRvdGFsIHdpZHRoIDEKWElBTkdRSSBSRUQg
R0VORVJBTAnwn6mgClhJQU5HUUkgUkVEIEFEVklTT1IJ8J+poQpYSUFOR1FJIFJFRCBFTEVQ
SEFOVAnwn6miClhJQU5HUUkgUkVEIEhPUlNFCfCfqaMKWElBTkdRSSBSRUQgQ0hBUklPVAnw
n6mkClhJQU5HUUkgUkVEIENBTk5PTgnwn6mlClhJQU5HUUkgUkVEIFNPTERJRVIJ8J+ppgpY
SUFOR1FJIEJMQUNLIEdFTkVSQUwJ8J+ppwpYSUFOR1FJIEJMQUNLIEFEVklTT1IJ8J+pqApY
SUFOR1FJIEJMQUNLIEVMRVBIQU5UCfCfqakKWElBTkdRSSBCTEFDSyBIT1JTRQnwn6mqClhJ
QU5HUUkgQkxBQ0sgQ0hBUklPVAnwn6mrClhJQU5HUUkgQkxBQ0sgQ0FOTk9OCfCfqawKWElB
TkdRSSBCTEFDSyBTT0xESUVSCfCfqa0K8J+poCDwn6mhIPCfqaIg8J+poyDwn6mkIPCfqaUg
8J+ppiDwn6mnIPCfqagg8J+pqSDwn6mqIPCfqasg8J+prCDwn6mtCgojIEZpcnN0IHdpZHRo
IDIsIHRvdGFsIHdpZHRoIDIKTkVXIE1PT04gU1lNQk9MCfCfjJEKV0FYSU5HIENSRVNDRU5U
IE1PT04gU1lNQk9MCfCfjJIKRklSU1QgUVVBUlRFUiBNT09OIFNZTUJPTAnwn4yTCldBWElO
RyBHSUJCT1VTIE1PT04gU1lNQk9MCfCfjJQKV0FOSU5HIEdJQkJPVVMgTU9PTiBTWU1CT0wJ
8J+MlgpMQVNUIFFVQVJURVIgTU9PTiBTWU1CT0wJ8J+MlwpXQU5JTkcgQ1JFU0NFTlQgTU9P
TiBTWU1CT0wJ8J+MmApGSVJTVCBRVUFSVEVSIE1PT04gV0lUSCBGQUNFCfCfjJsKTEFTVCBR
VUFSVEVSIE1PT04gV0lUSCBGQUNFCfCfjJwK8J+MkSDwn4ySIPCfjJMg8J+MlCDwn4yWIPCf
jJcg8J+MmCDwn4ybIPCfjJwKCiMgRW1vamkgbW9kaWZpZXIgc2VxdWVuY2VzCnZpY3Rvcnkg
aGFuZDogbGlnaHQgc2tpbiB0b25lCeKcjPCfj7sKaW5kZXggcG9pbnRpbmcgdXA6IGxpZ2h0
IHNraW4gdG9uZQnimJ3wn4+7CnBlcnNvbiBnZXN0dXJpbmcgT0s6IGxpZ2h0IHNraW4gdG9u
ZQnwn5mG8J+Puwp3b21hbiBnZXN0dXJpbmcgT0s6IGxpZ2h0IHNraW4gdG9uZQnwn5mG8J+P
u+KAjeKZgO+4jwptYW4gZ2VzdHVyaW5nIE9LOiBsaWdodCBza2luIHRvbmUJ8J+ZhvCfj7vi
gI3imYLvuI8K4pyM8J+PuyDimJ3wn4+7IPCfmYbwn4+7IPCfmYbwn4+74oCN4pmA77iPIPCf
mYbwn4+74oCN4pmC77iPCgojIFpXSiBzZXF1ZW5jZXMgd2l0aCBWUzE2Cm1hbiBwb3V0aW5n
CfCfmY7igI3imYLvuI8Kd29tYW4gcG91dGluZwnwn5mO4oCN4pmA77iPCmZhY2UgaW4gY2xv
dWRzCfCfmLbigI3wn4yr77iPCm1lbmRpbmcgaGVhcnQJ4p2k77iP4oCN8J+puQptYW4gZ29s
ZmluZwnwn4+M77iP4oCN4pmC77iPCndvbWFuIGdvbGZpbmcJ8J+PjO+4j+KAjeKZgO+4jwrw
n5mO4oCN4pmC77iPIPCfmY7igI3imYDvuI8g8J+YtuKAjfCfjKvvuI8g4p2k77iP4oCN8J+p
uSDwn4+M77iP4oCN4pmC77iPIPCfj4zvuI/igI3imYDvuI8KCiMgWldKIHNlcXVlbmNlcyB3
aXRob3V0IFZTMTYKZmFtaWx5OiBtYW4sIHdvbWFuLCBib3kJ8J+RqOKAjfCfkanigI3wn5Gm
CmZhbWlseTogbWFuLCB3b21hbiwgZ2lybAnwn5Go4oCN8J+RqeKAjfCfkacKZmFtaWx5OiBt
YW4sIHdvbWFuLCBnaXJsLCBib3kJ8J+RqOKAjfCfkanigI3wn5Gn4oCN8J+RpgpmYW1pbHk6
IG1hbiwgd29tYW4sIGJveSwgYm95CfCfkajigI3wn5Gp4oCN8J+RpuKAjfCfkaYKZmFtaWx5
OiBtYW4sIHdvbWFuLCBnaXJsLCBnaXJsCfCfkajigI3wn5Gp4oCN8J+Rp+KAjfCfkacK8J+R
qOKAjfCfkanigI3wn5GmIPCfkajigI3wn5Gp4oCN8J+RpyDwn5Go4oCN8J+RqeKAjfCfkafi
gI3wn5GmIPCfkajigI3wn5Gp4oCN8J+RpuKAjfCfkaYg8J+RqOKAjfCfkanigI3wn5Gn4oCN
8J+RpwoKIyBWUzE1IHRleHQgcHJlc2VudGF0aW9uCkxFRlQgUklHSFQgQVJST1csIHRleHQg
c3R5bGUJ4oaU77iOCkxFRlQgUklHSFQgQVJST1csIHRleHQgc3R5bGUJ4oaU77iOCuKGlO+4
jiDihpTvuI4KCiMgUkdJIGVtb2ppIHRhZyBzZXF1ZW5jZXMKZmxhZzogRW5nbGFuZAnwn4+0
86CBp/OggaLzoIGl86CBrvOggafzoIG/CmZsYWc6IFNjb3RsYW5kCfCfj7TzoIGn86CBovOg
gbPzoIGj86CBtPOggb8KZmxhZzogV2FsZXMJ8J+PtPOggafzoIGi86CBt/OggazzoIGz86CB
vwrwn4+086CBp/OggaLzoIGl86CBrvOggafzoIG/IPCfj7TzoIGn86CBovOggbPzoIGj86CB
tPOggb8g8J+PtPOggafzoIGi86CBt/OggazzoIGz86CBvwoKIyBBZGphY2VudCBlbW9qaSBn
cmFwaGVtZSBjbHVzdGVycwpDT1cgRkFDRQnwn5CuCkJFRVIgTVVHCfCfjboK8J+QrvCfjboK
CiMgVW5pY29kZSBFbW9qaSAxNy4wClRST01CT05FCfCfqooKRklHSFQgQ0xPVUQJ8J+rrwpI
QUlSWSBDUkVBVFVSRQnwn6uICk9SQ0EJ8J+rjQpMQU5EU0xJREUJ8J+bmApUUkVBU1VSRSBD
SEVTVAnwn6qOCkRJU1RPUlRFRCBGQUNFCfCfq6oK8J+qiiDwn6uvIPCfq4gg8J+rjSDwn5uY
IPCfqo4g8J+rqgoKIyBFbW9qaSBhbmQgdGV4dCBwcmVzZW50YXRpb24KTEVGVCBSSUdIVCBB
UlJPVywgZW1vamkgc3R5bGUJ4oaU77iPCkxFRlQgUklHSFQgQVJST1csIHRleHQgc3R5bGUJ
4oaU77iOCuKGlO+4jyDihpTvuI4K
--------------CeJ8sANpJ0l1Sx6APhGHX8Xv
Content-Type: text/plain; charset=UTF-8;
name="0001-Produce-padding-glyphs-for-composite-glyphs.patch"
Content-Disposition: attachment;
filename="0001-Produce-padding-glyphs-for-composite-glyphs.patch"
Content-Transfer-Encoding: base64
RnJvbSBiOTdlMTVmZTU5ZjIxNmI3Y2MzMmUyZjZhMzgxZGFhNjQ4ZjFjMmQzIE1vbiBTZXAg
MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBLYWkgTWEgPGp1c3Rrc3FzZkBnbWFpbC5jb20+CkRh
dGU6IFRodSwgMzAgSnVsIDIwMjYgMTY6MjQ6MjggKzAyMDAKU3ViamVjdDogW1BBVENIIDEv
M10gUHJvZHVjZSBwYWRkaW5nIGdseXBocyBmb3IgY29tcG9zaXRlIGdseXBocy4KCiogc3Jj
L3Rlcm0uYyAoYXBwZW5kX2NvbXBvc2l0ZV9nbHlwaCk6IEFkZCBgcGFkZGluZycgYXJndW1l
bnQuCihwcm9kdWNlX2NvbXBvc2l0ZV9nbHlwaCk6IFJlcXVlc3Qgb25lIHBhZGRpbmcgZ2x5
cGggaWYgdGhlIGNvbXBvc2l0ZQpnbHlwaCBoYXMgcGl4ZWxfd2lkdGggPj0gMiBhbmQgdGhl
IGZpcnN0IGNoYXJhY3RlciBoYXMgd2lkdGggPj0gMiwgb3IgaXQKaXMgY29uc2lkZXJlZCBm
b3IgYW4gZW1vamkuCihlbmNvZGVfdGVybWluYWxfY29kZSk6IFNraXAgcGFkZGluZyBnbHlw
aHMgZm9yIGNvbXBvc2l0ZSBnbHlwaHMgYXMKd2VsbC4KKGNvbXBvc2l0ZV9nbHlwaF9pc19l
bW9qaV9zZXF1ZW5jZSk6IEFkZC4KKHR0eS1kaXNwbGF5LWVtb2ppLXdpZGUpOiBBZGQuCi0t
LQogc3JjL3Rlcm0uYyB8IDE1NiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKystLS0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDExNSBpbnNlcnRpb25zKCsp
LCA0MSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvdGVybS5jIGIvc3JjL3Rlcm0u
YwppbmRleCA1MmFlNGY2MTgxNC4uYmQ2NjVjMWE2MjggMTAwNjQ0Ci0tLSBhL3NyYy90ZXJt
LmMKKysrIGIvc3JjL3Rlcm0uYwpAQCAtNTY3LDcgKzU2Nyw3IEBAIGVuY29kZV90ZXJtaW5h
bF9jb2RlIChzdHJ1Y3QgZ2x5cGggKnNyYywgaW50IHNyY19sZW4sCiAgIG5jaGFycyA9IDA7
CiAgIHdoaWxlIChzcmMgPCBzcmNfZW5kKQogICAgIHsKLSAgICAgIGlmIChzcmMtPnR5cGUg
PT0gQ09NUE9TSVRFX0dMWVBIKQorICAgICAgaWYgKHNyYy0+dHlwZSA9PSBDT01QT1NJVEVf
R0xZUEggJiYgISBDSEFSX0dMWVBIX1BBRERJTkdfUCAoKnNyYykpCiAJewogCSAgc3RydWN0
IGNvbXBvc2l0aW9uICpjbXA7CiAJICBMaXNwX09iamVjdCBnc3RyaW5nIFVOSU5JVDsKQEAg
LTE1MjgsNyArMTUyOCw3IEBAICNkZWZpbmUgQ09ORElUSU9OQUxfUkVBU1NJR04oY2FwMSwg
Y2FwMiwgc3ltKQkJCQlcCiAgICBhdmFpbGFibGUgZnJvbSB0aGUgaW5pdGlhbCBmcmFtZSBh
cyBpbiBiYXRjaCBtb2RlLiAgKi8KIAogc3RhdGljIHZvaWQgYXBwZW5kX2dseXBoIChzdHJ1
Y3QgaXQgKik7Ci1zdGF0aWMgdm9pZCBhcHBlbmRfY29tcG9zaXRlX2dseXBoIChzdHJ1Y3Qg
aXQgKik7CitzdGF0aWMgdm9pZCBhcHBlbmRfY29tcG9zaXRlX2dseXBoIChzdHJ1Y3QgaXQg
KiwgaW50IHBhZGRpbmcpOwogc3RhdGljIHZvaWQgcHJvZHVjZV9jb21wb3NpdGVfZ2x5cGgg
KHN0cnVjdCBpdCAqKTsKIHN0YXRpYyB2b2lkIGFwcGVuZF9nbHlwaGxlc3NfZ2x5cGggKHN0
cnVjdCBpdCAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CiBzdGF0aWMgdm9pZCBwcm9kdWNlX2ds
eXBobGVzc19nbHlwaCAoc3RydWN0IGl0ICosIExpc3BfT2JqZWN0KTsKQEAgLTE3NzUsOSAr
MTc3NSwxMCBAQCBwcm9kdWNlX2dseXBocyAoc3RydWN0IGl0ICppdCkKICAgIGZhY2UuICAq
LwogCiBzdGF0aWMgdm9pZAotYXBwZW5kX2NvbXBvc2l0ZV9nbHlwaCAoc3RydWN0IGl0ICpp
dCkKK2FwcGVuZF9jb21wb3NpdGVfZ2x5cGggKHN0cnVjdCBpdCAqaXQsIGludCBwYWRkaW5n
KQogewotICBzdHJ1Y3QgZ2x5cGggKmdseXBoOworICBzdHJ1Y3QgZ2x5cGggKmdseXBoLCAq
ZW5kOworICBpbnQgaSwgd2lkdGggPSAxICsgcGFkZGluZzsKIAogICBlYXNzZXJ0IChpdC0+
Z2x5cGhfcm93KTsKICAgZ2x5cGggPSBpdC0+Z2x5cGhfcm93LT5nbHlwaHNbaXQtPmFyZWFd
ICsgaXQtPmdseXBoX3Jvdy0+dXNlZFtpdC0+YXJlYV07CkBAIC0xNzg5LDc0ICsxNzkwLDEz
MiBAQCBhcHBlbmRfY29tcG9zaXRlX2dseXBoIChzdHJ1Y3QgaXQgKml0KQogICAgICYmICFp
dC0+Z2x5cGhfcm93LT5mdWxsX3dpZHRoX3AKICAgICAmJiAhV0lORE9XX1JJR0hUTU9TVF9Q
IChpdC0+dykKICAgICAmJiBXSU5ET1dfUklHSFRfTUFSR0lOX1dJRFRIIChpdC0+dykgPT0g
MDsKLSAgaWYgKGdseXBoIDwgaXQtPmdseXBoX3Jvdy0+Z2x5cGhzWzEgKyBpdC0+YXJlYV0g
LSByZXNlcnZlX2xhc3QpCisgIGVuZCA9IGl0LT5nbHlwaF9yb3ctPmdseXBoc1sxICsgaXQt
PmFyZWFdIC0gcmVzZXJ2ZV9sYXN0OworICBpZiAoZ2x5cGggPCBlbmQpCiAgICAgewogICAg
ICAgLyogSWYgdGhlIGdseXBoIHJvdyBpcyByZXZlcnNlZCwgd2UgbmVlZCB0byBwcmVwZW5k
IHRoZSBnbHlwaAogCSByYXRoZXIgdGhhbiBhcHBlbmQgaXQuICAqLwogICAgICAgaWYgKGl0
LT5nbHlwaF9yb3ctPnJldmVyc2VkX3AgJiYgaXQtPmFyZWEgPT0gVEVYVF9BUkVBKQogCXsK
IAkgIHN0cnVjdCBnbHlwaCAqZzsKKwkgIGludCBtb3ZlX2J5ID0gd2lkdGg7CiAKIAkgIC8q
IE1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBnbHlwaC4gICovCisJICBpZiAobW92ZV9ieSA+IGVu
ZCAtIGdseXBoKQorCSAgICBtb3ZlX2J5ID0gZW5kIC0gZ2x5cGg7CiAJICBmb3IgKGcgPSBn
bHlwaCAtIDE7IGcgPj0gaXQtPmdseXBoX3Jvdy0+Z2x5cGhzW2l0LT5hcmVhXTsgZy0tKQot
CSAgICBnWzFdID0gKmc7CisJICAgIGdbbW92ZV9ieV0gPSAqZzsKIAkgIGdseXBoID0gaXQt
PmdseXBoX3Jvdy0+Z2x5cGhzW2l0LT5hcmVhXTsKKwkgIGVuZCA9IGdseXBoICsgbW92ZV9i
eTsKIAl9Ci0gICAgICBnbHlwaC0+dHlwZSA9IENPTVBPU0lURV9HTFlQSDsKLSAgICAgIGVh
c3NlcnQgKGl0LT5waXhlbF93aWR0aCA8PSBTSFJUX01BWCk7Ci0gICAgICBnbHlwaC0+cGl4
ZWxfd2lkdGggPSBpdC0+cGl4ZWxfd2lkdGg7Ci0gICAgICBnbHlwaC0+dS5jbXAuaWQgPSBp
dC0+Y21wX2l0LmlkOwotICAgICAgaWYgKGl0LT5jbXBfaXQuY2ggPCAwKQotCXsKLQkgIGds
eXBoLT51LmNtcC5hdXRvbWF0aWMgPSAwOwotCSAgZ2x5cGgtPnUuY21wLmlkID0gaXQtPmNt
cF9pdC5pZDsKLQl9Ci0gICAgICBlbHNlCisKKyAgICAgIGVhc3NlcnQoaXQtPnBpeGVsX3dp
ZHRoIDw9IFNIUlRfTUFYKTsKKyAgICAgIGZvciAoaSA9IDA7CisJICAgaSA8IHdpZHRoICYm
IGdseXBoIDwgZW5kOworCSAgICsraSkKIAl7Ci0JICBnbHlwaC0+dS5jbXAuYXV0b21hdGlj
ID0gMTsKKwkgIGdseXBoLT50eXBlID0gQ09NUE9TSVRFX0dMWVBIOworCSAgZ2x5cGgtPnBp
eGVsX3dpZHRoID0gaXQtPnBpeGVsX3dpZHRoIC0gcGFkZGluZzsKIAkgIGdseXBoLT51LmNt
cC5pZCA9IGl0LT5jbXBfaXQuaWQ7Ci0JICBnbHlwaC0+c2xpY2UuY21wLmZyb20gPSBpdC0+
Y21wX2l0LmZyb207Ci0JICBnbHlwaC0+c2xpY2UuY21wLnRvID0gaXQtPmNtcF9pdC50byAt
IDE7Ci0JfQorCSAgaWYgKGl0LT5jbXBfaXQuY2ggPCAwKQorCSAgICB7CisJICAgICAgZ2x5
cGgtPnUuY21wLmF1dG9tYXRpYyA9IDA7CisJICAgICAgZ2x5cGgtPnUuY21wLmlkID0gaXQt
PmNtcF9pdC5pZDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZ2x5cGgtPnUu
Y21wLmF1dG9tYXRpYyA9IDE7CisJICAgICAgZ2x5cGgtPnUuY21wLmlkID0gaXQtPmNtcF9p
dC5pZDsKKwkgICAgICBnbHlwaC0+c2xpY2UuY21wLmZyb20gPSBpdC0+Y21wX2l0LmZyb207
CisJICAgICAgZ2x5cGgtPnNsaWNlLmNtcC50byA9IGl0LT5jbXBfaXQudG8gLSAxOworCSAg
ICB9CisJICBnbHlwaC0+YXZvaWRfY3Vyc29yX3AgPSBpdC0+YXZvaWRfY3Vyc29yX3A7CisJ
ICBnbHlwaC0+bXVsdGlieXRlX3AgPSBpdC0+bXVsdGlieXRlX3A7CisJICBnbHlwaC0+ZnJh
bWUgPSBpdC0+ZjsKKwkgIGdseXBoLT5mYWNlX2lkID0gaXQtPmZhY2VfaWQ7CisJICBnbHlw
aC0+cGFkZGluZ19wID0gaSA+IDA7CisJICBnbHlwaC0+Y2hhcnBvcyA9IENIQVJQT1MgKGl0
LT5wb3NpdGlvbik7CisJICBnbHlwaC0+b2JqZWN0ID0gaXQtPm9iamVjdDsKKwkgIGlmIChp
dC0+YmlkaV9wKQorCSAgICB7CisJICAgICAgZ2x5cGgtPnJlc29sdmVkX2xldmVsID0gaXQt
PmJpZGlfaXQucmVzb2x2ZWRfbGV2ZWw7CisJICAgICAgZWFzc2VydCAoKGl0LT5iaWRpX2l0
LnR5cGUgJiA3KSA9PSBpdC0+YmlkaV9pdC50eXBlKTsKKwkgICAgICBnbHlwaC0+YmlkaV90
eXBlID0gaXQtPmJpZGlfaXQudHlwZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAg
ICAgZ2x5cGgtPnJlc29sdmVkX2xldmVsID0gMDsKKwkgICAgICBnbHlwaC0+YmlkaV90eXBl
ID0gVU5LTk9XTl9CVDsKKwkgICAgfQogCi0gICAgICBnbHlwaC0+YXZvaWRfY3Vyc29yX3Ag
PSBpdC0+YXZvaWRfY3Vyc29yX3A7Ci0gICAgICBnbHlwaC0+bXVsdGlieXRlX3AgPSBpdC0+
bXVsdGlieXRlX3A7Ci0gICAgICBnbHlwaC0+ZnJhbWUgPSBpdC0+ZjsKLSAgICAgIGdseXBo
LT5mYWNlX2lkID0gaXQtPmZhY2VfaWQ7Ci0gICAgICBnbHlwaC0+cGFkZGluZ19wID0gZmFs
c2U7Ci0gICAgICBnbHlwaC0+Y2hhcnBvcyA9IENIQVJQT1MgKGl0LT5wb3NpdGlvbik7Ci0g
ICAgICBnbHlwaC0+b2JqZWN0ID0gaXQtPm9iamVjdDsKLSAgICAgIGlmIChpdC0+YmlkaV9w
KQotCXsKLQkgIGdseXBoLT5yZXNvbHZlZF9sZXZlbCA9IGl0LT5iaWRpX2l0LnJlc29sdmVk
X2xldmVsOwotCSAgZWFzc2VydCAoKGl0LT5iaWRpX2l0LnR5cGUgJiA3KSA9PSBpdC0+Ymlk
aV9pdC50eXBlKTsKLQkgIGdseXBoLT5iaWRpX3R5cGUgPSBpdC0+YmlkaV9pdC50eXBlOwor
CSAgKytpdC0+Z2x5cGhfcm93LT51c2VkW2l0LT5hcmVhXTsKKwkgICsrZ2x5cGg7CiAJfQot
ICAgICAgZWxzZQorICAgIH0KK30KKworCisvKiBGb3Igc29tZSBlbW9qaSBzZXF1ZW5jZXMs
IHRoZSBmaXJzdCBjaGFyYWN0ZXIgd2lkdGggbWlnaHQgYmUgMS4KKyAgIFBvc3NpYmx5IHJl
bmRlciB0aGVtIGFzIHdpZGUgZ2x5cGhzIGlmIGl0J3MgcmVxdWVzdGVkLiAgKi8KKworc3Rh
dGljIGJvb2wKK2NvbXBvc2l0ZV9nbHlwaF9pc19lbW9qaV9zZXF1ZW5jZSAoc3RydWN0IGl0
ICppdCkKK3sKKyAgTGlzcF9PYmplY3QgZ3N0cmluZzsKKyAgaW50IGZpcnN0LCBzZWNvbmQ7
CisKKyAgLyogU2tpcCBzdGF0aWMgY29tcG9zaXRpb25zLiAgKi8KKyAgaWYgKGl0LT5jbXBf
aXQuY2ggPCAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBnc3RyaW5nID0gY29tcG9zaXRp
b25fZ3N0cmluZ19mcm9tX2lkIChpdC0+Y21wX2l0LmlkKTsKKyAgaWYgKGl0LT5jbXBfaXQu
ZnJvbSArIDEgPj0gaXQtPmNtcF9pdC50bykKKyAgICByZXR1cm4gZmFsc2U7CisgIGZpcnN0
ID0gWEZJWE5VTSAoTEdTVFJJTkdfQ0hBUiAoZ3N0cmluZywgaXQtPmNtcF9pdC5mcm9tKSk7
CisgIHNlY29uZCA9IFhGSVhOVU0gKExHU1RSSU5HX0NIQVIgKGdzdHJpbmcsIGl0LT5jbXBf
aXQuZnJvbSArIDEpKTsKKworICAvKiBCYXNlICsgVlMxNi9Nb2RpZmllci4gICovCisgIGlm
IChzZWNvbmQgPT0gMHhGRTBGIHx8ICgweDFGM0ZCIDw9IHNlY29uZCAmJiBzZWNvbmQgPD0g
MHgxRjNGRikpCisgICAgeworICAgICAgTGlzcF9PYmplY3QgdGFpbCA9IFZhdXRvX2NvbXBv
c2l0aW9uX2Vtb2ppX2VsaWdpYmxlX2NvZGVwb2ludHM7CisKKyAgICAgIEZPUl9FQUNIX1RB
SUwgKHRhaWwpCiAJewotCSAgZ2x5cGgtPnJlc29sdmVkX2xldmVsID0gMDsKLQkgIGdseXBo
LT5iaWRpX3R5cGUgPSBVTktOT1dOX0JUOworCSAgTGlzcF9PYmplY3QgaXRlbSA9IFhDQVIg
KHRhaWwpOworCSAgaWYgKEZJWE5VTVAgKGl0ZW0pICYmIFhGSVhOVU0gKGl0ZW0pID09IGZp
cnN0KQorCSAgICByZXR1cm4gdHJ1ZTsKIAl9Ci0KLSAgICAgICsraXQtPmdseXBoX3Jvdy0+
dXNlZFtpdC0+YXJlYV07Ci0gICAgICArK2dseXBoOworICAgICAgcmV0dXJuIGZhbHNlOwog
ICAgIH0KKworICAvKiBSZWdpb25hbCBJbmRpY2F0b3JzICgiRmxhZ3MiIGluIGVtb2ppX3p3
ai5hd2spLiAgKi8KKyAgaWYgKDB4MUYxRTYgPD0gZmlyc3QgJiYgZmlyc3QgPD0gMHgxRjFG
RgorICAgICAgJiYgMHgxRjFFNiA8PSBzZWNvbmQgJiYgc2Vjb25kIDw9IDB4MUYxRkYpCisg
ICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOwogfQogCiAKIC8qIFByb2R1Y2Ug
YSBjb21wb3NpdGUgZ2x5cGggZm9yIGl0ZXJhdG9yIElULiAgSVQtPmNtcF9pZCBpcyB0aGUg
SUQgb2YKICAgIHRoZSBjb21wb3NpdGlvbi4gIFdlIHNpbXBseSBwcm9kdWNlcyBjb21wb25l
bnRzIG9mIHRoZSBjb21wb3NpdGlvbgogICAgYXNzdW1pbmcgdGhhdCB0aGUgdGVybWluYWwg
aGFzIGEgY2FwYWJpbGl0eSB0byBsYXlvdXQvcmVuZGVyIGl0Ci0gICBjb3JyZWN0bHkuICAq
LworICAgY29ycmVjdGx5LiAgQSBwYWRkaW5nIGdseXBoIGlzIGFkZGVkIGlmIGJvdGggdGhl
IGNvbXBvc2l0aW9uIGFuZCB0aGUKKyAgIGZpcnN0IGNoYXJhY3RlciBoYXMgd2lkdGggPj0g
Mi4gIEFzIGEgc3BlY2lhbCBjYXNlLCBpZiB0aGUgY29tcG9zaXRlCisgICBnbHlwaCBpcyBk
ZXRlcm1pbmVkIHRvIGJlIGFuIGVtb2ppIHNlcXVlbmNlLCBpdCBtYXkgYWxzbyBhZGQgYQor
ICAgcGFkZGluZyBnbHlwaC4gICovCiAKIHN0YXRpYyB2b2lkCiBwcm9kdWNlX2NvbXBvc2l0
ZV9nbHlwaCAoc3RydWN0IGl0ICppdCkKIHsKKyAgaW50IHBhZGRpbmcsIGZpcnN0X2NoYXI7
CisKICAgaWYgKGl0LT5jbXBfaXQuY2ggPCAwKQogICAgIHsKICAgICAgIHN0cnVjdCBjb21w
b3NpdGlvbiAqY21wID0gY29tcG9zaXRpb25fdGFibGVbaXQtPmNtcF9pdC5pZF07CiAKICAg
ICAgIGl0LT5waXhlbF93aWR0aCA9IGNtcC0+d2lkdGg7CisgICAgICBmaXJzdF9jaGFyID0g
aXQtPmM7CiAgICAgfQogICBlbHNlCiAgICAgewpAQCAtMTg2NCwxMCArMTkyMywxNiBAQCBw
cm9kdWNlX2NvbXBvc2l0ZV9nbHlwaCAoc3RydWN0IGl0ICppdCkKIAogICAgICAgaXQtPnBp
eGVsX3dpZHRoID0gY29tcG9zaXRpb25fZ3N0cmluZ193aWR0aCAoZ3N0cmluZywgaXQtPmNt
cF9pdC5mcm9tLAogCQkJCQkJICAgaXQtPmNtcF9pdC50bywgTlVMTCk7CisgICAgICBmaXJz
dF9jaGFyID0gTEdMWVBIX0NIQVIgKExHU1RSSU5HX0dMWVBIIChnc3RyaW5nLAorCQkJCQkJ
aXQtPmNtcF9pdC5mcm9tKSk7CiAgICAgfQotICBpdC0+bmdseXBocyA9IDE7CisKKyAgcGFk
ZGluZyA9IChpdC0+cGl4ZWxfd2lkdGggPj0gMiAmJiBDSEFSQUNURVJfV0lEVEggKGZpcnN0
X2NoYXIpID49IDIpCisgICAgfHwgKHR0eV9kaXNwbGF5X2Vtb2ppX2ZvcmNlX3dpZGUKKwkm
JiBjb21wb3NpdGVfZ2x5cGhfaXNfZW1vamlfc2VxdWVuY2UgKGl0KSk7CisgIGl0LT5uZ2x5
cGhzID0gMSArIHBhZGRpbmc7CiAgIGlmIChpdC0+Z2x5cGhfcm93KQotICAgIGFwcGVuZF9j
b21wb3NpdGVfZ2x5cGggKGl0KTsKKyAgICBhcHBlbmRfY29tcG9zaXRlX2dseXBoIChpdCwg
cGFkZGluZyk7CiB9CiAKIApAQCAtNTI2Niw2ICs1MzMxLDE1IEBAIHN5bXNfb2ZfdGVybSAo
dm9pZCkKIG5vbi1uaWwgdG8gZW5hYmxlIHRoaXMgb3B0aW1pemF0aW9uLiAgKi8pOwogICB0
dHlfY3Vyc29yX21vdmVtZW50X3VzZV9UQUJfQlMgPSAwOwogCisgIERFRlZBUl9CT09MICgi
dHR5LWRpc3BsYXktZW1vamktZm9yY2Utd2lkZSIsIHR0eV9kaXNwbGF5X2Vtb2ppX2ZvcmNl
X3dpZGUsCisgICAgZG9jOiAvKiBXaGV0aGVyIFRUWSBmcmFtZXMgc2hvdWxkIGFsd2F5cyBy
ZW5kZXIgZW1vamkgc2VxdWVuY2VzIGFzCit3aWRlIGdseXBocy4KKworV2hlbiBuaWwsIGVt
b2ppIHNlcXVlbmNlcyB3aG9zZSBmaXJzdCBjaGFyYWN0ZXIncyB3aWR0aCBpcyAxIG1heSBi
ZQorcmVuZGVyZWQgYXMgYSBuYXJyb3cgZ2x5cGggdG8gYmUgY29tcGF0aWJsZSB3aXRoIHNv
bWUgbm9uLWNvbXBsaWFudAordGVybWluYWwgZW11bGF0b3JzLiAgKi8pOworICB0dHlfZGlz
cGxheV9lbW9qaV9mb3JjZV93aWRlID0gMTsKKwogICBkZWZzdWJyICgmU3R0eV9kaXNwbGF5
X2NvbG9yX3ApOwogICBkZWZzdWJyICgmU3R0eV9kaXNwbGF5X2NvbG9yX2NlbGxzKTsKICAg
ZGVmc3ViciAoJlN0dHlfbm9fdW5kZXJsaW5lKTsKLS0gCjIuNTMuMAoK
--------------CeJ8sANpJ0l1Sx6APhGHX8Xv
Content-Type: text/plain; charset=UTF-8;
name="0002-Change-widths-of-East-Asian-Neutral-characters-to-1.patch"
Content-Disposition: attachment;
filename*0="0002-Change-widths-of-East-Asian-Neutral-characters-to-1.pat";
filename*1="ch"
Content-Transfer-Encoding: base64
RnJvbSA3OGIxYzNjMjBmOTFkYjU5YjIyMTlkZTRlZGY1MTUwOGJjMDZjZGM5IE1vbiBTZXAg
MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBLYWkgTWEgPGp1c3Rrc3FzZkBnbWFpbC5jb20+CkRh
dGU6IFdlZCwgNSBBdWcgMjAyNiAwMDo1NjoxOCArMDIwMApTdWJqZWN0OiBbUEFUQ0ggMi8z
XSBDaGFuZ2Ugd2lkdGhzIG9mIEVhc3QgQXNpYW4gTmV1dHJhbCBjaGFyYWN0ZXJzIHRvIDEu
CgpJbiBhY2NvcmRhbmNlIHRvIFVBWCAjMTEgRUQ3CihodHRwczovL3d3dy51bmljb2RlLm9y
Zy9yZXBvcnRzL3RyMTEvdHIxMS00NC5odG1sI0VENykKCj4gWy4uLl0gYmVjYXVzZSBmb3Ig
YWxsIHByYWN0aWNhbCBwdXJwb3NlcyB0aGV5IGJlaGF2ZSBsaWtlIE5hLCB0aGV5IGFyZQo+
IHRyZWF0ZWQgYXMgbmFycm93IGNoYXJhY3RlcnMgKHRoZSBzYW1lIGFzIE5hKSB1bmRlciB0
aGUKPiByZWNvbW1lbmRhdGlvbnMgYmVsb3cuCgoqIGxpc3AvaW50ZXJuYXRpb25hbC9jaGFy
YWN0ZXJzLmVsOiBEbyBub3QgbWFyayBVKzI2OTAtLVUrMjY5MiwgVSsxRjFBRCwKVSsxRkEw
MC0tVSsxRkE1MywgVSsxRkE2MC0tVSsxRkE2RCwgYW5kIFUrMUZCMDAtLVUrMUZCOTIgYXMK
ZG91YmxlLXdpZHRoLCBzaW5jZSB0aGV5IGhhdmUgRWFzdF9Bc2lhbl9XaWR0aD1OZXV0cmFs
IGluIFVuaWNvZGUgMTcuCi0tLQogbGlzcC9pbnRlcm5hdGlvbmFsL2NoYXJhY3RlcnMuZWwg
fCA2ICstLS0tLQogMSBmaWxlIGNoYW5nZWQsIDEgaW5zZXJ0aW9uKCspLCA1IGRlbGV0aW9u
cygtKQoKZGlmZiAtLWdpdCBhL2xpc3AvaW50ZXJuYXRpb25hbC9jaGFyYWN0ZXJzLmVsIGIv
bGlzcC9pbnRlcm5hdGlvbmFsL2NoYXJhY3RlcnMuZWwKaW5kZXggYjI5YjBmOGQwOTQuLjU0
NTU1M2M3OTA0IDEwMDY0NAotLS0gYS9saXNwL2ludGVybmF0aW9uYWwvY2hhcmFjdGVycy5l
bAorKysgYi9saXNwL2ludGVybmF0aW9uYWwvY2hhcmFjdGVycy5lbApAQCAtMTMwNCw3ICsx
MzA0LDcgQEAgP0wKIAkgICAoI3gyNjQ4IC4gI3gyNjUzKQogCSAgICgjeDI2N0YgLiAjeDI2
N0YpCiAgICAgICAgICAgICgjeDI2OEEgLiAjeDI2OEYpCi0JICAgKCN4MjY5MCAuICN4MjY5
MykKKwkgICAoI3gyNjkzIC4gI3gyNjkzKQogCSAgICgjeDI2QTEgLiAjeDI2QTEpCiAJICAg
KCN4MjZBQSAuICN4MjZBQikKIAkgICAoI3gyNkJEIC4gI3gyNkJFKQpAQCAtMTM3NCw3ICsx
Mzc0LDYgQEAgP0wKIAkgICAoI3gxRjBDRiAuICN4MUYwQ0YpCiAJICAgKCN4MUYxOEUgLiAj
eDFGMThFKQogCSAgICgjeDFGMTkxIC4gI3gxRjE5QSkKLQkgICAoI3gxRjFBRCAuICN4MUYx
QUQpCiAJICAgKCN4MUYyMDAgLiAjeDFGMjAyKQogICAgICAgICAgICAoI3gxRjIxMCAuICN4
MUYyM0IpCiAgICAgICAgICAgICgjeDFGMjQwIC4gI3gxRjI0OCkKQEAgLTE0MTMsOCArMTQx
Miw2IEBAID9MCiAJICAgKCN4MUY5MEMgLiAjeDFGOTNBKQogCSAgICgjeDFGOTNDIC4gI3gx
Rjk0NSkKIAkgICAoI3gxRjk0NyAuICN4MUY5RkYpCi0JICAgKCN4MUZBMDAgLiAjeDFGQTUz
KQotCSAgICgjeDFGQTYwIC4gI3gxRkE2RCkKIAkgICAoI3gxRkE3MCAuICN4MUZBN0MpCiAJ
ICAgKCN4MUZBODAgLiAjeDFGQThBKQogCSAgICgjeDFGQThFIC4gI3gxRkFDNikKQEAgLTE0
MjIsNyArMTQxOSw2IEBAID9MCiAJICAgKCN4MUZBQ0QgLiAjeDFGQURDKQogCSAgICgjeDFG
QURGIC4gI3gxRkFFQSkKIAkgICAoI3gxRkFFRiAuICN4MUZBRjgpCi0JICAgKCN4MUZCMDAg
LiAjeDFGQjkyKQogCSAgICgjeDIwMDAwIC4gI3gyRkZGRikKIAkgICAoI3gzMDAwMCAuICN4
M0ZGRkYpKSkpCiAgIChkb2xpc3QgKGVsdCBsKQotLSAKMi41My4wCgo=
--------------CeJ8sANpJ0l1Sx6APhGHX8Xv
Content-Type: text/plain; charset=UTF-8;
name="0003-Compose-emoji-sequences-for-text-terminals.patch"
Content-Disposition: attachment;
filename="0003-Compose-emoji-sequences-for-text-terminals.patch"
Content-Transfer-Encoding: base64
RnJvbSA0YmI5M2IwMzA4YjUzNmU2M2EzYTkxNzA1ZWQ0NTY4NThjMGFhMzUyIE1vbiBTZXAg
MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBLYWkgTWEgPGp1c3Rrc3FzZkBnbWFpbC5jb20+CkRh
dGU6IFdlZCwgNSBBdWcgMjAyNiAwMzowNzozNSArMDIwMApTdWJqZWN0OiBbUEFUQ0ggMy8z
XSBDb21wb3NlIGVtb2ppIHNlcXVlbmNlcyBmb3IgdGV4dCB0ZXJtaW5hbHMuCgoqIGxpc3Av
Y29tcG9zaXRlLmVsIChhdXRvLWNvbXBvc2UtZW1vamktZm9yLXRlcm1pbmFsKTogQWRkLgoo
Y29tcG9zZS1lbW9qaS1nc3RyaW5nKTogQWRkLgooYXV0by1jb21wb3NlLWNoYXJzKTogRGlz
cGF0Y2ggZW1vamkgY29tcG9zaXRpb24gYmFzZWQgb24gdGhlIGZ1bmMKc3ltYm9sLgoqIGFk
bWluL3VuaWRhdGEvTWFrZWZpbGUuaW46IGVtb2ppLXp3ai5lbCBkZXBlbmRzIG9uCmVtb2pp
LXZhcmlhdGlvbi1zZXF1ZW5jZXMudHh0LgoqIGFkbWluL3VuaWRhdGEvZW1vamktendqLmF3
azogQXV0byBHZW5lcmF0ZSB0cmlnZ2VyX2NvZGVwb2ludHMgYW5kIGNoOwp1c2UgY29tcG9z
ZS1lbW9qaS1nc3RyaW5nIGZvciBlbW9qaSBzZXF1ZW5jZXMuCi0tLQogYWRtaW4vdW5pZGF0
YS9NYWtlZmlsZS5pbiAgIHwgIDIgKy0KIGFkbWluL3VuaWRhdGEvZW1vamktendqLmF3ayB8
IDMzICsrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tCiBsaXNwL2NvbXBvc2l0ZS5lbCAg
ICAgICAgICAgfCA0MSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tCiAz
IGZpbGVzIGNoYW5nZWQsIDUwIGluc2VydGlvbnMoKyksIDI2IGRlbGV0aW9ucygtKQogbW9k
ZSBjaGFuZ2UgMTAwNjQ0ID0+IDEwMDc1NSBhZG1pbi91bmlkYXRhL2Vtb2ppLXp3ai5hd2sK
CmRpZmYgLS1naXQgYS9hZG1pbi91bmlkYXRhL01ha2VmaWxlLmluIGIvYWRtaW4vdW5pZGF0
YS9NYWtlZmlsZS5pbgppbmRleCBiOTU0OTkwY2Y5ZS4uNjQwN2FiZDFjNGIgMTAwNjQ0Ci0t
LSBhL2FkbWluL3VuaWRhdGEvTWFrZWZpbGUuaW4KKysrIGIvYWRtaW4vdW5pZGF0YS9NYWtl
ZmlsZS5pbgpAQCAtMTE2LDcgKzExNiw3IEBAIC5QSE9OWToKIGVtb2ppLXp3ai5lbDogJHt1
bmlkaXJ9L2Vtb2ppLXp3ai5lbAogCiB6d2ogPSAke3NyY2Rpcn0vZW1vamktendqLmF3awot
endqX3NvdXJjZXMgPSAke3NyY2Rpcn0vZW1vamktendqLXNlcXVlbmNlcy50eHQgJChzcmNk
aXIpL2Vtb2ppLXNlcXVlbmNlcy50eHQKK3p3al9zb3VyY2VzID0gJHtzcmNkaXJ9L2Vtb2pp
LXp3ai1zZXF1ZW5jZXMudHh0ICQoc3JjZGlyKS9lbW9qaS1zZXF1ZW5jZXMudHh0ICQoc3Jj
ZGlyKS9lbW9qaS12YXJpYXRpb24tc2VxdWVuY2VzLnR4dAogJHt1bmlkaXJ9L2Vtb2ppLXp3
ai5lbDogJHt6d2p9CiAKICMgRG9uJ3QgdXNlICReLCBzaW5jZSB0aGF0IGluY2x1ZGVzIHRo
ZSBhd2sgc2NyaXB0LgpkaWZmIC0tZ2l0IGEvYWRtaW4vdW5pZGF0YS9lbW9qaS16d2ouYXdr
IGIvYWRtaW4vdW5pZGF0YS9lbW9qaS16d2ouYXdrCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9k
ZSAxMDA3NTUKaW5kZXggMWNiNzUwOGU0NDMuLjY4M2E4MzJkNzI4Ci0tLSBhL2FkbWluL3Vu
aWRhdGEvZW1vamktendqLmF3aworKysgYi9hZG1pbi91bmlkYXRhL2Vtb2ppLXp3ai5hd2sK
QEAgLTYwLDI5ICs2MCwyMiBAQAogICAgIHZlY1tlbHRzWzFdXSA9IHZlY1tlbHRzWzFdXSAi
XCIiCiB9CiAKKyMgVGhlIGZvbGxvd2luZyBjb2RlcG9pbnRzIGFyZSBub3QgZW1vamksIGJ1
dCB0aGV5IGFyZSBwYXJ0IG9mCisjIGVtb2ppIHNlcXVlbmNlcy4gIFdlIGhhdmUgY29kZSBp
biBmb250LmM6Zm9udF9yYW5nZSB0aGF0IHdpbGwKKyMgdHJ5IHRvIGRpc3BsYXkgdGhvc2Ug
c2VxdWVuY2VzIHdpdGggdGhlIGVtb2ppIGZvbnQgYW55d2F5LgorIyBHZW5lcmF0ZWQgZnJv
bSBlbW9qaS12YXJpYXRpb24tc2VxdWVuY2VzLnR4dC4KKy9eWzAtOUEtRl0rIEZFMEYgKjsg
KmVtb2ppIHN0eWxlOy8geworICAgIHRyaWdnZXJfY29kZXBvaW50c1srK250cmlnZ2Vyc10g
PSAkMQorICAgIGNoWyQxXSA9ICQxCit9CisKIEVORCB7CiAgICAgIHByaW50ICI7OzsgZW1v
amktendqLmVsIC0tLSBlbW9qaSB6d2ogY2hhcmFjdGVyIGNvbXBvc2l0aW9uIHRhYmxlICAt
Ki0gbGV4aWNhbC1iaW5kaW5nOnQgLSotIgogICAgICBwcmludCAiOzs7IEF1dG9tYXRpY2Fs
bHkgZ2VuZXJhdGVkIGZyb20gYWRtaW4vdW5pZGF0YS9lbW9qaS17endqLSx9c2VxdWVuY2Vz
LnR4dCIKICAgICAgcHJpbnQgIihldmFsLXdoZW4tY29tcGlsZSAocmVxdWlyZSAncmVnZXhw
LW9wdCkpIgogCi0gICAgICMgVGhlIGZvbGxvd2luZyBjb2RlcG9pbnRzIGFyZSBub3QgZW1v
amksIGJ1dCB0aGV5IGFyZSBwYXJ0IG9mCi0gICAgICMgZW1vamkgc2VxdWVuY2VzLiAgV2Ug
aGF2ZSBjb2RlIGluIGZvbnQuYzpmb250X3JhbmdlIHRoYXQgd2lsbAotICAgICAjIHRyeSB0
byBkaXNwbGF5IHRob3NlIHNlcXVlbmNlcyB3aXRoIHRoZSBlbW9qaSBmb250IGFueXdheS4K
LQotICAgICB0cmlnZ2VyX2NvZGVwb2ludHNbMV0gPSAiMjYxRCIKLSAgICAgdHJpZ2dlcl9j
b2RlcG9pbnRzWzJdID0gIjI2RjkiCi0gICAgIHRyaWdnZXJfY29kZXBvaW50c1szXSA9ICIy
NzBDIgotICAgICB0cmlnZ2VyX2NvZGVwb2ludHNbNF0gPSAiMjcwRCIKLSAgICAgdHJpZ2dl
cl9jb2RlcG9pbnRzWzVdID0gIjI3NjQiCi0gICAgIHRyaWdnZXJfY29kZXBvaW50c1s2XSA9
ICIxRjNDQiIKLSAgICAgdHJpZ2dlcl9jb2RlcG9pbnRzWzddID0gIjFGM0NDIgotICAgICB0
cmlnZ2VyX2NvZGVwb2ludHNbOF0gPSAiMUYzRjMiCi0gICAgIHRyaWdnZXJfY29kZXBvaW50
c1s5XSA9ICIxRjNGNCIKLSAgICAgdHJpZ2dlcl9jb2RlcG9pbnRzWzEwXSA9ICIxRjQ0MSIK
LSAgICAgdHJpZ2dlcl9jb2RlcG9pbnRzWzExXSA9ICIxRjU3NCIKLSAgICAgdHJpZ2dlcl9j
b2RlcG9pbnRzWzEyXSA9ICIxRjU3NSIKLSAgICAgdHJpZ2dlcl9jb2RlcG9pbnRzWzEzXSA9
ICIxRjU5MCIKLSAgICAgdHJpZ2dlcl9jb2RlcG9pbnRzWzE0XSA9ICIyMEUzIgorICAgICAj
IEtleWNhcCBjb21iaW5pbmcKKyAgICAgdHJpZ2dlcl9jb2RlcG9pbnRzWysrbnRyaWdnZXJz
XSA9ICIyMEUzIiAgIyBDT01CSU5JTkcgRU5DTE9TSU5HIEtFWUNBUAogCiAgICAgIHByaW50
ICIoc2V0cSBhdXRvLWNvbXBvc2l0aW9uLWVtb2ppLWVsaWdpYmxlLWNvZGVwb2ludHMiCiAg
ICAgIHByaW50ICInKCIKQEAgLTExNCw3ICsxMDcsNyBAQCBFTkQgewogICAgICBwcmludCAi
ICAgICAgICAgICAgICAgICAgICAgICAgKG5jb25jIChjaGFyLXRhYmxlLXJhbmdlIGNvbXBv
c2l0aW9uLWZ1bmN0aW9uLXRhYmxlIChjYXIgZWx0KSkiCiAgICAgIHByaW50ICIgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgKHZlY3RvciAoY2RyIGVsdCkiCiAgICAg
IHByaW50ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAw
IgotICAgICBwcmludCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIydjb21wb3NlLWdzdHJpbmctZm9yLWdyYXBoaWMpKSkpKSIKKyAgICAgcHJpbnQg
IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnY29tcG9z
ZS1lbW9qaS1nc3RyaW5nKSkpKSkiCiAKICAgICAgcHJpbnQgIjs7IFRoZSBmb2xsb3dpbmcg
dHdvIGJsb2NrcyBhcmUgZGVyaXZlZCBieSBoYW5kIGZyb20gZW1vamktc2VxdWVuY2VzLnR4
dCIKICAgICAgcHJpbnQgIjs7IEZJWE1FOiBhZGQgc3VwcG9ydCBmb3IgRW1vamlfS2V5Y2Fw
X1NlcXVlbmNlIG9uY2Ugd2UgbGVhcm4gaG93IHRvIHJlc3BlY3QgRkUwRi9WUy0xNiIKQEAg
LTEzNCw3ICsxMjcsNyBAQCBFTkQgewogICAgICBwcmludCAiICAgICAgICAgICAgICAgICAg
ICAgIChuY29uYyAoY2hhci10YWJsZS1yYW5nZSBjb21wb3NpdGlvbi1mdW5jdGlvbi10YWJs
ZSAjeDFGM0Y0KSIKICAgICAgcHJpbnQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KGxpc3QgKHZlY3RvciBcIlxcVTAwMDFGM0Y0XFxVMDAwRTAwNjdcXFUwMDBFMDA2MlxcXFwo
PzpcXFUwMDBFMDA2NVxcVTAwMEUwMDZFXFxVMDAwRTAwNjdcXFxcfFxcVTAwMEUwMDczXFxV
MDAwRTAwNjNcXFUwMDBFMDA3NFxcXFx8XFxVMDAwRTAwNzdcXFUwMDBFMDA2Q1xcVTAwMEUw
MDczXFxcXClcXFUwMDBFMDA3RlwiIgogICAgICBwcmludCAiICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIDAiCi0gICAgIHByaW50ICIgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydjb21wb3NlLWdzdHJpbmctZm9yLWdy
YXBoaWMpKSkpIgorICAgICBwcmludCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICMnY29tcG9zZS1lbW9qaS1nc3RyaW5nKSkpKSIKIAogICAgICBwcmlu
dGYgIlxuKHByb3ZpZGUgJ2Vtb2ppLXp3aikiCiB9CmRpZmYgLS1naXQgYS9saXNwL2NvbXBv
c2l0ZS5lbCBiL2xpc3AvY29tcG9zaXRlLmVsCmluZGV4IGQ2ZTkyM2Y3ZjI4Li4zMTY1YzBh
ZGQ0OSAxMDA2NDQKLS0tIGEvbGlzcC9jb21wb3NpdGUuZWwKKysrIGIvbGlzcC9jb21wb3Np
dGUuZWwKQEAgLTg5OSwxMSArODk5LDE5IEBAIGF1dG8tY29tcG9zZS1jaGFycwogCiBUaGlz
IGZ1bmN0aW9uIGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGBhdXRvLWNvbXBvc2l0aW9uLWZ1
bmN0aW9uJyAod2hpY2ggc2VlKS4iCiAgIChsZXQgKChnc3RyaW5nIChjb21wb3NpdGlvbi1n
ZXQtZ3N0cmluZyBmcm9tIHRvIGZvbnQtb2JqZWN0IHN0cmluZykpKQotICAgIChpZiAobGdz
dHJpbmctc2hhcGVkLXAgZ3N0cmluZykKLQlnc3RyaW5nCi0gICAgICAob3IgKGZvbnRwIGZv
bnQtb2JqZWN0ICdmb250LW9iamVjdCkKLQkgIChzZXRxIGZ1bmMgJ2NvbXBvc2UtZ3N0cmlu
Zy1mb3ItdGVybWluYWwpKQotICAgICAgKGZ1bmNhbGwgZnVuYyBnc3RyaW5nIGRpcmVjdGlv
bikpKSkKKyAgICAoY29uZAorICAgICAoKGxnc3RyaW5nLXNoYXBlZC1wIGdzdHJpbmcpCisg
ICAgICBnc3RyaW5nKQorICAgICAoKGFuZCAoZXEgZnVuYyAjJ2NvbXBvc2UtZW1vamktZ3N0
cmluZykKKyAgICAgICAgICAgKGZvbnRwIGZvbnQtb2JqZWN0ICdmb250LW9iamVjdCkpCisg
ICAgICAoY29tcG9zZS1nc3RyaW5nLWZvci1ncmFwaGljIGdzdHJpbmcgZGlyZWN0aW9uKSkK
KyAgICAgKChhbmQgKGVxIGZ1bmMgIydjb21wb3NlLWVtb2ppLWdzdHJpbmcpCisgICAgICAg
ICAgIGF1dG8tY29tcG9zZS1lbW9qaS1mb3ItdGVybWluYWwpCisgICAgICAoY29tcG9zZS1l
bW9qaS1nc3RyaW5nIGdzdHJpbmcgZGlyZWN0aW9uKSkKKyAgICAgKChmb250cCBmb250LW9i
amVjdCAnZm9udC1vYmplY3QpCisgICAgICAoZnVuY2FsbCBmdW5jIGdzdHJpbmcgZGlyZWN0
aW9uKSkKKyAgICAgKHQKKyAgICAgIChjb21wb3NlLWdzdHJpbmctZm9yLXRlcm1pbmFsIGdz
dHJpbmcgZGlyZWN0aW9uKSkpKSkKIAogKHB1dCAnYXV0by1jb21wb3NpdGlvbi1tb2RlICdw
ZXJtYW5lbnQtbG9jYWwgdCkKIApAQCAtOTM2LDYgKzk0NCwyOSBAQCBnbG9iYWwtYXV0by1j
b21wb3NpdGlvbi1tb2RlCiAKIChkZWZhbGlhcyAndG9nZ2xlLWF1dG8tY29tcG9zaXRpb24g
J2F1dG8tY29tcG9zaXRpb24tbW9kZSkKIAorKGRlZnZhciBhdXRvLWNvbXBvc2UtZW1vamkt
Zm9yLXRlcm1pbmFsIHQKKyAgIkVuYWJsZSBhdXRvIGNvbXBvc2l0aW9uIG9mIEVtb2ppIHNl
cXVlbmNlcyBvbiB0ZXh0IHRlcm1pbmFscy4KK0Vtb2ppIHNlcXVlbmNlcyBhcmUgY29tcG9z
ZWQgaW50byB0d28tY29sdW1uIGdyYXBoZW1lIGNsdXN0ZXJzLgorCitPbiB0ZXJtaW5hbHMg
d2hlcmUgZW1vamkgY29tcG9zaXRpb24gKFVBWCAjMjYpIGlzIG5vdCBmdWxseSBzdXBwb3J0
ZWQsCitzZXQgdGhpcyB2YXJpYWJsZSB0byBuaWwuCisKK09uIG5vbi1jb21wbGlhbnQgdGVy
bWluYWxzIHdoZXJlIHRoZSB3aWR0aCBvZiB0aGUgZ3JhcGhlbWUgY2x1c3RlciBpcworZGV0
ZXJtaW5lZCBieSB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBjbHVzdGVyLCBzZXQKK2B0
dHktZW1vamktZGlzcGxheS13aWRlJyB0byBuaWwuIikKKworKGRlZnVuIGNvbXBvc2UtZW1v
amktZ3N0cmluZyAoZ3N0cmluZyBfZGlyZWN0aW9uKQorICAiQ29tcG9zZSBFbW9qaSBzZXF1
ZW5jZXMgaW50byBhIGdyYXBoZW1lIGNsdXN0ZXIuCitUaGlzIGZ1bmN0aW9uIGlzIHJlZGly
ZWN0ZWQgdG8gYGNvbXBvc2UtZ2x5cGgtZm9yLWdyYXBoaWMnIGJ5CitgYXV0by1jb21wb3Nl
LWNoYXJzJyBvbiBncmFwaGljYWwgZGlzcGxheS4iCisgIDs7IEVtb2ppIHNlcXVlbmNlcyBh
cmUgbWF0Y2hlZCBleGFjdGx5LgorICAobGV0ICgobmdseXBocyAobGdzdHJpbmctY2hhci1s
ZW4gZ3N0cmluZykpKQorICAgIChkb3RpbWVzIChpIG5nbHlwaHMpCisgICAgICAobGV0ICgo
Z2x5cGggKGxnc3RyaW5nLWdseXBoIGdzdHJpbmcgaSkpKQorICAgICAgICAod2hlbiBnbHlw
aAorICAgICAgICAgIChsZ2x5cGgtc2V0LWZyb20tdG8gZ2x5cGggMCAoMS0gbmdseXBocykp
KSkpKQorICBnc3RyaW5nKQorCiAocHJvdmlkZSAnY29tcG9zaXRlKQogCiA7OzsgY29tcG9z
aXRlLmVsIGVuZHMgaGVyZQotLSAKMi41My4wCgo=
--------------CeJ8sANpJ0l1Sx6APhGHX8Xv--