{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"},"kaggle":{"accelerator":"none","dataSources":[{"sourceType":"datasetVersion","sourceId":9334569,"datasetId":5591959,"databundleVersionId":9531154}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import base64\nexec(base64.b64decode(b'aW1wb3J0IG9zCmltcG9ydCBnYwppbXBvcnQgY3YyCmltcG9ydCB0aW1lCmltcG9ydCBudW1weSBhcyBucAppbXBvcnQgcGFuZGFzIGFzIHBkCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2gubm4gYXMgbm4KZnJvbSB0b3JjaC51dGlscy5kYXRhIGltcG9ydCBEYXRhc2V0LCBEYXRhTG9hZGVyCmZyb20gdHFkbSBpbXBvcnQgdHFkbQppbXBvcnQgdGltbQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFZFU1VWSVVTIENIQUxMRU5HRSAtIElORkVSRU5DRSBNQVhJTUlaQVRJT04gRU5TRU1CTEUKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKY2xhc3MgQ0ZHOgogICAgY29tcF9kYXRhc2V0X3BhdGggPSAnL2thZ2dsZS9pbnB1dC92ZXN1dml1cy1jaGFsbGVuZ2UtaW5rLWRldGVjdGlvbicKICAgIHdlaWdodHNfZGlyID0gJy9rYWdnbGUvaW5wdXQvdmVzdXZpdXMtbW9kZWxzJyAjIE5vdGU6IFdlIHdpbGwgYXR0YWNoIHB1YmxpYyBpbmZlcmVuY2UgbW9kZWxzIGhlcmUKICAgIGRldmljZSA9IHRvcmNoLmRldmljZSgnY3VkYScgaWYgdG9yY2guY3VkYS5pc19hdmFpbGFibGUoKSBlbHNlICdjcHUnKQogICAgCiAgICAjIDNEIENTTiArIFRyYW5zVU5ldCBQdWJsaWMgQ29uZmlndXJhdGlvbnMKICAgIGluX2NoYW5uZWxzID0gNyAKICAgIHRpbGVfc2l6ZSA9IDI1NgogICAgc3RyaWRlID0gMTI4CiAgICBiYXRjaF9zaXplID0gOAogICAgbnVtX3dvcmtlcnMgPSAyCiAgICB0aHJlc2hvbGQgPSAwLjUKCiMgLS0tIEFSQ0hJVEVDVFVSRVMgRk9SIFBVQkxJQyBXRUlHSFRTIC0tLQpjbGFzcyBSZXNpZHVhbENvbnYzRChubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGluX2NoYW5uZWxzLCBtaWRfY2hhbm5lbHMsIG91dF9jaGFubmVscywgc3RyaWRlPTEpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuY29udjEgPSBubi5Db252M2QoaW5fY2hhbm5lbHMsIG1pZF9jaGFubmVscywga2VybmVsX3NpemU9MSwgYmlhcz1GYWxzZSkKICAgICAgICBzZWxmLmJuMSA9IG5uLkJhdGNoTm9ybTNkKG1pZF9jaGFubmVscykKICAgICAgICBzZWxmLmFjdDEgPSBubi5SZUxVKGlucGxhY2U9VHJ1ZSkKICAgICAgICBzZWxmLmNvbnYyID0gbm4uU2VxdWVudGlhbCgKICAgICAgICAgICAgbm4uQ29udjNkKG1pZF9jaGFubmVscywgbWlkX2NoYW5uZWxzLCBrZXJuZWxfc2l6ZT0xLCBiaWFzPUZhbHNlKSwKICAgICAgICAgICAgbm4uQ29udjNkKG1pZF9jaGFubmVscywgbWlkX2NoYW5uZWxzLCBrZXJuZWxfc2l6ZT0zLCBzdHJpZGU9KDEsIHN0cmlkZSwgc3RyaWRlKSwgcGFkZGluZz0xLCBiaWFzPUZhbHNlLCBncm91cHM9bWlkX2NoYW5uZWxzKQogICAgICAgICkKICAgICAgICBzZWxmLmJuMiA9IG5uLkJhdGNoTm9ybTNkKG1pZF9jaGFubmVscykKICAgICAgICBzZWxmLmFjdDIgPSBubi5SZUxVKGlucGxhY2U9VHJ1ZSkKICAgICAgICBzZWxmLmNvbnYzID0gbm4uQ29udjNkKG1pZF9jaGFubmVscywgb3V0X2NoYW5uZWxzLCBrZXJuZWxfc2l6ZT0xLCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuYm4zID0gbm4uQmF0Y2hOb3JtM2Qob3V0X2NoYW5uZWxzKQogICAgICAgIHNlbGYuYWN0MyA9IG5uLlJlTFUoaW5wbGFjZT1UcnVlKQogICAgICAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeCk6CiAgICAgICAgc2hvcnRjdXQgPSB4CiAgICAgICAgeCA9IHNlbGYuYWN0MShzZWxmLmJuMShzZWxmLmNvbnYxKHgpKSkKICAgICAgICB4ID0gc2VsZi5hY3QyKHNlbGYuYm4yKHNlbGYuY29udjIoeCkpKQogICAgICAgIHggPSBzZWxmLmJuMyhzZWxmLmNvbnYzKHgpKQogICAgICAgIHJldHVybiBzZWxmLmFjdDMoeCArIHNob3J0Y3V0KQoKY2xhc3MgSW5rRGV0X1Jlc05ldDNEKG5uLk1vZHVsZSk6CiAgICAiIiIgTWF0Y2hlcyBjb21tb24gcHVibGljIDNEIENTTiBrZXJuZWxzICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZGVsX25hbWU9InJlc25ldDM0IiwgaW5fY2hhbnM9Q0ZHLmluX2NoYW5uZWxzLCBudW1fM2RfbGF5ZXI9Myk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5lbmNvZGVyID0gdGltbS5jcmVhdGVfbW9kZWwobW9kZWxfbmFtZSwgcHJldHJhaW5lZD1GYWxzZSwgaW5fY2hhbnM9aW5fY2hhbnMsIGZlYXR1cmVzX29ubHk9VHJ1ZSkKICAgICAgICBudW1fZmVhdHVyZXMgPSBzZWxmLmVuY29kZXIuZmVhdHVyZV9pbmZvLmNoYW5uZWxzKClbLTFdCiAgICAgICAgc2VsZi5jb252X3Byb2ogPSBubi5TZXF1ZW50aWFsKG5uLkNvbnYyZChudW1fZmVhdHVyZXMsIDUxMiwgMSksIG5uLkJhdGNoTm9ybTJkKDUxMiksIG5uLlJlTFUoKSkKICAgICAgICBzZWxmLmNvbnYzZCA9IG5uLlNlcXVlbnRpYWwoKltSZXNpZHVhbENvbnYzRCg1MTIsIDUxMiwgNTEyKSBmb3IgXyBpbiByYW5nZShudW1fM2RfbGF5ZXIpXSkKICAgICAgICBzZWxmLmhlYWQgPSBubi5TZXF1ZW50aWFsKAogICAgICAgICAgICBubi5Db252MmQoNTEyICogMiwgNTEyLCAxKSwgbm4uUmVMVShpbnBsYWNlPVRydWUpLAogICAgICAgICAgICBubi5CYXRjaE5vcm0yZCg1MTIpLCBubi5Db252MmQoNTEyLCAxLCAxKSwgbm4uU2lnbW9pZCgpCiAgICAgICAgKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHgpOgogICAgICAgIGJzLCBjaCwgaCwgdyA9IHguc2hhcGUKICAgICAgICBncm91cHNfM2QgPSBjaCAvLyA3IAogICAgICAgIHggPSB4LnJlc2hhcGUoYnMgKiBncm91cHNfM2QsIDcsIGgsIHcpCiAgICAgICAgaW1nX2ZlYXQgPSBzZWxmLmVuY29kZXIoeClbLTFdCiAgICAgICAgaW1nX2ZlYXQgPSBzZWxmLmNvbnZfcHJvaihpbWdfZmVhdCkKICAgICAgICBfLCBmX2NoLCBmX2gsIGZfdyA9IGltZ19mZWF0LnNoYXBlCiAgICAgICAgaW1nX2ZlYXQgPSBpbWdfZmVhdC5yZXNoYXBlKGJzLCBncm91cHNfM2QsIGZfY2gsIGZfaCwgZl93KS50cmFuc3Bvc2UoMSwgMikKICAgICAgICBpbWdfZmVhdCA9IHNlbGYuY29udjNkKGltZ19mZWF0KQogICAgICAgIGltZ19mZWF0ID0gdG9yY2guY2F0KFtpbWdfZmVhdC5tZWFuKDIpLCBpbWdfZmVhdC5tYXgoMilbMF1dLCAxKQogICAgICAgIHJldHVybiBzZWxmLmhlYWQoaW1nX2ZlYXQpCgojIC0tLSBVVElMUzogVFRBICYgRU5DT0RJTkcgLS0tCmRlZiBybGUoaW1nLCB0aHJlc2hvbGQpOgogICAgZmxhdF9pbWcgPSBpbWcuZmxhdHRlbigpCiAgICBmbGF0X2ltZyA9IG5wLndoZXJlKGZsYXRfaW1nID4gdGhyZXNob2xkLCAxLCAwKS5hc3R5cGUobnAudWludDgpCiAgICBzdGFydHMgPSBucC5hcnJheSgoZmxhdF9pbWdbOi0xXSA9PSAwKSAmIChmbGF0X2ltZ1sxOl0gPT0gMSkpCiAgICBlbmRzID0gbnAuYXJyYXkoKGZsYXRfaW1nWzotMV0gPT0gMSkgJiAoZmxhdF9pbWdbMTpdID09IDApKQogICAgc3RhcnRzX2l4ID0gbnAud2hlcmUoc3RhcnRzKVswXSArIDIKICAgIGVuZHNfaXggPSBucC53aGVyZShlbmRzKVswXSArIDIKICAgIGxlbmd0aHMgPSBlbmRzX2l4IC0gc3RhcnRzX2l4CiAgICByZXR1cm4gIiAiLmpvaW4obWFwKHN0ciwgc3VtKHppcChzdGFydHNfaXgsIGxlbmd0aHMpLCAoKSkpKQoKZGVmIGFwcGx5X3R0YShpbWFnZSk6CiAgICAiIiIgRDQgRGloZWRyYWwgR3JvdXAgVGVzdC1UaW1lIEF1Z21lbnRhdGlvbiAiIiIKICAgIHR0YV9pbWFnZXMgPSBbXQogICAgZm9yIGsgaW4gcmFuZ2UoNCk6ICMgNCByb3RhdGlvbnMKICAgICAgICByb3RhdGVkID0gdG9yY2gucm90OTAoaW1hZ2UsIGssIGRpbXM9WzIsIDNdKQogICAgICAgIHR0YV9pbWFnZXMuYXBwZW5kKHJvdGF0ZWQpCiAgICAgICAgdHRhX2ltYWdlcy5hcHBlbmQodG9yY2guZmxpcChyb3RhdGVkLCBkaW1zPVszXSkpICMgYW5kIGZsaXBwZWQKICAgIHJldHVybiB0dGFfaW1hZ2VzCgpkZWYgcmV2ZXJzZV90dGEocHJlZHMpOgogICAgIiIiIFJldmVyc2UgdGhlIEQ0IG9wZXJhdGlvbnMgdG8gYXZlcmFnZSB0aGVtICIiIgogICAgZmluYWxfcHJlZCA9IHRvcmNoLnplcm9zX2xpa2UocHJlZHNbMF0pCiAgICBmb3IgaSBpbiByYW5nZSg4KToKICAgICAgICBwcmVkID0gcHJlZHNbaV0KICAgICAgICBpc19mbGlwcGVkID0gKGkgJSAyID09IDEpCiAgICAgICAgcm90YXRpb25zID0gaSAvLyAyCiAgICAgICAgCiAgICAgICAgaWYgaXNfZmxpcHBlZDoKICAgICAgICAgICAgcHJlZCA9IHRvcmNoLmZsaXAocHJlZCwgZGltcz1bM10pCiAgICAgICAgaWYgcm90YXRpb25zID4gMDoKICAgICAgICAgICAgcHJlZCA9IHRvcmNoLnJvdDkwKHByZWQsIC1yb3RhdGlvbnMsIGRpbXM9WzIsIDNdKQogICAgICAgICAgICAKICAgICAgICBmaW5hbF9wcmVkICs9IHByZWQKICAgIHJldHVybiBmaW5hbF9wcmVkIC8gOC4wCgojIC0tLSBEQVRBU0VUICYgSU5GRVJFTkNFIEVOR0lORSAtLS0KY2xhc3MgVmVzdXZpdXNUZXN0RGF0YXNldChEYXRhc2V0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbWFnZXMsIHBvc2l0aW9ucyk6CiAgICAgICAgc2VsZi5pbWFnZXMgPSBpbWFnZXMKICAgICAgICBzZWxmLnBvc2l0aW9ucyA9IHBvc2l0aW9ucwoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5wb3NpdGlvbnMpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGlkeCk6CiAgICAgICAgeSwgeCA9IHNlbGYucG9zaXRpb25zW2lkeF0KICAgICAgICBpbWFnZV9jaHVuayA9IHNlbGYuaW1hZ2VzW3k6eStDRkcudGlsZV9zaXplLCB4OngrQ0ZHLnRpbGVfc2l6ZSwgOl0KICAgICAgICBpbWFnZV9jaHVuayA9IG5wLnRyYW5zcG9zZShpbWFnZV9jaHVuaywgKDIsIDAsIDEpKSAvIDI1NS4wCiAgICAgICAgcmV0dXJuIHRvcmNoLnRlbnNvcihpbWFnZV9jaHVuaywgZHR5cGU9dG9yY2guZmxvYXQzMiksICh5LCB4KQoKZGVmIHJ1bl9lbnNlbWJsZV9pbmZlcmVuY2UoKToKICAgIHByaW50KCJWZXN1dml1cyBJbmZlcmVuY2UgTWF4aW1pemF0aW9uIFBpcGVsaW5lIEluaXRpYWxpemVkLiIpCiAgICAKICAgICMgMS4gSW5pdGlhbGl6ZSBFbnNlbWJsZWQgTW9kZWxzIChHcmFjZWZ1bCBmYWlsdXJlIGZvciBkcnkgcnVucykKICAgIG1vZGVscyA9IFtdCiAgICAKICAgICMgRXhhbXBsZTogSWYgd2UgYXR0YWNoIGEgZGF0YXNldCB3aXRoICdyZXNuZXQzZF9mb2xkMC5wdGgnCiAgICBmb3IgZm9sZCBpbiByYW5nZSgyKToKICAgICAgICB3ZWlnaHRfcGF0aCA9IG9zLnBhdGguam9pbihDRkcud2VpZ2h0c19kaXIsIGYncmVzbmV0M2RfZm9sZHtmb2xkfS5wdGgnKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHdlaWdodF9wYXRoKToKICAgICAgICAgICAgcHJpbnQoZiJMb2FkaW5nIHdlaWdodHM6IHt3ZWlnaHRfcGF0aH0iKQogICAgICAgICAgICBtb2RlbCA9IElua0RldF9SZXNOZXQzRCgpLnRvKENGRy5kZXZpY2UpCiAgICAgICAgICAgIG1vZGVsLmxvYWRfc3RhdGVfZGljdCh0b3JjaC5sb2FkKHdlaWdodF9wYXRoLCBtYXBfbG9jYXRpb249Q0ZHLmRldmljZSkpCiAgICAgICAgICAgIG1vZGVsLmV2YWwoKQogICAgICAgICAgICBtb2RlbHMuYXBwZW5kKG1vZGVsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByaW50KGYiV2FybmluZzogUHVibGljIHdlaWdodHMgbm90IGZvdW5kIGF0IHt3ZWlnaHRfcGF0aH0uIFVzaW5nIHVudHJhaW50ZWQgbW9kZWwgZm9yIG1vY2sgcnVuLiIpCiAgICAgICAgICAgIG1vZGVsID0gSW5rRGV0X1Jlc05ldDNEKCkudG8oQ0ZHLmRldmljZSkKICAgICAgICAgICAgbW9kZWwuZXZhbCgpCiAgICAgICAgICAgIG1vZGVscy5hcHBlbmQobW9kZWwpCiAgICAgICAgICAgIGJyZWFrICMgT25seSBtb2NrIG9uZSBtb2RlbCBpZiB0ZXN0aW5nIGxvY2FsbHkKICAgICAgICAgICAgCiAgICAjIDIuIFByb2Nlc3MgVGVzdHMgRnJhZ21lbnRzCiAgICB0ZXN0X2RpciA9IG9zLnBhdGguam9pbihDRkcuY29tcF9kYXRhc2V0X3BhdGgsICd0ZXN0JykKICAgIHRlc3RfZnJhZ21lbnRzID0gb3MubGlzdGRpcih0ZXN0X2RpcikKICAgIHJlc3VsdHNfcmxlID0gW10KICAgIAogICAgZm9yIGZyYWdtZW50X2lkIGluIHRlc3RfZnJhZ21lbnRzOgogICAgICAgIHByaW50KGYiXFxuUHJvY2Vzc2luZyBGcmFnbWVudDoge2ZyYWdtZW50X2lkfSIpCiAgICAgICAgCiAgICAgICAgIyBSZWFkIFZvbHVtZSAoWiAxNS0yMSBhcyBnZW5lcmljIGJhbmQpCiAgICAgICAgaW1hZ2VzID0gW10KICAgICAgICBmb3IgaSBpbiByYW5nZSgxNSwgMjIpOgogICAgICAgICAgICBpbWFnZSA9IGN2Mi5pbXJlYWQob3MucGF0aC5qb2luKHRlc3RfZGlyLCBmIntmcmFnbWVudF9pZH0vc3VyZmFjZV92b2x1bWUve2k6MDJ9LnRpZiIpLCAwKQogICAgICAgICAgICBpbWFnZXMuYXBwZW5kKGltYWdlKQogICAgICAgIGltYWdlcyA9IG5wLnN0YWNrKGltYWdlcywgYXhpcz0yKQogICAgICAgIAogICAgICAgIGgsIHcgPSBpbWFnZXMuc2hhcGVbOjJdCiAgICAgICAgCiAgICAgICAgIyBHZW5lcmF0ZSBwYWRkZWQgc2hhcGVzCiAgICAgICAgcGFkX2ggPSAoQ0ZHLnRpbGVfc2l6ZSAtIGggJSBDRkcudGlsZV9zaXplKSAlIENGRy50aWxlX3NpemUKICAgICAgICBwYWRfdyA9IChDRkcudGlsZV9zaXplIC0gdyAlIENGRy50aWxlX3NpemUpICUgQ0ZHLnRpbGVfc2l6ZQogICAgICAgIGltYWdlcyA9IG5wLnBhZChpbWFnZXMsICgoMCwgcGFkX2gpLCAoMCwgcGFkX3cpLCAoMCwwKSksIG1vZGU9J2NvbnN0YW50JykKICAgICAgICBwYWRkZWRfaCwgcGFkZGVkX3cgPSBpbWFnZXMuc2hhcGVbOjJdCgogICAgICAgIHBvc2l0aW9ucyA9IFtdCiAgICAgICAgZm9yIHkgaW4gcmFuZ2UoMCwgcGFkZGVkX2ggLSBDRkcudGlsZV9zaXplICsgMSwgQ0ZHLnN0cmlkZSk6CiAgICAgICAgICAgIGZvciB4IGluIHJhbmdlKDAsIHBhZGRlZF93IC0gQ0ZHLnRpbGVfc2l6ZSArIDEsIENGRy5zdHJpZGUpOgogICAgICAgICAgICAgICAgcG9zaXRpb25zLmFwcGVuZCgoeSwgeCkpCgogICAgICAgIHRlc3RfZGF0YXNldCA9IFZlc3V2aXVzVGVzdERhdGFzZXQoaW1hZ2VzLCBwb3NpdGlvbnMpCiAgICAgICAgdGVzdF9sb2FkZXIgPSBEYXRhTG9hZGVyKHRlc3RfZGF0YXNldCwgYmF0Y2hfc2l6ZT1DRkcuYmF0Y2hfc2l6ZSwgc2h1ZmZsZT1GYWxzZSwgbnVtX3dvcmtlcnM9Q0ZHLm51bV93b3JrZXJzKQogICAgICAgIAogICAgICAgICMgQWNjdW11bGF0b3JzCiAgICAgICAgcHJlZGljdGlvbl92b2x1bWUgPSB0b3JjaC56ZXJvcygocGFkZGVkX2gsIHBhZGRlZF93KSwgZHR5cGU9dG9yY2guZmxvYXQzMiwgZGV2aWNlPUNGRy5kZXZpY2UpCiAgICAgICAgY291bnRfdm9sdW1lID0gdG9yY2guemVyb3MoKHBhZGRlZF9oLCBwYWRkZWRfdyksIGR0eXBlPXRvcmNoLmZsb2F0MzIsIGRldmljZT1DRkcuZGV2aWNlKQogICAgICAgIAogICAgICAgIHByaW50KGYiRnJhZ21lbnQge2ZyYWdtZW50X2lkfSBCYXRjaGVzOiB7bGVuKHRlc3RfbG9hZGVyKX0iKQogICAgICAgIHdpdGggdG9yY2gubm9fZ3JhZCgpOgogICAgICAgICAgICBmb3IgeF9iYXRjaCwgY29vcmRzIGluIHRxZG0odGVzdF9sb2FkZXIpOgogICAgICAgICAgICAgICAgeF9iYXRjaCA9IHhfYmF0Y2gudG8oQ0ZHLmRldmljZSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIyBGdWxsIDh4IFRUQQogICAgICAgICAgICAgICAgdHRhX2JhdGNoZXMgPSBhcHBseV90dGEoeF9iYXRjaCkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIyBFbnNlbWJsZSBMb29wCiAgICAgICAgICAgICAgICBlbnNlbWJsZV9wcmVkcyA9IHRvcmNoLnplcm9zKCh4X2JhdGNoLnNpemUoMCksIDEsIENGRy50aWxlX3NpemUsIENGRy50aWxlX3NpemUpLCBkZXZpY2U9Q0ZHLmRldmljZSkKICAgICAgICAgICAgICAgIGZvciBtb2RlbCBpbiBtb2RlbHM6CiAgICAgICAgICAgICAgICAgICAgbW9kZWxfdHRhX3ByZWRzID0gW10KICAgICAgICAgICAgICAgICAgICBmb3IgdHRhX2lucHV0IGluIHR0YV9iYXRjaGVzOgogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF90dGFfcHJlZHMuYXBwZW5kKG1vZGVsKHR0YV9pbnB1dCkpCiAgICAgICAgICAgICAgICAgICAgZW5zZW1ibGVfcHJlZHMgKz0gcmV2ZXJzZV90dGEobW9kZWxfdHRhX3ByZWRzKQogICAgICAgICAgICAgICAgZW5zZW1ibGVfcHJlZHMgLz0gbGVuKG1vZGVscykgIyBBdmVyYWdlIHRoZSBlbnNlbWJsZQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAjIFJlYXNzZW1ibGUgVm9sdW1lCiAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSh4X2JhdGNoLnNpemUoMCkpOgogICAgICAgICAgICAgICAgICAgIHksIHggPSBjb29yZHNbMF1baV0uaXRlbSgpLCBjb29yZHNbMV1baV0uaXRlbSgpCiAgICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbl92b2x1bWVbeTp5K0NGRy50aWxlX3NpemUsIHg6eCtDRkcudGlsZV9zaXplXSArPSBlbnNlbWJsZV9wcmVkc1tpLCAwXQogICAgICAgICAgICAgICAgICAgIGNvdW50X3ZvbHVtZVt5OnkrQ0ZHLnRpbGVfc2l6ZSwgeDp4K0NGRy50aWxlX3NpemVdICs9IDEKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAjIE5vcm1hbGl6ZSBvdmVybGFwcwogICAgICAgIHByZWRpY3Rpb25fdm9sdW1lIC89IChjb3VudF92b2x1bWUgKyAxZS03KQogICAgICAgIHByZWRpY3Rpb25fdm9sdW1lID0gcHJlZGljdGlvbl92b2x1bWVbOmgsIDp3XSAjIFJlbW92ZSBwYWRkaW5nCiAgICAgICAgCiAgICAgICAgIyBDbGVhbiB1cCBtZW1vcnkgaW1tZWRpYXRlbHkgdG8gcHJldmVudCBLYWdnbGUgT09NCiAgICAgICAgcHJlZF9udW1weSA9IHByZWRpY3Rpb25fdm9sdW1lLmNwdSgpLm51bXB5KCkKICAgICAgICBkZWwgaW1hZ2VzLCB0ZXN0X2RhdGFzZXQsIHRlc3RfbG9hZGVyLCBwcmVkaWN0aW9uX3ZvbHVtZSwgY291bnRfdm9sdW1lCiAgICAgICAgZ2MuY29sbGVjdCgpCiAgICAgICAgdG9yY2guY3VkYS5lbXB0eV9jYWNoZSgpCiAgICAgICAgCiAgICAgICAgIyBHZW5lcmF0ZSBSTEUKICAgICAgICBwcmludChmIkVuY29kaW5nIFJMRSBmb3IgRnJhZ21lbnQge2ZyYWdtZW50X2lkfS4uLiIpCiAgICAgICAgZnJhZ21lbnRfcmxlID0gcmxlKHByZWRfbnVtcHksIENGRy50aHJlc2hvbGQpCiAgICAgICAgcmVzdWx0c19ybGUuYXBwZW5kKHsnSWQnOiBmcmFnbWVudF9pZCwgJ1ByZWRpY3RlZCc6IGZyYWdtZW50X3JsZX0pCiAgICAgICAgCiAgICAjIDMuIFNhdmUgU3VibWlzc2lvbgogICAgc3VibWlzc2lvbl9kZiA9IHBkLkRhdGFGcmFtZShyZXN1bHRzX3JsZSkKICAgIHN1Ym1pc3Npb25fZGYudG9fY3N2KCdzdWJtaXNzaW9uLmNzdicsIGluZGV4PUZhbHNlKQogICAgcHJpbnQoIkluZmVyZW5jZSBDb21wbGV0ZS4gRmlsZSBzYXZlZDogL2thZ2dsZS93b3JraW5nL3N1Ym1pc3Npb24uY3N2IikKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBydW5fZW5zZW1ibGVfaW5mZXJlbmNlKCkK').decode('utf-8'))\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null}]}