1 line
92 KiB
Python
1 line
92 KiB
Python
IyBDb3B5cmlnaHQgKEMpIDIwMjQgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBWYWxpZGF0aW9uRXJyb3IKZnJvbSBvZG9vLnRvb2xzIGltcG9ydCBtdXRlX2xvZ2dlcgoKZnJvbSAuY29tbW9uX2pldHMgaW1wb3J0IFRlc3RUb3dlckpldHNDb21tb24KCgpjbGFzcyBUZXN0VG93ZXJKZXRXYXlwb2ludChUZXN0VG93ZXJKZXRzQ29tbW9uKToKICAgICIiIgogICAgVGVzdCB0aGUgSmV0IFdheXBvaW50IG1vZGVsIGZ1bmN0aW9uYWxpdHkKICAgICIiIgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKICAgICAgICBzdXBlcigpLnNldFVwQ2xhc3MoKQoKICAgICAgICAjIENyZWF0ZSB2YXJpYWJsZXMgZm9yIHRlc3RpbmcKICAgICAgICBjbHMudmFyaWFibGVfdGVzdF8xID0gY2xzLlZhcmlhYmxlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBWYXJpYWJsZSAxIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF92YXJfMSIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY2xzLnZhcmlhYmxlX3Rlc3RfMiA9IGNscy5WYXJpYWJsZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgVmFyaWFibGUgMiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3RfdmFyXzIiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNscy52YXJpYWJsZV90ZXN0XzMgPSBjbHMuVmFyaWFibGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFZhcmlhYmxlIDMiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X3Zhcl8zIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICAjIHdheXBvaW50X3RlbXBsYXRlIGFuZCB3YXlwb2ludCBhcmUgbm93IGluaGVyaXRlZCBmcm9tIFRlc3RUb3dlckpldHNDb21tb24KCiAgICAgICAgIyBDcmVhdGUgY29tbWFuZHMgZm9yIGZsaWdodCBwbGFucwogICAgICAgIGNscy5jb21tYW5kX3N1Y2Nlc3MgPSBjbHMuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkNvbW1hbmQgLT4gU3VjY2VzcyIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInB5dGhvbl9jb2RlIiwKICAgICAgICAgICAgICAgICJjb2RlIjogIiMgSnVzdCByZXR1cm4gZGVmYXVsdCB2YWx1ZXMiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNscy5jb21tYW5kX2Vycm9yID0gY2xzLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJDb21tYW5kIC0+IEVycm9yIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicHl0aG9uX2NvZGUiLAogICAgICAgICAgICAgICAgImNvZGUiOiAicmVzdWx0ID0geydleGl0X2NvZGUnOiAtMTAwLCAnbWVzc2FnZSc6ICdFcnJvcid9IiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBjbHMuY29tbWFuZF93YXlwb2ludF9jaGVjayA9IGNscy5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiQ29tbWFuZCAtPiBXYXlwb2ludCBDaGVjayIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInB5dGhvbl9jb2RlIiwKICAgICAgICAgICAgICAgICJjb2RlIjogKAogICAgICAgICAgICAgICAgICAgICJyZXN1bHQgPSB7J2V4aXRfY29kZSc6IHdheXBvaW50LmlkIGlmIHdheXBvaW50IGVsc2UgLTEsICIKICAgICAgICAgICAgICAgICAgICAiJ21lc3NhZ2UnOiAnd2F5cG9pbnQgY2hlY2snfSIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGZsaWdodCBwbGFucwogICAgICAgIGNscy5wbGFuX3N1Y2Nlc3MgPSBjbHMuUGxhbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIldheXBvaW50IFN1Y2Nlc3MgUGxhbiIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY2xzLnBsYW5fbGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDEwLAogICAgICAgICAgICAgICAgInBsYW5faWQiOiBjbHMucGxhbl9zdWNjZXNzLmlkLAogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBjbHMuY29tbWFuZF9zdWNjZXNzLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBjbHMucGxhbl9lcnJvciA9IGNscy5QbGFuLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiV2F5cG9pbnQgRXJyb3IgUGxhbiIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY2xzLnBsYW5fbGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDEwLAogICAgICAgICAgICAgICAgInBsYW5faWQiOiBjbHMucGxhbl9lcnJvci5pZCwKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogY2xzLmNvbW1hbmRfZXJyb3IuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGNscy5wbGFuX3dheXBvaW50X2NoZWNrID0gY2xzLlBsYW4uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJXYXlwb2ludCBDaGVjayBQbGFuIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBjbHMucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMTAsCiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IGNscy5wbGFuX3dheXBvaW50X2NoZWNrLmlkLAogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBjbHMuY29tbWFuZF93YXlwb2ludF9jaGVjay5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICBkZWYgdGVzdF9zYXZlX3ZhcmlhYmxlX3ZhbHVlc19lbXB0eShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IF9zYXZlX3ZhcmlhYmxlX3ZhbHVlcyB3aGVuIGpldCBoYXMgbm8gdmFyaWFibGUgdmFsdWVzCiAgICAgICAgIiIiCiAgICAgICAgIyBFbnN1cmUgamV0IGhhcyBubyB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICBzZWxmLmpldF90ZXN0LnZhcmlhYmxlX3ZhbHVlX2lkcy51bmxpbmsoKQoKICAgICAgICAjIFNhdmUgdmFyaWFibGUgdmFsdWVzCiAgICAgICAgcmVzdWx0ID0gc2VsZi53YXlwb2ludC5fc2F2ZV92YXJpYWJsZV92YWx1ZXMoKQoKICAgICAgICAjIFNob3VsZCByZXR1cm4gVHJ1ZQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQsICJTaG91bGQgcmV0dXJuIFRydWUgd2hlbiBzYXZpbmcgdmFsdWVzIikKCiAgICAgICAgIyBXYXlwb2ludCBzaG91bGQgaGF2ZSBlbXB0eSB2YXJpYWJsZV92YWx1ZXMgKG9yIEZhbHNlLCB3aGljaCBpcyBlcXVpdmFsZW50KQogICAgICAgIHZhcmlhYmxlX3ZhbHVlcyA9IHNlbGYud2F5cG9pbnQudmFyaWFibGVfdmFsdWVzIG9yIHt9CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgdmFyaWFibGVfdmFsdWVzLAogICAgICAgICAgICB7fSwKICAgICAgICAgICAgIlZhcmlhYmxlIHZhbHVlcyBzaG91bGQgYmUgZW1wdHkgZGljdCB3aGVuIGpldCBoYXMgbm8gdmFsdWVzIiwKICAgICAgICApCgogICAgZGVmIHRlc3Rfc2F2ZV92YXJpYWJsZV92YWx1ZXNfd2l0aF92YWx1ZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBfc2F2ZV92YXJpYWJsZV92YWx1ZXMgd2hlbiBqZXQgaGFzIHZhcmlhYmxlIHZhbHVlcwogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHZhcmlhYmxlIHZhbHVlcyBmb3IgdGhlIGpldAogICAgICAgIHNlbGYuVmFyaWFibGVWYWx1ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHNlbGYudmFyaWFibGVfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAidmFsdWVfMSIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBzZWxmLlZhcmlhYmxlVmFsdWUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiBzZWxmLnZhcmlhYmxlX3Rlc3RfMi5pZCwKICAgICAgICAgICAgICAgICJ2YWx1ZV9jaGFyIjogInZhbHVlXzIiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgU2F2ZSB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICByZXN1bHQgPSBzZWxmLndheXBvaW50Ll9zYXZlX3ZhcmlhYmxlX3ZhbHVlcygpCgogICAgICAgICMgU2hvdWxkIHJldHVybiBUcnVlCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdCwgIlNob3VsZCByZXR1cm4gVHJ1ZSB3aGVuIHNhdmluZyB2YWx1ZXMiKQoKICAgICAgICAjIFdheXBvaW50IHNob3VsZCBoYXZlIHNhdmVkIHZhcmlhYmxlIHZhbHVlcwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNlbGYud2F5cG9pbnQudmFyaWFibGVfdmFsdWVzLAogICAgICAgICAgICB7InRlc3RfdmFyXzEiOiAidmFsdWVfMSIsICJ0ZXN0X3Zhcl8yIjogInZhbHVlXzIifSwKICAgICAgICAgICAgIlZhcmlhYmxlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgY29ycmVjdGx5IiwKICAgICAgICApCgogICAgZGVmIHRlc3Rfc2F2ZV92YXJpYWJsZV92YWx1ZXNfd2l0aF9lbXB0eV9zdHJpbmcoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBfc2F2ZV92YXJpYWJsZV92YWx1ZXMgd2hlbiB2YXJpYWJsZSB2YWx1ZSBpcyBlbXB0eSBzdHJpbmcKICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSB2YXJpYWJsZSB2YWx1ZSB3aXRoIGVtcHR5IHN0cmluZwogICAgICAgIHNlbGYuVmFyaWFibGVWYWx1ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHNlbGYudmFyaWFibGVfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAiIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFNhdmUgdmFyaWFibGUgdmFsdWVzCiAgICAgICAgc2VsZi53YXlwb2ludC5fc2F2ZV92YXJpYWJsZV92YWx1ZXMoKQoKICAgICAgICAjIFdheXBvaW50IHNob3VsZCBoYXZlIHNhdmVkIGVtcHR5IHN0cmluZyB2YWx1ZQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNlbGYud2F5cG9pbnQudmFyaWFibGVfdmFsdWVzLAogICAgICAgICAgICB7InRlc3RfdmFyXzEiOiAiIn0sCiAgICAgICAgICAgICJFbXB0eSBzdHJpbmcgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NhdmVfdmFyaWFibGVfdmFsdWVzX29ubHlfamV0X3ZhbHVlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IF9zYXZlX3ZhcmlhYmxlX3ZhbHVlcyBvbmx5IHNhdmVzIGpldC1zcGVjaWZpYyB2YWx1ZXMsCiAgICAgICAgbm90IHRlbXBsYXRlL3NlcnZlci9nbG9iYWwgdmFsdWVzCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgamV0LXNwZWNpZmljIHZhcmlhYmxlIHZhbHVlCiAgICAgICAgc2VsZi5WYXJpYWJsZVZhbHVlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogc2VsZi52YXJpYWJsZV90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICJqZXRfdmFsdWUiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHRlbXBsYXRlIHZhcmlhYmxlIHZhbHVlIChzaG91bGQgbm90IGJlIHNhdmVkKQogICAgICAgIHNlbGYuVmFyaWFibGVWYWx1ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHNlbGYudmFyaWFibGVfdGVzdF8yLmlkLAogICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAidGVtcGxhdGVfdmFsdWUiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgU2F2ZSB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICBzZWxmLndheXBvaW50Ll9zYXZlX3ZhcmlhYmxlX3ZhbHVlcygpCgogICAgICAgICMgV2F5cG9pbnQgc2hvdWxkIG9ubHkgaGF2ZSBqZXQtc3BlY2lmaWMgdmFsdWUKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLndheXBvaW50LnZhcmlhYmxlX3ZhbHVlcywKICAgICAgICAgICAgeyJ0ZXN0X3Zhcl8xIjogImpldF92YWx1ZSJ9LAogICAgICAgICAgICAiU2hvdWxkIG9ubHkgc2F2ZSBqZXQtc3BlY2lmaWMgdmFsdWVzIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnROb3RJbigKICAgICAgICAgICAgInRlc3RfdmFyXzIiLAogICAgICAgICAgICBzZWxmLndheXBvaW50LnZhcmlhYmxlX3ZhbHVlcywKICAgICAgICAgICAgIlNob3VsZCBub3Qgc2F2ZSB0ZW1wbGF0ZSB2YWx1ZXMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9yZXN0b3JlX3ZhcmlhYmxlX3ZhbHVlc19lbXB0eShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IF9yZXN0b3JlX3ZhcmlhYmxlX3ZhbHVlcyB3aGVuIHdheXBvaW50IGhhcyBubyBzYXZlZCB2YWx1ZXMKICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSBzb21lIHZhcmlhYmxlIHZhbHVlcyBpbiBqZXQKICAgICAgICBzZWxmLlZhcmlhYmxlVmFsdWUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiBzZWxmLnZhcmlhYmxlX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICJ2YWx1ZV9jaGFyIjogImV4aXN0aW5nX3ZhbHVlIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFNldCB3YXlwb2ludCB2YXJpYWJsZV92YWx1ZXMgdG8gZW1wdHkKICAgICAgICBzZWxmLndheXBvaW50LnZhcmlhYmxlX3ZhbHVlcyA9IHt9CgogICAgICAgICMgUmVzdG9yZSB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICByZXN1bHQgPSBzZWxmLndheXBvaW50Ll9yZXN0b3JlX3ZhcmlhYmxlX3ZhbHVlcygpCgogICAgICAgICMgU2hvdWxkIHJldHVybiBUcnVlCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdCwgIlNob3VsZCByZXR1cm4gVHJ1ZSB3aGVuIHJlc3RvcmluZyB2YWx1ZXMiKQoKICAgICAgICAjIEpldCBzaG91bGQgaGF2ZSBubyB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4oc2VsZi5qZXRfdGVzdC52YXJpYWJsZV92YWx1ZV9pZHMpLAogICAgICAgICAgICAwLAogICAgICAgICAgICAiQWxsIGpldCB2YXJpYWJsZSB2YWx1ZXMgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB3YXlwb2ludCBpcyBlbXB0eSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3Jlc3RvcmVfdmFyaWFibGVfdmFsdWVzX2Jhc2ljKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgX3Jlc3RvcmVfdmFyaWFibGVfdmFsdWVzIHJlc3RvcmVzIHZhbHVlcyBjb3JyZWN0bHkKICAgICAgICAiIiIKICAgICAgICAjIFNldCB3YXlwb2ludCB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICBzZWxmLndheXBvaW50LnZhcmlhYmxlX3ZhbHVlcyA9IHsKICAgICAgICAgICAgInRlc3RfdmFyXzEiOiAicmVzdG9yZWRfdmFsdWVfMSIsCiAgICAgICAgICAgICJ0ZXN0X3Zhcl8yIjogInJlc3RvcmVkX3ZhbHVlXzIiLAogICAgICAgIH0KCiAgICAgICAgIyBSZXN0b3JlIHZhcmlhYmxlIHZhbHVlcwogICAgICAgIHJlc3VsdCA9IHNlbGYud2F5cG9pbnQuX3Jlc3RvcmVfdmFyaWFibGVfdmFsdWVzKCkKCiAgICAgICAgIyBTaG91bGQgcmV0dXJuIFRydWUKICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0LCAiU2hvdWxkIHJldHVybiBUcnVlIHdoZW4gcmVzdG9yaW5nIHZhbHVlcyIpCgogICAgICAgICMgQ2hlY2sgdmFsdWVzIHdlcmUgcmVzdG9yZWQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LmdldF92YXJpYWJsZV92YWx1ZSgidGVzdF92YXJfMSIsIG5vX2ZhbGxiYWNrPVRydWUpLAogICAgICAgICAgICAicmVzdG9yZWRfdmFsdWVfMSIsCiAgICAgICAgICAgICJWYXJpYWJsZSAxIHNob3VsZCBiZSByZXN0b3JlZCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNlbGYuamV0X3Rlc3QuZ2V0X3ZhcmlhYmxlX3ZhbHVlKCJ0ZXN0X3Zhcl8yIiwgbm9fZmFsbGJhY2s9VHJ1ZSksCiAgICAgICAgICAgICJyZXN0b3JlZF92YWx1ZV8yIiwKICAgICAgICAgICAgIlZhcmlhYmxlIDIgc2hvdWxkIGJlIHJlc3RvcmVkIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcmVzdG9yZV92YXJpYWJsZV92YWx1ZXNfcmVtb3Zlc191bnNhdmVkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgX3Jlc3RvcmVfdmFyaWFibGVfdmFsdWVzIHJlbW92ZXMgdmFyaWFibGUgdmFsdWVzIG5vdCBpbiB3YXlwb2ludAogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHZhcmlhYmxlIHZhbHVlcyBpbiBqZXQKICAgICAgICBzZWxmLlZhcmlhYmxlVmFsdWUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiBzZWxmLnZhcmlhYmxlX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICJ2YWx1ZV9jaGFyIjogInZhbHVlXzEiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgc2VsZi5WYXJpYWJsZVZhbHVlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogc2VsZi52YXJpYWJsZV90ZXN0XzIuaWQsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICJ2YWx1ZV8yIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYuVmFyaWFibGVWYWx1ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHNlbGYudmFyaWFibGVfdGVzdF8zLmlkLAogICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAidmFsdWVfMyIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBTZXQgd2F5cG9pbnQgdG8gb25seSBoYXZlIHZhcmlhYmxlIDEgYW5kIDIKICAgICAgICBzZWxmLndheXBvaW50LnZhcmlhYmxlX3ZhbHVlcyA9IHsKICAgICAgICAgICAgInRlc3RfdmFyXzEiOiAidmFsdWVfMSIsCiAgICAgICAgICAgICJ0ZXN0X3Zhcl8yIjogInZhbHVlXzIiLAogICAgICAgIH0KCiAgICAgICAgIyBSZXN0b3JlIHZhcmlhYmxlIHZhbHVlcwogICAgICAgIHNlbGYud2F5cG9pbnQuX3Jlc3RvcmVfdmFyaWFibGVfdmFsdWVzKCkKCiAgICAgICAgIyBWYXJpYWJsZSAzIHNob3VsZCBiZSByZW1vdmVkCiAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoCiAgICAgICAgICAgIHNlbGYuamV0X3Rlc3QuZ2V0X3ZhcmlhYmxlX3ZhbHVlKCJ0ZXN0X3Zhcl8zIiwgbm9fZmFsbGJhY2s9VHJ1ZSksCiAgICAgICAgICAgICJWYXJpYWJsZSAzIHNob3VsZCBiZSByZW1vdmVkIiwKICAgICAgICApCgogICAgICAgICMgVmFyaWFibGVzIDEgYW5kIDIgc2hvdWxkIHN0aWxsIGV4aXN0CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC5nZXRfdmFyaWFibGVfdmFsdWUoInRlc3RfdmFyXzEiLCBub19mYWxsYmFjaz1UcnVlKSwKICAgICAgICAgICAgInZhbHVlXzEiLAogICAgICAgICAgICAiVmFyaWFibGUgMSBzaG91bGQgc3RpbGwgZXhpc3QiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LmdldF92YXJpYWJsZV92YWx1ZSgidGVzdF92YXJfMiIsIG5vX2ZhbGxiYWNrPVRydWUpLAogICAgICAgICAgICAidmFsdWVfMiIsCiAgICAgICAgICAgICJWYXJpYWJsZSAyIHNob3VsZCBzdGlsbCBleGlzdCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3Jlc3RvcmVfdmFyaWFibGVfdmFsdWVzX3VwZGF0ZXNfZXhpc3Rpbmcoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBfcmVzdG9yZV92YXJpYWJsZV92YWx1ZXMgdXBkYXRlcyBleGlzdGluZyB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSB2YXJpYWJsZSB2YWx1ZSBpbiBqZXQKICAgICAgICBzZWxmLlZhcmlhYmxlVmFsdWUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiBzZWxmLnZhcmlhYmxlX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICJ2YWx1ZV9jaGFyIjogIm9sZF92YWx1ZSIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBTZXQgd2F5cG9pbnQgd2l0aCBuZXcgdmFsdWUKICAgICAgICBzZWxmLndheXBvaW50LnZhcmlhYmxlX3ZhbHVlcyA9IHsidGVzdF92YXJfMSI6ICJuZXdfdmFsdWUifQoKICAgICAgICAjIFJlc3RvcmUgdmFyaWFibGUgdmFsdWVzCiAgICAgICAgc2VsZi53YXlwb2ludC5fcmVzdG9yZV92YXJpYWJsZV92YWx1ZXMoKQoKICAgICAgICAjIFZhbHVlIHNob3VsZCBiZSB1cGRhdGVkCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC5nZXRfdmFyaWFibGVfdmFsdWUoInRlc3RfdmFyXzEiLCBub19mYWxsYmFjaz1UcnVlKSwKICAgICAgICAgICAgIm5ld192YWx1ZSIsCiAgICAgICAgICAgICJWYXJpYWJsZSB2YWx1ZSBzaG91bGQgYmUgdXBkYXRlZCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NhdmVfYW5kX3Jlc3RvcmVfcm91bmR0cmlwKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3Qgc2F2aW5nIGFuZCByZXN0b3JpbmcgdmFyaWFibGUgdmFsdWVzIGluIGEgcm91bmR0cmlwCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgaW5pdGlhbCB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICBzZWxmLlZhcmlhYmxlVmFsdWUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiBzZWxmLnZhcmlhYmxlX3Rlc3RfMS5pZCwKICAgICAgICAgICAgICAgICJ2YWx1ZV9jaGFyIjogImluaXRpYWxfdmFsdWVfMSIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBzZWxmLlZhcmlhYmxlVmFsdWUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiBzZWxmLnZhcmlhYmxlX3Rlc3RfMi5pZCwKICAgICAgICAgICAgICAgICJ2YWx1ZV9jaGFyIjogImluaXRpYWxfdmFsdWVfMiIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBTYXZlIHZhcmlhYmxlIHZhbHVlcwogICAgICAgIHNlbGYud2F5cG9pbnQuX3NhdmVfdmFyaWFibGVfdmFsdWVzKCkKCiAgICAgICAgIyBNb2RpZnkgamV0IHZhbHVlcwogICAgICAgIHNlbGYuamV0X3Rlc3Quc2V0X3ZhcmlhYmxlX3ZhbHVlKCJ0ZXN0X3Zhcl8xIiwgIm1vZGlmaWVkX3ZhbHVlXzEiKQogICAgICAgIHNlbGYuamV0X3Rlc3Quc2V0X3ZhcmlhYmxlX3ZhbHVlKCJ0ZXN0X3Zhcl8yIiwgIm1vZGlmaWVkX3ZhbHVlXzIiKQogICAgICAgIHNlbGYuVmFyaWFibGVWYWx1ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHNlbGYudmFyaWFibGVfdGVzdF8zLmlkLAogICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAibmV3X3ZhbHVlIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFJlc3RvcmUgdmFyaWFibGUgdmFsdWVzCiAgICAgICAgc2VsZi53YXlwb2ludC5fcmVzdG9yZV92YXJpYWJsZV92YWx1ZXMoKQoKICAgICAgICAjIFZhbHVlcyBzaG91bGQgYmUgcmVzdG9yZWQgdG8gb3JpZ2luYWwKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LmdldF92YXJpYWJsZV92YWx1ZSgidGVzdF92YXJfMSIsIG5vX2ZhbGxiYWNrPVRydWUpLAogICAgICAgICAgICAiaW5pdGlhbF92YWx1ZV8xIiwKICAgICAgICAgICAgIlZhcmlhYmxlIDEgc2hvdWxkIGJlIHJlc3RvcmVkIHRvIG9yaWdpbmFsIHZhbHVlIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC5nZXRfdmFyaWFibGVfdmFsdWUoInRlc3RfdmFyXzIiLCBub19mYWxsYmFjaz1UcnVlKSwKICAgICAgICAgICAgImluaXRpYWxfdmFsdWVfMiIsCiAgICAgICAgICAgICJWYXJpYWJsZSAyIHNob3VsZCBiZSByZXN0b3JlZCB0byBvcmlnaW5hbCB2YWx1ZSIsCiAgICAgICAgKQogICAgICAgICMgVmFyaWFibGUgMyBzaG91bGQgYmUgcmVtb3ZlZCAobm90IGluIHNhdmVkIHdheXBvaW50KQogICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LmdldF92YXJpYWJsZV92YWx1ZSgidGVzdF92YXJfMyIsIG5vX2ZhbGxiYWNrPVRydWUpLAogICAgICAgICAgICAiVmFyaWFibGUgMyBzaG91bGQgYmUgcmVtb3ZlZCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3dyaXRlX3dheXBvaW50X3RlbXBsYXRlX2RyYWZ0X2FsbG93ZWQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IG1vZGlmeWluZyB3YXlwb2ludF90ZW1wbGF0ZV9pZCBpcyBhbGxvd2VkIHdoZW4gc3RhdGUgaXMgZHJhZnQKICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCBpbiBkcmFmdCBzdGF0ZQogICAgICAgIHdheXBvaW50ID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgV2F5cG9pbnQgRHJhZnQiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImRyYWZ0IiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBTaG91bGQgYmUgYWJsZSB0byBjaGFuZ2UgdGVtcGxhdGUgaW4gZHJhZnQgc3RhdGUKICAgICAgICB3YXlwb2ludC53cml0ZSh7IndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZV8yLmlkfSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICB3YXlwb2ludC53YXlwb2ludF90ZW1wbGF0ZV9pZC5pZCwKICAgICAgICAgICAgc2VsZi53YXlwb2ludF90ZW1wbGF0ZV8yLmlkLAogICAgICAgICAgICAiU2hvdWxkIGJlIGFibGUgdG8gY2hhbmdlIHRlbXBsYXRlIGluIGRyYWZ0IHN0YXRlIiwKICAgICAgICApCgogICAgZGVmIHRlc3Rfd3JpdGVfd2F5cG9pbnRfdGVtcGxhdGVfbm90X2RyYWZ0X3JhaXNlc19lcnJvcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgbW9kaWZ5aW5nIHdheXBvaW50X3RlbXBsYXRlX2lkIHJhaXNlcyBWYWxpZGF0aW9uRXJyb3IKICAgICAgICB3aGVuIHN0YXRlIGlzIG5vdCBkcmFmdAogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IGluIHJlYWR5IHN0YXRlCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCBSZWFkeSIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHNlbGYud2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAicmVhZHkiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFNob3VsZCByYWlzZSBWYWxpZGF0aW9uRXJyb3Igd2hlbiB0cnlpbmcgdG8gY2hhbmdlIHRlbXBsYXRlCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWxpZGF0aW9uRXJyb3IpIGFzIGNvbnRleHQ6CiAgICAgICAgICAgIHdheXBvaW50LndyaXRlKHsid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlXzIuaWR9KQoKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICAiZHJhZnQgc3RhdGUiLAogICAgICAgICAgICBzdHIoY29udGV4dC5leGNlcHRpb24pLAogICAgICAgICAgICAiU2hvdWxkIHJhaXNlIFZhbGlkYXRpb25FcnJvciBhYm91dCBkcmFmdCBzdGF0ZSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3dyaXRlX3dheXBvaW50X3RlbXBsYXRlX3NhbWVfdmFsdWVfYWxsb3dlZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgc2V0dGluZyB3YXlwb2ludF90ZW1wbGF0ZV9pZCB0byB0aGUgc2FtZSB2YWx1ZSBpcyBhbGxvd2VkCiAgICAgICAgZXZlbiB3aGVuIG5vdCBpbiBkcmFmdCBzdGF0ZQogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IGluIHJlYWR5IHN0YXRlCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCBSZWFkeSIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHNlbGYud2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAicmVhZHkiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIG9yaWdpbmFsX3RlbXBsYXRlX2lkID0gd2F5cG9pbnQud2F5cG9pbnRfdGVtcGxhdGVfaWQuaWQKCiAgICAgICAgIyBTaG91bGQgYmUgYWJsZSB0byBzZXQgdG8gdGhlIHNhbWUgdGVtcGxhdGUKICAgICAgICB3YXlwb2ludC53cml0ZSh7IndheXBvaW50X3RlbXBsYXRlX2lkIjogb3JpZ2luYWxfdGVtcGxhdGVfaWR9KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHdheXBvaW50LndheXBvaW50X3RlbXBsYXRlX2lkLmlkLAogICAgICAgICAgICBvcmlnaW5hbF90ZW1wbGF0ZV9pZCwKICAgICAgICAgICAgIlNob3VsZCBiZSBhYmxlIHRvIHNldCBzYW1lIHRlbXBsYXRlIHZhbHVlIiwKICAgICAgICApCgogICAgZGVmIHRlc3Rfd3JpdGVfb3RoZXJfZmllbGRzX25vdF9kcmFmdF9hbGxvd2VkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdGhhdCBtb2RpZnlpbmcgb3RoZXIgZmllbGRzIGlzIGFsbG93ZWQgd2hlbiBzdGF0ZSBpcyBub3QgZHJhZnQKICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCBpbiByZWFkeSBzdGF0ZQogICAgICAgIHdheXBvaW50ID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgV2F5cG9pbnQgUmVhZHkiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogInJlYWR5IiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBTaG91bGQgYmUgYWJsZSB0byBtb2RpZnkgb3RoZXIgZmllbGRzCiAgICAgICAgd2F5cG9pbnQud3JpdGUoeyJuYW1lIjogIlVwZGF0ZWQgTmFtZSJ9KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHdheXBvaW50Lm5hbWUsCiAgICAgICAgICAgICJVcGRhdGVkIE5hbWUiLAogICAgICAgICAgICAiU2hvdWxkIGJlIGFibGUgdG8gbW9kaWZ5IG90aGVyIGZpZWxkcyB3aGVuIG5vdCBpbiBkcmFmdCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3ByZXBhcmVfd2l0aG91dF9mbGlnaHRfcGxhbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHByZXBhcmUoKSB3aGVuIHdheXBvaW50IHRlbXBsYXRlIGhhcyBubyBwbGFuX2NyZWF0ZV9pZAogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IHRlbXBsYXRlIHdpdGhvdXQgcGxhbl9jcmVhdGVfaWQKICAgICAgICB3YXlwb2ludF90ZW1wbGF0ZV9ub19wbGFuID0gc2VsZi5KZXRXYXlwb2ludFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCBUZW1wbGF0ZSBObyBQbGFuIiwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCBpbiBkcmFmdCBzdGF0ZQogICAgICAgIHdheXBvaW50ID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgV2F5cG9pbnQgTm8gUGxhbiIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHdheXBvaW50X3RlbXBsYXRlX25vX3BsYW4uaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAiZHJhZnQiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENhbGwgcHJlcGFyZQogICAgICAgIHJlc3VsdCA9IHdheXBvaW50LnByZXBhcmUoKQoKICAgICAgICAjIFNob3VsZCByZXR1cm4gVHJ1ZSBhbmQgc2V0IHN0YXRlIHRvIHJlYWR5CiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdCwgIlNob3VsZCByZXR1cm4gVHJ1ZSIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgd2F5cG9pbnQuc3RhdGUsCiAgICAgICAgICAgICJyZWFkeSIsCiAgICAgICAgICAgICJTdGF0ZSBzaG91bGQgYmUgc2V0IHRvIHJlYWR5IHdoZW4gbm8gZmxpZ2h0IHBsYW4iLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9wcmVwYXJlX3dpdGhvdXRfZmxpZ2h0X3BsYW5fd2l0aF9pc19kZXN0aW5hdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHByZXBhcmUoKSB3aGVuIHdheXBvaW50IHRlbXBsYXRlIGhhcyBubyBwbGFuX2NyZWF0ZV9pZAogICAgICAgIGFuZCBpc19kZXN0aW5hdGlvbj1UcnVlCiAgICAgICAgU2hvdWxkIGF1dG9tYXRpY2FsbHkgY2FsbCBmbHlfdG8oKSB3aGVuIHByZXBhcmUgY29tcGxldGVzCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgd2F5cG9pbnQgdGVtcGxhdGUgd2l0aG91dCBwbGFuX2NyZWF0ZV9pZAogICAgICAgIHdheXBvaW50X3RlbXBsYXRlX25vX3BsYW4gPSBzZWxmLkpldFdheXBvaW50VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFdheXBvaW50IFRlbXBsYXRlIE5vIFBsYW4gRGVzdGluYXRpb24iLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IGluIGRyYWZ0IHN0YXRlIHdpdGggaXNfZGVzdGluYXRpb249VHJ1ZQogICAgICAgIHdheXBvaW50ID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgV2F5cG9pbnQgTm8gUGxhbiBEZXN0aW5hdGlvbiIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHdheXBvaW50X3RlbXBsYXRlX25vX3BsYW4uaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAiZHJhZnQiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENhbGwgcHJlcGFyZQogICAgICAgIHJlc3VsdCA9IHdheXBvaW50LnByZXBhcmUoaXNfZGVzdGluYXRpb249VHJ1ZSkKCiAgICAgICAgIyBTaG91bGQgcmV0dXJuIFRydWUKICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0LCAiU2hvdWxkIHJldHVybiBUcnVlIikKICAgICAgICAjIFN0YXRlIHNob3VsZCBiZSBzZXQgdG8gY3VycmVudCAoYmVjYXVzZSBmbHlfdG8oKSB3YXMgY2FsbGVkKQogICAgICAgICMgU2luY2UgdGhlcmUncyBubyBwcmV2aW91cyB3YXlwb2ludCBhbmQgbm8gcGxhbl9hcnJpdmVfaWQsCiAgICAgICAgIyBmbHlfdG8oKSBzZXRzIHN0YXRlIHRvIGFycml2aW5nIGFuZCBjYWxscyBfYXJyaXZlKCkgd2hpY2ggc2V0cyBpdCB0byBjdXJyZW50CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgd2F5cG9pbnQuc3RhdGUsCiAgICAgICAgICAgICJjdXJyZW50IiwKICAgICAgICAgICAgIlN0YXRlIHNob3VsZCBiZSBzZXQgdG8gY3VycmVudCBhZnRlciBmbHlfdG8oKSBhbmQgX2Fycml2ZSgpIiwKICAgICAgICApCiAgICAgICAgIyBXYXlwb2ludCBzaG91bGQgYmUgc2V0IGFzIGN1cnJlbnQgd2F5cG9pbnQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LndheXBvaW50X2lkLmlkLAogICAgICAgICAgICB3YXlwb2ludC5pZCwKICAgICAgICAgICAgIldheXBvaW50IHNob3VsZCBiZSBzZXQgYXMgY3VycmVudCB3YXlwb2ludCBhZnRlciBmbHlfdG8oKSIsCiAgICAgICAgKQogICAgICAgICMgaXNfZGVzdGluYXRpb24gc2hvdWxkIGJlIGNsZWFyZWQgYWZ0ZXIgYXJyaXZpbmcKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICB3YXlwb2ludC5pc19kZXN0aW5hdGlvbiwKICAgICAgICAgICAgImlzX2Rlc3RpbmF0aW9uIHNob3VsZCBiZSBjbGVhcmVkIGFmdGVyIGFycml2aW5nIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcHJlcGFyZV93aXRoX2ZsaWdodF9wbGFuX3N1Y2Nlc3Moc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBwcmVwYXJlKCkgd2hlbiB3YXlwb2ludCB0ZW1wbGF0ZSBoYXMgcGxhbl9jcmVhdGVfaWQgYW5kIHBsYW4gc3VjY2VlZHMKICAgICAgICAiIiIKICAgICAgICAjIFNldCB0ZW1wbGF0ZSB0byB1c2Ugc3VjY2VzcyBwbGFuCiAgICAgICAgc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5wbGFuX2NyZWF0ZV9pZCA9IHNlbGYucGxhbl9zdWNjZXNzLmlkCgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IGluIGRyYWZ0IHN0YXRlCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCBXaXRoIFBsYW4iLAogICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImRyYWZ0IiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDYWxsIHByZXBhcmUgLSBwbGFuIGV4ZWN1dGVzIHN5bmNocm9ub3VzbHkgaW4gdGVzdHMKICAgICAgICByZXN1bHQgPSB3YXlwb2ludC5wcmVwYXJlKCkKCiAgICAgICAgIyBTaG91bGQgcmV0dXJuIFRydWUKICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0LCAiU2hvdWxkIHJldHVybiBUcnVlIikKCiAgICAgICAgIyBTdGF0ZSBzaG91bGQgYmUgc2V0IHRvIHJlYWR5IGFmdGVyIHN1Y2Nlc3NmdWwgcGxhbiBjb21wbGV0aW9uCiAgICAgICAgIyAocGxhbiBleGVjdXRlcyBzeW5jaHJvbm91c2x5IGluIHRlc3RzLCBwcmVwYXJpbmcgLT4gcmVhZHkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgd2F5cG9pbnQuc3RhdGUsCiAgICAgICAgICAgICJyZWFkeSIsCiAgICAgICAgICAgICJTdGF0ZSBzaG91bGQgYmUgc2V0IHRvIHJlYWR5IGFmdGVyIHN1Y2Nlc3NmdWwgcGxhbiBjb21wbGV0aW9uIiwKICAgICAgICApCiAgICAgICAgIyBXYXlwb2ludCBzaG91bGQgTk9UIGJlIHNldCBhcyBjdXJyZW50IHdheXBvaW50IGFmdGVyIHByZXBhcmluZwogICAgICAgICMgKG9ubHkgYXJyaXZpbmcgc2V0cyB3YXlwb2ludCBhcyBjdXJyZW50KQogICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCiAgICAgICAgICAgIHNlbGYuamV0X3Rlc3Qud2F5cG9pbnRfaWQuaWQgaWYgc2VsZi5qZXRfdGVzdC53YXlwb2ludF9pZCBlbHNlIEZhbHNlLAogICAgICAgICAgICB3YXlwb2ludC5pZCwKICAgICAgICAgICAgIldheXBvaW50IHNob3VsZCBub3QgYmUgc2V0IGFzIGN1cnJlbnQgd2F5cG9pbnQgYWZ0ZXIgcHJlcGFyaW5nIiwKICAgICAgICApCgogICAgZGVmIHRlc3Rfd2F5cG9pbnRfdmFyaWFibGVfaW5fcHl0aG9uX2NvbW1hbmRfcHJlcGFyZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgJ3dheXBvaW50JyB2YXJpYWJsZSBpcyBhdmFpbGFibGUgaW4gUHl0aG9uIGNvbW1hbmRzCiAgICAgICAgcnVuIGZvciBhIHdheXBvaW50IHBsYW4gKHBsYW5fY3JlYXRlKSBhbmQgaXRzIGlkIGlzIHVzZWQgYXMgZXhpdCBjb2RlCiAgICAgICAgIiIiCiAgICAgICAgIyBTZXQgdGVtcGxhdGUgdG8gdXNlIHdheXBvaW50IGNoZWNrIHBsYW4KICAgICAgICBzZWxmLndheXBvaW50X3RlbXBsYXRlLnBsYW5fY3JlYXRlX2lkID0gc2VsZi5wbGFuX3dheXBvaW50X2NoZWNrLmlkCgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IGluIGRyYWZ0IHN0YXRlCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCBGb3IgVmFyaWFibGUgQ2hlY2siLAogICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImRyYWZ0IiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDYWxsIHByZXBhcmUgLSBwbGFuIGV4ZWN1dGVzIHN5bmNocm9ub3VzbHkgaW4gdGVzdHMKICAgICAgICB3YXlwb2ludC5wcmVwYXJlKCkKCiAgICAgICAgIyBGaW5kIHRoZSBwbGFuIGxvZyBjcmVhdGVkIGJ5IHByZXBhcmUKICAgICAgICBwbGFuX2xvZyA9IHNlbGYuUGxhbkxvZy5zZWFyY2goCiAgICAgICAgICAgIFsoIndheXBvaW50X2lkIiwgIj0iLCB3YXlwb2ludC5pZCldLAogICAgICAgICAgICBvcmRlcj0iY3JlYXRlX2RhdGUgZGVzYyIsCiAgICAgICAgICAgIGxpbWl0PTEsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwbGFuX2xvZywgIlBsYW4gbG9nIHNob3VsZCBiZSBjcmVhdGVkIikKCiAgICAgICAgIyBQbGFuIGV4aXQgY29kZSAocGxhbl9zdGF0dXMpIG11c3QgZXF1YWwgd2F5cG9pbnQgaWQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBwbGFuX2xvZy5wbGFuX3N0YXR1cywKICAgICAgICAgICAgd2F5cG9pbnQuaWQsCiAgICAgICAgICAgICJQbGFuIHN0YXR1cyBtdXN0IGVxdWFsIHdheXBvaW50IGlkIChmcm9tIHdheXBvaW50IHZhcmlhYmxlKSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3dheXBvaW50X3ZhcmlhYmxlX2luX3B5dGhvbl9jb21tYW5kX2Fycml2ZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgJ3dheXBvaW50JyB2YXJpYWJsZSBpcyBhdmFpbGFibGUgaW4gUHl0aG9uIGNvbW1hbmRzCiAgICAgICAgcnVuIGZvciBhIHdheXBvaW50IGFycml2ZSBwbGFuIGFuZCBpdHMgaWQgaXMgdXNlZCBhcyBleGl0IGNvZGUKICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCB0ZW1wbGF0ZSB3aXRoIHBsYW5fYXJyaXZlX2lkCiAgICAgICAgd2F5cG9pbnRfdGVtcGxhdGUgPSBzZWxmLkpldFdheXBvaW50VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJXYXlwb2ludCBUZW1wbGF0ZSBGb3IgQXJyaXZlIENoZWNrIiwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgInBsYW5fYXJyaXZlX2lkIjogc2VsZi5wbGFuX3dheXBvaW50X2NoZWNrLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCBpbiBhcnJpdmluZyBzdGF0ZSAobm8gcHJldmlvdXMgd2F5cG9pbnQpCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCBGb3IgQXJyaXZlIFZhcmlhYmxlIENoZWNrIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogd2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAiYXJyaXZpbmciLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENhbGwgYXJyaXZlIC0gcGxhbiBleGVjdXRlcyBzeW5jaHJvbm91c2x5IGluIHRlc3RzCiAgICAgICAgd2F5cG9pbnQuX2Fycml2ZSgpCgogICAgICAgICMgRmluZCB0aGUgcGxhbiBsb2cgY3JlYXRlZCBieSBhcnJpdmUKICAgICAgICBwbGFuX2xvZyA9IHNlbGYuUGxhbkxvZy5zZWFyY2goCiAgICAgICAgICAgIFsoIndheXBvaW50X2lkIiwgIj0iLCB3YXlwb2ludC5pZCldLAogICAgICAgICAgICBvcmRlcj0iY3JlYXRlX2RhdGUgZGVzYyIsCiAgICAgICAgICAgIGxpbWl0PTEsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwbGFuX2xvZywgIlBsYW4gbG9nIHNob3VsZCBiZSBjcmVhdGVkIikKCiAgICAgICAgIyBQbGFuIGV4aXQgY29kZSAocGxhbl9zdGF0dXMpIG11c3QgZXF1YWwgd2F5cG9pbnQgaWQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBwbGFuX2xvZy5wbGFuX3N0YXR1cywKICAgICAgICAgICAgd2F5cG9pbnQuaWQsCiAgICAgICAgICAgICJQbGFuIHN0YXR1cyBtdXN0IGVxdWFsIHdheXBvaW50IGlkIChmcm9tIHdheXBvaW50IHZhcmlhYmxlKSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3ByZXBhcmVfd2l0aF9mbGlnaHRfcGxhbl9lcnJvcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHByZXBhcmUoKSB3aGVuIHdheXBvaW50IHRlbXBsYXRlIGhhcyBwbGFuX2NyZWF0ZV9pZCBhbmQgcGxhbiBmYWlscwogICAgICAgICIiIgogICAgICAgICMgU2V0IHRlbXBsYXRlIHRvIHVzZSBlcnJvciBwbGFuCiAgICAgICAgc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5wbGFuX2NyZWF0ZV9pZCA9IHNlbGYucGxhbl9lcnJvci5pZAoKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCBpbiBkcmFmdCBzdGF0ZQogICAgICAgIHdheXBvaW50ID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgV2F5cG9pbnQgV2l0aCBQbGFuIEVycm9yIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJkcmFmdCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ2FsbCBwcmVwYXJlIC0gcGxhbiBleGVjdXRlcyBzeW5jaHJvbm91c2x5IGluIHRlc3RzCiAgICAgICAgd2l0aCBtdXRlX2xvZ2dlcigKICAgICAgICAgICAgIm9kb28uYWRkb25zLmNldG1peF90b3dlcl9zZXJ2ZXIubW9kZWxzLmN4X3Rvd2VyX2pldF93YXlwb2ludCIKICAgICAgICApOgogICAgICAgICAgICByZXN1bHQgPSB3YXlwb2ludC5wcmVwYXJlKCkKCiAgICAgICAgIyBTaG91bGQgcmV0dXJuIFRydWUKICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0LCAiU2hvdWxkIHJldHVybiBUcnVlIikKCiAgICAgICAgIyBTdGF0ZSBzaG91bGQgYmUgc2V0IHRvIGVycm9yIGFmdGVyIGZhaWxlZCBwbGFuIGNvbXBsZXRpb24KICAgICAgICAjIChwbGFuIGV4ZWN1dGVzIHN5bmNocm9ub3VzbHkgaW4gdGVzdHMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgd2F5cG9pbnQuc3RhdGUsCiAgICAgICAgICAgICJlcnJvciIsCiAgICAgICAgICAgICJTdGF0ZSBzaG91bGQgYmUgc2V0IHRvIGVycm9yIGFmdGVyIGZhaWxlZCBwbGFuIGNvbXBsZXRpb24iLAogICAgICAgICkKICAgICAgICAjIFdheXBvaW50IHNob3VsZCBub3QgYmUgc2V0IGFzIGN1cnJlbnQgd2F5cG9pbnQgb24gZXJyb3IKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LndheXBvaW50X2lkLmlkLAogICAgICAgICAgICB3YXlwb2ludC5pZCwKICAgICAgICAgICAgIldheXBvaW50IHNob3VsZCBub3QgYmUgc2V0IGFzIGN1cnJlbnQgd2F5cG9pbnQgYWZ0ZXIgZmFpbGVkIHByZXBhcmUiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9wcmVwYXJlX25vdF9kcmFmdF9zdGF0ZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHByZXBhcmUoKSB3aGVuIHdheXBvaW50IGlzIG5vdCBpbiBkcmFmdCBzdGF0ZQogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IGluIHJlYWR5IHN0YXRlCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCBSZWFkeSIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHNlbGYud2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAicmVhZHkiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENhbGwgcHJlcGFyZS4gVGhpcyB3aWxsIGxvZyBhbmQgZXJyb3IgYmVjYXVzZSB3YXlwb2ludCBpcyBub3QgaW4gZHJhZnQgc3RhdGUKICAgICAgICB3aXRoIG11dGVfbG9nZ2VyKAogICAgICAgICAgICAib2Rvby5hZGRvbnMuY2V0bWl4X3Rvd2VyX3NlcnZlci5tb2RlbHMuY3hfdG93ZXJfamV0X3dheXBvaW50IgogICAgICAgICk6CiAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsaWRhdGlvbkVycm9yKToKICAgICAgICAgICAgICAgIHdheXBvaW50LnByZXBhcmUoKQoKICAgIGRlZiB0ZXN0X3BsYW5fZmluaXNoZWRfcHJlcGFyaW5nX3N1Y2Nlc3Moc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBfcGxhbl9maW5pc2hlZCB3aGVuIHdheXBvaW50IGlzIGluIHByZXBhcmluZyBzdGF0ZSBhbmQgcGxhbiBzdWNjZWVkcwogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IGluIHByZXBhcmluZyBzdGF0ZSAoc2ltdWxhdGluZyBhc3luYyBwbGFuIGV4ZWN1dGlvbikKICAgICAgICB3YXlwb2ludCA9IHNlbGYuSmV0V2F5cG9pbnQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFdheXBvaW50IFByZXBhcmluZyIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHNlbGYud2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAicHJlcGFyaW5nIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgcGxhbiBsb2cgd2l0aCBzdWNjZXNzIHN0YXR1cwogICAgICAgIHBsYW5fbG9nID0gc2VsZi5QbGFuTG9nLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuamV0X3Rlc3Quc2VydmVyX2lkLmlkLAogICAgICAgICAgICAgICAgInBsYW5faWQiOiBzZWxmLnBsYW5fc3VjY2Vzcy5pZCwKICAgICAgICAgICAgICAgICJwbGFuX3N0YXR1cyI6IDAsICAjIFN1Y2Nlc3MKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDYWxsIF9wbGFuX2ZpbmlzaGVkCiAgICAgICAgcmVzdWx0ID0gd2F5cG9pbnQuX3BsYW5fZmluaXNoZWQocGxhbl9sb2cpCgogICAgICAgICMgU2hvdWxkIHJldHVybiBUcnVlCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdCwgIlNob3VsZCByZXR1cm4gVHJ1ZSIpCiAgICAgICAgIyBTdGF0ZSBzaG91bGQgYmUgc2V0IHRvIHJlYWR5CiAgICAgICAgIyAocHJlcGFyaW5nIC0+IHJlYWR5LCBub3QgY3VycmVudCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICB3YXlwb2ludC5zdGF0ZSwKICAgICAgICAgICAgInJlYWR5IiwKICAgICAgICAgICAgIlN0YXRlIHNob3VsZCBiZSBzZXQgdG8gcmVhZHkgYWZ0ZXIgc3VjY2Vzc2Z1bCBwbGFuIGNvbXBsZXRpb24iLAogICAgICAgICkKICAgICAgICAjIFdheXBvaW50IHNob3VsZCBOT1QgYmUgc2V0IGFzIGN1cnJlbnQgd2F5cG9pbnQgYWZ0ZXIgcHJlcGFyaW5nCiAgICAgICAgIyAob25seSBhcnJpdmluZyBzZXRzIHdheXBvaW50IGFzIGN1cnJlbnQpCiAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC53YXlwb2ludF9pZC5pZCBpZiBzZWxmLmpldF90ZXN0LndheXBvaW50X2lkIGVsc2UgRmFsc2UsCiAgICAgICAgICAgIHdheXBvaW50LmlkLAogICAgICAgICAgICAiV2F5cG9pbnQgc2hvdWxkIG5vdCBiZSBzZXQgYXMgY3VycmVudCB3YXlwb2ludCBhZnRlciBwcmVwYXJpbmciLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9wbGFuX2ZpbmlzaGVkX3ByZXBhcmluZ19zdWNjZXNzX3dpdGhfaXNfZGVzdGluYXRpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBfcGxhbl9maW5pc2hlZCB3aGVuIHdheXBvaW50IGlzIGluIHByZXBhcmluZyBzdGF0ZSB3aXRoIGlzX2Rlc3RpbmF0aW9uPVRydWUKICAgICAgICBTaG91bGQgYXV0b21hdGljYWxseSBjYWxsIGZseV90bygpIHdoZW4gcHJlcGFyaW5nIGZpbmlzaGVzCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgd2F5cG9pbnQgaW4gcHJlcGFyaW5nIHN0YXRlIHdpdGggaXNfZGVzdGluYXRpb249VHJ1ZQogICAgICAgIHdheXBvaW50ID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgV2F5cG9pbnQgUHJlcGFyaW5nIERlc3RpbmF0aW9uIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJwcmVwYXJpbmciLAogICAgICAgICAgICAgICAgImlzX2Rlc3RpbmF0aW9uIjogVHJ1ZSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgcGxhbiBsb2cgd2l0aCBzdWNjZXNzIHN0YXR1cwogICAgICAgIHBsYW5fbG9nID0gc2VsZi5QbGFuTG9nLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuamV0X3Rlc3Quc2VydmVyX2lkLmlkLAogICAgICAgICAgICAgICAgInBsYW5faWQiOiBzZWxmLnBsYW5fc3VjY2Vzcy5pZCwKICAgICAgICAgICAgICAgICJwbGFuX3N0YXR1cyI6IDAsICAjIFN1Y2Nlc3MKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDYWxsIF9wbGFuX2ZpbmlzaGVkCiAgICAgICAgcmVzdWx0ID0gd2F5cG9pbnQuX3BsYW5fZmluaXNoZWQocGxhbl9sb2cpCgogICAgICAgICMgU2hvdWxkIHJldHVybiBUcnVlCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdCwgIlNob3VsZCByZXR1cm4gVHJ1ZSIpCiAgICAgICAgIyBTdGF0ZSBzaG91bGQgYmUgc2V0IHRvIGFycml2aW5nIChiZWNhdXNlIGZseV90bygpIHdhcyBjYWxsZWQpCiAgICAgICAgIyBTaW5jZSB0aGVyZSdzIG5vIHByZXZpb3VzIHdheXBvaW50IGFuZCBubyBwbGFuX2Fycml2ZV9pZCwKICAgICAgICAjIGZseV90bygpIHNldHMgc3RhdGUgdG8gYXJyaXZpbmcgYW5kIGNhbGxzIF9hcnJpdmUoKSB3aGljaCBzZXRzIGl0IHRvIGN1cnJlbnQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICB3YXlwb2ludC5zdGF0ZSwKICAgICAgICAgICAgImN1cnJlbnQiLAogICAgICAgICAgICAiU3RhdGUgc2hvdWxkIGJlIHNldCB0byBjdXJyZW50IGFmdGVyIGZseV90bygpIGFuZCBfYXJyaXZlKCkiLAogICAgICAgICkKICAgICAgICAjIFdheXBvaW50IHNob3VsZCBiZSBzZXQgYXMgY3VycmVudCB3YXlwb2ludAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNlbGYuamV0X3Rlc3Qud2F5cG9pbnRfaWQuaWQsCiAgICAgICAgICAgIHdheXBvaW50LmlkLAogICAgICAgICAgICAiV2F5cG9pbnQgc2hvdWxkIGJlIHNldCBhcyBjdXJyZW50IHdheXBvaW50IGFmdGVyIGZseV90bygpIiwKICAgICAgICApCiAgICAgICAgIyBpc19kZXN0aW5hdGlvbiBzaG91bGQgYmUgY2xlYXJlZCBhZnRlciBhcnJpdmluZwogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgIHdheXBvaW50LmlzX2Rlc3RpbmF0aW9uLAogICAgICAgICAgICAiaXNfZGVzdGluYXRpb24gc2hvdWxkIGJlIGNsZWFyZWQgYWZ0ZXIgYXJyaXZpbmciLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9wbGFuX2ZpbmlzaGVkX2Fycml2aW5nX3N1Y2Nlc3Moc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBfcGxhbl9maW5pc2hlZCB3aGVuIHdheXBvaW50IGlzIGluIGFycml2aW5nIHN0YXRlIGFuZCBwbGFuIHN1Y2NlZWRzCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgd2F5cG9pbnQgaW4gYXJyaXZpbmcgc3RhdGUgKHNpbXVsYXRpbmcgYXN5bmMgcGxhbiBleGVjdXRpb24pCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCBBcnJpdmluZyIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHNlbGYud2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAiYXJyaXZpbmciLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBwbGFuIGxvZyB3aXRoIHN1Y2Nlc3Mgc3RhdHVzCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLlBsYW5Mb2cuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5qZXRfdGVzdC5zZXJ2ZXJfaWQuaWQsCiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHNlbGYucGxhbl9zdWNjZXNzLmlkLAogICAgICAgICAgICAgICAgInBsYW5fc3RhdHVzIjogMCwgICMgU3VjY2VzcwogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENhbGwgX3BsYW5fZmluaXNoZWQKICAgICAgICByZXN1bHQgPSB3YXlwb2ludC5fcGxhbl9maW5pc2hlZChwbGFuX2xvZykKCiAgICAgICAgIyBTaG91bGQgcmV0dXJuIFRydWUKICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0LCAiU2hvdWxkIHJldHVybiBUcnVlIikKICAgICAgICAjIFN0YXRlIHNob3VsZCBiZSBzZXQgdG8gY3VycmVudAogICAgICAgICMgKHdheXBvaW50IGJlY29tZXMgY3VycmVudCBhZnRlciBzdWNjZXNzZnVsIGFycml2ZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICB3YXlwb2ludC5zdGF0ZSwKICAgICAgICAgICAgImN1cnJlbnQiLAogICAgICAgICAgICAiU3RhdGUgc2hvdWxkIGJlIHNldCB0byBjdXJyZW50IGFmdGVyIHN1Y2Nlc3NmdWwgcGxhbiBjb21wbGV0aW9uIiwKICAgICAgICApCiAgICAgICAgIyBXYXlwb2ludCBzaG91bGQgYmUgc2V0IGFzIGN1cnJlbnQgd2F5cG9pbnQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LndheXBvaW50X2lkLmlkLAogICAgICAgICAgICB3YXlwb2ludC5pZCwKICAgICAgICAgICAgIldheXBvaW50IHNob3VsZCBiZSBzZXQgYXMgY3VycmVudCB3YXlwb2ludCBhZnRlciBzdWNjZXNzZnVsIGFycml2ZSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3BsYW5fZmluaXNoZWRfbGVhdmluZ19zdWNjZXNzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgX3BsYW5fZmluaXNoZWQgd2hlbiB3YXlwb2ludCBpcyBpbiBsZWF2aW5nIHN0YXRlIGFuZCBwbGFuIHN1Y2NlZWRzCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgY3VycmVudCB3YXlwb2ludCBpbiBjdXJyZW50IHN0YXRlCiAgICAgICAgY3VycmVudF93YXlwb2ludCA9IHNlbGYuSmV0V2F5cG9pbnQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJDdXJyZW50IFdheXBvaW50IiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJjdXJyZW50IiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBzZWxmLmpldF90ZXN0LndheXBvaW50X2lkID0gY3VycmVudF93YXlwb2ludC5pZAoKICAgICAgICAjIENyZWF0ZSBkZXN0aW5hdGlvbiB3YXlwb2ludCBpbiBhcnJpdmluZyBzdGF0ZQogICAgICAgIGRlc3RpbmF0aW9uX3dheXBvaW50ID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkRlc3RpbmF0aW9uIFdheXBvaW50IiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJpc19kZXN0aW5hdGlvbiI6IFRydWUsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAiYXJyaXZpbmciLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFNldCBjdXJyZW50IHdheXBvaW50IHRvIGxlYXZpbmcgc3RhdGUKICAgICAgICAjIHJlYWRvbmx5PVRydWUgb25seSBhZmZlY3RzIFVJLCBjYW4gYmUgd3JpdHRlbiBwcm9ncmFtbWF0aWNhbGx5CiAgICAgICAgY3VycmVudF93YXlwb2ludC53cml0ZSh7InN0YXRlIjogImxlYXZpbmcifSkKCiAgICAgICAgIyBDcmVhdGUgcGxhbiBsb2cgd2l0aCBzdWNjZXNzIHN0YXR1cwogICAgICAgIHBsYW5fbG9nID0gc2VsZi5QbGFuTG9nLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuamV0X3Rlc3Quc2VydmVyX2lkLmlkLAogICAgICAgICAgICAgICAgInBsYW5faWQiOiBzZWxmLnBsYW5fc3VjY2Vzcy5pZCwKICAgICAgICAgICAgICAgICJwbGFuX3N0YXR1cyI6IDAsICAjIFN1Y2Nlc3MKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDYWxsIF9wbGFuX2ZpbmlzaGVkIG9uIGxlYXZpbmcgd2F5cG9pbnQKICAgICAgICByZXN1bHQgPSBjdXJyZW50X3dheXBvaW50Ll9wbGFuX2ZpbmlzaGVkKHBsYW5fbG9nKQoKICAgICAgICAjIFNob3VsZCByZXR1cm4gVHJ1ZQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQsICJTaG91bGQgcmV0dXJuIFRydWUiKQogICAgICAgICMgTGVhdmluZyB3YXlwb2ludCBzdGF0ZSBzaG91bGQgYmUgc2V0IHRvIHJlYWR5CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY3VycmVudF93YXlwb2ludC5zdGF0ZSwKICAgICAgICAgICAgInJlYWR5IiwKICAgICAgICAgICAgIkxlYXZpbmcgd2F5cG9pbnQgc3RhdGUgc2hvdWxkIGJlIHNldCB0byByZWFkeSIsCiAgICAgICAgKQogICAgICAgICMgRGVzdGluYXRpb24gd2F5cG9pbnQgc2hvdWxkIGhhdmUgX2Fycml2ZSgpIGNhbGxlZAogICAgICAgICMgKHN0YXRlIHNob3VsZCBiZSBjdXJyZW50IGlmIG5vIHBsYW5fYXJyaXZlX2lkKQogICAgICAgICMgU2luY2Ugd2F5cG9pbnRfdGVtcGxhdGUgaGFzIG5vIHBsYW5fYXJyaXZlX2lkIGJ5IGRlZmF1bHQsCiAgICAgICAgIyBfYXJyaXZlKCkgc2V0cyBzdGF0ZSB0byBjdXJyZW50CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgZGVzdGluYXRpb25fd2F5cG9pbnQuc3RhdGUsCiAgICAgICAgICAgICJjdXJyZW50IiwKICAgICAgICAgICAgIkRlc3RpbmF0aW9uIHdheXBvaW50IHNob3VsZCBoYXZlIF9hcnJpdmUoKSBjYWxsZWQiLAogICAgICAgICkKICAgICAgICAjIERlc3RpbmF0aW9uIHdheXBvaW50IHNob3VsZCBiZSBzZXQgYXMgY3VycmVudCB3YXlwb2ludAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNlbGYuamV0X3Rlc3Qud2F5cG9pbnRfaWQuaWQsCiAgICAgICAgICAgIGRlc3RpbmF0aW9uX3dheXBvaW50LmlkLAogICAgICAgICAgICAiRGVzdGluYXRpb24gd2F5cG9pbnQgc2hvdWxkIGJlIHNldCBhcyBjdXJyZW50IHdheXBvaW50IgogICAgICAgICAgICAiIGFmdGVyIGxlYXZpbmcgY29tcGxldGVzIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcGxhbl9maW5pc2hlZF9kZWxldGluZ19zdWNjZXNzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgX3BsYW5fZmluaXNoZWQgd2hlbiB3YXlwb2ludCBpcyBpbiBkZWxldGluZyBzdGF0ZSBhbmQgcGxhbiBzdWNjZWVkcwogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IHRlbXBsYXRlIHdpdGggcGxhbl9kZWxldGVfaWQKICAgICAgICB3YXlwb2ludF90ZW1wbGF0ZSA9IHNlbGYuSmV0V2F5cG9pbnRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgVGVtcGxhdGUgV2l0aCBEZWxldGUgUGxhbiIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJwbGFuX2RlbGV0ZV9pZCI6IHNlbGYucGxhbl9zdWNjZXNzLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCBhbmQgc2V0IGl0IGFzIGN1cnJlbnQKICAgICAgICB3YXlwb2ludCA9IHNlbGYuSmV0V2F5cG9pbnQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFdheXBvaW50IERlbGV0aW5nIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogd2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAicmVhZHkiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYuamV0X3Rlc3Qud2F5cG9pbnRfaWQgPSB3YXlwb2ludC5pZAoKICAgICAgICAjIFNldCB3YXlwb2ludCB0byBkZWxldGluZyBzdGF0ZQogICAgICAgICMgcmVhZG9ubHk9VHJ1ZSBvbmx5IGFmZmVjdHMgVUksIGNhbiBiZSB3cml0dGVuIHByb2dyYW1tYXRpY2FsbHkKICAgICAgICB3YXlwb2ludC53cml0ZSh7InN0YXRlIjogImRlbGV0aW5nIn0pCgogICAgICAgICMgQ3JlYXRlIHBsYW4gbG9nIHdpdGggc3VjY2VzcyBzdGF0dXMKICAgICAgICBwbGFuX2xvZyA9IHNlbGYuUGxhbkxvZy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLmpldF90ZXN0LnNlcnZlcl9pZC5pZCwKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogc2VsZi5wbGFuX3N1Y2Nlc3MuaWQsCiAgICAgICAgICAgICAgICAicGxhbl9zdGF0dXMiOiAwLCAgIyBTdWNjZXNzCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ2FsbCBfcGxhbl9maW5pc2hlZAogICAgICAgIHJlc3VsdCA9IHdheXBvaW50Ll9wbGFuX2ZpbmlzaGVkKHBsYW5fbG9nKQoKICAgICAgICAjIFNob3VsZCByZXR1cm4gVHJ1ZQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQsICJTaG91bGQgcmV0dXJuIFRydWUiKQogICAgICAgICMgV2F5cG9pbnQgc2hvdWxkIGJlIHVubGlua2VkIChkZWxldGVkKQogICAgICAgICMgU3RhdGUgaXMgc2V0IHRvICJkZWxldGVkIiBiZWZvcmUgdW5saW5rCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgKICAgICAgICAgICAgd2F5cG9pbnQuZXhpc3RzKCksCiAgICAgICAgICAgICJXYXlwb2ludCBzaG91bGQgYmUgdW5saW5rZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBkZWxldGUgcGxhbiIsCiAgICAgICAgKQogICAgICAgICMgSmV0IHdheXBvaW50X2lkIHNob3VsZCBiZSBzZXQgdG8gRmFsc2UKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LndheXBvaW50X2lkLAogICAgICAgICAgICAiSmV0IHdheXBvaW50X2lkIHNob3VsZCBiZSBzZXQgdG8gRmFsc2UgYWZ0ZXIgc3VjY2Vzc2Z1bCBkZWxldGUiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9wbGFuX2ZpbmlzaGVkX2Vycm9yKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgX3BsYW5fZmluaXNoZWQgd2hlbiBwbGFuIGZhaWxzIChwbGFuX3N0YXR1cyAhPSAwKQogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IGluIHByZXBhcmluZyBzdGF0ZSAoc2ltdWxhdGluZyBhc3luYyBwbGFuIGV4ZWN1dGlvbikKICAgICAgICB3YXlwb2ludCA9IHNlbGYuSmV0V2F5cG9pbnQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFdheXBvaW50IFByZXBhcmluZyIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHNlbGYud2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAicHJlcGFyaW5nIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBvcmlnaW5hbF93YXlwb2ludF9pZCA9ICgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC53YXlwb2ludF9pZC5pZCBpZiBzZWxmLmpldF90ZXN0LndheXBvaW50X2lkIGVsc2UgRmFsc2UKICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHBsYW4gbG9nIHdpdGggZXJyb3Igc3RhdHVzCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLlBsYW5Mb2cuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5qZXRfdGVzdC5zZXJ2ZXJfaWQuaWQsCiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IHNlbGYucGxhbl9lcnJvci5pZCwKICAgICAgICAgICAgICAgICJwbGFuX3N0YXR1cyI6IDEsICAjIEVycm9yCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ2FsbCBfcGxhbl9maW5pc2hlZAogICAgICAgIHdpdGggbXV0ZV9sb2dnZXIoCiAgICAgICAgICAgICJvZG9vLmFkZG9ucy5jZXRtaXhfdG93ZXJfc2VydmVyLm1vZGVscy5jeF90b3dlcl9qZXRfd2F5cG9pbnQiCiAgICAgICAgKToKICAgICAgICAgICAgcmVzdWx0ID0gd2F5cG9pbnQuX3BsYW5fZmluaXNoZWQocGxhbl9sb2cpCgogICAgICAgICMgU2hvdWxkIHJldHVybiBUcnVlCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdCwgIlNob3VsZCByZXR1cm4gVHJ1ZSIpCiAgICAgICAgIyBTdGF0ZSBzaG91bGQgYmUgc2V0IHRvIGVycm9yCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgd2F5cG9pbnQuc3RhdGUsCiAgICAgICAgICAgICJlcnJvciIsCiAgICAgICAgICAgICJTdGF0ZSBzaG91bGQgYmUgc2V0IHRvIGVycm9yIGFmdGVyIGZhaWxlZCBwbGFuIGNvbXBsZXRpb24iLAogICAgICAgICkKICAgICAgICAjIFdheXBvaW50IHNob3VsZCBub3QgYmUgc2V0IGFzIGN1cnJlbnQgd2F5cG9pbnQKICAgICAgICBpZiBvcmlnaW5hbF93YXlwb2ludF9pZDoKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIHNlbGYuamV0X3Rlc3Qud2F5cG9pbnRfaWQuaWQsCiAgICAgICAgICAgICAgICBvcmlnaW5hbF93YXlwb2ludF9pZCwKICAgICAgICAgICAgICAgICJDdXJyZW50IHdheXBvaW50IHNob3VsZCBub3QgY2hhbmdlIG9uIGVycm9yIiwKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgICAgICBzZWxmLmpldF90ZXN0LndheXBvaW50X2lkLAogICAgICAgICAgICAgICAgIkN1cnJlbnQgd2F5cG9pbnQgc2hvdWxkIHJlbWFpbiBGYWxzZSBvbiBlcnJvciIsCiAgICAgICAgICAgICkKCiAgICBkZWYgdGVzdF9wbGFuX2ZpbmlzaGVkX2Vycm9yX2Fycml2aW5nKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgX3BsYW5fZmluaXNoZWQgd2hlbiB3YXlwb2ludCBpcyBpbiBhcnJpdmluZyBzdGF0ZSBhbmQgcGxhbiBmYWlscwogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IGluIGFycml2aW5nIHN0YXRlCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCBBcnJpdmluZyIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHNlbGYud2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAiYXJyaXZpbmciLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBwbGFuIGxvZyB3aXRoIGVycm9yIHN0YXR1cwogICAgICAgIHBsYW5fbG9nID0gc2VsZi5QbGFuTG9nLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuamV0X3Rlc3Quc2VydmVyX2lkLmlkLAogICAgICAgICAgICAgICAgInBsYW5faWQiOiBzZWxmLnBsYW5fZXJyb3IuaWQsCiAgICAgICAgICAgICAgICAicGxhbl9zdGF0dXMiOiAxLCAgIyBFcnJvcgogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENhbGwgX3BsYW5fZmluaXNoZWQKICAgICAgICB3aXRoIG11dGVfbG9nZ2VyKAogICAgICAgICAgICAib2Rvby5hZGRvbnMuY2V0bWl4X3Rvd2VyX3NlcnZlci5tb2RlbHMuY3hfdG93ZXJfamV0X3dheXBvaW50IgogICAgICAgICk6CiAgICAgICAgICAgIHJlc3VsdCA9IHdheXBvaW50Ll9wbGFuX2ZpbmlzaGVkKHBsYW5fbG9nKQoKICAgICAgICAjIFNob3VsZCByZXR1cm4gVHJ1ZQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQsICJTaG91bGQgcmV0dXJuIFRydWUiKQogICAgICAgICMgU3RhdGUgc2hvdWxkIGJlIHNldCB0byBlcnJvcgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHdheXBvaW50LnN0YXRlLAogICAgICAgICAgICAiZXJyb3IiLAogICAgICAgICAgICAiU3RhdGUgc2hvdWxkIGJlIHNldCB0byBlcnJvciBhZnRlciBmYWlsZWQgcGxhbiBjb21wbGV0aW9uIiwKICAgICAgICApCiAgICAgICAgIyBXYXlwb2ludCBzaG91bGQgbm90IGJlIHNldCBhcyBjdXJyZW50IHdheXBvaW50IG9uIGVycm9yCiAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC53YXlwb2ludF9pZC5pZCBpZiBzZWxmLmpldF90ZXN0LndheXBvaW50X2lkIGVsc2UgRmFsc2UsCiAgICAgICAgICAgIHdheXBvaW50LmlkLAogICAgICAgICAgICAiV2F5cG9pbnQgc2hvdWxkIG5vdCBiZSBzZXQgYXMgY3VycmVudCB3YXlwb2ludCBhZnRlciBmYWlsZWQgYXJyaXZlIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfZ2V0X2N1c3RvbV92YXJpYWJsZV92YWx1ZXNfd2l0aF9tZXRhZGF0YShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IF9nZXRfY3VzdG9tX3ZhcmlhYmxlX3ZhbHVlcyB3aXRoIG1ldGFkYXRhCiAgICAgICAgIiIiCiAgICAgICAgIyBTZXQgdGVtcGxhdGUgdG8gdXNlIHN1Y2Nlc3MgcGxhbgogICAgICAgIHNlbGYud2F5cG9pbnRfdGVtcGxhdGUucGxhbl9jcmVhdGVfaWQgPSBzZWxmLnBsYW5fc3VjY2Vzcy5pZAoKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCB3aXRoIG1ldGFkYXRhCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCBXaXRoIE1ldGFkYXRhIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJkcmFmdCIsCiAgICAgICAgICAgICAgICAibWV0YWRhdGEiOiB7ImtleTEiOiAidmFsdWUxIiwgImtleTIiOiAidmFsdWUyIiwgImVudiI6ICJwcm9kdWN0aW9uIn0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ2FsbCBwcmVwYXJlIHRvIHRyaWdnZXIgZmxpZ2h0IHBsYW4KICAgICAgICB3YXlwb2ludC5wcmVwYXJlKCkKCiAgICAgICAgIyBGaW5kIHRoZSBwbGFuIGxvZyBjcmVhdGVkIGJ5IHByZXBhcmUKICAgICAgICBwbGFuX2xvZyA9IHNlbGYuUGxhbkxvZy5zZWFyY2goCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICgid2F5cG9pbnRfaWQiLCAiPSIsIHdheXBvaW50LmlkKSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgb3JkZXI9ImNyZWF0ZV9kYXRlIGRlc2MiLAogICAgICAgICAgICBsaW1pdD0xLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydFRydWUocGxhbl9sb2csICJQbGFuIGxvZyBzaG91bGQgYmUgY3JlYXRlZCIpCgogICAgICAgICMgQ2hlY2sgY3VzdG9tIHZhcmlhYmxlIHZhbHVlcyBpbiBwbGFuIGxvZwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHBsYW5fbG9nLnZhcmlhYmxlX3ZhbHVlcy5nZXQoIl9fd2F5cG9pbnQiKSwKICAgICAgICAgICAgd2F5cG9pbnQucmVmZXJlbmNlLAogICAgICAgICAgICAiX193YXlwb2ludCBzaG91bGQgbWF0Y2ggd2F5cG9pbnQgcmVmZXJlbmNlIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcGxhbl9sb2cudmFyaWFibGVfdmFsdWVzLmdldCgiX193YXlwb2ludF90eXBlIiksCiAgICAgICAgICAgIHNlbGYud2F5cG9pbnRfdGVtcGxhdGUucmVmZXJlbmNlLAogICAgICAgICAgICAiX193YXlwb2ludF90eXBlIHNob3VsZCBtYXRjaCB3YXlwb2ludCB0ZW1wbGF0ZSByZWZlcmVuY2UiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBwbGFuX2xvZy52YXJpYWJsZV92YWx1ZXMuZ2V0KCJfX3dheXBvaW50X3N0YXRlIiksCiAgICAgICAgICAgICJwcmVwYXJpbmciLAogICAgICAgICAgICAiX193YXlwb2ludF9zdGF0ZSBzaG91bGQgYmUgcHJlcGFyaW5nIiwKICAgICAgICApCiAgICAgICAgIyBDaGVjayBtZXRhZGF0YSBrZXlzCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcGxhbl9sb2cudmFyaWFibGVfdmFsdWVzLmdldCgiX193YXlwb2ludF9rZXkxIiksCiAgICAgICAgICAgICJ2YWx1ZTEiLAogICAgICAgICAgICAiX193YXlwb2ludF9rZXkxIHNob3VsZCBtYXRjaCBtZXRhZGF0YSB2YWx1ZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHBsYW5fbG9nLnZhcmlhYmxlX3ZhbHVlcy5nZXQoIl9fd2F5cG9pbnRfa2V5MiIpLAogICAgICAgICAgICAidmFsdWUyIiwKICAgICAgICAgICAgIl9fd2F5cG9pbnRfa2V5MiBzaG91bGQgbWF0Y2ggbWV0YWRhdGEgdmFsdWUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBwbGFuX2xvZy52YXJpYWJsZV92YWx1ZXMuZ2V0KCJfX3dheXBvaW50X2VudiIpLAogICAgICAgICAgICAicHJvZHVjdGlvbiIsCiAgICAgICAgICAgICJfX3dheXBvaW50X2VudiBzaG91bGQgbWF0Y2ggbWV0YWRhdGEgdmFsdWUiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9nZXRfY3VzdG9tX3ZhcmlhYmxlX3ZhbHVlc193aXRob3V0X21ldGFkYXRhKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgX2dldF9jdXN0b21fdmFyaWFibGVfdmFsdWVzIHdpdGhvdXQgbWV0YWRhdGEKICAgICAgICAiIiIKICAgICAgICAjIFNldCB0ZW1wbGF0ZSB0byB1c2Ugc3VjY2VzcyBwbGFuCiAgICAgICAgc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5wbGFuX2NyZWF0ZV9pZCA9IHNlbGYucGxhbl9zdWNjZXNzLmlkCgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IHdpdGhvdXQgbWV0YWRhdGEKICAgICAgICB3YXlwb2ludCA9IHNlbGYuSmV0V2F5cG9pbnQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFdheXBvaW50IFdpdGhvdXQgTWV0YWRhdGEiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImRyYWZ0IiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDYWxsIHByZXBhcmUgdG8gdHJpZ2dlciBmbGlnaHQgcGxhbgogICAgICAgIHdheXBvaW50LnByZXBhcmUoKQoKICAgICAgICAjIEZpbmQgdGhlIHBsYW4gbG9nIGNyZWF0ZWQgYnkgcHJlcGFyZQogICAgICAgIHBsYW5fbG9nID0gc2VsZi5QbGFuTG9nLnNlYXJjaCgKICAgICAgICAgICAgWygid2F5cG9pbnRfaWQiLCAiPSIsIHdheXBvaW50LmlkKV0sCiAgICAgICAgICAgIG9yZGVyPSJjcmVhdGVfZGF0ZSBkZXNjIiwKICAgICAgICAgICAgbGltaXQ9MSwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBsYW5fbG9nLCAiUGxhbiBsb2cgc2hvdWxkIGJlIGNyZWF0ZWQiKQoKICAgICAgICAjIENoZWNrIGJhc2ljIGN1c3RvbSB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBwbGFuX2xvZy52YXJpYWJsZV92YWx1ZXMuZ2V0KCJfX3dheXBvaW50IiksCiAgICAgICAgICAgIHdheXBvaW50LnJlZmVyZW5jZSwKICAgICAgICAgICAgIl9fd2F5cG9pbnQgc2hvdWxkIG1hdGNoIHdheXBvaW50IHJlZmVyZW5jZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHBsYW5fbG9nLnZhcmlhYmxlX3ZhbHVlcy5nZXQoIl9fd2F5cG9pbnRfdHlwZSIpLAogICAgICAgICAgICBzZWxmLndheXBvaW50X3RlbXBsYXRlLnJlZmVyZW5jZSwKICAgICAgICAgICAgIl9fd2F5cG9pbnRfdHlwZSBzaG91bGQgbWF0Y2ggd2F5cG9pbnQgdGVtcGxhdGUgcmVmZXJlbmNlIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcGxhbl9sb2cudmFyaWFibGVfdmFsdWVzLmdldCgiX193YXlwb2ludF9zdGF0ZSIpLAogICAgICAgICAgICAicHJlcGFyaW5nIiwKICAgICAgICAgICAgIl9fd2F5cG9pbnRfc3RhdGUgc2hvdWxkIGJlIHByZXBhcmluZyIsCiAgICAgICAgKQogICAgICAgICMgQ2hlY2sgdGhhdCBtZXRhZGF0YSBrZXlzIGFyZSBub3QgcHJlc2VudAogICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oCiAgICAgICAgICAgICJfX3dheXBvaW50X2tleTEiLAogICAgICAgICAgICBwbGFuX2xvZy52YXJpYWJsZV92YWx1ZXMsCiAgICAgICAgICAgICJNZXRhZGF0YSBrZXlzIHNob3VsZCBub3QgYmUgcHJlc2VudCB3aGVuIG1ldGFkYXRhIGlzIGVtcHR5IiwKICAgICAgICApCgogICAgZGVmIHRlc3RfbGVhdmVfZnJvbV9jdXJyZW50X3N0YXRlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgX2xlYXZlKCkgd2hlbiB3YXlwb2ludCBpcyBpbiBjdXJyZW50IHN0YXRlCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgd2F5cG9pbnQgaW4gY3VycmVudCBzdGF0ZQogICAgICAgIHdheXBvaW50ID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgV2F5cG9pbnQgQ3VycmVudCIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHNlbGYud2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAiY3VycmVudCIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgc2VsZi5qZXRfdGVzdC53YXlwb2ludF9pZCA9IHdheXBvaW50LmlkCgogICAgICAgICMgQ2FsbCBfbGVhdmUKICAgICAgICByZXN1bHQgPSB3YXlwb2ludC5fbGVhdmUoKQoKICAgICAgICAjIFNob3VsZCByZXR1cm4gVHJ1ZQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQsICJTaG91bGQgcmV0dXJuIFRydWUiKQogICAgICAgICMgU3RhdGUgc2hvdWxkIGJlIHNldCB0byByZWFkeQogICAgICAgICMgKF9sZWF2ZSgpIGNvbXBsZXRlcyBpbW1lZGlhdGVseSB3aGVuIG5vIHBsYW5fbGVhdmVfaWQgaW4gdGVzdHMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgd2F5cG9pbnQuc3RhdGUsCiAgICAgICAgICAgICJyZWFkeSIsCiAgICAgICAgICAgICJTdGF0ZSBzaG91bGQgYmUgc2V0IHRvIHJlYWR5IGFmdGVyIGxlYXZpbmcgY29tcGxldGVzIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfZmx5X3RvX2Zyb21fY3VycmVudF93YXlwb2ludChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IGZseV90bygpIHdoZW4gcHJldmlvdXMgd2F5cG9pbnQgaXMgaW4gY3VycmVudCBzdGF0ZQogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIGN1cnJlbnQgd2F5cG9pbnQKICAgICAgICBjdXJyZW50X3dheXBvaW50ID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkN1cnJlbnQgV2F5cG9pbnQiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImN1cnJlbnQiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYuamV0X3Rlc3Qud2F5cG9pbnRfaWQgPSBjdXJyZW50X3dheXBvaW50LmlkCgogICAgICAgICMgQ3JlYXRlIGRlc3RpbmF0aW9uIHdheXBvaW50CiAgICAgICAgZGVzdGluYXRpb25fd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiRGVzdGluYXRpb24gV2F5cG9pbnQiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogInJlYWR5IiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDYWxsIGZseV90byBvbiBkZXN0aW5hdGlvbiB3YXlwb2ludAogICAgICAgIHJlc3VsdCA9IGRlc3RpbmF0aW9uX3dheXBvaW50LmZseV90bygpCgogICAgICAgICMgU2hvdWxkIHJldHVybiBUcnVlCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdCwgIlNob3VsZCByZXR1cm4gVHJ1ZSIpCiAgICAgICAgIyBDdXJyZW50IHdheXBvaW50IHNob3VsZCBiZSBpbiByZWFkeSBzdGF0ZQogICAgICAgICMgKF9sZWF2ZSgpIGNvbXBsZXRlcyBpbW1lZGlhdGVseSB3aGVuIG5vIHBsYW5fbGVhdmVfaWQgaW4gdGVzdHMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY3VycmVudF93YXlwb2ludC5zdGF0ZSwKICAgICAgICAgICAgInJlYWR5IiwKICAgICAgICAgICAgIkN1cnJlbnQgd2F5cG9pbnQgc2hvdWxkIGJlIGluIHJlYWR5IHN0YXRlIGFmdGVyIGxlYXZpbmcgY29tcGxldGVzIiwKICAgICAgICApCiAgICAgICAgIyBEZXN0aW5hdGlvbiB3YXlwb2ludCBzaG91bGQgYmUgaW4gY3VycmVudCBzdGF0ZQogICAgICAgICMgKF9hcnJpdmUoKSBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgd2hlbiBubyBwbGFuX2Fycml2ZV9pZCBpbiB0ZXN0cykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBkZXN0aW5hdGlvbl93YXlwb2ludC5zdGF0ZSwKICAgICAgICAgICAgImN1cnJlbnQiLAogICAgICAgICAgICAiRGVzdGluYXRpb24gd2F5cG9pbnQgc2hvdWxkIGJlIGluIGN1cnJlbnQgc3RhdGUgYWZ0ZXIgYXJyaXZpbmciLAogICAgICAgICkKICAgICAgICAjIERlc3RpbmF0aW9uIHdheXBvaW50IHNob3VsZCBiZSBzZXQgYXMgY3VycmVudCB3YXlwb2ludAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNlbGYuamV0X3Rlc3Qud2F5cG9pbnRfaWQuaWQsCiAgICAgICAgICAgIGRlc3RpbmF0aW9uX3dheXBvaW50LmlkLAogICAgICAgICAgICAiRGVzdGluYXRpb24gd2F5cG9pbnQgc2hvdWxkIGJlIHNldCBhcyBjdXJyZW50IHdheXBvaW50IiwKICAgICAgICApCgogICAgZGVmIHRlc3RfZmx5X3RvX2xlYXZlX2ZhaWx1cmVfZG9lc19ub3Rfa2VlcF9kZXN0aW5hdGlvbl9hcnJpdmluZyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZWdyZXNzaW9uOiBpZiBzb3VyY2UgbGVhdmUgcGxhbiBmYWlscyBkdXJpbmcgZmx5X3RvKCksCiAgICAgICAgZGVzdGluYXRpb24gbXVzdCBub3Qgc3RheSBpbiBhcnJpdmluZy4KICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSB0ZW1wbGF0ZSB3aXRoIGZhaWxpbmcgbGVhdmUgcGxhbi4KICAgICAgICB3YXlwb2ludF90ZW1wbGF0ZV93aXRoX2xlYXZlX2Vycm9yID0gc2VsZi5KZXRXYXlwb2ludFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVtcGxhdGUgTGVhdmUgRXJyb3IiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAicGxhbl9sZWF2ZV9pZCI6IHNlbGYucGxhbl9lcnJvci5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgY3VycmVudCB3YXlwb2ludCB0aGF0IHdpbGwgZmFpbCB3aGlsZSBsZWF2aW5nLgogICAgICAgIGN1cnJlbnRfd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiQ3VycmVudCBXYXlwb2ludCBGYWlsaW5nIExlYXZlIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogd2F5cG9pbnRfdGVtcGxhdGVfd2l0aF9sZWF2ZV9lcnJvci5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJjdXJyZW50IiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBzZWxmLmpldF90ZXN0LndheXBvaW50X2lkID0gY3VycmVudF93YXlwb2ludC5pZAoKICAgICAgICAjIENyZWF0ZSBkZXN0aW5hdGlvbiB3YXlwb2ludCAodGFyZ2V0IG9mIGZseV90bykuCiAgICAgICAgZGVzdGluYXRpb25fd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiRGVzdGluYXRpb24gV2F5cG9pbnQgU3R1Y2sgQXJyaXZpbmciLAogICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogInJlYWR5IiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBFeGVjdXRlIGZseV90bzsgbGVhdmluZyBmYWlscyBzeW5jaHJvbm91c2x5IGluIHRlc3RzLgogICAgICAgIHdpdGggbXV0ZV9sb2dnZXIoCiAgICAgICAgICAgICJvZG9vLmFkZG9ucy5jZXRtaXhfdG93ZXJfc2VydmVyLm1vZGVscy5jeF90b3dlcl9qZXRfd2F5cG9pbnQiCiAgICAgICAgKToKICAgICAgICAgICAgcmVzdWx0ID0gZGVzdGluYXRpb25fd2F5cG9pbnQuZmx5X3RvKCkKCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHQsICJmbHlfdG8oKSBzaG91bGQgcmV0dXJuIEZhbHNlIHdoZW4gbGVhdmUgZmFpbHMiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGN1cnJlbnRfd2F5cG9pbnQuc3RhdGUsCiAgICAgICAgICAgICJlcnJvciIsCiAgICAgICAgICAgICJTb3VyY2Ugd2F5cG9pbnQgc2hvdWxkIGJlY29tZSBlcnJvciBhZnRlciBmYWlsZWQgbGVhdmUgcGxhbiIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCiAgICAgICAgICAgIGRlc3RpbmF0aW9uX3dheXBvaW50LnN0YXRlLAogICAgICAgICAgICAiYXJyaXZpbmciLAogICAgICAgICAgICAiRGVzdGluYXRpb24gd2F5cG9pbnQgbXVzdCBiZSByZXZlcnRlZCBmcm9tIGFycml2aW5nIHdoZW4gbGVhdmUgZmFpbHMiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICBkZXN0aW5hdGlvbl93YXlwb2ludC5pc19kZXN0aW5hdGlvbiwKICAgICAgICAgICAgIkRlc3RpbmF0aW9uIGZsYWcgbXVzdCBiZSBjbGVhcmVkIHdoZW4gbGVhdmUgZmFpbHMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF91bmxpbmtfY3VycmVudF9zdGF0ZV9yYWlzZXNfZXJyb3Ioc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB1bmxpbmsoKSB3aGVuIHdheXBvaW50IGlzIGluIGN1cnJlbnQgc3RhdGUgcmFpc2VzIFZhbGlkYXRpb25FcnJvcgogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IGluIGN1cnJlbnQgc3RhdGUKICAgICAgICB3YXlwb2ludCA9IHNlbGYuSmV0V2F5cG9pbnQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFdheXBvaW50IEN1cnJlbnQiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImN1cnJlbnQiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYuamV0X3Rlc3Qud2F5cG9pbnRfaWQgPSB3YXlwb2ludC5pZAoKICAgICAgICAjIFNob3VsZCByYWlzZSBWYWxpZGF0aW9uRXJyb3Igd2hlbiB0cnlpbmcgdG8gZGVsZXRlCgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsaWRhdGlvbkVycm9yKSBhcyBjb250ZXh0OgogICAgICAgICAgICB3YXlwb2ludC51bmxpbmsoKQoKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICAiY3VycmVudCB3YXlwb2ludCIsCiAgICAgICAgICAgIHN0cihjb250ZXh0LmV4Y2VwdGlvbiksCiAgICAgICAgICAgICJTaG91bGQgcmFpc2UgVmFsaWRhdGlvbkVycm9yIGFib3V0IGN1cnJlbnQgd2F5cG9pbnQiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF91bmxpbmtfY3VycmVudF9zdGF0ZV93aXRoX25vX3JhaXNlX2NvbnRleHQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB1bmxpbmsoKSB3aGVuIHdheXBvaW50IGlzIGluIGN1cnJlbnQgc3RhdGUKICAgICAgICB3aXRoICd3YXlwb2ludF9ub19yYWlzZV9vbl9kZWxldGUnIGNvbnRleHQuCiAgICAgICAgVGhlIGNvbnRleHQgcHJldmVudHMgZXhjZXB0aW9uIGJ1dCB3YXlwb2ludCBpcyBub3QgZGVsZXRlZC4KICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCBpbiBjdXJyZW50IHN0YXRlCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCBDdXJyZW50IiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJjdXJyZW50IiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBzZWxmLmpldF90ZXN0LndheXBvaW50X2lkID0gd2F5cG9pbnQuaWQKICAgICAgICB3YXlwb2ludF9pZCA9IHdheXBvaW50LmlkCgogICAgICAgICMgTXV0ZSBsb2dnZXIgZXJyb3IgZm9yIHRoaXMgdGVzdAogICAgICAgIHdpdGggbXV0ZV9sb2dnZXIoCiAgICAgICAgICAgICJvZG9vLmFkZG9ucy5jZXRtaXhfdG93ZXJfc2VydmVyLm1vZGVscy5jeF90b3dlcl9qZXRfd2F5cG9pbnQiCiAgICAgICAgKToKICAgICAgICAgICAgIyBTaG91bGQgbm90IHJhaXNlIGVycm9yIHdpdGggd2F5cG9pbnRfbm9fcmFpc2Vfb25fZGVsZXRlIGNvbnRleHQKICAgICAgICAgICAgd2F5cG9pbnQud2l0aF9jb250ZXh0KHdheXBvaW50X25vX3JhaXNlX29uX2RlbGV0ZT1UcnVlKS51bmxpbmsoKQoKICAgICAgICAjIFdheXBvaW50IHNob3VsZCBzdGlsbCBleGlzdCAobm90IGRlbGV0ZWQpCiAgICAgICAgIyBUaGUgY29udGV4dCBvbmx5IHByZXZlbnRzIGV4Y2VwdGlvbiwgYnV0IGRvZXNuJ3QgYWxsb3cgZGVsZXRpb24KICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIHdheXBvaW50LmV4aXN0cygpLAogICAgICAgICAgICAiV2F5cG9pbnQgc2hvdWxkIHN0aWxsIGV4aXN0IC0gY29udGV4dCBvbmx5IHByZXZlbnRzIGV4Y2VwdGlvbiIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHdheXBvaW50LmlkLAogICAgICAgICAgICB3YXlwb2ludF9pZCwKICAgICAgICAgICAgIldheXBvaW50IElEIHNob3VsZCByZW1haW4gdGhlIHNhbWUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICB3YXlwb2ludC5zdGF0ZSwKICAgICAgICAgICAgImN1cnJlbnQiLAogICAgICAgICAgICAiV2F5cG9pbnQgc3RhdGUgc2hvdWxkIHJlbWFpbiBjdXJyZW50IiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcHJlcGFyZV9zYXZlc192YXJpYWJsZV92YWx1ZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IHByZXBhcmUoKSBzYXZlcyB2YXJpYWJsZSB2YWx1ZXMgd2hlbiBzdGF0ZSBjaGFuZ2VzIHRvIHJlYWR5CiAgICAgICAgIiIiCiAgICAgICAgIyBTZXQgc29tZSB2YXJpYWJsZSB2YWx1ZXMgb24gdGhlIGpldAogICAgICAgIHNlbGYuamV0X3Rlc3Quc2V0X3ZhcmlhYmxlX3ZhbHVlKCJ0ZXN0X3Zhcl8xIiwgInZhbHVlMSIpCiAgICAgICAgc2VsZi5qZXRfdGVzdC5zZXRfdmFyaWFibGVfdmFsdWUoInRlc3RfdmFyXzIiLCAidmFsdWUyIikKCiAgICAgICAgIyBDcmVhdGUgd2F5cG9pbnQgaW4gZHJhZnQgc3RhdGUKICAgICAgICB3YXlwb2ludCA9IHNlbGYuSmV0V2F5cG9pbnQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFdheXBvaW50IiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJkcmFmdCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgRW5zdXJlIHdheXBvaW50IGhhcyBubyBwbGFuX2NyZWF0ZV9pZCAoc28gaXQgZ29lcyBkaXJlY3RseSB0byByZWFkeSkKICAgICAgICB3YXlwb2ludC53YXlwb2ludF90ZW1wbGF0ZV9pZC5wbGFuX2NyZWF0ZV9pZCA9IEZhbHNlCgogICAgICAgICMgQ2FsbCBwcmVwYXJlCiAgICAgICAgd2F5cG9pbnQucHJlcGFyZSgpCgogICAgICAgICMgVmFyaWFibGUgdmFsdWVzIHNob3VsZCBiZSBzYXZlZCBpbiB3YXlwb2ludAogICAgICAgIHZhcmlhYmxlX3ZhbHVlcyA9IHdheXBvaW50LnZhcmlhYmxlX3ZhbHVlcyBvciB7fQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHZhcmlhYmxlX3ZhbHVlcy5nZXQoInRlc3RfdmFyXzEiKSwKICAgICAgICAgICAgInZhbHVlMSIsCiAgICAgICAgICAgICJWYXJpYWJsZSB2YWx1ZSBzaG91bGQgYmUgc2F2ZWQgd2hlbiBwcmVwYXJpbmciLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICB2YXJpYWJsZV92YWx1ZXMuZ2V0KCJ0ZXN0X3Zhcl8yIiksCiAgICAgICAgICAgICJ2YWx1ZTIiLAogICAgICAgICAgICAiVmFyaWFibGUgdmFsdWUgc2hvdWxkIGJlIHNhdmVkIHdoZW4gcHJlcGFyaW5nIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfcHJlcGFyZV93aXRoX3BsYW5fc2F2ZXNfdmFyaWFibGVfdmFsdWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdGhhdCBwcmVwYXJlKCkgc2F2ZXMgdmFyaWFibGUgdmFsdWVzIHdoZW4gcGxhbiBjb21wbGV0ZXMKICAgICAgICAiIiIKICAgICAgICAjIFNldCBzb21lIHZhcmlhYmxlIHZhbHVlcyBvbiB0aGUgamV0CiAgICAgICAgc2VsZi5qZXRfdGVzdC5zZXRfdmFyaWFibGVfdmFsdWUoInRlc3RfdmFyXzEiLCAidmFsdWUxIikKICAgICAgICBzZWxmLmpldF90ZXN0LnNldF92YXJpYWJsZV92YWx1ZSgidGVzdF92YXJfMiIsICJ2YWx1ZTIiKQoKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCB0ZW1wbGF0ZSB3aXRoIHBsYW5fY3JlYXRlX2lkCiAgICAgICAgd2F5cG9pbnRfdGVtcGxhdGUgPSBzZWxmLkpldFdheXBvaW50VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgInBsYW5fY3JlYXRlX2lkIjogc2VsZi5wbGFuX3N1Y2Nlc3MuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IGluIGRyYWZ0IHN0YXRlCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHdheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImRyYWZ0IiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDYWxsIHByZXBhcmUgKHBsYW4gZXhlY3V0ZXMgc3luY2hyb25vdXNseSBpbiB0ZXN0cykKICAgICAgICB3YXlwb2ludC5wcmVwYXJlKCkKCiAgICAgICAgIyBWYXJpYWJsZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIHdheXBvaW50IGFmdGVyIHBsYW4gY29tcGxldGVzCiAgICAgICAgdmFyaWFibGVfdmFsdWVzID0gd2F5cG9pbnQudmFyaWFibGVfdmFsdWVzIG9yIHt9CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgdmFyaWFibGVfdmFsdWVzLmdldCgidGVzdF92YXJfMSIpLAogICAgICAgICAgICAidmFsdWUxIiwKICAgICAgICAgICAgIlZhcmlhYmxlIHZhbHVlIHNob3VsZCBiZSBzYXZlZCB3aGVuIHByZXBhcmluZyBjb21wbGV0ZXMiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICB2YXJpYWJsZV92YWx1ZXMuZ2V0KCJ0ZXN0X3Zhcl8yIiksCiAgICAgICAgICAgICJ2YWx1ZTIiLAogICAgICAgICAgICAiVmFyaWFibGUgdmFsdWUgc2hvdWxkIGJlIHNhdmVkIHdoZW4gcHJlcGFyaW5nIGNvbXBsZXRlcyIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2xlYXZlX3NhdmVzX3ZhcmlhYmxlX3ZhbHVlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgX2xlYXZlKCkgc2F2ZXMgdmFyaWFibGUgdmFsdWVzIHdoZW4gc3RhdGUgY2hhbmdlcyB0byByZWFkeQogICAgICAgICIiIgogICAgICAgICMgU2V0IHNvbWUgdmFyaWFibGUgdmFsdWVzIG9uIHRoZSBqZXQKICAgICAgICBzZWxmLmpldF90ZXN0LnNldF92YXJpYWJsZV92YWx1ZSgidGVzdF92YXJfMSIsICJ2YWx1ZTEiKQogICAgICAgIHNlbGYuamV0X3Rlc3Quc2V0X3ZhcmlhYmxlX3ZhbHVlKCJ0ZXN0X3Zhcl8yIiwgInZhbHVlMiIpCgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IGluIGN1cnJlbnQgc3RhdGUKICAgICAgICB3YXlwb2ludCA9IHNlbGYuSmV0V2F5cG9pbnQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFdheXBvaW50IiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJjdXJyZW50IiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBzZWxmLmpldF90ZXN0LndheXBvaW50X2lkID0gd2F5cG9pbnQuaWQKCiAgICAgICAgIyBFbnN1cmUgd2F5cG9pbnQgaGFzIG5vIHBsYW5fbGVhdmVfaWQgKHNvIGl0IGdvZXMgZGlyZWN0bHkgdG8gcmVhZHkpCiAgICAgICAgd2F5cG9pbnQud2F5cG9pbnRfdGVtcGxhdGVfaWQucGxhbl9sZWF2ZV9pZCA9IEZhbHNlCgogICAgICAgICMgQ2FsbCBfbGVhdmUKICAgICAgICB3YXlwb2ludC5fbGVhdmUoKQoKICAgICAgICAjIFZhcmlhYmxlIHZhbHVlcyBzaG91bGQgYmUgc2F2ZWQgaW4gd2F5cG9pbnQKICAgICAgICB2YXJpYWJsZV92YWx1ZXMgPSB3YXlwb2ludC52YXJpYWJsZV92YWx1ZXMgb3Ige30KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICB2YXJpYWJsZV92YWx1ZXMuZ2V0KCJ0ZXN0X3Zhcl8xIiksCiAgICAgICAgICAgICJ2YWx1ZTEiLAogICAgICAgICAgICAiVmFyaWFibGUgdmFsdWUgc2hvdWxkIGJlIHNhdmVkIHdoZW4gbGVhdmluZyIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHZhcmlhYmxlX3ZhbHVlcy5nZXQoInRlc3RfdmFyXzIiKSwKICAgICAgICAgICAgInZhbHVlMiIsCiAgICAgICAgICAgICJWYXJpYWJsZSB2YWx1ZSBzaG91bGQgYmUgc2F2ZWQgd2hlbiBsZWF2aW5nIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfbGVhdmVfd2l0aF9wbGFuX3NhdmVzX3ZhcmlhYmxlX3ZhbHVlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgX2xlYXZlKCkgc2F2ZXMgdmFyaWFibGUgdmFsdWVzIHdoZW4gcGxhbiBjb21wbGV0ZXMKICAgICAgICAiIiIKICAgICAgICAjIFNldCBzb21lIHZhcmlhYmxlIHZhbHVlcyBvbiB0aGUgamV0CiAgICAgICAgc2VsZi5qZXRfdGVzdC5zZXRfdmFyaWFibGVfdmFsdWUoInRlc3RfdmFyXzEiLCAidmFsdWUxIikKICAgICAgICBzZWxmLmpldF90ZXN0LnNldF92YXJpYWJsZV92YWx1ZSgidGVzdF92YXJfMiIsICJ2YWx1ZTIiKQoKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCB0ZW1wbGF0ZSB3aXRoIHBsYW5fbGVhdmVfaWQKICAgICAgICB3YXlwb2ludF90ZW1wbGF0ZSA9IHNlbGYuSmV0V2F5cG9pbnRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAicGxhbl9sZWF2ZV9pZCI6IHNlbGYucGxhbl9zdWNjZXNzLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCBpbiBjdXJyZW50IHN0YXRlCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHdheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImN1cnJlbnQiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYuamV0X3Rlc3Qud2F5cG9pbnRfaWQgPSB3YXlwb2ludC5pZAoKICAgICAgICAjIENhbGwgX2xlYXZlIChwbGFuIGV4ZWN1dGVzIHN5bmNocm9ub3VzbHkgaW4gdGVzdHMpCiAgICAgICAgd2F5cG9pbnQuX2xlYXZlKCkKCiAgICAgICAgIyBWYXJpYWJsZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIHdheXBvaW50IGFmdGVyIHBsYW4gY29tcGxldGVzCiAgICAgICAgdmFyaWFibGVfdmFsdWVzID0gd2F5cG9pbnQudmFyaWFibGVfdmFsdWVzIG9yIHt9CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgdmFyaWFibGVfdmFsdWVzLmdldCgidGVzdF92YXJfMSIpLAogICAgICAgICAgICAidmFsdWUxIiwKICAgICAgICAgICAgIlZhcmlhYmxlIHZhbHVlIHNob3VsZCBiZSBzYXZlZCB3aGVuIGxlYXZpbmcgY29tcGxldGVzIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgdmFyaWFibGVfdmFsdWVzLmdldCgidGVzdF92YXJfMiIpLAogICAgICAgICAgICAidmFsdWUyIiwKICAgICAgICAgICAgIlZhcmlhYmxlIHZhbHVlIHNob3VsZCBiZSBzYXZlZCB3aGVuIGxlYXZpbmcgY29tcGxldGVzIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfZmx5X3RvX3Jlc3RvcmVzX3ZhcmlhYmxlX3ZhbHVlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgZmx5X3RvKCkgcmVzdG9yZXMgdmFyaWFibGUgdmFsdWVzIHdoZW4gc3RhdGUgY2hhbmdlcyB0byBhcnJpdmluZwogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IHdpdGggc2F2ZWQgdmFyaWFibGUgdmFsdWVzCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHNlbGYud2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAicmVhZHkiLAogICAgICAgICAgICAgICAgInZhcmlhYmxlX3ZhbHVlcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGVzdF92YXJfMSI6ICJzYXZlZF92YWx1ZTEiLAogICAgICAgICAgICAgICAgICAgICJ0ZXN0X3Zhcl8yIjogInNhdmVkX3ZhbHVlMiIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFNldCBkaWZmZXJlbnQgdmFsdWVzIG9uIHRoZSBqZXQKICAgICAgICBzZWxmLmpldF90ZXN0LnNldF92YXJpYWJsZV92YWx1ZSgidGVzdF92YXJfMSIsICJjdXJyZW50X3ZhbHVlMSIpCiAgICAgICAgc2VsZi5qZXRfdGVzdC5zZXRfdmFyaWFibGVfdmFsdWUoInRlc3RfdmFyXzIiLCAiY3VycmVudF92YWx1ZTIiKQoKICAgICAgICAjIENhbGwgZmx5X3RvIChubyBwcmV2aW91cyB3YXlwb2ludCkKICAgICAgICB3YXlwb2ludC5mbHlfdG8oKQoKICAgICAgICAjIFZhcmlhYmxlIHZhbHVlcyBzaG91bGQgYmUgcmVzdG9yZWQgZnJvbSB3YXlwb2ludAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNlbGYuamV0X3Rlc3QuZ2V0X3ZhcmlhYmxlX3ZhbHVlKCJ0ZXN0X3Zhcl8xIiksCiAgICAgICAgICAgICJzYXZlZF92YWx1ZTEiLAogICAgICAgICAgICAiVmFyaWFibGUgdmFsdWUgc2hvdWxkIGJlIHJlc3RvcmVkIHdoZW4gZmx5aW5nIHRvIHdheXBvaW50IiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC5nZXRfdmFyaWFibGVfdmFsdWUoInRlc3RfdmFyXzIiKSwKICAgICAgICAgICAgInNhdmVkX3ZhbHVlMiIsCiAgICAgICAgICAgICJWYXJpYWJsZSB2YWx1ZSBzaG91bGQgYmUgcmVzdG9yZWQgd2hlbiBmbHlpbmcgdG8gd2F5cG9pbnQiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9mbHlfdG9fcmVzdG9yZXNfdmFyaWFibGVfdmFsdWVzX3dpdGhfcHJldmlvdXNfd2F5cG9pbnQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IGZseV90bygpIHJlc3RvcmVzIHZhcmlhYmxlIHZhbHVlcwogICAgICAgIGFmdGVyIHByZXZpb3VzIHdheXBvaW50IHNhdmVzIGl0cyB2YWx1ZXMKICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSBwcmV2aW91cyB3YXlwb2ludCBpbiBjdXJyZW50IHN0YXRlCiAgICAgICAgcHJldmlvdXNfd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUHJldmlvdXMgV2F5cG9pbnQiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImN1cnJlbnQiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYuamV0X3Rlc3Qud2F5cG9pbnRfaWQgPSBwcmV2aW91c193YXlwb2ludC5pZAoKICAgICAgICAjIFNldCB2YXJpYWJsZSB2YWx1ZXMgb24gdGhlIGpldAogICAgICAgIHNlbGYuamV0X3Rlc3Quc2V0X3ZhcmlhYmxlX3ZhbHVlKCJ0ZXN0X3Zhcl8xIiwgInByZXZpb3VzX3ZhbHVlMSIpCiAgICAgICAgc2VsZi5qZXRfdGVzdC5zZXRfdmFyaWFibGVfdmFsdWUoInRlc3RfdmFyXzIiLCAicHJldmlvdXNfdmFsdWUyIikKCiAgICAgICAgIyBDcmVhdGUgZGVzdGluYXRpb24gd2F5cG9pbnQgd2l0aCBzYXZlZCB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICBkZXN0aW5hdGlvbl93YXlwb2ludCA9IHNlbGYuSmV0V2F5cG9pbnQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJEZXN0aW5hdGlvbiBXYXlwb2ludCIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHNlbGYud2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAicmVhZHkiLAogICAgICAgICAgICAgICAgInZhcmlhYmxlX3ZhbHVlcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGVzdF92YXJfMSI6ICJkZXN0aW5hdGlvbl92YWx1ZTEiLAogICAgICAgICAgICAgICAgICAgICJ0ZXN0X3Zhcl8yIjogImRlc3RpbmF0aW9uX3ZhbHVlMiIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIEVuc3VyZSBwcmV2aW91cyB3YXlwb2ludCBoYXMgbm8gcGxhbl9sZWF2ZV9pZCAoc28gaXQgc2F2ZXMgdmFsdWVzIGltbWVkaWF0ZWx5KQogICAgICAgIHByZXZpb3VzX3dheXBvaW50LndheXBvaW50X3RlbXBsYXRlX2lkLnBsYW5fbGVhdmVfaWQgPSBGYWxzZQoKICAgICAgICAjIENhbGwgZmx5X3RvCiAgICAgICAgZGVzdGluYXRpb25fd2F5cG9pbnQuZmx5X3RvKCkKCiAgICAgICAgIyBQcmV2aW91cyB3YXlwb2ludCBzaG91bGQgaGF2ZSBzYXZlZCBpdHMgdmFsdWVzCiAgICAgICAgcHJldmlvdXNfdmFsdWVzID0gcHJldmlvdXNfd2F5cG9pbnQudmFyaWFibGVfdmFsdWVzIG9yIHt9CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgcHJldmlvdXNfdmFsdWVzLmdldCgidGVzdF92YXJfMSIpLAogICAgICAgICAgICAicHJldmlvdXNfdmFsdWUxIiwKICAgICAgICAgICAgIlByZXZpb3VzIHdheXBvaW50IHNob3VsZCBzYXZlIGl0cyB2YXJpYWJsZSB2YWx1ZXMiLAogICAgICAgICkKCiAgICAgICAgIyBWYXJpYWJsZSB2YWx1ZXMgc2hvdWxkIGJlIHJlc3RvcmVkIGZyb20gZGVzdGluYXRpb24gd2F5cG9pbnQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LmdldF92YXJpYWJsZV92YWx1ZSgidGVzdF92YXJfMSIpLAogICAgICAgICAgICAiZGVzdGluYXRpb25fdmFsdWUxIiwKICAgICAgICAgICAgIlZhcmlhYmxlIHZhbHVlIHNob3VsZCBiZSByZXN0b3JlZCBmcm9tIGRlc3RpbmF0aW9uIHdheXBvaW50IiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC5nZXRfdmFyaWFibGVfdmFsdWUoInRlc3RfdmFyXzIiKSwKICAgICAgICAgICAgImRlc3RpbmF0aW9uX3ZhbHVlMiIsCiAgICAgICAgICAgICJWYXJpYWJsZSB2YWx1ZSBzaG91bGQgYmUgcmVzdG9yZWQgZnJvbSBkZXN0aW5hdGlvbiB3YXlwb2ludCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2Fycml2aW5nX2Vycm9yX3Jlc3RvcmVzX3ZhcmlhYmxlX3ZhbHVlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgd2hlbiBhcnJpdmluZyBmYWlscywKICAgICAgICB2YXJpYWJsZSB2YWx1ZXMgYXJlIHJlc3RvcmVkIGZyb20gY3VycmVudCB3YXlwb2ludAogICAgICAgICIiIgogICAgICAgICMgQ3JlYXRlIGN1cnJlbnQgd2F5cG9pbnQgd2l0aCBzYXZlZCB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICBjdXJyZW50X3dheXBvaW50ID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkN1cnJlbnQgV2F5cG9pbnQiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IHNlbGYuamV0X3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImN1cnJlbnQiLAogICAgICAgICAgICAgICAgInZhcmlhYmxlX3ZhbHVlcyI6IHsKICAgICAgICAgICAgICAgICAgICAidGVzdF92YXJfMSI6ICJjdXJyZW50X3ZhbHVlMSIsCiAgICAgICAgICAgICAgICAgICAgInRlc3RfdmFyXzIiOiAiY3VycmVudF92YWx1ZTIiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBzZWxmLmpldF90ZXN0LndheXBvaW50X2lkID0gY3VycmVudF93YXlwb2ludC5pZAoKICAgICAgICAjIENyZWF0ZSBhcnJpdmluZyB3YXlwb2ludAogICAgICAgIGFycml2aW5nX3dheXBvaW50ID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkFycml2aW5nIFdheXBvaW50IiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJhcnJpdmluZyIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgU2V0IGRpZmZlcmVudCB2YWx1ZXMgb24gdGhlIGpldAogICAgICAgIHNlbGYuamV0X3Rlc3Quc2V0X3ZhcmlhYmxlX3ZhbHVlKCJ0ZXN0X3Zhcl8xIiwgImFycml2aW5nX3ZhbHVlMSIpCiAgICAgICAgc2VsZi5qZXRfdGVzdC5zZXRfdmFyaWFibGVfdmFsdWUoInRlc3RfdmFyXzIiLCAiYXJyaXZpbmdfdmFsdWUyIikKCiAgICAgICAgIyBDcmVhdGUgcGxhbiBsb2cgd2l0aCBlcnJvciBzdGF0dXMKICAgICAgICBwbGFuX2xvZyA9IHNlbGYuUGxhbkxvZy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLmpldF90ZXN0LnNlcnZlcl9pZC5pZCwKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogc2VsZi5wbGFuX2Vycm9yLmlkLAogICAgICAgICAgICAgICAgInBsYW5fc3RhdHVzIjogLTEwMCwgICMgRXJyb3IKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDYWxsIF9wbGFuX2ZpbmlzaGVkIHdpdGggZXJyb3IKICAgICAgICB3aXRoIG11dGVfbG9nZ2VyKAogICAgICAgICAgICAib2Rvby5hZGRvbnMuY2V0bWl4X3Rvd2VyX3NlcnZlci5tb2RlbHMuY3hfdG93ZXJfamV0X3dheXBvaW50IgogICAgICAgICk6CiAgICAgICAgICAgIGFycml2aW5nX3dheXBvaW50Ll9wbGFuX2ZpbmlzaGVkKHBsYW5fbG9nKQoKICAgICAgICAjIFZhcmlhYmxlIHZhbHVlcyBzaG91bGQgYmUgcmVzdG9yZWQgZnJvbSBjdXJyZW50IHdheXBvaW50CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2VsZi5qZXRfdGVzdC5nZXRfdmFyaWFibGVfdmFsdWUoInRlc3RfdmFyXzEiKSwKICAgICAgICAgICAgImN1cnJlbnRfdmFsdWUxIiwKICAgICAgICAgICAgIlZhcmlhYmxlIHZhbHVlIHNob3VsZCBiZSByZXN0b3JlZCBmcm9tIGN1cnJlbnQgd2F5cG9pbnQgb24gZXJyb3IiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZWxmLmpldF90ZXN0LmdldF92YXJpYWJsZV92YWx1ZSgidGVzdF92YXJfMiIpLAogICAgICAgICAgICAiY3VycmVudF92YWx1ZTIiLAogICAgICAgICAgICAiVmFyaWFibGUgdmFsdWUgc2hvdWxkIGJlIHJlc3RvcmVkIGZyb20gY3VycmVudCB3YXlwb2ludCBvbiBlcnJvciIsCiAgICAgICAgKQoKICAgICAgICAjIEN1cnJlbnQgd2F5cG9pbnQgc3RhdGUgc2hvdWxkIGJlICJjdXJyZW50IgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGN1cnJlbnRfd2F5cG9pbnQuc3RhdGUsCiAgICAgICAgICAgICJjdXJyZW50IiwKICAgICAgICAgICAgIkN1cnJlbnQgd2F5cG9pbnQgc3RhdGUgc2hvdWxkIHJlbWFpbiBjdXJyZW50IiwKICAgICAgICApCgogICAgICAgICMgQXJyaXZpbmcgd2F5cG9pbnQgc3RhdGUgc2hvdWxkIGJlICJlcnJvciIKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBhcnJpdmluZ193YXlwb2ludC5zdGF0ZSwKICAgICAgICAgICAgImVycm9yIiwKICAgICAgICAgICAgIkFycml2aW5nIHdheXBvaW50IHN0YXRlIHNob3VsZCBiZSBlcnJvciIsCiAgICAgICAgKQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIC0tLSBfY2hlY2tfaXNfZGVzdGluYXRpb24gdGVzdHMgLS0tLQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBkZWYgX21ha2VfZGVzdGluYXRpb25fd2F5cG9pbnQoc2VsZiwgbmFtZSwgamV0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEhlbHBlcjogY3JlYXRlIGEgd2F5cG9pbnQgYW5kIGF0b21pY2FsbHkgdHJhbnNpdGlvbiBpdCB0byB0aGUKICAgICAgICBgYHByZXBhcmluZ2BgIHN0YXRlIHdpdGggYGBpc19kZXN0aW5hdGlvbj1UcnVlYGAuCgogICAgICAgIFRoaXMgbWlycm9ycyB3aGF0IGBgcHJlcGFyZShpc19kZXN0aW5hdGlvbj1UcnVlKWBgIGRvZXMgaW50ZXJuYWxseQogICAgICAgIHdoZW4gdGhlIHdheXBvaW50IHRlbXBsYXRlIGhhcyBhIGBgcGxhbl9jcmVhdGVfaWRgYCAoaXQgd3JpdGVzCiAgICAgICAgYGBzdGF0ZT1wcmVwYXJpbmdgYCArIGBgaXNfZGVzdGluYXRpb25gYCBpbiBvbmUgY2FsbCBhbmQgZG9lcyBub3QKICAgICAgICBwcm9jZWVkIHRvIGBgZmx5X3RvKClgYCkuIFVzaW5nIHRoYXQgcGF0aCBrZWVwcyBgYGlzX2Rlc3RpbmF0aW9uYGAKICAgICAgICBzdGFibGUgZm9yIHN1YnNlcXVlbnQgY29uc3RyYWludCBhc3NlcnRpb25zLCB3aGVyZWFzIGNhbGxpbmcKICAgICAgICBgYHByZXBhcmUoKWBgIHdpdGhvdXQgYSBwbGFuIHRyaWdnZXJzIGBgZmx5X3RvKClgYCDihpIgYGBfYXJyaXZlKClgYCwKICAgICAgICB3aGljaCBjbGVhcnMgYGBpc19kZXN0aW5hdGlvbmBgIGltbWVkaWF0ZWx5LgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBuYW1lIChzdHIpOiBOYW1lIG9mIHRoZSB3YXlwb2ludC4KICAgICAgICAgICAgamV0IChjeC50b3dlci5qZXQsIG9wdGlvbmFsKTogVGFyZ2V0IGpldC4gRGVmYXVsdHMgdG8gamV0X3Rlc3QuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGN4LnRvd2VyLmpldC53YXlwb2ludDogV2F5cG9pbnQgaW4gYGBwcmVwYXJpbmdgYCBzdGF0ZSB3aXRoCiAgICAgICAgICAgICAgICBgYGlzX2Rlc3RpbmF0aW9uPVRydWVgYC4KICAgICAgICAiIiIKICAgICAgICBpZiBqZXQgaXMgTm9uZToKICAgICAgICAgICAgamV0ID0gc2VsZi5qZXRfdGVzdAogICAgICAgIHdheXBvaW50ID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogbmFtZSwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBqZXQuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiBzZWxmLndheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHdheXBvaW50LndyaXRlKHsic3RhdGUiOiAicHJlcGFyaW5nIiwgImlzX2Rlc3RpbmF0aW9uIjogVHJ1ZX0pCiAgICAgICAgcmV0dXJuIHdheXBvaW50CgogICAgZGVmIHRlc3RfY2hlY2tfaXNfZGVzdGluYXRpb25fc2luZ2xlX2FsbG93ZWQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUHJlcGFyaW5nIG9uZSBkZXN0aW5hdGlvbiB3YXlwb2ludCBmb3IgYSBqZXQgdmlhIHByZXBhcmUoKSBpcyB2YWxpZC4KICAgICAgICAiIiIKICAgICAgICB3YXlwb2ludCA9IHNlbGYuX21ha2VfZGVzdGluYXRpb25fd2F5cG9pbnQoIkRlc3RpbmF0aW9uIFdheXBvaW50IikKICAgICAgICBzZWxmLmFzc2VydFRydWUod2F5cG9pbnQuaXNfZGVzdGluYXRpb24pCgogICAgZGVmIHRlc3RfY2hlY2tfaXNfZGVzdGluYXRpb25fZGlmZmVyZW50X2pldHNfYWxsb3dlZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBFYWNoIGpldCBtYXkgaW5kZXBlbmRlbnRseSBoYXZlIGl0cyBvd24gZGVzdGluYXRpb24gd2F5cG9pbnQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fbWFrZV9kZXN0aW5hdGlvbl93YXlwb2ludCgiRGVzdGluYXRpb24gSmV0IFRlc3QiLCBqZXQ9c2VsZi5qZXRfdGVzdCkKICAgICAgICB3YXlwb2ludF9vdGhlciA9IHNlbGYuX21ha2VfZGVzdGluYXRpb25fd2F5cG9pbnQoCiAgICAgICAgICAgICJEZXN0aW5hdGlvbiBKZXQgT2RvbyIsIGpldD1zZWxmLmpldF9vZG9vCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3YXlwb2ludF9vdGhlci5pc19kZXN0aW5hdGlvbikKCiAgICBkZWYgdGVzdF9jaGVja19pc19kZXN0aW5hdGlvbl9mYWxzZV9pZ25vcmVkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFdheXBvaW50cyB3aXRoIGlzX2Rlc3RpbmF0aW9uPUZhbHNlIGFyZSBuZXZlciBjaGVja2VkLCBldmVuIHdoZW4KICAgICAgICBhbm90aGVyIGRlc3RpbmF0aW9uIGFscmVhZHkgZXhpc3RzIGZvciB0aGUgc2FtZSBqZXQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fbWFrZV9kZXN0aW5hdGlvbl93YXlwb2ludCgiRXhpc3RpbmcgRGVzdGluYXRpb24iKQogICAgICAgICMgQ3JlYXRpbmcgYSBub24tZGVzdGluYXRpb24gd2F5cG9pbnQgbXVzdCBub3QgcmFpc2UuCiAgICAgICAgbm9uX2Rlc3QgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiTm9uIERlc3RpbmF0aW9uIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJpc19kZXN0aW5hdGlvbiI6IEZhbHNlLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uobm9uX2Rlc3QuaXNfZGVzdGluYXRpb24pCgogICAgZGVmIF9hc3NlcnRfc3RhdGVfYmxvY2tzX2Rlc3RpbmF0aW9uKHNlbGYsIHN0YXRlKToKICAgICAgICAiIiIKICAgICAgICBIZWxwZXI6IGNyZWF0ZSBhIHdheXBvaW50LCBmb3JjZSBpdCBpbnRvIGBgc3RhdGVgYCwgdGhlbiBhc3NlcnQgdGhhdAogICAgICAgIHdyaXRpbmcgYGBpc19kZXN0aW5hdGlvbj1UcnVlYGAgcmFpc2VzIGEgVmFsaWRhdGlvbkVycm9yLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBzdGF0ZSAoc3RyKTogV2F5cG9pbnQgc3RhdGUgdG8gdGVzdC4KICAgICAgICAiIiIKICAgICAgICB3YXlwb2ludCA9IHNlbGYuSmV0V2F5cG9pbnQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6IGYiV2F5cG9pbnQgaW4ge3N0YXRlfSIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHNlbGYud2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgd2F5cG9pbnQud3JpdGUoeyJzdGF0ZSI6IHN0YXRlfSkKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbGlkYXRpb25FcnJvcik6CiAgICAgICAgICAgIHdheXBvaW50LndyaXRlKHsiaXNfZGVzdGluYXRpb24iOiBUcnVlfSkKCiAgICBkZWYgdGVzdF9jaGVja19pc19kZXN0aW5hdGlvbl9kcmFmdF9zdGF0ZV9yYWlzZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2V0dGluZyBpc19kZXN0aW5hdGlvbj1UcnVlIGRpcmVjdGx5IG9uIGEgd2F5cG9pbnQgaW4gdGhlICdkcmFmdCcgc3RhdGUKICAgICAgICBtdXN0IHJhaXNlIGEgVmFsaWRhdGlvbkVycm9yLgogICAgICAgIFVzZSBwcmVwYXJlKGlzX2Rlc3RpbmF0aW9uPVRydWUpIHRvIGRlc2lnbmF0ZSBhIGRlc3RpbmF0aW9uIHdheXBvaW50LgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2Fzc2VydF9zdGF0ZV9ibG9ja3NfZGVzdGluYXRpb24oImRyYWZ0IikKCiAgICBkZWYgdGVzdF9jaGVja19pc19kZXN0aW5hdGlvbl9lcnJvcl9zdGF0ZV9yYWlzZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2V0dGluZyBpc19kZXN0aW5hdGlvbj1UcnVlIG9uIGEgd2F5cG9pbnQgaW4gdGhlICdlcnJvcicgc3RhdGUKICAgICAgICBtdXN0IHJhaXNlIGEgVmFsaWRhdGlvbkVycm9yLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2Fzc2VydF9zdGF0ZV9ibG9ja3NfZGVzdGluYXRpb24oImVycm9yIikKCiAgICBkZWYgdGVzdF9jaGVja19pc19kZXN0aW5hdGlvbl9sZWF2aW5nX3N0YXRlX3JhaXNlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTZXR0aW5nIGlzX2Rlc3RpbmF0aW9uPVRydWUgb24gYSB3YXlwb2ludCBpbiB0aGUgJ2xlYXZpbmcnIHN0YXRlCiAgICAgICAgbXVzdCByYWlzZSBhIFZhbGlkYXRpb25FcnJvci4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9hc3NlcnRfc3RhdGVfYmxvY2tzX2Rlc3RpbmF0aW9uKCJsZWF2aW5nIikKCiAgICBkZWYgdGVzdF9jaGVja19pc19kZXN0aW5hdGlvbl9kZWxldGluZ19zdGF0ZV9yYWlzZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2V0dGluZyBpc19kZXN0aW5hdGlvbj1UcnVlIG9uIGEgd2F5cG9pbnQgaW4gdGhlICdkZWxldGluZycgc3RhdGUKICAgICAgICBtdXN0IHJhaXNlIGEgVmFsaWRhdGlvbkVycm9yLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2Fzc2VydF9zdGF0ZV9ibG9ja3NfZGVzdGluYXRpb24oImRlbGV0aW5nIikKCiAgICBkZWYgdGVzdF9jaGVja19pc19kZXN0aW5hdGlvbl9kZWxldGVkX3N0YXRlX3JhaXNlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTZXR0aW5nIGlzX2Rlc3RpbmF0aW9uPVRydWUgb24gYSB3YXlwb2ludCBpbiB0aGUgJ2RlbGV0ZWQnIHN0YXRlCiAgICAgICAgbXVzdCByYWlzZSBhIFZhbGlkYXRpb25FcnJvci4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9hc3NlcnRfc3RhdGVfYmxvY2tzX2Rlc3RpbmF0aW9uKCJkZWxldGVkIikKCiAgICBkZWYgdGVzdF9jaGVja19pc19kZXN0aW5hdGlvbl9kdXBsaWNhdGVfb25fY3JlYXRlX3JhaXNlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTZXR0aW5nIGlzX2Rlc3RpbmF0aW9uIHZpYSBwcmVwYXJlKCkgdGhlbiB0cnlpbmcgdG8gcHJlcGFyZSBhIHNlY29uZAogICAgICAgIGRlc3RpbmF0aW9uIGZvciB0aGUgc2FtZSBqZXQgbXVzdCByYWlzZSBhIFZhbGlkYXRpb25FcnJvci4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9tYWtlX2Rlc3RpbmF0aW9uX3dheXBvaW50KCJGaXJzdCBEZXN0aW5hdGlvbiIpCiAgICAgICAgc2Vjb25kID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlNlY29uZCBEZXN0aW5hdGlvbiIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHNlbGYud2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWxpZGF0aW9uRXJyb3IpOgogICAgICAgICAgICBzZWNvbmQud3JpdGUoeyJzdGF0ZSI6ICJyZWFkeSIsICJpc19kZXN0aW5hdGlvbiI6IFRydWV9KQoKICAgIGRlZiB0ZXN0X2NoZWNrX2lzX2Rlc3RpbmF0aW9uX2R1cGxpY2F0ZV9vbl93cml0ZV9yYWlzZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgV3JpdGluZyBpc19kZXN0aW5hdGlvbj1UcnVlIG9uIGEgc2Vjb25kIHJlYWR5IHdheXBvaW50IGZvciB0aGUgc2FtZSBqZXQKICAgICAgICBtdXN0IHJhaXNlIGEgVmFsaWRhdGlvbkVycm9yLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX21ha2VfZGVzdGluYXRpb25fd2F5cG9pbnQoIkV4aXN0aW5nIERlc3RpbmF0aW9uIikKICAgICAgICBzZWNvbmQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiU2Vjb25kIFdheXBvaW50IiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBzZWNvbmQud3JpdGUoeyJzdGF0ZSI6ICJyZWFkeSJ9KQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsaWRhdGlvbkVycm9yKToKICAgICAgICAgICAgc2Vjb25kLndyaXRlKHsiaXNfZGVzdGluYXRpb24iOiBUcnVlfSkKCiAgICBkZWYgdGVzdF9jaGVja19pc19kZXN0aW5hdGlvbl9kdXBsaWNhdGVfd2l0aGluX3NhbWVfYmF0Y2hfcmFpc2VzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFdyaXRpbmcgaXNfZGVzdGluYXRpb249VHJ1ZSBvbiB0d28gcmVhZHkgd2F5cG9pbnRzIGZvciB0aGUgc2FtZSBqZXQKICAgICAgICBpbiBhIHNpbmdsZSB3cml0ZSgpIGNhbGwgbXVzdCByYWlzZSBhIFZhbGlkYXRpb25FcnJvci4KCiAgICAgICAgQm90aCByZWNvcmRzIGFyZSBleGNsdWRlZCBmcm9tIHRoZSBEQiBzZWFyY2ggKG5laXRoZXIgaXMgYSBkZXN0aW5hdGlvbgogICAgICAgIHlldCksIHNvIHRoZSBjb25zdHJhaW50IG11c3QgYWxzbyBkZXRlY3QgZHVwbGljYXRlcyB3aXRoaW4gdGhlIGJhdGNoLgogICAgICAgICIiIgogICAgICAgIHdwMSA9IHNlbGYuSmV0V2F5cG9pbnQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJCYXRjaCBEZXN0aW5hdGlvbiAxIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICB3cDIgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiQmF0Y2ggRGVzdGluYXRpb24gMiIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogc2VsZi5qZXRfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHNlbGYud2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgKHdwMSB8IHdwMikud3JpdGUoeyJzdGF0ZSI6ICJyZWFkeSJ9KQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsaWRhdGlvbkVycm9yKToKICAgICAgICAgICAgKHdwMSB8IHdwMikud3JpdGUoeyJpc19kZXN0aW5hdGlvbiI6IFRydWV9KQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIC0tLSB1bmxpbmsgZGVzdGluYXRpb24gZ3VhcmQgdGVzdHMgLQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBAbXV0ZV9sb2dnZXIoIm9kb28uYWRkb25zLmNldG1peF90b3dlcl9zZXJ2ZXIubW9kZWxzLmN4X3Rvd2VyX2pldF93YXlwb2ludCIpCiAgICBkZWYgdGVzdF91bmxpbmtfZGVzdGluYXRpb25fd2F5cG9pbnRfcmFpc2VzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIERlbGV0aW5nIGEgd2F5cG9pbnQgd2l0aCBpc19kZXN0aW5hdGlvbj1UcnVlIG11c3QgcmFpc2UgYQogICAgICAgIFZhbGlkYXRpb25FcnJvciByZWdhcmRsZXNzIG9mIHN0YXRlLCB0byBwcmV2ZW50IHRoZSBqZXQgZnJvbSBiZWluZwogICAgICAgIHN0cmFuZGVkIG1pZC1mbGlnaHQgd2hpbGUgYSBsZWF2ZSBwbGFuIGlzIHN0aWxsIHJ1bm5pbmcuCiAgICAgICAgIiIiCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLl9tYWtlX2Rlc3RpbmF0aW9uX3dheXBvaW50KCJBY3RpdmUgRGVzdGluYXRpb24iKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsaWRhdGlvbkVycm9yKToKICAgICAgICAgICAgd2F5cG9pbnQudW5saW5rKCkKCiAgICBAbXV0ZV9sb2dnZXIoIm9kb28uYWRkb25zLmNldG1peF90b3dlcl9zZXJ2ZXIubW9kZWxzLmN4X3Rvd2VyX2pldF93YXlwb2ludCIpCiAgICBkZWYgdGVzdF91bmxpbmtfZGVzdGluYXRpb25fd2F5cG9pbnRfbm9fcmFpc2VfY29udGV4dF9sb2dzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFdoZW4gd2F5cG9pbnRfbm9fcmFpc2Vfb25fZGVsZXRlPVRydWUgaXMgc2V0IGluIGNvbnRleHQsIGRlbGV0aW5nIGEKICAgICAgICBkZXN0aW5hdGlvbiB3YXlwb2ludCBtdXN0IG5vdCByYWlzZSBidXQgbXVzdCBsb2cgdGhlIGVycm9yIGFuZCBza2lwCiAgICAgICAgdGhlIHJlY29yZC4KICAgICAgICAiIiIKICAgICAgICB3YXlwb2ludCA9IHNlbGYuX21ha2VfZGVzdGluYXRpb25fd2F5cG9pbnQoIkFjdGl2ZSBEZXN0aW5hdGlvbiBObyBSYWlzZSIpCiAgICAgICAgd2F5cG9pbnQud2l0aF9jb250ZXh0KHdheXBvaW50X25vX3JhaXNlX29uX2RlbGV0ZT1UcnVlKS51bmxpbmsoKQogICAgICAgICMgUmVjb3JkIG11c3Qgc3RpbGwgZXhpc3Qg4oCUIGl0IHdhcyBza2lwcGVkLCBub3QgZGVsZXRlZC4KICAgICAgICBzZWxmLmFzc2VydFRydWUod2F5cG9pbnQuZXhpc3RzKCkpCgogICAgZGVmIHRlc3RfdW5saW5rX25vbl9kZXN0aW5hdGlvbl9yZWFkeV93YXlwb2ludF9hbGxvd2VkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIERlbGV0aW5nIGEgcmVhZHkgd2F5cG9pbnQgdGhhdCBpcyBOT1QgYSBkZXN0aW5hdGlvbiBtdXN0IHN0aWxsIHdvcmsuCiAgICAgICAgIiIiCiAgICAgICAgd2F5cG9pbnQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUmVhZHkgTm9uLURlc3RpbmF0aW9uIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBzZWxmLmpldF90ZXN0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICB3YXlwb2ludC53cml0ZSh7InN0YXRlIjogInJlYWR5In0pCiAgICAgICAgd2F5cG9pbnQudW5saW5rKCkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHdheXBvaW50LmV4aXN0cygpKQo= |