[XML-SIG] DOM circular refs

Jeff.Johnson@stn.siemens.com Jeff.Johnson@stn.siemens.com
Fri, 9 Oct 1998 14:12:33 -0400


--0__=A2kFZT3qDsXrOyFApQpGBoEJxCoVbsRUYNc21gz18D7Arav2w7NYsuZs
Content-type: text/plain; charset=us-ascii
Content-Disposition: inline




Hi Andrew,



I think I fixed the last of the circular references but to do it I had to
      make the Document.documentElement a function called
      get_documentElement() which generates a new Element at call time.
      I've got a small test file and a new version or core.py that I
      temporarily call coretest.py.  According to the DOM spec, the
      documentElement is a readonly, convenience attribute.  By making it a
      function, we can enforce the readonly bit.  I patched a few other
      things too.

I've improved my test suite too.  I left the code that checks __init__ vs
      __del__, otherwise my test code can't work, it should be taken out of
      the released code...



(See attached file: coretest.py)(See attached file: test.py)


--0__=A2kFZT3qDsXrOyFApQpGBoEJxCoVbsRUYNc21gz18D7Arav2w7NYsuZs
Content-type: application/octet-stream; 
	name="coretest.py"
Content-Disposition: attachment; filename="coretest.py"
Content-transfer-encoding: base64

JycnDQpjb3JlLnB5OiBgbGlnaHQnIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEb2N1bWVudCBPYmpl
Y3QgTW9kZWwgKGNvcmUpIGxldmVsIDEuDQoNClJlZmVyZW5jZTogaHR0cDovL3d3dy53My5vcmcv
VFIvV0QtRE9NL2xldmVsLW9uZS1jb3JlDQoNCkRldmlhdGlvbnMgZnJvbSB0aGUgc3BlY3M6DQoN
Ci0tIHRoZXJlIGlzIGN1cnJlbnRseSBubyBEb2N1bWVudEZyYWdtZW50Lg0KDQpTbywgdXNlZnVs
IGNsYXNzZXMgaW4gdGhpcyBtb2R1bGUgYXJlIE5vZGUgKGFic3RyYWN0KSBhbmQgaXRzDQooY29u
Y3JldGUpIHN1YmNsYXNzZXMgLS0gRG9jdW1lbnQsIEVsZW1lbnQsIFRleHQsIENvbW1lbnQsDQpQ
cm9jZXNzaW5nSW5zdHJ1Y3Rpb24gLS0gYWxsIG9mIHdoaWNoIHNob3VsZCBiZSBpbnN0YW50aWF0
ZWQgdGhvdWdoDQp0aGUgcmVsZXZhbnQgY3JlYXRlWFhYKCkgbWV0aG9kcyBvbiBhIERvY3VtZW50
IG9iamVjdC4gIA0KDQpUeXBpY2FsIHVzYWdlIFhYWA0KDQpmcm9tIHhtbC5kb20uY29yZSBpbXBv
cnQgKg0KDQpYWFggZXhhbXBsZSBoZXJlDQouLi4NCg0KJycnDQoNCmltcG9ydCBzdHJpbmcNCmZy
b20geG1sLnV0aWxzIGltcG9ydCBlc2NhcGUNCg0KIyBSZWZlcmVuY2VzIGluc2lkZSBzcXVhcmUg
YnJhY2tldHMsIHN1Y2ggYXMgWzEuNV0sIGFyZSB0byBhIHNlY3Rpb24gaW4gdGhlDQojIE9jdG9i
ZXIgMXN0IERPTSBMZXZlbCBPbmUgc3BlY2lmaWNhdGlvbi4NCg0KIw0KIyBNb2R1bGUtbGV2ZWwg
ZGVmaW5pdGlvbnMNCiMNCg0KIyBFeGNlcHRpb24gY29kZXMgWzEuMl0NCklOREVYX1NJWkVfRVJS
ICAgICAgICAgICAgICA9IDENCkRPTVNUUklOR19TSVpFX0VSUiAgICAgICAgICA9IDINCkhJRVJB
UkNIWV9SRVFVRVNUX0VSUiAgICAgICA9IDMNCldST05HX0RPQ1VNRU5UX0VSUiAgICAgICAgICA9
IDQNCklOVkFMSURfQ0hBUkFDVEVSX0VSUiAgICAgICA9IDUNCk5PX0RBVEFfQUxMT1dFRF9FUlIg
ICAgICAgICA9IDYNCk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiA9IDcNCk5PVF9GT1VORF9F
UlIgICAgICAgICAgICAgICA9IDgNCk5PVF9TVVBQT1JURURfRVJSICAgICAgICAgICA9IDkNCklO
VVNFX0FUVFJJQlVURV9FUlIgICAgICAgICA9IDEwDQoNCiMgRXhjZXB0aW9ucyAobm93IGNoYW5n
ZWQgdG8gY2xhc3MtYmFzZWQuIC0tYW1rKQ0KDQpjbGFzcyBET01FeGNlcHRpb246DQogICAgZGVm
IF9faW5pdF9fKHNlbGYsIG1zZyk6DQogICAgICAgIHNlbGYubXNnID0gbXNnDQogICAgZGVmIF9f
cmVwcl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gc2VsZi5tc2cNCiAgICANCmNsYXNzIEluZGV4
U2l6ZUV4Y2VwdGlvbihET01FeGNlcHRpb24pOg0KICAgIGNvZGUgPSBJTkRFWF9TSVpFX0VSUg0K
Y2xhc3MgRE9NU3RyaW5nU2l6ZUV4Y2VwdGlvbihET01FeGNlcHRpb24pOg0KICAgIGNvZGUgPSBE
T01TVFJJTkdfU0laRV9FUlINCmNsYXNzIEhpZXJhcmNoeVJlcXVlc3RFeGNlcHRpb24oRE9NRXhj
ZXB0aW9uKToNCiAgICBjb2RlID0gSElFUkFSQ0hZX1JFUVVFU1RfRVJSDQpjbGFzcyBXcm9uZ0Rv
Y3VtZW50RXhjZXB0aW9uKERPTUV4Y2VwdGlvbik6DQogICAgY29kZSA9IFdST05HX0RPQ1VNRU5U
X0VSUg0KY2xhc3MgTm9EYXRhQWxsb3dlZEV4Y2VwdGlvbihET01FeGNlcHRpb24pOg0KICAgIGNv
ZGUgPSBOT19EQVRBX0FMTE9XRURfRVJSDQpjbGFzcyBOb01vZGlmaWNhdGlvbkFsbG93ZWRFeGNl
cHRpb24oRE9NRXhjZXB0aW9uKToNCiAgICBjb2RlID0gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURf
RVJSDQpjbGFzcyBOb3RGb3VuZEV4Y2VwdGlvbihET01FeGNlcHRpb24pOg0KICAgIGNvZGUgPSBO
T1RfRk9VTkRfRVJSDQpjbGFzcyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oRE9NRXhjZXB0aW9uKToN
CiAgICBjb2RlID0gTk9UX1NVUFBPUlRFRF9FUlINCmNsYXNzIEluVXNlQXR0cmlidXRlRXhjZXB0
aW9uOg0KICAgIGNvZGUgPSBJTlVTRV9BVFRSSUJVVEVfRVJSDQoNCiMgT2xkIGV4Y2VwdGlvbnMg
KGRlcHJlY2F0ZWQpDQpjbGFzcyBOb1N1Y2hOb2RlRXhjZXB0aW9uKERPTUV4Y2VwdGlvbik6IHBh
c3MNCmNsYXNzIE5vdE15Q2hpbGRFeGNlcHRpb24oRE9NRXhjZXB0aW9uKTogcGFzcw0KY2xhc3Mg
Tm90SW1wbGVtZW50ZWRFeGNlcHRpb24oRE9NRXhjZXB0aW9uKTogcGFzcw0KDQojIE5vZGUgdHlw
ZXMuIA0KDQpFTEVNRU5UICAgICAgICAgICAgICAgID0gRUxFTUVOVF9OT0RFICAgICAgICAgICAg
ICAgID0gMQ0KQVRUUklCVVRFICAgICAgICAgICAgICA9IEFUVFJJQlVURV9OT0RFICAgICAgICAg
ICAgICA9IDINClRFWFQgICAgICAgICAgICAgICAgICAgPSBURVhUX05PREUgICAgICAgICAgICAg
ICAgICAgPSAzDQpDREFUQV9TRUNUSU9OICAgICAgICAgID0gQ0RBVEFfU0VDVElPTl9OT0RFICAg
ICAgICAgID0gNA0KRU5USVRZX1JFRkVSRU5DRSAgICAgICA9IEVOVElUWV9SRUZFUkVOQ0VfTk9E
RSAgICAgICA9IDUNCkVOVElUWSAgICAgICAgICAgICAgICAgPSBFTlRJVFlfTk9ERSAgICAgICAg
ICAgICAgICAgPSA2DQpQUk9DRVNTSU5HX0lOU1RSVUNUSU9OID0gUFJPQ0VTU0lOR19JTlNUUlVD
VElPTl9OT0RFID0gNw0KQ09NTUVOVCAgICAgICAgICAgICAgICA9IENPTU1FTlRfTk9ERSAgICAg
ICAgICAgICAgICA9IDgNCkRPQ1VNRU5UICAgICAgICAgICAgICAgPSBET0NVTUVOVF9OT0RFICAg
ICAgICAgICAgICAgPSA5DQpET0NVTUVOVF9UWVBFICAgICAgICAgID0gRE9DVU1FTlRfVFlQRV9O
T0RFICAgICAgICAgID0gMTANCkRPQ1VNRU5UX0ZSQUdNRU5UICAgICAgPSBET0NVTUVOVF9GUkFH
TUVOVF9OT0RFICAgICAgPSAxMQ0KTk9UQVRJT04gICAgICAgICAgICAgICA9IE5PVEFUSU9OX05P
REUgICAgICAgICAgICAgICA9IDEyDQoNCg0KZGVmIGhhc0ZlYXR1cmUoZmVhdHVyZSwgdmVyc2lv
biA9IE5vbmUpOg0KICAgICIiIlRlc3QgaWYgdGhlIERPTSBpbXBsZW1lbnRhdGlvbiBpbXBsZW1l
bnRzIGEgc3BlY2lmaWMgZmVhdHVyZS4NCiAgICBmZWF0dXJlIC0tIHBhY2thZ2UgbmFtZSBvZiB0
aGUgZmVhdHVyZSB0byB0ZXN0LiAgSW4gTGV2ZWwgMSBET00gdGhlDQogICAgICAgICAgICAgICBs
ZWdhbCB2YWx1ZXMgYXJlICdIVE1MJyBhbmQgJ1hNTCcuDQogICAgdmVyc2lvbiAtLSB2ZXJzaW9u
IG51bWJlciBvZiB0aGUgcGFja2FnZSB0byB0ZXN0IChvcHRpb25hbCkNCiAgICAiIiINCiAgICBm
ZWF0dXJlPXN0cmluZy5sb3dlcihmZWF0dXJlKQ0KICAgIA0KICAgIGlmIGZlYXR1cmUgPT0gJ2h0
bWwnOiByZXR1cm4gMA0KICAgIGlmIGZlYXR1cmUgPT0gJ3htbCc6DQogICAgICAgIGlmIHZlcnNp
b24gaXMgTm9uZTogcmV0dXJuIDENCiAgICAgICAgaWYgdmVyc2lvbiA9PSAnMS4wJzogcmV0dXJu
IDENCiAgICAgICAgcmV0dXJuIDANCg0KZGVmIGNyZWF0ZURvY3VtZW50KCk6DQogICAgZCA9IF9u
b2RlRGF0YShET0NVTUVOVF9OT0RFKQ0KICAgIGQubmFtZSA9ICcjZG9jdW1lbnQnDQogICAgZC52
YWx1ZSA9IGQuYXR0cmlidXRlcyA9IE5vbmUNCiAgICBkID0gRG9jdW1lbnQoZCwgTm9uZSwgTm9u
ZSkNCiAgICAjZC5fZG9jdW1lbnQgPSBkDQogICAgcmV0dXJuIGQNCg0KaW1wb3J0IFVzZXJMaXN0
LCBVc2VyRGljdA0KDQpjbGFzcyBOb2RlTGlzdChVc2VyTGlzdC5Vc2VyTGlzdCk6DQogICAgIiIi
QW4gb3JkZXJlZCBjb2xsZWN0aW9uIG9mIG5vZGVzLCBlcXVpdmFsZW50IHRvIGEgUHl0aG9uIGxp
c3QuICBUaGUgb25seQ0KICAgIGRpZmZlcmVuY2UgaXMgdGhhdCBhbiAuaXRlbSgpIG1ldGhvZCBh
bmQgYSAubGVuZ3RoIGF0dHJpYnV0ZSBhcmUgYWRkZWQuDQogICAgIiIiDQogICAgaXRlbSA9IFVz
ZXJMaXN0LlVzZXJMaXN0Ll9fZ2V0aXRlbV9fDQogICAgZ2V0X2xlbmd0aCA9IFVzZXJMaXN0LlVz
ZXJMaXN0Ll9fbGVuX18NCg0KY2xhc3MgTmFtZWROb2RlTWFwKFVzZXJEaWN0LlVzZXJEaWN0KToN
CiAgICAiIiJVc2VkIHRvIHJlcHJlc2VudCBhIGNvbGxlY3Rpb24gb2Ygbm9kZXMgdGhhdCBjYW4g
YmUgYWNjZXNzZWQgYnkgbmFtZS4NCiAgICBFcXVpdmFsZW50IHRvIGEgUHl0aG9uIGRpY3Rpb25h
cnksIHdpdGggdmFyaW91cyBhbGlhc2VzIGFkZGVkIHN1Y2ggYXMNCiAgICBnZXROYW1lZEl0ZW0g
YW5kIHJlbW92ZU5hbWVkSXRlbS4NCiAgICAiIiINCg0KICAgIGdldE5hbWVkSXRlbSA9IFVzZXJE
aWN0LlVzZXJEaWN0Ll9fZ2V0aXRlbV9fDQogICAgcmVtb3ZlTmFtZWRJdGVtID0gVXNlckRpY3Qu
VXNlckRpY3QuX19kZWxpdGVtX18NCiAgICBnZXRfbGVuZ3RoID0gVXNlckRpY3QuVXNlckRpY3Qu
X19sZW5fXw0KICAgIGRlZiBzZXROYW1lZEl0ZW0oc2VsZiwgYXJnKToNCiAgICAgICAga2V5ID0g
YXJnLm5vZGVOYW1lDQogICAgICAgIHNlbGYuZGF0YVtrZXldID0gYXJnDQoNCiAgICBkZWYgaXRl
bShzZWxmLCBpbmRleCk6DQogICAgICAgIHJldHVybiBzZWxmLmRhdGEudmFsdWVzWyBpbmRleCBd
DQoNCmNsYXNzIF9ub2RlRGF0YToNCiAgICAiIiJDbGFzcyB1c2VkIGZvciBzdG9yaW5nIHRoZSBk
YXRhIGZvciBhIHNpbmdsZSBub2RlLiAgSW5zdGFuY2VzIG9mDQogICAgdGhpcyBjbGFzcyBzaG91
bGQgbmV2ZXIgYmUgcmV0dXJuZWQgdG8gdXNlcnMgb2YgdGhlIERPTSBpbXBsZW1lbnRhdGlvbi4i
IiINCiAgICBOb2RlX2NvdW50ZXIgPSAwDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGUpOg0K
ICAgICAgICBzZWxmLnR5cGUgPSB0eXBlDQogICAgICAgIHNlbGYuY2hpbGRyZW4gPSBbXQ0KICAg
ICAgICBzZWxmLm5hbWUgPSBzZWxmLnZhbHVlID0gc2VsZi5hdHRyaWJ1dGVzID0gTm9uZQ0KICAg
ICAgICBfbm9kZURhdGEuTm9kZV9jb3VudGVyID0gX25vZGVEYXRhLk5vZGVfY291bnRlciArIDEN
CiAgICAgICAgcHJpbnQgJ19ub2RlRGF0YVx0aW5pdFx0JXNcdCVzJyAlIChfbm9kZURhdGEuTm9k
ZV9jb3VudGVyLCBzZWxmLm5hbWUpDQoNCiAgICBkZWYgX19kZWxfXyhzZWxmKToNCiAgICAgICAg
X25vZGVEYXRhLk5vZGVfY291bnRlciA9IF9ub2RlRGF0YS5Ob2RlX2NvdW50ZXIgLTENCiAgICAg
ICAgcHJpbnQgJ19ub2RlRGF0YVx0ZGVsXHQlc1x0JXMnICUgKF9ub2RlRGF0YS5Ob2RlX2NvdW50
ZXIsIHNlbGYubmFtZSkNCg0KDQpjbGFzcyBOb2RlOg0KICAgICcnJ0Jhc2UgY2xhc3MgZm9yIGdy
b3ZlIG5vZGVzIGluIERPTSBtb2RlbC4gIFByb3hpZXMgYW4gaW5zdGFuY2UNCiAgICBvZiB0aGUg
X25vZGVEYXRhIGNsYXNzLicnJw0KDQoNCiAgICByZWFkb25seSA9IDANCiAgICBOb2RlX2NvdW50
ZXIgPSAwDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGUsIHBhcmVudCA9IE5vbmUsIGRvY3Vt
ZW50ID0gTm9uZSk6DQogICAgICAgIHNlbGYuX25vZGUgPSBub2RlDQogICAgICAgIHNlbGYucGFy
ZW50Tm9kZSA9IHBhcmVudA0KICAgICAgICBzZWxmLl9kb2N1bWVudCA9IGRvY3VtZW50DQogICAg
ICAgIE5vZGUuTm9kZV9jb3VudGVyID0gTm9kZS5Ob2RlX2NvdW50ZXIgKyAxDQogICAgICAgICNh
c3NlcnQgTm9kZS5Ob2RlX2NvdW50ZXIgPCAzDQogICAgICAgIHByaW50ICdOb2RlICAgICAgXHRp
bml0XHQlc1x0JXMnICUgKE5vZGUuTm9kZV9jb3VudGVyLCBzZWxmLmdldF9ub2RlTmFtZSgpKQ0K
DQogICAgZGVmIF9fZGVsX18oc2VsZik6DQogICAgICAgIE5vZGUuTm9kZV9jb3VudGVyID0gTm9k
ZS5Ob2RlX2NvdW50ZXIgLTENCiAgICAgICAgcHJpbnQgJ05vZGUgICAgICBcdGRlbFx0JXNcdCVz
JyAlIChOb2RlLk5vZGVfY291bnRlciwgc2VsZi5nZXRfbm9kZU5hbWUoKSkNCg0KICAgIGRlZiBf
aW5kZXgoc2VsZik6DQogICAgICAgICJSZXR1cm4gdGhlIGluZGV4IG9mIHRoaXMgY2hpbGQgaW4g
aXRzIHBhcmVudCdzIGNoaWxkIGxpc3QiDQogICAgICAgIGlmIHNlbGYucGFyZW50Tm9kZToNCiAg
ICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudE5vZGUuX25vZGUuY2hpbGRyZW4uX2luZGV4KHNl
bGYpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gLTENCg0KICAgIGRlZiBfY2hl
Y2tDaGlsZChzZWxmLCBjaGlsZCwgcGFyZW50KToNCiAgICAgICAgaWYgcGFyZW50Ll9ub2RlLnR5
cGUgPT0gRE9DVU1FTlQ6DQogICAgICAgICAgICBpZiBjaGlsZC5fZG9jdW1lbnQgIT0gcGFyZW50
Og0KICAgICAgICAgICAgICAgIHJhaXNlIFdyb25nRG9jdW1lbnRFeGNlcHRpb24oImNoaWxkIGNy
ZWF0ZWQgZnJvbSBhIGRpZmZlcmVudCBkb2N1bWVudCIpDQogICAgICAgIGVsaWYgY2hpbGQuX2Rv
Y3VtZW50ICE9IHBhcmVudC5fZG9jdW1lbnQ6DQogICAgICAgICAgICByYWlzZSBXcm9uZ0RvY3Vt
ZW50RXhjZXB0aW9uKCJjaGlsZCBjcmVhdGVkIGZyb20gYSBkaWZmZXJlbnQgZG9jdW1lbnQiKQ0K
DQogICAgICAgICJSYWlzZSBIaWVyYXJjaHlSZXF1ZXN0RXhjZXB0aW9uIGlmIHRoZSBjaGlsZCBj
YW4ndCBiZSBhZGRlZCINCiAgICAgICAgZm9yIGtsYXNzIGluIHNlbGYuY2hpbGRDbGFzc2VzOg0K
ICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjaGlsZCwga2xhc3MpOiBicmVhaw0KICAgICAgICBl
bHNlOg0KICAgICAgICAgICAgcmFpc2UgSGllcmFyY2h5UmVxdWVzdEV4Y2VwdGlvbiwgXA0KICAg
ICAgICAgICAgICAgICAgIiVzIGNhbm5vdCBiZSBjaGlsZCBvZiAlcyIgJSAocmVwcihjaGlsZCks
IHJlcHIoc2VsZikgKQ0KDQogICAgICAgIGNuID0gY2hpbGQuX25vZGUgOyBwPXNlbGYNCiAgICAg
ICAgd2hpbGUgcCBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIGlmIHAuX25vZGUgaXMgY246IA0K
ICAgICAgICAgICAgICAgIHJhaXNlIEhpZXJhcmNoeVJlcXVlc3RFeGNlcHRpb24sIFwNCiAgICAg
ICAgICAgICAgICAgICAgICAiJXMgaXMgYW4gYW5jZXN0b3Igb2YgJXMiICUgKHJlcHIoY2hpbGQp
LCByZXByKHBhcmVudCkgKQ0KICAgICAgICAgICAgcCA9IHAucGFyZW50Tm9kZQ0KICAgICAgICAN
CiAgICAjIGdldC9zZXQgYXR0cmlidXRlcw0KDQogICAgZGVmIGdldF9ub2RlTmFtZShzZWxmKToN
CiAgICAgICAgcmV0dXJuIHNlbGYuX25vZGUubmFtZQ0KICAgIGdldF9uYW1lID0gZ2V0X25vZGVO
YW1lDQoNCiAgICBkZWYgZ2V0X25vZGVWYWx1ZShzZWxmKToNCiAgICAgICAgcmV0dXJuIHNlbGYu
X25vZGUudmFsdWUNCiAgICBnZXRfdmFsdWUgPSBnZXRfbm9kZVZhbHVlDQoNCiAgICBkZWYgZ2V0
X25vZGVUeXBlKHNlbGYpOg0KICAgICAgICByZXR1cm4gc2VsZi5fbm9kZS50eXBlDQoNCiAgICBk
ZWYgZ2V0X3BhcmVudE5vZGUoc2VsZik6DQogICAgICAgIHJldHVybiBzZWxmLnBhcmVudE5vZGUN
Cg0KICAgIGRlZiBnZXRfY2hpbGROb2RlcyhzZWxmKToNCiAgICAgICAgTCA9IHNlbGYuX25vZGUu
Y2hpbGRyZW5bOl0NCiAgICAgICAgIyBDb252ZXJ0IHRoZSBsaXN0IG9mIF9ub2RlRGF0YSBpbnN0
YW5jZXMgaW50byBhIGxpc3Qgb2YNCiAgICAgICAgIyB0aGUgYXBwcm9wcmlhdGUgTm9kZSBzdWJj
bGFzc2VzDQogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihMKSk6DQogICAgICAgICAgICBMW2ld
ID0gIE5PREVfQ0xBU1NbIExbaV0udHlwZSBdIChMW2ldLCBzZWxmLCBzZWxmLl9kb2N1bWVudCkN
CiAgICAgICAgcmV0dXJuIE5vZGVMaXN0KEwpDQoNCiAgICBkZWYgZ2V0X2ZpcnN0Q2hpbGQoc2Vs
Zik6DQogICAgICAgIGlmIHNlbGYuX25vZGUuY2hpbGRyZW46DQogICAgICAgICAgICBuID0gc2Vs
Zi5fbm9kZS5jaGlsZHJlblswXQ0KICAgICAgICAgICAgcmV0dXJuIE5PREVfQ0xBU1NbIG4udHlw
ZSBdIChuLCBzZWxmLCBzZWxmLl9kb2N1bWVudCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAg
IHJldHVybiBOb25lDQoNCiAgICBkZWYgZ2V0X2xhc3RDaGlsZChzZWxmKToNCiAgICAgICAgaWYg
c2VsZi5fbm9kZS5jaGlsZHJlbjoNCiAgICAgICAgICAgIG4gPSBzZWxmLl9ub2RlLmNoaWxkcmVu
Wy0xXQ0KICAgICAgICAgICAgcmV0dXJuIE5PREVfQ0xBU1NbIG4udHlwZSBdIChuLCBzZWxmLCBz
ZWxmLl9kb2N1bWVudCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBOb25lDQoN
CiAgICBkZWYgZ2V0X3ByZXZpb3VzU2libGluZyhzZWxmKToNCiAgICAgICAgaWYgc2VsZi5wYXJl
bnROb2RlIGlzIE5vbmU6IHJldHVybiBOb25lDQogICAgICAgIGkgPSBzZWxmLl9pbmRleCgpDQog
ICAgICAgIGlmIGkgPD0gMDoNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIGVsc2U6
DQogICAgICAgICAgICBuID0gc2VsZi5wYXJlbnROb2RlLl9ub2RlLmNoaWxkcmVuW2kgLSAxXQ0K
ICAgICAgICAgICAgcmV0dXJuIE5PREVfQ0xBU1NbIG4udHlwZSBdIChuLCBzZWxmLCBzZWxmLl9k
b2N1bWVudCkNCg0KICAgIGRlZiBnZXRfbmV4dFNpYmxpbmcoc2VsZik6DQogICAgICAgIGlmIHNl
bGYucGFyZW50Tm9kZSBpcyBOb25lOiByZXR1cm4gTm9uZQ0KICAgICAgICBMID0gc2VsZi5wYXJl
bnROb2RlLl9ub2RlLmNoaWxkcmVuDQogICAgICAgIGkgPSBzZWxmLl9pbmRleCgpDQogICAgICAg
IGlmIGkgPT0gLTEgb3IgaSA9PSBsZW4oTCkgLSAxOg0KICAgICAgICAgICAgcmV0dXJuIE5vbmUN
CiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBMW2kgKyAxXQ0KDQogICAgZGVmIGdl
dF9hdHRyaWJ1dGVzKHNlbGYpOg0KICAgICAgICByZXR1cm4gc2VsZi5fbm9kZS5hdHRyaWJ1dGVz
DQoNCiAgICBkZWYgZ2V0X293bmVyRG9jdW1lbnQoc2VsZik6DQogICAgICAgIHJldHVybiBzZWxm
Ll9kb2N1bWVudA0KDQogICAgIyBNZXRob2RzDQoNCiAgICBkZWYgaW5zZXJ0QmVmb3JlKHNlbGYs
IG5ld0NoaWxkLCByZWZDaGlsZCk6DQogICAgICAgIGlmIHNlbGYucmVhZG9ubHk6DQogICAgICAg
ICAgICByYWlzZSBOb01vZGlmaWNhdGlvbkFsbG93ZWRFeGNlcHRpb24sICJSZWFkLW9ubHkgbm9k
ZSAiK3JlcHIoc2VsZikNCiAgICAgICAgc2VsZi5fY2hlY2tDaGlsZChuZXdDaGlsZCwgc2VsZikN
Cg0KICAgICAgICAjIElmIG5ld0NoaWxkIGlzIGFscmVhZHkgaW4gdGhlIHRyZWUsIHJlbW92ZSBp
dA0KICAgICAgICBpZiBuZXdDaGlsZC5wYXJlbnROb2RlICE9IE5vbmU6DQogICAgICAgICAgICBu
ZXdDaGlsZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBuZXdDaGlsZCApDQoNCiAgICAgICAgaWYg
cmVmQ2hpbGQgPT0gTm9uZToNCiAgICAgICAgICAgIHNlbGYuX25vZGUuY2hpbGRyZW4uYXBwZW5k
KCBuZXdDaGlsZC5fbm9kZSApDQogICAgICAgICAgICBuZXdDaGlsZC5wYXJlbnROb2RlID0gc2Vs
Zg0KICAgICAgICAgICAgcmV0dXJuIG5ld0NoaWxkDQoNCiAgICAgICAgTCA9IHNlbGYuX25vZGUu
Y2hpbGRyZW4gOyBuID0gcmVmQ2hpbGQuX25vZGUNCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVu
KEwpKToNCiAgICAgICAgICAgIGlmIExbaV0gPT0gbjoNCiAgICAgICAgICAgICAgICBMW2k6aV0g
PSBbbmV3Q2hpbGQuX25vZGVdDQogICAgICAgICAgICAgICAgbmV3Q2hpbGQucGFyZW50Tm9kZSA9
IHNlbGYNCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q2hpbGQNCiAgICAgICAgcmFpc2UgTm90
Rm91bmRFeGNlcHRpb24oInJlZkNoaWxkIG5vdCBhIGNoaWxkIGluIGluc2VydEJlZm9yZSgpIikN
Cg0KICAgIGRlZiByZXBsYWNlQ2hpbGQoc2VsZiwgbmV3Q2hpbGQsIG9sZENoaWxkKToNCiAgICAg
ICAgaWYgc2VsZi5yZWFkb25seToNCiAgICAgICAgICAgIHJhaXNlIE5vTW9kaWZpY2F0aW9uQWxs
b3dlZEV4Y2VwdGlvbiwgIlJlYWQtb25seSBub2RlICIrcmVwcihzZWxmKQ0KICAgICAgICBzZWxm
Ll9jaGVja0NoaWxkKG5ld0NoaWxkLCBzZWxmKQ0KDQogICAgICAgIG8gPSBvbGRDaGlsZC5fbm9k
ZSA7IEwgPSBzZWxmLl9ub2RlLmNoaWxkcmVuDQogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihM
KSk6DQogICAgICAgICAgICBpZiBMW2ldID09IG86DQogICAgICAgICAgICAgICAgIyBJZiBuZXdD
aGlsZCBpcyBhbHJlYWR5IGluIHRoZSB0cmVlLCByZW1vdmUgaXQNCiAgICAgICAgICAgICAgICBp
ZiBuZXdDaGlsZC5wYXJlbnROb2RlICE9IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIG5ld0No
aWxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5ld0NoaWxkICkNCg0KICAgICAgICAgICAgICAg
IExbaV0gPSBuZXdDaGlsZC5fbm9kZQ0KICAgICAgICAgICAgICAgIG5ld0NoaWxkLnBhcmVudE5v
ZGUgPSBzZWxmDQogICAgICAgICAgICAgICAgb2xkQ2hpbGQucGFyZW50Tm9kZSA9IE5vbmUNCiAg
ICAgICAgICAgICAgICByZXR1cm4gb2xkQ2hpbGQNCiAgICAgICAgcmFpc2UgTm90Rm91bmRFeGNl
cHRpb24oIm9sZENoaWxkIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZSIpDQoNCiAgICBkZWYgcmVt
b3ZlQ2hpbGQoc2VsZiwgb2xkQ2hpbGQpOg0KICAgICAgICBpZiBzZWxmLnJlYWRvbmx5Og0KICAg
ICAgICAgICAgcmFpc2UgTm9Nb2RpZmljYXRpb25BbGxvd2VkRXhjZXB0aW9uLCAiUmVhZC1vbmx5
IG5vZGUgIityZXByKHNlbGYpDQoNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5fbm9k
ZS5jaGlsZHJlbi5yZW1vdmUob2xkQ2hpbGQuX25vZGUpDQogICAgICAgICAgICBvbGRDaGlsZC5w
YXJlbnROb2RlID0gTm9uZQ0KICAgICAgICAgICAgcmV0dXJuIG9sZENoaWxkDQogICAgICAgIGV4
Y2VwdCBWYWx1ZUVycm9yOg0KICAgICAgICAgICAgcmFpc2UgTm90Rm91bmRFeGNlcHRpb24oIm9s
ZENoaWxkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZSIpDQoNCiAgICBkZWYgYXBwZW5kQ2hp
bGQoc2VsZiwgbmV3Q2hpbGQpOg0KICAgIAlzZWxmLmluc2VydEJlZm9yZShuZXdDaGlsZCxOb25l
KQ0KDQogICAgZGVmIGhhc0NoaWxkTm9kZXMoc2VsZik6DQogICAgICAgIHJldHVybiBsZW4oc2Vs
Zi5fbm9kZS5jaGlsZHJlbikgPiAwDQoNCiAgICBkZWYgY2xvbmVOb2RlKHNlbGYsIGRlZXApOg0K
ICAgICAgICBwYXNzICMgWFhYIEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGUgZXhhY3QgZGVmaW5pdGlv
biBvZiBjbG9uZU5vZGUoKQ0KDQoJCQkNCmNsYXNzIENoYXJhY3RlckRhdGEoTm9kZSk6DQogICAg
IyBBdHRyaWJ1dGVzDQogICAgZGVmIGdldF9kYXRhKHNlbGYpOg0KICAgICAgICByZXR1cm4gc2Vs
Zi5fbm9kZS52YWx1ZQ0KICAgIA0KICAgIGRlZiBzZXRfZGF0YShzZWxmLCBkYXRhKToNCiAgICAg
ICAgc2VsZi5fbm9kZS52YWx1ZSA9IGRhdGENCiAgICAgICAgDQogICAgZGVmIF9fbGVuX18oc2Vs
Zik6DQogICAgICAgIHJldHVybiBsZW4oc2VsZi5fbm9kZS52YWx1ZSkNCiAgICBnZXRfbGVuZ3Ro
ID0gX19sZW5fXw0KDQogICAgIyBNZXRob2RzDQogICAgZGVmIHN1YnN0cmluZ0RhdGEoc2VsZiwg
b2Zmc2V0LCBjb3VudCk6DQogICAgICAgICIiIkV4dHJhY3RzIGEgcmFuZ2Ugb2YgZGF0YSBmcm9t
IHRoZSBvYmplY3QuDQogICAgICAgIG9mZnNldCAtLSBzdGFydCBvZiBzdWJzdHJpbmcgdG8gZXh0
cmFjdCBjb3VudCAtLSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBleHRyYWN0IiIiDQogICAgICAg
IGlmIG9mZnNldDwwOg0KICAgICAgICAgICAgcmFpc2UgSW5kZXhTaXplRXhjZXB0aW9uKCJOZWdh
dGl2ZSBvZmZzZXQiKQ0KICAgICAgICBpZiBvZmZzZXQ+bGVuKHNlbGYuX25vZGUudmFsdWUpOg0K
ICAgICAgICAgICAgcmFpc2UgSW5kZXhTaXplRXhjZXB0aW9uKCJPZmZzZXQgbGFyZ2VyIHRoYW4g
c2l6ZSBvZiBkYXRhIikNCiAgICAgICAgaWYgY291bnQ8MDoNCiAgICAgICAgICAgIHJhaXNlIElu
ZGV4U2l6ZUV4Y2VwdGlvbigiTmVnYXRpdmUtbGVuZ3RoIHN1YnN0cmluZyByZXF1ZXN0ZWQiKQ0K
DQogICAgICAgIHJldHVybiBzZWxmLl9ub2RlLnZhbHVlW29mZnNldDpvZmZzZXQrY291bnRdDQoN
CiAgICBkZWYgYXBwZW5kRGF0YShzZWxmLCBhcmcpOg0KICAgICAgICAiIiJBcHBlbmQgdGhlIHN0
cmluZyB0byB0aGUgZW5kIG9mIHRoZSBjaGFyYWN0ZXIgZGF0YS4iIiINCiAgICAgICAgaWYgc2Vs
Zi5yZWFkb25seToNCiAgICAgICAgICAgIHJhaXNlIE5vTW9kaWZpY2F0aW9uQWxsb3dlZEV4Y2Vw
dGlvbigiUmVhZC1vbmx5IG9iamVjdCIpDQogICAgICAgIHNlbGYuX25vZGUudmFsdWUgPSBzZWxm
Ll9ub2RlLnZhbHVlICsgYXJnDQoNCiAgICBkZWYgaW5zZXJ0RGF0YShzZWxmLCBvZmZzZXQsIGFy
Zyk6DQogICAgICAgICIiIkluc2VydCBhIHN0cmluZyBhdCB0aGUgc3BlY2lmaWVkIGNoYXJhY3Rl
ciBvZmZzZXQuDQogICAgICAgIG9mZnNldCAtLSBjaGFyYWN0ZXIgb2Zmc2V0IGF0IHdoaWNoIHRv
IGluc2VydA0KICAgICAgICBhcmcgLS0gdGhlIHN0cmluZyB0byBpbnNlcnQiIiINCiAgICAgICAg
aWYgb2Zmc2V0PDA6DQogICAgICAgICAgICByYWlzZSBJbmRleFNpemVFeGNlcHRpb24oIk5lZ2F0
aXZlIG9mZnNldCIpDQogICAgICAgIGlmIHNlbGYucmVhZG9ubHk6DQogICAgICAgICAgICByYWlz
ZSBOb01vZGlmaWNhdGlvbkFsbG93ZWRFeGNlcHRpb24oIlJlYWQtb25seSBvYmplY3QiKQ0KICAg
ICAgICBpZiBvZmZzZXQ+bGVuKHNlbGYuX25vZGUudmFsdWUpOg0KICAgICAgICAgICAgcmFpc2Ug
SW5kZXhTaXplRXhjZXB0aW9uKCJPZmZzZXQgbGFyZ2VyIHRoYW4gc2l6ZSBvZiBkYXRhIikNCiAg
ICAgICAgc2VsZi5fbm9kZS52YWx1ZSA9IHNlbGYuX25vZGUudmFsdWVbOm9mZnNldF0gKyBhcmcg
KyBzZWxmLl9ub2RlLnZhbHVlW29mZnNldDpdDQoNCiAgICBkZWYgZGVsZXRlRGF0YShzZWxmLCBv
ZmZzZXQsIGNvdW50KToNCiAgICAgICAgIiIiUmVtb3ZlIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycyBm
cm9tIHRoZSBub2RlLg0KICAgICAgICBvZmZzZXQgLS0gc3RhcnQgb2Ygc3Vic3RyaW5nIHRvIGRl
bGV0ZQ0KICAgICAgICBjb3VudCAtLSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBkZWxldGUiIiIN
CiAgICAgICAgaWYgb2Zmc2V0PDA6DQogICAgICAgICAgICByYWlzZSBJbmRleFNpemVFeGNlcHRp
b24oIk5lZ2F0aXZlIG9mZnNldCIpDQogICAgICAgIGlmIG9mZnNldD5sZW4oc2VsZi5fbm9kZS52
YWx1ZSk6DQogICAgICAgICAgICByYWlzZSBJbmRleFNpemVFeGNlcHRpb24oIk9mZnNldCBsYXJn
ZXIgdGhhbiBzaXplIG9mIGRhdGEiKQ0KICAgICAgICBpZiBzZWxmLnJlYWRvbmx5Og0KICAgICAg
ICAgICAgcmFpc2UgTm9Nb2RpZmljYXRpb25BbGxvd2VkRXhjZXB0aW9uKCJSZWFkLW9ubHkgb2Jq
ZWN0IikNCiAgICAgICAgc2VsZi5fbm9kZS52YWx1ZSA9IHNlbGYuX25vZGUudmFsdWVbOm9mZnNl
dF0gKyBzZWxmLl9ub2RlLnZhbHVlW29mZnNldCtjb3VudDpdICAgICAgICANCg0KICAgIGRlZiBy
ZXBsYWNlRGF0YShzZWxmLCBvZmZzZXQsIGNvdW50LCBhcmcpOg0KICAgICAgICAiIiJSZXBsYWNl
IHRoZSBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0DQogICAgICAg
IHdpdGggdGhlIHNwZWNpZmllZCBzdHJpbmcuDQogICAgICAgIG9mZnNldCAtLSBzdGFydCBvZiBz
dWJzdHJpbmcgdG8gZGVsZXRlDQogICAgICAgIGNvdW50IC0tIG51bWJlciBvZiBjaGFyYWN0ZXJz
IHRvIGRlbGV0ZQ0KICAgICAgICBhcmcgLS0gc3RyaW5nIHdpdGggd2hpY2ggdGhlIHJhbmdlIHdp
bGwgYmUgcmVwbGFjZWQiIiINCiAgICAgICAgaWYgb2Zmc2V0PDA6DQogICAgICAgICAgICByYWlz
ZSBJbmRleFNpemVFeGNlcHRpb24oIk5lZ2F0aXZlIG9mZnNldCIpDQogICAgICAgIGlmIG9mZnNl
dD5sZW4oc2VsZi5fbm9kZS52YWx1ZSk6DQogICAgICAgICAgICByYWlzZSBJbmRleFNpemVFeGNl
cHRpb24oIk9mZnNldCBsYXJnZXIgdGhhbiBzaXplIG9mIGRhdGEiKQ0KICAgICAgICBpZiBzZWxm
LnJlYWRvbmx5Og0KICAgICAgICAgICAgcmFpc2UgTm9Nb2RpZmljYXRpb25BbGxvd2VkRXhjZXB0
aW9uKCJSZWFkLW9ubHkgb2JqZWN0IikNCiAgICAgICAgc2VsZi5fbm9kZS52YWx1ZSA9IHNlbGYu
X25vZGUudmFsdWVbOm9mZnNldF0gKyBhcmcgKyBzZWxmLl9ub2RlLnZhbHVlW29mZnNldCtjb3Vu
dDpdDQoNCiAgICAjIFhYWCBkZWZpbmUgX19nZXRzbGljZV9fICYgZnJpZW5kcyBoZXJlLi4uDQoN
CiAgICBkZWYgdG94bWwoc2VsZik6DQogICAgICAgIHJldHVybiBlc2NhcGUoc2VsZi5fbm9kZS52
YWx1ZSkgDQogICAgDQpjbGFzcyBBdHRyKE5vZGUpOg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBu
b2RlLCBwYXJlbnQgPSBOb25lKToNCiAgICAgICAgTm9kZS5fX2luaXRfXyhzZWxmLCBub2RlLCBw
YXJlbnQsIE5vbmUpDQoNCiAgICBkZWYgX19yZXByX18oc2VsZik6DQogICAgICAgIHJldHVybiAn
PEF0dHJpYnV0ZSBub2RlICVzLCAlcz4nICUgKHJlcHIoc2VsZi5fbm9kZS5uYW1lKSwNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcihzZWxmLl9ub2RlLnZh
bHVlKSkNCg0KICAgIGRlZiBnZXRfbmFtZShzZWxmKToNCiAgICAgICAgcmV0dXJuIHNlbGYuX25v
ZGUubmFtZQ0KDQogICAgZGVmIGdldF92YWx1ZShzZWxmKToNCiAgICAgICAgcmV0dXJuIHNlbGYu
X25vZGUudmFsdWUNCg0KICAgIGRlZiBzZXRfdmFsdWUoc2VsZiwgdmFsdWUpOg0KICAgICAgICBz
ZWxmLl9ub2RlLnZhbHVlID0gdmFsdWUNCiAgICAgICAgc2VsZi5fbm9kZS5zcGVjaWZpZWQgPSAx
DQoNCiAgICBkZWYgZ2V0X3NwZWNpZmllZChzZWxmKToNCiAgICAgICAgcmV0dXJuIHNlbGYuX25v
ZGUuc3BlY2lmaWVkDQoNCmNsYXNzIEVsZW1lbnQoTm9kZSk6DQogICAgZGVmIF9faW5pdF9fKHNl
bGYsIG5vZGUsIHBhcmVudCA9IE5vbmUsIGRvY3VtZW50ID0gTm9uZSk6DQogICAgICAgIE5vZGUu
X19pbml0X18oc2VsZiwgbm9kZSwgcGFyZW50LCBkb2N1bWVudCkNCiAgICAgICAgDQogICAgZGVm
IF9fcmVwcl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gIjxFbGVtZW50ICclcyc+IiAlIChzZWxm
Ll9ub2RlLm5hbWUpDQoNCiAgICBkZWYgdG94bWwoc2VsZik6DQogICAgICAgIHMgPSAiPCIgKyBz
ZWxmLl9ub2RlLm5hbWUNCiAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNlbGYuX25vZGUuYXR0
cmlidXRlcy5pdGVtcygpOg0KICAgICAgICAgICAgcyA9IHMgKyAiICVzPSclcyciICUgKG5hbWUs
IHZhbHVlKQ0KICAgICAgICBpZiBsZW4oc2VsZi5fbm9kZS5jaGlsZHJlbikgPT0gMDoNCiAgICAg
ICAgICAgIHJldHVybiBzICsgIi8+Ig0KICAgICAgICBzID0gcyArICc+Jw0KICAgICAgICBmb3Ig
Y2hpbGQgaW4gc2VsZi5fbm9kZS5jaGlsZHJlbjoNCiAgICAgICAgICAgIG4gPSBOT0RFX0NMQVNT
WyBjaGlsZC50eXBlIF0gKGNoaWxkLCBzZWxmLCBzZWxmLl9kb2N1bWVudCkNCiAgICAgICAgICAg
IHMgPSBzICsgbi50b3htbCgpDQogICAgICAgIHMgPSBzICsgIjwvIiArIHNlbGYuX25vZGUubmFt
ZSArICc+Jw0KICAgICAgICByZXR1cm4gcw0KDQogICAgIyBBdHRyaWJ1dGVzDQogICAgDQogICAg
ZGVmIGdldF90YWdOYW1lKHNlbGYpOg0KICAgICAgICByZXR1cm4gc2VsZi5fbm9kZS5uYW1lDQoN
CiAgICAjIE1ldGhvZHMNCiAgICANCiAgICBkZWYgZ2V0QXR0cmlidXRlKHNlbGYsIG5hbWUpOg0K
ICAgICAgICBpZiBzZWxmLl9ub2RlLmF0dHJpYnV0ZXMuaGFzX2tleShuYW1lKToNCiAgICAgICAg
ICAgIHJldHVybiBzZWxmLl9ub2RlLmF0dHJpYnV0ZXNbbmFtZV0NCiAgICAgICAgZWxzZToNCiAg
ICAgICAgICAgIHJldHVybiAiIg0KICAgIA0KICAgIGRlZiBzZXRBdHRyaWJ1dGUoc2VsZiwgbmFt
ZSwgdmFsdWUpOg0KICAgICAgICBzZWxmLl9ub2RlLmF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZQ0K
DQogICAgZGVmIHJlbW92ZUF0dHJpYnV0ZShzZWxmLCBuYW1lKToNCiAgICAgICAgaWYgc2VsZi5f
bm9kZS5hdHRyaWJ1dGVzLmhhc19rZXkobmFtZSk6DQogICAgICAgICAgICBkZWwgc2VsZi5fbm9k
ZS5hdHRyaWJ1dGVzW25hbWVdDQoNCiAgICBkZWYgZ2V0QXR0cmlidXRlTm9kZShzZWxmLCBuYW1l
KToNCiAgICAgICAgaWYgbm90IHNlbGYuX25vZGUuYXR0cmlidXRlcy5oYXNfa2V5WyBuYW1lIF06
DQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICBkID0gX25vZGVEYXRhKEFUVFJJQlVU
RV9OT0RFKQ0KICAgICAgICBkLm5hbWUgPSBuYW1lDQogICAgICAgIGQudmFsdWUgPSBzZWxmLl9u
b2RlLmF0dHJpYnV0ZXNbbmFtZV0NCiAgICAgICAgZC5hdHRyaWJ1dGVzID0gTm9uZQ0KICAgICAg
ICByZXR1cm4gQXR0cihkLCBOb25lKQ0KDQogICAgZGVmIHNldEF0dHJpYnV0ZU5vZGUoc2VsZiwg
bmV3QXR0cik6DQogICAgICAgIGlmIHNlbGYuX25vZGUuYXR0cmlidXRlcy5oYXNfa2V5WyBuZXdB
dHRyLl9ub2RlLm5hbWUgXToNCiAgICAgICAgICAgIGQgPSBfbm9kZURhdGEoQVRUUklCVVRFX05P
REUpDQogICAgICAgICAgICBkLm5hbWUgPSBuZXdBdHRyLl9ub2RlLm5hbWUNCiAgICAgICAgICAg
IGQudmFsdWUgPSBzZWxmLl9ub2RlLmF0dHJpYnV0ZXNbIG5ld0F0dHIuX25vZGUubmFtZV0NCiAg
ICAgICAgICAgIGQuYXR0cmlidXRlcyA9IE5vbmUNCiAgICAgICAgICAgIHJldHZhbCA9IEF0dHIo
ZCwgTm9uZSkNCiAgICAgICAgZWxzZTogcmV0dmFsID0gTm9uZQ0KDQogICAgICAgIHNlbGYuX25v
ZGUuYXR0cmlidXRlc1sgbmV3QXR0ci5fbm9kZS5uYW1lIF0gPSBuZXdBdHRyLl9ub2RlLnZhbHVl
DQogICAgICAgIHJldHVybiByZXR2YWwNCg0KICAgIGRlZiByZW1vdmVBdHRyaWJ1dGVOb2RlKHNl
bGYsIG9sZEF0dHIpOg0KICAgICAgICAjIFhYWCB0aGlzIG5lZWRzIHRvIGtub3cgYWJvdXQgRFRE
cyB0byByZXN0b3JlIGEgZGVmYXVsdCB2YWx1ZQ0KICAgICAgICBpZiBzZWxmLl9ub2RlLmF0dHJp
YnV0ZXMuaGFzX2tleVsgb2xkQXR0ci5fbm9kZS5uYW1lIF06DQogICAgICAgICAgICBkID0gX25v
ZGVEYXRhKEFUVFJJQlVURV9OT0RFKQ0KICAgICAgICAgICAgZC5uYW1lID0gbmV3QXR0ci5fbm9k
ZS5uYW1lDQogICAgICAgICAgICBkLnZhbHVlID0gc2VsZi5fbm9kZS5hdHRyaWJ1dGVzWyBvbGRB
dHRyLl9ub2RlLm5hbWUgXQ0KICAgICAgICAgICAgZC5hdHRyaWJ1dGVzID0gTm9uZQ0KICAgICAg
ICAgICAgcmV0dmFsID0gQXR0cihkLCBOb25lKQ0KICAgICAgICAgICAgZGVsIHNlbGYuX25vZGUu
YXR0cmlidXRlc1sgZC5uYW1lIF0NCiAgICAgICAgICAgIHJldHVybiByZXR2YWwNCiAgICAgICAg
ZWxzZTogcmV0dXJuIE5vbmUNCg0KICAgIGRlZiBnZXRFbGVtZW50c0J5VGFnTmFtZShzZWxmLCB0
YWduYW1lKToNCiAgICAgICAgTCA9IFtdDQogICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLl9ub2Rl
LmNoaWxkcmVuOg0KICAgICAgICAgICAgaWYgY2hpbGQudHlwZSA9PSBFTEVNRU5UOg0KICAgICAg
ICAgICAgICAgIGQgPSBFbGVtZW50KGNoaWxkLCBzZWxmLCBzZWxmLl9kb2N1bWVudCkNCiAgICAg
ICAgICAgICAgICBpZiBjaGlsZC5uYW1lID09IHRhZ25hbWU6DQogICAgICAgICAgICAgICAgICAg
IEwuYXBwZW5kKGQpDQogICAgICAgICAgICAgICAgTCA9IEwgKyBkLmdldEVsZW1lbnRzQnlUYWdO
YW1lKHRhZ25hbWUpDQogICAgICAgIHJldHVybiBOb2RlTGlzdChMKQ0KDQogICAgZGVmIG5vcm1h
bGl6ZShzZWxmKToNCiAgICAgICAgIyBUcmF2ZXJzZSB0aGUgbGlzdCBvZiBjaGlsZHJlbiwgYW5k
IG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXMNCiAgICAgICAgTCA9IHNlbGYuX25vZGUuY2hpbGRy
ZW4NCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKEwpLTEsIDAsIC0xKToNCiAgICAgICAgICAg
IGlmIExbaV0udHlwZSA9PSBURVhUX05PREUgYW5kIExbaS0xXS50eXBlID09IFRFWFRfTk9ERToN
CiAgICAgICAgICAgICAgICAjIFR3byB0ZXh0IG5vZGVzIHRvZ2V0aGVyLCBzbyBtZXJnZSB0aGVt
DQogICAgICAgICAgICAgICAgIyBYWFggYW55IFRleHQgaW5zdGFuY2VzIHByb3h5aW5nIHRoZSBk
ZWxldGVkDQogICAgICAgICAgICAgICAgIyBfbm9kZURhdGEgaW5zdGFuY2Ugd2lsbCBmaW5kIHRo
ZW1zZWx2ZXMNCiAgICAgICAgICAgICAgICAjIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSB0cmVlLiAg
DQogICAgICAgICAgICAgICAgTFtpLTFdLnZhbHVlID0gTFtpLTFdLnZhbHVlICsgTFtpXS52YWx1
ZQ0KICAgICAgICAgICAgICAgIGRlbCBMW2k6aSsxXQ0KICAgICAgICAgICAgICAgIA0KICAgICAg
ICBmb3IgaSBpbiByYW5nZShsZW4oTCkpOg0KICAgICAgICAgICAgaWYgTFtpXS50eXBlID09IEVM
RU1FTlRfTk9ERToNCiAgICAgICAgICAgICAgICBuID0gTk9ERV9DTEFTU1sgTFtpXS50eXBlIF0g
KExbaV0sIHNlbGYsIHNlbGYuX2RvY3VtZW50KQ0KICAgICAgICAgICAgICAgIG4ubm9ybWFsaXpl
KCkNCiAgICANCmNsYXNzIFRleHQoQ2hhcmFjdGVyRGF0YSk6DQogICAgIyBNZXRob2RzDQoNCiAg
ICBkZWYgX19yZXByX18oc2VsZik6DQogICAgICAgIGlmIGxlbihzZWxmLl9ub2RlLnZhbHVlKTwy
MDogcz1zZWxmLl9ub2RlLnZhbHVlDQogICAgICAgIGVsc2U6IHM9c2VsZi5fbm9kZS52YWx1ZVs6
MTddICsgJy4uLicNCiAgICAgICAgcmV0dXJuICc8VGV4dCBub2RlICVzPicgJSAocmVwcihzKSwp
DQogICAgICAgIA0KICAgIGRlZiBzcGxpdFRleHQoc2VsZiwgb2Zmc2V0KToNCiAgICAgICAgbjEg
PSBfbm9kZURhdGEoVEVYVF9OT0RFKSA7IG4yID0gX25vZGVEYXRhKFRFWFRfTk9ERSkNCiAgICAg
ICAgbjEubmFtZSA9ICIjdGV4dCIgOyBuMi5uYW1lID0gIiN0ZXh0Ig0KICAgICAgICBuMS52YWx1
ZSA9IHNlbGYuc3Vic3RyaW5nRGF0YSgwLCBvZmZzZXQpDQogICAgICAgIG4yLnZhbHVlID0gc2Vs
Zi5zdWJzdHJpbmdEYXRhKG9mZnNldCwgbGVuKHNlbGYpIC0gb2Zmc2V0KQ0KICAgICAgICBwYXJl
bnQgPSBzZWxmLnBhcmVudE5vZGUNCiAgICAgICAgbjEgPSBUZXh0KG4xLCBOb25lLCBzZWxmLl9k
b2N1bWVudCkNCiAgICAgICAgbjIgPSBUZXh0KG4yLCBOb25lLCBzZWxmLl9kb2N1bWVudCkNCg0K
ICAgICAgICAjIEluc2VydCBuMSBhbmQgbjIsIGFuZCBkZWxldGUgdGhpcyBub2RlDQogICAgICAg
IHBhcmVudC5pbnNlcnRCZWZvcmUobjEsIHNlbGYpDQogICAgICAgIHBhcmVudC5yZXBsYWNlQ2hp
bGQobjIsIHNlbGYpDQogICAgDQpjbGFzcyBDb21tZW50KENoYXJhY3RlckRhdGEpOg0KICAgIGRl
ZiBfX3JlcHJfXyhzZWxmKToNCiAgICAgICAgaWYgbGVuKHNlbGYuX25vZGUudmFsdWUpPDIwOiBz
PXNlbGYuX25vZGUudmFsdWUNCiAgICAgICAgZWxzZTogcz1zZWxmLl9ub2RlLnZhbHVlWzoxN10g
KyAnLi4uJw0KICAgICAgICByZXR1cm4gJzxDb21tZW50IG5vZGUgJXM+JyAlIChyZXByKHMpLCkN
CiAgICANCiAgICBkZWYgdG94bWwoc2VsZik6DQogICAgICAgIHJldHVybiAnPC0tICVzIC0tPicg
JSBzZWxmLl9ub2RlLnZhbHVlDQoNCmNsYXNzIENEQVRBU2VjdGlvbihUZXh0KToNCiAgICAiIiJS
ZXByZXNlbnRzIENEQVRBIHNlY3Rpb25zLCB3aGljaCBhcmUgYmxvY2tzIG9mIHRleHQgdGhhdCB3
b3VsZA0KICAgIG90aGVyd2lzZSBiZSByZWdhcmRlZCBhcyBtYXJrdXAuIiIiDQogICAgZGVmIF9f
cmVwcl9fKHNlbGYpOg0KICAgICAgICBpZiBsZW4oc2VsZi5fbm9kZS52YWx1ZSk8MjA6IHM9c2Vs
Zi5fbm9kZS52YWx1ZQ0KICAgICAgICBlbHNlOiBzPXNlbGYuX25vZGUudmFsdWVbOjE3XSArICcu
Li4nDQogICAgICAgIHJldHVybiAnPENEQVRBU2VjdGlvbiBub2RlICVzPicgJSAocmVwcihzKSwp
DQoNCiAgICBkZWYgdG94bWwoc2VsZik6DQogICAgICAgIHJldHVybiBzZWxmLl9ub2RlLnZhbHVl
DQoNCmNsYXNzIERvY3VtZW50VHlwZShOb2RlKToNCiAgICByZWFkb25seSA9IDEgICAgIyBUaGlz
IGlzIGEgcmVhZC1vbmx5IGNsYXNzDQoNCiAgICAjIEF0dHJpYnV0ZXMNCiAgICBkZWYgZ2V0X25h
bWUoc2VsZik6DQogICAgICAgIHJldHVybiBzZWxmLl9ub2RlLm5hbWUNCg0KICAgIGRlZiBnZXRf
ZW50aXRpZXMoc2VsZik6DQogICAgICAgIHBhc3MgIyBYWFgNCg0KICAgIGRlZiBnZXRfbm90YXRp
b25zKHNlbGYpOg0KICAgICAgICBwYXNzICMgWFhYDQoNCmNsYXNzIE5vdGF0aW9uKE5vZGUpOg0K
ICAgIHJlYWRvbmx5ID0gMSAgICAjIFRoaXMgaXMgYSByZWFkLW9ubHkgY2xhc3MNCiAgICAjIEF0
dHJpYnV0ZXMNCiAgICBkZWYgZ2V0X3B1YmxpY0lkKHNlbGYpOg0KICAgICAgICBwYXNzICMgWFhY
DQogICAgICAgIA0KICAgIGRlZiBnZXRfc3lzdGVtSWQoc2VsZik6DQogICAgICAgIHBhc3MgIyBY
WFgNCiAgICAgICAgDQpjbGFzcyBFbnRpdHkoTm9kZSk6DQogICAgcmVhZG9ubHkgPSAxICAgICMg
VGhpcyBpcyBhIHJlYWQtb25seSBjbGFzcw0KICAgIGRlZiBnZXRfcHVibGljSWQoc2VsZik6DQog
ICAgICAgIHBhc3MgIyBYWFgNCg0KICAgIGRlZiBnZXRfc3lzdGVtSWQoc2VsZik6DQogICAgICAg
IHBhc3MgIyBYWFgNCg0KICAgIGRlZiBnZXRfbm90YXRpb25OYW1lKHNlbGYpOg0KICAgICAgICBw
YXNzICMgWFhYDQoNCmNsYXNzIEVudGl0eVJlZmVyZW5jZShOb2RlKToNCiAgICBwYXNzIA0KDQpj
bGFzcyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oTm9kZSk6DQogICAgZGVmIHRveG1sKHNlbGYpOg0K
ICAgICAgICByZXR1cm4gIjw/ICIgKyBzZWxmLl9ub2RlLm5hbWUgKyAnICcgK3NlbGYuX25vZGUu
dGFyZ2V0ICsgIj8+Ig0KDQogICAgZGVmIGdldF90YXJnZXQoc2VsZik6DQogICAgICAgIHJldHVy
biBzZWxmLl9ub2RlLm5hbWUNCg0KICAgIGRlZiBnZXRfZGF0YShzZWxmKToNCiAgICAgICAgcmV0
dXJuIHNlbGYuX25vZGUudGFyZ2V0DQoNCiAgICBkZWYgc2V0X2RhdGEoc2VsZiwgZGF0YSk6DQog
ICAgICAgIHNlbGYuX25vZGUudGFyZ2V0ID0gZGF0YQ0KDQoNCmNsYXNzIERvY3VtZW50KE5vZGUp
Og0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlLCBwYXJlbnQgPSBOb25lLCBkb2N1bWVudCA9
IE5vbmUpOg0KICAgICAgICBOb2RlLl9faW5pdF9fKHNlbGYsIG5vZGUsIHBhcmVudCA9IE5vbmUs
IGRvY3VtZW50ID0gTm9uZSkNCiAgICAgICAgc2VsZi5kb2N1bWVudFR5cGUgPSBOb25lDQogICAg
ICAgICNzZWxmLmRvY3VtZW50RWxlbWVudCA9IE5vbmUNCiAgICAgICAgc2VsZi5ET01JbXBsZW1l
bnRhdGlvbiA9IF9faW1wb3J0X18oX19uYW1lX18pDQoNCiAgICBkZWYgdG94bWwoc2VsZik6DQog
ICAgICAgIHMgPSAnPD94bWwgdmVyc2lvbj0iMS4wIj8+XG4nDQogICAgICAgIHMgPSBzICsgIjwh
RE9DVFlQRSBYWFg+XG4iDQogICAgICAgIGlmIGxlbihzZWxmLl9ub2RlLmNoaWxkcmVuKToNCiAg
ICAgICAgICAgIG4gPSBzZWxmLl9ub2RlLmNoaWxkcmVuWzBdDQogICAgICAgICAgICBuID0gIE5P
REVfQ0xBU1NbIG4udHlwZSBdIChuLCBzZWxmLCBzZWxmLl9kb2N1bWVudCkNCiAgICAgICAgICAg
IHMgPSBzICsgbi50b3htbCgpDQogICAgICAgIHJldHVybiBzDQoNCiAgICBkZWYgY3JlYXRlRWxl
bWVudChzZWxmLCB0YWdOYW1lKToNCiAgICAgICAgZCA9IF9ub2RlRGF0YShFTEVNRU5UX05PREUp
DQogICAgICAgIGQubmFtZSA9IHRhZ05hbWUNCiAgICAgICAgZC52YWx1ZSA9IE5vbmUNCiAgICAg
ICAgZC5hdHRyaWJ1dGVzID0gTmFtZWROb2RlTWFwKCkNCiAgICAgICAgcmV0dXJuIEVsZW1lbnQo
ZCwgTm9uZSwgc2VsZikNCg0KICAgIGRlZiBjcmVhdGVEb2N1bWVudEZyYWdtZW50KHNlbGYpOg0K
ICAgICAgICBwYXNzICNYWFgNCg0KICAgIGRlZiBjcmVhdGVUZXh0Tm9kZShzZWxmLCBkYXRhKToN
CiAgICAgICAgZCA9IF9ub2RlRGF0YShURVhUX05PREUpDQogICAgICAgIGQubmFtZSA9ICIjdGV4
dCINCiAgICAgICAgZC52YWx1ZSA9IGRhdGENCiAgICAgICAgcmV0dXJuIFRleHQoZCwgTm9uZSwg
c2VsZikNCg0KICAgIGRlZiBjcmVhdGVDb21tZW50KHNlbGYsIGRhdGEpOg0KICAgICAgICBkID0g
X25vZGVEYXRhKENPTU1FTlRfTk9ERSkNCiAgICAgICAgZC5uYW1lID0gIiNjb21tZW50Ig0KICAg
ICAgICBkLnZhbHVlID0gZGF0YQ0KICAgICAgICByZXR1cm4gQ29tbWVudChkLCBOb25lLCBzZWxm
KQ0KDQogICAgZGVmIGNyZWF0ZUNEQVRBc2VjdGlvbihzZWxmLCBkYXRhKToNCiAgICAgICAgZCA9
IF9ub2RlRGF0YShDREFUQV9TRUNUSU9OX05PREUpDQogICAgICAgIGQubmFtZSA9ICIjY2RhdGEt
c2VjdGlvbiINCiAgICAgICAgZC52YWx1ZSA9IGRhdGENCiAgICAgICAgcmV0dXJuIENEQVRBU2Vj
dGlvbihkLCBOb25lLCBzZWxmKQ0KDQogICAgZGVmIGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlv
bihzZWxmLCB0YXJnZXQsIGRhdGEpOg0KICAgICAgICBkID0gX25vZGVEYXRhKFBST0NFU1NJTkdf
SU5TVFJVQ1RJT05fTk9ERSkNCiAgICAgICAgZC5uYW1lID0gdGFyZ2V0DQogICAgICAgIGQudmFs
dWUgPSBkYXRhDQogICAgICAgIHJldHVybiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oZCwgTm9uZSwg
c2VsZikNCiAgICAgICAgDQogICAgZGVmIGNyZWF0ZUF0dHJpYnV0ZShzZWxmLCBuYW1lKToNCiAg
ICAgICAgZCA9IF9ub2RlRGF0YShBVFRSSUJVVEVfTk9ERSkNCiAgICAgICAgZC5uYW1lID0gbmFt
ZQ0KICAgICAgICBkLnZhbHVlID0gIiINCiAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZShkLCBOb25l
LCBzZWxmKQ0KDQogICAgZGVmIGNyZWF0ZUVudGl0eVJlZmVyZW5jZShzZWxmLCBuYW1lKToNCiAg
ICAgICAgZCA9IF9ub2RlRGF0YShFTlRJVFlfUkVGRVJFTkNFX05PREUpDQogICAgICAgIGQubmFt
ZSA9IG5hbWUNCiAgICAgICAgZC52YWx1ZSA9IE5vbmUNCiAgICAgICAgcmV0dXJuIEVudGl0eVJl
ZmVyZW5jZShkLCBOb25lLCBzZWxmKQ0KDQogICAgZGVmIGdldEVsZW1lbnRzQnlUYWdOYW1lKHNl
bGYsIHRhZ25hbWUpOg0KICAgICAgICBkb2N1bWVudEVsZW1lbnQgPSBzZWxmLmdldF9kb2N1bWVu
dEVsZW1lbnQoKQ0KICAgICAgICBMID0gW10NCiAgICAgICAgaWYgZG9jdW1lbnRFbGVtZW50ID09
IE5vbmU6IHJldHVybiBMDQogICAgICAgIGlmIGRvY3VtZW50RWxlbWVudC5fbm9kZS5uYW1lID09
IHRhZ25hbWU6DQogICAgICAgICAgICBMLmFwcGVuZCggZG9jdW1lbnRFbGVtZW50ICkNCiAgICAg
ICAgcmV0dXJuIEwgKyBkb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnbmFt
ZSkNCg0KICAgICMgQXR0cmlidXRlcw0KICAgIGRlZiBnZXRfZG9jdHlwZShzZWxmKToNCiAgICAg
ICAgcmV0dXJuIHNlbGYuZG9jdW1lbnRUeXBlDQogICAgZGVmIGdldF9pbXBsZW1lbnRhdGlvbihz
ZWxmKToNCiAgICAgICAgcmV0dXJuIHNlbGYuRE9NSW1wbGVtZW50YXRpb24NCiAgICBkZWYgZ2V0
X2RvY3VtZW50RWxlbWVudChzZWxmKToNCiAgICAgICAgI3JldHVybiBzZWxmLmRvY3VtZW50RWxl
bWVudA0KICAgICAgICBpZiBsZW4oc2VsZi5fbm9kZS5jaGlsZHJlbikgPiAwOg0KICAgICAgICAJ
cmV0dXJuIEVsZW1lbnQoc2VsZi5fbm9kZS5jaGlsZHJlblswXSxzZWxmLHNlbGYpDQogICAgICAg
IHJldHVybiBOb25lDQoNCiAgICAjIE92ZXJyaWRlIHRoZSBOb2RlIG11dGF0aW9uIG1ldGhvZHMg
aW4gb3JkZXIgdG8gY2hlY2sgdGhhdA0KICAgICMgdGhlcmUncyBhdCBtb3N0IGEgc2luZ2xlIEVs
ZW1lbnQgY2hpbGQsIGFuZCB0byB1cGRhdGUNCiAgICAjIHNlbGYuZG9jdW1lbnRFbGVtZW50Lg0K
DQoNCiAgICAjIERvbid0IHVzZSB0aGlzIG9yIGEgY2lyY3VsYXIgcmVmZXJlbmNlIG9jY3VycyEN
CiAgICAjZGVmIF9zZXREb2N1bWVudEVsZW1lbnQoc2VsZik6DQogICAgIyAgICBlbGVtZW50ID0g
Tm9uZQ0KICAgICMgICAgZm9yIGVsZW0gaW4gc2VsZi5fbm9kZS5jaGlsZHJlbjoNCiAgICAjICAg
ICAgICBpZiBlbGVtLnR5cGUgPT0gRUxFTUVOVF9OT0RFOg0KICAgICMgICAgICAgICAgICBpZiBl
bGVtZW50IGlzIE5vbmU6DQogICAgIyAgICAgICAgICAgICAgICBlbGVtZW50ID0gRWxlbWVudChl
bGVtLCBzZWxmLCBzZWxmKQ0KICAgICMgICAgICAgICAgICBlbHNlOg0KICAgICMgICAgICAgICAg
ICAgICAgcmFpc2UgSGllcmFyY2h5UmVxdWVzdEV4Y2VwdGlvbiwgIlRvbyBtYW55IEVsZW1lbnQg
Y2hpbGRyZW4gb2YgRG9jdW1lbnQiDQogICAgIyAgICBzZWxmLmRvY3VtZW50RWxlbWVudCA9IGVs
ZW1lbnQNCg0KICAgIGRlZiBpbnNlcnRCZWZvcmUoc2VsZiwgbmV3Q2hpbGQsIHJlZkNoaWxkKToN
CiAgICAgICAgIyBUaGVyZSBjYW4gb25seSBiZSBvbmUgY2hpbGQgb2YgRG9jdW1lbnQgc28gcmVm
Q2hpbGQgc2hvdWxkIGJlIE5vbmUNCiAgICAgICAgIyBhbmQgdGhlcmUgc2hvdWxkIG5vdCBiZSBh
biBleGlzdGluZyBjaGlsZCBvciBhdCB3b3JzdCBpdCBzaG91bGQgYmUNCiAgICAgICAgIyB0aGUg
c2FtZSBjaGlsZC4NCiAgICAgICAgaWYgcmVmQ2hpbGQgIT0gTm9uZSBvciBsZW4oc2VsZi5fbm9k
ZS5jaGlsZHJlbikgIT0gMCBhbmQgc2VsZi5fbm9kZS5jaGlsZHJlblswXSAhPSBuZXdDaGlsZC5f
bm9kZToNCiAgICAgICAgICAgIHJhaXNlIEhpZXJhcmNoeVJlcXVlc3RFeGNlcHRpb24sIFwNCiAg
ICAgICAgICAgICAgICAiQ2FuJ3QgYWRkICVzOyB0b28gbWFueSBFbGVtZW50IGNoaWxkcmVuIG9m
IERvY3VtZW50IiAlIChyZXByKG5ld0NoaWxkKSwpDQogICAgICAgIAkNCiAgICAgICAgcmV0dmFs
ID0gTm9kZS5pbnNlcnRCZWZvcmUoc2VsZiwgbmV3Q2hpbGQsIHJlZkNoaWxkKQ0KICAgICAgICAj
c2VsZi5fc2V0RG9jdW1lbnRFbGVtZW50KCkNCiAgICAgICAgcmV0dXJuIHJldHZhbA0KDQogICAg
ZGVmIHJlcGxhY2VDaGlsZChzZWxmLCBuZXdDaGlsZCwgb2xkQ2hpbGQpOg0KICAgICAgICByZXR2
YWwgPSBOb2RlLnJlcGxhY2VDaGlsZChzZWxmLCBuZXdDaGlsZCwgb2xkQ2hpbGQpDQogICAgICAg
ICNzZWxmLl9zZXREb2N1bWVudEVsZW1lbnQoKQ0KICAgICAgICByZXR1cm4gcmV0dmFsDQoNCiAg
ICBkZWYgcmVtb3ZlQ2hpbGQoc2VsZiwgb2xkQ2hpbGQpOg0KICAgICAgICByZXR2YWwgPSBOb2Rl
LnJlbW92ZUNoaWxkKHNlbGYsIG9sZENoaWxkKQ0KICAgICAgICAjc2VsZi5fc2V0RG9jdW1lbnRF
bGVtZW50KCkNCiAgICAgICAgcmV0dXJuIHJldHZhbA0KDQogICAgZGVmIGFwcGVuZENoaWxkKHNl
bGYsIG5ld0NoaWxkKToNCiAgICAgICAgcmV0dmFsID0gc2VsZi5pbnNlcnRCZWZvcmUobmV3Q2hp
bGQsTm9uZSkNCiAgICAgICAgcmV0dXJuIHJldHZhbA0KICAgIA0KY2xhc3MgRG9jdW1lbnRGcmFn
bWVudChOb2RlKToNCiAgICBwYXNzDQoNCiMgRGljdGlvbmFyeSBtYXBwaW5nIHR5cGVzIHRvIHRo
ZSBjb3JyZXNwb25kaW5nIGNsYXNzIG9iamVjdA0KDQpOT0RFX0NMQVNTID0gew0KRUxFTUVOVF9O
T0RFICAgICAgICAgICAgICAgIDogRWxlbWVudCwNCkFUVFJJQlVURV9OT0RFICAgICAgICAgICAg
ICA6IEF0dHIsIA0KVEVYVF9OT0RFICAgICAgICAgICAgICAgICAgIDogVGV4dCwgDQpDREFUQV9T
RUNUSU9OX05PREUgICAgICAgICAgOiBDREFUQVNlY3Rpb24sDQpFTlRJVFlfUkVGRVJFTkNFX05P
REUgICAgICAgOiBFbnRpdHlSZWZlcmVuY2UsDQpFTlRJVFlfTk9ERSAgICAgICAgICAgICAgICAg
OiBFbnRpdHksIA0KUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogUHJvY2Vzc2luZ0luc3Ry
dWN0aW9uLCANCkNPTU1FTlRfTk9ERSAgICAgICAgICAgICAgICA6IENvbW1lbnQsDQpET0NVTUVO
VF9OT0RFICAgICAgICAgICAgICAgOiBEb2N1bWVudCwNCkRPQ1VNRU5UX1RZUEVfTk9ERSAgICAg
ICAgICA6IERvY3VtZW50VHlwZSwNCkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICA6IERvY3Vt
ZW50RnJhZ21lbnQsDQpOT1RBVElPTl9OT0RFICAgICAgICAgICAgICAgOiBOb3RhdGlvbg0KfQ0K
DQojIFNldCB0aGUgY2hpbGRDbGFzc2VzIGF0dHJpYnV0ZXM7IHdlIG5lZWQgdG8gZG8gdGhpcyBh
dCB0aGUgZW5kIG9uY2UNCiMgYWxsIHRoZSBjbGFzc2VzIGhhdmUgYmVlbiBkZWZpbmVkLg0KDQpE
b2N1bWVudC5jaGlsZENsYXNzZXMgPSBbRWxlbWVudCwgUHJvY2Vzc2luZ0luc3RydWN0aW9uLCBD
b21tZW50LCBEb2N1bWVudFR5cGVdDQpEb2N1bWVudEZyYWdtZW50LmNoaWxkQ2xhc3NlcyA9IFtF
bGVtZW50LCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24sIENvbW1lbnQsDQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBUZXh0LCBDREFUQVNlY3Rpb24sIEVudGl0eVJlZmVyZW5jZV0NCkRv
Y3VtZW50VHlwZS5jaGlsZENsYXNzZXMgPSBbXQ0KRW50aXR5UmVmZXJlbmNlLmNoaWxkQ2xhc3Nl
cyA9IFtFbGVtZW50LCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24sIENvbW1lbnQsDQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFRleHQsIENEQVRBU2VjdGlvbiwgRW50aXR5UmVmZXJlbmNl
XQ0KRWxlbWVudC5jaGlsZENsYXNzZXMgPSBbRWxlbWVudCwgUHJvY2Vzc2luZ0luc3RydWN0aW9u
LCBDb21tZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCwgQ0RBVEFTZWN0aW9uLCBF
bnRpdHlSZWZlcmVuY2VdDQpBdHRyLmNoaWxkQ2xhc3NlcyA9IFtUZXh0LCBFbnRpdHlSZWZlcmVu
Y2VdDQpQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uY2hpbGRDbGFzc2VzID0gW10NCkNvbW1lbnQuY2hp
bGRDbGFzc2VzID0gW10NClRleHQuY2hpbGRDbGFzc2VzID0gW10NCkNEQVRBU2VjdGlvbi5jaGls
ZENsYXNzZXMgPSBbXQ0KRW50aXR5LmNoaWxkQ2xhc3NlcyA9IFtFbGVtZW50LCBQcm9jZXNzaW5n
SW5zdHJ1Y3Rpb24sIENvbW1lbnQsDQogICAgICAgICAgICAgICAgICAgICAgIFRleHQsIENEQVRB
U2VjdGlvbiwgRW50aXR5UmVmZXJlbmNlXQ0KTm90YXRpb24uY2hpbGRDbGFzc2VzID0gW10NCg0K
IyB2aW06dHM9MjphaQ0K

--0__=A2kFZT3qDsXrOyFApQpGBoEJxCoVbsRUYNc21gz18D7Arav2w7NYsuZs
Content-type: application/octet-stream; 
	name="test.py"
Content-Disposition: attachment; filename="test.py"
Content-transfer-encoding: base64

IiIiVGhpcyB0ZXN0cyB0aGUgbmV3IFhNTCBET00gcGFja2FnZSBmb3IgY2lyY3VsYXIgcmVmZXJl
bmNlIG1lbW9yeSBsZWFrcy4NClRvIHVzZSBpdCwgY29kZSBtdXN0IGJlIGFkZGVkIHRvIGNvcmUu
Tm9kZSBhbmQgY29yZS5fbm9kZURhdGEgdG8gaW5jcmVtZW50DQpOb2RlX2NvdW50ZXIgaW4gX19p
bml0X18gYW5kIGRlY3JlbWVudCBpdCBpbiBfX2RlbF9fLiIiIg0KDQpmcm9tIHhtbC5kb20gaW1w
b3J0IGNvcmV0ZXN0DQpjb3JlID0gY29yZXRlc3QNCg0KZGVmIGNoZWNrTWVtKG1zZyk6DQoJaWYg
Y29yZS5Ob2RlLk5vZGVfY291bnRlciBvciBjb3JlLl9ub2RlRGF0YS5Ob2RlX2NvdW50ZXI6DQoJ
CWlmIG1zZzogcHJpbnQgJyMjIyMjIyMjIyMjIyMjIyMjIycsbXNnLCcjIyMjIyMjIyMjIyMjIyMj
IyMnDQoJCXByaW50ICJFcnJvcjogJWQgTm9kZXMgYW5kICVkIF9ub2RlRGF0YXMgd2VyZSBub3Qg
ZGVsZXRlZCIgJSBcDQoJCQkoY29yZS5Ob2RlLk5vZGVfY291bnRlcixjb3JlLl9ub2RlRGF0YS5O
b2RlX2NvdW50ZXIpDQoNCmRlZiB0ZXN0MSgpOg0KCXByaW50ICc9PT09PT09PT09PT09PT09PT0g
dGVzdDEgPT09PT09PT09PT09PT09PT09Jw0KCWRvYyA9IGNvcmUuY3JlYXRlRG9jdW1lbnQoKQ0K
CWRvYyA9IE5vbmUNCgljaGVja01lbSgndGVzdDEgZmFpbGVkJykNCg0KCQ0KZGVmIHRlc3QyKCk6
DQoJcHJpbnQgJz09PT09PT09PT09PT09PT09PSB0ZXN0MiA9PT09PT09PT09PT09PT09PT0nDQoJ
ZG9jID0gY29yZS5jcmVhdGVEb2N1bWVudCgpDQoJaHRtbCA9IGRvYy5jcmVhdGVFbGVtZW50KCdo
dG1sJykNCiMJYm9keSA9IGRvYy5jcmVhdGVFbGVtZW50KCdib2R5JykNCiMJaHRtbC5pbnNlcnRC
ZWZvcmUoYm9keSxOb25lKQ0KIwlodG1sLmluc2VydEJlZm9yZShib2R5LE5vbmUpDQoJZG9jID0g
Tm9uZQ0KIwlib2R5ID0gTm9uZQ0KCWh0bWwgPSBOb25lDQoJY2hlY2tNZW0oJ3Rlc3QyIGZhaWxl
ZCcpDQoJDQpkZWYgdGVzdDMoKToNCglwcmludCAnPT09PT09PT09PT09PT09PT09IHRlc3QzID09
PT09PT09PT09PT09PT09PScNCglkb2MgPSBjb3JlLmNyZWF0ZURvY3VtZW50KCkNCglodG1sID0g
ZG9jLmNyZWF0ZUVsZW1lbnQoJ2h0bWwnKQ0KIwlkb2MuZG9jdW1lbnRFbGVtZW50ID0gaHRtbAkJ
IyB0aGlzIGRvZXMgbm90IGR1cGxpY2F0ZSBodG1sIGVsZW1lbnQNCiMJZG9jLmRvY3VtZW50RWxl
bWVudCA9IE5vbmUNCglkb2MgPSBOb25lDQoJaHRtbCA9IE5vbmUNCgljaGVja01lbSgndGVzdDMg
ZmFpbGVkJykNCg0KZGVmIHRlc3Q0KCk6DQoJcHJpbnQgJz09PT09PT09PT09PT09PT09PSB0ZXN0
NCA9PT09PT09PT09PT09PT09PT0nDQoJZG9jID0gY29yZS5jcmVhdGVEb2N1bWVudCgpDQoJaHRt
bCA9IGRvYy5jcmVhdGVFbGVtZW50KCdodG1sJykNCglodG1sLmluc2VydEJlZm9yZShkb2MuY3Jl
YXRlRWxlbWVudCgnYm9keScpLE5vbmUpDQoJZG9jLmFwcGVuZENoaWxkKGh0bWwpDQoJZG9jLmlu
c2VydEJlZm9yZShodG1sLE5vbmUpDQoJI2RvYy5kb2N1bWVudEVsZW1lbnQgPSBOb25lDQoJZG9j
ID0gTm9uZQ0KCWh0bWwgPSBOb25lDQoJY2hlY2tNZW0oJ3Rlc3Q0IGZhaWxlZCcpDQoNCmlmIF9f
bmFtZV9fID09ICdfX21haW5fXyc6DQoJdGVzdDEoKQ0KCXRlc3QyKCkNCgl0ZXN0MygpDQoJdGVz
dDQoKQ==

--0__=A2kFZT3qDsXrOyFApQpGBoEJxCoVbsRUYNc21gz18D7Arav2w7NYsuZs--