[1283] in BarnOwl Developers
Zephyr charset-aware patch
daemon@ATHENA.MIT.EDU (Keith Winstein)
Thu Oct 29 18:14:57 2009
Resent-From: nelhage@mit.edu
Resent-To: barnowl-dev-mtg@charon.mit.edu
X-Original-To: nelhage@lunatique.mit.edu
Date: Mon, 2 Feb 2009 22:11:36 -0500 (EST)
From: Keith Winstein <keithw@MIT.EDU>
To: Karl C Ramm <kcr@mit.edu>, Sam Hartman <hartmans@mit.edu>,
Greg Hudson <ghudson@mit.edu>
cc: Keith Winstein <keithw@mit.edu>, Anders Kaseorg <andersk@mit.edu>,
Geoffrey G Thomas <geofft@mit.edu>, Nelson Elhage <nelhage@mit.edu>,
asedeno@mit.edu, "Mark W. Eichin" <eichin@mit.edu>,
dirty-owl-hackers@mit.edu
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
---1257098496-990213503-1233630696=:10167
Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed
Hi Karl, Sam, and Greg,
Please consider the attached beta patch for inclusion in zephyr and the
Debian package. (Also available at
http://web.mit.edu/keithw/www/zephyr/zephyr-transliterate-v2.patch)
As you know, libzephyr and Zephyr are essentially character-encoding
agnostic. This patch makes libzephyr charset aware in the following ways:
(1) It establishes a convention that zephyrgram messages be encoded in the
Universal Multiple-Octet Coded Character Set (Unicode), UTF-8
representation.
It preserves the status quo for zephyrgram header fields like "class"
and "instance," who do not have a specified character set beyond the
ASCII assumption made by the server in canonicalizing according to
case.
(2) For users in a UTF-8 locale (such as en_US.UTF-8), libzephyr maintains
the status quo, sending and receiving zephyrgrams verbatim.
(3) For users whose locale has a different encoding:
(a) The ZReceiveNotice() routine now converts from the wire encoding
(UTF-8) to the user's character set and encoding before
returning a completed ZNotice_t to the application.
(b) The ZSendNotice() routine now converts from the user's
character set and encoding before sending a notice.
====
The patch applies cleanly to the current Debian package, and almost
cleanly to the current Athena Subversion repository. I tested it on Linux
only, with zwgc, vt, and barnowl, and it seems to work in both directions.
Receiving has been tested more solidly than sending.
For testing on linux.mit.edu, you can set your LD_LIBRARY_PATH to
/mit/keithw/zephyr/lib before running barnowl, zwgc, or vt.
(For barnowl, this patch makes barnowl work correctly in a "C" locale on
an ASCII terminal, but it still doesn't work on a Latin-1 terminal in
"en_US", because barnowl internally converts Latin-1 zephyrs to UTF-8. I
understand this feature is going away.)
In theory, the patch should work on Solaris with the GNU libiconv library
(but not with Solaris's iconv() in libc). However, I haven't been able to
compile zephyr on Solaris so far.
I understand X11 zwgc can't currently handle UTF-8, and this patch won't
help things -- if the user is in a UTF-8 locale, then previously
renderable Latin-1 characters will now show up as UTF-8 gobbledygook. I
understand Anders Kaseorg is working on a patch that will make zwgc
correctly render UTF-8 text in X11. Another possibility would be to make
X11 zwgc set its LANG environment variable to "C".
I'm curious what the effect will be on other X11 clients like pidgin or
Adium.
I think this patch is a good compromise between simplicity -- all zephyrs
will now be in one character set -- and the requirement that Unix programs
function in the "C" locale, not to mention the widely-used en_US locale.
It has lowered my own blood pressure, because I use a Latin-1 terminal and
now UTF-8 zephyrs show up correctly instead of as gobbledygook. As more
terminals become UTF-8, these features of libzephyr will become less- and
less-used, and the library will go back to verbatim processing.
Of course I'd appreciate any comments on the patch and what would be
necessary to get it in libzephyr on Athena and in Debian.
Regards,
Keith
---1257098496-990213503-1233630696=:10167
Content-Type: TEXT/x-diff; charset=US-ASCII; name=zephyr-transliterate-v2.patch
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.64L.0902022211360.10167@vinegar-pot.mit.edu>
Content-Description:
Content-Disposition: attachment; filename=zephyr-transliterate-v2.patch
ZGlmZiAtdXIgemVwaHlyLTIuMS4yMDA3MDcxOS5TTkFQU0hPVC9oL3plcGh5
ci96ZXBoeXIuaCB6ZXBoeXItcGF0Y2hlZC9oL3plcGh5ci96ZXBoeXIuaA0K
LS0tIHplcGh5ci0yLjEuMjAwNzA3MTkuU05BUFNIT1QvaC96ZXBoeXIvemVw
aHlyLmgJMjAwOS0wMi0wMiAyMDo0NDo1NC4wMDAwMDAwMDAgLTA1MDANCisr
KyB6ZXBoeXItcGF0Y2hlZC9oL3plcGh5ci96ZXBoeXIuaAkyMDA5LTAyLTAy
IDIwOjI2OjUwLjAwMDAwMDAwMCAtMDUwMA0KQEAgLTQyLDcgKzQyLDcgQEAN
CiANCiAjZGVmaW5lIFpWRVJTSU9OSERSCSJaRVBIIg0KICNkZWZpbmUgWlZF
UlNJT05NQUpPUgkwDQotI2RlZmluZSBaVkVSU0lPTk1JTk9SCTINCisjZGVm
aW5lIFpWRVJTSU9OTUlOT1IJMyAvKiBaZXBoeXIgbWVzc2FnZXMgYXJlIG5v
dyBVVEYtOC4gKi8NCiANCiAjZGVmaW5lIFpfTUFYUEtUTEVOCQkxMDI0DQog
I2RlZmluZSBaX01BWEhFQURFUkxFTgkJODAwDQpAQCAtNTQsNiArNTQsMTAg
QEANCiAjZGVmaW5lIFpBVVRIX1lFUyAgICAgICAJMQ0KICNkZWZpbmUgWkFV
VEhfTk8gICAgICAgIAkwDQogDQorLyogRGlyZWN0aW9ucyBmb3IgY2hhcnNl
dCBjb252ZXJzaW9uICovDQorI2RlZmluZSBaX0NPTlZFUlRfSU5DT01JTkcg
ICAgICAwDQorI2RlZmluZSBaX0NPTlZFUlRfT1VUR09JTkcgICAgICAxDQor
DQogdHlwZWRlZiBjaGFyIFpQYWNrZXRfdFtaX01BWFBLVExFTl07DQogDQog
LyogUGFja2V0IHR5cGUgKi8NCkBAIC0yMTEsNiArMjE1LDggQEANCiBDb2Rl
X3QgWkNhbmNlbFN1YnNjcmlwdGlvbnMgWlAoKHVuc2lnbmVkIGludCBwb3J0
KSk7DQogaW50IFpQZW5kaW5nIFpQKCh2b2lkKSk7DQogQ29kZV90IFpSZWNl
aXZlTm90aWNlIFpQKChaTm90aWNlX3QgKm5vdGljZSwgc3RydWN0IHNvY2th
ZGRyX2luICpmcm9tKSk7DQorDQorQ29kZV90IFpDaGFyYWN0ZXJDb252ZXJ0
IFpQKChjaGFyKiosIGludCwgWk5vdGljZV90ICosIGludCkpOw0KICNpZmRl
ZiBaX0RFQlVHDQogdm9pZCBaX2RlYnVnIFpQKChaQ09OU1QgY2hhciAqLCAu
Li4pKTsNCiAjZW5kaWYNCmRpZmYgLXVyIHplcGh5ci0yLjEuMjAwNzA3MTku
U05BUFNIT1QvbGliL01ha2VmaWxlLmluIHplcGh5ci1wYXRjaGVkL2xpYi9N
YWtlZmlsZS5pbg0KLS0tIHplcGh5ci0yLjEuMjAwNzA3MTkuU05BUFNIT1Qv
bGliL01ha2VmaWxlLmluCTIwMDktMDItMDIgMjA6NDQ6NTQuMDAwMDAwMDAw
IC0wNTAwDQorKysgemVwaHlyLXBhdGNoZWQvbGliL01ha2VmaWxlLmluCTIw
MDktMDItMDIgMTk6NDM6NTYuMDAwMDAwMDAwIC0wNTAwDQpAQCAtMzksNyAr
MzksNyBAQA0KIAlaUGVla0lmTm90LmxvIFpQZWVrTm90LmxvIFpQZWVrUGt0
LmxvIFpQZW5kaW5nLmxvIFpSZWFkQXNjaWkubG8gXA0KIAlaUmVjdk5vdC5s
byBaUmVjdlBrdC5sbyBaUmV0U3Vicy5sbyBaU2VuZExpc3QubG8gWlNlbmRO
b3QubG8gXA0KIAlaU2VuZFBrdC5sbyBaU2VuZFJhdy5sbyBaU2VuZFJMc3Qu
bG8gWlNldERlc3QubG8gWlNldEZELmxvIFpTZXRTcnYubG8gXA0KLQlaU3Vi
cy5sbyBaVmFyaWFibGVzLmxvIFpXYWl0NE5vdC5sbyBaaW50ZXJuYWwubG8N
CisJWlN1YnMubG8gWlZhcmlhYmxlcy5sbyBaV2FpdDROb3QubG8gWmludGVy
bmFsLmxvIFpDaGFyQ29udi5sbw0KIA0KIC5TVUZGSVhFUzogLmxvDQogDQpk
aWZmIC11ciB6ZXBoeXItMi4xLjIwMDcwNzE5LlNOQVBTSE9UL2xpYi9aQ2hh
ckNvbnYuYyB6ZXBoeXItcGF0Y2hlZC9saWIvWkNoYXJDb252LmMNCi0tLSB6
ZXBoeXItMi4xLjIwMDcwNzE5LlNOQVBTSE9UL2xpYi9aQ2hhckNvbnYuYwky
MDA5LTAyLTAyIDIwOjQ1OjEwLjAwMDAwMDAwMCAtMDUwMA0KKysrIHplcGh5
ci1wYXRjaGVkL2xpYi9aQ2hhckNvbnYuYwkyMDA5LTAyLTAyIDIwOjMyOjE0
LjAwMDAwMDAwMCAtMDUwMA0KQEAgLTAsMCArMSwzNjAgQEANCisvKiBUaGlz
IGZpbGUgaXMgcGFydCBvZiB0aGUgUHJvamVjdCBBdGhlbmEgWmVwaHlyIE5v
dGlmaWNhdGlvbiBTeXN0ZW0uDQorICogSXQgY29udGFpbnMgc291cmNlIGZv
ciBaQ2hhcmFjdGVyQ29udmVydCBmdW5jdGlvbi4NCisgKg0KKyAqCUNyZWF0
ZWQgYnk6CUtlaXRoIFdpbnN0ZWluDQorICoNCisgKglDb3B5cmlnaHQgKGMp
IDIwMDkgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hu
b2xvZ3kuDQorICoJRm9yIGNvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBpbmZv
cm1hdGlvbiwgc2VlIHRoZSBmaWxlDQorICoJIm1pdC1jb3B5cmlnaHQuaCIu
IA0KKyAqLw0KKw0KKyNpbmNsdWRlIDxpbnRlcm5hbC5oPg0KKw0KKyNpbmNs
dWRlIDxpY29udi5oPg0KKyNpbmNsdWRlIDxsYW5naW5mby5oPg0KKyNpbmNs
dWRlIDxsb2NhbGUuaD4NCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVk
ZSA8c3RyaW5nLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNpbmNsdWRl
IDxlcnJuby5oPg0KKw0KK2ludCBsb2NhbGVfc2V0dXAoIGNoYXIgKipsb2Nh
bF9lbmNvZGluZywgY2hhciAqKnNhdmVkX2xvY2FsZSApOw0KK3ZvaWQgbG9j
YWxlX2ZpbmlzaCggY2hhciAqbG9jYWxfZW5jb2RpbmcsIGNoYXIgKnNhdmVk
X2xvY2FsZSApOw0KK2ludCBnZXRfb3V0cHV0X2xlbmd0aCggY2hhciAqZGVz
dGVuY29kaW5nLCBjaGFyICpzcmNlbmNvZGluZywNCisJCSAgICAgICBjaGFy
ICptZXNzYWdlLCBzaXplX3QgbGVuICk7DQoraW50IGRvX2NvbnZlcnQoIGNo
YXIgKmRlc3RlbmNvZGluZywgY2hhciAqc3JjZW5jb2RpbmcsDQorCQljaGFy
ICpkc3QsIHNpemVfdCBkc3RfbGVuLA0KKwkJY2hhciAqc3JjLCBzaXplX3Qg
c3JjX2xlbiApOw0KKw0KK0NvZGVfdCBaQ2hhcmFjdGVyQ29udmVydCggYnVm
cHRyLCBsZW4sIG5vdGljZSwgZGlyZWN0aW9uICkNCisgICAgIGNoYXIgKipi
dWZwdHI7DQorICAgICBpbnQgbGVuOw0KKyAgICAgWk5vdGljZV90ICpub3Rp
Y2U7DQorICAgICBpbnQgZGlyZWN0aW9uOw0KK3sNCisgIENvZGVfdCByZXR2
YWw7DQorICBjaGFyICplbmNvZGluZywgKmxvY2FsX2VuY29kaW5nLCAqc2F2
ZWRfbG9jYWxlOw0KKyAgY2hhciAqbGFuZywgKmxjYWxsOw0KKyAgY2hhciB0
cmVhdF9wb3NpeF9hc19lbmdsaXNoID0gMDsNCisgIGNoYXIgKm9yaWdfcGFj
a2V0Ow0KKyAgY2hhciB1dGY4dHJhbnNsaXRbMTZdID0gIlVURi04Ly9UUkFO
U0xJVCI7DQorICBjaGFyICpidWZmZXIgPSAqYnVmcHRyOw0KKw0KKyAgaW50
IG5ld19tZXNzYWdlX2xlbmd0aCwgb2xkX21lc3NhZ2VfbGVuZ3RoLCBoZWFk
ZXJfbGVuZ3RoOw0KKw0KKyAgY2hhciAqc3JjLCAqZHN0OyAvKiBUaGUgdHdv
IGVuY29kaW5ncyAqLw0KKw0KKyAgLyogVGhpcyBhbGxvY2F0ZXMgc3BhY2Ug
Zm9yIGxvY2FsX2VuY29kaW5nIGFuZCBzYXZlZF9sb2NhbGUgKi8NCisgIGlm
ICggbG9jYWxlX3NldHVwKCAmbG9jYWxfZW5jb2RpbmcsICZzYXZlZF9sb2Nh
bGUgKSA8IDAgKSB7DQorICAgIC8qIEVpdGhlciB3ZSBjYW4ndCB0cmFuc2Nv
ZGUsIG9yIHdlIGRvbid0IG5lZWQgdG8gKi8NCisgICAgcmV0dXJuIGVycm5v
Ow0KKyAgfQ0KKw0KKyAgc3dpdGNoICggZGlyZWN0aW9uICkgew0KKyAgY2Fz
ZSBaX0NPTlZFUlRfSU5DT01JTkc6DQorICAgIHNyYyA9IHV0Zjh0cmFuc2xp
dDsNCisgICAgZHN0ID0gbG9jYWxfZW5jb2Rpbmc7DQorICAgIGJyZWFrOw0K
KyAgY2FzZSBaX0NPTlZFUlRfT1VUR09JTkc6DQorICAgIHNyYyA9IGxvY2Fs
X2VuY29kaW5nOw0KKyAgICBkc3QgPSB1dGY4dHJhbnNsaXQ7DQorICAgIGJy
ZWFrOw0KKyAgZGVmYXVsdDoNCisgICAgZnByaW50Ziggc3RkZXJyLCAiVW5r
bm93biBjb252ZXJzdGlvbiBkaXJlY3Rpb24gJWQuXG4iLCBkaXJlY3Rpb24g
KTsNCisgICAgbG9jYWxlX2ZpbmlzaCggbG9jYWxfZW5jb2RpbmcsIHNhdmVk
X2xvY2FsZSApOw0KKyAgICByZXR1cm4gRUlOVkFMOw0KKyAgfQ0KKw0KKyAg
LyogRmluZCBvdXQgaG93IG11Y2ggbW9yZSBvciBsZXNzIHNwYWNlIHdlIHdp
bGwgbmVlZCAqLw0KKyAgaGVhZGVyX2xlbmd0aCA9IG5vdGljZS0+el9tZXNz
YWdlIC0gbm90aWNlLT56X3BhY2tldDsNCisgIG9sZF9tZXNzYWdlX2xlbmd0
aCA9IG5vdGljZS0+el9tZXNzYWdlX2xlbjsNCisgIG5ld19tZXNzYWdlX2xl
bmd0aCA9IGdldF9vdXRwdXRfbGVuZ3RoKCBkc3QsIHNyYywNCisJCQkJCSAg
bm90aWNlLT56X21lc3NhZ2UsDQorCQkJCQkgIG5vdGljZS0+el9tZXNzYWdl
X2xlbiApOw0KKyAgaWYgKCBuZXdfbWVzc2FnZV9sZW5ndGggPCAwICkgew0K
KyAgICAvKiBDYW4ndCB0cmFuc2NvZGUsIGxlYXZlIHBhY2tldCBhcy1pcyAq
Lw0KKyAgICBsb2NhbGVfZmluaXNoKCBsb2NhbF9lbmNvZGluZywgc2F2ZWRf
bG9jYWxlICk7DQorICAgIHJldHVybiBaRVJSX05PTkU7DQorICB9DQorDQor
ICAvKiBTdG9yZSBvcmlnaW5hbCBwYWNrZXQgZWxzZXdoZXJlICovDQorICBp
ZiAoIG5vdGljZS0+el9wYWNrZXQgIT0gYnVmZmVyICkgew0KKyAgICBmcHJp
bnRmKCBzdGRlcnIsICJub3RpY2UtPnpfcGFja2V0ICE9IGJ1ZmZlciIgKTsN
CisgICAgbG9jYWxlX2ZpbmlzaCggbG9jYWxfZW5jb2RpbmcsIHNhdmVkX2xv
Y2FsZSApOw0KKyAgICByZXR1cm4gRUlOVkFMOw0KKyAgfQ0KKyAgb3JpZ19w
YWNrZXQgPSAoY2hhciAqKSBtYWxsb2MoIGxlbiApOw0KKyAgaWYgKCBvcmln
X3BhY2tldCA9PSBOVUxMICkgcmV0dXJuIEVOT01FTTsNCisgIG1lbWNweSgg
b3JpZ19wYWNrZXQsIGJ1ZmZlciwgbGVuICk7ICANCisNCisgIC8qIE1ha2Ug
YSBuZXcgYnVmZmVyICovDQorICAqYnVmcHRyID0gKGNoYXIgKikgcmVhbGxv
YyggYnVmZmVyLCBoZWFkZXJfbGVuZ3RoICsgbmV3X21lc3NhZ2VfbGVuZ3Ro
ICk7DQorICBidWZmZXIgPSAqYnVmcHRyOw0KKyAgaWYgKCBOVUxMID09IGJ1
ZmZlciApIHsNCisgICAgcGVycm9yKCAicmVhbGxvYyIgKTsNCisgICAgbG9j
YWxlX2ZpbmlzaCggbG9jYWxfZW5jb2RpbmcsIHNhdmVkX2xvY2FsZSApOw0K
KyAgICByZXR1cm4gRU5PTUVNOw0KKyAgfQ0KKw0KKyAgLyogUGF0Y2ggdXAg
cGFydCBvZiB0aGUgbm90aWNlICovDQorICBub3RpY2UtPnpfcGFja2V0ID0g
YnVmZmVyOw0KKyAgbm90aWNlLT56X21lc3NhZ2UgPSBidWZmZXIgKyBoZWFk
ZXJfbGVuZ3RoOw0KKyAgbm90aWNlLT56X21lc3NhZ2VfbGVuID0gbmV3X21l
c3NhZ2VfbGVuZ3RoOw0KKw0KKyAgLyogQ29udmVydCB0byB1c2VyIGxvY2Fs
ZSAqLw0KKyAgaWYgKCBkb19jb252ZXJ0KCBkc3QsIHNyYywNCisJCSAgIG5v
dGljZS0+el9tZXNzYWdlLCBuZXdfbWVzc2FnZV9sZW5ndGgsDQorCQkgICBv
cmlnX3BhY2tldCArIGhlYWRlcl9sZW5ndGgsIG9sZF9tZXNzYWdlX2xlbmd0
aCApIDwgMCApIHsNCisgICAgbG9jYWxlX2ZpbmlzaCggbG9jYWxfZW5jb2Rp
bmcsIHNhdmVkX2xvY2FsZSApOw0KKyAgICByZXR1cm4gRUlOVkFMOw0KKyAg
fQ0KKw0KKyAgbG9jYWxlX2ZpbmlzaCggbG9jYWxfZW5jb2RpbmcsIHNhdmVk
X2xvY2FsZSApOw0KKw0KKyAgLyogRml4IHJlc3Qgb2Ygbm90aWNlIGZpZWxk
cyAqLw0KKyAgaWYgKChyZXR2YWwgPSBaUGFyc2VOb3RpY2UoYnVmZmVyLCBo
ZWFkZXJfbGVuZ3RoICsgbmV3X21lc3NhZ2VfbGVuZ3RoLA0KKwkJCSAgICAg
bm90aWNlKSkgIT0gWkVSUl9OT05FKSB7DQorICAgIHJldHVybiAocmV0dmFs
KTsNCisgIH0NCisNCisgIHJldHVybiBaRVJSX05PTkU7DQorfQ0KKw0KK2lu
dCBsb2NhbGVfc2V0dXAoIGNoYXIgKipsb2NhbF9lbmNvZGluZywgY2hhciAq
KnNhdmVkX2xvY2FsZSApIHsNCisgIGNoYXIgKmVuY29kaW5nLCAqbGNhbGws
ICpsYW5nOw0KKyAgY2hhciB0cmVhdF9wb3NpeF9hc19lbmdsaXNoID0gMDsN
CisgIGNoYXIgKmN1cl9sb2NhbGU7DQorDQorICBjdXJfbG9jYWxlID0gc2V0
bG9jYWxlKCBMQ19BTEwsIE5VTEwgKTsNCisgIGlmICggY3VyX2xvY2FsZSA9
PSBOVUxMICkgew0KKyAgICBmcHJpbnRmKCBzdGRlcnIsICJCYWQgY3VycmVu
dCBsb2NhbGUuXG4iICk7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisNCisg
ICpzYXZlZF9sb2NhbGUgPSBzdHJkdXAoIGN1cl9sb2NhbGUgKTsNCisgIGlm
ICggKnNhdmVkX2xvY2FsZSA9PSBOVUxMICkgew0KKyAgICBwZXJyb3IoICJz
dHJkdXAiICk7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisNCisgIC8qIExv
YWQgbG9jYWxlIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzICovDQorICBp
ZiAoIE5VTEwgPT0gc2V0bG9jYWxlKCBMQ19BTEwsICIiICkgKSB7DQorICAg
IGZwcmludGYoIHN0ZGVyciwgIkludmFsaWQgbG9jYWxlLlxuIiApOw0KKyAg
ICBmcmVlKCAqc2F2ZWRfbG9jYWxlICk7DQorICAgIGVycm5vID0gRUlOVkFM
Ow0KKyAgICByZXR1cm4gLTE7DQorICB9DQorDQorICAvKiBGaWd1cmUgb3V0
IHdoYXQgY2hhcnNldCB1c2VyIGlzIHVzaW5nICovDQorICBlbmNvZGluZyA9
IG5sX2xhbmdpbmZvKCBDT0RFU0VUICk7DQorICBpZiAoICFzdHJjbXAoICJV
VEYtOCIsIGVuY29kaW5nICkgKSB7DQorICAgIC8qIFplcGh5ciBpcyBVVEYt
OCBvbiB0aGUgd2lyZSwgc28gbm8gY29udmVyc2lvbiBuZWNlc3NhcnkgKi8N
CisgICAgZnJlZSggKnNhdmVkX2xvY2FsZSApOw0KKyAgICBlcnJubyA9IFpF
UlJfTk9ORTsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKw0KKyAgaWYgKCAh
c3RyY21wKCAiIiwgZW5jb2RpbmcgKSApIHsNCisgICAgZnByaW50Ziggc3Rk
ZXJyLCAiSW52YWxpZCBjaGFyYWN0ZXIgZW5jb2RpbmcuXG4iICk7DQorICAg
IGZyZWUoICpzYXZlZF9sb2NhbGUgKTsNCisgICAgZXJybm8gPSBFSU5WQUw7
DQorICAgIHJldHVybiAtMTsNCisgIH0NCisNCisgIC8qIERlc3RpbmF0aW9u
IHdpbGwgYmUgdHJhbnNsaXRlcmF0aW5nICovDQorICAqbG9jYWxfZW5jb2Rp
bmcgPSAoY2hhciAqKSBtYWxsb2MoIHN0cmxlbiggZW5jb2RpbmcgKSArIDEx
ICk7DQorICBpZiAoICpsb2NhbF9lbmNvZGluZyA9PSBOVUxMICkgew0KKyAg
ICBwZXJyb3IoICJtYWxsb2MiICk7DQorICAgIGZyZWUoICpzYXZlZF9sb2Nh
bGUgKTsNCisgICAgZXJybm8gPSBFTk9NRU07DQorICAgIHJldHVybiAtMTsN
CisgIH0NCisNCisgIHN0cmNweSggKmxvY2FsX2VuY29kaW5nLCBlbmNvZGlu
ZyApOw0KKyAgc3RyY2F0KCAqbG9jYWxfZW5jb2RpbmcsICIvL1RSQU5TTElU
IiApOw0KKw0KKyAgLyogTm90ZTogdGhlIHRyYW5zbGl0ZXJhdGlvbiBiZWhh
dmlvciBvZiBpY29udigpIGRlcGVuZHMgb24gdGhlDQorICAgICB1c2VyJ3Mg
bGFuZ3VhZ2UuIEluIHRoZSAiZW5fVVMiIG9yICJlbl9VUy5VVEYtOCIgbG9j
YWxlcywgaWNvbnYoKQ0KKyAgICAgcHJvdmlkZXMgYmV0dGVyIHRyYW5zbGl0
ZXJhdGlvbiAtLSBlLmcuLCB3aGVuIGljb252KClpbmcgZnJvbQ0KKyAgICAg
VVRGLTggdG8gQVNDSUkvL1RSQU5TTElULCBhLXdpdGgtY2lyY3VtZmxleCB3
aWxsIGJlY29tZSBhDQorICAgICBxdWVzdGlvbiBtYXJrIGlmIHdlIGFyZSBp
biB0aGUgQyBsb2NhbGUsIGFuZCBhIG5vcm1hbCAiYSIgaWYgd2UNCisgICAg
IGFyZSBpbiB0aGUgImVuX1VTIiBvciAiZW5fVVMuVVRGLTgiIGxvY2FsZXMu
DQorDQorICAgICBGb3IgcGVvcGxlIHdpdGggbm8gbG9jYWxlLCBvciBpbiB0
aGUgIkMiIG9yICJQT1NJWCIgbG9jYWxlLA0KKyAgICAgd2UgcHV0IHRoZW0g
aW4gImVuX1VTIiBmb3IgYmV0dGVyIHRyYW5zbGl0ZXJhdGlvbi4gKi8NCisg
IGxjYWxsID0gZ2V0ZW52KCAiTENfQUxMIiApOw0KKyAgbGFuZyA9IGdldGVu
diggIkxBTkciICk7DQorDQorICBpZiAoIChsY2FsbCA9PSBOVUxMKSAmJiAo
bGFuZyA9PSBOVUxMKSApIHsNCisgICAgdHJlYXRfcG9zaXhfYXNfZW5nbGlz
aCA9IDE7DQorICB9IGVsc2UgaWYgKCBsY2FsbCAmJiAoIXN0cmNtcCggbGNh
bGwsICJQT1NJWCIgKSB8fCAhc3RyY21wKCBsY2FsbCwgIkMiICkpICkgew0K
KyAgICB0cmVhdF9wb3NpeF9hc19lbmdsaXNoID0gMTsNCisgIH0gZWxzZSBp
ZiAoIGxhbmcgJiYgKCFzdHJjbXAoIGxhbmcsICJQT1NJWCIgKSB8fCAhc3Ry
Y21wKCBsYW5nLCAiQyIgKSkgKSB7DQorICAgIHRyZWF0X3Bvc2l4X2FzX2Vu
Z2xpc2ggPSAxOw0KKyAgfQ0KKw0KKyAgaWYgKCB0cmVhdF9wb3NpeF9hc19l
bmdsaXNoICkgew0KKyAgICBpZiAoIE5VTEwgPT0gc2V0bG9jYWxlKCBMQ19B
TEwsICJlbl9VUyIgKSApIHsNCisgICAgICBpZiAoIE5VTEwgPT0gc2V0bG9j
YWxlKCBMQ19BTEwsICJlbl9VUy5VVEYtOCIgKSApIHsNCisJLyogR2l2ZSB1
cCBvbiBFbmdsaXNoICovDQorCWlmICggTlVMTCA9PSBzZXRsb2NhbGUoIExD
X0FMTCwgIiIgKSApIHsNCisJICBmcHJpbnRmKCBzdGRlcnIsICJJbnZhbGlk
IGxvY2FsZSBhbmQgbm8gRW5nbGlzaC5cbiIgKTsNCisJICBmcmVlKCAqc2F2
ZWRfbG9jYWxlICk7DQorCSAgZnJlZSggKmxvY2FsX2VuY29kaW5nICk7DQor
CSAgZXJybm8gPSBFSU5WQUw7DQorCSAgcmV0dXJuIC0xOw0KKwl9DQorICAg
ICAgfQ0KKyAgICB9DQorICB9DQorDQorICByZXR1cm4gMDsNCit9DQorDQor
dm9pZCBsb2NhbGVfZmluaXNoKCBjaGFyICpsb2NhbF9lbmNvZGluZywgY2hh
ciAqc2F2ZWRfbG9jYWxlICkNCit7DQorICAvKiBSZXN0b3JlIHJlYWwgbG9j
YWxlIGFuZCBmcmVlIGxvY2FsX2VuY29kaW5nICovDQorICBpZiAoIE5VTEwg
PT0gc2V0bG9jYWxlKCBMQ19BTEwsIHNhdmVkX2xvY2FsZSApICkgew0KKyAg
ICBmcHJpbnRmKCBzdGRlcnIsICJJbnZhbGlkIGxvY2FsZSAoJXMpIGluIHJl
c3RvcmUuXG4iLCBzYXZlZF9sb2NhbGUgKTsNCisgIH0NCisNCisgIGZyZWUo
IHNhdmVkX2xvY2FsZSApOw0KKyAgZnJlZSggbG9jYWxfZW5jb2RpbmcgKTsN
Cit9DQorDQoraW50IGdldF9vdXRwdXRfbGVuZ3RoKCBjaGFyICpkZXN0ZW5j
b2RpbmcsIGNoYXIgKnNyY2VuY29kaW5nLA0KKwkJICAgICAgIGNoYXIgKm1l
c3NhZ2UsIHNpemVfdCBsZW4gKQ0KK3sNCisgIGludCB0aGVfbGVuZ3RoID0g
MDsNCisgIGljb252X3QgY29udmVydGVyOw0KKyAgc2l6ZV90IGluYnl0ZXNs
ZWZ0LCBvdXRsZW4gPSAxLCBvdXRieXRlc2xlZnQ7DQorICAvKiBCZXR0ZXIg
bGVuZ3RoIHdvdWxkIGJlIDMyNzY4LCBidXQgdXNlIDEgaGVyZSB0byBzdHJl
c3MgKi8NCisNCisgIGNoYXIgKm91dGJ1ZjsNCisgIGNoYXIgKm91dHB0ciwg
KmlucHRyOw0KKw0KKyAgY29udmVydGVyID0gaWNvbnZfb3BlbiggZGVzdGVu
Y29kaW5nLCBzcmNlbmNvZGluZyApOw0KKyAgaWYgKCBjb252ZXJ0ZXIgPT0g
KGljb252X3QpIC0xICkgew0KKyAgICBwZXJyb3IoICJpY29udl9vcGVuIiAp
Ow0KKyAgICByZXR1cm4gLTE7DQorICB9DQorDQorICB3aGlsZSggMSApIHsN
CisgICAgLyogQXR0ZW1wdCBjb252ZXJzaW9uIHdpdGggaW5jcmVhc2luZ2x5
LWxhcmdlciBidWZmZXJzICovDQorICAgIC8qIFRoaXMgc2hvdWxkbid0IGJl
IG5lY2Vzc2FyeSwgYnV0IEdOVSBpY29udigpIGRvZXMgbm90IGhhbmRsZQ0K
KyAgICAgICBFMkJJRyBhY2NvcmRpbmcgdG8gUE9TSVggLS0gaXQgbGVhdmVz
IHZhcmlhYmxlcyBpbiBhbiBpbmNvbnNpc3RlbnQNCisgICAgICAgc3RhdGUu
ICovDQorDQorICAgIHNpemVfdCByZXQ7DQorDQorICAgIG91dGJ1ZiA9IChj
aGFyICopIG1hbGxvYyggb3V0bGVuICk7DQorICAgIGlmICggb3V0YnVmID09
IE5VTEwgKSB7DQorICAgICAgcGVycm9yKCAibWFsbG9jIiApOw0KKyAgICAg
IGlmICggaWNvbnZfY2xvc2UoIGNvbnZlcnRlciApIDwgMCApIHsNCisJcGVy
cm9yKCAiaWNvbnZfY2xvc2UiICk7DQorICAgICAgfQ0KKyAgICAgIHJldHVy
biAtMTsNCisgICAgfQ0KKw0KKyAgICBpbnB0ciA9IG1lc3NhZ2U7DQorICAg
IG91dHB0ciA9IG91dGJ1ZjsNCisNCisgICAgaW5ieXRlc2xlZnQgPSBsZW47
DQorICAgIG91dGJ5dGVzbGVmdCA9IG91dGxlbjsNCisNCisgICAgcmV0ID0g
aWNvbnYoIGNvbnZlcnRlciwgJmlucHRyLCAmaW5ieXRlc2xlZnQsICZvdXRw
dHIsICZvdXRieXRlc2xlZnQgKTsNCisNCisgICAgaWYgKCByZXQgPT0gLTEg
KSB7DQorICAgICAgaWYgKCBlcnJubyA9PSBFSUxTRVEgKSB7DQorCS8vICAg
ICAgICBmcHJpbnRmKCBzdGRlcnIsICJJbnZhbGlkIG11bHRpYnl0ZSBzZXF1
ZW5jZSBpbiBpbnB1dC5cbiIgKTsNCisJZ290byBiYWRzdGF0ZTsNCisgICAg
ICB9IGVsc2UgaWYgKCBlcnJubyA9PSBFSU5WQUwgKSB7DQorCS8vICAgICAg
ICBmcHJpbnRmKCBzdGRlcnIsICJJbmNvbXBsZXRlIGlucHV0LlxuIiApOw0K
Kwlnb3RvIGJhZHN0YXRlOw0KKyAgICAgIH0gZWxzZSBpZiAoIGVycm5vID09
IEUyQklHICkgew0KKwkvKiBOZWVkIGEgYmlnZ2VyIGJ1ZmZlciAqLw0KKwlv
dXRsZW4gKj0gMjsNCisJZnJlZSggb3V0YnVmICk7DQorICAgICAgfSBlbHNl
IHsNCisgICAgICAgIHBlcnJvciggImljb252IiApOw0KKwlnb3RvIGJhZHN0
YXRlOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAvKiBDb21w
bGV0ZWQgY29udmVyc2lvbiAqLw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQor
ICB9DQorDQorICAvKiBGbHVzaCBvdXRwdXQgYnVmZmVyICovDQorICBzaXpl
X3QgYWRkaXRpb25hbCA9IG91dHB0ciAtIG91dGJ1ZjsNCisgIHRoZV9sZW5n
dGggKz0gYWRkaXRpb25hbDsNCisNCisgIGZyZWUoIG91dGJ1ZiApOw0KKw0K
KyAgaWYgKCBpY29udl9jbG9zZSggY29udmVydGVyICkgPCAwICkgew0KKyAg
ICBwZXJyb3IoICJpY29udl9jbG9zZSIgKTsNCisgIH0NCisNCisgIHJldHVy
biB0aGVfbGVuZ3RoOw0KKw0KKyBiYWRzdGF0ZToNCisgIGZyZWUoIG91dGJ1
ZiApOw0KKw0KKyAgaWYgKCBpY29udl9jbG9zZSggY29udmVydGVyICkgPCAw
ICkgew0KKyAgICBwZXJyb3IoICJpY29udl9jbG9zZSIgKTsNCisgIH0NCisg
IA0KKyAgcmV0dXJuIC0xOw0KK30NCisNCitpbnQgZG9fY29udmVydCggY2hh
ciAqZGVzdGVuY29kaW5nLCBjaGFyICpzcmNlbmNvZGluZywNCisJCWNoYXIg
KmRzdCwgc2l6ZV90IGRzdF9sZW4sDQorCQljaGFyICpzcmMsIHNpemVfdCBz
cmNfbGVuICkNCit7DQorICBpY29udl90IGNvbnZlcnRlcjsNCisNCisgIGNv
bnZlcnRlciA9IGljb252X29wZW4oIGRlc3RlbmNvZGluZywgc3JjZW5jb2Rp
bmcgKTsNCisgIGlmICggY29udmVydGVyID09IChpY29udl90KSAtMSApIHsN
CisgICAgcGVycm9yKCAiaWNvbnZfb3BlbiIgKTsNCisgICAgcmV0dXJuIC0x
Ow0KKyAgfQ0KKw0KKyAgaWYgKCBpY29udiggY29udmVydGVyLCAmc3JjLCAm
c3JjX2xlbiwgJmRzdCwgJmRzdF9sZW4gKSA9PSAtMSApIHsNCisgICAgaWYg
KCBlcnJubyA9PSBFSUxTRVEgKSB7DQorICAgICAgZnByaW50Ziggc3RkZXJy
LCAiQlVHOiBJbnZhbGlkIG11bHRpYnl0ZSBzZXF1ZW5jZSBpbiBpbnB1dCFc
biIgKTsNCisgICAgICBnb3RvIGJhZHN0YXRlOw0KKyAgICB9IGVsc2UgaWYg
KCBlcnJubyA9PSBFSU5WQUwgKSB7DQorICAgICAgZnByaW50Ziggc3RkZXJy
LCAiQlVHOiBJbmNvbXBsZXRlIGlucHV0IVxuIiApOw0KKyAgICAgIGdvdG8g
YmFkc3RhdGU7DQorICAgIH0gZWxzZSBpZiAoIGVycm5vID09IEUyQklHICkg
ew0KKyAgICAgIGZwcmludGYoIHN0ZGVyciwgIkJVRzogUmFuIG91dCBvZiBy
b29tIVxuIiApOw0KKyAgICAgIGdvdG8gYmFkc3RhdGU7DQorICAgIH0gZWxz
ZSB7DQorICAgICAgcGVycm9yKCAiaWNvbnYiICk7DQorICAgICAgZ290byBi
YWRzdGF0ZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKCBkc3RfbGVuICE9
IDAgKSB7DQorICAgIGZwcmludGYoIHN0ZGVyciwgIkJVRzogRW5kZWQgdXAg
d2l0aCBkc3RfbGVuID0gJWRcbiIsIGRzdF9sZW4gKTsNCisgICAgZ290byBi
YWRzdGF0ZTsNCisgIH0NCisNCisgIGlmICggc3JjX2xlbiAhPSAwICkgew0K
KyAgICBmcHJpbnRmKCBzdGRlcnIsICJCVUc6IEVuZGVkIHVwIHdpdGggc3Jj
X2xlbiA9ICVkXG4iLCBkc3RfbGVuICk7DQorICAgIGdvdG8gYmFkc3RhdGU7
DQorICB9DQorDQorICBpZiAoIGljb252X2Nsb3NlKCBjb252ZXJ0ZXIgKSA8
IDAgKSB7DQorICAgIHBlcnJvciggImljb252X2Nsb3NlIiApOw0KKyAgfQ0K
Kw0KKyAgcmV0dXJuIDA7DQorDQorIGJhZHN0YXRlOg0KKyAgaWYgKCBpY29u
dl9jbG9zZSggY29udmVydGVyICkgPCAwICkgew0KKyAgICBwZXJyb3IoICJp
Y29udl9jbG9zZSIgKTsNCisgIH0NCisgIA0KKyAgcmV0dXJuIC0xOw0KK30N
CmRpZmYgLXVyIHplcGh5ci0yLjEuMjAwNzA3MTkuU05BUFNIT1QvbGliL1pS
ZWN2Tm90LmMgemVwaHlyLXBhdGNoZWQvbGliL1pSZWN2Tm90LmMNCi0tLSB6
ZXBoeXItMi4xLjIwMDcwNzE5LlNOQVBTSE9UL2xpYi9aUmVjdk5vdC5jCTIw
MDctMDctMTkgMDA6NTQ6MTQuMDAwMDAwMDAwIC0wNDAwDQorKysgemVwaHly
LXBhdGNoZWQvbGliL1pSZWN2Tm90LmMJMjAwOS0wMi0wMiAyMDoyNjozOS4w
MDAwMDAwMDAgLTA1MDANCkBAIC00Niw1ICs0NiwxMSBAQA0KICAgICBpZiAo
KHJldHZhbCA9IFpQYXJzZU5vdGljZShidWZmZXIsIGxlbiwgbm90aWNlKSkg
IT0gWkVSUl9OT05FKQ0KIAlyZXR1cm4gKHJldHZhbCk7DQogICAgIG5vdGlj
ZS0+el9jaGVja2VkX2F1dGggPSBhdXRoOw0KKw0KKyAgICBpZiAoKHJldHZh
bCA9IFpDaGFyYWN0ZXJDb252ZXJ0KCAmYnVmZmVyLCBsZW4sIG5vdGljZSwN
CisJCQkJICAgICBaX0NPTlZFUlRfSU5DT01JTkcgKSkgIT0gWkVSUl9OT05F
KQ0KKyAgICAgICAgcmV0dXJuIChyZXR2YWwpOw0KKyAgICBub3RpY2UtPnpf
Y2hlY2tlZF9hdXRoID0gYXV0aDsNCisNCiAgICAgcmV0dXJuIFpFUlJfTk9O
RTsNCiB9DQpkaWZmIC11ciB6ZXBoeXItMi4xLjIwMDcwNzE5LlNOQVBTSE9U
L2xpYi9aU2VuZE5vdC5jIHplcGh5ci1wYXRjaGVkL2xpYi9aU2VuZE5vdC5j
DQotLS0gemVwaHlyLTIuMS4yMDA3MDcxOS5TTkFQU0hPVC9saWIvWlNlbmRO
b3QuYwkyMDA3LTA3LTE5IDAwOjU0OjE0LjAwMDAwMDAwMCAtMDQwMA0KKysr
IHplcGh5ci1wYXRjaGVkL2xpYi9aU2VuZE5vdC5jCTIwMDktMDItMDIgMjA6
MjY6MTUuMDAwMDAwMDAwIC0wNTAwDQpAQCAtMzksNiArMzksMTAgQEANCiAN
CiAgICAgaWYgKChyZXR2YWwgPSBaUGFyc2VOb3RpY2UoYnVmZmVyLCBsZW4s
ICZuZXdub3RpY2UpKSAhPSBaRVJSX05PTkUpDQogCXJldHVybiAocmV0dmFs
KTsNCisNCisgICAgaWYgKChyZXR2YWwgPSBaQ2hhcmFjdGVyQ29udmVydCgg
JmJ1ZmZlciwgbGVuLCAmbmV3bm90aWNlLA0KKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBaX0NPTlZFUlRfT1VUR09JTkcgKSkgIT0g
WkVSUl9OT05FKQ0KKyAgICAgIHJldHVybiAocmV0dmFsKTsNCiAgICAgDQog
ICAgIHJldHZhbCA9IFpfU2VuZEZyYWdtZW50ZWROb3RpY2UoJm5ld25vdGlj
ZSwgbGVuLCBjZXJ0X3JvdXRpbmUsDQogCQkJCSAgICBzZW5kX3JvdXRpbmUp
Ow0K
---1257098496-990213503-1233630696=:10167--