IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIiIiVGVzdHMgZm9yIGNvb2tpZWxpYi5weS4iIiIKCmltcG9ydCByZSwgb3MsIHRpbWUKZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2UKCmZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CgpjbGFzcyBEYXRlVGltZVRlc3RzKFRlc3RDYXNlKToKCiAgICBkZWYgdGVzdF90aW1lMmlzb3ooc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHRpbWUyaXNvegoKICAgICAgICBiYXNlID0gMTAxOTIyNzAwMAogICAgICAgIGRheSA9IDI0KjM2MDAKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0aW1lMmlzb3ooYmFzZSksICIyMDAyLTA0LTE5IDE0OjM2OjQwWiIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModGltZTJpc296KGJhc2UrZGF5KSwgIjIwMDItMDQtMjAgMTQ6MzY6NDBaIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0aW1lMmlzb3ooYmFzZSsyKmRheSksICIyMDAyLTA0LTIxIDE0OjM2OjQwWiIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModGltZTJpc296KGJhc2UrMypkYXkpLCAiMjAwMi0wNC0yMiAxNDozNjo0MFoiKQoKICAgICAgICBheiA9IHRpbWUyaXNveigpCiAgICAgICAgYnogPSB0aW1lMmlzb3ooNTAwMDAwKQogICAgICAgIGZvciB0ZXh0IGluIChheiwgYnopOgogICAgICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKHIiXlxkezR9LVxkXGQtXGRcZCBcZFxkOlxkXGQ6XGRcZFokIiwgdGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIHRpbWUyaXNveiBmb3JtYXQ6ICVzICVzIiAlIChheiwgYnopKQoKICAgIGRlZiB0ZXN0X2h0dHAydGltZShzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgaHR0cDJ0aW1lCgogICAgICAgIGRlZiBwYXJzZV9kYXRlKHRleHQpOgogICAgICAgICAgICByZXR1cm4gdGltZS5nbXRpbWUoaHR0cDJ0aW1lKHRleHQpKVs6Nl0KCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VfZGF0ZSgiMDEgSmFuIDIwMDEiKSwgKDIwMDEsIDEsIDEsIDAsIDAsIDAuMCkpCgogICAgICAgICMgdGhpcyB0ZXN0IHdpbGwgYnJlYWsgYXJvdW5kIHllYXIgMjA3MAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlX2RhdGUoIjAzLUZlYi0yMCIpLCAoMjAyMCwgMiwgMywgMCwgMCwgMC4wKSkKCiAgICAgICAgIyB0aGlzIHRlc3Qgd2lsbCBicmVhayBhcm91bmQgeWVhciAyMDQ4CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VfZGF0ZSgiMDMtRmViLTk4IiksICgxOTk4LCAyLCAzLCAwLCAwLCAwLjApKQoKICAgIGRlZiB0ZXN0X2h0dHAydGltZV9mb3JtYXRzKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBodHRwMnRpbWUsIHRpbWUyaXNvegoKICAgICAgICAjIHRlc3QgaHR0cDJ0aW1lIGZvciBzdXBwb3J0ZWQgZGF0ZXMuICBUZXN0IGNhc2VzIHdpdGggMiBkaWdpdCB5ZWFyCiAgICAgICAgIyB3aWxsIHByb2JhYmx5IGJyZWFrIGluIHllYXIgMjA0NC4KICAgICAgICB0ZXN0cyA9IFsKICAgICAgICAgJ1RodSwgMDMgRmViIDE5OTQgMDA6MDA6MDAgR01UJywgICMgcHJvcG9zZWQgbmV3IEhUVFAgZm9ybWF0CiAgICAgICAgICdUaHVyc2RheSwgMDMtRmViLTk0IDAwOjAwOjAwIEdNVCcsICAjIG9sZCByZmM4NTAgSFRUUCBmb3JtYXQKICAgICAgICAgJ1RodXJzZGF5LCAwMy1GZWItMTk5NCAwMDowMDowMCBHTVQnLCAgIyBicm9rZW4gcmZjODUwIEhUVFAgZm9ybWF0CgogICAgICAgICAnMDMgRmViIDE5OTQgMDA6MDA6MDAgR01UJywgICMgSFRUUCBmb3JtYXQgKG5vIHdlZWtkYXkpCiAgICAgICAgICcwMy1GZWItOTQgMDA6MDA6MDAgR01UJywgICMgb2xkIHJmYzg1MCAobm8gd2Vla2RheSkKICAgICAgICAgJzAzLUZlYi0xOTk0IDAwOjAwOjAwIEdNVCcsICAjIGJyb2tlbiByZmM4NTAgKG5vIHdlZWtkYXkpCiAgICAgICAgICcwMy1GZWItMTk5NCAwMDowMCBHTVQnLCAgIyBicm9rZW4gcmZjODUwIChubyB3ZWVrZGF5LCBubyBzZWNvbmRzKQogICAgICAgICAnMDMtRmViLTE5OTQgMDA6MDAnLCAgIyBicm9rZW4gcmZjODUwIChubyB3ZWVrZGF5LCBubyBzZWNvbmRzLCBubyB0eikKCiAgICAgICAgICcwMy1GZWItOTQnLCAgIyBvbGQgcmZjODUwIEhUVFAgZm9ybWF0IChubyB3ZWVrZGF5LCBubyB0aW1lKQogICAgICAgICAnMDMtRmViLTE5OTQnLCAgIyBicm9rZW4gcmZjODUwIEhUVFAgZm9ybWF0IChubyB3ZWVrZGF5LCBubyB0aW1lKQogICAgICAgICAnMDMgRmViIDE5OTQnLCAgIyBwcm9wb3NlZCBuZXcgSFRUUCBmb3JtYXQgKG5vIHdlZWtkYXksIG5vIHRpbWUpCgogICAgICAgICAjIEEgZmV3IHRlc3RzIHdpdGggZXh0cmEgc3BhY2UgYXQgdmFyaW91cyBwbGFjZXMKICAgICAgICAgJyAgMDMgICBGZWIgICAxOTk0ICAwOjAwICAnLAogICAgICAgICAnICAwMy1GZWItMTk5NCAgJywKICAgICAgICBdCgogICAgICAgIHRlc3RfdCA9IDc2MDIzMzYwMCAgIyBhc3N1bWUgYnJva2VuIFBPU0lYIGNvdW50aW5nIG9mIHNlY29uZHMKICAgICAgICByZXN1bHQgPSB0aW1lMmlzb3oodGVzdF90KQogICAgICAgIGV4cGVjdGVkID0gIjE5OTQtMDItMDMgMDA6MDA6MDBaIgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzICA9PiAgJyVzJyAoJXMpIiAlICh0ZXN0X3QsIHJlc3VsdCwgZXhwZWN0ZWQpKQoKICAgICAgICBmb3IgcyBpbiB0ZXN0czoKICAgICAgICAgICAgdCA9IGh0dHAydGltZShzKQogICAgICAgICAgICB0MiA9IGh0dHAydGltZShzLmxvd2VyKCkpCiAgICAgICAgICAgIHQzID0gaHR0cDJ0aW1lKHMudXBwZXIoKSkKCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0ID09IHQyID09IHQzID09IHRlc3RfdCwKICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnICA9PiAgJXMsICVzLCAlcyAoJXMpIiAlIChzLCB0LCB0MiwgdDMsIHRlc3RfdCkpCgogICAgZGVmIHRlc3RfaHR0cDJ0aW1lX2dhcmJhZ2Uoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGh0dHAydGltZQoKICAgICAgICBmb3IgdGVzdCBpbiBbCiAgICAgICAgICAgICcnLAogICAgICAgICAgICAnR2FyYmFnZScsCiAgICAgICAgICAgICdNYW5kYWcgMTYuIFNlcHRlbWJlciAxOTk2JywKICAgICAgICAgICAgJzAxLTAwLTE5ODAnLAogICAgICAgICAgICAnMDEtMTMtMTk4MCcsCiAgICAgICAgICAgICcwMC0wMS0xOTgwJywKICAgICAgICAgICAgJzMyLTAxLTE5ODAnLAogICAgICAgICAgICAnMDEtMDEtMTk4MCAyNTowMDowMCcsCiAgICAgICAgICAgICcwMS0wMS0xOTgwIDAwOjYxOjAwJywKICAgICAgICAgICAgJzAxLTAxLTE5ODAgMDA6MDA6NjInLAogICAgICAgICAgICBdOgogICAgICAgICAgICBzZWxmLmFzc2VydF8oaHR0cDJ0aW1lKHRlc3QpIGlzIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDJ0aW1lKCVzKSBpcyBub3QgTm9uZVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAydGltZSh0ZXN0KSAlcyIgJSAodGVzdCwgaHR0cDJ0aW1lKHRlc3QpKQogICAgICAgICAgICAgICAgICAgICAgICAgKQoKCmNsYXNzIEhlYWRlclRlc3RzKFRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X3BhcnNlX25zX2hlYWRlcnMoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHBhcnNlX25zX2hlYWRlcnMKCiAgICAgICAgIyBxdW90ZXMgc2hvdWxkIGJlIHN0cmlwcGVkCiAgICAgICAgZXhwZWN0ZWQgPSBbWygnZm9vJywgJ2JhcicpLCAoJ2V4cGlyZXMnLCAyMjA5MDY5NDEyTCksICgndmVyc2lvbicsICcwJyldXQogICAgICAgIGZvciBoZHIgaW4gWwogICAgICAgICAgICAnZm9vPWJhcjsgZXhwaXJlcz0wMSBKYW4gMjA0MCAyMjoyMzozMiBHTVQnLAogICAgICAgICAgICAnZm9vPWJhcjsgZXhwaXJlcz0iMDEgSmFuIDIwNDAgMjI6MjM6MzIgR01UIicsCiAgICAgICAgICAgIF06CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlX25zX2hlYWRlcnMoW2hkcl0pLCBleHBlY3RlZCkKCiAgICBkZWYgdGVzdF9wYXJzZV9uc19oZWFkZXJzX3NwZWNpYWxfbmFtZXMoc2VsZik6CiAgICAgICAgIyBuYW1lcyBzdWNoIGFzICdleHBpcmVzJyBhcmUgbm90IHNwZWNpYWwgaW4gZmlyc3QgbmFtZT12YWx1ZSBwYWlyCiAgICAgICAgIyBvZiBTZXQtQ29va2llOiBoZWFkZXIKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcGFyc2VfbnNfaGVhZGVycwoKICAgICAgICAjIENvb2tpZSB3aXRoIG5hbWUgJ2V4cGlyZXMnCiAgICAgICAgaGRyID0gJ2V4cGlyZXM9MDEgSmFuIDIwNDAgMjI6MjM6MzIgR01UJwogICAgICAgIGV4cGVjdGVkID0gW1soImV4cGlyZXMiLCAiMDEgSmFuIDIwNDAgMjI6MjM6MzIgR01UIiksICgidmVyc2lvbiIsICIwIildXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlX25zX2hlYWRlcnMoW2hkcl0pLCBleHBlY3RlZCkKCiAgICBkZWYgdGVzdF9qb2luX2hlYWRlcl93b3JkcyhzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgam9pbl9oZWFkZXJfd29yZHMKCiAgICAgICAgam9pbmVkID0gam9pbl9oZWFkZXJfd29yZHMoW1soImZvbyIsIE5vbmUpLCAoImJhciIsICJiYXoiKV1dKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGpvaW5lZCwgImZvbzsgYmFyPWJheiIpCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGpvaW5faGVhZGVyX3dvcmRzKFtbXV0pLCAiIikKCiAgICBkZWYgdGVzdF9zcGxpdF9oZWFkZXJfd29yZHMoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHNwbGl0X2hlYWRlcl93b3JkcwoKICAgICAgICB0ZXN0cyA9IFsKICAgICAgICAgICAgKCJmb28iLCBbWygiZm9vIiwgTm9uZSldXSksCiAgICAgICAgICAgICgiZm9vPWJhciIsIFtbKCJmb28iLCAiYmFyIildXSksCiAgICAgICAgICAgICgiICAgZm9vICAgIiwgW1soImZvbyIsIE5vbmUpXV0pLAogICAgICAgICAgICAoIiAgIGZvbz0gICAiLCBbWygiZm9vIiwgIiIpXV0pLAogICAgICAgICAgICAoIiAgIGZvbz0iLCBbWygiZm9vIiwgIiIpXV0pLAogICAgICAgICAgICAoIiAgIGZvbz0gICA7ICIsIFtbKCJmb28iLCAiIildXSksCiAgICAgICAgICAgICgiICAgZm9vPSAgIDsgYmFyPSBiYXogIiwgW1soImZvbyIsICIiKSwgKCJiYXIiLCAiYmF6IildXSksCiAgICAgICAgICAgICgiZm9vPWJhciBiYXI9YmF6IiwgW1soImZvbyIsICJiYXIiKSwgKCJiYXIiLCAiYmF6IildXSksCiAgICAgICAgICAgICMgZG9lc24ndCByZWFsbHkgbWF0dGVyIGlmIHRoaXMgbmV4dCBmYWlscywgYnV0IGl0IHdvcmtzIEFUTQogICAgICAgICAgICAoImZvbz0gYmFyPWJheiIsIFtbKCJmb28iLCAiYmFyPWJheiIpXV0pLAogICAgICAgICAgICAoImZvbz1iYXI7YmFyPWJheiIsIFtbKCJmb28iLCAiYmFyIiksICgiYmFyIiwgImJheiIpXV0pLAogICAgICAgICAgICAoJ2ZvbyBiYXIgYmF6JywgW1soImZvbyIsIE5vbmUpLCAoImJhciIsIE5vbmUpLCAoImJheiIsIE5vbmUpXV0pLAogICAgICAgICAgICAoImEsIGIsIGMiLCBbWygiYSIsIE5vbmUpXSwgWygiYiIsIE5vbmUpXSwgWygiYyIsIE5vbmUpXV0pLAogICAgICAgICAgICAocidmb287IGJhcj1iYXosIHNwYW09LCBmb289IlwsXDtcIiIsIGJhcj0gJywKICAgICAgICAgICAgIFtbKCJmb28iLCBOb25lKSwgKCJiYXIiLCAiYmF6IildLAogICAgICAgICAgICAgIFsoInNwYW0iLCAiIildLCBbKCJmb28iLCAnLDsiJyldLCBbKCJiYXIiLCAiIildXSksCiAgICAgICAgICAgIF0KCiAgICAgICAgZm9yIGFyZywgZXhwZWN0IGluIHRlc3RzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBzcGxpdF9oZWFkZXJfd29yZHMoW2FyZ10pCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2ssIFN0cmluZ0lPCiAgICAgICAgICAgICAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oKQogICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YyhOb25lLCBmKQogICAgICAgICAgICAgICAgcmVzdWx0ID0gIihlcnJvciAtLSB0cmFjZWJhY2sgZm9sbG93cylcblxuJXMiICUgZi5nZXR2YWx1ZSgpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdCwgIGV4cGVjdCwgIiIiCldoZW4gcGFyc2luZzogJyVzJwpFeHBlY3RlZDogICAgICclcycKR290OiAgICAgICAgICAnJXMnCiIiIiAlIChhcmcsIGV4cGVjdCwgcmVzdWx0KSkKCiAgICBkZWYgdGVzdF9yb3VuZHRyaXAoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHNwbGl0X2hlYWRlcl93b3Jkcywgam9pbl9oZWFkZXJfd29yZHMKCiAgICAgICAgdGVzdHMgPSBbCiAgICAgICAgICAgICgiZm9vIiwgImZvbyIpLAogICAgICAgICAgICAoImZvbz1iYXIiLCAiZm9vPWJhciIpLAogICAgICAgICAgICAoIiAgIGZvbyAgICIsICJmb28iKSwKICAgICAgICAgICAgKCJmb289IiwgJ2Zvbz0iIicpLAogICAgICAgICAgICAoImZvbz1iYXIgYmFyPWJheiIsICJmb289YmFyOyBiYXI9YmF6IiksCiAgICAgICAgICAgICgiZm9vPWJhcjtiYXI9YmF6IiwgImZvbz1iYXI7IGJhcj1iYXoiKSwKICAgICAgICAgICAgKCdmb28gYmFyIGJheicsICJmb287IGJhcjsgYmF6IiksCiAgICAgICAgICAgIChyJ2Zvbz0iXCIiIGJhcj0iXFwiJywgcidmb289IlwiIjsgYmFyPSJcXCInKSwKICAgICAgICAgICAgKCdmb28sLCxiYXInLCAnZm9vLCBiYXInKSwKICAgICAgICAgICAgKCdmb289YmFyLGJhcj1iYXonLCAnZm9vPWJhciwgYmFyPWJheicpLAoKICAgICAgICAgICAgKCd0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMScsCiAgICAgICAgICAgICAndGV4dC9odG1sOyBjaGFyc2V0PSJpc28tODg1OS0xIicpLAoKICAgICAgICAgICAgKCdmb289ImJhciI7IHBvcnQ9IjgwLDgxIjsgZGlzY2FyZCwgYmFyPWJheicsCiAgICAgICAgICAgICAnZm9vPWJhcjsgcG9ydD0iODAsODEiOyBkaXNjYXJkLCBiYXI9YmF6JyksCgogICAgICAgICAgICAocidCYXNpYyByZWFsbT0iXCJmb29cXFxcYmFyXCIiJywKICAgICAgICAgICAgIHInQmFzaWM7IHJlYWxtPSJcImZvb1xcXFxiYXJcIiInKQogICAgICAgICAgICBdCgogICAgICAgIGZvciBhcmcsIGV4cGVjdCBpbiB0ZXN0czoKICAgICAgICAgICAgaW5wdXQgPSBzcGxpdF9oZWFkZXJfd29yZHMoW2FyZ10pCiAgICAgICAgICAgIHJlcyA9IGpvaW5faGVhZGVyX3dvcmRzKGlucHV0KQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXMsIGV4cGVjdCwgIiIiCldoZW4gcGFyc2luZzogJyVzJwpFeHBlY3RlZDogICAgICclcycKR290OiAgICAgICAgICAnJXMnCklucHV0IHdhczogICAgJyVzJwoiIiIgJSAoYXJnLCBleHBlY3QsIHJlcywgaW5wdXQpKQoKCmNsYXNzIEZha2VSZXNwb25zZToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZWFkZXJzPVtdLCB1cmw9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgaGVhZGVyczogbGlzdCBvZiBSRkM4MjItc3R5bGUgJ0tleTogdmFsdWUnIHN0cmluZ3MKICAgICAgICAiIiIKICAgICAgICBpbXBvcnQgbWltZXRvb2xzLCBTdHJpbmdJTwogICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygiXG4iLmpvaW4oaGVhZGVycykpCiAgICAgICAgc2VsZi5faGVhZGVycyA9IG1pbWV0b29scy5NZXNzYWdlKGYpCiAgICAgICAgc2VsZi5fdXJsID0gdXJsCiAgICBkZWYgaW5mbyhzZWxmKTogcmV0dXJuIHNlbGYuX2hlYWRlcnMKCmRlZiBpbnRlcmFjdF8yOTY1KGNvb2tpZWphciwgdXJsLCAqc2V0X2Nvb2tpZV9oZHJzKToKICAgIHJldHVybiBfaW50ZXJhY3QoY29va2llamFyLCB1cmwsIHNldF9jb29raWVfaGRycywgIlNldC1Db29raWUyIikKCmRlZiBpbnRlcmFjdF9uZXRzY2FwZShjb29raWVqYXIsIHVybCwgKnNldF9jb29raWVfaGRycyk6CiAgICByZXR1cm4gX2ludGVyYWN0KGNvb2tpZWphciwgdXJsLCBzZXRfY29va2llX2hkcnMsICJTZXQtQ29va2llIikKCmRlZiBfaW50ZXJhY3QoY29va2llamFyLCB1cmwsIHNldF9jb29raWVfaGRycywgaGRyX25hbWUpOgogICAgIiIiUGVyZm9ybSBhIHNpbmdsZSByZXF1ZXN0IC8gcmVzcG9uc2UgY3ljbGUsIHJldHVybmluZyBDb29raWU6IGhlYWRlci4iIiIKICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAogICAgcmVxID0gUmVxdWVzdCh1cmwpCiAgICBjb29raWVqYXIuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQogICAgY29va2llX2hkciA9IHJlcS5nZXRfaGVhZGVyKCJDb29raWUiLCAiIikKICAgIGhlYWRlcnMgPSBbXQogICAgZm9yIGhkciBpbiBzZXRfY29va2llX2hkcnM6CiAgICAgICAgaGVhZGVycy5hcHBlbmQoIiVzOiAlcyIgJSAoaGRyX25hbWUsIGhkcikpCiAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgdXJsKQogICAgY29va2llamFyLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKICAgIHJldHVybiBjb29raWVfaGRyCgoKY2xhc3MgRmlsZUNvb2tpZUphclRlc3RzKFRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X2x3cF92YWx1ZWxlc3NfY29va2llKHNlbGYpOgogICAgICAgICMgY29va2llcyB3aXRoIG5vIHZhbHVlIHNob3VsZCBiZSBzYXZlZCBhbmQgbG9hZGVkIGNvbnNpc3RlbnRseQogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBMV1BDb29raWVKYXIKICAgICAgICBmaWxlbmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KICAgICAgICBjID0gTFdQQ29va2llSmFyKCkKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnYm9vJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImJvbyJdLnZhbHVlLCBOb25lKQogICAgICAgIHRyeToKICAgICAgICAgICAgYy5zYXZlKGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZD1UcnVlKQogICAgICAgICAgICBjID0gTFdQQ29va2llSmFyKCkKICAgICAgICAgICAgYy5sb2FkKGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZD1UcnVlKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHRyeTogb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjogcGFzcwogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiYm9vIl0udmFsdWUsIE5vbmUpCgogICAgZGVmIHRlc3RfYmFkX21hZ2ljKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBMV1BDb29raWVKYXIsIE1vemlsbGFDb29raWVKYXIsIExvYWRFcnJvcgogICAgICAgICMgSU9FcnJvcnMgKGVnLiBmaWxlIGRvZXNuJ3QgZXhpc3QpIGFyZSBhbGxvd2VkIHRvIHByb3BhZ2F0ZQogICAgICAgIGZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgogICAgICAgIGZvciBjb29raWVqYXJfY2xhc3MgaW4gTFdQQ29va2llSmFyLCBNb3ppbGxhQ29va2llSmFyOgogICAgICAgICAgICBjID0gY29va2llamFyX2NsYXNzKCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgYy5sb2FkKGZpbGVuYW1lPSJmb3IgdGhpcyB0ZXN0IHRvIHdvcmssIGEgZmlsZSB3aXRoIHRoaXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlbmFtZSBzaG91bGQgbm90IGV4aXN0IikKICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGV4YzoKICAgICAgICAgICAgICAgICMgZXhhY3RseSBJT0Vycm9yLCBub3QgTG9hZEVycm9yCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5fX2NsYXNzX18sIElPRXJyb3IpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIElPRXJyb3IgZm9yIGludmFsaWQgZmlsZW5hbWUiKQogICAgICAgICMgSW52YWxpZCBjb250ZW50cyBvZiBjb29raWVzIGZpbGUgKGVnLiBiYWQgbWFnaWMgc3RyaW5nKQogICAgICAgICMgY2F1c2VzIGEgTG9hZEVycm9yLgogICAgICAgIHRyeToKICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJ3IikKICAgICAgICAgICAgZi53cml0ZSgib29wc1xuIikKICAgICAgICAgICAgZm9yIGNvb2tpZWphcl9jbGFzcyBpbiBMV1BDb29raWVKYXIsIE1vemlsbGFDb29raWVKYXI6CiAgICAgICAgICAgICAgICBjID0gY29va2llamFyX2NsYXNzKCkKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKExvYWRFcnJvciwgYy5sb2FkLCBmaWxlbmFtZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICB0cnk6IG9zLnVubGluayhmaWxlbmFtZSkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6IHBhc3MKCmNsYXNzIENvb2tpZVRlc3RzKFRlc3RDYXNlKToKICAgICMgWFhYCiAgICAjIEdldCByaWQgb2Ygc3RyaW5nIGNvbXBhcmlzb25zIHdoZXJlIG5vdCBhY3R1YWxseSB0ZXN0aW5nIHN0ciAvIHJlcHIuCiAgICAjIC5jbGVhcigpIGV0Yy4KICAgICMgSVAgYWRkcmVzc2VzIGxpa2UgNTAgKHNpbmdsZSBudW1iZXIsIG5vIGRvdCkgYW5kIGRvbWFpbi1tYXRjaGluZwogICAgIyAgZnVuY3Rpb25zIChhbmQgaXNfSEROKT8gIFNlZSBkcmFmdCBSRkMgMjk2NSBlcnJhdGEuCiAgICAjIFN0cmljdG5lc3Mgc3dpdGNoZXMKICAgICMgaXNfdGhpcmRfcGFydHkoKQogICAgIyB1bnZlcmlmaWFiaWxpdHkgLyB0aGlyZC1wYXJ0eSBibG9ja2luZwogICAgIyBOZXRzY2FwZSBjb29raWVzIHdvcmsgdGhlIHNhbWUgYXMgUkZDIDI5NjUgd2l0aCByZWdhcmQgdG8gcG9ydC4KICAgICMgU2V0LUNvb2tpZSB3aXRoIG5lZ2F0aXZlIG1heCBhZ2UuCiAgICAjIElmIHR1cm4gUkZDIDI5NjUgaGFuZGxpbmcgb2ZmLCBTZXQtQ29va2llMiBjb29raWVzIHNob3VsZCBub3QgY2xvYmJlcgogICAgIyAgU2V0LUNvb2tpZSBjb29raWVzLgogICAgIyBDb29raWUyIHNob3VsZCBiZSBzZW50IGlmICphbnkqIGNvb2tpZXMgYXJlIG5vdCBWMSAoaWUuIFYwIE9SIFYyIGV0Yy4pLgogICAgIyBDb29raWVzIChWMSBhbmQgVjApIHdpdGggbm8gZXhwaXJ5IGRhdGUgc2hvdWxkIGJlIHNldCB0byBiZSBkaXNjYXJkZWQuCiAgICAjIFJGQyAyOTY1IFF1b3Rpbmc6CiAgICAjICBTaG91bGQgYWNjZXB0IHVucXVvdGVkIGNvb2tpZS1hdHRyaWJ1dGUgdmFsdWVzPyAgY2hlY2sgZXJyYXRhIGRyYWZ0LgogICAgIyAgIFdoaWNoIGFyZSByZXF1aXJlZCBvbiB0aGUgd2F5IGluIGFuZCBvdXQ/CiAgICAjICBTaG91bGQgYWx3YXlzIHJldHVybiBxdW90ZWQgY29va2llLWF0dHJpYnV0ZSB2YWx1ZXM/CiAgICAjIFByb3BlciB0ZXN0aW5nIG9mIHdoZW4gUkZDIDI5NjUgY2xvYmJlcnMgTmV0c2NhcGUgKHdhaXRpbmcgZm9yIGVycmF0YSkuCiAgICAjIFBhdGgtbWF0Y2ggb24gcmV0dXJuIChzYW1lIGZvciBWMCBhbmQgVjEpLgogICAgIyBSRkMgMjk2NSBhY2NlcHRhbmNlIGFuZCByZXR1cm5pbmcgcnVsZXMKICAgICMgIFNldC1Db29raWUyIHdpdGhvdXQgdmVyc2lvbiBhdHRyaWJ1dGUgaXMgcmVqZWN0ZWQuCgogICAgIyBOZXRzY2FwZSBwZWN1bGlhcml0aWVzIGxpc3QgZnJvbSBSb25hbGQgVHNjaGFsYXIuCiAgICAjIFRoZSBmaXJzdCB0d28gc3RpbGwgbmVlZCB0ZXN0cywgdGhlIHJlc3QgYXJlIGNvdmVyZWQuCiMjIC0gUXVvdGluZzogb25seSBxdW90ZXMgYXJvdW5kIHRoZSBleHBpcmVzIHZhbHVlIGFyZSByZWNvZ25pemVkIGFzIHN1Y2gKIyMgICAoYW5kIHllcywgc29tZSBmb2xrcyBxdW90ZSB0aGUgZXhwaXJlcyB2YWx1ZSk7IHF1b3RlcyBhcm91bmQgYW55IG90aGVyCiMjICAgdmFsdWUgYXJlIHRyZWF0ZWQgYXMgcGFydCBvZiB0aGUgdmFsdWUuCiMjIC0gV2hpdGUgc3BhY2U6IHdoaXRlIHNwYWNlIGFyb3VuZCBuYW1lcyBhbmQgdmFsdWVzIGlzIGlnbm9yZWQKIyMgLSBEZWZhdWx0IHBhdGg6IGlmIG5vIHBhdGggcGFyYW1ldGVyIGlzIGdpdmVuLCB0aGUgcGF0aCBkZWZhdWx0cyB0byB0aGUKIyMgICBwYXRoIGluIHRoZSByZXF1ZXN0LXVyaSB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBsYXN0ICcvJy4gTm90ZQojIyAgIHRoYXQgdGhpcyBpcyBlbnRpcmVseSBkaWZmZXJlbnQgZnJvbSB3aGF0IHRoZSBzcGVjIHNheXMuCiMjIC0gQ29tbWFzIGFuZCBvdGhlciBkZWxpbWl0ZXJzOiBOZXRzY2FwZSBqdXN0IHBhcnNlcyB1bnRpbCB0aGUgbmV4dCAnOycuCiMjICAgVGhpcyBtZWFucyBpdCB3aWxsIGFsbG93IGNvbW1hcyBldGMgaW5zaWRlIHZhbHVlcyAoYW5kIHllcywgYm90aAojIyAgIGNvbW1hcyBhbmQgZXF1YWxzIGFyZSBjb21tb25seSBhcHBlYXIgaW4gdGhlIGNvb2tpZSB2YWx1ZSkuIFRoaXMgYWxzbwojIyAgIG1lYW5zIHRoYXQgaWYgeW91IGZvbGQgbXVsdGlwbGUgU2V0LUNvb2tpZSBoZWFkZXIgZmllbGRzIGludG8gb25lLAojIyAgIGNvbW1hLXNlcGFyYXRlZCBsaXN0LCBpdCdsbCBiZSBhIGhlYWRhY2hlIHRvIHBhcnNlIChhdCBsZWFzdCBteSBoZWFkCiMjICAgc3RhcnRzIGh1cnRpbmcgZXZlcnl0aW1lIEkgdGhpbmsgb2YgdGhhdCBjb2RlKS4KIyMgLSBFeHBpcmVzOiBZb3UnbGwgZ2V0IGFsbCBzb3J0cyBvZiBkYXRlIGZvcm1hdHMgaW4gdGhlIGV4cGlyZXMsCiMjICAgaW5jbHVkaW5nIGVtdHB5IGV4cGlyZXMgYXR0cmlidXRlcyAoImV4cGlyZXM9IikuIEJlIGFzIGZsZXhpYmxlIGFzIHlvdQojIyAgIGNhbiwgYW5kIGNlcnRhaW5seSBkb24ndCBleHBlY3QgdGhlIHdlZWtkYXkgdG8gYmUgdGhlcmU7IGlmIHlvdSBjYW4ndAojIyAgIHBhcnNlIGl0LCBqdXN0IGlnbm9yZSBpdCBhbmQgcHJldGVuZCBpdCdzIGEgc2Vzc2lvbiBjb29raWUuCiMjIC0gRG9tYWluLW1hdGNoaW5nOiBOZXRzY2FwZSB1c2VzIHRoZSAyLWRvdCBydWxlIGZvciBfYWxsXyBkb21haW5zLCBub3QKIyMgICBqdXN0IHRoZSA3IHNwZWNpYWwgVExEJ3MgbGlzdGVkIGluIHRoZWlyIHNwZWMuIEFuZCBmb2xrcyByZWx5IG9uCiMjICAgdGhhdC4uLgoKICAgIGRlZiB0ZXN0X2RvbWFpbl9yZXR1cm5fb2soc2VsZik6CiAgICAgICAgIyB0ZXN0IG9wdGltaXphdGlvbjogLmRvbWFpbl9yZXR1cm5fb2soKSBzaG91bGQgZmlsdGVyIG91dCBtb3N0CiAgICAgICAgIyBkb21haW5zIGluIHRoZSBDb29raWVKYXIgYmVmb3JlIHdlIHRyeSB0byBhY2Nlc3MgdGhlbSAoYmVjYXVzZSB0aGF0CiAgICAgICAgIyBtYXkgcmVxdWlyZSBkaXNrIGFjY2VzcyAtLSBpbiBwYXJ0aWN1bGFyLCB3aXRoIE1TSUVDb29raWVKYXIpCiAgICAgICAgIyBUaGlzIGlzIG9ubHkgYSByb3VnaCBjaGVjayBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgc28gaXQncyBub3QgdG9vCiAgICAgICAgIyBjcml0aWNhbCBhcyBsb25nIGFzIGl0J3Mgc3VmZmljaWVudGx5IGxpYmVyYWwuCiAgICAgICAgaW1wb3J0IGNvb2tpZWxpYiwgdXJsbGliMgogICAgICAgIHBvbCA9IGNvb2tpZWxpYi5EZWZhdWx0Q29va2llUG9saWN5KCkKICAgICAgICBmb3IgdXJsLCBkb21haW4sIG9rIGluIFsKICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgImJsYWguY29tIiwgRmFsc2UpLAogICAgICAgICAgICAoImh0dHA6Ly9mb28uYmFyLmNvbS8iLCAicmh1YmFyYi5ibGFoLmNvbSIsIEZhbHNlKSwKICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgInJodWJhcmIuZm9vLmJhci5jb20iLCBGYWxzZSksCiAgICAgICAgICAgICgiaHR0cDovL2Zvby5iYXIuY29tLyIsICIuZm9vLmJhci5jb20iLCBUcnVlKSwKICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgImZvby5iYXIuY29tIiwgVHJ1ZSksCiAgICAgICAgICAgICgiaHR0cDovL2Zvby5iYXIuY29tLyIsICIuYmFyLmNvbSIsIFRydWUpLAogICAgICAgICAgICAoImh0dHA6Ly9mb28uYmFyLmNvbS8iLCAiY29tIiwgVHJ1ZSksCiAgICAgICAgICAgICgiaHR0cDovL2Zvby5jb20vIiwgInJodWJhcmIuZm9vLmNvbSIsIEZhbHNlKSwKICAgICAgICAgICAgKCJodHRwOi8vZm9vLmNvbS8iLCAiLmZvby5jb20iLCBUcnVlKSwKICAgICAgICAgICAgKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vLmNvbSIsIFRydWUpLAogICAgICAgICAgICAoImh0dHA6Ly9mb28uY29tLyIsICJjb20iLCBUcnVlKSwKICAgICAgICAgICAgKCJodHRwOi8vZm9vLyIsICJyaHViYXJiLmZvbyIsIEZhbHNlKSwKICAgICAgICAgICAgKCJodHRwOi8vZm9vLyIsICIuZm9vIiwgVHJ1ZSksCiAgICAgICAgICAgICgiaHR0cDovL2Zvby8iLCAiZm9vIiwgVHJ1ZSksCiAgICAgICAgICAgICgiaHR0cDovL2Zvby8iLCAiZm9vLmxvY2FsIiwgVHJ1ZSksCiAgICAgICAgICAgICgiaHR0cDovL2Zvby8iLCAiLmxvY2FsIiwgVHJ1ZSksCiAgICAgICAgICAgIF06CiAgICAgICAgICAgIHJlcXVlc3QgPSB1cmxsaWIyLlJlcXVlc3QodXJsKQogICAgICAgICAgICByID0gcG9sLmRvbWFpbl9yZXR1cm5fb2soZG9tYWluLCByZXF1ZXN0KQogICAgICAgICAgICBpZiBvazogc2VsZi5hc3NlcnRfKHIpCiAgICAgICAgICAgIGVsc2U6IHNlbGYuYXNzZXJ0Xyhub3QgcikKCiAgICBkZWYgdGVzdF9taXNzaW5nX3ZhbHVlKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBNb3ppbGxhQ29va2llSmFyLCBsd3BfY29va2llX3N0cgoKICAgICAgICAjIG1pc3NpbmcgPSBzaWduIGluIENvb2tpZTogaGVhZGVyIGlzIHJlZ2FyZGVkIGJ5IE1vemlsbGEgYXMgYSBtaXNzaW5nCiAgICAgICAgIyBuYW1lLCBhbmQgYnkgY29va2llbGliIGFzIGEgbWlzc2luZyB2YWx1ZQogICAgICAgIGZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgogICAgICAgIGMgPSBNb3ppbGxhQ29va2llSmFyKGZpbGVuYW1lKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdlZ2dzJykKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnInNwYW0iOyBwYXRoPS9mb28vJykKICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJlZ2dzIl0KICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLnZhbHVlIGlzIE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29va2llLm5hbWUsICJlZ2dzIikKICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsnL2Zvby8nXVsnInNwYW0iJ10KICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLnZhbHVlIGlzIE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29va2llLm5hbWUsICcic3BhbSInKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGx3cF9jb29raWVfc3RyKGNvb2tpZSksICgKICAgICAgICAgICAgcicic3BhbSI7IHBhdGg9Ii9mb28vIjsgZG9tYWluPSJ3d3cuYWNtZS5jb20iOyAnCiAgICAgICAgICAgICdwYXRoX3NwZWM7IGRpc2NhcmQ7IHZlcnNpb249MCcpKQogICAgICAgIG9sZF9zdHIgPSByZXByKGMpCiAgICAgICAgYy5zYXZlKGlnbm9yZV9leHBpcmVzPVRydWUsIGlnbm9yZV9kaXNjYXJkPVRydWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjID0gTW96aWxsYUNvb2tpZUphcihmaWxlbmFtZSkKICAgICAgICAgICAgYy5yZXZlcnQoaWdub3JlX2V4cGlyZXM9VHJ1ZSwgaWdub3JlX2Rpc2NhcmQ9VHJ1ZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBvcy51bmxpbmsoYy5maWxlbmFtZSkKICAgICAgICAjIGNvb2tpZXMgdW5jaGFuZ2VkIGFwYXJ0IGZyb20gbG9zdCBpbmZvIHJlLiB3aGV0aGVyIHBhdGggd2FzIHNwZWNpZmllZAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAogICAgICAgICAgICByZXByKGMpLAogICAgICAgICAgICByZS5zdWIoInBhdGhfc3BlY2lmaWVkPSVzIiAlIFRydWUsICJwYXRoX3NwZWNpZmllZD0lcyIgJSBGYWxzZSwKICAgICAgICAgICAgICAgICAgIG9sZF9zdHIpCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9mb28vIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgJyJzcGFtIjsgZWdncycpCgogICAgZGVmIHRlc3RfcmZjMjEwOV9oYW5kbGluZyhzZWxmKToKICAgICAgICAjIFJGQyAyMTA5IGNvb2tpZXMgYXJlIGhhbmRsZWQgYXMgUkZDIDI5NjUgb3IgTmV0c2NhcGUgY29va2llcywKICAgICAgICAjIGRlcGVuZGVudCBvbiBwb2xpY3kgc2V0dGluZ3MKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CgogICAgICAgIGZvciByZmMyMTA5X2FzX25ldHNjYXBlLCByZmMyOTY1LCB2ZXJzaW9uIGluIFsKICAgICAgICAgICAgIyBkZWZhdWx0IGFjY29yZGluZyB0byByZmMyOTY1IGlmIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZAogICAgICAgICAgICAoTm9uZSwgRmFsc2UsIDApLAogICAgICAgICAgICAoTm9uZSwgVHJ1ZSwgMSksCiAgICAgICAgICAgICMgZXhwbGljaXQgcmZjMjEwOV9hc19uZXRzY2FwZQogICAgICAgICAgICAoRmFsc2UsIEZhbHNlLCBOb25lKSwgICMgdmVyc2lvbiBOb25lIGhlcmUgbWVhbnMgbm8gY29va2llIHN0b3JlZAogICAgICAgICAgICAoRmFsc2UsIFRydWUsIDEpLAogICAgICAgICAgICAoVHJ1ZSwgRmFsc2UsIDApLAogICAgICAgICAgICAoVHJ1ZSwgVHJ1ZSwgMCksCiAgICAgICAgICAgIF06CiAgICAgICAgICAgIHBvbGljeSA9IERlZmF1bHRDb29raWVQb2xpY3koCiAgICAgICAgICAgICAgICByZmMyMTA5X2FzX25ldHNjYXBlPXJmYzIxMDlfYXNfbmV0c2NhcGUsCiAgICAgICAgICAgICAgICByZmMyOTY1PXJmYzI5NjUpCiAgICAgICAgICAgIGMgPSBDb29raWVKYXIocG9saWN5KQogICAgICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iLCAibmk9bmk7IFZlcnNpb249MSIpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5leGFtcGxlLmNvbSJdWyIvIl1bIm5pIl0KICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHZlcnNpb24gaXMgTm9uZSkgICMgZGlkbid0IGV4cGVjdCBhIHN0b3JlZCBjb29raWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29va2llLnZlcnNpb24sIHZlcnNpb24pCiAgICAgICAgICAgICAgICAjIDI5NjUgY29va2llcyBhcmUgdW5hZmZlY3RlZAogICAgICAgICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vPWJhcjsgVmVyc2lvbj0xIikKICAgICAgICAgICAgICAgIGlmIHJmYzI5NjU6CiAgICAgICAgICAgICAgICAgICAgY29va2llMjk2NSA9IGMuX2Nvb2tpZXNbInd3dy5leGFtcGxlLmNvbSJdWyIvIl1bImZvbyJdCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb29raWUyOTY1LnZlcnNpb24sIDEpCgogICAgZGVmIHRlc3RfbnNfcGFyc2VyKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERFRkFVTFRfSFRUUF9QT1JUCgogICAgICAgIGMgPSBDb29raWVKYXIoKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwYW09ZWdnczsgRG9NYWluPS5hY21lLmNvbTsgcG9ydDsgYmxBcmdoPSJmZWVwIicpCiAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ25pPW5pOyBwb3J0PTgwLDgwODAnKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tOjgwLyIsICduaW5pPW5pJykKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbTo4MC8iLCAnZm9vPWJhcjsgZXhwaXJlcz0nKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tOjgwLyIsICdzcGFtPWVnZ3M7ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwaXJlcz0iRm9vIEJhciAyNSAzMzoyMjoxMSAzMDIyIicpCgogICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbIi5hY21lLmNvbSJdWyIvIl1bInNwYW0iXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvb2tpZS5kb21haW4sICIuYWNtZS5jb20iKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUuZG9tYWluX3NwZWNpZmllZCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb29raWUucG9ydCwgREVGQVVMVF9IVFRQX1BPUlQpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjb29raWUucG9ydF9zcGVjaWZpZWQpCiAgICAgICAgIyBjYXNlIGlzIHByZXNlcnZlZAogICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUuaGFzX25vbnN0YW5kYXJkX2F0dHIoImJsQXJnaCIpIGFuZAogICAgICAgICAgICAgICAgICAgICBub3QgY29va2llLmhhc19ub25zdGFuZGFyZF9hdHRyKCJibGFyZ2giKSkKCiAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsibmkiXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvb2tpZS5kb21haW4sICJ3d3cuYWNtZS5jb20iKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY29va2llLmRvbWFpbl9zcGVjaWZpZWQpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29va2llLnBvcnQsICI4MCw4MDgwIikKICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLnBvcnRfc3BlY2lmaWVkKQoKICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJuaW5pIl0KICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLnBvcnQgaXMgTm9uZSkKICAgICAgICBzZWxmLmFzc2VydF8obm90IGNvb2tpZS5wb3J0X3NwZWNpZmllZCkKCiAgICAgICAgIyBpbnZhbGlkIGV4cGlyZXMgc2hvdWxkIG5vdCBjYXVzZSBjb29raWUgdG8gYmUgZHJvcHBlZAogICAgICAgIGZvbyA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImZvbyJdCiAgICAgICAgc3BhbSA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImZvbyJdCiAgICAgICAgc2VsZi5hc3NlcnRfKGZvby5leHBpcmVzIGlzIE5vbmUpCiAgICAgICAgc2VsZi5hc3NlcnRfKHNwYW0uZXhwaXJlcyBpcyBOb25lKQoKICAgIGRlZiB0ZXN0X25zX3BhcnNlcl9zcGVjaWFsX25hbWVzKHNlbGYpOgogICAgICAgICMgbmFtZXMgc3VjaCBhcyAnZXhwaXJlcycgYXJlIG5vdCBzcGVjaWFsIGluIGZpcnN0IG5hbWU9dmFsdWUgcGFpcgogICAgICAgICMgb2YgU2V0LUNvb2tpZTogaGVhZGVyCiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphcgoKICAgICAgICBjID0gQ29va2llSmFyKCkKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnZXhwaXJlcz1lZ2dzJykKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAndmVyc2lvbj1lZ2dzOyBzcGFtPWVnZ3MnKQoKICAgICAgICBjb29raWVzID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXQogICAgICAgIHNlbGYuYXNzZXJ0XygnZXhwaXJlcycgaW4gY29va2llcykKICAgICAgICBzZWxmLmFzc2VydF8oJ3ZlcnNpb24nIGluIGNvb2tpZXMpCgogICAgZGVmIHRlc3RfZXhwaXJlcyhzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgdGltZTJuZXRzY2FwZSwgQ29va2llSmFyCgogICAgICAgICMgaWYgZXhwaXJlcyBpcyBpbiBmdXR1cmUsIGtlZXAgY29va2llLi4uCiAgICAgICAgYyA9IENvb2tpZUphcigpCiAgICAgICAgZnV0dXJlID0gdGltZTJuZXRzY2FwZSh0aW1lLnRpbWUoKSszNjAwKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdzcGFtPSJiYXIiOyBleHBpcmVzPSVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKICAgICAgICBub3cgPSB0aW1lMm5ldHNjYXBlKHRpbWUudGltZSgpLTEpCiAgICAgICAgIyAuLi4gYW5kIGlmIGluIHBhc3Qgb3IgcHJlc2VudCwgZGlzY2FyZCBpdAogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdmb289ImVnZ3MiOyBleHBpcmVzPSVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm93KQogICAgICAgIGggPSBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKICAgICAgICBzZWxmLmFzc2VydF8oJ3NwYW09ImJhciInIGluIGggYW5kICJmb28iIG5vdCBpbiBoKQoKICAgICAgICAjIG1heC1hZ2UgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGV4cGlyZXMsIGFuZCB6ZXJvIG1heC1hZ2UgaXMgcmVxdWVzdCB0bwogICAgICAgICMgZGVsZXRlIGJvdGggbmV3IGNvb2tpZSBhbmQgYW55IG9sZCBtYXRjaGluZyBjb29raWUKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnZWdncz0iYmFyIjsgZXhwaXJlcz0lcycgJQogICAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZSkKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnYmFyPSJiYXIiOyBleHBpcmVzPSVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMykKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnZWdncz0iYmFyIjsgJwogICAgICAgICAgICAgICAgICAgICAgICAgICdleHBpcmVzPSVzOyBtYXgtYWdlPTAnICUgZnV0dXJlKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdiYXI9ImJhciI7ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4LWFnZT0wOyBleHBpcmVzPSVzJyAlIGZ1dHVyZSkKICAgICAgICBoID0gaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCgogICAgICAgICMgdGVzdCBleHBpcnkgYXQgZW5kIG9mIHNlc3Npb24gZm9yIGNvb2tpZXMgd2l0aCBubyBleHBpcmVzIGF0dHJpYnV0ZQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LnJodWJhcmIubmV0LyIsICd3aHVtPSJmaXp6IicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQogICAgICAgIGMuY2xlYXJfc2Vzc2lvbl9jb29raWVzKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCiAgICAgICAgc2VsZi5hc3NlcnRfKCdzcGFtPSJiYXIiJyBpbiBoKQoKICAgICAgICAjIFhYWCBSRkMgMjk2NSBleHBpcnkgcnVsZXMgKHNvbWUgYXBwbHkgdG8gVjAgdG9vKQoKICAgIGRlZiB0ZXN0X2RlZmF1bHRfcGF0aChzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CgogICAgICAgICMgUkZDIDI5NjUKICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkKCiAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnc3BhbT0iYmFyIjsgVmVyc2lvbj0iMSInKQogICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCgogICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaCIsICdlZ2dzPSJiYXIiOyBWZXJzaW9uPSIxIicpCiAgICAgICAgc2VsZi5hc3NlcnRfKCIvIiBpbiBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXSkKCiAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoL3JodWJhcmIiLAogICAgICAgICAgICAgICAgICAgICAgJ2VnZ3M9ImJhciI7IFZlcnNpb249IjEiJykKICAgICAgICBzZWxmLmFzc2VydF8oIi9ibGFoLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCgogICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC9yaHViYXJiLyIsCiAgICAgICAgICAgICAgICAgICAgICAnZWdncz0iYmFyIjsgVmVyc2lvbj0iMSInKQogICAgICAgIHNlbGYuYXNzZXJ0XygiL2JsYWgvcmh1YmFyYi8iIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQoKICAgICAgICAjIE5ldHNjYXBlCgogICAgICAgIGMgPSBDb29raWVKYXIoKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdzcGFtPSJiYXIiJykKICAgICAgICBzZWxmLmFzc2VydF8oIi8iIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQoKICAgICAgICBjID0gQ29va2llSmFyKCkKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoIiwgJ2VnZ3M9ImJhciInKQogICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCgogICAgICAgIGMgPSBDb29raWVKYXIoKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvcmh1YmFyYiIsICdlZ2dzPSJiYXIiJykKICAgICAgICBzZWxmLmFzc2VydF8oIi9ibGFoIiBpbiBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXSkKCiAgICAgICAgYyA9IENvb2tpZUphcigpCiAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC9yaHViYXJiLyIsICdlZ2dzPSJiYXIiJykKICAgICAgICBzZWxmLmFzc2VydF8oIi9ibGFoL3JodWJhcmIiIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQoKICAgIGRlZiB0ZXN0X2VzY2FwZV9wYXRoKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBlc2NhcGVfcGF0aAogICAgICAgIGNhc2VzID0gWwogICAgICAgICAgICAjIHF1b3RlZCBzYWZlCiAgICAgICAgICAgICgiL2ZvbyUyZi9iYXIiLCAiL2ZvbyUyRi9iYXIiKSwKICAgICAgICAgICAgKCIvZm9vJTJGL2JhciIsICIvZm9vJTJGL2JhciIpLAogICAgICAgICAgICAjIHF1b3RlZCAlCiAgICAgICAgICAgICgiL2ZvbyUlL2JhciIsICIvZm9vJSUvYmFyIiksCiAgICAgICAgICAgICMgcXVvdGVkIHVuc2FmZQogICAgICAgICAgICAoIi9mbyUxOW8vYmFyIiwgIi9mbyUxOW8vYmFyIiksCiAgICAgICAgICAgICgiL2ZvJTdkby9iYXIiLCAiL2ZvJTdEby9iYXIiKSwKICAgICAgICAgICAgIyB1bnF1b3RlZCBzYWZlCiAgICAgICAgICAgICgiL2Zvby9iYXImIiwgIi9mb28vYmFyJiIpLAogICAgICAgICAgICAoIi9mb28vL2JhciIsICIvZm9vLy9iYXIiKSwKICAgICAgICAgICAgKCJcMTc2L2Zvby9iYXIiLCAiXDE3Ni9mb28vYmFyIiksCiAgICAgICAgICAgICMgdW5xdW90ZWQgdW5zYWZlCiAgICAgICAgICAgICgiL2Zvb1wwMzEvYmFyIiwgIi9mb28lMTkvYmFyIiksCiAgICAgICAgICAgICgiL1wxNzVmb28vYmFyIiwgIi8lN0Rmb28vYmFyIiksCiAgICAgICAgICAgICMgdW5pY29kZQogICAgICAgICAgICAodSIvZm9vL2Jhclx1YWJjZCIsICIvZm9vL2JhciVFQSVBRiU4RCIpLCAgIyBVVEYtOCBlbmNvZGVkCiAgICAgICAgICAgIF0KICAgICAgICBmb3IgYXJnLCByZXN1bHQgaW4gY2FzZXM6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVzY2FwZV9wYXRoKGFyZyksIHJlc3VsdCkKCiAgICBkZWYgdGVzdF9yZXF1ZXN0X3BhdGgoc2VsZik6CiAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHJlcXVlc3RfcGF0aAogICAgICAgICMgd2l0aCBwYXJhbWV0ZXJzCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9yaGV1bS9yaGFwb25pY3VtOyIKICAgICAgICAgICAgICAgICAgICAgICJmb289YmFyO3Npbmc9c29uZz9hcHBsZXM9cGVhcnMmc3BhbT1lZ2dzI25pIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXF1ZXN0X3BhdGgocmVxKSwgIi9yaGV1bS9yaGFwb25pY3VtOyIKICAgICAgICAgICAgICAgICAgICAgImZvbz1iYXI7c2luZz1zb25nP2FwcGxlcz1wZWFycyZzcGFtPWVnZ3MjbmkiKQogICAgICAgICMgd2l0aG91dCBwYXJhbWV0ZXJzCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9yaGV1bS9yaGFwb25pY3VtPyIKICAgICAgICAgICAgICAgICAgICAgICJhcHBsZXM9cGVhcnMmc3BhbT1lZ2dzI25pIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXF1ZXN0X3BhdGgocmVxKSwgIi9yaGV1bS9yaGFwb25pY3VtPyIKICAgICAgICAgICAgICAgICAgICAgImFwcGxlcz1wZWFycyZzcGFtPWVnZ3MjbmkiKQogICAgICAgICMgbWlzc2luZyBmaW5hbCBzbGFzaAogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20iKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfcGF0aChyZXEpLCAiLyIpCgogICAgZGVmIHRlc3RfcmVxdWVzdF9wb3J0KHNlbGYpOgogICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCByZXF1ZXN0X3BvcnQsIERFRkFVTFRfSFRUUF9QT1JUCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbToxMjM0LyIsCiAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiSG9zdCI6ICJ3d3cuYWNtZS5jb206NDMyMSJ9KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfcG9ydChyZXEpLCAiMTIzNCIpCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iLAogICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAid3d3LmFjbWUuY29tOjQzMjEifSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXF1ZXN0X3BvcnQocmVxKSwgREVGQVVMVF9IVFRQX1BPUlQpCgogICAgZGVmIHRlc3RfcmVxdWVzdF9ob3N0KHNlbGYpOgogICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCByZXF1ZXN0X2hvc3QKICAgICAgICAjIHRoaXMgcmVxdWVzdCBpcyBpbGxlZ2FsIChSRkMyNjE2LCAxNC4yLjMpCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovLzEuMS4xLjEvIiwKICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo4MCJ9KQogICAgICAgICMgbGlid3d3LXBlcmwgd2FudHMgdGhpcyByZXNwb25zZSwgYnV0IHRoYXQgc2VlbXMgd3JvbmcgKFJGQyAyNjE2LAogICAgICAgICMgc2VjdGlvbiA1LjIsIHBvaW50IDEuLCBhbmQgUkZDIDI5NjUgc2VjdGlvbiAxLCBwYXJhZ3JhcGggMykKICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbHMocmVxdWVzdF9ob3N0KHJlcSksICJ3d3cuYWNtZS5jb20iKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfaG9zdChyZXEpLCAiMS4xLjEuMSIpCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iLAogICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAiaXJyZWxldmFudC5jb20ifSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXF1ZXN0X2hvc3QocmVxKSwgInd3dy5hY21lLmNvbSIpCiAgICAgICAgIyBub3QgYWN0dWFsbHkgc3VyZSB0aGlzIG9uZSBpcyB2YWxpZCBSZXF1ZXN0IG9iamVjdCwgc28gbWF5YmUgc2hvdWxkCiAgICAgICAgIyByZW1vdmUgdGVzdCBmb3Igbm8gaG9zdCBpbiB1cmwgaW4gcmVxdWVzdF9ob3N0IGZ1bmN0aW9uPwogICAgICAgIHJlcSA9IFJlcXVlc3QoIi9yZXNvdXJjZS5odG1sIiwKICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbSJ9KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfaG9zdChyZXEpLCAid3d3LmFjbWUuY29tIikKICAgICAgICAjIHBvcnQgc2hvdWxkbid0IGJlIGluIHJlcXVlc3QtaG9zdAogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb206MjM0NS9yZXNvdXJjZS5odG1sIiwKICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo1NDMyIn0pCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxdWVzdF9ob3N0KHJlcSksICJ3d3cuYWNtZS5jb20iKQoKICAgIGRlZiB0ZXN0X2lzX0hETihzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgaXNfSEROCiAgICAgICAgc2VsZi5hc3NlcnRfKGlzX0hETigiZm9vLmJhci5jb20iKSkKICAgICAgICBzZWxmLmFzc2VydF8oaXNfSEROKCIxZm9vMi4zYmFyNC41Y29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc19IRE4oIjE5Mi4xNjguMS4xIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc19IRE4oIiIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCIuIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc19IRE4oIi5mb28uYmFyLmNvbSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCIuLmZvbyIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCJmb28uIikpCgogICAgZGVmIHRlc3RfcmVhY2goc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHJlYWNoCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVhY2goInd3dy5hY21lLmNvbSIpLCAiLmFjbWUuY29tIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiYWNtZS5jb20iKSwgImFjbWUuY29tIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiYWNtZS5sb2NhbCIpLCAiLmxvY2FsIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiLmxvY2FsIiksICIubG9jYWwiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlYWNoKCIuY29tIiksICIuY29tIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiLiIpLCAiLiIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVhY2goIiIpLCAiIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiMTkyLjE2OC4wLjEiKSwgIjE5Mi4xNjguMC4xIikKCiAgICBkZWYgdGVzdF9kb21haW5fbWF0Y2goc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGRvbWFpbl9tYXRjaCwgdXNlcl9kb21haW5fbWF0Y2gKICAgICAgICBzZWxmLmFzc2VydF8oZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIxOTIuMTY4LjEuMSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIuMTY4LjEuMSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhkb21haW5fbWF0Y2goIngueS5jb20iLCAieC5ZLmNvbSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhkb21haW5fbWF0Y2goIngueS5jb20iLCAiLlkuY29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBkb21haW5fbWF0Y2goIngueS5jb20iLCAiWS5jb20iKSkKICAgICAgICBzZWxmLmFzc2VydF8oZG9tYWluX21hdGNoKCJhLmIuYy5jb20iLCAiLmMuY29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBkb21haW5fbWF0Y2goIi5jLmNvbSIsICJhLmIuYy5jb20iKSkKICAgICAgICBzZWxmLmFzc2VydF8oZG9tYWluX21hdGNoKCJleGFtcGxlLmxvY2FsIiwgIi5sb2NhbCIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZG9tYWluX21hdGNoKCJibGFoLmJsYWgiLCAiIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBkb21haW5fbWF0Y2goIiIsICIucmh1YmFyYi5yaHViYXJiIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKGRvbWFpbl9tYXRjaCgiIiwgIiIpKQoKICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goImFjbWUuY29tIiwgImFjbWUuY29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgiYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKHVzZXJfZG9tYWluX21hdGNoKCJyaHViYXJiLmFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgid3d3LnJodWJhcmIuYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKHVzZXJfZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgInguWS5jb20iKSkKICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLlkuY29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJZLmNvbSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgieS5jb20iLCAiWS5jb20iKSkKICAgICAgICBzZWxmLmFzc2VydF8obm90IHVzZXJfZG9tYWluX21hdGNoKCIueS5jb20iLCAiWS5jb20iKSkKICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goIi55LmNvbSIsICIuWS5jb20iKSkKICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLmNvbSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiY29tIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJtIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIubSIpKQogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKHVzZXJfZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIxOTIuMTY4LjEuMSIpKQogICAgICAgICMgbm90IGJvdGggSEROcywgc28gbXVzdCBzdHJpbmctY29tcGFyZSBlcXVhbCB0byBtYXRjaAogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4xNjguMS4xIikpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiLiIpKQogICAgICAgICMgZW1wdHkgc3RyaW5nIGlzIGEgc3BlY2lhbCBjYXNlCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiIikpCgogICAgZGVmIHRlc3Rfd3JvbmdfZG9tYWluKHNlbGYpOgogICAgICAgICMgQ29va2llcyB3aG9zZSBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0IG5hbWUgZG9lcyBub3QgZG9tYWluLW1hdGNoIHRoZQogICAgICAgICMgZG9tYWluIGFyZSByZWplY3RlZC4KCiAgICAgICAgIyBYWFggZmFyIGZyb20gY29tcGxldGUKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyCiAgICAgICAgYyA9IENvb2tpZUphcigpCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5uYXN0eS5jb20vIiwKICAgICAgICAgICAgICAgICAgICAgICdmb289YmFyOyBkb21haW49ZnJpZW5kbHkub3JnOyBWZXJzaW9uPSIxIicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAwKQoKICAgIGRlZiB0ZXN0X3N0cmljdF9kb21haW4oc2VsZik6CiAgICAgICAgIyBDb29raWVzIHdob3NlIGRvbWFpbiBpcyBhIGNvdW50cnktY29kZSB0bGQgbGlrZSAuY28udWsgc2hvdWxkCiAgICAgICAgIyBub3QgYmUgc2V0IGlmIENvb2tpZVBvbGljeS5zdHJpY3RfZG9tYWluIGlzIHRydWUuCiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQoKICAgICAgICBjcCA9IERlZmF1bHRDb29raWVQb2xpY3koc3RyaWN0X2RvbWFpbj1UcnVlKQogICAgICAgIGNqID0gQ29va2llSmFyKHBvbGljeT1jcCkKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjaiwgImh0dHA6Ly9leGFtcGxlLmNvLnVrLyIsICdubz1wcm9ibGVtbycpCiAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoY2osICJodHRwOi8vZXhhbXBsZS5jby51ay8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICdva2V5PWRva2V5OyBEb21haW49LmV4YW1wbGUuY28udWsnKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjaiksIDIpCiAgICAgICAgZm9yIHBzZXVkb190bGQgaW4gWyIuY28udWsiLCAiLm9yZy56YSIsICIudHgudXMiLCAiLm5hbWUudXMiXToKICAgICAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoY2osICJodHRwOi8vZXhhbXBsZS4lcy8iICUgcHNldWRvX3RsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwYW09ZWdnczsgRG9tYWluPS5jby51aycpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjaiksIDIpCgogICAgZGVmIHRlc3RfdHdvX2NvbXBvbmVudF9kb21haW5fbnMoc2VsZik6CiAgICAgICAgIyBOZXRzY2FwZTogLnd3dy5iYXIuY29tLCB3d3cuYmFyLmNvbSwgLmJhci5jb20sIGJhci5jb20sIG5vIGRvbWFpbgogICAgICAgICMgc2hvdWxkIGFsbCBnZXQgYWNjZXB0ZWQsIGFzIHNob3VsZCAuYWNtZS5jb20sIGFjbWUuY29tIGFuZCBubyBkb21haW4KICAgICAgICAjIGZvciAyLWNvbXBvbmVudCBkb21haW5zIGxpa2UgYWNtZS5jb20uCiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQoKICAgICAgICBjID0gQ29va2llSmFyKCkKCiAgICAgICAgIyB0d28tY29tcG9uZW50IFYwIGRvbWFpbiBpcyBPSwogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC8iLCAnbnM9YmFyJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYy5fY29va2llc1siZm9vLm5ldCJdWyIvIl1bIm5zIl0udmFsdWUsICJiYXIiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC8iKSwgIm5zPWJhciIpCiAgICAgICAgIyAqd2lsbCogYmUgcmV0dXJuZWQgdG8gYW55IG90aGVyIGRvbWFpbiAodW5saWtlIFJGQyAyOTY1KS4uLgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmZvby5uZXQvIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm5zPWJhciIpCiAgICAgICAgIyAuLi51bmxlc3MgcmVxdWVzdGVkIG90aGVyd2lzZQogICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3koCiAgICAgICAgICAgIHN0cmljdF9uc19kb21haW49RGVmYXVsdENvb2tpZVBvbGljeS5Eb21haW5TdHJpY3ROb25Eb21haW4pCiAgICAgICAgYy5zZXRfcG9saWN5KHBvbCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5mb28ubmV0LyIpLCAiIikKCiAgICAgICAgIyB1bmxpa2UgUkZDIDI5NjUsIGV2ZW4gZXhwbGljaXQgdHdvLWNvbXBvbmVudCBkb21haW4gaXMgT0ssCiAgICAgICAgIyBiZWNhdXNlIC5mb28ubmV0IG1hdGNoZXMgZm9vLm5ldAogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC9mb28vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAnc3BhbTE9ZWdnczsgZG9tYWluPWZvby5uZXQnKQogICAgICAgICMgZXZlbiBpZiBzdGFydHMgd2l0aCBhIGRvdCAtLSBpbiBOUyBydWxlcywgLmZvby5uZXQgbWF0Y2hlcyBmb28ubmV0IQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC9mb28vYmFyLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwYW0yPWVnZ3M7IGRvbWFpbj0uZm9vLm5ldCcpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAzKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMuX2Nvb2tpZXNbIi5mb28ubmV0Il1bIi9mb28iXVsic3BhbTEiXS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZWdncyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYy5fY29va2llc1siLmZvby5uZXQiXVsiL2Zvby9iYXIiXVsic3BhbTIiXS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZWdncyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9mb28ubmV0L2Zvby9iYXIvIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgInNwYW0yPWVnZ3M7IHNwYW0xPWVnZ3M7IG5zPWJhciIpCgogICAgICAgICMgdG9wLWxldmVsIGRvbWFpbiBpcyB0b28gZ2VuZXJhbAogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC8iLCAnbmluaT0ibmkiOyBkb21haW49Lm5ldCcpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAzKQoKIyMgICAgICAgICAjIE5ldHNjYXBlIHByb3RvY29sIGRvZXNuJ3QgYWxsb3cgbm9uLXNwZWNpYWwgdG9wIGxldmVsIGRvbWFpbnMgKHN1Y2gKIyMgICAgICAgICAjIGFzIGNvLnVrKSBpbiB0aGUgZG9tYWluIGF0dHJpYnV0ZSB1bmxlc3MgdGhlcmUgYXJlIGF0IGxlYXN0IHRocmVlCiMjICAgICAgICAgIyBkb3RzIGluIGl0LgogICAgICAgICMgT2ggeWVzIGl0IGRvZXMhICBSZWFsIGltcGxlbWVudGF0aW9ucyBkb24ndCBjaGVjayB0aGlzLCBhbmQgcmVhbAogICAgICAgICMgY29va2llcyAob2YgY291cnNlKSByZWx5IG9uIHRoYXQgYmVoYXZpb3VyLgogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLmNvLnVrIiwgJ25hc3R5PXRyaWNrOyBkb21haW49LmNvLnVrJykKIyMgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCA0KQoKICAgIGRlZiB0ZXN0X3R3b19jb21wb25lbnRfZG9tYWluX3JmYzI5NjUoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQoKICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkKICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKCiAgICAgICAgIyB0d28tY29tcG9uZW50IFYxIGRvbWFpbiBpcyBPSwogICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9mb28ubmV0LyIsICdmb289YmFyOyBWZXJzaW9uPSIxIicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMuX2Nvb2tpZXNbImZvby5uZXQiXVsiLyJdWyJmb28iXS52YWx1ZSwgImJhciIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2Zvby5uZXQvIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiRWZXJzaW9uPTE7IGZvbz1iYXIiKQogICAgICAgICMgd29uJ3QgYmUgcmV0dXJuZWQgdG8gYW55IG90aGVyIGRvbWFpbiAoYmVjYXVzZSBkb21haW4gd2FzIGltcGxpZWQpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5mb28ubmV0LyIpLCAiIikKCiAgICAgICAgIyB1bmxlc3MgZG9tYWluIGlzIGdpdmVuIGV4cGxpY2l0bHksIGJlY2F1c2UgdGhlbiBpdCBtdXN0IGJlCiAgICAgICAgIyByZXdyaXR0ZW4gdG8gc3RhcnQgd2l0aCBhIGRvdDogZm9vLm5ldCAtLT4gLmZvby5uZXQsIHdoaWNoIGRvZXMKICAgICAgICAjIG5vdCBkb21haW4tbWF0Y2ggZm9vLm5ldAogICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9mb28ubmV0L2ZvbyIsCiAgICAgICAgICAgICAgICAgICAgICAnc3BhbT1lZ2dzOyBkb21haW49Zm9vLm5ldDsgcGF0aD0vZm9vOyBWZXJzaW9uPSIxIicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9mb28ubmV0L2ZvbyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICIkVmVyc2lvbj0xOyBmb289YmFyIikKCiAgICAgICAgIyBleHBsaWNpdCBmb28ubmV0IGZyb20gdGhyZWUtY29tcG9uZW50IGRvbWFpbiB3d3cuZm9vLm5ldCAqZG9lcyogZ2V0CiAgICAgICAgIyBzZXQsIGJlY2F1c2UgLmZvby5uZXQgZG9tYWluLW1hdGNoZXMgLmZvby5uZXQKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmZvby5uZXQvZm9vLyIsCiAgICAgICAgICAgICAgICAgICAgICAnc3BhbT1lZ2dzOyBkb21haW49Zm9vLm5ldDsgVmVyc2lvbj0iMSInKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMuX2Nvb2tpZXNbIi5mb28ubmV0Il1bIi9mb28vIl1bInNwYW0iXS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZWdncyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9mb28ubmV0L2Zvby8iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiJFZlcnNpb249MTsgZm9vPWJhciIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5mb28ubmV0L2Zvby8iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAnJFZlcnNpb249MTsgc3BhbT1lZ2dzOyAkRG9tYWluPSJmb28ubmV0IicpCgogICAgICAgICMgdG9wLWxldmVsIGRvbWFpbiBpcyB0b28gZ2VuZXJhbAogICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9mb28ubmV0LyIsCiAgICAgICAgICAgICAgICAgICAgICAnbmk9Im5pIjsgZG9tYWluPSIubmV0IjsgVmVyc2lvbj0iMSInKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKCiAgICAgICAgIyBSRkMgMjk2NSBkb2Vzbid0IHJlcXVpcmUgYmxvY2tpbmcgdGhpcwogICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9mb28uY28udWsvIiwKICAgICAgICAgICAgICAgICAgICAgICduYXN0eT10cmljazsgZG9tYWluPS5jby51azsgVmVyc2lvbj0iMSInKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMykKCiAgICBkZWYgdGVzdF9kb21haW5fYWxsb3coc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQogICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAoKICAgICAgICBjID0gQ29va2llSmFyKHBvbGljeT1EZWZhdWx0Q29va2llUG9saWN5KAogICAgICAgICAgICBibG9ja2VkX2RvbWFpbnM9WyJhY21lLmNvbSJdLAogICAgICAgICAgICBhbGxvd2VkX2RvbWFpbnM9WyJ3d3cuYWNtZS5jb20iXSkpCgogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9hY21lLmNvbS8iKQogICAgICAgIGhlYWRlcnMgPSBbIlNldC1Db29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEU7IHBhdGg9LyJdCiAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vYWNtZS5jb20vIikKICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDApCgogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIikKICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCgogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuY295b3RlLmNvbS8iKQogICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5jb3lvdGUuY29tLyIpCiAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQoKICAgICAgICAjIHNldCBhIGNvb2tpZSB3aXRoIG5vbi1hbGxvd2VkIGRvbWFpbi4uLgogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuY295b3RlLmNvbS8iKQogICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5jb3lvdGUuY29tLyIpCiAgICAgICAgY29va2llcyA9IGMubWFrZV9jb29raWVzKHJlcywgcmVxKQogICAgICAgIGMuc2V0X2Nvb2tpZShjb29raWVzWzBdKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKICAgICAgICAjIC4uLiBhbmQgY2hlY2sgaXMgZG9lc24ndCBnZXQgcmV0dXJuZWQKICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKICAgICAgICBzZWxmLmFzc2VydF8obm90IHJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKCiAgICBkZWYgdGVzdF9kb21haW5fYmxvY2soc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQogICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAoKICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KAogICAgICAgICAgICByZmMyOTY1PVRydWUsIGJsb2NrZWRfZG9tYWlucz1bIi5hY21lLmNvbSJdKQogICAgICAgIGMgPSBDb29raWVKYXIocG9saWN5PXBvbCkKICAgICAgICBoZWFkZXJzID0gWyJTZXQtQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBwYXRoPS8iXQoKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCiAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCiAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAwKQoKICAgICAgICBwID0gcG9sLnNldF9ibG9ja2VkX2RvbWFpbnMoWyJhY21lLmNvbSJdKQogICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKCiAgICAgICAgYy5jbGVhcigpCiAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5yb2FkcnVubmVyLm5ldC8iKQogICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5yb2FkcnVubmVyLm5ldC8iKQogICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LnJvYWRydW5uZXIubmV0LyIpCiAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCiAgICAgICAgc2VsZi5hc3NlcnRfKChyZXEuaGFzX2hlYWRlcigiQ29va2llIikgYW5kCiAgICAgICAgICAgICAgICAgICAgICByZXEuaGFzX2hlYWRlcigiQ29va2llMiIpKSkKCiAgICAgICAgYy5jbGVhcigpCiAgICAgICAgcG9sLnNldF9ibG9ja2VkX2RvbWFpbnMoWyIuYWNtZS5jb20iXSkKICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCgogICAgICAgICMgc2V0IGEgY29va2llIHdpdGggYmxvY2tlZCBkb21haW4uLi4KICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCiAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCiAgICAgICAgY29va2llcyA9IGMubWFrZV9jb29raWVzKHJlcywgcmVxKQogICAgICAgIGMuc2V0X2Nvb2tpZShjb29raWVzWzBdKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKICAgICAgICAjIC4uLiBhbmQgY2hlY2sgaXMgZG9lc24ndCBnZXQgcmV0dXJuZWQKICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKICAgICAgICBzZWxmLmFzc2VydF8obm90IHJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKCiAgICBkZWYgdGVzdF9zZWN1cmUoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQoKICAgICAgICBmb3IgbnMgaW4gVHJ1ZSwgRmFsc2U6CiAgICAgICAgICAgIGZvciB3aGl0ZXNwYWNlIGluICIgIiwgIiI6CiAgICAgICAgICAgICAgICBjID0gQ29va2llSmFyKCkKICAgICAgICAgICAgICAgIGlmIG5zOgogICAgICAgICAgICAgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1GYWxzZSkKICAgICAgICAgICAgICAgICAgICBpbnQgPSBpbnRlcmFjdF9uZXRzY2FwZQogICAgICAgICAgICAgICAgICAgIHZzID0gIiIKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCiAgICAgICAgICAgICAgICAgICAgaW50ID0gaW50ZXJhY3RfMjk2NQogICAgICAgICAgICAgICAgICAgIHZzID0gIjsgVmVyc2lvbj0xIgogICAgICAgICAgICAgICAgYy5zZXRfcG9saWN5KHBvbCkKICAgICAgICAgICAgICAgIHVybCA9ICJodHRwOi8vd3d3LmFjbWUuY29tLyIKICAgICAgICAgICAgICAgIGludChjLCB1cmwsICJmb28xPWJhciVzJXMiICUgKHZzLCB3aGl0ZXNwYWNlKSkKICAgICAgICAgICAgICAgIGludChjLCB1cmwsICJmb28yPWJhciVzOyBzZWN1cmUlcyIgJSAgKHZzLCB3aGl0ZXNwYWNlKSkKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygKICAgICAgICAgICAgICAgICAgICBub3QgYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZm9vMSJdLnNlY3VyZSwKICAgICAgICAgICAgICAgICAgICAibm9uLXNlY3VyZSBjb29raWUgcmVnaXN0ZXJlZCBzZWN1cmUiKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKAogICAgICAgICAgICAgICAgICAgIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImZvbzIiXS5zZWN1cmUsCiAgICAgICAgICAgICAgICAgICAgInNlY3VyZSBjb29raWUgcmVnaXN0ZXJlZCBub24tc2VjdXJlIikKCiAgICBkZWYgdGVzdF9xdW90ZV9jb29raWVfdmFsdWUoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQogICAgICAgIGMgPSBDb29raWVKYXIocG9saWN5PURlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsIHInZm9vPVxiImEicjsgVmVyc2lvbj0xJykKICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGgsIHInJFZlcnNpb249MTsgZm9vPVxcYlwiYVwicicpCgogICAgZGVmIHRlc3RfbWlzc2luZ19maW5hbF9zbGFzaChzZWxmKToKICAgICAgICAjIE1pc3Npbmcgc2xhc2ggZnJvbSByZXF1ZXN0IFVSTCdzIGFic19wYXRoIHNob3VsZCBiZSBhc3N1bWVkIHByZXNlbnQuCiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQogICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAogICAgICAgIHVybCA9ICJodHRwOi8vd3d3LmFjbWUuY29tIgogICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQogICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAiZm9vPWJhcjsgVmVyc2lvbj0xIikKICAgICAgICByZXEgPSBSZXF1ZXN0KHVybCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCiAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCiAgICAgICAgc2VsZi5hc3NlcnRfKHJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKCiAgICBkZWYgdGVzdF9kb21haW5fbWlycm9yKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKCiAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCgogICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgogICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAic3BhbT1lZ2dzOyBWZXJzaW9uPTEiKQogICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKICAgICAgICBzZWxmLmFzc2VydF8oIkRvbWFpbiIgbm90IGluIGgsCiAgICAgICAgICAgICAgICAgICAgICJhYnNlbnQgZG9tYWluIHJldHVybmVkIHdpdGggZG9tYWluIHByZXNlbnQiKQoKICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBEb21haW49LmJhci5jb20nKQogICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKICAgICAgICBzZWxmLmFzc2VydF8oJyREb21haW49Ii5iYXIuY29tIicgaW4gaCwgImRvbWFpbiBub3QgcmV0dXJuZWQiKQoKICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICAjIG5vdGUgbWlzc2luZyBpbml0aWFsIGRvdCBpbiBEb21haW4KICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBEb21haW49YmFyLmNvbScpCiAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQogICAgICAgIHNlbGYuYXNzZXJ0XygnJERvbWFpbj0iYmFyLmNvbSInIGluIGgsICJkb21haW4gbm90IHJldHVybmVkIikKCiAgICBkZWYgdGVzdF9wYXRoX21pcnJvcihzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CgogICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQoKICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgInNwYW09ZWdnczsgVmVyc2lvbj0xIikKICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCiAgICAgICAgc2VsZi5hc3NlcnRfKCJQYXRoIiBub3QgaW4gaCwKICAgICAgICAgICAgICAgICAgICAgImFic2VudCBwYXRoIHJldHVybmVkIHdpdGggcGF0aCBwcmVzZW50IikKCiAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICdzcGFtPWVnZ3M7IFZlcnNpb249MTsgUGF0aD0vJykKICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCiAgICAgICAgc2VsZi5hc3NlcnRfKCckUGF0aD0iLyInIGluIGgsICJwYXRoIG5vdCByZXR1cm5lZCIpCgogICAgZGVmIHRlc3RfcG9ydF9taXJyb3Ioc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQoKICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkKCiAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICJzcGFtPWVnZ3M7IFZlcnNpb249MSIpCiAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQogICAgICAgIHNlbGYuYXNzZXJ0XygiUG9ydCIgbm90IGluIGgsCiAgICAgICAgICAgICAgICAgICAgICJhYnNlbnQgcG9ydCByZXR1cm5lZCB3aXRoIHBvcnQgcHJlc2VudCIpCgogICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgogICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAic3BhbT1lZ2dzOyBWZXJzaW9uPTE7IFBvcnQiKQogICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKCJcJFBvcnQoW149XXwkKSIsIGgpLAogICAgICAgICAgICAgICAgICAgICAicG9ydCB3aXRoIG5vIHZhbHVlIG5vdCByZXR1cm5lZCB3aXRoIG5vIHZhbHVlIikKCiAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICdzcGFtPWVnZ3M7IFZlcnNpb249MTsgUG9ydD0iODAiJykKICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCiAgICAgICAgc2VsZi5hc3NlcnRfKCckUG9ydD0iODAiJyBpbiBoLAogICAgICAgICAgICAgICAgICAgICAicG9ydCB3aXRoIHNpbmdsZSB2YWx1ZSBub3QgcmV0dXJuZWQgd2l0aCBzaW5nbGUgdmFsdWUiKQoKICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBQb3J0PSI4MCw4MDgwIicpCiAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQogICAgICAgIHNlbGYuYXNzZXJ0XygnJFBvcnQ9IjgwLDgwODAiJyBpbiBoLAogICAgICAgICAgICAgICAgICAgICAicG9ydCB3aXRoIG11bHRpcGxlIHZhbHVlcyBub3QgcmV0dXJuZWQgd2l0aCBtdWx0aXBsZSAiCiAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZXMiKQoKICAgIGRlZiB0ZXN0X25vX3JldHVybl9jb21tZW50KHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKCiAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCiAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICdzcGFtPWVnZ3M7IFZlcnNpb249MTsgJwogICAgICAgICAgICAgICAgICAgICAgJ0NvbW1lbnQ9ImRvZXMgYW55Ym9keSByZWFkIHRoZXNlPyI7ICcKICAgICAgICAgICAgICAgICAgICAgICdDb21tZW50VVJMPSJodHRwOi8vZm9vLmJhci5uZXQvY29tbWVudC5odG1sIicpCiAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQogICAgICAgIHNlbGYuYXNzZXJ0XygKICAgICAgICAgICAgIkNvbW1lbnQiIG5vdCBpbiBoLAogICAgICAgICAgICAiQ29tbWVudCBvciBDb21tZW50VVJMIGNvb2tpZS1hdHRyaWJ1dGVzIHJldHVybmVkIHRvIHNlcnZlciIpCgogICAgZGVmIHRlc3RfQ29va2llX2l0ZXJhdG9yKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIENvb2tpZSwgRGVmYXVsdENvb2tpZVBvbGljeQoKICAgICAgICBjcyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCiAgICAgICAgIyBhZGQgc29tZSByYW5kb20gY29va2llcwogICAgICAgIGludGVyYWN0XzI5NjUoY3MsICJodHRwOi8vYmxhaC5zcGFtLm9yZy8iLCAnZm9vPWVnZ3M7IFZlcnNpb249MTsgJwogICAgICAgICAgICAgICAgICAgICAgJ0NvbW1lbnQ9ImRvZXMgYW55Ym9keSByZWFkIHRoZXNlPyI7ICcKICAgICAgICAgICAgICAgICAgICAgICdDb21tZW50VVJMPSJodHRwOi8vZm9vLmJhci5uZXQvY29tbWVudC5odG1sIicpCiAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoY3MsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvIiwgInNwYW09YmFyOyBzZWN1cmUiKQogICAgICAgIGludGVyYWN0XzI5NjUoY3MsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvIiwKICAgICAgICAgICAgICAgICAgICAgICJmb289YmFyOyBzZWN1cmU7IFZlcnNpb249MSIpCiAgICAgICAgaW50ZXJhY3RfMjk2NShjcywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC8iLAogICAgICAgICAgICAgICAgICAgICAgImZvbz1iYXI7IHBhdGg9LzsgVmVyc2lvbj0xIikKICAgICAgICBpbnRlcmFjdF8yOTY1KGNzLCAiaHR0cDovL3d3dy5zb2wubm8iLAogICAgICAgICAgICAgICAgICAgICAgcidiYW5nPXdhbGxvcDsgdmVyc2lvbj0xOyBkb21haW49Ii5zb2wubm8iOyAnCiAgICAgICAgICAgICAgICAgICAgICByJ3BvcnQ9IjkwLDEwMCwgODAsODA4MCI7ICcKICAgICAgICAgICAgICAgICAgICAgIHInbWF4LWFnZT0xMDA7IENvbW1lbnQgPSAiSnVzdCBraWRkaW5nISAoXCJ8XFxcXCkgIicpCgogICAgICAgIHZlcnNpb25zID0gWzEsIDEsIDEsIDAsIDFdCiAgICAgICAgbmFtZXMgPSBbImJhbmciLCAiZm9vIiwgImZvbyIsICJzcGFtIiwgImZvbyJdCiAgICAgICAgZG9tYWlucyA9IFsiLnNvbC5ubyIsICJibGFoLnNwYW0ub3JnIiwgInd3dy5hY21lLmNvbSIsCiAgICAgICAgICAgICAgICAgICAid3d3LmFjbWUuY29tIiwgInd3dy5hY21lLmNvbSJdCiAgICAgICAgcGF0aHMgPSBbIi8iLCAiLyIsICIvIiwgIi9ibGFoIiwgIi9ibGFoLyJdCgogICAgICAgIGZvciBpIGluIHJhbmdlKDQpOgogICAgICAgICAgICBpID0gMAogICAgICAgICAgICBmb3IgYyBpbiBjczoKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGMsIENvb2tpZSkpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjLnZlcnNpb24sIHZlcnNpb25zW2ldKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYy5uYW1lLCBuYW1lc1tpXSkKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMuZG9tYWluLCBkb21haW5zW2ldKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYy5wYXRoLCBwYXRoc1tpXSkKICAgICAgICAgICAgICAgIGkgPSBpICsgMQoKICAgIGRlZiB0ZXN0X3BhcnNlX25zX2hlYWRlcnMoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHBhcnNlX25zX2hlYWRlcnMKCiAgICAgICAgIyBtaXNzaW5nIGRvbWFpbiB2YWx1ZSAoaW52YWxpZCBjb29raWUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCiAgICAgICAgICAgIHBhcnNlX25zX2hlYWRlcnMoWyJmb289YmFyOyBwYXRoPS87IGRvbWFpbiJdKSwKICAgICAgICAgICAgW1soImZvbyIsICJiYXIiKSwKICAgICAgICAgICAgICAoInBhdGgiLCAiLyIpLCAoImRvbWFpbiIsIE5vbmUpLCAoInZlcnNpb24iLCAiMCIpXV0KICAgICAgICAgICAgKQogICAgICAgICMgaW52YWxpZCBleHBpcmVzIHZhbHVlCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCiAgICAgICAgICAgIHBhcnNlX25zX2hlYWRlcnMoWyJmb289YmFyOyBleHBpcmVzPUZvbyBCYXIgMTIgMzM6MjI6MTEgMjAwMCJdKSwKICAgICAgICAgICAgW1soImZvbyIsICJiYXIiKSwgKCJleHBpcmVzIiwgTm9uZSksICgidmVyc2lvbiIsICIwIildXQogICAgICAgICAgICApCiAgICAgICAgIyBtaXNzaW5nIGNvb2tpZSB2YWx1ZSAodmFsaWQgY29va2llKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAogICAgICAgICAgICBwYXJzZV9uc19oZWFkZXJzKFsiZm9vIl0pLAogICAgICAgICAgICBbWygiZm9vIiwgTm9uZSksICgidmVyc2lvbiIsICIwIildXQogICAgICAgICAgICApCiAgICAgICAgIyBzaG91bGRuJ3QgYWRkIHZlcnNpb24gaWYgaGVhZGVyIGlzIGVtcHR5CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VfbnNfaGVhZGVycyhbIiJdKSwgW10pCgogICAgZGVmIHRlc3RfYmFkX2Nvb2tpZV9oZWFkZXIoc2VsZik6CgogICAgICAgIGRlZiBjb29raWVqYXJfZnJvbV9jb29raWVfaGVhZGVycyhoZWFkZXJzKToKICAgICAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphcgogICAgICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKICAgICAgICAgICAgYyA9IENvb2tpZUphcigpCiAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKICAgICAgICAgICAgciA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQogICAgICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyLCByZXEpCiAgICAgICAgICAgIHJldHVybiBjCgogICAgICAgICMgbm9uZSBvZiB0aGVzZSBiYWQgaGVhZGVycyBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIHRvIGJlIHJhaXNlZAogICAgICAgIGZvciBoZWFkZXJzIGluIFsKICAgICAgICAgICAgWyJTZXQtQ29va2llOiAiXSwgICMgYWN0dWFsbHksIG5vdGhpbmcgd3Jvbmcgd2l0aCB0aGlzCiAgICAgICAgICAgIFsiU2V0LUNvb2tpZTI6ICJdLCAgIyBkaXR0bwogICAgICAgICAgICAjIG1pc3NpbmcgZG9tYWluIHZhbHVlCiAgICAgICAgICAgIFsiU2V0LUNvb2tpZTI6IGE9Zm9vOyBwYXRoPS87IFZlcnNpb249MTsgZG9tYWluIl0sCiAgICAgICAgICAgICMgYmFkIG1heC1hZ2UKICAgICAgICAgICAgWyJTZXQtQ29va2llOiBiPWZvbzsgbWF4LWFnZT1vb3BzIl0sCiAgICAgICAgICAgIF06CiAgICAgICAgICAgIGMgPSBjb29raWVqYXJfZnJvbV9jb29raWVfaGVhZGVycyhoZWFkZXJzKQogICAgICAgICAgICAjIHRoZXNlIGJhZCBjb29raWVzIHNob3VsZG4ndCBiZSBzZXQKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAwKQoKICAgICAgICAjIGNvb2tpZSB3aXRoIGludmFsaWQgZXhwaXJlcyBpcyB0cmVhdGVkIGFzIHNlc3Npb24gY29va2llCiAgICAgICAgaGVhZGVycyA9IFsiU2V0LUNvb2tpZTogYz1mb287IGV4cGlyZXM9Rm9vIEJhciAxMiAzMzoyMjoxMSAyMDAwIl0KICAgICAgICBjID0gY29va2llamFyX2Zyb21fY29va2llX2hlYWRlcnMoaGVhZGVycykKICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuZXhhbXBsZS5jb20iXVsiLyJdWyJjIl0KICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLmV4cGlyZXMgaXMgTm9uZSkKCgpjbGFzcyBMV1BDb29raWVUZXN0cyhUZXN0Q2FzZSk6CiAgICAjIFRlc3RzIHRha2VuIGZyb20gbGlid3d3LXBlcmwsIHdpdGggYSBmZXcgbW9kaWZpY2F0aW9ucyBhbmQgYWRkaXRpb25zLgoKICAgIGRlZiB0ZXN0X25ldHNjYXBlX2V4YW1wbGVfMShzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CiAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CgogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBGaXJzdCB3ZSBjaGVjayB0aGF0IGl0IHdvcmtzIGZvciB0aGUgb3JpZ2luYWwgZXhhbXBsZSBhdAogICAgICAgICMgaHR0cDovL3d3dy5uZXRzY2FwZS5jb20vbmV3c3JlZi9zdGQvY29va2llX3NwZWMuaHRtbAoKICAgICAgICAjIENsaWVudCByZXF1ZXN0cyBhIGRvY3VtZW50LCBhbmQgcmVjZWl2ZXMgaW4gdGhlIHJlc3BvbnNlOgogICAgICAgICMKICAgICAgICAjICAgICAgIFNldC1Db29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEU7IHBhdGg9LzsgZXhwaXJlcz1XZWRuZXNkYXksIDA5LU5vdi05OSAyMzoxMjo0MCBHTVQKICAgICAgICAjCiAgICAgICAgIyBXaGVuIGNsaWVudCByZXF1ZXN0cyBhIFVSTCBpbiBwYXRoICIvIiBvbiB0aGlzIHNlcnZlciwgaXQgc2VuZHM6CiAgICAgICAgIwogICAgICAgICMgICAgICAgQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFCiAgICAgICAgIwogICAgICAgICMgQ2xpZW50IHJlcXVlc3RzIGEgZG9jdW1lbnQsIGFuZCByZWNlaXZlcyBpbiB0aGUgcmVzcG9uc2U6CiAgICAgICAgIwogICAgICAgICMgICAgICAgU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDE7IHBhdGg9LwogICAgICAgICMKICAgICAgICAjIFdoZW4gY2xpZW50IHJlcXVlc3RzIGEgVVJMIGluIHBhdGggIi8iIG9uIHRoaXMgc2VydmVyLCBpdCBzZW5kczoKICAgICAgICAjCiAgICAgICAgIyAgICAgICBDb29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEU7IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxCiAgICAgICAgIwogICAgICAgICMgQ2xpZW50IHJlY2VpdmVzOgogICAgICAgICMKICAgICAgICAjICAgICAgIFNldC1Db29raWU6IFNISVBQSU5HPUZFREVYOyBwYXRoPS9mbwogICAgICAgICMKICAgICAgICAjIFdoZW4gY2xpZW50IHJlcXVlc3RzIGEgVVJMIGluIHBhdGggIi8iIG9uIHRoaXMgc2VydmVyLCBpdCBzZW5kczoKICAgICAgICAjCiAgICAgICAgIyAgICAgICBDb29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEU7IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxCiAgICAgICAgIwogICAgICAgICMgV2hlbiBjbGllbnQgcmVxdWVzdHMgYSBVUkwgaW4gcGF0aCAiL2ZvbyIgb24gdGhpcyBzZXJ2ZXIsIGl0IHNlbmRzOgogICAgICAgICMKICAgICAgICAjICAgICAgIENvb2tpZTogQ1VTVE9NRVI9V0lMRV9FX0NPWU9URTsgUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDE7IFNISVBQSU5HPUZFREVYCiAgICAgICAgIwogICAgICAgICMgVGhlIGxhc3QgQ29va2llIGlzIGJ1Z2d5LCBiZWNhdXNlIGJvdGggc3BlY2lmaWNhdGlvbnMgc2F5IHRoYXQgdGhlCiAgICAgICAgIyBtb3N0IHNwZWNpZmljIGNvb2tpZSBtdXN0IGJlIHNlbnQgZmlyc3QuICBTSElQUElORz1GRURFWCBpcyB0aGUKICAgICAgICAjIG1vc3Qgc3BlY2lmaWMgYW5kIHNob3VsZCB0aHVzIGJlIGZpcnN0LgoKICAgICAgICB5ZWFyX3BsdXNfb25lID0gdGltZS5sb2NhbHRpbWUoKVswXSArIDEKCiAgICAgICAgaGVhZGVycyA9IFtdCgogICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1ID0gVHJ1ZSkpCgogICAgICAgICNyZXEgPSBSZXF1ZXN0KCJodHRwOi8vMS4xLjEuMS8iLAogICAgICAgICMgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo4MCJ9KQogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb206ODAvIiwKICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo4MCJ9KQoKICAgICAgICBoZWFkZXJzLmFwcGVuZCgKICAgICAgICAgICAgIlNldC1Db29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEU7IHBhdGg9LyA7ICIKICAgICAgICAgICAgImV4cGlyZXM9V2VkbmVzZGF5LCAwOS1Ob3YtJWQgMjM6MTI6NDAgR01UIiAlIHllYXJfcGx1c19vbmUpCiAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCiAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCgogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIikKICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hlYWRlcigiQ29va2llIiksICJDVVNUT01FUj1XSUxFX0VfQ09ZT1RFIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfaGVhZGVyKCJDb29raWUyIiksICckVmVyc2lvbj0iMSInKQoKICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDE7IHBhdGg9LyIpCiAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCiAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCgogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vL2JhciIpCiAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCgogICAgICAgIGggPSByZXEuZ2V0X2hlYWRlcigiQ29va2llIikKICAgICAgICBzZWxmLmFzc2VydF8oIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAogICAgICAgICAgICAgICAgICAgICAiQ1VTVE9NRVI9V0lMRV9FX0NPWU9URSIgaW4gaCkKCiAgICAgICAgaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWU6IFNISVBQSU5HPUZFREVYOyBwYXRoPS9mb28nKQogICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbSIpCiAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCgogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIikKICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKCiAgICAgICAgaCA9IHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKQogICAgICAgIHNlbGYuYXNzZXJ0XygiUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEiIGluIGggYW5kCiAgICAgICAgICAgICAgICAgICAgICJDVVNUT01FUj1XSUxFX0VfQ09ZT1RFIiBpbiBoIGFuZAogICAgICAgICAgICAgICAgICAgICAiU0hJUFBJTkc9RkVERVgiIG5vdCBpbiBoKQoKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tL2Zvby8iKQogICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQoKICAgICAgICBoID0gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpCiAgICAgICAgc2VsZi5hc3NlcnRfKCgiUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEiIGluIGggYW5kCiAgICAgICAgICAgICAgICAgICAgICAiQ1VTVE9NRVI9V0lMRV9FX0NPWU9URSIgaW4gaCBhbmQKICAgICAgICAgICAgICAgICAgICAgIGguc3RhcnRzd2l0aCgiU0hJUFBJTkc9RkVERVg7IikpKQoKICAgIGRlZiB0ZXN0X25ldHNjYXBlX2V4YW1wbGVfMihzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyCiAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CgogICAgICAgICMgU2Vjb25kIEV4YW1wbGUgdHJhbnNhY3Rpb24gc2VxdWVuY2U6CiAgICAgICAgIwogICAgICAgICMgQXNzdW1lIGFsbCBtYXBwaW5ncyBmcm9tIGFib3ZlIGhhdmUgYmVlbiBjbGVhcmVkLgogICAgICAgICMKICAgICAgICAjIENsaWVudCByZWNlaXZlczoKICAgICAgICAjCiAgICAgICAgIyAgICAgICBTZXQtQ29va2llOiBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMTsgcGF0aD0vCiAgICAgICAgIwogICAgICAgICMgV2hlbiBjbGllbnQgcmVxdWVzdHMgYSBVUkwgaW4gcGF0aCAiLyIgb24gdGhpcyBzZXJ2ZXIsIGl0IHNlbmRzOgogICAgICAgICMKICAgICAgICAjICAgICAgIENvb2tpZTogUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEKICAgICAgICAjCiAgICAgICAgIyBDbGllbnQgcmVjZWl2ZXM6CiAgICAgICAgIwogICAgICAgICMgICAgICAgU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9UklESU5HX1JPQ0tFVF8wMDIzOyBwYXRoPS9hbW1vCiAgICAgICAgIwogICAgICAgICMgV2hlbiBjbGllbnQgcmVxdWVzdHMgYSBVUkwgaW4gcGF0aCAiL2FtbW8iIG9uIHRoaXMgc2VydmVyLCBpdCBzZW5kczoKICAgICAgICAjCiAgICAgICAgIyAgICAgICBDb29raWU6IFBBUlRfTlVNQkVSPVJJRElOR19ST0NLRVRfMDAyMzsgUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEKICAgICAgICAjCiAgICAgICAgIyAgICAgICBOT1RFOiBUaGVyZSBhcmUgdHdvIG5hbWUvdmFsdWUgcGFpcnMgbmFtZWQgIlBBUlRfTlVNQkVSIiBkdWUgdG8KICAgICAgICAjICAgICAgIHRoZSBpbmhlcml0YW5jZSBvZiB0aGUgIi8iIG1hcHBpbmcgaW4gYWRkaXRpb24gdG8gdGhlICIvYW1tbyIgbWFwcGluZy4KCiAgICAgICAgYyA9IENvb2tpZUphcigpCiAgICAgICAgaGVhZGVycyA9IFtdCgogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIikKICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDE7IHBhdGg9LyIpCiAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCgogICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQoKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCiAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEiKQoKICAgICAgICBoZWFkZXJzLmFwcGVuZCgKICAgICAgICAgICAgIlNldC1Db29raWU6IFBBUlRfTlVNQkVSPVJJRElOR19ST0NLRVRfMDAyMzsgcGF0aD0vYW1tbyIpCiAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCiAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCgogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vYW1tbyIpCiAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCgogICAgICAgIHNlbGYuYXNzZXJ0XyhyZS5zZWFyY2gociJQQVJUX05VTUJFUj1SSURJTkdfUk9DS0VUXzAwMjM7XHMqIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKSkpCgogICAgZGVmIHRlc3RfaWV0Zl9leGFtcGxlXzEoc2VsZik6CiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBUaGVuIHdlIHRlc3Qgd2l0aCB0aGUgZXhhbXBsZXMgZnJvbSBkcmFmdC1pZXRmLWh0dHAtc3RhdGUtbWFuLW1lYy0wMy50eHQKICAgICAgICAjCiAgICAgICAgIyA1LiAgRVhBTVBMRVMKCiAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCgogICAgICAgICMKICAgICAgICAjIDUuMSAgRXhhbXBsZSAxCiAgICAgICAgIwogICAgICAgICMgTW9zdCBkZXRhaWwgb2YgcmVxdWVzdCBhbmQgcmVzcG9uc2UgaGVhZGVycyBoYXMgYmVlbiBvbWl0dGVkLiAgQXNzdW1lCiAgICAgICAgIyB0aGUgdXNlciBhZ2VudCBoYXMgbm8gc3RvcmVkIGNvb2tpZXMuCiAgICAgICAgIwogICAgICAgICMgICAxLiAgVXNlciBBZ2VudCAtPiBTZXJ2ZXIKICAgICAgICAjCiAgICAgICAgIyAgICAgICBQT1NUIC9hY21lL2xvZ2luIEhUVFAvMS4xCiAgICAgICAgIyAgICAgICBbZm9ybSBkYXRhXQogICAgICAgICMKICAgICAgICAjICAgICAgIFVzZXIgaWRlbnRpZmllcyBzZWxmIHZpYSBhIGZvcm0uCiAgICAgICAgIwogICAgICAgICMgICAyLiAgU2VydmVyIC0+IFVzZXIgQWdlbnQKICAgICAgICAjCiAgICAgICAgIyAgICAgICBIVFRQLzEuMSAyMDAgT0sKICAgICAgICAjICAgICAgIFNldC1Db29raWUyOiBDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSIKICAgICAgICAjCiAgICAgICAgIyAgICAgICBDb29raWUgcmVmbGVjdHMgdXNlcidzIGlkZW50aXR5LgoKICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KAogICAgICAgICAgICBjLCAnaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL2xvZ2luJywKICAgICAgICAgICAgJ0N1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjb29raWUpCgogICAgICAgICMKICAgICAgICAjICAgMy4gIFVzZXIgQWdlbnQgLT4gU2VydmVyCiAgICAgICAgIwogICAgICAgICMgICAgICAgUE9TVCAvYWNtZS9waWNraXRlbSBIVFRQLzEuMQogICAgICAgICMgICAgICAgQ29va2llOiAkVmVyc2lvbj0iMSI7IEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgJFBhdGg9Ii9hY21lIgogICAgICAgICMgICAgICAgW2Zvcm0gZGF0YV0KICAgICAgICAjCiAgICAgICAgIyAgICAgICBVc2VyIHNlbGVjdHMgYW4gaXRlbSBmb3IgYGBzaG9wcGluZyBiYXNrZXQuJycKICAgICAgICAjCiAgICAgICAgIyAgIDQuICBTZXJ2ZXIgLT4gVXNlciBBZ2VudAogICAgICAgICMKICAgICAgICAjICAgICAgIEhUVFAvMS4xIDIwMCBPSwogICAgICAgICMgICAgICAgU2V0LUNvb2tpZTI6IFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7IFZlcnNpb249IjEiOwogICAgICAgICMgICAgICAgICAgICAgICBQYXRoPSIvYWNtZSIKICAgICAgICAjCiAgICAgICAgIyAgICAgICBTaG9wcGluZyBiYXNrZXQgY29udGFpbnMgYW4gaXRlbS4KCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAnaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL3BpY2tpdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpOwogICAgICAgIHNlbGYuYXNzZXJ0XyhyZS5zZWFyY2goCiAgICAgICAgICAgIHInXlwkVmVyc2lvbj0iPzEiPzsgQ3VzdG9tZXI9Ij9XSUxFX0VfQ09ZT1RFIj87IFwkUGF0aD0iL2FjbWUiJCcsCiAgICAgICAgICAgIGNvb2tpZSkpCgogICAgICAgICMKICAgICAgICAjICAgNS4gIFVzZXIgQWdlbnQgLT4gU2VydmVyCiAgICAgICAgIwogICAgICAgICMgICAgICAgUE9TVCAvYWNtZS9zaGlwcGluZyBIVFRQLzEuMQogICAgICAgICMgICAgICAgQ29va2llOiAkVmVyc2lvbj0iMSI7CiAgICAgICAgIyAgICAgICAgICAgICAgIEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgJFBhdGg9Ii9hY21lIjsKICAgICAgICAjICAgICAgICAgICAgICAgUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgJFBhdGg9Ii9hY21lIgogICAgICAgICMgICAgICAgW2Zvcm0gZGF0YV0KICAgICAgICAjCiAgICAgICAgIyAgICAgICBVc2VyIHNlbGVjdHMgc2hpcHBpbmcgbWV0aG9kIGZyb20gZm9ybS4KICAgICAgICAjCiAgICAgICAgIyAgIDYuICBTZXJ2ZXIgLT4gVXNlciBBZ2VudAogICAgICAgICMKICAgICAgICAjICAgICAgIEhUVFAvMS4xIDIwMCBPSwogICAgICAgICMgICAgICAgU2V0LUNvb2tpZTI6IFNoaXBwaW5nPSJGZWRFeCI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSIKICAgICAgICAjCiAgICAgICAgIyAgICAgICBOZXcgY29va2llIHJlZmxlY3RzIHNoaXBwaW5nIG1ldGhvZC4KCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL3NoaXBwaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTaGlwcGluZz0iRmVkRXgiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJykKCiAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaChyJ15cJFZlcnNpb249Ij8xIj87JywgY29va2llKSkKICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKHInUGFydF9OdW1iZXI9Ij9Sb2NrZXRfTGF1bmNoZXJfMDAwMSI/OycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdccypcJFBhdGg9IlwvYWNtZSInLCBjb29raWUpKQogICAgICAgIHNlbGYuYXNzZXJ0XyhyZS5zZWFyY2gocidDdXN0b21lcj0iP1dJTEVfRV9DT1lPVEUiPztccypcJFBhdGg9IlwvYWNtZSInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llKSkKCiAgICAgICAgIwogICAgICAgICMgICA3LiAgVXNlciBBZ2VudCAtPiBTZXJ2ZXIKICAgICAgICAjCiAgICAgICAgIyAgICAgICBQT1NUIC9hY21lL3Byb2Nlc3MgSFRUUC8xLjEKICAgICAgICAjICAgICAgIENvb2tpZTogJFZlcnNpb249IjEiOwogICAgICAgICMgICAgICAgICAgICAgICBDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7ICRQYXRoPSIvYWNtZSI7CiAgICAgICAgIyAgICAgICAgICAgICAgIFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7ICRQYXRoPSIvYWNtZSI7CiAgICAgICAgIyAgICAgICAgICAgICAgIFNoaXBwaW5nPSJGZWRFeCI7ICRQYXRoPSIvYWNtZSIKICAgICAgICAjICAgICAgIFtmb3JtIGRhdGFdCiAgICAgICAgIwogICAgICAgICMgICAgICAgVXNlciBjaG9vc2VzIHRvIHByb2Nlc3Mgb3JkZXIuCiAgICAgICAgIwogICAgICAgICMgICA4LiAgU2VydmVyIC0+IFVzZXIgQWdlbnQKICAgICAgICAjCiAgICAgICAgIyAgICAgICBIVFRQLzEuMSAyMDAgT0sKICAgICAgICAjCiAgICAgICAgIyAgICAgICBUcmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL3Byb2Nlc3MiKQogICAgICAgIHNlbGYuYXNzZXJ0XygKICAgICAgICAgICAgcmUuc2VhcmNoKHInU2hpcHBpbmc9Ij9GZWRFeCI/O1xzKlwkUGF0aD0iXC9hY21lIicsIGNvb2tpZSkgYW5kCiAgICAgICAgICAgICJXSUxFX0VfQ09ZT1RFIiBpbiBjb29raWUpCgogICAgICAgICMKICAgICAgICAjIFRoZSB1c2VyIGFnZW50IG1ha2VzIGEgc2VyaWVzIG9mIHJlcXVlc3RzIG9uIHRoZSBvcmlnaW4gc2VydmVyLCBhZnRlcgogICAgICAgICMgZWFjaCBvZiB3aGljaCBpdCByZWNlaXZlcyBhIG5ldyBjb29raWUuICBBbGwgdGhlIGNvb2tpZXMgaGF2ZSB0aGUgc2FtZQogICAgICAgICMgUGF0aCBhdHRyaWJ1dGUgYW5kIChkZWZhdWx0KSBkb21haW4uICBCZWNhdXNlIHRoZSByZXF1ZXN0IFVSTHMgYWxsIGhhdmUKICAgICAgICAjIC9hY21lIGFzIGEgcHJlZml4LCBhbmQgdGhhdCBtYXRjaGVzIHRoZSBQYXRoIGF0dHJpYnV0ZSwgZWFjaCByZXF1ZXN0CiAgICAgICAgIyBjb250YWlucyBhbGwgdGhlIGNvb2tpZXMgcmVjZWl2ZWQgc28gZmFyLgoKICAgIGRlZiB0ZXN0X2lldGZfZXhhbXBsZV8yKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKCiAgICAgICAgIyA1LjIgIEV4YW1wbGUgMgogICAgICAgICMKICAgICAgICAjIFRoaXMgZXhhbXBsZSBpbGx1c3RyYXRlcyB0aGUgZWZmZWN0IG9mIHRoZSBQYXRoIGF0dHJpYnV0ZS4gIEFsbCBkZXRhaWwKICAgICAgICAjIG9mIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGhlYWRlcnMgaGFzIGJlZW4gb21pdHRlZC4gIEFzc3VtZSB0aGUgdXNlciBhZ2VudAogICAgICAgICMgaGFzIG5vIHN0b3JlZCBjb29raWVzLgoKICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKCiAgICAgICAgIyBJbWFnaW5lIHRoZSB1c2VyIGFnZW50IGhhcyByZWNlaXZlZCwgaW4gcmVzcG9uc2UgdG8gZWFybGllciByZXF1ZXN0cywKICAgICAgICAjIHRoZSByZXNwb25zZSBoZWFkZXJzCiAgICAgICAgIwogICAgICAgICMgU2V0LUNvb2tpZTI6IFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7IFZlcnNpb249IjEiOwogICAgICAgICMgICAgICAgICBQYXRoPSIvYWNtZSIKICAgICAgICAjCiAgICAgICAgIyBhbmQKICAgICAgICAjCiAgICAgICAgIyBTZXQtQ29va2llMjogUGFydF9OdW1iZXI9IlJpZGluZ19Sb2NrZXRfMDAyMyI7IFZlcnNpb249IjEiOwogICAgICAgICMgICAgICAgICBQYXRoPSIvYWNtZS9hbW1vIgoKICAgICAgICBpbnRlcmFjdF8yOTY1KAogICAgICAgICAgICBjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL2FtbW8vc3BlY2lmaWMiLAogICAgICAgICAgICAnUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicsCiAgICAgICAgICAgICdQYXJ0X051bWJlcj0iUmlkaW5nX1JvY2tldF8wMDIzIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lL2FtbW8iJykKCiAgICAgICAgIyBBIHN1YnNlcXVlbnQgcmVxdWVzdCBieSB0aGUgdXNlciBhZ2VudCB0byB0aGUgKHNhbWUpIHNlcnZlciBmb3IgVVJMcyBvZgogICAgICAgICMgdGhlIGZvcm0gL2FjbWUvYW1tby8uLi4gIHdvdWxkIGluY2x1ZGUgdGhlIGZvbGxvd2luZyByZXF1ZXN0IGhlYWRlcjoKICAgICAgICAjCiAgICAgICAgIyBDb29raWU6ICRWZXJzaW9uPSIxIjsKICAgICAgICAjICAgICAgICAgUGFydF9OdW1iZXI9IlJpZGluZ19Sb2NrZXRfMDAyMyI7ICRQYXRoPSIvYWNtZS9hbW1vIjsKICAgICAgICAjICAgICAgICAgUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgJFBhdGg9Ii9hY21lIgogICAgICAgICMKICAgICAgICAjIE5vdGUgdGhhdCB0aGUgTkFNRT1WQUxVRSBwYWlyIGZvciB0aGUgY29va2llIHdpdGggdGhlIG1vcmUgc3BlY2lmaWMgUGF0aAogICAgICAgICMgYXR0cmlidXRlLCAvYWNtZS9hbW1vLCBjb21lcyBiZWZvcmUgdGhlIG9uZSB3aXRoIHRoZSBsZXNzIHNwZWNpZmljIFBhdGgKICAgICAgICAjIGF0dHJpYnV0ZSwgL2FjbWUuICBGdXJ0aGVyIG5vdGUgdGhhdCB0aGUgc2FtZSBjb29raWUgbmFtZSBhcHBlYXJzIG1vcmUKICAgICAgICAjIHRoYW4gb25jZS4KCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL2FtbW8vLi4uIikKICAgICAgICBzZWxmLmFzc2VydF8oCiAgICAgICAgICAgIHJlLnNlYXJjaChyIlJpZGluZ19Sb2NrZXRfMDAyMy4qUm9ja2V0X0xhdW5jaGVyXzAwMDEiLCBjb29raWUpKQoKICAgICAgICAjIEEgc3Vic2VxdWVudCByZXF1ZXN0IGJ5IHRoZSB1c2VyIGFnZW50IHRvIHRoZSAoc2FtZSkgc2VydmVyIGZvciBhIFVSTCBvZgogICAgICAgICMgdGhlIGZvcm0gL2FjbWUvcGFydHMvIHdvdWxkIGluY2x1ZGUgdGhlIGZvbGxvd2luZyByZXF1ZXN0IGhlYWRlcjoKICAgICAgICAjCiAgICAgICAgIyBDb29raWU6ICRWZXJzaW9uPSIxIjsgUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgJFBhdGg9Ii9hY21lIgogICAgICAgICMKICAgICAgICAjIEhlcmUsIHRoZSBzZWNvbmQgY29va2llJ3MgUGF0aCBhdHRyaWJ1dGUgL2FjbWUvYW1tbyBpcyBub3QgYSBwcmVmaXggb2YKICAgICAgICAjIHRoZSByZXF1ZXN0IFVSTCwgL2FjbWUvcGFydHMvLCBzbyB0aGUgY29va2llIGRvZXMgbm90IGdldCBmb3J3YXJkZWQgdG8KICAgICAgICAjIHRoZSBzZXJ2ZXIuCgogICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9wYXJ0cy8iKQogICAgICAgIHNlbGYuYXNzZXJ0XygiUm9ja2V0X0xhdW5jaGVyXzAwMDEiIGluIGNvb2tpZSBhbmQKICAgICAgICAgICAgICAgICAgICAgIlJpZGluZ19Sb2NrZXRfMDAyMyIgbm90IGluIGNvb2tpZSkKCiAgICBkZWYgdGVzdF9yZWplY3Rpb24oc2VsZik6CiAgICAgICAgIyBUZXN0IHJlamVjdGlvbiBvZiBTZXQtQ29va2llMiByZXNwb25zZXMgYmFzZWQgb24gZG9tYWluLCBwYXRoLCBwb3J0LgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBEZWZhdWx0Q29va2llUG9saWN5LCBMV1BDb29raWVKYXIKCiAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCgogICAgICAgIGMgPSBMV1BDb29raWVKYXIocG9saWN5PXBvbCkKCiAgICAgICAgbWF4X2FnZSA9ICJtYXgtYWdlPTM2MDAiCgogICAgICAgICMgaWxsZWdhbCBkb21haW4gKG5vIGVtYmVkZGVkIGRvdHMpCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vPWJhcjsgZG9tYWluPSIuY29tIjsgdmVyc2lvbj0xJykKICAgICAgICBzZWxmLmFzc2VydF8obm90IGMpCgogICAgICAgICMgbGVnYWwgZG9tYWluCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGluZz1wb25nOyBkb21haW49ImFjbWUuY29tIjsgdmVyc2lvbj0xJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCgogICAgICAgICMgaWxsZWdhbCBkb21haW4gKGhvc3QgcHJlZml4ICJ3d3cuYSIgY29udGFpbnMgYSBkb3QpCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hLmFjbWUuY29tIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGl6PWJhbmc7IGRvbWFpbj0iYWNtZS5jb20iOyB2ZXJzaW9uPTEnKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKCiAgICAgICAgIyBsZWdhbCBkb21haW4KICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmEuYWNtZS5jb20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dvdz1mbHV0dGVyOyBkb21haW49Ii5hLmFjbWUuY29tIjsgdmVyc2lvbj0xJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCgogICAgICAgICMgY2FuJ3QgcGFydGlhbGx5IG1hdGNoIGFuIElQLWFkZHJlc3MKICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vMTI1LjEyNS4xMjUuMTI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6enp6PXBpbmc7IGRvbWFpbj0iMTI1LjEyNS4xMjUiOyB2ZXJzaW9uPTEnKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKCiAgICAgICAgIyBpbGxlZ2FsIHBhdGggKG11c3QgYmUgcHJlZml4IG9mIHJlcXVlc3QgcGF0aCkKICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LnNvbC5ubyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmxhaD1yaHViYXJiOyBkb21haW49Ii5zb2wubm8iOyBwYXRoPSIvZm9vIjsgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb249MScpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQoKICAgICAgICAjIGxlZ2FsIHBhdGgKICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LnNvbC5uby9mb28vYmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiaW5nPWJvbmc7IGRvbWFpbj0iLnNvbC5ubyI7IHBhdGg9Ii9mb28iOyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbj0xJykKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDMpCgogICAgICAgICMgaWxsZWdhbCBwb3J0IChyZXF1ZXN0LXBvcnQgbm90IGluIGxpc3QpCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doaXo9ZmZmdDsgZG9tYWluPSIuc29sLm5vIjsgcG9ydD0iOTAsMTAwIjsgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb249MScpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAzKQoKICAgICAgICAjIGxlZ2FsIHBvcnQKICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KAogICAgICAgICAgICBjLCAiaHR0cDovL3d3dy5zb2wubm8iLAogICAgICAgICAgICByJ2Jhbmc9d2FsbG9wOyB2ZXJzaW9uPTE7IGRvbWFpbj0iLnNvbC5ubyI7ICcKICAgICAgICAgICAgcidwb3J0PSI5MCwxMDAsIDgwLDgwODAiOyAnCiAgICAgICAgICAgIHInbWF4LWFnZT0xMDA7IENvbW1lbnQgPSAiSnVzdCBraWRkaW5nISAoXCJ8XFxcXCkgIicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCA0KQoKICAgICAgICAjIHBvcnQgYXR0cmlidXRlIHdpdGhvdXQgYW55IHZhbHVlIChjdXJyZW50IHBvcnQpCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvbzk9YmFyOyB2ZXJzaW9uPTE7IGRvbWFpbj0iLnNvbC5ubyI7IHBvcnQ7ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXgtYWdlPTEwMDsnKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgNSkKCiAgICAgICAgIyBlbmNvZGVkIHBhdGgKICAgICAgICAjIExXUCBoYXMgdGhpcyB0ZXN0LCBidXQgdW5lc2NhcGluZyBhbGxvd2VkIHBhdGggY2hhcmFjdGVycyBzZWVtcwogICAgICAgICMgbGlrZSBhIGJhZCBpZGVhLCBzbyBJIHRoaW5rIHRoaXMgc2hvdWxkIGZhaWw6CiMjICAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8vZm9vLyIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgcidmb284PWJhcjsgdmVyc2lvbj0xOyBwYXRoPSIvJTY2b28iJykKICAgICAgICAjIGJ1dCB0aGlzIGlzIE9LLCBiZWNhdXNlICc8JyBpcyBub3QgYW4gYWxsb3dlZCBIVFRQIFVSTCBwYXRoCiAgICAgICAgIyBjaGFyYWN0ZXI6CiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8vPG9vLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ2Zvbzg9YmFyOyB2ZXJzaW9uPTE7IHBhdGg9Ii8lM2NvbyInKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgNikKCiAgICAgICAgIyBzYXZlIGFuZCByZXN0b3JlCiAgICAgICAgZmlsZW5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCgogICAgICAgIHRyeToKICAgICAgICAgICAgYy5zYXZlKGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZD1UcnVlKQogICAgICAgICAgICBvbGQgPSByZXByKGMpCgogICAgICAgICAgICBjID0gTFdQQ29va2llSmFyKHBvbGljeT1wb2wpCiAgICAgICAgICAgIGMubG9hZChmaWxlbmFtZSwgaWdub3JlX2Rpc2NhcmQ9VHJ1ZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICB0cnk6IG9zLnVubGluayhmaWxlbmFtZSkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6IHBhc3MKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2xkLCByZXByKGMpKQoKICAgIGRlZiB0ZXN0X3VybF9lbmNvZGluZyhzZWxmKToKICAgICAgICAjIFRyeSBzb21lIFVSTCBlbmNvZGluZ3Mgb2YgdGhlIFBBVEhzLgogICAgICAgICMgKHRoZSBiZWhhdmlvdXIgaGVyZSBoYXMgY2hhbmdlZCBmcm9tIGxpYnd3dy1wZXJsKQogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKCiAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9mb28lMmYlMjUvJTNjJTNjJTBBbmV3JUU1LyVFNSIsCiAgICAgICAgICAgICAgICAgICAgICAiZm9vICA9ICAgYmFyOyB2ZXJzaW9uICAgID0gICAxIikKCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NSgKICAgICAgICAgICAgYywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vJTJmJTI1Lzw8JTBhbmV35S/m+OUiLAogICAgICAgICAgICAnYmFyPWJhejsgcGF0aD0iL2Zvby8iOyB2ZXJzaW9uPTEnKTsKICAgICAgICB2ZXJzaW9uX3JlID0gcmUuY29tcGlsZShyJ15cJHZlcnNpb249XCI/MVwiPycsIHJlLkkpCiAgICAgICAgc2VsZi5hc3NlcnRfKCJmb289YmFyIiBpbiBjb29raWUgYW5kIHZlcnNpb25fcmUuc2VhcmNoKGNvb2tpZSkpCgogICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoCiAgICAgICAgICAgIGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2Zvby8lMjUvPDwlMGFuZXflL+b45SIpCiAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjb29raWUpCgogICAgICAgICMgdW5pY29kZSBVUkwgZG9lc24ndCByYWlzZSBleGNlcHRpb24KICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsIHUiaHR0cDovL3d3dy5hY21lLmNvbS9ceGZjIikKCiAgICBkZWYgdGVzdF9tb3ppbGxhKHNlbGYpOgogICAgICAgICMgU2F2ZSAvIGxvYWQgTW96aWxsYS9OZXRzY2FwZSBjb29raWUgZmlsZSBmb3JtYXQuCiAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IE1vemlsbGFDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKCiAgICAgICAgeWVhcl9wbHVzX29uZSA9IHRpbWUubG9jYWx0aW1lKClbMF0gKyAxCgogICAgICAgIGZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgoKICAgICAgICBjID0gTW96aWxsYUNvb2tpZUphcihmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3k9RGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQogICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwKICAgICAgICAgICAgICAgICAgICAgICJmb28xPWJhcjsgbWF4LWFnZT0xMDA7IFZlcnNpb249MSIpCiAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLAogICAgICAgICAgICAgICAgICAgICAgJ2ZvbzI9YmFyOyBwb3J0PSI4MCI7IG1heC1hZ2U9MTAwOyBEaXNjYXJkOyBWZXJzaW9uPTEnKQogICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgImZvbzM9YmFyOyBzZWN1cmU7IFZlcnNpb249MSIpCgogICAgICAgIGV4cGlyZXMgPSAiZXhwaXJlcz0wOS1Ob3YtJWQgMjM6MTI6NDAgR01UIiAlICh5ZWFyX3BsdXNfb25lLCkKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5mb28uY29tLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2E9YmFyOyAlcyIgJSBleHBpcmVzKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmZvby5jb20vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vYj1iYXI7IERvbWFpbj0uZm9vLmNvbTsgJXMiICUgZXhwaXJlcykKICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5mb28uY29tLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2M9YmFyOyBEb21haW49d3d3LmZvby5jb207ICVzIiAlIGV4cGlyZXMpCgogICAgICAgIGRlZiBzYXZlX2FuZF9yZXN0b3JlKGNqLCBpZ25vcmVfZGlzY2FyZCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNqLnNhdmUoaWdub3JlX2Rpc2NhcmQ9aWdub3JlX2Rpc2NhcmQpCiAgICAgICAgICAgICAgICBuZXdfYyA9IE1vemlsbGFDb29raWVKYXIoZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQogICAgICAgICAgICAgICAgbmV3X2MubG9hZChpZ25vcmVfZGlzY2FyZD1pZ25vcmVfZGlzY2FyZCkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHRyeTogb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6IHBhc3MKICAgICAgICAgICAgcmV0dXJuIG5ld19jCgogICAgICAgIG5ld19jID0gc2F2ZV9hbmRfcmVzdG9yZShjLCBUcnVlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihuZXdfYyksIDYpICAjIG5vbmUgZGlzY2FyZGVkCiAgICAgICAgc2VsZi5hc3NlcnRfKCJuYW1lPSdmb28xJywgdmFsdWU9J2JhciciIGluIHJlcHIobmV3X2MpKQoKICAgICAgICBuZXdfYyA9IHNhdmVfYW5kX3Jlc3RvcmUoYywgRmFsc2UpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKG5ld19jKSwgNCkgICMgMiBvZiB0aGVtIGRpc2NhcmRlZCBvbiBzYXZlCiAgICAgICAgc2VsZi5hc3NlcnRfKCJuYW1lPSdmb28xJywgdmFsdWU9J2JhciciIGluIHJlcHIobmV3X2MpKQoKICAgIGRlZiB0ZXN0X25ldHNjYXBlX21pc2Moc2VsZik6CiAgICAgICAgIyBTb21lIGFkZGl0aW9uYWwgTmV0c2NhcGUgY29va2llcyB0ZXN0cy4KICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyCiAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CgogICAgICAgIGMgPSBDb29raWVKYXIoKQogICAgICAgIGhlYWRlcnMgPSBbXQogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9mb28uYmFyLmFjbWUuY29tL2ZvbyIpCgogICAgICAgICMgTmV0c2NhcGUgYWxsb3dzIGEgaG9zdCBwYXJ0IHRoYXQgY29udGFpbnMgZG90cwogICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBDdXN0b21lcj1XSUxFX0VfQ09ZT1RFOyBkb21haW49LmFjbWUuY29tIikKICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vIikKICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKCiAgICAgICAgIyBhbmQgdGhhdCB0aGUgZG9tYWluIGlzIHRoZSBzYW1lIGFzIHRoZSBob3N0IHdpdGhvdXQgYWRkaW5nIGEgbGVhZGluZwogICAgICAgICMgZG90IHRvIHRoZSBkb21haW4uICBTaG91bGQgbm90IHF1b3RlIGV2ZW4gaWYgc3RyYW5nZSBjaGFycyBhcmUgdXNlZAogICAgICAgICMgaW4gdGhlIGNvb2tpZSB2YWx1ZS4KICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9Myw0OyBkb21haW49Zm9vLmJhci5hY21lLmNvbSIpCiAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tL2ZvbyIpCiAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCgogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9mb28uYmFyLmFjbWUuY29tL2ZvbyIpCiAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCiAgICAgICAgc2VsZi5hc3NlcnRfKAogICAgICAgICAgICAiUEFSVF9OVU1CRVI9Myw0IiBpbiByZXEuZ2V0X2hlYWRlcigiQ29va2llIikgYW5kCiAgICAgICAgICAgICJDdXN0b21lcj1XSUxFX0VfQ09ZT1RFIiBpbiByZXEuZ2V0X2hlYWRlcigiQ29va2llIikpCgogICAgZGVmIHRlc3RfaW50cmFuZXRfZG9tYWluc18yOTY1KHNlbGYpOgogICAgICAgICMgVGVzdCBoYW5kbGluZyBvZiBsb2NhbCBpbnRyYW5ldCBob3N0bmFtZXMgd2l0aG91dCBhIGRvdC4KICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CgogICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQogICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9leGFtcGxlLyIsCiAgICAgICAgICAgICAgICAgICAgICAiZm9vMT1iYXI7IFBPUlQ7IERpc2NhcmQ7IFZlcnNpb249MTsiKQogICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9leGFtcGxlLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vMj1iYXI7IGRvbWFpbj0iLmxvY2FsIjsgVmVyc2lvbj0xJykKICAgICAgICBzZWxmLmFzc2VydF8oImZvbzE9YmFyIiBpbiBjb29raWUpCgogICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9leGFtcGxlLyIsICdmb28zPWJhcjsgVmVyc2lvbj0xJykKICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZXhhbXBsZS8iKQogICAgICAgIHNlbGYuYXNzZXJ0XygiZm9vMj1iYXIiIGluIGNvb2tpZSBhbmQgbGVuKGMpID09IDMpCgogICAgZGVmIHRlc3RfaW50cmFuZXRfZG9tYWluc19ucyhzZWxmKToKICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CgogICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1ID0gRmFsc2UpKQogICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZXhhbXBsZS8iLCAiZm9vMT1iYXIiKQogICAgICAgIGNvb2tpZSA9IGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZXhhbXBsZS8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb28yPWJhcjsgZG9tYWluPS5sb2NhbCcpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQogICAgICAgIHNlbGYuYXNzZXJ0XygiZm9vMT1iYXIiIGluIGNvb2tpZSkKCiAgICAgICAgY29va2llID0gaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9leGFtcGxlLyIpCiAgICAgICAgc2VsZi5hc3NlcnRfKCJmb28yPWJhciIgaW4gY29va2llKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKCiAgICBkZWYgdGVzdF9lbXB0eV9wYXRoKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKCiAgICAgICAgIyBUZXN0IGZvciBlbXB0eSBwYXRoCiAgICAgICAgIyBCcm9rZW4gd2ViLXNlcnZlciBPUklPTi8xLjMuMzggcmV0dXJucyB0byB0aGUgY2xpZW50IHJlc3BvbnNlIGxpa2UKICAgICAgICAjCiAgICAgICAgIyAgICAgICBTZXQtQ29va2llOiBKU0VTU0lPTklEPUFCQ0RFUkFORE9NMTIzOyBQYXRoPQogICAgICAgICMKICAgICAgICAjIGllLiB3aXRoIFBhdGggc2V0IHRvIG5vdGhpbmcuCiAgICAgICAgIyBJbiB0aGlzIGNhc2UsIGV4dHJhY3RfY29va2llcygpIG11c3Qgc2V0IGNvb2tpZSB0byAvIChyb290KQogICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1ID0gVHJ1ZSkpCiAgICAgICAgaGVhZGVycyA9IFtdCgogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYW50cy5jb20vIikKICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogSlNFU1NJT05JRD1BQkNERVJBTkRPTTEyMzsgUGF0aD0iKQogICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hbnRzLmNvbS8iKQogICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQoKICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFudHMuY29tLyIpCiAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiSlNFU1NJT05JRD1BQkNERVJBTkRPTTEyMyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxLmdldF9oZWFkZXIoIkNvb2tpZTIiKSwgJyRWZXJzaW9uPSIxIicpCgogICAgICAgICMgbWlzc2luZyBwYXRoIGluIHRoZSByZXF1ZXN0IFVSSQogICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYW50cy5jb206ODA4MCIpCiAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiSlNFU1NJT05JRD1BQkNERVJBTkRPTTEyMyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxLmdldF9oZWFkZXIoIkNvb2tpZTIiKSwgJyRWZXJzaW9uPSIxIicpCgogICAgZGVmIHRlc3Rfc2Vzc2lvbl9jb29raWVzKHNlbGYpOgogICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIKICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKCiAgICAgICAgeWVhcl9wbHVzX29uZSA9IHRpbWUubG9jYWx0aW1lKClbMF0gKyAxCgogICAgICAgICMgQ2hlY2sgc2Vzc2lvbiBjb29raWVzIGFyZSBkZWxldGVkIHByb3Blcmx5IGJ5CiAgICAgICAgIyBDb29raWVKYXIuY2xlYXJfc2Vzc2lvbl9jb29raWVzIG1ldGhvZAoKICAgICAgICByZXEgPSBSZXF1ZXN0KCdodHRwOi8vd3d3LnBlcmxtZWlzdGVyLmNvbS9zY3JpcHRzJykKICAgICAgICBoZWFkZXJzID0gW10KICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogczE9c2Vzc2lvbjtQYXRoPS9zY3JpcHRzIikKICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogcDE9cGVybTsgRG9tYWluPS5wZXJsbWVpc3Rlci5jb207IgogICAgICAgICAgICAgICAgICAgICAgICJQYXRoPS87ZXhwaXJlcz1GcmksIDAyLUZlYi0lZCAyMzoyNDoyMCBHTVQiICUKICAgICAgICAgICAgICAgICAgICAgICB5ZWFyX3BsdXNfb25lKQogICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBwMj1wZXJtO1BhdGg9LztleHBpcmVzPUZyaSwgIgogICAgICAgICAgICAgICAgICAgICAgICIwMi1GZWItJWQgMjM6MjQ6MjAgR01UIiAlIHllYXJfcGx1c19vbmUpCiAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IHMyPXNlc3Npb247UGF0aD0vc2NyaXB0czsiCiAgICAgICAgICAgICAgICAgICAgICAgIkRvbWFpbj0ucGVybG1laXN0ZXIuY29tIikKICAgICAgICBoZWFkZXJzLmFwcGVuZCgnU2V0LUNvb2tpZTI6IHMzPXNlc3Npb247VmVyc2lvbj0xO0Rpc2NhcmQ7UGF0aD0iLyInKQogICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAnaHR0cDovL3d3dy5wZXJsbWVpc3Rlci5jb20vc2NyaXB0cycpCgogICAgICAgIGMgPSBDb29raWVKYXIoKQogICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQogICAgICAgICMgSG93IG1hbnkgc2Vzc2lvbi9wZXJtYW5lbnQgY29va2llcyBkbyB3ZSBoYXZlPwogICAgICAgIGNvdW50ZXIgPSB7InNlc3Npb25fYWZ0ZXIiOiAwLAogICAgICAgICAgICAgICAgICAgInBlcm1fYWZ0ZXIiOiAwLAogICAgICAgICAgICAgICAgICAgInNlc3Npb25fYmVmb3JlIjogMCwKICAgICAgICAgICAgICAgICAgICJwZXJtX2JlZm9yZSI6IDB9CiAgICAgICAgZm9yIGNvb2tpZSBpbiBjOgogICAgICAgICAgICBrZXkgPSAiJXNfYmVmb3JlIiAlIGNvb2tpZS52YWx1ZQogICAgICAgICAgICBjb3VudGVyW2tleV0gPSBjb3VudGVyW2tleV0gKyAxCiAgICAgICAgYy5jbGVhcl9zZXNzaW9uX2Nvb2tpZXMoKQogICAgICAgICMgSG93IG1hbnkgbm93PwogICAgICAgIGZvciBjb29raWUgaW4gYzoKICAgICAgICAgICAga2V5ID0gIiVzX2FmdGVyIiAlIGNvb2tpZS52YWx1ZQogICAgICAgICAgICBjb3VudGVyW2tleV0gPSBjb3VudGVyW2tleV0gKyAxCgogICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKAogICAgICAgICAgICAjIGEgcGVybWFuZW50IGNvb2tpZSBnb3QgbG9zdCBhY2NpZGVudGx5CiAgICAgICAgICAgIGNvdW50ZXJbInBlcm1fYWZ0ZXIiXSAhPSBjb3VudGVyWyJwZXJtX2JlZm9yZSJdIG9yCiAgICAgICAgICAgICMgYSBzZXNzaW9uIGNvb2tpZSBoYXNuJ3QgYmVlbiBjbGVhcmVkCiAgICAgICAgICAgIGNvdW50ZXJbInNlc3Npb25fYWZ0ZXIiXSAhPSAwIG9yCiAgICAgICAgICAgICMgd2UgZGlkbid0IGhhdmUgc2Vzc2lvbiBjb29raWVzIGluIHRoZSBmaXJzdCBwbGFjZQogICAgICAgICAgICBjb3VudGVyWyJzZXNzaW9uX2JlZm9yZSJdID09IDApKQoKCmRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zZXRzCiAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAogICAgICAgIERhdGVUaW1lVGVzdHMsCiAgICAgICAgSGVhZGVyVGVzdHMsCiAgICAgICAgQ29va2llVGVzdHMsCiAgICAgICAgRmlsZUNvb2tpZUphclRlc3RzLAogICAgICAgIExXUENvb2tpZVRlc3RzLAogICAgICAgICkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQo=