FW: First Attempt at Crypto Library

Simon Marlow simonmar@microsoft.com
Tue, 22 Apr 2003 11:22:07 +0100


This is a multi-part message in MIME format.

------_=_NextPart_001_01C308B9.030535BD
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

=20
Folks,=20

Domenic Steinitz has contributed some crypto code (see attachment and
msg below).  According to our draft hierarchy, there is a place in the
hierarchy reserved for crypto libraries:

   FileFormat.Encryption

(see http://www.haskell.org/~simonmar/lib-hierarchy.html). =20

Question 1: there's a comment next to 'FileFormat' which mentions that
'Codec' might be a more accurate name.  It seems to me that 'Codec'
would indeed be a better choice: many of the libraries under FileFormat
are more like pure stream-transformers than file formats, and Codec
encompasses both.  What do people think about changing this?  (there
aren't any other implementations of libraries under FileFormat that I'm
aware of).

If FileFormat became Codec, then the existing FileFormat.Encoding looks
a bit odd.  But moving FileFormat.Encoding.Base64 up to Codec.Base64
(similarly for FileFormat.Encoding.Yenc) would seem to make sense.

Question 2: what should the insides of the FileFormat.Encryption (or
Codec.Encryption) hierarchy look like?

Cheers,
	Simon

-----Original Message-----
From: Dominic Steinitz [mailto:dominic.steinitz@blueyonder.co.uk]=20
Sent: 21 April 2003 18:47
To: Simon Peyton-Jones; Simon Marlow
Cc: libraries-request@haskell.org

Simon, Simon,

Here's my first attempt at a crypto library. It compiles and I can run a
test using ghc-inplace. The test checks with the example in
http://www.itl.nist.gov/fipspubs/fip81.htm (except I couldn't find an
example with PKCS#5 padding). I'm not sure what the next steps are.

Dominic Steinitz



------_=_NextPart_001_01C308B9.030535BD
Content-Type: application/octet-stream;
	name="Crypto.hs"
Content-Transfer-Encoding: base64
Content-Description: Crypto.hs
Content-Disposition: attachment;
	filename="Crypto.hs"

LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gfAotLSBNb2R1bGUgICAgICA6ICBEYXRhLkNyeXB0bwot
LSBDb3B5cmlnaHQgICA6ICAoYykgSWFuIEx5bmFnaCwgRG9taW5pYyBTdGVpbml0eiAyMDAxLTIw
MDMKLS0gTGljZW5zZSAgICAgOiAgQlNELXN0eWxlIChzZWUgdGhlIGZpbGUgbGlicmFyaWVzL2Jh
c2UvTElDRU5TRSkKLS0gCi0tIE1haW50YWluZXIgIDogIGRvbWluaWMuc3RlaW5pdHpAYmx1ZXlv
bmRlci5jby51awotLSBTdGFiaWxpdHkgICA6ICBleHBlcmltZW50YWwKLS0gUG9ydGFiaWxpdHkg
OiAgbm9uLXBvcnRhYmxlCi0tCi0tIENyeXB0b2dyYXBoaWMgbGlicmFyeSBiYXNlZCBvbiBjb250
cmlidXRpb25zIGZyb20gSWFuIEx5bmFnaAotLSA8aHR0cDovL3dlYi5jb21sYWIub3guYWMudWsv
b3VjbC93b3JrL2lhbi5seW5hZ2gvPi4KLS0KLS0gUmVxdWlyZXMgQml0cywgV29yZCwgV29yZDY0
IGFuZCBtdWx0aS1wYXJhbWV0ZXIgdHlwZSBjbGFzc2VzLgotLQotLSBUaGlzIGxpYnJhcnkgY3Vy
cmVudGx5IHN1cHBvcnRzIERFUyBFbGVjdHJvbmljIENvZGVib29rIE1vZGUgKEVDQikgbW9kZQot
LSBhbmQgQ2lwaGVyIEJsb2NrIENoYWluaWcgKENCQykgbW9kZS4KLS0gCi0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCgptb2R1bGUgRGF0YS5DcnlwdG8gKAogICAtLSAqIEZ1bmN0aW9uIHR5cGVzCiAgIGRl
cywgdW5EZXMsCiAgIGNiYywgdW5DYmMsIAogICBwa2NzNSwgdW5Qa2NzNQogICAtLSAqIEV4YW1w
bGUgVXNhZ2UKICAgLS0gJHVzYWdlCgkgICAgICApIHdoZXJlCgppbXBvcnQgRGF0YS5Xb3JkCmlt
cG9ydCBEYXRhLkJpdHMKaW1wb3J0IERhdGEuQ2hhcgppbXBvcnQgRGF0YS5MaXN0CmltcG9ydCBE
YXRhLk1heWJlCgp7LSAkdXNhZ2UKCkAKbW9kdWxlIE1haW4obWFpbikgd2hlcmUKQAoKQAppbXBv
cnQgQ3J5cHRvCkAKCkAKcGxhaW5UZXh0ID0gICJHb29kIG1vcm5pbmcgTXIuIFBoZWxwcy4gIFlv
dXIgbSIgKysKICAgICAgICAgICAgICJpc3Npb24sXG5zaG91bGQgeW91IGNob29zZSB0byBhY2Mi
ICsrCiAgICAgICAgICAgICAiZXB0IGl0LCBpcyB0byBsZWFybiB0byB1c2UgREVTLlxOVUwiCkAK
CkAKaXYgID0gMHgwMTIzNDU2Nzg5YWJjZGVmCkAKCkAKa2V5ID0gMHg0MjY1MmQ0ODYxNzA3MDc5
CkAKCkAKY2lwaGVyVGV4dCA9IGNiYyBkZXMgaXYga2V5ICQgcGtjczUgcGxhaW5UZXh0CkAKCkAK
cGxhaW5UZXh0JyA9IHVuUGtjczUgJCB1bkNiYyB1bkRlcyBpdiBrZXkgY2lwaGVyVGV4dApACgpA
Cm1haW4gPSBwdXRTdHJMbiBwbGFpblRleHQnCkAKCi19Cgp0eXBlIFpvcmQ2NCA9IFdvcmQ2NAoK
dHlwZSBSb3RhdGlvbiA9IEludAp0eXBlIEtleSAgICAgPSBab3JkNjQKdHlwZSBNZXNzYWdlID0g
Wm9yZDY0CnR5cGUgRW5jICAgICA9IFpvcmQ2NAp0eXBlIEluaXRWZWN0b3IgPSBab3JkNjQKCnR5
cGUgQml0c1ggID0gW0Jvb2xdCnR5cGUgQml0czQgID0gW0Jvb2xdCnR5cGUgQml0czYgID0gW0Jv
b2xdCnR5cGUgQml0czMyID0gW0Jvb2xdCnR5cGUgQml0czQ4ID0gW0Jvb2xdCnR5cGUgQml0czU2
ID0gW0Jvb2xdCnR5cGUgQml0czY0ID0gW0Jvb2xdCgppbnN0YW5jZSBOdW0gW0Jvb2xdCgppbnN0
YW5jZSBCaXRzIFtCb29sXSB3aGVyZQogICBhIGB4b3JgIGIgPSAoemlwV2l0aCAoXHggeSAtPiAo
bm90IHggJiYgeSkgfHwgKHggJiYgbm90IHkpKSBhIGIpCiAgIHJvdGF0ZSBiaXRzIHJvdCA9IGRy
b3Agcm90JyBiaXRzICsrIHRha2Ugcm90JyBiaXRzCiAgICAgIHdoZXJlIHJvdCcgPSByb3QgYG1v
ZGAgKGxlbmd0aCBiaXRzKQoKYml0aWZ5IDo6IFpvcmQ2NCAtPiBCaXRzNjQKYml0aWZ5IHcgPSBt
YXAgKFxiIC0+IHcgLiYuIChzaGlmdEwgMSBiKSAvPSAwKSBbNjMsNjIuLjBdCgp1bmJpdGlmeSA6
OiBCaXRzNjQgLT4gWm9yZDY0CnVuYml0aWZ5IGJzID0gZm9sZGwgKFxpIGIgLT4gaWYgYiB0aGVu
IDEgKyBzaGlmdEwgaSAxIGVsc2Ugc2hpZnRMIGkgMSkgMCBicwoKaW5pdGlhbF9wZXJtdXRhdGlv
biA6OiBCaXRzNjQgLT4gQml0czY0CmluaXRpYWxfcGVybXV0YXRpb24gbWIgPSBtYXAgKCghISkg
bWIpIGkKICAgd2hlcmUgaSA9IFs1NywgNDksIDQxLCAzMywgMjUsIDE3LCAgOSwgMSwgNTksIDUx
LCA0MywgMzUsIDI3LCAxOSwgMTEsIDMsCiAgICAgICAgICAgICAgNjEsIDUzLCA0NSwgMzcsIDI5
LCAyMSwgMTMsIDUsIDYzLCA1NSwgNDcsIDM5LCAzMSwgMjMsIDE1LCA3LAogICAgICAgICAgICAg
IDU2LCA0OCwgNDAsIDMyLCAyNCwgMTYsICA4LCAwLCA1OCwgNTAsIDQyLCAzNCwgMjYsIDE4LCAx
MCwgMiwKICAgICAgICAgICAgICA2MCwgNTIsIDQ0LCAzNiwgMjgsIDIwLCAxMiwgNCwgNjIsIDU0
LCA0NiwgMzgsIDMwLCAyMiwgMTQsIDZdCgprZXlfdHJhbnNmb3JtYXRpb24gOjogQml0czY0IC0+
IEJpdHM1NgprZXlfdHJhbnNmb3JtYXRpb24ga2IgPSBtYXAgKCghISkga2IpIGkKIHdoZXJlIGkg
PSBbNTYsIDQ4LCA0MCwgMzIsIDI0LCAxNiwgIDgsICAwLCA1NywgNDksIDQxLCAzMywgMjUsIDE3
LAogICAgICAgICAgICAgOSwgIDEsIDU4LCA1MCwgNDIsIDM0LCAyNiwgMTgsIDEwLCAgMiwgNTks
IDUxLCA0MywgMzUsCiAgICAgICAgICAgIDYyLCA1NCwgNDYsIDM4LCAzMCwgMjIsIDE0LCAgNiwg
NjEsIDUzLCA0NSwgMzcsIDI5LCAyMSwKICAgICAgICAgICAgMTMsICA1LCA2MCwgNTIsIDQ0LCAz
NiwgMjgsIDIwLCAxMiwgIDQsIDI3LCAxOSwgMTEsICAzXQoKZGVzX2VuYyA6OiBNZXNzYWdlIC0+
IEtleSAtPiBFbmMKZGVzX2VuYyA9IGRvX2RlcyBbMSwyLDQsNiw4LDEwLDEyLDE0LDE1LDE3LDE5
LDIxLDIzLDI1LDI3LDI4XQoKZGVzX2RlYyA6OiBNZXNzYWdlIC0+IEtleSAtPiBFbmMKZGVzX2Rl
YyA9IGRvX2RlcyBbMjgsMjcsMjUsMjMsMjEsMTksMTcsMTUsMTQsMTIsMTAsOCw2LDQsMiwxXQoK
ZG9fZGVzIDo6IFtSb3RhdGlvbl0gLT4gTWVzc2FnZSAtPiBLZXkgLT4gRW5jCmRvX2RlcyByb3Rz
IG0gayA9IGRlc193b3JrIHJvdHMgKHRha2VEcm9wIDMyIG1iKSBrYgogd2hlcmUga2IgPSBrZXlf
dHJhbnNmb3JtYXRpb24gJCBiaXRpZnkgawogICAgICAgbWIgPSBpbml0aWFsX3Blcm11dGF0aW9u
ICQgYml0aWZ5IG0KCmRlc193b3JrIDo6IFtSb3RhdGlvbl0gLT4gKEJpdHMzMiwgQml0czMyKSAt
PiBCaXRzNTYgLT4gRW5jCmRlc193b3JrIFtdIChtbCwgbXIpIF8gPSB1bmJpdGlmeSAkIGZpbmFs
X3Blcm0gJCAobXIgKysgbWwpCmRlc193b3JrIChyOnJzKSBtYiBrYiA9IGRlc193b3JrIHJzIG1i
JyBrYgogd2hlcmUgbWInID0gZG9fcm91bmQgciBtYiBrYgoKZG9fcm91bmQgOjogUm90YXRpb24g
LT4gKEJpdHMzMiwgQml0czMyKSAtPiBCaXRzNTYgLT4gKEJpdHMzMiwgQml0czMyKQpkb19yb3Vu
ZCByIChtbCwgbXIpIGtiID0gKG1yLCBtJykKIHdoZXJlIGtiJyA9IGdldF9rZXkga2IgcgogICAg
ICAgY29tcF9rYiA9IGNvbXByZXNzaW9uX3Blcm11dGF0aW9uIGtiJwogICAgICAgZXhwYV9tciA9
IGV4cGFuc2lvbl9wZXJtdXRhdGlvbiBtcgogICAgICAgcmVzID0gY29tcF9rYiBgeG9yYCBleHBh
X21yCiAgICAgICByZXMnID0gdGFpbCAkIGl0ZXJhdGUgKHRyYW5zIDYpIChbXSwgcmVzKQogICAg
ICAgdHJhbnMgbiAoXywgYikgPSAodGFrZSBuIGIsIGRyb3AgbiBiKQogICAgICAgcmVzX3MgPSBj
b25jYXQgJCB6aXBXaXRoIChcZiAoeCxfKSAtPiBmIHgpIFtzX2JveF8xLCBzX2JveF8yLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzX2JveF8zLCBz
X2JveF80LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzX2JveF81LCBzX2JveF82LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzX2JveF83LCBzX2JveF84XSByZXMnCiAgICAgICByZXNfcCA9IHBfYm94
IHJlc19zCiAgICAgICBtJyA9IHJlc19wIGB4b3JgIG1sCgpnZXRfa2V5IDo6IEJpdHM1NiAtPiBS
b3RhdGlvbiAtPiBCaXRzNTYKZ2V0X2tleSBrYiByID0ga2InCiB3aGVyZSAoa2wsIGtyKSA9IHRh
a2VEcm9wIDI4IGtiCiAgICAgICBrYicgPSByb3RhdGVMIGtsIHIgKysgcm90YXRlTCBrciByCgpj
b21wcmVzc2lvbl9wZXJtdXRhdGlvbiA6OiBCaXRzNTYgLT4gQml0czQ4CmNvbXByZXNzaW9uX3Bl
cm11dGF0aW9uIGtiID0gbWFwICgoISEpIGtiKSBpCiB3aGVyZSBpID0gWzEzLCAxNiwgMTAsIDIz
LCAgMCwgIDQsICAyLCAyNywgMTQsICA1LCAyMCwgIDksCiAgICAgICAgICAgIDIyLCAxOCwgMTEs
ICAzLCAyNSwgIDcsIDE1LCAgNiwgMjYsIDE5LCAxMiwgIDEsCiAgICAgICAgICAgIDQwLCA1MSwg
MzAsIDM2LCA0NiwgNTQsIDI5LCAzOSwgNTAsIDQ0LCAzMiwgNDcsCiAgICAgICAgICAgIDQzLCA0
OCwgMzgsIDU1LCAzMywgNTIsIDQ1LCA0MSwgNDksIDM1LCAyOCwgMzFdCgpleHBhbnNpb25fcGVy
bXV0YXRpb24gOjogQml0czMyIC0+IEJpdHM0OApleHBhbnNpb25fcGVybXV0YXRpb24gbWIgPSBt
YXAgKCghISkgbWIpIGkKIHdoZXJlIGkgPSBbMzEsICAwLCAgMSwgIDIsICAzLCAgNCwgIDMsICA0
LCAgNSwgIDYsICA3LCAgOCwKICAgICAgICAgICAgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTEs
IDEyLCAxMywgMTQsIDE1LCAxNiwKICAgICAgICAgICAgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwg
MTksIDIwLCAyMSwgMjIsIDIzLCAyNCwKICAgICAgICAgICAgMjMsIDI0LCAyNSwgMjYsIDI3LCAy
OCwgMjcsIDI4LCAyOSwgMzAsIDMxLCAgMF0KCnNfYm94IDo6IFtbV29yZDhdXSAtPiBCaXRzNiAt
PiBCaXRzNApzX2JveCBzIFthLGIsYyxkLGUsZl0gPSB0b19ib29sIDQgJCAocyAhISByb3cpICEh
IGNvbAogd2hlcmUgcm93ID0gc3VtICQgemlwV2l0aCBudW1lcmljaXNlIFthLGZdICAgICBbMSwg
MF0KICAgICAgIGNvbCA9IHN1bSAkIHppcFdpdGggbnVtZXJpY2lzZSBbYixjLGQsZV0gWzMsIDIs
IDEsIDBdCiAgICAgICBudW1lcmljaXNlID0gKFx4IHkgLT4gaWYgeCB0aGVuIDJeeSBlbHNlIDAp
CiAgICAgICB0b19ib29sIDAgXyA9IFtdCiAgICAgICB0b19ib29sIG4gaSA9ICgoaSAuJi4gOCkg
PT0gOCk6dG9fYm9vbCAobi0xKSAoc2hpZnRMIGkgMSkKCnNfYm94XzEgOjogQml0czYgLT4gQml0
czQKc19ib3hfMSA9IHNfYm94IGkKIHdoZXJlIGkgPSBbWzE0LCAgNCwgMTMsICAxLCAgMiwgMTUs
IDExLCAgOCwgIDMsIDEwLCAgNiwgMTIsICA1LCAgOSwgIDAsICA3XSwKICAgICAgICAgICAgWyAw
LCAxNSwgIDcsICA0LCAxNCwgIDIsIDEzLCAgMSwgMTAsICA2LCAxMiwgMTEsICA5LCAgNSwgIDMs
ICA4XSwKICAgICAgICAgICAgWyA0LCAgMSwgMTQsICA4LCAxMywgIDYsICAyLCAxMSwgMTUsIDEy
LCAgOSwgIDcsICAzLCAxMCwgIDUsICAwXSwKICAgICAgICAgICAgWzE1LCAxMiwgIDgsICAyLCAg
NCwgIDksICAxLCAgNywgIDUsIDExLCAgMywgMTQsIDEwLCAgMCwgIDYsIDEzXV0KCnNfYm94XzIg
OjogQml0czYgLT4gQml0czQKc19ib3hfMiA9IHNfYm94IGkKIHdoZXJlIGkgPSBbWzE1LCAgMSwg
IDgsIDE0LCAgNiwgMTEsICAzLCAgNCwgIDksICA3LCAgMiwgMTMsIDEyLCAgMCwgIDUsIDEwXSwK
ICAgICAgICAgICAgWzMsICAxMywgIDQsICA3LCAxNSwgIDIsICA4LCAxNCwgMTIsICAwLCAgMSwg
MTAsICA2LCAgOSwgIDExLCA1XSwKICAgICAgICAgICAgWzAsICAxNCwgIDcsIDExLCAxMCwgIDQs
IDEzLCAgMSwgIDUsICA4LCAxMiwgIDYsICA5LCAgMywgIDIsIDE1XSwKICAgICAgICAgICAgWzEz
LCAgOCwgMTAsICAxLCAgMywgMTUsICA0LCAgMiwgMTEsICA2LCAgNywgMTIsICAwLCAgNSwgIDE0
LCA5XV0KCnNfYm94XzMgOjogQml0czYgLT4gQml0czQKc19ib3hfMyA9IHNfYm94IGkKIHdoZXJl
IGkgPSBbWzEwLCAgMCwgIDksIDE0ICwgNiwgIDMsIDE1LCAgNSwgIDEsIDEzLCAxMiwgIDcsIDEx
LCAgNCwgIDIsICA4XSwKICAgICAgICAgICAgWzEzLCAgNywgIDAsICA5LCAgMywgIDQsICA2LCAx
MCwgIDIsICA4LCAgNSwgMTQsIDEyLCAxMSwgMTUsICAxXSwKICAgICAgICAgICAgWzEzLCAgNiwg
IDQsICA5LCAgOCwgMTUsICAzLCAgMCwgMTEsICAxLCAgMiwgMTIsICA1LCAxMCwgMTQsICA3XSwK
ICAgICAgICAgICAgWzEsICAxMCwgMTMsICAwLCAgNiwgIDksICA4LCAgNywgIDQsIDE1LCAxNCwg
IDMsIDExLCAgNSwgIDIsIDEyXV0KCnNfYm94XzQgOjogQml0czYgLT4gQml0czQKc19ib3hfNCA9
IHNfYm94IGkKIHdoZXJlIGkgPSBbWzcsICAxMywgMTQsICAzLCAgMCwgIDYsICA5LCAxMCwgIDEs
ICAyLCAgOCwgIDUsIDExLCAxMiwgIDQsIDE1XSwKICAgICAgICAgICAgWzEzLCAgOCwgMTEsICA1
LCAgNiwgMTUsICAwLCAgMywgIDQsICA3LCAgMiwgMTIsICAxLCAxMCwgMTQsICA5XSwKICAgICAg
ICAgICAgWzEwLCAgNiwgIDksICAwLCAxMiwgMTEsICA3LCAxMywgMTUsICAxLCAgMywgMTQsICA1
LCAgMiwgIDgsICA0XSwKICAgICAgICAgICAgWzMsICAxNSwgIDAsICA2LCAxMCwgIDEsIDEzLCAg
OCwgIDksICA0LCAgNSwgMTEsIDEyLCAgNywgIDIsIDE0XV0KCnNfYm94XzUgOjogQml0czYgLT4g
Qml0czQKc19ib3hfNSA9IHNfYm94IGkKIHdoZXJlIGkgPSBbWzIsICAxMiwgIDQsICAxLCAgNywg
MTAsIDExLCAgNiwgIDgsICA1LCAgMywgMTUsIDEzLCAgMCwgMTQsICA5XSwKICAgICAgICAgICAg
WzE0LCAxMSwgIDIsIDEyLCAgNCwgIDcsIDEzLCAgMSwgIDUsICAwLCAxNSwgMTAsICAzLCAgOSwg
IDgsICA2XSwKICAgICAgICAgICAgWzQsICAgMiwgIDEsIDExLCAxMCwgMTMsICA3LCAgOCwgMTUs
ICA5LCAxMiwgIDUsICA2LCAgMywgIDAsIDE0XSwKICAgICAgICAgICAgWzExLCAgOCwgMTIsICA3
LCAgMSwgMTQsICAyLCAxMywgIDYsIDE1LCAgMCwgIDksIDEwLCAgNCwgIDUsICAzXV0KCnNfYm94
XzYgOjogQml0czYgLT4gQml0czQKc19ib3hfNiA9IHNfYm94IGkKIHdoZXJlIGkgPSBbWzEyLCAg
MSwgMTAsIDE1LCAgOSwgIDIsICA2LCAgOCwgIDAsIDEzLCAgMywgIDQsIDE0LCAgNywgIDUsIDEx
XSwKICAgICAgICAgICAgWzEwLCAxNSwgIDQsICAyLCAgNywgMTIsICA5LCAgNSwgIDYsICAxLCAx
MywgMTQsICAwLCAxMSwgIDMsICA4XSwKICAgICAgICAgICAgWzksICAxNCwgMTUsICA1LCAgMiwg
IDgsIDEyLCAgMywgIDcsICAwLCAgNCwgMTAsICAxLCAxMywgMTEsICA2XSwKICAgICAgICAgICAg
WzQsICAzLCAgIDIsIDEyLCAgOSwgIDUsIDE1LCAxMCwgMTEsIDE0LCAgMSwgIDcsICA2LCAgMCwg
IDgsIDEzXV0KCnNfYm94XzcgOjogQml0czYgLT4gQml0czQKc19ib3hfNyA9IHNfYm94IGkKIHdo
ZXJlIGkgPSBbWzQsICAxMSwgIDIsIDE0LCAxNSwgIDAsICA4LCAxMywgIDMsIDEyLCAgOSwgIDcs
ICA1LCAxMCwgIDYsICAxXSwKICAgICAgICAgICAgWzEzLCAwLCAgMTEsICA3LCAgNCwgIDksICAx
LCAxMCwgMTQsICAzLCAgNSwgMTIsICAyLCAxNSwgIDgsICA2XSwKICAgICAgICAgICAgWzEsICA0
LCAgMTEsIDEzLCAxMiwgIDMsICA3LCAxNCwgMTAsIDE1LCAgNiwgIDgsICAwLCAgNSwgIDksICAy
XSwKICAgICAgICAgICAgWzYsICAxMSwgMTMsICA4LCAgMSwgIDQsIDEwLCAgNywgIDksICA1LCAg
MCwgMTUsIDE0LCAgMiwgIDMsIDEyXV0KCnNfYm94XzggOjogQml0czYgLT4gQml0czQKc19ib3hf
OCA9IHNfYm94IGkKIHdoZXJlIGkgPSBbWzEzLCAgMiwgIDgsICA0LCAgNiwgMTUsIDExLCAgMSwg
MTAsICA5LCAgMywgMTQsICA1LCAgMCwgMTIsICA3XSwKICAgICAgICAgICAgWzEsICAxNSwgMTMs
ICA4LCAxMCwgIDMsICA3LCAgNCwgMTIsICA1LCAgNiwgMTEsICAwLCAxNCwgIDksICAyXSwKICAg
ICAgICAgICAgWzcsICAxMSwgIDQsICAxLCAgOSwgMTIsIDE0LCAgMiwgIDAsICA2LCAxMCwgMTMs
IDE1LCAgMywgIDUsICA4XSwKICAgICAgICAgICAgWzIsICAgMSwgMTQsICA3LCAgNCwgMTAsICA4
LCAxMywgMTUsIDEyLCAgOSwgIDAsICAzLCAgNSwgIDYsIDExXV0KCnBfYm94IDo6IEJpdHMzMiAt
PiBCaXRzMzIKcF9ib3gga2IgPSBtYXAgKCghISkga2IpIGkKIHdoZXJlIGkgPSBbMTUsIDYsIDE5
LCAyMCwgMjgsIDExLCAyNywgMTYsICAwLCAxNCwgMjIsIDI1LCAgNCwgMTcsIDMwLCAgOSwKICAg
ICAgICAgICAgIDEsIDcsIDIzLCAxMywgMzEsIDI2LCAgMiwgIDgsIDE4LCAxMiwgMjksICA1LCAy
MSwgMTAsICAzLCAyNF0KCmZpbmFsX3Blcm0gOjogQml0czY0IC0+IEJpdHM2NApmaW5hbF9wZXJt
IGtiID0gbWFwICgoISEpIGtiKSBpCiB3aGVyZSBpID0gWzM5LCA3LCA0NywgMTUsIDU1LCAyMywg
NjMsIDMxLCAzOCwgNiwgNDYsIDE0LCA1NCwgMjIsIDYyLCAzMCwKICAgICAgICAgICAgMzcsIDUs
IDQ1LCAxMywgNTMsIDIxLCA2MSwgMjksIDM2LCA0LCA0NCwgMTIsIDUyLCAyMCwgNjAsIDI4LAog
ICAgICAgICAgICAzNSwgMywgNDMsIDExLCA1MSwgMTksIDU5LCAyNywgMzQsIDIsIDQyLCAxMCwg
NTAsIDE4LCA1OCwgMjYsCiAgICAgICAgICAgIDMzLCAxLCA0MSwgIDksIDQ5LCAxNywgNTcsIDI1
LCAzMiwgMCwgNDAgLCA4LCA0OCwgMTYsIDU2LCAyNF0KCnRha2VEcm9wIDo6IEludCAtPiBbYV0g
LT4gKFthXSwgW2FdKQp0YWtlRHJvcCBfIFtdID0gKFtdLCBbXSkKdGFrZURyb3AgMCB4cyA9IChb
XSwgeHMpCnRha2VEcm9wIG4gKHg6eHMpID0gKHg6eXMsIHpzKQogd2hlcmUgKHlzLCB6cykgPSB0
YWtlRHJvcCAobi0xKSB4cwoKcG93ZXJzT2YgbiA9IDEgOiAobWFwICgqbikgKHBvd2Vyc09mIG4p
KQoKdG9CYXNlIHggPSAKICAgbWFwIGZyb21JbnRlZ3JhbCAuCiAgIHJldmVyc2UgLgogICBtYXAg
KGZsaXAgbW9kIHgpIC4KICAgdGFrZVdoaWxlICgvPTApIC4KICAgaXRlcmF0ZSAoZmxpcCBkaXYg
eCkKCnN0cmluZ0FzSGV4IHggPSAKICAgc3VtICQgemlwV2l0aCAoKikgKHBvd2Vyc09mIDI1Nikg
CiAgICAgICAgICAgICAgICAgICAgIChyZXZlcnNlIChtYXAgKGZyb21JbnRlZ3JhbCAuIG9yZCkg
eCkpCgotLSB8IENvbnZlcnQgYSBTdHJpbmcgdG8gV29yZDY0LiBUaGUgc3RyaW5nIG11c3QgYmUg
OCBjaGFyYWN0ZXJzLgoKc3RyaW5nQXNXb3JkNjQgOjogU3RyaW5nIC0+IFdvcmQ2NAoKc3RyaW5n
QXNXb3JkNjQgeCA9IHJlYWQgJCBzaG93ICQgc3RyaW5nQXNIZXggeAoKLS0gfCBDb252ZXJ0IGEg
V29yZDY0IHRvIGEgU3RyaW5nLgoKd29yZDY0QXNTdHJpbmcgOjogV29yZDY0IC0+IFN0cmluZwoK
d29yZDY0QXNTdHJpbmcgeCA9IG1hcCBjaHIgKCh0b0Jhc2UgMjU2IC4gZnJvbUludGVncmFsKSB4
KQoKLS0gKiBDQkMgb3IgQ2lwaGVyIEJsb2NrIENoYWluaW5nIE1vZGUKCi0tIHwgSW4gQ0JDIG9y
IENpcGhlciBCbG9jayBDaGFpbmluZyBtb2RlIGVhY2ggYmxvY2sgaXMgWE9SZWQgd2l0aCAKLS0g
dGhlIHByZXZpb3VzIGVuY2lwaGVyZWQgYmxvY2sgYmVmb3JlIGVuY3J5cHRpb24uICBGb3IgdGhl
IGZpcnN0IAotLSBibG9jayB3ZSBzdGFydCB3aXRoIGFuIGluaXRpYWxpemF0aW9uIHZlY3Rvci4K
CmNiYyA6OiBCaXRzIGJsb2NrID0+CiAgICAgICAoa2V5IC0+IGJsb2NrIC0+IGJsb2NrKSAtPiAK
ICAgICAgIGJsb2NrIC0+IAogICAgICAga2V5IC0+CiAgICAgICBbYmxvY2tdIC0+IAogICAgICAg
W2Jsb2NrXQoKY2JjIGUgaXYgayBwcyA9IAogICBjaXBoZXJzIHdoZXJlCiAgICAgIGNpcGhlcnMg
PSBtYXAgKGUgaykgZmVlZElucwogICAgICBmZWVkSW5zID0gemlwV2l0aCB4b3IgKGl2IDogY2lw
aGVycykgcHMKCi0tIHwgVG8gIGRlY2lwaGVyIGluIENCQyBvciBDaXBoZXIgQmxvY2sgQ2hhaW5p
bmcgbW9kZSB3ZSBkZWNpcGhlciAKLS0gZWFjaCBibG9jaywgdGhlbiBYT1IgdGhlIHJlc3VsdCB3
aXRoIHRoZSBwcmV2aW91cyBibG9jayBvZiAKLS0gcGxhaW50ZXh0IHJlc3VsdC4gIE5vdGUgdGhh
dCB3ZSB0cmVhdCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFzIHRoZSB6ZXJvdGggYmxvY2sg
b2YgcGxhaW50ZXh0LgoKdW5DYmMgOjogQml0cyBibG9jayA9PgogICAgICAgICAoa2V5IC0+IGJs
b2NrIC0+IGJsb2NrKSAtPiAKICAgICAgICAgYmxvY2sgLT4gCiAgICAgICAgIGtleSAtPgogICAg
ICAgICBbYmxvY2tdIC0+IAogICAgICAgICBbYmxvY2tdCgp1bkNiYyBkIGl2IGsgbXMgPQogICBv
dXRPZkNiY3Mgd2hlcmUKICAgICAgYmVmb3JlWE9ycyA9IG1hcCAoZCBrKSBtcwogICAgICBvdXRP
ZkNiY3MgID0gemlwV2l0aCB4b3IgKGl2IDogbXMpIGJlZm9yZVhPcnMKCi0tICogUEtDUyM1IFBh
ZGRpbmcgTWV0aG9kCgotLSB8IFdoZW4gdGhlIGxhc3QgYmxvY2sgb2YgcGxhaW50ZXh0IGlzIHNo
b3J0ZXIgdGhhbiB0aGUgYmxvY2sgc2l6ZSB0aGVuIGl0Ci0tIG11c3QgYmUgcGFkZGVkLiBQS0NT
IzUgc3BlY2lmaWVzIHRoYXQgdGhlIHBhZGRpbmcgb2N0ZXRzIHNob3VsZCBlYWNoIAotLSBjb250
YWluIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIHdoaWNoIG11c3QgYmUgc3RyaXBwZWQgb2ZmLiBTbywg
Zm9yIGV4YW1wbGUsCi0tIHdpdGggYSBibG9jayBzaXplIG9mIDgsICIwYTBiMGMiIHdpbGwgYmUg
cGFkZGVkIHdpdGggIjA1IiByZXN1bHRpbmcgaW4KLS0gIjBhMGIwYzA1MDUwNTA1MDUiLiBJZiB0
aGUgZmluYWwgYmxvY2sgaXMgYSBmdWxsIGJsb2NrIG9mIDggb2N0ZXRzCi0tIHRoZW4gYSB3aG9s
ZSBibG9jayBvZiAiMDgwODA4MDgwODA4MDgwOCIgaXMgYXBwZW5kZWQuCgpwa2NzNSA6OiBTdHJp
bmcgLT4gW1dvcmQ2NF0KCnBrY3M1IHMgPQogICBtYXAgc3RyaW5nQXNXb3JkNjQgKHVuZm9sZHIg
aCAkIGNvbmNhdCAkIHVuZm9sZHIgZyBzKSB3aGVyZQogICAgICBnIDo6IFN0cmluZyAtPiBNYXli
ZSAoU3RyaW5nLFN0cmluZykKICAgICAgZyB4IAogICAgICAgICB8IGwgPT0gMCAgICA9IE5vdGhp
bmcKICAgICAgICAgfCBsIDwgIDggICAgPSBKdXN0ICh0ICsrIChwICg4LWwpKSwgW10pCiAgICAg
ICAgIHwgZCA9PSBbXSAgID0gSnVzdCAodCArKyAocCA4KSwgW10pCiAgICAgICAgIHwgb3RoZXJ3
aXNlID0gSnVzdCAodCwgZCkKICAgICAgICAgd2hlcmUgbCAgID0gbGVuZ3RoIHQKICAgICAgICAg
ICAgICAgdCAgID0gdGFrZSA4IHgKCSAgICAgICBkICAgPSBkcm9wIDggeAoJICAgICAgIHAgbiA9
IHJlcGxpY2F0ZSBuIChjaHIgbikKICAgICAgaCA6OiBTdHJpbmcgLT4gTWF5YmUgKFN0cmluZywg
U3RyaW5nKQogICAgICBoIHggCiAgICAgICAgIHwgeCA9PSBbXSAgID0gTm90aGluZwogICAgICAg
ICB8IG90aGVyd2lzZSA9IEp1c3QgKHRha2UgOCB4LCBkcm9wIDggeCkKCnVuUGtjczUgOjogW1dv
cmQ2NF0tPiBTdHJpbmcKdW5Qa2NzNSB3cyA9IAogICBjb25jYXQgJCBtYXAgd29yZDY0QXNTdHJp
bmcgKGNvbmNhdCAkIHVuZm9sZHIgZyB3cykgd2hlcmUKICAgICAgZyA6OiBbV29yZDY0XSAtPiBN
YXliZSAoW1dvcmQ2NF0sW1dvcmQ2NF0pCiAgICAgIGcgeCAKICAgICAgICAgfCB0ID09IFtdICAg
PSBOb3RoaW5nCiAgICAgICAgIHwgZCA9PSBbXSAgID0gSnVzdCAoW3NdLCBbXSkKICAgICAgICAg
fCBvdGhlcndpc2UgPSBKdXN0ICh0LCBkKQogICAgICAgICB3aGVyZSB0ICAgPSB0YWtlIDEgeAoJ
ICAgICAgIGQgICA9IGRyb3AgMSB4CgkgICAgICAgcyAgID0gc3RyaW5nQXNXb3JkNjQgJCBoICQg
d29yZDY0QXNTdHJpbmcgJCBoZWFkIHQKCSAgICAgICBoIDo6IFN0cmluZyAtPiBTdHJpbmcKICAg
ICAgICAgICAgICAgaCB4ID0gdGFrZSAoOCAtKG9yZCAobGFzdCB4KSkpIHgKCi0tICogQmFzaWMg
REVTIEVuY3J5cHRpb24KCi0tIHwgQmFzaWMgREVTIGVuY3J5cHRpb24gd2hpY2ggdGFrZXMgYSBr
ZXkgYW5kIGEgYmxvY2sgb2YgcGxhaW50ZXh0IAotLSBhbmQgcmV0dXJucyB0aGUgZW5jcnlwdGVk
IGJsb2NrIG9mIGNpcGhlcnRleHQgYWNjb3JkaW5nIHRvIHRoZSBzdGFuZGFyZC4KCmRlcyA6OiBX
b3JkNjQgLT4gV29yZDY0IC0+IFdvcmQ2NApkZXMgPSBmbGlwIGRlc19lbmMKCi0tIHwgQmFzaWMg
REVTIGRlY3J5cHRpb24gd2hpY2ggdGFrZXMgYSBrZXkgYW5kIGEgYmxvY2sgb2YgY2lwaGVydGV4
dCBhbmQKLS0gcmV0dXJucyB0aGUgZGVjcnlwdGVkIGJsb2NrIG9mIHBsYWludGV4dCBhY2NvcmRp
bmcgdG8gdGhlIHN0YW5kYXJkLgoKdW5EZXMgOjogV29yZDY0IC0+IFdvcmQ2NCAtPiBXb3JkNjQK
dW5EZXMgPSBmbGlwIGRlc19kZWMK

------_=_NextPart_001_01C308B9.030535BD--