IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQojIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiMgY3N2IHBhY2thZ2UgdW5pdCB0ZXN0cwoKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IHVuaXR0ZXN0CmZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgY3N2CmltcG9ydCBnYwppbXBvcnQgaW8KZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKCmNsYXNzIFRlc3RfQ3N2KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICIiIgogICAgVGVzdCB0aGUgdW5kZXJseWluZyBDIGNzdiBwYXJzZXIgaW4gd2F5cyB0aGF0IGFyZSBub3QgYXBwcm9wcmlhdGUKICAgIGZyb20gdGhlIGhpZ2ggbGV2ZWwgaW50ZXJmYWNlLiBGdXJ0aGVyIHRlc3RzIG9mIHRoaXMgbmF0dXJlIGFyZSBkb25lCiAgICBpbiBUZXN0RGlhbGVjdFJlZ2lzdHJ5LgogICAgIiIiCiAgICBkZWYgX3Rlc3RfYXJnX3ZhbGlkKHNlbGYsIGN0b3IsIGFyZyk6CiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgTm9uZSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgYmFkX2F0dHIgPSAwKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBkZWxpbWl0ZXIgPSAwKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBkZWxpbWl0ZXIgPSAnWFgnKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgY3RvciwgYXJnLCAnZm9vJykKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgZGVsaW1pdGVyPU5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yLCBhcmcsIGRlbGltaXRlcj0xKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBxdW90ZWNoYXI9MSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgbGluZXRlcm1pbmF0b3I9Tm9uZSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgbGluZXRlcm1pbmF0b3I9MSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgcXVvdGluZz1Ob25lKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rpbmc9Y3N2LlFVT1RFX0FMTCwgcXVvdGVjaGFyPScnKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rpbmc9Y3N2LlFVT1RFX0FMTCwgcXVvdGVjaGFyPU5vbmUpCgogICAgZGVmIHRlc3RfcmVhZGVyX2FyZ192YWxpZChzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2FyZ192YWxpZChjc3YucmVhZGVyLCBbXSkKCiAgICBkZWYgdGVzdF93cml0ZXJfYXJnX3ZhbGlkKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfYXJnX3ZhbGlkKGNzdi53cml0ZXIsIFN0cmluZ0lPKCkpCgogICAgZGVmIF90ZXN0X2RlZmF1bHRfYXR0cnMoc2VsZiwgY3RvciwgKmFyZ3MpOgogICAgICAgIG9iaiA9IGN0b3IoKmFyZ3MpCiAgICAgICAgIyBDaGVjayBkZWZhdWx0cwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QuZGVsaW1pdGVyLCAnLCcpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kb3VibGVxdW90ZSwgVHJ1ZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmVzY2FwZWNoYXIsIE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5saW5ldGVybWluYXRvciwgIlxyXG4iKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QucXVvdGVjaGFyLCAnIicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5xdW90aW5nLCBjc3YuUVVPVEVfTUlOSU1BTCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnNraXBpbml0aWFsc3BhY2UsIEZhbHNlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3Quc3RyaWN0LCBGYWxzZSkKICAgICAgICAjIFRyeSBkZWxldGluZyBvciBjaGFuZ2luZyBhdHRyaWJ1dGVzICh0aGV5IGFyZSByZWFkLW9ubHkpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkZWxhdHRyLCBvYmouZGlhbGVjdCwgJ2RlbGltaXRlcicpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBvYmouZGlhbGVjdCwgJ2RlbGltaXRlcicsICc6JykKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZGVsYXR0ciwgb2JqLmRpYWxlY3QsICdxdW90aW5nJykKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgb2JqLmRpYWxlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1b3RpbmcnLCBOb25lKQoKICAgIGRlZiB0ZXN0X3JlYWRlcl9hdHRycyhzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2RlZmF1bHRfYXR0cnMoY3N2LnJlYWRlciwgW10pCgogICAgZGVmIHRlc3Rfd3JpdGVyX2F0dHJzKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfZGVmYXVsdF9hdHRycyhjc3Yud3JpdGVyLCBTdHJpbmdJTygpKQoKICAgIGRlZiBfdGVzdF9rd19hdHRycyhzZWxmLCBjdG9yLCAqYXJncyk6CiAgICAgICAgIyBOb3cgdHJ5IHdpdGggYWx0ZXJuYXRlIG9wdGlvbnMKICAgICAgICBrd2FyZ3MgPSBkaWN0KGRlbGltaXRlcj0nOicsIGRvdWJsZXF1b3RlPUZhbHNlLCBlc2NhcGVjaGFyPSdcXCcsCiAgICAgICAgICAgICAgICAgICAgICBsaW5ldGVybWluYXRvcj0nXHInLCBxdW90ZWNoYXI9JyonLAogICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1jc3YuUVVPVEVfTk9ORSwgc2tpcGluaXRpYWxzcGFjZT1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgc3RyaWN0PVRydWUpCiAgICAgICAgb2JqID0gY3RvcigqYXJncywgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kZWxpbWl0ZXIsICc6JykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmRvdWJsZXF1b3RlLCBGYWxzZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmVzY2FwZWNoYXIsICdcXCcpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5saW5ldGVybWluYXRvciwgIlxyIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnF1b3RlY2hhciwgJyonKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QucXVvdGluZywgY3N2LlFVT1RFX05PTkUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5za2lwaW5pdGlhbHNwYWNlLCBUcnVlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3Quc3RyaWN0LCBUcnVlKQoKICAgIGRlZiB0ZXN0X3JlYWRlcl9rd19hdHRycyhzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2t3X2F0dHJzKGNzdi5yZWFkZXIsIFtdKQoKICAgIGRlZiB0ZXN0X3dyaXRlcl9rd19hdHRycyhzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2t3X2F0dHJzKGNzdi53cml0ZXIsIFN0cmluZ0lPKCkpCgogICAgZGVmIF90ZXN0X2RpYWxlY3RfYXR0cnMoc2VsZiwgY3RvciwgKmFyZ3MpOgogICAgICAgICMgTm93IHRyeSB3aXRoIGRpYWxlY3QtZGVyaXZlZCBvcHRpb25zCiAgICAgICAgY2xhc3MgZGlhbGVjdDoKICAgICAgICAgICAgZGVsaW1pdGVyPSctJwogICAgICAgICAgICBkb3VibGVxdW90ZT1GYWxzZQogICAgICAgICAgICBlc2NhcGVjaGFyPSdeJwogICAgICAgICAgICBsaW5ldGVybWluYXRvcj0nJCcKICAgICAgICAgICAgcXVvdGVjaGFyPScjJwogICAgICAgICAgICBxdW90aW5nPWNzdi5RVU9URV9BTEwKICAgICAgICAgICAgc2tpcGluaXRpYWxzcGFjZT1UcnVlCiAgICAgICAgICAgIHN0cmljdD1GYWxzZQogICAgICAgIGFyZ3MgPSBhcmdzICsgKGRpYWxlY3QsKQogICAgICAgIG9iaiA9IGN0b3IoKmFyZ3MpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kZWxpbWl0ZXIsICctJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmRvdWJsZXF1b3RlLCBGYWxzZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmVzY2FwZWNoYXIsICdeJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmxpbmV0ZXJtaW5hdG9yLCAiJCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5xdW90ZWNoYXIsICcjJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnF1b3RpbmcsIGNzdi5RVU9URV9BTEwpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5za2lwaW5pdGlhbHNwYWNlLCBUcnVlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3Quc3RyaWN0LCBGYWxzZSkKCiAgICBkZWYgdGVzdF9yZWFkZXJfZGlhbGVjdF9hdHRycyhzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2RpYWxlY3RfYXR0cnMoY3N2LnJlYWRlciwgW10pCgogICAgZGVmIHRlc3Rfd3JpdGVyX2RpYWxlY3RfYXR0cnMoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9kaWFsZWN0X2F0dHJzKGNzdi53cml0ZXIsIFN0cmluZ0lPKCkpCgoKICAgIGRlZiBfd3JpdGVfdGVzdChzZWxmLCBmaWVsZHMsIGV4cGVjdCwgKiprd2FyZ3MpOgogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosICoqa3dhcmdzKQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coZmllbGRzKQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QgKyB3cml0ZXIuZGlhbGVjdC5saW5ldGVybWluYXRvcikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgZGVmIF93cml0ZV9lcnJvcl90ZXN0KHNlbGYsIGV4YywgZmllbGRzLCAqKmt3YXJncyk6CiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgKiprd2FyZ3MpCiAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoZXhjKToKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhmaWVsZHMpCiAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAnJykKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgZGVmIHRlc3Rfd3JpdGVfYXJnX3ZhbGlkKHNlbGYpOgogICAgICAgIHNlbGYuX3dyaXRlX2Vycm9yX3Rlc3QoY3N2LkVycm9yLCBOb25lKQogICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoKCksICcnKQogICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoW05vbmVdLCAnIiInKQogICAgICAgIHNlbGYuX3dyaXRlX2Vycm9yX3Rlc3QoY3N2LkVycm9yLCBbTm9uZV0sIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9ORSkKICAgICAgICAjIENoZWNrIHRoYXQgZXhjZXB0aW9ucyBhcmUgcGFzc2VkIHVwIHRoZSBjaGFpbgogICAgICAgIGNsYXNzIEJhZExpc3Q6CiAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIDEwOwogICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CiAgICAgICAgICAgICAgICBpZiBpID4gMjoKICAgICAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yCiAgICAgICAgc2VsZi5fd3JpdGVfZXJyb3JfdGVzdChJT0Vycm9yLCBCYWRMaXN0KCkpCiAgICAgICAgY2xhc3MgQmFkSXRlbToKICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yCiAgICAgICAgc2VsZi5fd3JpdGVfZXJyb3JfdGVzdChJT0Vycm9yLCBbQmFkSXRlbSgpXSkKCiAgICBkZWYgdGVzdF93cml0ZV9iaWdmaWVsZChzZWxmKToKICAgICAgICAjIFRoaXMgZXhlcmNpc2VzIHRoZSBidWZmZXIgcmVhbGxvYyBmdW5jdGlvbmFsaXR5CiAgICAgICAgYmlnc3RyaW5nID0gJ1gnICogNTAwMDAKICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFtiaWdzdHJpbmcsYmlnc3RyaW5nXSwgJyVzLCVzJyAlIFwKICAgICAgICAgICAgICAgICAgICAgICAgIChiaWdzdHJpbmcsIGJpZ3N0cmluZykpCgogICAgZGVmIHRlc3Rfd3JpdGVfcXVvdGluZyhzZWxmKToKICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnYScsMSwncCxxJ10sICdhLDEsInAscSInKQogICAgICAgIHNlbGYuX3dyaXRlX2Vycm9yX3Rlc3QoY3N2LkVycm9yLCBbJ2EnLDEsJ3AscSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05FKQogICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWydhJywxLCdwLHEnXSwgJ2EsMSwicCxxIicsCiAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX01JTklNQUwpCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJ2EnLDEsJ3AscSddLCAnImEiLDEsInAscSInLAogICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05OVU1FUklDKQogICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWydhJywxLCdwLHEnXSwgJyJhIiwiMSIsInAscSInLAogICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9BTEwpCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJ2FcbmInLDFdLCAnImFcbmIiLCIxIicsCiAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX0FMTCkKCiAgICBkZWYgdGVzdF93cml0ZV9lc2NhcGUoc2VsZik6CiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJ2EnLDEsJ3AscSddLCAnYSwxLCJwLHEiJywKICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWNoYXI9J1xcJykKICAgICAgICBzZWxmLl93cml0ZV9lcnJvcl90ZXN0KGNzdi5FcnJvciwgWydhJywxLCdwLCJxIiddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj1Ob25lLCBkb3VibGVxdW90ZT1GYWxzZSkKICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnYScsMSwncCwicSInXSwgJ2EsMSwicCxcXCJxXFwiIicsCiAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVjaGFyPSdcXCcsIGRvdWJsZXF1b3RlID0gRmFsc2UpCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJyInXSwgJyIiIiInLAogICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj0nXFwnLCBxdW90aW5nID0gY3N2LlFVT1RFX01JTklNQUwpCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJyInXSwgJ1xcIicsCiAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVjaGFyPSdcXCcsIHF1b3RpbmcgPSBjc3YuUVVPVEVfTUlOSU1BTCwKICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZXF1b3RlID0gRmFsc2UpCiAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJyInXSwgJ1xcIicsCiAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVjaGFyPSdcXCcsIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9ORSkKICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnYScsMSwncCxxJ10sICdhLDEscFxcLHEnLAogICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj0nXFwnLCBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUpCgogICAgZGVmIHRlc3Rfd3JpdGVyb3dzKHNlbGYpOgogICAgICAgIGNsYXNzIEJyb2tlbkZpbGU6CiAgICAgICAgICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgogICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcgogICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoQnJva2VuRmlsZSgpKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHdyaXRlci53cml0ZXJvd3MsIFtbJ2EnXV0pCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaikKICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3cml0ZXIud3JpdGVyb3dzLCBOb25lKQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3dzKFtbJ2EnLCdiJ10sWydjJywnZCddXSkKICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksICJhLGJcclxuYyxkXHJcbiIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKICAgIGRlZiB0ZXN0X3dyaXRlX2Zsb2F0KHNlbGYpOgogICAgICAgICMgSXNzdWUgMTM1NzM6IGxvc3Mgb2YgcHJlY2lzaW9uIGJlY2F1c2UgY3N2LndyaXRlcgogICAgICAgICMgdXNlcyBzdHIoKSBmb3IgZmxvYXRzIGluc3RlYWQgb2YgcmVwcigpCiAgICAgICAgb3JpZ19yb3cgPSBbMS4yMzQ1Njc4OTAxMjMsIDEuMC83LjAsICdhYmMnXQogICAgICAgIGYgPSBTdHJpbmdJTygpCiAgICAgICAgYyA9IGNzdi53cml0ZXIoZiwgcXVvdGluZz1jc3YuUVVPVEVfTk9OTlVNRVJJQykKICAgICAgICBjLndyaXRlcm93KG9yaWdfcm93KQogICAgICAgIGYuc2VlaygwKQogICAgICAgIGMgPSBjc3YucmVhZGVyKGYsIHF1b3Rpbmc9Y3N2LlFVT1RFX05PTk5VTUVSSUMpCiAgICAgICAgbmV3X3JvdyA9IG5leHQoYykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWdfcm93LCBuZXdfcm93KQoKICAgIGRlZiBfcmVhZF90ZXN0KHNlbGYsIGlucHV0LCBleHBlY3QsICoqa3dhcmdzKToKICAgICAgICByZWFkZXIgPSBjc3YucmVhZGVyKGlucHV0LCAqKmt3YXJncykKICAgICAgICByZXN1bHQgPSBsaXN0KHJlYWRlcikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0KQoKICAgIGRlZiB0ZXN0X3JlYWRfb2RkaW5wdXRzKHNlbGYpOgogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbXSwgW10pCiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnJ10sIFtbXV0pCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgWyciYWIiYyddLCBOb25lLCBzdHJpY3QgPSAxKQogICAgICAgICMgY2Fubm90IGhhbmRsZSBudWxsIGJ5dGVzIGZvciB0aGUgbW9tZW50CiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgWydhYlwwYyddLCBOb25lLCBzdHJpY3QgPSAxKQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJyJhYiJjJ10sIFtbJ2FiYyddXSwgZG91YmxlcXVvdGUgPSAwKQoKICAgIGRlZiB0ZXN0X3JlYWRfZW9sKHNlbGYpOgogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsYiddLCBbWydhJywnYiddXSkKICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLGJcbiddLCBbWydhJywnYiddXSkKICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLGJcclxuJ10sIFtbJ2EnLCdiJ11dKQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsYlxyJ10sIFtbJ2EnLCdiJ11dKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LCBbJ2EsYlxyYyxkJ10sIFtdKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LCBbJ2EsYlxuYyxkJ10sIFtdKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LCBbJ2EsYlxyXG5jLGQnXSwgW10pCgogICAgZGVmIHRlc3RfcmVhZF9lb2Yoc2VsZik6CiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSwiJ10sIFtbJ2EnLCAnJ11dKQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJyJhJ10sIFtbJ2EnXV0pCiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnXiddLCBbWydcbiddXSwgZXNjYXBlY2hhcj0nXicpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsIFsnYSwiJ10sIFtdLCBzdHJpY3Q9VHJ1ZSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwgWyciYSddLCBbXSwgc3RyaWN0PVRydWUpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgWydeJ10sIFtdLCBlc2NhcGVjaGFyPSdeJywgc3RyaWN0PVRydWUpCgogICAgZGVmIHRlc3RfcmVhZF9lc2NhcGUoc2VsZik6CiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSxcXGIsYyddLCBbWydhJywgJ2InLCAnYyddXSwgZXNjYXBlY2hhcj0nXFwnKQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsYlxcLGMnXSwgW1snYScsICdiLGMnXV0sIGVzY2FwZWNoYXI9J1xcJykKICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLCJiXFwsYyInXSwgW1snYScsICdiLGMnXV0sIGVzY2FwZWNoYXI9J1xcJykKICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLCJiLFxcYyInXSwgW1snYScsICdiLGMnXV0sIGVzY2FwZWNoYXI9J1xcJykKICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLCJiLGNcXCIiJ10sIFtbJ2EnLCAnYixjIiddXSwgZXNjYXBlY2hhcj0nXFwnKQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsImIsYyJcXCddLCBbWydhJywgJ2IsY1xcJ11dLCBlc2NhcGVjaGFyPSdcXCcpCgogICAgZGVmIHRlc3RfcmVhZF9xdW90aW5nKHNlbGYpOgogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJzEsIiwzLCIsNSddLCBbWycxJywgJywzLCcsICc1J11dKQogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJzEsIiwzLCIsNSddLCBbWycxJywgJyInLCAnMycsICciJywgJzUnXV0sCiAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlY2hhcj1Ob25lLCBlc2NhcGVjaGFyPSdcXCcpCiAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnMSwiLDMsIiw1J10sIFtbJzEnLCAnIicsICczJywgJyInLCAnNSddXSwKICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1jc3YuUVVPVEVfTk9ORSwgZXNjYXBlY2hhcj0nXFwnKQogICAgICAgICMgd2lsbCB0aGlzIGZhaWwgd2hlcmUgbG9jYWxlIHVzZXMgY29tbWEgZm9yIGRlY2ltYWxzPwogICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJywzLCI1Iiw3LjMsIDknXSwgW1snJywgMywgJzUnLCA3LjMsIDldXSwKICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1jc3YuUVVPVEVfTk9OTlVNRVJJQykKICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWyciYVxuYiIsIDcnXSwgW1snYVxuYicsICcgNyddXSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgWydhYmMsMyddLCBbW11dLAogICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rpbmc9Y3N2LlFVT1RFX05PTk5VTUVSSUMpCgogICAgZGVmIHRlc3RfcmVhZF9iaWdmaWVsZChzZWxmKToKICAgICAgICAjIFRoaXMgZXhlcmNpc2VzIHRoZSBidWZmZXIgcmVhbGxvYyBmdW5jdGlvbmFsaXR5IGFuZCBmaWVsZCBzaXplCiAgICAgICAgIyBsaW1pdHMuCiAgICAgICAgbGltaXQgPSBjc3YuZmllbGRfc2l6ZV9saW1pdCgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzaXplID0gNTAwMDAKICAgICAgICAgICAgYmlnc3RyaW5nID0gJ1gnICogc2l6ZQogICAgICAgICAgICBiaWdsaW5lID0gJyVzLCVzJyAlIChiaWdzdHJpbmcsIGJpZ3N0cmluZykKICAgICAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFtiaWdsaW5lXSwgW1tiaWdzdHJpbmcsIGJpZ3N0cmluZ11dKQogICAgICAgICAgICBjc3YuZmllbGRfc2l6ZV9saW1pdChzaXplKQogICAgICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoW2JpZ2xpbmVdLCBbW2JpZ3N0cmluZywgYmlnc3RyaW5nXV0pCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3N2LmZpZWxkX3NpemVfbGltaXQoKSwgc2l6ZSkKICAgICAgICAgICAgY3N2LmZpZWxkX3NpemVfbGltaXQoc2l6ZS0xKQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwgW2JpZ2xpbmVdLCBbXSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YuZmllbGRfc2l6ZV9saW1pdCwgTm9uZSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YuZmllbGRfc2l6ZV9saW1pdCwgMSwgTm9uZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBjc3YuZmllbGRfc2l6ZV9saW1pdChsaW1pdCkKCiAgICBkZWYgdGVzdF9yZWFkX2xpbmVudW0oc2VsZik6CiAgICAgICAgZm9yIHIgaW4gKGNzdi5yZWFkZXIoWydsaW5lLDEnLCAnbGluZSwyJywgJ2xpbmUsMyddKSwKICAgICAgICAgICAgICAgICAgY3N2LkRpY3RSZWFkZXIoWydsaW5lLDEnLCAnbGluZSwyJywgJ2xpbmUsMyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzPVsnYScsICdiJywgJ2MnXSkpOgogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIubGluZV9udW0sIDApCiAgICAgICAgICAgIHIubmV4dCgpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5saW5lX251bSwgMSkKICAgICAgICAgICAgci5uZXh0KCkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLmxpbmVfbnVtLCAyKQogICAgICAgICAgICByLm5leHQoKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIubGluZV9udW0sIDMpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHIubmV4dCkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLmxpbmVfbnVtLCAzKQoKICAgIGRlZiB0ZXN0X3JvdW5kdHJpcF9xdW90ZWVkX25ld2xpbmVzKHNlbGYpOgogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmopCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd3JpdGVyLndyaXRlcm93cywgTm9uZSkKICAgICAgICAgICAgcm93cyA9IFtbJ2FcbmInLCdiJ10sWydjJywneFxyXG5kJ11dCiAgICAgICAgICAgIHdyaXRlci53cml0ZXJvd3Mocm93cykKICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIGZvciBpLCByb3cgaW4gZW51bWVyYXRlKGNzdi5yZWFkZXIoZmlsZW9iaikpOgogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3csIHJvd3NbaV0pCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKY2xhc3MgVGVzdERpYWxlY3RSZWdpc3RyeSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgdGVzdF9yZWdpc3RyeV9iYWRhcmdzKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2Lmxpc3RfZGlhbGVjdHMsIE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YuZ2V0X2RpYWxlY3QpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBjc3YuZ2V0X2RpYWxlY3QsIE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBjc3YuZ2V0X2RpYWxlY3QsICJub25lc3VjaCIpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YudW5yZWdpc3Rlcl9kaWFsZWN0KQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgY3N2LnVucmVnaXN0ZXJfZGlhbGVjdCwgTm9uZSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIGNzdi51bnJlZ2lzdGVyX2RpYWxlY3QsICJub25lc3VjaCIpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVnaXN0ZXJfZGlhbGVjdCwgTm9uZSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5yZWdpc3Rlcl9kaWFsZWN0LCBOb25lLCBOb25lKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlZ2lzdGVyX2RpYWxlY3QsICJub25lc3VjaCIsIDAsIDApCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVnaXN0ZXJfZGlhbGVjdCwgIm5vbmVzdWNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRhcmd1bWVudD1Ob25lKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlZ2lzdGVyX2RpYWxlY3QsICJub25lc3VjaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1Ob25lKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlZ2lzdGVyX2RpYWxlY3QsIFtdKQoKICAgIGRlZiB0ZXN0X3JlZ2lzdHJ5KHNlbGYpOgogICAgICAgIGNsYXNzIG15ZXhjZWx0c3YoY3N2LmV4Y2VsKToKICAgICAgICAgICAgZGVsaW1pdGVyID0gIlx0IgogICAgICAgIG5hbWUgPSAibXlleGNlbHRzdiIKICAgICAgICBleHBlY3RlZF9kaWFsZWN0cyA9IGNzdi5saXN0X2RpYWxlY3RzKCkgKyBbbmFtZV0KICAgICAgICBleHBlY3RlZF9kaWFsZWN0cy5zb3J0KCkKICAgICAgICBjc3YucmVnaXN0ZXJfZGlhbGVjdChuYW1lLCBteWV4Y2VsdHN2KQogICAgICAgIHNlbGYuYWRkQ2xlYW51cChjc3YudW5yZWdpc3Rlcl9kaWFsZWN0LCBuYW1lKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3N2LmdldF9kaWFsZWN0KG5hbWUpLmRlbGltaXRlciwgJ1x0JykKICAgICAgICBnb3RfZGlhbGVjdHMgPSBzb3J0ZWQoY3N2Lmxpc3RfZGlhbGVjdHMoKSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2RpYWxlY3RzLCBnb3RfZGlhbGVjdHMpCgogICAgZGVmIHRlc3RfcmVnaXN0ZXJfa3dhcmdzKHNlbGYpOgogICAgICAgIG5hbWUgPSAnZmVkY2JhJwogICAgICAgIGNzdi5yZWdpc3Rlcl9kaWFsZWN0KG5hbWUsIGRlbGltaXRlcj0nOycpCiAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGNzdi51bnJlZ2lzdGVyX2RpYWxlY3QsIG5hbWUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjc3YuZ2V0X2RpYWxlY3QobmFtZSkuZGVsaW1pdGVyLCAnOycpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbWydYJywgJ1knLCAnWiddXSwgbGlzdChjc3YucmVhZGVyKFsnWDtZO1onXSwgbmFtZSkpKQoKICAgIGRlZiB0ZXN0X2luY29tcGxldGVfZGlhbGVjdChzZWxmKToKICAgICAgICBjbGFzcyBteWV4Y2VsdHN2KGNzdi5EaWFsZWN0KToKICAgICAgICAgICAgZGVsaW1pdGVyID0gIlx0IgogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlleGNlbHRzdikKCiAgICBkZWYgdGVzdF9zcGFjZV9kaWFsZWN0KHNlbGYpOgogICAgICAgIGNsYXNzIHNwYWNlKGNzdi5leGNlbCk6CiAgICAgICAgICAgIGRlbGltaXRlciA9ICIgIgogICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUKICAgICAgICAgICAgZXNjYXBlY2hhciA9ICJcXCIKCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoImFiYyBkZWZcbmMxY2NjY2MxIGJlbnplbmVcbiIpCiAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQogICAgICAgICAgICByZHIgPSBjc3YucmVhZGVyKGZpbGVvYmosIGRpYWxlY3Q9c3BhY2UoKSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZHIubmV4dCgpLCBbImFiYyIsICJkZWYiXSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZHIubmV4dCgpLCBbImMxY2NjY2MxIiwgImJlbnplbmUiXSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgZGVmIHRlc3RfZGlhbGVjdF9hcHBseShzZWxmKToKICAgICAgICBjbGFzcyB0ZXN0QShjc3YuZXhjZWwpOgogICAgICAgICAgICBkZWxpbWl0ZXIgPSAiXHQiCiAgICAgICAgY2xhc3MgdGVzdEIoY3N2LmV4Y2VsKToKICAgICAgICAgICAgZGVsaW1pdGVyID0gIjoiCiAgICAgICAgY2xhc3MgdGVzdEMoY3N2LmV4Y2VsKToKICAgICAgICAgICAgZGVsaW1pdGVyID0gInwiCgogICAgICAgIGNzdi5yZWdpc3Rlcl9kaWFsZWN0KCd0ZXN0QycsIHRlc3RDKQogICAgICAgIHRyeToKICAgICAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaikKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhbMSwyLDNdKQogICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAiMSwyLDNcclxuIikKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCB0ZXN0QSkKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhbMSwyLDNdKQogICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAiMVx0Mlx0M1xyXG4iKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKCiAgICAgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosIGRpYWxlY3Q9dGVzdEIoKSkKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhbMSwyLDNdKQogICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAiMToyOjNcclxuIikKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCBkaWFsZWN0PSd0ZXN0QycpCiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coWzEsMiwzXSkKICAgICAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgIjF8MnwzXHJcbiIpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKICAgICAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD10ZXN0QSwgZGVsaW1pdGVyPSc7JykKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhbMSwyLDNdKQogICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAiMTsyOzNcclxuIikKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGNzdi51bnJlZ2lzdGVyX2RpYWxlY3QoJ3Rlc3RDJykKCiAgICBkZWYgdGVzdF9iYWRfZGlhbGVjdChzZWxmKToKICAgICAgICAjIFVua25vd24gcGFyYW1ldGVyCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVhZGVyLCBbXSwgYmFkX2F0dHIgPSAwKQogICAgICAgICMgQmFkIHZhbHVlcwogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlYWRlciwgW10sIGRlbGltaXRlciA9IE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVhZGVyLCBbXSwgcXVvdGluZyA9IC0xKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlYWRlciwgW10sIHF1b3RpbmcgPSAxMDApCgpjbGFzcyBUZXN0Q3N2QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgcmVhZGVyQXNzZXJ0RXF1YWwoc2VsZiwgaW5wdXQsIGV4cGVjdGVkX3Jlc3VsdCk6CiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoaW5wdXQpCiAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQogICAgICAgICAgICByZWFkZXIgPSBjc3YucmVhZGVyKGZpbGVvYmosIGRpYWxlY3QgPSBzZWxmLmRpYWxlY3QpCiAgICAgICAgICAgIGZpZWxkcyA9IGxpc3QocmVhZGVyKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpZWxkcywgZXhwZWN0ZWRfcmVzdWx0KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKCiAgICBkZWYgd3JpdGVyQXNzZXJ0RXF1YWwoc2VsZiwgaW5wdXQsIGV4cGVjdGVkX3Jlc3VsdCk6CiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdCA9IHNlbGYuZGlhbGVjdCkKICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93cyhpbnB1dCkKICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksIGV4cGVjdGVkX3Jlc3VsdCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgpjbGFzcyBUZXN0RGlhbGVjdEV4Y2VsKFRlc3RDc3ZCYXNlKToKICAgIGRpYWxlY3QgPSAnZXhjZWwnCgogICAgZGVmIHRlc3Rfc2luZ2xlKHNlbGYpOgogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJ2FiYycsIFtbJ2FiYyddXSkKCiAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnMSwyLDMsNCw1JywgW1snMScsJzInLCczJywnNCcsJzUnXV0pCgogICAgZGVmIHRlc3RfYmxhbmtsaW5lKHNlbGYpOgogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJycsIFtdKQoKICAgIGRlZiB0ZXN0X2VtcHR5X2ZpZWxkcyhzZWxmKToKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcsJywgW1snJywgJyddXSkKCiAgICBkZWYgdGVzdF9zaW5nbGVxdW90ZWQoc2VsZik6CiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnIiInLCBbWycnXV0pCgogICAgZGVmIHRlc3Rfc2luZ2xlcXVvdGVkX2xlZnRfZW1wdHkoc2VsZik6CiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnIiIsJywgW1snJywnJ11dKQoKICAgIGRlZiB0ZXN0X3NpbmdsZXF1b3RlZF9yaWdodF9lbXB0eShzZWxmKToKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcsIiInLCBbWycnLCcnXV0pCgogICAgZGVmIHRlc3Rfc2luZ2xlX3F1b3RlZF9xdW90ZShzZWxmKToKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCciIiIiJywgW1snIiddXSkKCiAgICBkZWYgdGVzdF9xdW90ZWRfcXVvdGVzKHNlbGYpOgogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyIiIiIiIicsIFtbJyIiJ11dKQoKICAgIGRlZiB0ZXN0X2lubGluZV9xdW90ZShzZWxmKToKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCdhIiJiJywgW1snYSIiYiddXSkKCiAgICBkZWYgdGVzdF9pbmxpbmVfcXVvdGVzKHNlbGYpOgogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJ2EiYiJjJywgW1snYSJiImMnXV0pCgogICAgZGVmIHRlc3RfcXVvdGVzX2FuZF9tb3JlKHNlbGYpOgogICAgICAgICMgRXhjZWwgd291bGQgbmV2ZXIgd3JpdGUgYSBmaWVsZCBjb250YWluaW5nICciYSJiJywgYnV0IHdoZW4KICAgICAgICAjIHJlYWRpbmcgb25lLCBpdCB3aWxsIHJldHVybiAnYWInLgogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyJhImInLCBbWydhYiddXSkKCiAgICBkZWYgdGVzdF9sb25lX3F1b3RlKHNlbGYpOgogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJ2EiYicsIFtbJ2EiYiddXSkKCiAgICBkZWYgdGVzdF9xdW90ZV9hbmRfcXVvdGUoc2VsZik6CiAgICAgICAgIyBFeGNlbCB3b3VsZCBuZXZlciB3cml0ZSBhIGZpZWxkIGNvbnRhaW5pbmcgJyJhIiAiYiInLCBidXQgd2hlbgogICAgICAgICMgcmVhZGluZyBvbmUsIGl0IHdpbGwgcmV0dXJuICdhICJiIicuCiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnImEiICJiIicsIFtbJ2EgImIiJ11dKQoKICAgIGRlZiB0ZXN0X3NwYWNlX2FuZF9xdW90ZShzZWxmKToKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcgImEiJywgW1snICJhIiddXSkKCiAgICBkZWYgdGVzdF9xdW90ZWQoc2VsZik6CiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnMSwyLDMsIkkgdGhpbmssIHRoZXJlZm9yZSBJIGFtIiw1LDYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1snMScsICcyJywgJzMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSSB0aGluaywgdGhlcmVmb3JlIEkgYW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNScsICc2J11dKQoKICAgIGRlZiB0ZXN0X3F1b3RlZF9xdW90ZShzZWxmKToKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcxLDIsMywiIiJJIHNlZSwiIiBzYWlkIHRoZSBibGluZCBtYW4iLCJhcyBoZSBwaWNrZWQgdXAgaGlzIGhhbW1lciBhbmQgc2F3IicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWycxJywgJzInLCAnMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciSSBzZWUsIiBzYWlkIHRoZSBibGluZCBtYW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXMgaGUgcGlja2VkIHVwIGhpcyBoYW1tZXIgYW5kIHNhdyddXSkKCiAgICBkZWYgdGVzdF9xdW90ZWRfbmwoc2VsZik6CiAgICAgICAgaW5wdXQgPSAnJydcCjEsMiwzLCIiIkkgc2VlLCIiCnNhaWQgdGhlIGJsaW5kIG1hbiIsImFzIGhlIHBpY2tlZCB1cCBoaXMKaGFtbWVyIGFuZCBzYXciCjksOCw3LDYnJycKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1snMScsICcyJywgJzMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciSSBzZWUsIlxuc2FpZCB0aGUgYmxpbmQgbWFuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXMgaGUgcGlja2VkIHVwIGhpc1xuaGFtbWVyIGFuZCBzYXcnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJzknLCc4JywnNycsJzYnXV0pCgogICAgZGVmIHRlc3RfZHViaW91c19xdW90ZShzZWxmKToKICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcxMiwxMiwxIiwnLCBbWycxMicsICcxMicsICcxIicsICcnXV0pCgogICAgZGVmIHRlc3RfbnVsbChzZWxmKToKICAgICAgICBzZWxmLndyaXRlckFzc2VydEVxdWFsKFtdLCAnJykKCiAgICBkZWYgdGVzdF9zaW5nbGVfd3JpdGVyKHNlbGYpOgogICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW1snYWJjJ11dLCAnYWJjXHJcbicpCgogICAgZGVmIHRlc3Rfc2ltcGxlX3dyaXRlcihzZWxmKToKICAgICAgICBzZWxmLndyaXRlckFzc2VydEVxdWFsKFtbMSwgMiwgJ2FiYycsIDMsIDRdXSwgJzEsMixhYmMsMyw0XHJcbicpCgogICAgZGVmIHRlc3RfcXVvdGVzKHNlbGYpOgogICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW1sxLCAyLCAnYSJiYyInLCAzLCA0XV0sICcxLDIsImEiImJjIiIiLDMsNFxyXG4nKQoKICAgIGRlZiB0ZXN0X3F1b3RlX2ZpZWxkc2VwKHNlbGYpOgogICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW1snYWJjLGRlZiddXSwgJyJhYmMsZGVmIlxyXG4nKQoKICAgIGRlZiB0ZXN0X25ld2xpbmVzKHNlbGYpOgogICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW1sxLCAyLCAnYVxuYmMnLCAzLCA0XV0sICcxLDIsImFcbmJjIiwzLDRcclxuJykKCmNsYXNzIEVzY2FwZWRFeGNlbChjc3YuZXhjZWwpOgogICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05FCiAgICBlc2NhcGVjaGFyID0gJ1xcJwoKY2xhc3MgVGVzdEVzY2FwZWRFeGNlbChUZXN0Q3N2QmFzZSk6CiAgICBkaWFsZWN0ID0gRXNjYXBlZEV4Y2VsKCkKCiAgICBkZWYgdGVzdF9lc2NhcGVfZmllbGRzZXAoc2VsZik6CiAgICAgICAgc2VsZi53cml0ZXJBc3NlcnRFcXVhbChbWydhYmMsZGVmJ11dLCAnYWJjXFwsZGVmXHJcbicpCgogICAgZGVmIHRlc3RfcmVhZF9lc2NhcGVfZmllbGRzZXAoc2VsZik6CiAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnYWJjXFwsZGVmXHJcbicsIFtbJ2FiYyxkZWYnXV0pCgpjbGFzcyBRdW90ZWRFc2NhcGVkRXhjZWwoY3N2LmV4Y2VsKToKICAgIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9OTlVNRVJJQwogICAgZXNjYXBlY2hhciA9ICdcXCcKCmNsYXNzIFRlc3RRdW90ZWRFc2NhcGVkRXhjZWwoVGVzdENzdkJhc2UpOgogICAgZGlhbGVjdCA9IFF1b3RlZEVzY2FwZWRFeGNlbCgpCgogICAgZGVmIHRlc3Rfd3JpdGVfZXNjYXBlX2ZpZWxkc2VwKHNlbGYpOgogICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW1snYWJjLGRlZiddXSwgJyJhYmMsZGVmIlxyXG4nKQoKICAgIGRlZiB0ZXN0X3JlYWRfZXNjYXBlX2ZpZWxkc2VwKHNlbGYpOgogICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyJhYmNcXCxkZWYiXHJcbicsIFtbJ2FiYyxkZWYnXV0pCgpjbGFzcyBUZXN0RGljdEZpZWxkcyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAjIyMgImxvbmciIG1lYW5zIHRoZSByb3cgaXMgbG9uZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBmaWVsZG5hbWVzCiAgICAjIyMgInNob3J0IiBtZWFucyB0aGVyZSBhcmUgZmV3ZXIgZWxlbWVudHMgaW4gdGhlIHJvdyB0aGFuIGZpZWxkbmFtZXMKICAgIGRlZiB0ZXN0X3dyaXRlX3NpbXBsZV9kaWN0KHNlbGYpOgogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgZmlsZW9iaiA9IGlvLm9wZW4oZmQsICd3K2InKQogICAgICAgIHRyeToKICAgICAgICAgICAgd3JpdGVyID0gY3N2LkRpY3RXcml0ZXIoZmlsZW9iaiwgZmllbGRuYW1lcyA9IFsiZjEiLCAiZjIiLCAiZjMiXSkKICAgICAgICAgICAgd3JpdGVyLndyaXRlaGVhZGVyKCkKICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkbGluZSgpLCAiZjEsZjIsZjNcclxuIikKICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KHsiZjEiOiAxMCwgImYzIjogImFiYyJ9KQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKICAgICAgICAgICAgZmlsZW9iai5yZWFkbGluZSgpICMgaGVhZGVyCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksICIxMCwsYWJjXHJcbiIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKICAgIGRlZiB0ZXN0X3dyaXRlX25vX2ZpZWxkcyhzZWxmKToKICAgICAgICBmaWxlb2JqID0gU3RyaW5nSU8oKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LkRpY3RXcml0ZXIsIGZpbGVvYmopCgogICAgZGVmIHRlc3Rfd3JpdGVfZmllbGRzX25vdF9pbl9maWVsZG5hbWVzKHNlbGYpOgogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3cml0ZXIgPSBjc3YuRGljdFdyaXRlcihmaWxlb2JqLCBmaWVsZG5hbWVzID0gWyJmMSIsICJmMiIsICJmMyJdKQogICAgICAgICAgICAjIE9mIHNwZWNpYWwgbm90ZSBpcyB0aGUgbm9uLXN0cmluZyBrZXkgKGlzc3VlIDE5NDQ5KQogICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpIGFzIGN4OgogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KHsiZjQiOiAxMCwgImYyIjogInNwYW0iLCAxOiAiYWJjIn0pCiAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHN0cihjeC5leGNlcHRpb24pCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImZpZWxkbmFtZXMiLCBleGNlcHRpb24pCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIidmNCciLCBleGNlcHRpb24pCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIidmMiciLCBleGNlcHRpb24pCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIjEiLCBleGNlcHRpb24pCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKICAgIGRlZiB0ZXN0X3JlYWRfZGljdF9maWVsZHMoc2VsZik6CiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoIjEsMixhYmNcclxuIikKICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGZpbGVvYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkbmFtZXM9WyJmMSIsICJmMiIsICJmMyJdKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiZjEiOiAnMScsICJmMiI6ICcyJywgImYzIjogJ2FiYyd9KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKCiAgICBkZWYgdGVzdF9yZWFkX2RpY3Rfbm9fZmllbGRuYW1lcyhzZWxmKToKICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQogICAgICAgIHRyeToKICAgICAgICAgICAgZmlsZW9iai53cml0ZSgiZjEsZjIsZjNcclxuMSwyLGFiY1xyXG4iKQogICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKICAgICAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoZmlsZW9iaikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIuZmllbGRuYW1lcywgWyJmMSIsICJmMiIsICJmMyJdKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiZjEiOiAnMScsICJmMiI6ICcyJywgImYzIjogJ2FiYyd9KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKCiAgICAjIFR3byB0ZXN0IGNhc2VzIHRvIG1ha2Ugc3VyZSBleGlzdGluZyB3YXlzIG9mIGltcGxpY2l0bHkgc2V0dGluZwogICAgIyBmaWVsZG5hbWVzIGNvbnRpbnVlIHRvIHdvcmsuICBCb3RoIGFyaXNlIGZyb20gZGlzY3Vzc2lvbiBpbiBpc3N1ZTM0MzYuCiAgICBkZWYgdGVzdF9yZWFkX2RpY3RfZmllbGRuYW1lc19mcm9tX2ZpbGUoc2VsZik6CiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGYud3JpdGUoImYxLGYyLGYzXHJcbjEsMixhYmNcclxuIikKICAgICAgICAgICAgZi5zZWVrKDApCiAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGYsIGZpZWxkbmFtZXM9Y3N2LnJlYWRlcihmKS5uZXh0KCkpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLmZpZWxkbmFtZXMsIFsiZjEiLCAiZjIiLCAiZjMiXSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7ImYxIjogJzEnLCAiZjIiOiAnMicsICJmMyI6ICdhYmMnfSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgZGVmIHRlc3RfcmVhZF9kaWN0X2ZpZWxkbmFtZXNfY2hhaW4oc2VsZik6CiAgICAgICAgaW1wb3J0IGl0ZXJ0b29scwogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgZiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmLndyaXRlKCJmMSxmMixmM1xyXG4xLDIsYWJjXHJcbiIpCiAgICAgICAgICAgIGYuc2VlaygwKQogICAgICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihmKQogICAgICAgICAgICBmaXJzdCA9IG5leHQocmVhZGVyKQogICAgICAgICAgICBmb3Igcm93IGluIGl0ZXJ0b29scy5jaGFpbihbZmlyc3RdLCByZWFkZXIpOgogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIuZmllbGRuYW1lcywgWyJmMSIsICJmMiIsICJmMyJdKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3csIHsiZjEiOiAnMScsICJmMiI6ICcyJywgImYzIjogJ2FiYyd9KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKCiAgICBkZWYgdGVzdF9yZWFkX2xvbmcoc2VsZik6CiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoIjEsMixhYmMsNCw1LDZcclxuIikKICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGZpbGVvYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkbmFtZXM9WyJmMSIsICJmMiJdKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiZjEiOiAnMScsICJmMiI6ICcyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZTogWyJhYmMiLCAiNCIsICI1IiwgIjYiXX0pCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQoKICAgIGRlZiB0ZXN0X3JlYWRfbG9uZ193aXRoX3Jlc3Qoc2VsZik6CiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoIjEsMixhYmMsNCw1LDZcclxuIikKICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGZpbGVvYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkbmFtZXM9WyJmMSIsICJmMiJdLCByZXN0a2V5PSJfcmVzdCIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyJmMSI6ICcxJywgImYyIjogJzInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3Jlc3QiOiBbImFiYyIsICI0IiwgIjUiLCAiNiJdfSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgZGVmIHRlc3RfcmVhZF9sb25nX3dpdGhfcmVzdF9ub19maWVsZG5hbWVzKHNlbGYpOgogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmaWxlb2JqLndyaXRlKCJmMSxmMlxyXG4xLDIsYWJjLDQsNSw2XHJcbiIpCiAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQogICAgICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihmaWxlb2JqLCByZXN0a2V5PSJfcmVzdCIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLmZpZWxkbmFtZXMsIFsiZjEiLCAiZjIiXSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7ImYxIjogJzEnLCAiZjIiOiAnMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfcmVzdCI6IFsiYWJjIiwgIjQiLCAiNSIsICI2Il19KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKCiAgICBkZWYgdGVzdF9yZWFkX3Nob3J0KHNlbGYpOgogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmaWxlb2JqLndyaXRlKCIxLDIsYWJjLDQsNSw2XHJcbjEsMixhYmNcclxuIikKICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGZpbGVvYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkbmFtZXM9IjEgMiAzIDQgNSA2Ii5zcGxpdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0dmFsPSJERUZBVUxUIikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7IjEiOiAnMScsICIyIjogJzInLCAiMyI6ICdhYmMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNCI6ICc0JywgIjUiOiAnNScsICI2IjogJzYnfSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7IjEiOiAnMScsICIyIjogJzInLCAiMyI6ICdhYmMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNCI6ICdERUZBVUxUJywgIjUiOiAnREVGQVVMVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2IjogJ0RFRkFVTFQnfSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgZGVmIHRlc3RfcmVhZF9tdWx0aShzZWxmKToKICAgICAgICBzYW1wbGUgPSBbCiAgICAgICAgICAgICcyMTQ3NDgzNjQ4LDQzLjBlMTIsMTcsYWJjLGRlZlxyXG4nLAogICAgICAgICAgICAnMTQ3NDgzNjQ4LDQzLjBlMiwxNyxhYmMsZGVmXHJcbicsCiAgICAgICAgICAgICc0NzQ4MzY0OCw0My4wLDE3MCxhYmMsZGVmXHJcbicKICAgICAgICAgICAgXQoKICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihzYW1wbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz0iaTEgZmxvYXQgaTIgczEgczIiLnNwbGl0KCkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7ImkxIjogJzIxNDc0ODM2NDgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdCI6ICc0My4wZTEyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTIiOiAnMTcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzMSI6ICdhYmMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzMiI6ICdkZWYnfSkKCiAgICBkZWYgdGVzdF9yZWFkX3dpdGhfYmxhbmtzKHNlbGYpOgogICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKFsiMSwyLGFiYyw0LDUsNlxyXG4iLCJcclxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEsMixhYmMsNCw1LDZcclxuIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz0iMSAyIDMgNCA1IDYiLnNwbGl0KCkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7IjEiOiAnMScsICIyIjogJzInLCAiMyI6ICdhYmMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IjogJzQnLCAiNSI6ICc1JywgIjYiOiAnNid9KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyIxIjogJzEnLCAiMiI6ICcyJywgIjMiOiAnYWJjJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNCI6ICc0JywgIjUiOiAnNScsICI2IjogJzYnfSkKCiAgICBkZWYgdGVzdF9yZWFkX3NlbWlfc2VwKHNlbGYpOgogICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKFsiMTsyO2FiYzs0OzU7NlxyXG4iXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzPSIxIDIgMyA0IDUgNiIuc3BsaXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXI9JzsnKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyIxIjogJzEnLCAiMiI6ICcyJywgIjMiOiAnYWJjJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNCI6ICc0JywgIjUiOiAnNScsICI2IjogJzYnfSkKCmNsYXNzIFRlc3RBcnJheVdyaXRlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgdGVzdF9pbnRfd3JpdGUoc2VsZik6CiAgICAgICAgaW1wb3J0IGFycmF5CiAgICAgICAgY29udGVudHMgPSBbKDIwLWkpIGZvciBpIGluIHJhbmdlKDIwKV0KICAgICAgICBhID0gYXJyYXkuYXJyYXkoJ2knLCBjb250ZW50cykKCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD0iZXhjZWwiKQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coYSkKICAgICAgICAgICAgZXhwZWN0ZWQgPSAiLCIuam9pbihbc3RyKGkpIGZvciBpIGluIGFdKSsiXHJcbiIKICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksIGV4cGVjdGVkKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKCiAgICBkZWYgdGVzdF9kb3VibGVfd3JpdGUoc2VsZik6CiAgICAgICAgaW1wb3J0IGFycmF5CiAgICAgICAgY29udGVudHMgPSBbKDIwLWkpKjAuMSBmb3IgaSBpbiByYW5nZSgyMCldCiAgICAgICAgYSA9IGFycmF5LmFycmF5KCdkJywgY29udGVudHMpCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD0iZXhjZWwiKQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coYSkKICAgICAgICAgICAgZXhwZWN0ZWQgPSAiLCIuam9pbihbcmVwcihpKSBmb3IgaSBpbiBhXSkrIlxyXG4iCiAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCBleHBlY3RlZCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgZGVmIHRlc3RfZmxvYXRfd3JpdGUoc2VsZik6CiAgICAgICAgaW1wb3J0IGFycmF5CiAgICAgICAgY29udGVudHMgPSBbKDIwLWkpKjAuMSBmb3IgaSBpbiByYW5nZSgyMCldCiAgICAgICAgYSA9IGFycmF5LmFycmF5KCdmJywgY29udGVudHMpCiAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD0iZXhjZWwiKQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coYSkKICAgICAgICAgICAgZXhwZWN0ZWQgPSAiLCIuam9pbihbcmVwcihpKSBmb3IgaSBpbiBhXSkrIlxyXG4iCiAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCBleHBlY3RlZCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgogICAgZGVmIHRlc3RfY2hhcl93cml0ZShzZWxmKToKICAgICAgICBpbXBvcnQgYXJyYXksIHN0cmluZwogICAgICAgIGEgPSBhcnJheS5hcnJheSgnYycsIHN0cmluZy5sZXR0ZXJzKQogICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosIGRpYWxlY3Q9ImV4Y2VsIikKICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KGEpCiAgICAgICAgICAgIGV4cGVjdGVkID0gIiwiLmpvaW4oYSkrIlxyXG4iCiAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCBleHBlY3RlZCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCgpjbGFzcyBUZXN0RGlhbGVjdFZhbGlkaXR5KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X3F1b3Rpbmcoc2VsZik6CiAgICAgICAgY2xhc3MgbXlkaWFsZWN0KGNzdi5EaWFsZWN0KToKICAgICAgICAgICAgZGVsaW1pdGVyID0gIjsiCiAgICAgICAgICAgIGVzY2FwZWNoYXIgPSAnXFwnCiAgICAgICAgICAgIGRvdWJsZXF1b3RlID0gRmFsc2UKICAgICAgICAgICAgc2tpcGluaXRpYWxzcGFjZSA9IFRydWUKICAgICAgICAgICAgbGluZXRlcm1pbmF0b3IgPSAnXHJcbicKICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05FCiAgICAgICAgZCA9IG15ZGlhbGVjdCgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnF1b3RpbmcsIGNzdi5RVU9URV9OT05FKQoKICAgICAgICBteWRpYWxlY3QucXVvdGluZyA9IE5vbmUKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIG15ZGlhbGVjdCkKCiAgICAgICAgbXlkaWFsZWN0LmRvdWJsZXF1b3RlID0gVHJ1ZQogICAgICAgIG15ZGlhbGVjdC5xdW90aW5nID0gY3N2LlFVT1RFX0FMTAogICAgICAgIG15ZGlhbGVjdC5xdW90ZWNoYXIgPSAnIicKICAgICAgICBkID0gbXlkaWFsZWN0KCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucXVvdGluZywgY3N2LlFVT1RFX0FMTCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucXVvdGVjaGFyLCAnIicpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZG91YmxlcXVvdGUpCgogICAgICAgIG15ZGlhbGVjdC5xdW90ZWNoYXIgPSAiJyciCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IpIGFzIGNtOgogICAgICAgICAgICBteWRpYWxlY3QoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAnInF1b3RlY2hhciIgbXVzdCBiZSBhbiAxLWNoYXJhY3RlciBzdHJpbmcnKQoKICAgICAgICBteWRpYWxlY3QucXVvdGVjaGFyID0gNAogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yKSBhcyBjbToKICAgICAgICAgICAgbXlkaWFsZWN0KCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgJyJxdW90ZWNoYXIiIG11c3QgYmUgc3RyaW5nLCBub3QgaW50JykKCiAgICBkZWYgdGVzdF9kZWxpbWl0ZXIoc2VsZik6CiAgICAgICAgY2xhc3MgbXlkaWFsZWN0KGNzdi5EaWFsZWN0KToKICAgICAgICAgICAgZGVsaW1pdGVyID0gIjsiCiAgICAgICAgICAgIGVzY2FwZWNoYXIgPSAnXFwnCiAgICAgICAgICAgIGRvdWJsZXF1b3RlID0gRmFsc2UKICAgICAgICAgICAgc2tpcGluaXRpYWxzcGFjZSA9IFRydWUKICAgICAgICAgICAgbGluZXRlcm1pbmF0b3IgPSAnXHJcbicKICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05FCiAgICAgICAgZCA9IG15ZGlhbGVjdCgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmRlbGltaXRlciwgIjsiKQoKICAgICAgICBteWRpYWxlY3QuZGVsaW1pdGVyID0gIjo6OiIKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvcikgYXMgY206CiAgICAgICAgICAgIG15ZGlhbGVjdCgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgICciZGVsaW1pdGVyIiBtdXN0IGJlIGFuIDEtY2hhcmFjdGVyIHN0cmluZycpCgogICAgICAgIG15ZGlhbGVjdC5kZWxpbWl0ZXIgPSAiIgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yKSBhcyBjbToKICAgICAgICAgICAgbXlkaWFsZWN0KCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgJyJkZWxpbWl0ZXIiIG11c3QgYmUgYW4gMS1jaGFyYWN0ZXIgc3RyaW5nJykKCiAgICAgICAgbXlkaWFsZWN0LmRlbGltaXRlciA9IHUiLCIKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvcikgYXMgY206CiAgICAgICAgICAgIG15ZGlhbGVjdCgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgICciZGVsaW1pdGVyIiBtdXN0IGJlIHN0cmluZywgbm90IHVuaWNvZGUnKQoKICAgICAgICBteWRpYWxlY3QuZGVsaW1pdGVyID0gNAogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yKSBhcyBjbToKICAgICAgICAgICAgbXlkaWFsZWN0KCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgJyJkZWxpbWl0ZXIiIG11c3QgYmUgc3RyaW5nLCBub3QgaW50JykKCiAgICBkZWYgdGVzdF9saW5ldGVybWluYXRvcihzZWxmKToKICAgICAgICBjbGFzcyBteWRpYWxlY3QoY3N2LkRpYWxlY3QpOgogICAgICAgICAgICBkZWxpbWl0ZXIgPSAiOyIKICAgICAgICAgICAgZXNjYXBlY2hhciA9ICdcXCcKICAgICAgICAgICAgZG91YmxlcXVvdGUgPSBGYWxzZQogICAgICAgICAgICBza2lwaW5pdGlhbHNwYWNlID0gVHJ1ZQogICAgICAgICAgICBsaW5ldGVybWluYXRvciA9ICdcclxuJwogICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUKICAgICAgICBkID0gbXlkaWFsZWN0KCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQubGluZXRlcm1pbmF0b3IsICdcclxuJykKCiAgICAgICAgbXlkaWFsZWN0LmxpbmV0ZXJtaW5hdG9yID0gIjo6OiIKICAgICAgICBkID0gbXlkaWFsZWN0KCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQubGluZXRlcm1pbmF0b3IsICI6OjoiKQoKICAgICAgICBteWRpYWxlY3QubGluZXRlcm1pbmF0b3IgPSA0CiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IpIGFzIGNtOgogICAgICAgICAgICBteWRpYWxlY3QoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAnImxpbmV0ZXJtaW5hdG9yIiBtdXN0IGJlIGEgc3RyaW5nJykKCgpjbGFzcyBUZXN0U25pZmZlcih1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBzYW1wbGUxID0gIiIiXApIYXJyeSdzLCBBcmxpbmd0b24gSGVpZ2h0cywgSUwsIDIvMS8wMywgS2ltaSBIYXllcwpTaGFyayBDaXR5LCBHbGVuZGFsZSBIZWlnaHRzLCBJTCwgMTIvMjgvMDIsIFByZXplbmNlClRvbW15J3MgUGxhY2UsIEJsdWUgSXNsYW5kLCBJTCwgMTIvMjgvMDIsIEJsdWUgU3VuZGF5L1doaXRlIENyb3cKU3RvbmVjdXR0ZXJzIFNlYWZvb2QgYW5kIENob3AgSG91c2UsIExlbW9udCwgSUwsIDEyLzE5LzAyLCBXZWVrIEJhY2sKIiIiCiAgICBzYW1wbGUyID0gIiIiXAonSGFycnknJ3MnOidBcmxpbmd0b24gSGVpZ2h0cyc6J0lMJzonMi8xLzAzJzonS2ltaSBIYXllcycKJ1NoYXJrIENpdHknOidHbGVuZGFsZSBIZWlnaHRzJzonSUwnOicxMi8yOC8wMic6J1ByZXplbmNlJwonVG9tbXknJ3MgUGxhY2UnOidCbHVlIElzbGFuZCc6J0lMJzonMTIvMjgvMDInOidCbHVlIFN1bmRheS9XaGl0ZSBDcm93JwonU3RvbmVjdXR0ZXJzICcnU2VhZm9vZCcnIGFuZCBDaG9wIEhvdXNlJzonTGVtb250JzonSUwnOicxMi8xOS8wMic6J1dlZWsgQmFjaycKIiIiCiAgICBoZWFkZXIxID0gJycnXAoidmVudWUiLCJjaXR5Iiwic3RhdGUiLCJkYXRlIiwicGVyZm9ybWVycyIKJycnCiAgICBzYW1wbGUzID0gJycnXAowNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMwowNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMwowNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMwonJycKCiAgICBzYW1wbGU0ID0gJycnXAoyMTQ3NDgzNjQ4OzQzLjBlMTI7MTc7YWJjO2RlZgoxNDc0ODM2NDg7NDMuMGUyOzE3O2FiYztkZWYKNDc0ODM2NDg7NDMuMDsxNzA7YWJjO2RlZgonJycKCiAgICBzYW1wbGU1ID0gImFhYVx0YmJiXHJcbkFBQVx0XHJcbkJCQlx0XHJcbiIKICAgIHNhbXBsZTYgPSAiYXxifGNcclxuZHxlfGZcclxuIgogICAgc2FtcGxlNyA9ICInYSd8J2InfCdjJ1xyXG4nZCd8ZXxmXHJcbiIKCiMgSXNzdWUgMTgxNTU6IFVzZSBhIGRlbGltaXRlciB0aGF0IGlzIGEgc3BlY2lhbCBjaGFyIHRvIHJlZ2V4OgoKICAgIGhlYWRlcjIgPSAnJydcCiJ2ZW51ZSIrImNpdHkiKyJzdGF0ZSIrImRhdGUiKyJwZXJmb3JtZXJzIgonJycKICAgIHNhbXBsZTggPSAiIiJcCkhhcnJ5J3MrIEFybGluZ3RvbiBIZWlnaHRzKyBJTCsgMi8xLzAzKyBLaW1pIEhheWVzClNoYXJrIENpdHkrIEdsZW5kYWxlIEhlaWdodHMrIElMKyAxMi8yOC8wMisgUHJlemVuY2UKVG9tbXkncyBQbGFjZSsgQmx1ZSBJc2xhbmQrIElMKyAxMi8yOC8wMisgQmx1ZSBTdW5kYXkvV2hpdGUgQ3JvdwpTdG9uZWN1dHRlcnMgU2VhZm9vZCBhbmQgQ2hvcCBIb3VzZSsgTGVtb250KyBJTCsgMTIvMTkvMDIrIFdlZWsgQmFjawoiIiIKICAgIHNhbXBsZTkgPSAiIiJcCidIYXJyeScncycrIEFybGluZ3RvbiBIZWlnaHRzJysgJ0lMJysgJzIvMS8wMycrICdLaW1pIEhheWVzJwonU2hhcmsgQ2l0eScrIEdsZW5kYWxlIEhlaWdodHMnKycgSUwnKyAnMTIvMjgvMDInKyAnUHJlemVuY2UnCidUb21teScncyBQbGFjZScrIEJsdWUgSXNsYW5kJysgJ0lMJysgJzEyLzI4LzAyJysgJ0JsdWUgU3VuZGF5L1doaXRlIENyb3cnCidTdG9uZWN1dHRlcnMgJydTZWFmb29kJycgYW5kIENob3AgSG91c2UnKyAnTGVtb250JysgJ0lMJysgJzEyLzE5LzAyJysgJ1dlZWsgQmFjaycKIiIiCgogICAgZGVmIHRlc3RfaGFzX2hlYWRlcihzZWxmKToKICAgICAgICBzbmlmZmVyID0gY3N2LlNuaWZmZXIoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25pZmZlci5oYXNfaGVhZGVyKHNlbGYuc2FtcGxlMSksIEZhbHNlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25pZmZlci5oYXNfaGVhZGVyKHNlbGYuaGVhZGVyMSArIHNlbGYuc2FtcGxlMSksCiAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlKQoKICAgIGRlZiB0ZXN0X2hhc19oZWFkZXJfcmVnZXhfc3BlY2lhbF9kZWxpbWl0ZXIoc2VsZik6CiAgICAgICAgc25pZmZlciA9IGNzdi5TbmlmZmVyKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuaWZmZXIuaGFzX2hlYWRlcihzZWxmLnNhbXBsZTgpLCBGYWxzZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuaWZmZXIuaGFzX2hlYWRlcihzZWxmLmhlYWRlcjIgKyBzZWxmLnNhbXBsZTgpLAogICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSkKCiAgICBkZWYgdGVzdF9zbmlmZihzZWxmKToKICAgICAgICBzbmlmZmVyID0gY3N2LlNuaWZmZXIoKQogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlMSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAiLCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LnF1b3RlY2hhciwgJyInKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5za2lwaW5pdGlhbHNwYWNlLCBUcnVlKQoKICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LmRlbGltaXRlciwgIjoiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5xdW90ZWNoYXIsICInIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3Quc2tpcGluaXRpYWxzcGFjZSwgRmFsc2UpCgogICAgZGVmIHRlc3RfZGVsaW1pdGVycyhzZWxmKToKICAgICAgICBzbmlmZmVyID0gY3N2LlNuaWZmZXIoKQogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlMykKICAgICAgICAjIGdpdmVuIHRoYXQgYWxsIHRocmVlIGxpbmVzIGluIHNhbXBsZTMgYXJlIGVxdWFsLAogICAgICAgICMgSSB0aGluayB0aGF0IGFueSBjaGFyYWN0ZXIgY291bGQgaGF2ZSBiZWVuICdndWVzc2VkJyBhcyB0aGUKICAgICAgICAjIGRlbGltaXRlciwgZGVwZW5kaW5nIG9uIGRpY3Rpb25hcnkgb3JkZXIKICAgICAgICBzZWxmLmFzc2VydEluKGRpYWxlY3QuZGVsaW1pdGVyLCBzZWxmLnNhbXBsZTMpCiAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGUzLCBkZWxpbWl0ZXJzPSI/LCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LmRlbGltaXRlciwgIj8iKQogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlMywgZGVsaW1pdGVycz0iLywiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICIvIikKICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTQpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LmRlbGltaXRlciwgIjsiKQogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlNSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAiXHQiKQogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlNikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAifCIpCiAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGU3KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICJ8IikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QucXVvdGVjaGFyLCAiJyIpCiAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGU4KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICcrJykKICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LmRlbGltaXRlciwgJysnKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5xdW90ZWNoYXIsICInIikKCiAgICBkZWYgdGVzdF9kb3VibGVxdW90ZShzZWxmKToKICAgICAgICBzbmlmZmVyID0gY3N2LlNuaWZmZXIoKQogICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuaGVhZGVyMSkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGRpYWxlY3QuZG91YmxlcXVvdGUpCiAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5oZWFkZXIyKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZGlhbGVjdC5kb3VibGVxdW90ZSkKICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxlY3QuZG91YmxlcXVvdGUpCiAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGU4KQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZGlhbGVjdC5kb3VibGVxdW90ZSkKICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTkpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxlY3QuZG91YmxlcXVvdGUpCgpjbGFzcyBOVUw6CiAgICBkZWYgd3JpdGUocywgKmFyZ3MpOgogICAgICAgIHBhc3MKICAgIHdyaXRlbGluZXMgPSB3cml0ZQoKQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50IiksCiAgICAgICAgICAgICAgICAgICAgICdyZXF1aXJlcyBzeXMuZ2V0dG90YWxyZWZjb3VudCgpJykKY2xhc3MgVGVzdExlYWtzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X2NyZWF0ZV9yZWFkKHNlbGYpOgogICAgICAgIGRlbHRhID0gMAogICAgICAgIGxhc3RyYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjApOgogICAgICAgICAgICBnYy5jb2xsZWN0KCkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnYy5nYXJiYWdlLCBbXSkKICAgICAgICAgICAgcmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCiAgICAgICAgICAgIGNzdi5yZWFkZXIoWyJhLGIsY1xyXG4iXSkKICAgICAgICAgICAgY3N2LnJlYWRlcihbImEsYixjXHJcbiJdKQogICAgICAgICAgICBjc3YucmVhZGVyKFsiYSxiLGNcclxuIl0pCiAgICAgICAgICAgIGRlbHRhID0gcmMtbGFzdHJjCiAgICAgICAgICAgIGxhc3RyYyA9IHJjCiAgICAgICAgIyBpZiBjc3YucmVhZGVyKCkgbGVha3MsIGxhc3QgZGVsdGEgc2hvdWxkIGJlIDMgb3IgbW9yZQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVsdGEgPCAzLCBUcnVlKQoKICAgIGRlZiB0ZXN0X2NyZWF0ZV93cml0ZShzZWxmKToKICAgICAgICBkZWx0YSA9IDAKICAgICAgICBsYXN0cmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCiAgICAgICAgcyA9IE5VTCgpCiAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIwKToKICAgICAgICAgICAgZ2MuY29sbGVjdCgpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuZ2FyYmFnZSwgW10pCiAgICAgICAgICAgIHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQogICAgICAgICAgICBjc3Yud3JpdGVyKHMpCiAgICAgICAgICAgIGNzdi53cml0ZXIocykKICAgICAgICAgICAgY3N2LndyaXRlcihzKQogICAgICAgICAgICBkZWx0YSA9IHJjLWxhc3RyYwogICAgICAgICAgICBsYXN0cmMgPSByYwogICAgICAgICMgaWYgY3N2LndyaXRlcigpIGxlYWtzLCBsYXN0IGRlbHRhIHNob3VsZCBiZSAzIG9yIG1vcmUKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlbHRhIDwgMywgVHJ1ZSkKCiAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgogICAgICAgIGRlbHRhID0gMAogICAgICAgIHJvd3MgPSBbImEsYixjXHJcbiJdKjUKICAgICAgICBsYXN0cmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCiAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIwKToKICAgICAgICAgICAgZ2MuY29sbGVjdCgpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuZ2FyYmFnZSwgW10pCiAgICAgICAgICAgIHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQogICAgICAgICAgICByZHIgPSBjc3YucmVhZGVyKHJvd3MpCiAgICAgICAgICAgIGZvciByb3cgaW4gcmRyOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBkZWx0YSA9IHJjLWxhc3RyYwogICAgICAgICAgICBsYXN0cmMgPSByYwogICAgICAgICMgaWYgcmVhZGVyIGxlYWtzIGR1cmluZyByZWFkLCBkZWx0YSBzaG91bGQgYmUgNSBvciBtb3JlCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWx0YSA8IDUsIFRydWUpCgogICAgZGVmIHRlc3Rfd3JpdGUoc2VsZik6CiAgICAgICAgZGVsdGEgPSAwCiAgICAgICAgcm93cyA9IFtbMSwyLDNdXSo1CiAgICAgICAgcyA9IE5VTCgpCiAgICAgICAgbGFzdHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQogICAgICAgIGZvciBpIGluIHhyYW5nZSgyMCk6CiAgICAgICAgICAgIGdjLmNvbGxlY3QoKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmdhcmJhZ2UsIFtdKQogICAgICAgICAgICByYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihzKQogICAgICAgICAgICBmb3Igcm93IGluIHJvd3M6CiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3cocm93KQogICAgICAgICAgICBkZWx0YSA9IHJjLWxhc3RyYwogICAgICAgICAgICBsYXN0cmMgPSByYwogICAgICAgICMgaWYgd3JpdGVyIGxlYWtzIGR1cmluZyB3cml0ZSwgbGFzdCBkZWx0YSBzaG91bGQgYmUgNSBvciBtb3JlCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWx0YSA8IDUsIFRydWUpCgojIGNvbW1lbnRlZCBvdXQgZm9yIG5vdyAtIGNzdiBtb2R1bGUgZG9lc24ndCB5ZXQgc3VwcG9ydCBVbmljb2RlCiMjIGNsYXNzIFRlc3RVbmljb2RlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIyMgICAgIGRlZiB0ZXN0X3VuaWNvZGVfcmVhZChzZWxmKToKIyMgICAgICAgICBpbXBvcnQgY29kZWNzCiMjICAgICAgICAgZiA9IGNvZGVjcy5FbmNvZGVkRmlsZShTdHJpbmdJTygiTWFydGluIHZvbiBM9ndpcywiCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFyYyBBbmRy6SBMZW1idXJnLCIKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHdWlkbyB2YW4gUm9zc3VtLCIKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFu529pcyBQaW5hcmRcclxuIiksCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2VuY29kaW5nPSdpc28tODg1OS0xJykKIyMgICAgICAgICByZWFkZXIgPSBjc3YucmVhZGVyKGYpCiMjICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJlYWRlciksIFtbdSJNYXJ0aW4gdm9uIEz2d2lzIiwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ik1hcmMgQW5kcukgTGVtYnVyZyIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSJHdWlkbyB2YW4gUm9zc3VtIiwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1IkZyYW7nb2lzIFBpbmFyZG4iXV0pCgpkZWYgdGVzdF9tYWluKCk6CiAgICBtb2QgPSBzeXMubW9kdWxlc1tfX25hbWVfX10KICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCiAgICAgICAgKltnZXRhdHRyKG1vZCwgbmFtZSkgZm9yIG5hbWUgaW4gZGlyKG1vZCkgaWYgbmFtZS5zdGFydHN3aXRoKCdUZXN0JyldCiAgICApCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgdGVzdF9tYWluKCkK