------_extPart_001_01C5C985.8409652E
Content-Type: text/plain;
	charsets-ascii"
Content-Transfer-Encoding: quoted-printable

  
This was an interesting one.

I started out trying to do a fairly word-for-word translation to ruby,
and then started on a loose translation after I hit the defmacro stuff. 

Then I thought, screw that. Why not parse LISP? I think ended up getting
a much better understanding of all the bits that the casting SPELS
article glossed over. 

Herein, an extremely inelegant, and potentially severely broken lisp
processor.

It allows you to write code like the following:

require 'lisp'
class Monkey
  include Lisp
  include Lisp::StandardFunctions
  def boogers
    "Monkeys!!"
  end
end

x = Monkey.new
x.lisp "(setf *something* 'value)"
x.lisp "(defun saysomething () *something*)"

x.saysomething()
=> "value"
x.lisp "(saysomething)"
=> "value"
x.lisp "(boogers)"
=> "Monkeys!!"


#####################################################################################
This email has been scanned by MailMarshal, an email content filter.
#####################################################################################

------_extPart_001_01C5C985.8409652E
Content-Type: application/octet-stream;
	nameisp.rb"
Content-Transfer-Encoding: base64
Content-Description: lisp.rb
Content-Disposition: attachment;
	filenameisp.rb"

bW9kdWxlIExpc3ANCiAgICBtb2R1bGUgU3RhbmRhcmRGdW5jdGlvbnMNCiAgICAgICAgZGVmIGZp
cnN0KGFycikNCiAgICAgICAgICAgIGFyclswXQ0KICAgICAgICBlbmQNCiAgICAgICAgZGVmIHNl
Y29uZChhcnIpDQogICAgICAgICAgICBhcnJbMV0NCiAgICAgICAgZW5kDQogICAgICAgIGRlZiB0
aGlyZChhcnIpDQogICAgICAgICAgICBhcnJbMl0NCiAgICAgICAgZW5kDQogICAgICAgIGRlZiBh
c3NvYyhrZXksIGFycikNCiAgICAgICAgICAgIGFyci5hc3NvYyhrZXkpDQogICAgICAgIGVuZA0K
ICAgICAgICBkZWYgY2RkcihhcnIpDQogICAgICAgICAgICBhcnJbMi4uLTFdDQogICAgICAgIGVu
ZA0KICAgICAgICBkZWYgbWFwY2FyKHByb2MsIGFycikNCiAgICAgICAgICAgIGFyci5jb2xsZWN0
IGRvIHx4fA0KICAgICAgICAgICAgICAgIHByb2MuY2FsbCh4KQ0KICAgICAgICAgICAgZW5kDQog
ICAgICAgIGVuZA0KICAgICAgICBkZWYgYXBwbHkoZnVuY3Rpb24sIGxpc3QpDQogICAgICAgICAg
ICBmdW5jdGlvbi5jYWxsKCpsaXN0KQ0KICAgICAgICBlbmQNCiAgICAgICAgZGVmIGVxKGEsIGIp
DQogICAgICAgICAgICBhID09IGINCiAgICAgICAgZW5kDQogICAgICAgIGRlZiBwdXNoKG9iamVj
dCwgYXJyKQ0KICAgICAgICAgICAgYXJyLnVuc2hpZnQob2JqZWN0KQ0KICAgICAgICBlbmQNCiAg
ICAgICAgZGVmIGxpc3QoKnRoaW5ncykNCiAgICAgICAgICAgIHRoaW5ncw0KICAgICAgICBlbmQN
CiAgICAgICAgZGVmIG5vdChleHByZXNzaW9uKQ0KICAgICAgICAgICAgIWV4cHJlc3Npb24NCiAg
ICAgICAgZW5kDQogICAgICAgIGRlZiBhbmQoKmFyZ3MpDQogICAgICAgICAgICBhcmdzLmFsbD8g
eyB8eHwgeCB9DQogICAgICAgIGVuZA0KICAgICAgICBkZWYgbWVtYmVyKG9iamVjdCwgYXJyKQ0K
ICAgICAgICAgICAgYXJyLmluY2x1ZGU/KG9iamVjdCkNCiAgICAgICAgZW5kDQogICAgICAgIGRl
ZmluZV9tZXRob2QgInJlbW92ZS1pZi1ub3QiIGRvIHxwcm9jLCBhcnJ8DQogICAgICAgICAgICBh
cnIuc2VsZWN0IHt8eHwgcHJvYy5jYWxsKHgpIH0NCiAgICAgICAgZW5kDQogICAgICAgIGRlZiBh
cHBlbmQoKmxpc3QpDQogICAgICAgICAgICBvdXQgPSBbXQ0KICAgICAgICAgICAgbGlzdC5lYWNo
IHsgfGx8IA0KICAgICAgICAgICAgICAgIG91dC5jb25jYXQobCkNCiAgICAgICAgICAgIH0NCiAg
ICAgICAgICAgIG91dA0KICAgICAgICBlbmQNCiAgICBlbmQNCiAgICANCiAgICBjbGFzcyBMaXNw
TGlzdCA8IEFycmF5DQogICAgICAgIGF0dHJfcmVhZGVyIDpmbGFncw0KICAgICAgICBkZWYgaW5p
dGlhbGl6ZShmbGFncykNCiAgICAgICAgICAgIHJhaXNlICJiYWQiIHVubGVzcyBmbGFncw0KICAg
ICAgICAgICAgQGZsYWdzID0gZmxhZ3MNCiAgICAgICAgZW5kDQogICAgICAgIGRlZiB0b19saXNw
KCkNCiAgICAgICAgICAgICIje0BmbGFnc30oI3tjb2xsZWN0IHt8eHwgeC50b19saXNwKCl9Lmpv
aW4oIiAiKX0pIg0KICAgICAgICBlbmQNCiAgICAgICAgZGVmIF9fY29tcHV0ZV9jb21tYShvdXQs
IGxpc3AsIGxvY2FsX3ZhcnMsIGRlcHRoPTEpDQogICAgICAgICAgICBlYWNoIHsgfHh8DQoJCWNp
biA9IG5pbA0KCQlkZXB0aC50aW1lcyB7IA0KCQkJbmV3Y2luID0geC5mbGFnc1soY2lufHwtMSkr
MS4uLTFdLmluZGV4KCIsIikNCgkJCWlmIG5ld2Npbg0KCQkJCWNpbiA9IG5ld2NpbiArIChjaW58
fC0xKSArIDENCgkJCWVsc2UNCgkJCQljaW4gPSBuaWwNCgkJCQlicmVhaw0KCQkJZW5kDQoJCX0N
CgkJaWYoY2luKQ0KICAgICAgICAgICAgICAgICAgICBpZih4LmZsYWdzW2NpbisxXSA9PSAiQCIp
DQogICAgICAgICAgICAgICAgICAgICAgICBuZXdmbGFncyA9IHguZmxhZ3NbY2luKzIuLi0xXSAN
CiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3Zmxh
Z3MgPSB4LmZsYWdzW2NpbisxLi4tMV0NCiAgICAgICAgICAgICAgICAgICAgZW5kDQogICAgICAg
ICAgICAgICAgICAgIGlmKExpc3BMaXN0ID09PSB4KQ0KICAgICAgICAgICAgICAgICAgICAgICAg
eHggPSBMaXNwTGlzdC5uZXcobmV3ZmxhZ3MpDQogICAgICAgICAgICAgICAgICAgICAgICB4LmVh
Y2ggeyB8eXwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eCA8PCB5DQogICAgICAgICAg
ICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAg
ICAgICAgICAgIHh4ID0gTGlzcFN0cmluZy5uZXcoeCwgbmV3ZmxhZ3MpDQogICAgICAgICAgICAg
ICAgICAgIGVuZA0KICAgICAgICAgICAgICAgICAgICB5eSA9IHh4LmNvbXB1dGUobGlzcCwgbG9j
YWxfdmFycykNCgkJICAgIHguZmxhZ3NbMC4uLmNpbl0ucmV2ZXJzZS5lYWNoIGRvIHx6fA0KCQkJ
ICAgIHl5LmZsYWdzLnVuc2hpZnQgeg0KCQkgICAgZW5kDQogICAgICAgICAgICAgICAgICAgIGlm
KHguZmxhZ3NbY2luKzFdID09ICJAIikNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5jb25j
YXQoeXkpDQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAg
IG91dCA8PHl5DQogICAgICAgICAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgICAgIGVsc2lm
IExpc3BTdHJpbmcgPT09IHgNCiAgICAgICAgICAgICAgICAgICAgb3V0IDw8IHgNCiAgICAgICAg
ICAgICAgICBlbHNlDQoJCSAgICBuZXdkZXB0aCA9IGRlcHRoIA0KCQkgICAgbmV3ZGVwdGggKz0g
MSBpZiB4LmZsYWdzLmZpcnN0ID09ICJgIiANCiAgICAgICAgICAgICAgICAgICAgbmV3X291dCA9
IExpc3BMaXN0Lm5ldyh4LmZsYWdzKQ0KICAgICAgICAgICAgICAgICAgICB4Ll9fY29tcHV0ZV9j
b21tYShuZXdfb3V0LCBsaXNwLCBsb2NhbF92YXJzLCBuZXdkZXB0aCkNCiAgICAgICAgICAgICAg
ICAgICAgb3V0IDw8IG5ld19vdXQNCiAgICAgICAgICAgICAgICBlbmQNCiAgICAgICAgICAgIH0N
CiAgICAgICAgZW5kDQogICAgICAgIGRlZiBjb21wdXRlKGxpc3AsIGxvY2FsX3ZhcnMpDQogICAg
ICAgICAgICBpZiBAZmxhZ3MuZmlyc3QgPT0gIiciDQogICAgICAgICAgICAgICAgb3V0ID0gTGlz
cExpc3QubmV3KEBmbGFnc1sxLi4tMV0pDQogICAgICAgICAgICAgICAgZWFjaCB7IHx4fCAgICBv
dXQgPDwgeCB9DQogICAgICAgICAgICAgICAgb3V0DQogICAgICAgICAgICBlbHNpZiBAZmxhZ3Mu
Zmlyc3QgPT0gImAiDQogICAgICAgICAgICAgICAgb3V0ID0gTGlzcExpc3QubmV3KEBmbGFnc1sx
Li4tMV0pDQogICAgICAgICAgICAgICAgX19jb21wdXRlX2NvbW1hKG91dCwgbGlzcCwgbG9jYWxf
dmFycykNCiAgICAgICAgICAgICAgICBvdXQNCiAgICAgICAgICAgIGVsc2lmIEBmbGFncy5maXJz
dC5uaWw/IHx8IEBmbGFncy5maXJzdCA9PSAiLCINCiAgICAgICAgICAgICAgICBpZiBsaXNwLl9f
bWFjcm9zICYmIG1hY3JvID0gbGlzcC5fX21hY3Jvc1tzZWxmWzBdXQ0KICAgICAgICAgICAgICAg
ICAgICByZXN1bHQgPSBtYWNyby5jYWxsKHNlbGZbMS4uLTFdICwgbG9jYWxfdmFycykNCiAgICAg
ICAgICAgICAgICBlbHNpZiBsaXNwLnJlc3BvbmRfdG8/KCIje3NlbGZbMF19XyIpDQogICAgICAg
ICAgICAgICAgICAgIHJlc3VsdCA9IGxpc3Auc2VuZCgiI3tzZWxmWzBdfV8iLCAqKHNlbGZbMS4u
LTFdICsgW2xvY2FsX3ZhcnNdKSkNCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAg
ICAgICAgIG5hbWUgPSBzZWxmWzBdDQogICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBzZWxmWzEu
Li0xXS5jb2xsZWN0IHsgfHh8DQogICAgICAgICAgICAgICAgICAgICAgICB4LmNvbXB1dGUobGlz
cCwgbG9jYWxfdmFycykNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAg
ICByZXN1bHQgPSBsaXNwLnNlbmQoc2VsZlswXSwgKmFyZ3MpDQogICAgICAgICAgICAgICAgZW5k
ICAgIA0KICAgICAgICAgICAgICAgIHJlc3VsdA0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAg
ICAgICAgIHJhaXNlICJXaGF0IGRvIEkgZG8gd2l0aCAje0BmbGFncy5maXJzdH0/Ig0KICAgICAg
ICAgICAgZW5kICAgICAgICANCiAgICAgICAgZW5kDQogICAgICAgICN+IGRlZiBpbnNwZWN0KCkN
CiAgICAgICAgICAgICN+ICIje2ZsYWdzLmluc3BlY3R9I3tzdXBlcn0iDQogICAgICAgICN+IGVu
ZCAgICAgICAgICAgICAgICANCiAgICBlbmQNCiAgICANCiAgICBGbGFncyA9ICV3eycgYCAsIEB9
DQogICAgDQogICAgY2xhc3MgTGlzcFN0cmluZyA8IFN0cmluZw0KICAgICAgICBhdHRyX3JlYWRl
ciA6ZmxhZ3MNCiAgICAgICAgZGVmIGluaXRpYWxpemUoc3RyaW5nLCBmbGFncykNCiAgICAgICAg
ICAgIHN1cGVyKHN0cmluZykNCiAgICAgICAgICAgIEBmbGFncyA9IGZsYWdzDQogICAgICAgIGVu
ZA0KICAgICAgICBkZWYgY29tcHV0ZShsaXNwLCBsb2NhbF92YXJzKQ0KICAgICAgICAgICAgaWYo
QGZsYWdzLmZpcnN0ID09ICInIikNCiAgICAgICAgICAgICAgICBMaXNwU3RyaW5nLm5ldyhzZWxm
LCBAZmxhZ3NbMS4uLTFdKQ0KICAgICAgICAgICAgZWxzaWYgQGZsYWdzLmZpcnN0Lm5pbD8gfHwg
QGZsYWdzLmZpcnN0ID09ICIsIg0KICAgICAgICAgICAgICAgIGlmKHNlbGZbMC4uMV0gPT0gIiMn
IikNCiAgICAgICAgICAgICAgICAgICAgbGlzcC5tZXRob2Qoc2VsZlsyLi4tMV0pDQogICAgICAg
ICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICBpZiBsb2NhbF92YXJzLmluY2x1ZGU/
KHNlbGYpDQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBsb2NhbF92YXJzW3NlbGZdDQog
ICAgICAgICAgICAgICAgICAgIGVsc2lmIGxpc3AuX19vYmplY3RzICYmIGxpc3AuX19vYmplY3Rz
LmluY2x1ZGU/KHNlbGYpDQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBsaXNwLl9fb2Jq
ZWN0c1tzZWxmXSANCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAg
ICAgICAgcmFpc2UgIicje3NlbGZ9JyBub3QgZGVmaW5lZCIgdW5sZXNzIHZhbA0KICAgICAgICAg
ICAgICAgICAgICBlbmQgdW5sZXNzIHZhbA0KICAgICAgICAgICAgICAgICAgICB2YWwNCiAgICAg
ICAgICAgICAgICBlbmQgICAgICAgIA0KICAgICAgICAgICAgZWxzaWYgQGZsYWdzLmZpcnN0DQog
ICAgICAgICAgICAgICAgcmFpc2UgIldoYXQgZG8gSSBkbyB3aXRoICN7QGZsYWdzLmZpcnN0fT8i
DQogICAgICAgICAgICBlbmQNCiAgICAgICAgZW5kDQogICAgICAgIGRlZiB0b19saXNwKGZsYWdz
PUBmbGFncykNCiAgICAgICAgICAgICIje2ZsYWdzfSN7c2VsZn0iDQogICAgICAgIGVuZCAgICAN
CiAgICAgICAgI34gZGVmIGluc3BlY3QoKQ0KICAgICAgICAgICAgI34gIiN7ZmxhZ3MuaW5zcGVj
dH0je3N1cGVyfSINCiAgICAgICAgI34gZW5kICAgICAgICANCiAgICBlbmQNCiAgICAjDQogICAg
IyBIZWxwZXIgbWV0aG9kcw0KICAgICMNCiAgICBkZWYgX19tYWNyb3MNCiAgICAgICAgQF9fbGlz
cF9tYWNyb3MgfHw9IEhhc2gubmV3DQogICAgZW5kDQogICAgZGVmIF9fb2JqZWN0cw0KICAgICAg
ICB1bmxlc3MgQF9fbGlzcF9vYmplY3RzDQogICAgICAgICAgICBAX19saXNwX29iamVjdHMgPSBI
YXNoLm5ldw0KICAgICAgICAgICAgQF9fbGlzcF9vYmplY3RzWyJ0Il0gPSB0cnVlDQogICAgICAg
ICAgICBAX19saXNwX29iamVjdHNbIm5pbCJdID0gbmlsDQogICAgICAgIGVuZA0KICAgICAgICBA
X19saXNwX29iamVjdHMNCiAgICBlbmQNCiAgICBkZWYgcGFyc2VfbGlzcChzdHJpbmcsIGZsYWdz
PVtdKQ0KICAgICAgICBzdHJpbmcuZ3N1YiEoIlxuIiwgIiAiKQ0KICAgICAgICBzdHJpbmcuc3Ry
aXAhDQogICAgICAgIGFyZ3MgPSBMaXNwTGlzdC5uZXcoZmxhZ3MpDQogICAgICAgIHdoaWxlIHN0
cmluZyAmJiAhc3RyaW5nLmVtcHR5Pw0KICAgICAgICAgICAgbmV3ZmxhZ3MgPSBbXQ0KICAgICAg
ICAgICAgd2hpbGUoRmxhZ3MuaW5jbHVkZT8oc3RyaW5nWzAuLjBdKSkNCiAgICAgICAgICAgICAg
ICBuZXdmbGFncyA8PCBzdHJpbmdbMC4uMF0NCiAgICAgICAgICAgICAgICBzdHJpbmcgPSBzdHJp
bmdbMS4uLTFdDQogICAgICAgICAgICBlbmQNCiAgICAgICAgICAgICN+IHN0cmluZywgbmV3Zmxh
Z3MgPSBMaXNwRmxhZ3MucGFyc2Uoc3RyaW5nLCBmbGFncykNCiAgICAgICAgICAgIGluZGV4ID0g
c3RyaW5nLmluZGV4KCcoJykNCiAgICAgICAgICAgIGlmIChpbmRleCAmJiBpbmRleCA9PSAwKQ0K
ICAgICAgICAgICAgICAgIGNvdW50ID0gMQ0KICAgICAgICAgICAgICAgIGluZGV4ICs9IDENCiAg
ICAgICAgICAgICAgICB3aGlsZSBjb3VudCA+IDANCiAgICAgICAgICAgICAgICAgICAgb3BlbiA9
IHN0cmluZy5pbmRleCgnKCcsIGluZGV4KQ0KICAgICAgICAgICAgICAgICAgICBjbG9zZSA9IHN0
cmluZy5pbmRleCgnKScsIGluZGV4KQ0KICAgICAgICAgICAgICAgICAgICByYWlzZSAiVW5tYXRj
aGVkIGJyYWNrZXRzIiB1bmxlc3MoY2xvc2UgfHwgb3BlbikNCiAgICAgICAgICAgICAgICAgICAg
aWYoIW9wZW4gfHwgY2xvc2UgPCBvcGVuKQ0KICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgg
PSBjbG9zZSsxDQogICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAtPSAxDQogICAgICAgICAg
ICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gb3BlbisxDQog
ICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxDQogICAgICAgICAgICAgICAgICAgIGVu
ZA0KICAgICAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgICAgIGN1cnJlbnQsIHN0cmluZyA9
IHN0cmluZ1sxLi4uKGluZGV4LTEpXSwgc3RyaW5nW2luZGV4KzEuLi0xXQ0KICAgICAgICAgICAg
ICAgIGFyZ3MgPDwgcGFyc2VfbGlzcChjdXJyZW50LCBuZXdmbGFncykNCiAgICAgICAgICAgIGVs
c2UNCiAgICAgICAgICAgICAgICBjdXJyZW50LCBzdHJpbmcgPSBzdHJpbmcuc3BsaXQoL1xzKy8s
IDIpDQogICAgICAgICAgICAgICAgYXJncyA8PCBMaXNwU3RyaW5nLm5ldyhjdXJyZW50LCBuZXdm
bGFncykNCiAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgc3RyaW5nLnN0cmlwISBpZiBzdHJp
bmcNCiAgICAgICAgZW5kICAgIA0KICAgICAgICBhcmdzDQogICAgZW5kDQogICAgZGVmIF9fY29u
dmVydChvYmplY3QpDQogICAgICAgIGNhc2Ugb2JqZWN0DQogICAgICAgICAgICB3aGVuIExpc3BM
aXN0LCBMaXNwU3RyaW5nLCBQcm9jIDogb2JqZWN0DQogICAgICAgICAgICB3aGVuIEFycmF5DQog
ICAgICAgICAgICAgICAgb3V0ID0gTGlzcExpc3QubmV3KFtdKQ0KICAgICAgICAgICAgICAgIG9i
amVjdC5lYWNoIHt8eHwgb3V0IDw8IF9fY29udmVydCh4KX0NCiAgICAgICAgICAgICAgICBvdXQN
CiAgICAgICAgICAgIHdoZW4gVHJ1ZUNsYXNzDQogICAgICAgICAgICAgICAgTGlzcFN0cmluZy5u
ZXcoInQiLCBbXSkNCiAgICAgICAgICAgIHdoZW4gRmFsc2VDbGFzcywgTmlsQ2xhc3MNCiAgICAg
ICAgICAgICAgICBMaXNwU3RyaW5nLm5ldygibmlsIiwgW10pDQogICAgICAgICAgICB3aGVuIFN0
cmluZw0KICAgICAgICAgICAgICAgIExpc3BTdHJpbmcubmV3KG9iamVjdCwgW10pDQogICAgICAg
ICAgICBlbHNlDQogICAgICAgICAgICAgICAgcmFpc2UgIldoYXQgZG8gaSBkbyB3aXRoICN7b2Jq
ZWN0LmNsYXNzfT8iDQogICAgICAgIGVuZA0KICAgIGVuZA0KICAgIGRlZiBsaXNwKHN0cmluZywg
bG9jYWxfdmFycz1IYXNoLm5ldykNCiAgICAgICAgcmVzdWx0ID0gbmlsDQogICAgICAgIHBhcnNl
ZCA9IHBhcnNlX2xpc3Aoc3RyaW5nKQ0KICAgICAgICBwYXJzZWQuZWFjaCB7IHx4fA0KICAgICAg
ICAgICAgcmVzdWx0ID0geC5jb21wdXRlKHNlbGYsIGxvY2FsX3ZhcnMpDQogICAgICAgIH0NCiAg
ICAgICAgX19jb252ZXJ0KHJlc3VsdCkNCiAgICBlbmQNCiAgICAjDQogICAgIyBUaGUgY29yZSBt
ZXRob2RzIGZvciBsaXNwIHRvIHdvcmsNCiAgICAjDQogICAgZGVmIGxhbWJkYV8oYXJncywgYmxv
Y2ssIGxvY2FsX3ZhcnMsIG5hbWU9bmlsKQ0KICAgICAgICBQcm9jLm5ldyBkbyB8KnByb2Nhcmdz
fA0KICAgICAgICAgICAgaWYgYXJncy5sZW5ndGggPT0gcHJvY2FyZ3MubGVuZ3RoDQogICAgICAg
ICAgICAgICAgbmV3X2xvY2FsX3ZhcnMgPSBIYXNoLm5ldw0KICAgICAgICAgICAgICAgIG5ld19s
b2NhbF92YXJzLnVwZGF0ZShsb2NhbF92YXJzKSBpZiBsb2NhbF92YXJzDQogICAgICAgICAgICAg
ICAgYXJncy5sZW5ndGgudGltZXMgZG8gfGl8DQogICAgICAgICAgICAgICAgICAgIG5ld19sb2Nh
bF92YXJzW2FyZ3NbaV1dID0gcHJvY2FyZ3NbaV0NCiAgICAgICAgICAgICAgICBlbmQNCiAgICAg
ICAgICAgICAgICBibG9jay5jb21wdXRlKHNlbGYsIG5ld19sb2NhbF92YXJzKQ0KICAgICAgICAg
ICAgZWxzZQ0KICAgICAgICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJ3cm9uZyBudW1i
ZXIgb2YgYXJndW1lbnRzICgje3Byb2NhcmdzLmxlbmd0aH0gZm9yICN7YXJncy5sZW5ndGh9KSBp
biAje25hbWUgfHwgYmxvY2t9Ig0KICAgICAgICAgICAgZW5kICAgICAgICANCiAgICAgICAgZW5k
ICAgICAgICANCiAgICBlbmQNCiAgICBkZWYgZGVmdW5fKG5hbWUsIGFyZ3MsIGJsb2NrLCBsb2Nh
bF92YXJzKQ0KICAgICAgICBAZGVmdW4gfHw9IEhhc2gubmV3DQogICAgICAgIHh4ID0gbGFtYmRh
XyhhcmdzLCBibG9jaywgbG9jYWxfdmFycywgbmFtZSkNCiAgICAgICAgc2VsZi5jbGFzcy5tb2R1
bGVfZXZhbCBkbw0KICAgICAgICAgICAgZGVmaW5lX21ldGhvZCBuYW1lIGRvIHwqYXJnc3wgeHgu
Y2FsbCgqYXJncykgZW5kDQogICAgICAgIGVuZA0KICAgICAgICBuYW1lDQogICAgZW5kDQogICAg
ZGVmIGRlZm1hY3JvXyhuYW1lLCBhcmdzLCBibG9jaywgbG9jYWxfdmFycykNCiAgICAgICAgaWYo
YXJnc1stMl0gPT0gIiZyZXN0IikNCiAgICAgICAgICAgIHJlc3RhcmcgPSBhcmdzWy0xXQ0KICAg
ICAgICAgICAgYXJncyA9IGFyZ3NbMC4uLTNdDQogICAgICAgIGVuZA0KICAgICAgICBfX21hY3Jv
c1tuYW1lXSA9IFByb2MubmV3IGRvIHxwcm9jYXJncywgcHJvY19sb2NhbF92YXJzfA0KICAgICAg
ICAgICAgbmV3X2xvY2FsX3ZhcnMgPSBIYXNoLm5ldw0KICAgICAgICAgICAgbmV3X2xvY2FsX3Zh
cnMudXBkYXRlKGxvY2FsX3ZhcnMpIGlmIGxvY2FsX3ZhcnMNCiAgICAgICAgICAgIG5ld19sb2Nh
bF92YXJzLnVwZGF0ZShwcm9jX2xvY2FsX3ZhcnMpIGlmIHByb2NfbG9jYWxfdmFycw0KICAgICAg
ICAgICAgYXJncy5sZW5ndGgudGltZXMgZG8gfGl8DQogICAgICAgICAgICAgICAgbmV3X2xvY2Fs
X3ZhcnNbYXJnc1tpXV0gPSBwcm9jYXJnc1tpXQ0KICAgICAgICAgICAgZW5kDQogICAgICAgICAg
ICBpZihwcm9jYXJncy5sZW5ndGggPiBhcmdzLmxlbmd0aCkNCiAgICAgICAgICAgICAgICBpZihy
ZXN0YXJnKQ0KICAgICAgICAgICAgICAgICAgICBsaXN0ID0gTGlzcExpc3QubmV3KFtdKQ0KICAg
ICAgICAgICAgICAgICAgICBwcm9jYXJnc1thcmdzLmxlbmd0aC4uLTFdLmVhY2ggeyB8eHwgbGlz
dCA8PCB4IH0NCiAgICAgICAgICAgICAgICAgICAgbmV3X2xvY2FsX3ZhcnNbcmVzdGFyZ10gPSBs
aXN0DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICByYWlzZSBBcmd1
bWVudEVycm9yLCAid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAoI3twcm9jYXJncy5sZW5ndGh9
IGZvciAje2FyZ3MubGVuZ3RofSkgaW4gI3tuYW1lIHx8IGJsb2NrfSINCiAgICAgICAgICAgICAg
ICBlbmQNCiAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgcmVzdWx0ID0gYmxvY2suY29tcHV0
ZShzZWxmLCBuZXdfbG9jYWxfdmFycykNCiAgICAgICAgICAgIHJlc3VsdCA9IF9fY29udmVydChy
ZXN1bHQpDQogICAgICAgICAgICBsaXNwKHJlc3VsdC50b19saXNwLCBuZXdfbG9jYWxfdmFycykN
CiAgICAgICAgZW5kDQogICAgICAgIG5hbWUNCiAgICBlbmQNCiAgICBkZWYgc2V0Zl8oa2V5LCB2
YWx1ZSwgbG9jYWxfdmFycykNCiAgICAgICAgdmFsdWUgPSB2YWx1ZS5jb21wdXRlKHNlbGYsIGxv
Y2FsX3ZhcnMpDQogICAgICAgIF9fb2JqZWN0c1trZXldID0gdmFsdWUNCiAgICAgICAga2V5DQog
ICAgZW5kDQogICAgYWxpYXMgOmRlZnBhcmFtZXRlcl8gOnNldGZfDQogICAgZGVmIGxldF8oYXNz
aWdubWVudCwgYmxvY2ssIGxvY2FsX3ZhcnMpDQogICAgICAgIG5ld19sb2NhbF92YXJzID0gSGFz
aC5uZXcNCiAgICAgICAgbmV3X2xvY2FsX3ZhcnMudXBkYXRlKGxvY2FsX3ZhcnMpIGlmIGxvY2Fs
X3ZhcnMNCiAgICAgICAgdmFsdWUgPSBhc3NpZ25tZW50WzBdWzFdLmNvbXB1dGUoc2VsZiwgbmV3
X2xvY2FsX3ZhcnMpDQogICAgICAgIG5ld19sb2NhbF92YXJzW2Fzc2lnbm1lbnRbMF1bMF1dID0g
dmFsdWUNCiAgICAgICAgYmxvY2suY29tcHV0ZShzZWxmLCBuZXdfbG9jYWxfdmFycykNCiAgICBl
bmQNCiAgICBkZWYgY29uZF8oKmFyZ3MpDQogICAgICAgIGxvY2FsX3ZhcnMgPSBhcmdzWy0xXQ0K
ICAgICAgICBibG9ja3MgPSBhcmdzWzAuLi0yXQ0KICAgICAgICBibG9ja3MuZWFjaCB7IHxibG9j
a3wNCiAgICAgICAgICAgIGlmKGJsb2NrWzBdLmNvbXB1dGUoc2VsZiwgbG9jYWxfdmFycykpDQog
ICAgICAgICAgICAgICAgcmVzdWx0ID0gbmlsDQogICAgICAgICAgICAgICAgYmxvY2tbMS4uLTFd
LmVhY2ggeyB8eHwNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0geC5jb21wdXRlKHNlbGYs
IGxvY2FsX3ZhcnMpIA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4g
cmVzdWx0DQogICAgICAgICAgICBlbmQNCiAgICAgICAgfQ0KICAgICAgICBwICJOb3RoaW5nISIN
CiAgICBlbmQNCmVuZA0KDQoNCg0KDQoNCm8gPSBPYmplY3QubmV3DQpvLmV4dGVuZChMaXNwKQ0K
by5leHRlbmQoTGlzcDo6U3RhbmRhcmRGdW5jdGlvbnMpDQoNCiN+IHh4ID0gby5wYXJzZV9saXNw
KCJgKCcsJyxzdHJpbmcpIikNCiN+IHAgeHhbMF0NCiN+IHAgeHhbMF0uY29tcHV0ZShvLCB7InN0
cmluZyIgPT4gImNoYWluIn0pDQojfiBleGl0DQoNCg0KDQoNCg0KDQoNCmlmICQwID09IF9fRklM
RV9fDQogICAgcmVxdWlyZSAndGVzdC91bml0Jw0KICAgIGNsYXNzIFRlc3RMaXNwIDwgVGVzdDo6
VW5pdDo6VGVzdENhc2UNCiAgICAgICAgZGVmIHNldHVwDQogICAgICAgICAgICBAbyA9IE9iamVj
dC5uZXcNCiAgICAgICAgICAgIEBvLmV4dGVuZChMaXNwKQ0KICAgICAgICAgICAgQG8uZXh0ZW5k
KExpc3A6OlN0YW5kYXJkRnVuY3Rpb25zKQ0KICAgICAgICBlbmQNCiAgICAgICAgZGVmIHRlc3Rf
c2ltcGxlX2FycmF5DQogICAgICAgICAgICBhc3NlcnRfZXF1YWwoWyJ4Il0sIEBvLmxpc3AoIico
eCkiKSkNCiAgICAgICAgZW5kDQogICAgICAgIGRlZiB0ZXN0X3NpbXBsZV9hcnJheTINCiAgICAg
ICAgICAgIGFzc2VydF9lcXVhbChbIngiLCAieSIsInoiXSwgQG8ubGlzcCgiJyh4IHkgeikiKSkN
CiAgICAgICAgZW5kDQogICAgICAgIGRlZiB0ZXN0X2NvbW1hbmRfYXJyYXkNCiAgICAgICAgICAg
IEBvLmxpc3AoIihzZXRmICpvYmplY3RzKiAnKHdoaXNrZXktYm90dGxlIGJ1Y2tldCBmcm9nIGNo
YWluKSkiKQ0KICAgICAgICAgICAgYXNzZXJ0X2VxdWFsKCV3e3doaXNrZXktYm90dGxlIGJ1Y2tl
dCBmcm9nIGNoYWlufSwgQG8uX19vYmplY3RzWyIqb2JqZWN0cyoiXSkNCiAgICAgICAgZW5kICAg
ICAgICANCiAgICAgICAgZGVmIHRlc3RfcGFyc2VfcmVjb25zdHJ1Y3QNCiAgICAgICAgICAgIGlu
cHV0ID0gPDwtRU9GDQooZGVmc3BlbCBnYW1lLWFjdGlvbiAoY29tbWFuZCBzdWJqIG9iaiBwbGFj
ZSAmcmVzdCByZXN0KQ0KICBgKGRlZnNwZWwgLGNvbW1hbmQgKHN1YmplY3Qgb2JqZWN0KQ0KICAg
ICBgKGNvbmQgKChhbmQgKGVxICpsb2NhdGlvbiogJywnLHBsYWNlKQ0KICAgICAgICAgIChlcSAn
LHN1YmplY3QgJywnLHN1YmopDQogICAgICAgICAgKGVxICcsb2JqZWN0ICcsJyxvYmopDQogICAg
ICAgICAgKGhhdmUgJywnLHN1YmopKQ0KICAgICAgICAgLEAnLHJlc3QpDQogICAgICAgICh0ICco
aSBjYW50ICwnLGNvbW1hbmQgbGlrZSB0aGF0LikpKSkpICAgIA0KICAgICAgICAgICAgRU9GDQog
ICAgICAgICAgICBpbnB1dC5nc3ViISgvWyBcbl0rLywgIiAiKQ0KICAgICAgICAgICAgb3V0cHV0
ID0gQG8ucGFyc2VfbGlzcChpbnB1dClbMF0NCiAgICAgICAgICAgIHB1dHMNCiAgICAgICAgICAg
ICNvdXRwdXQuZWFjaCB7fHh8IHguZWFjaCB7IHx5fCBwdXRzIHkudG9fbGlzcCB9IGlmIEFycmF5
ID09PSB4fQ0KICAgICAgICAgICAgcHV0cw0KICAgICAgICAgICAgYXNzZXJ0X2VxdWFsKGlucHV0
LCBvdXRwdXQudG9fbGlzcCkNCiAgICAgICAgZW5kDQogICAgICAgIGRlZiB0ZXN0X2RlZnVuDQog
ICAgICAgICAgICBAby5saXNwKDw8LUVPRikNCihkZWZ1biBkZXNjcmliZS1sb2NhdGlvbiAobG9j
YXRpb24gbWFwKQ0KICAoc2Vjb25kIChhc3NvYyBsb2NhdGlvbiBtYXApKSkgICAgICAgIA0KICAg
ICAgICAgICAgRU9GDQogICAgICAgICAgICBAby5saXNwKDw8LUVPRikNCihzZXRmICptYXAqICco
KGxpdmluZy1yb29tICh5b3UgYXJlIGluIHRoZSBsaXZpbmctcm9vbSBvZiBhIHdpemFyZCdzIGhv
dXNlLiB0aGVyZSBpcyBhIHdpemFyZCBzbm9yaW5nIGxvdWRseSBvbiB0aGUgY291Y2guKQ0KICAg
ICAgICAgICAgICAgKHdlc3QgZG9vciBnYXJkZW4pICANCiAgICAgICAgICAgICAgICh1cHN0YWly
cyBzdGFpcndheSBhdHRpYykpDQogICAgICAgICAgKGdhcmRlbiAoeW91IGFyZSBpbiBhIGJlYXV0
aWZ1bCBnYXJkZW4uIHRoZXJlIGlzIGEgd2VsbCBpbiBmcm9udCBvZiB5b3UuKQ0KICAgICAgICAg
ICAgICAoZWFzdCBkb29yIGxpdmluZy1yb29tKSkNCiAgICAgICAgICAoYXR0aWMgKHlvdSBhcmUg
aW4gdGhlIGF0dGljIG9mIHRoZSB3aXphcmRzIGhvdXNlLiB0aGVyZSBpcyBhIGdpYW50IHdlbGRp
bmcgdG9yY2ggaW4gdGhlIGNvcm5lci4pDQogICAgICAgICAgICAgKGRvd25zdGFpcnMgc3RhaXJ3
YXkgbGl2aW5nLXJvb20pKSkpDQogICAgICAgICAgICBFT0YNCiAgICAgICAgICAgIHJlc3VsdCA9
IEBvLmxpc3AoPDwtRU9GKQ0KKGRlc2NyaWJlLWxvY2F0aW9uICdsaXZpbmctcm9vbSAqbWFwKikN
CiAgICAgICAgICAgIEVPRg0KICAgICAgICAgICAgYXNzZXJ0X2VxdWFsKCV3e3lvdSBhcmUgaW4g
dGhlIGxpdmluZy1yb29tIG9mIGEgd2l6YXJkJ3MgaG91c2UuIHRoZXJlIGlzIGEgd2l6YXJkIHNu
b3JpbmcgbG91ZGx5IG9uIHRoZSBjb3VjaC59LCByZXN1bHQpDQogICAgICAgIGVuZA0KICAgICAg
ICBkZWYgdGVzdF9saXNwX2dhbWUNCiAgICAgICAgICAgIEBvLmxpc3AoPDwtRU9GKQ0KKHNldGYg
Km9iamVjdHMqICcod2hpc2tleS1ib3R0bGUgYnVja2V0IGNoYWluIGZyb2cpKQ0KICAgICAgICAg
ICAgRU9GDQogICAgICAgICAgICBAby5saXNwKDw8LUVPRikNCihzZXRmICptYXAqICcoKGxpdmlu
Zy1yb29tICh5b3UgYXJlIGluIHRoZSBsaXZpbmctcm9vbSBvZiBhIHdpemFyZCdzIGhvdXNlLiB0
aGVyZSBpcyBhIHdpemFyZCBzbm9yaW5nIGxvdWRseSBvbiB0aGUgY291Y2guKQ0KICAgICAgICAg
ICAgICAgKHdlc3QgZG9vciBnYXJkZW4pICANCiAgICAgICAgICAgICAgICh1cHN0YWlycyBzdGFp
cndheSBhdHRpYykpDQogICAgICAgICAgKGdhcmRlbiAoeW91IGFyZSBpbiBhIGJlYXV0aWZ1bCBn
YXJkZW4uIHRoZXJlIGlzIGEgd2VsbCBpbiBmcm9udCBvZiB5b3UuKQ0KICAgICAgICAgICAgICAo
ZWFzdCBkb29yIGxpdmluZy1yb29tKSkNCiAgICAgICAgICAoYXR0aWMgKHlvdSBhcmUgaW4gdGhl
IGF0dGljIG9mIHRoZSB3aXphcmRzIGhvdXNlLiB0aGVyZSBpcyBhIGdpYW50IHdlbGRpbmcgdG9y
Y2ggaW4gdGhlIGNvcm5lci4pDQogICAgICAgICAgICAgKGRvd25zdGFpcnMgc3RhaXJ3YXkgbGl2
aW5nLXJvb20pKSkpDQooc2V0ZiAqb2JqZWN0LWxvY2F0aW9ucyogJygod2hpc2tleS1ib3R0bGUg
bGl2aW5nLXJvb20pDQogICAgICAgICAgICAgICAoYnVja2V0IGxpdmluZy1yb29tKQ0KICAgICAg
ICAgICAgICAgKGNoYWluIGdhcmRlbikNCiAgICAgICAgICAgICAgIChmcm9nIGdhcmRlbikpKSAg
ICAgICAgDQooc2V0ZiAqbG9jYXRpb24qICdsaXZpbmctcm9vbSkgICAgICAgIA0KICAgICAgICAg
ICAgRU9GDQogICAgICAgICAgICByZXN1bHQgPSBAby5saXNwKDw8LUVPRikNCihkZWZ1biBkZXNj
cmliZS1sb2NhdGlvbiAobG9jYXRpb24gbWFwKQ0KICAoc2Vjb25kIChhc3NvYyBsb2NhdGlvbiBt
YXApKSkgICAgICAgIA0KKGRlc2NyaWJlLWxvY2F0aW9uICdsaXZpbmctcm9vbSAqbWFwKikNCiAg
ICAgICAgICAgIEVPRg0KICAgICAgICAgICAgYXNzZXJ0X2VxdWFsKCV3e3lvdSBhcmUgaW4gdGhl
IGxpdmluZy1yb29tIG9mIGEgd2l6YXJkJ3MgaG91c2UuIHRoZXJlIGlzIGEgd2l6YXJkIHNub3Jp
bmcgbG91ZGx5IG9uIHRoZSBjb3VjaC59LCByZXN1bHQpDQogICAgICAgICAgICByZXN1bHQgPSBA
by5saXNwKDw8LUVPRikNCihkZWZ1biBkZXNjcmliZS1wYXRoIChwYXRoKQ0KICBgKHRoZXJlIGlz
IGEgLChzZWNvbmQgcGF0aCkgZ29pbmcgLChmaXJzdCBwYXRoKSBmcm9tIGhlcmUuKSkNCihkZXNj
cmliZS1wYXRoICcod2VzdCBkb29yIGdhcmRlbikpICANCiAgICAgICAgICAgIEVPRg0KICAgICAg
ICAgICAgYXNzZXJ0X2VxdWFsKCV3e3RoZXJlIGlzIGEgZG9vciBnb2luZyB3ZXN0IGZyb20gaGVy
ZS59LCByZXN1bHQpDQogICAgICAgICAgICByZXN1bHQgPSBAby5saXNwKDw8LUVPRikNCihkZWZ1
biBkZXNjcmliZS1wYXRocyAobG9jYXRpb24gbWFwKQ0KICAoYXBwbHkgIydhcHBlbmQgKG1hcGNh
ciAjJ2Rlc2NyaWJlLXBhdGggKGNkZHIgKGFzc29jIGxvY2F0aW9uIG1hcCkpKSkpDQooZGVzY3Jp
YmUtcGF0aHMgJ2xpdmluZy1yb29tICptYXAqKSAgDQogICAgICAgICAgICBFT0YNCiAgICAgICAg
ICAgIGFzc2VydF9lcXVhbCgld3t0aGVyZSBpcyBhIGRvb3IgZ29pbmcgd2VzdCBmcm9tIGhlcmUu
IHRoZXJlIGlzIGEgc3RhaXJ3YXkgZ29pbmcgdXBzdGFpcnMgZnJvbSBoZXJlLn0sIHJlc3VsdCkN
CiAgICAgICAgICAgIHJlc3VsdCA9IEBvLmxpc3AoPDwtRU9GKQ0KKGRlZnVuIGlzLWF0IChvYmog
bG9jIG9iai1sb2MpDQogIChlcSAoc2Vjb25kIChhc3NvYyBvYmogb2JqLWxvYykpIGxvYykpDQoo
aXMtYXQgJ3doaXNrZXktYm90dGxlICdsaXZpbmctcm9vbSAqb2JqZWN0LWxvY2F0aW9ucyopICAN
CiAgICAgICAgICAgIEVPRg0KICAgICAgICAgICAgI2Fzc2VydF9lcXVhbCgidCIsIHJlc3VsdCkN
CiAgICAgICAgICAgIHJlc3VsdCA9IEBvLmxpc3AoPDwtRU9GKQ0KKGRlZnVuIGRlc2NyaWJlLWZs
b29yIChsb2Mgb2JqcyBvYmotbG9jKQ0KICAoYXBwbHkgIydhcHBlbmQgKG1hcGNhciAobGFtYmRh
ICh4KQ0KICAgICAgICAgICAgICAgIGAoeW91IHNlZSBhICx4IG9uIHRoZSBmbG9vci4pKQ0KICAg
ICAgICAgICAgICAocmVtb3ZlLWlmLW5vdCAobGFtYmRhICh4KQ0KICAgICAgICAgICAgICAgICAg
ICAgICAoaXMtYXQgeCBsb2Mgb2JqLWxvYykpDQogICAgICAgICAgICAgICAgICAgICBvYmpzKSkp
KQ0KKGRlc2NyaWJlLWZsb29yICdsaXZpbmctcm9vbSAqb2JqZWN0cyogKm9iamVjdC1sb2NhdGlv
bnMqKQ0KICAgICAgICAgICAgRU9GDQogICAgICAgICAgICBhc3NlcnRfZXF1YWwoJXd7eW91IHNl
ZSBhIHdoaXNrZXktYm90dGxlIG9uIHRoZSBmbG9vci4geW91IHNlZSBhIGJ1Y2tldCBvbiB0aGUg
Zmxvb3IufSwgcmVzdWx0KSAgICAgICAgDQogICAgICAgICAgICByZXN1bHQgPSBAby5saXNwKDw8
LUVPRikNCihkZWZ1biBsb29rICgpDQogIChhcHBlbmQgKGRlc2NyaWJlLWxvY2F0aW9uICpsb2Nh
dGlvbiogKm1hcCopDQogICAgICAoZGVzY3JpYmUtcGF0aHMgKmxvY2F0aW9uKiAqbWFwKikNCiAg
ICAgIChkZXNjcmliZS1mbG9vciAqbG9jYXRpb24qICpvYmplY3RzKiAqb2JqZWN0LWxvY2F0aW9u
cyopKSkNCihsb29rKQ0KICAgICAgICAgICAgRU9GDQogICAgICAgICAgICBhc3NlcnRfZXF1YWwo
JXd7eW91IGFyZSBpbiB0aGUgbGl2aW5nLXJvb20gb2YgYSB3aXphcmQncyBob3VzZS4gDQogICAg
dGhlcmUgaXMgYSB3aXphcmQgc25vcmluZyBsb3VkbHkgb24gdGhlIGNvdWNoLiANCiAgICB0aGVy
ZSBpcyBhIGRvb3IgZ29pbmcgd2VzdCBmcm9tIGhlcmUuIA0KICAgIHRoZXJlIGlzIGEgc3RhaXJ3
YXkgZ29pbmcgdXBzdGFpcnMgZnJvbSBoZXJlLiANCiAgICB5b3Ugc2VlIGEgd2hpc2tleS1ib3R0
bGUgb24gdGhlIGZsb29yLiANCiAgICB5b3Ugc2VlIGEgYnVja2V0IG9uIHRoZSBmbG9vci59LCBy
ZXN1bHQpICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdCA9IEBvLmxpc3AoPDwtRU9GKQ0KKGRl
ZnVuIHdhbGstZGlyZWN0aW9uIChkaXJlY3Rpb24pDQogIChsZXQgKChuZXh0IChhc3NvYyBkaXJl
Y3Rpb24gKGNkZHIgKGFzc29jICpsb2NhdGlvbiogKm1hcCopKSkpKQ0KICAgIChjb25kIChuZXh0
IChzZXRmICpsb2NhdGlvbiogKHRoaXJkIG5leHQpKSAobG9vaykpDQogICAgICAodCAnKHlvdSBj
YW50IGdvIHRoYXQgd2F5LikpKSkpDQood2Fsay1kaXJlY3Rpb24gJ3dlc3QpDQogICAgICAgICAg
ICBFT0YNCiAgICAgICAgICAgIGFzc2VydF9lcXVhbCgld3t5b3UgYXJlIGluIGEgYmVhdXRpZnVs
IGdhcmRlbi4gDQogICAgdGhlcmUgaXMgYSB3ZWxsIGluIGZyb250IG9mIHlvdS4gDQogICAgdGhl
cmUgaXMgYSBkb29yIGdvaW5nIGVhc3QgZnJvbSBoZXJlLiANCiAgICB5b3Ugc2VlIGEgY2hhaW4g
b24gdGhlIGZsb29yLiANCiAgICB5b3Ugc2VlIGEgZnJvZyBvbiB0aGUgZmxvb3IufSwgcmVzdWx0
KQ0KICAgICAgICAgICAgcmVzdWx0ID0gQG8ubGlzcCg8PC1FT0YpDQooZGVmbWFjcm8gZGVmc3Bl
bCAoJnJlc3QgcmVzdCkgYChkZWZtYWNybyAsQHJlc3QpKSAgICAgICAgDQooZGVmc3BlbCB3YWxr
IChkaXJlY3Rpb24pDQogIGAod2Fsay1kaXJlY3Rpb24gJyxkaXJlY3Rpb24pKSAgICAgICAgDQoo
d2FsayBlYXN0KQ0KICAgICAgICAgICAgRU9GDQogICAgICAgICAgICBhc3NlcnRfZXF1YWwoJXd7
eW91IGFyZSBpbiB0aGUgbGl2aW5nLXJvb20gb2YgYSB3aXphcmQncyBob3VzZS4NCiAgICB0aGVy
ZSBpcyBhIHdpemFyZCBzbm9yaW5nIGxvdWRseSBvbiB0aGUgY291Y2guDQogICAgdGhlcmUgaXMg
YSBkb29yIGdvaW5nIHdlc3QgZnJvbSBoZXJlLg0KICAgIHRoZXJlIGlzIGEgc3RhaXJ3YXkgZ29p
bmcgdXBzdGFpcnMgZnJvbSBoZXJlLg0KICAgIHlvdSBzZWUgYSB3aGlza2V5LWJvdHRsZSBvbiB0
aGUgZmxvb3IuDQogICAgeW91IHNlZSBhIGJ1Y2tldCBvbiB0aGUgZmxvb3IufSwgcmVzdWx0KQ0K
ICAgICAgICAgICAgcmVzdWx0ID0gQG8ubGlzcCg8PC1FT0YpDQooZGVmdW4gcGlja3VwLW9iamVj
dCAob2JqZWN0KQ0KICAoY29uZCAoKGlzLWF0IG9iamVjdCAqbG9jYXRpb24qICpvYmplY3QtbG9j
YXRpb25zKikgKHB1c2ggKGxpc3Qgb2JqZWN0ICdib2R5KSAqb2JqZWN0LWxvY2F0aW9ucyopDQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKHlvdSBhcmUgbm93IGNhcnJ5aW5nIHRoZSAs
b2JqZWN0KSkNCiAgICAodCAnKHlvdSBjYW5ub3QgZ2V0IHRoYXQuKSkpKQ0KKGRlZnNwZWwgcGlj
a3VwIChvYmplY3QpDQogIGAocGlja3VwLW9iamVjdCAnLG9iamVjdCkpICAgIA0KKHBpY2t1cCB3
aGlza2V5LWJvdHRsZSkNCiAgICAgICAgICAgIEVPRg0KICAgICAgICAgICAgYXNzZXJ0X2VxdWFs
KCV3e3lvdSBhcmUgbm93IGNhcnJ5aW5nIHRoZSB3aGlza2V5LWJvdHRsZX0sIHJlc3VsdCkNCiAg
ICAgICAgICAgIHJlc3VsdCA9IEBvLmxpc3AoPDwtRU9GKQ0KICAgIChkZWZ1biBpbnZlbnRvcnkg
KCkNCiAgICAgIChyZW1vdmUtaWYtbm90IChsYW1iZGEgKHgpDQogICAgICAgICAgICAgICAoaXMt
YXQgeCAnYm9keSAqb2JqZWN0LWxvY2F0aW9ucyopKQ0KICAgICAgICAgICAgICpvYmplY3RzKikp
DQogICAgKGRlZnVuIGhhdmUgKG9iamVjdCkNCiAgICAgIChtZW1iZXIgb2JqZWN0IChpbnZlbnRv
cnkpKSkNCiAgICAoc2V0ZiAqY2hhaW4td2VsZGVkKiBuaWwpDQogICAgDQogICAgKGRlZnVuIHdl
bGQgKHN1YmplY3Qgb2JqZWN0KQ0KICAgICAgKGNvbmQgKChhbmQgKGVxICpsb2NhdGlvbiogJ2F0
dGljKQ0KICAgICAgICAgICAgICAoZXEgc3ViamVjdCAnY2hhaW4pDQogICAgICAgICAgICAgIChl
cSBvYmplY3QgJ2J1Y2tldCkNCiAgICAgICAgICAgICAgKGhhdmUgJ2NoYWluKQ0KICAgICAgICAg
ICAgICAoaGF2ZSAnYnVja2V0KQ0KICAgICAgICAgICAgICAobm90ICpjaGFpbi13ZWxkZWQqKSkN
CiAgICAgICAgIChzZXRmICpjaGFpbi13ZWxkZWQqICd0KQ0KICAgICAgICAgJyh0aGUgY2hhaW4g
aXMgbm93IHNlY3VyZWx5IHdlbGRlZCB0byB0aGUgYnVja2V0LikpDQogICAgICAgICh0ICcoeW91
IGNhbm5vdCB3ZWxkIGxpa2UgdGhhdC4pKSkpICANCiAgICAod2VsZCAnY2hhaW4gJ2J1Y2tldCkg
ICAgDQogICAgICAgICAgICBFT0YNCiAgICAgICAgICAgIGFzc2VydF9lcXVhbCgld3t5b3UgY2Fu
bm90IHdlbGQgbGlrZSB0aGF0Ln0sIHJlc3VsdCkgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0
ID0gQG8ubGlzcCg8PC1FT0YpDQogICAgKHNldGYgKmJ1Y2tldC1maWxsZWQqIG5pbCkNCiAgICAN
CiAgICAoZGVmdW4gZHVuayAoc3ViamVjdCBvYmplY3QpDQogICAgICAoY29uZCAoKGFuZCAoZXEg
KmxvY2F0aW9uKiAnZ2FyZGVuKQ0KICAgICAgICAgICAgICAoZXEgc3ViamVjdCAnYnVja2V0KQ0K
ICAgICAgICAgICAgICAoZXEgb2JqZWN0ICd3ZWxsKQ0KICAgICAgICAgICAgICAoaGF2ZSAnYnVj
a2V0KQ0KICAgICAgICAgICAgICAqY2hhaW4td2VsZGVkKikNCiAgICAgICAgIChzZXRmICpidWNr
ZXQtZmlsbGVkKiAndCkgJyh0aGUgYnVja2V0IGlzIG5vdyBmdWxsIG9mIHdhdGVyKSkNCiAgICAg
ICAgKHQgJyh5b3UgY2Fubm90IGR1bmsgbGlrZSB0aGF0LikpKSkNCiAgICAoZGVmc3BlbCBnYW1l
LWFjdGlvbiAoY29tbWFuZCBzdWJqIG9iaiBwbGFjZSAmcmVzdCByZXN0KQ0KICAgICAgYChkZWZz
cGVsICxjb21tYW5kIChzdWJqZWN0IG9iamVjdCkNCiAgICAgICAgIGAoY29uZCAoKGFuZCAoZXEg
KmxvY2F0aW9uKiAnLCcscGxhY2UpDQogICAgICAgICAgICAgIChlcSAnLHN1YmplY3QgJywnLHN1
YmopDQogICAgICAgICAgICAgIChlcSAnLG9iamVjdCAnLCcsb2JqKQ0KICAgICAgICAgICAgICAo
aGF2ZSAnLCcsc3ViaikpDQogICAgICAgICAgICAgLEAnLHJlc3QpDQogICAgICAgICAgICAodCAn
KGkgY2FudCAsJyxjb21tYW5kIGxpa2UgdGhhdC4pKSkpKQ0KICAgIA0KICAgIChnYW1lLWFjdGlv
biB3ZWxkIGNoYWluIGJ1Y2tldCBhdHRpYw0KICAgICAgICAgICAgIChjb25kICgoYW5kIChoYXZl
ICdidWNrZXQpIChzZXRmICpjaGFpbi13ZWxkZWQqICd0KSkgJyh0aGUgY2hhaW4gaXMgbm93IHNl
Y3VyZWx5IHdlbGRlZCB0byB0aGUgYnVja2V0LikpDQogICAgICAgICAgICAgICAodCAnKHlvdSBk
byBub3QgaGF2ZSBhIGJ1Y2tldC4pKSkpDQogICAgDQogICAgKGdhbWUtYWN0aW9uIGR1bmsgYnVj
a2V0IHdlbGwgZ2FyZGVuDQogICAgICAgICAgICAgKGNvbmQgKCpjaGFpbi13ZWxkZWQqIChzZXRm
ICpidWNrZXQtZmlsbGVkKiAndCkgJyh0aGUgYnVja2V0IGlzIG5vdyBmdWxsIG9mIHdhdGVyKSkN
CiAgICAgICAgICAgICAgICh0ICcodGhlIHdhdGVyIGxldmVsIGlzIHRvbyBsb3cgdG8gcmVhY2gu
KSkpKQ0KICAgIA0KICAgIChnYW1lLWFjdGlvbiBzcGxhc2ggYnVja2V0IHdpemFyZCBsaXZpbmct
cm9vbQ0KICAgICAgICAgICAgIChjb25kICgobm90ICpidWNrZXQtZmlsbGVkKikgJyh0aGUgYnVj
a2V0IGhhcyBub3RoaW5nIGluIGl0LikpDQogICAgICAgICAgICAgICAoKGhhdmUgJ2Zyb2cpICco
dGhlIHdpemFyZCBhd2FrZW5zIGFuZCBzZWVzIHRoYXQgeW91IHN0b2xlIGhpcyBmcm9nLiBoZSBp
cyBzbyB1cHNldCBoZSBiYW5pc2hlcyB5b3UgdG8gdGhlIG5ldGhlcndvcmxkcy0geW91IGxvc2Uh
IHRoZSBlbmQuKSkNCiAgICAgICAgICAgICAgICh0ICcodGhlIHdpemFyZCBhd2FrZW5zIGZyb20g
aGlzIHNsdW1iZXIgYW5kIGdyZWV0cyB5b3Ugd2FybWx5LiBoZSBoYW5kcyB5b3UgdGhlIG1hZ2lj
IGxvdy1jYXJiIGRvbnV0LSB5b3Ugd2luISB0aGUgZW5kLikpKSkNCiAgICANCiAgICAod2VsZCBj
aGFpbiBidWNrZXQpICAgICAgICAgICANCiAgICAgICAgICAgIEVPRg0KICAgICAgICAgICAgYXNz
ZXJ0X2VxdWFsKCV3e2kgY2FudCB3ZWxkIGxpa2UgdGhhdC59LCByZXN1bHQpICAgICAgICANCiAg
ICAgICAgZW5kICAgIA0KICAgIGVuZCAgICANCmVuZA
------_extPart_001_01C5C985.8409652E
Content-Type: application/octet-stream;
	nameuiz_49_lisp.rb"
Content-Transfer-Encoding: base64
Content-Description: quiz_49_lisp.rb
Content-Disposition: attachment;
	filenameuiz_49_lisp.rb"

cmVxdWlyZSAnbGlzcCcNCg0KbGlzcCA9IE9iamVjdC5uZXcNCmxpc3AuZXh0ZW5kKExpc3ApDQps
aXNwLmV4dGVuZChMaXNwOjpTdGFuZGFyZEZ1bmN0aW9ucykNCg0KcmVxdWlyZSAnb3Blbi11cmkn
DQpyZXF1aXJlICdmaXhfcHJveHkucmInDQoNCm9wZW4oImh0dHA6Ly93d3cubGlzcGVyYXRpLmNv
bS9jb2RlLmh0bWwiKSB7IHxmfA0KCWlucHV0ID0gZi5yZWFkbGluZXMuam9pbi5nc3ViKC88W14+
XSo+LywgIiIpDQoJI3B1dHMgaW5wdXQNCglsaXNwLmxpc3AoaW5wdXQpDQp9DQoNCmNvbW1hbmRz
ID0gWw0KCVsiKHBpY2t1cCB3aGlza2V5LWJvdHRsZSkiLCAiKFlPVSBBUkUgTk9XIENBUlJZSU5H
IFRIRSBXSElTS0VZLUJPVFRMRSkiXQ0KXQ0Kb3BlbigiaHR0cDovL3d3dy5saXNwZXJhdGkuY29t
L2NoZWF0Lmh0bWwiKSB7IHxmfA0KCWYuZWFjaCB7IHxsaW5lfA0KCQlsaW5lLmNob21wIQ0KCQls
aW5lLmdzdWIhKCI8YnI+IiwiIikNCgkJaWYgL14+KC4qKS8gPT09IGxpbmUNCgkJCWxpbmUgPSAk
MQ0KCQkJbGluZS5nc3ViISgiV2FsayIsICJ3YWxrIikgI2J1ZyBpbiBpbnB1dA0KCQkJY29tbWFu
ZHMgPDwgW2xpbmUsICIiXQ0KCQllbHNlDQoJCQlsaW5lLmdzdWIhKCJXSVpBUkRTIiwgIldJWkFS
RCdTIikgI2J1ZyBpbiBpbnB1dA0KCQkJbGluZS5nc3ViISgiQVRUSUMgT0YgVEhFIFdJWkFSRCdT
IiwgIkFUVElDIE9GIFRIRSBBQkFORE9ORUQiKSAjYnVnIGluIGlucHV0DQoJCQljb21tYW5kc1st
MV1bMV0gPDwgbGluZQ0KCQllbmQNCgl9DQp9DQpjb21tYW5kcy5lYWNoIGRvIHxjfA0KCXB1dHMg
Y1swXQ0KCXJlc3VsdCA9IGxpc3AubGlzcChjWzBdKQ0KCXJlc3VsdCA9IHJlc3VsdC50b19saXNw
LnVwY2FzZQ0KCXVubGVzcyByZXN1bHQgPT0gY1sxXQ0KCQlwdXRzICJXcm9uZyEiDQoJCXAgcmVz
dWx0DQoJCXAgY1sxXQ0KCQlicmVhaw0KCWVuZA0KZW5kDQoNCg0KDQo-----_extPart_001_01C5C985.8409652E--