ZGlmZiAtLWdpdCBhL0xpYi90YXJmaWxlLnB5IGIvTGliL3RhcmZpbGUucHkKaW5kZXggNGY0YTFkOS4uMTA3MDQxZSAxMDA2NDQKLS0tIGEvTGliL3RhcmZpbGUucHkKKysrIGIvTGliL3RhcmZpbGUucHkKQEAgLTEyNSw2ICsxMjUsMTcgQEAKIFBBWF9GSUVMRFMgPSAoInBhdGgiLCAibGlua3BhdGgiLCAic2l6ZSIsICJtdGltZSIsCiAgICAgICAgICAgICAgICJ1aWQiLCAiZ2lkIiwgInVuYW1lIiwgImduYW1lIikKIAorIyBGaWVsZHMgaW4gYSBwYXggaGVhZGVyIHRoYXQgYXJlIG51bWJlcnMsIGFsbCBvdGhlciBmaWVsZHMKKyMgYXJlIHRyZWF0ZWQgYXMgc3RyaW5ncy4KK1BBWF9OVU1CRVJfRklFTERTID0geworICAgICJhdGltZSI6IGZsb2F0LAorICAgICJjdGltZSI6IGZsb2F0LAorICAgICJtdGltZSI6IGZsb2F0LAorICAgICJ1aWQiOiBpbnQsCisgICAgImdpZCI6IGludCwKKyAgICAic2l6ZSI6IGludAorfQorCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEJpdHMgdXNlZCBpbiB0aGUgbW9kZSBmaWVsZCwgdmFsdWVzIGluIG9jdGFsLgogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTU0LDcgKzE2NSw3IEBACiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBFTkNPRElORyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQogaWYgRU5DT0RJTkcgaXMgTm9uZToKLSAgICBFTkNPRElORyA9ICJhc2NpaSIKKyAgICBFTkNPRElORyA9IHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKQogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFNvbWUgdXNlZnVsIGZ1bmN0aW9ucwpAQCAtMjE4LDYgKzIyOSwyNiBAQAogICAgICAgICBzID0gY2hyKDAyMDApICsgcwogICAgIHJldHVybiBzCiAKK2RlZiB1dHMocywgZW5jb2RpbmcsIGVycm9ycyk6CisgICAgIiIiQ29udmVydCBhIHVuaWNvZGUgb2JqZWN0IHRvIGEgc3RyaW5nLgorICAgICIiIgorICAgIGlmIGVycm9ycyA9PSAidXRmLTgiOgorICAgICAgICAjIEFuIGV4dHJhIGVycm9yIGhhbmRsZXIgc2ltaWxhciB0byB0aGUgLW8gaW52YWxpZD1VVEYtOCBvcHRpb24KKyAgICAgICAgIyBpbiBQT1NJWC4xLTIwMDEuIFJlcGxhY2UgdW50cmFuc2xhdGFibGUgY2hhcmFjdGVycyB3aXRoIHRoZWlyCisgICAgICAgICMgVVRGLTggcmVwcmVzZW50YXRpb24uCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzLmVuY29kZShlbmNvZGluZywgInN0cmljdCIpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgICAgICB4ID0gW10KKyAgICAgICAgICAgIGZvciBjIGluIHM6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB4LmFwcGVuZChjLmVuY29kZShlbmNvZGluZywgInN0cmljdCIpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHguYXBwZW5kKGMuZW5jb2RlKCJ1dGY4IikpCisgICAgICAgICAgICByZXR1cm4gIiIuam9pbih4KQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBzLmVuY29kZShlbmNvZGluZywgZXJyb3JzKQorCiBkZWYgY2FsY19jaGtzdW1zKGJ1Zik6CiAgICAgIiIiQ2FsY3VsYXRlIHRoZSBjaGVja3N1bSBmb3IgYSBtZW1iZXIncyBoZWFkZXIgYnkgc3VtbWluZyB1cCBhbGwKICAgICAgICBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgdGhlIGNoa3N1bSBmaWVsZCB3aGljaCBpcyB0cmVhdGVkIGFzIGlmCkBAIC05MjIsNyArOTUzLDcgQEAKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHJldHVybiAiPCVzICVyIGF0ICUjeD4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLHNlbGYubmFtZSxpZChzZWxmKSkKIAotICAgIGRlZiBnZXRfaW5mbyhzZWxmKToKKyAgICBkZWYgZ2V0X2luZm8oc2VsZiwgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAgICAgICIiIlJldHVybiB0aGUgVGFySW5mbydzIGF0dHJpYnV0ZXMgYXMgYSBkaWN0aW9uYXJ5LgogICAgICAgICAiIiIKICAgICAgICAgaW5mbyA9IHsKQEAgLTk0NCwyNCArOTc1LDI5IEBACiAgICAgICAgIGlmIGluZm9bInR5cGUiXSA9PSBESVJUWVBFIGFuZCBub3QgaW5mb1sibmFtZSJdLmVuZHN3aXRoKCIvIik6CiAgICAgICAgICAgICBpbmZvWyJuYW1lIl0gKz0gIi8iCiAKKyAgICAgICAgZm9yIGtleSBpbiAoIm5hbWUiLCAibGlua25hbWUiLCAidW5hbWUiLCAiZ25hbWUiKToKKyAgICAgICAgICAgIGlmIHR5cGUoaW5mb1trZXldKSBpcyB1bmljb2RlOgorICAgICAgICAgICAgICAgIGluZm9ba2V5XSA9IGluZm9ba2V5XS5lbmNvZGUoZW5jb2RpbmcsIGVycm9ycykKKwogICAgICAgICByZXR1cm4gaW5mbwogCi0gICAgZGVmIHRvYnVmKHNlbGYsIGZvcm1hdD1ERUZBVUxUX0ZPUk1BVCwgZW5jb2Rpbmc9RU5DT0RJTkcpOgorICAgIGRlZiB0b2J1ZihzZWxmLCBmb3JtYXQ9REVGQVVMVF9GT1JNQVQsIGVuY29kaW5nPUVOQ09ESU5HLCBlcnJvcnM9InN0cmljdCIpOgogICAgICAgICAiIiJSZXR1cm4gYSB0YXIgaGVhZGVyIGFzIGEgc3RyaW5nIG9mIDUxMiBieXRlIGJsb2Nrcy4KICAgICAgICAgIiIiCisgICAgICAgIGluZm8gPSBzZWxmLmdldF9pbmZvKGVuY29kaW5nLCBlcnJvcnMpCisKICAgICAgICAgaWYgZm9ybWF0ID09IFVTVEFSX0ZPUk1BVDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV91c3Rhcl9oZWFkZXIoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX3VzdGFyX2hlYWRlcihpbmZvKQogICAgICAgICBlbGlmIGZvcm1hdCA9PSBHTlVfRk9STUFUOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX2dudV9oZWFkZXIoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX2dudV9oZWFkZXIoaW5mbykKICAgICAgICAgZWxpZiBmb3JtYXQgPT0gUEFYX0ZPUk1BVDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV9wYXhfaGVhZGVyKGVuY29kaW5nKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX3BheF9oZWFkZXIoaW5mbywgZW5jb2RpbmcsIGVycm9ycykKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgZm9ybWF0IikKIAotICAgIGRlZiBjcmVhdGVfdXN0YXJfaGVhZGVyKHNlbGYpOgorICAgIGRlZiBjcmVhdGVfdXN0YXJfaGVhZGVyKHNlbGYsIGluZm8pOgogICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIHVzdGFyIGhlYWRlciBibG9jay4KICAgICAgICAgIiIiCi0gICAgICAgIGluZm8gPSBzZWxmLmdldF9pbmZvKCkKICAgICAgICAgaW5mb1sibWFnaWMiXSA9IFBPU0lYX01BR0lDCiAKICAgICAgICAgaWYgbGVuKGluZm9bImxpbmtuYW1lIl0pID4gTEVOR1RIX0xJTks6CkBAIC05NzIsMTAgKzEwMDgsOSBAQAogCiAgICAgICAgIHJldHVybiBzZWxmLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCkKIAotICAgIGRlZiBjcmVhdGVfZ251X2hlYWRlcihzZWxmKToKKyAgICBkZWYgY3JlYXRlX2dudV9oZWFkZXIoc2VsZiwgaW5mbyk6CiAgICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgR05VIGhlYWRlciBibG9jayBzZXF1ZW5jZS4KICAgICAgICAgIiIiCi0gICAgICAgIGluZm8gPSBzZWxmLmdldF9pbmZvKCkKICAgICAgICAgaW5mb1sibWFnaWMiXSA9IEdOVV9NQUdJQwogCiAgICAgICAgIGJ1ZiA9ICIiCkBAIC05ODcsMTIgKzEwMjIsMTEgQEAKIAogICAgICAgICByZXR1cm4gYnVmICsgc2VsZi5fY3JlYXRlX2hlYWRlcihpbmZvLCBHTlVfRk9STUFUKQogCi0gICAgZGVmIGNyZWF0ZV9wYXhfaGVhZGVyKHNlbGYsIGVuY29kaW5nKToKKyAgICBkZWYgY3JlYXRlX3BheF9oZWFkZXIoc2VsZiwgaW5mbywgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgdXN0YXIgaGVhZGVyIGJsb2NrLiBJZiBpdCBjYW5ub3QgYmUKICAgICAgICAgICAgcmVwcmVzZW50ZWQgdGhpcyB3YXksIHByZXBlbmQgYSBwYXggZXh0ZW5kZWQgaGVhZGVyIHNlcXVlbmNlCiAgICAgICAgICAgIHdpdGggc3VwcGxlbWVudCBpbmZvcm1hdGlvbi4KICAgICAgICAgIiIiCi0gICAgICAgIGluZm8gPSBzZWxmLmdldF9pbmZvKCkKICAgICAgICAgaW5mb1sibWFnaWMiXSA9IFBPU0lYX01BR0lDCiAgICAgICAgIHBheF9oZWFkZXJzID0gc2VsZi5wYXhfaGVhZGVycy5jb3B5KCkKIApAQCAtMTAwMiw3ICsxMDM2LDExIEBACiAgICAgICAgICAgICAgICAgKCJuYW1lIiwgInBhdGgiLCBMRU5HVEhfTkFNRSksICgibGlua25hbWUiLCAibGlua3BhdGgiLCBMRU5HVEhfTElOSyksCiAgICAgICAgICAgICAgICAgKCJ1bmFtZSIsICJ1bmFtZSIsIDMyKSwgKCJnbmFtZSIsICJnbmFtZSIsIDMyKSk6CiAKLSAgICAgICAgICAgIHZhbCA9IGluZm9bbmFtZV0uZGVjb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgaWYgaG5hbWUgaW4gcGF4X2hlYWRlcnM6CisgICAgICAgICAgICAgICAgIyBUaGUgcGF4IGhlYWRlciBoYXMgcHJpb3JpdHkuCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgdmFsID0gaW5mb1tuYW1lXS5kZWNvZGUoZW5jb2RpbmcsIGVycm9ycykKIAogICAgICAgICAgICAgIyBUcnkgdG8gZW5jb2RlIHRoZSBzdHJpbmcgYXMgQVNDSUkuCiAgICAgICAgICAgICB0cnk6CkBAIC0xMDExLDI3ICsxMDQ5LDIzIEBACiAgICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbaG5hbWVdID0gdmFsCiAgICAgICAgICAgICAgICAgY29udGludWUKIAotICAgICAgICAgICAgaWYgbGVuKHZhbCkgPiBsZW5ndGg6Ci0gICAgICAgICAgICAgICAgaWYgbmFtZSA9PSAibmFtZSI6Ci0gICAgICAgICAgICAgICAgICAgICMgVHJ5IHRvIHNxdWVlemUgYSBsb25nbmFtZSBpbiB0aGUgcHJlZml4IGFuZCBuYW1lIGZpZWxkcyBhcyBpbgotICAgICAgICAgICAgICAgICAgICAjIHVzdGFyIGZvcm1hdC4KLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1sicHJlZml4Il0sIGluZm9bIm5hbWUiXSA9IHNlbGYuX3Bvc2l4X3NwbGl0X25hbWUoaW5mb1sibmFtZSJdKQotICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW2huYW1lXSA9IHZhbAotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1tobmFtZV0gPSB2YWwKKyAgICAgICAgICAgIGlmIGxlbihpbmZvW25hbWVdKSA+IGxlbmd0aDoKKyAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1tobmFtZV0gPSB2YWwKIAogICAgICAgICAjIFRlc3QgbnVtYmVyIGZpZWxkcyBmb3IgdmFsdWVzIHRoYXQgZXhjZWVkIHRoZSBmaWVsZCBsaW1pdCBvciB2YWx1ZXMKICAgICAgICAgIyB0aGF0IGxpa2UgdG8gYmUgc3RvcmVkIGFzIGZsb2F0LgogICAgICAgICBmb3IgbmFtZSwgZGlnaXRzIGluICgoInVpZCIsIDgpLCAoImdpZCIsIDgpLCAoInNpemUiLCAxMiksICgibXRpbWUiLCAxMikpOgorICAgICAgICAgICAgaWYgbmFtZSBpbiBwYXhfaGVhZGVyczoKKyAgICAgICAgICAgICAgICAjIFRoZSBwYXggaGVhZGVyIGhhcyBwcmlvcml0eS4gQXZvaWQgb3ZlcmZsb3cuCisgICAgICAgICAgICAgICAgaW5mb1tuYW1lXSA9IDAKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCiAgICAgICAgICAgICB2YWwgPSBpbmZvW25hbWVdCiAgICAgICAgICAgICBpZiBub3QgMCA8PSB2YWwgPCA4ICoqIChkaWdpdHMgLSAxKSBvciBpc2luc3RhbmNlKHZhbCwgZmxvYXQpOgogICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW25hbWVdID0gdW5pY29kZSh2YWwpCiAgICAgICAgICAgICAgICAgaW5mb1tuYW1lXSA9IDAKIAorICAgICAgICAjIENyZWF0ZSBhIHBheCBleHRlbmRlZCBoZWFkZXIgaWYgbmVjZXNzYXJ5LgogICAgICAgICBpZiBwYXhfaGVhZGVyczoKICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX2NyZWF0ZV9wYXhfZ2VuZXJpY19oZWFkZXIocGF4X2hlYWRlcnMpCiAgICAgICAgIGVsc2U6CkBAIC0xMDQwLDI2ICsxMDc0LDEwIEBACiAgICAgICAgIHJldHVybiBidWYgKyBzZWxmLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCkKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBjcmVhdGVfcGF4X2dsb2JhbF9oZWFkZXIoY2xzLCBwYXhfaGVhZGVycywgZW5jb2RpbmcpOgorICAgIGRlZiBjcmVhdGVfcGF4X2dsb2JhbF9oZWFkZXIoY2xzLCBwYXhfaGVhZGVycyk6CiAgICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgcGF4IGdsb2JhbCBoZWFkZXIgYmxvY2sgc2VxdWVuY2UuCiAgICAgICAgICIiIgotICAgICAgICBuZXdfaGVhZGVycyA9IHt9Ci0gICAgICAgIGZvciBrZXksIHZhbCBpbiBwYXhfaGVhZGVycy5pdGVyaXRlbXMoKToKLSAgICAgICAgICAgIGtleSA9IGNscy5fdG9fdW5pY29kZShrZXksIGVuY29kaW5nKQotICAgICAgICAgICAgdmFsID0gY2xzLl90b191bmljb2RlKHZhbCwgZW5jb2RpbmcpCi0gICAgICAgICAgICBuZXdfaGVhZGVyc1trZXldID0gdmFsCi0gICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9wYXhfZ2VuZXJpY19oZWFkZXIobmV3X2hlYWRlcnMsIHR5cGU9WEdMVFlQRSkKLQotICAgIEBzdGF0aWNtZXRob2QKLSAgICBkZWYgX3RvX3VuaWNvZGUodmFsdWUsIGVuY29kaW5nKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdW5pY29kZSk6Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWUKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCAoaW50LCBsb25nLCBmbG9hdCkpOgotICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGUodmFsdWUpCi0gICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKToKLSAgICAgICAgICAgIHJldHVybiB1bmljb2RlKHZhbHVlLCBlbmNvZGluZykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuYWJsZSB0byBjb252ZXJ0IHRvIHVuaWNvZGU6ICVyIiAlIHZhbHVlKQorICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGVfcGF4X2dlbmVyaWNfaGVhZGVyKHBheF9oZWFkZXJzLCB0eXBlPVhHTFRZUEUpCiAKICAgICBkZWYgX3Bvc2l4X3NwbGl0X25hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgICIiIlNwbGl0IGEgbmFtZSBsb25nZXIgdGhhbiAxMDAgY2hhcnMgaW50byBhIHByZWZpeApAQCAtMTA5MSw5ICsxMTA5LDkgQEAKICAgICAgICAgICAgICIgICAgICAgICIsICMgY2hlY2tzdW0gZmllbGQKICAgICAgICAgICAgIGluZm8uZ2V0KCJ0eXBlIiwgUkVHVFlQRSksCiAgICAgICAgICAgICBzdG4oaW5mby5nZXQoImxpbmtuYW1lIiwgIiIpLCAxMDApLAotICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJtYWdpYyIsICIiKSwgOCksCi0gICAgICAgICAgICBzdG4oaW5mby5nZXQoInVuYW1lIiwgIiIpLCAzMiksCi0gICAgICAgICAgICBzdG4oaW5mby5nZXQoImduYW1lIiwgIiIpLCAzMiksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoIm1hZ2ljIiwgUE9TSVhfTUFHSUMpLCA4KSwKKyAgICAgICAgICAgIHN0bihpbmZvLmdldCgidW5hbWUiLCAicm9vdCIpLCAzMiksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoImduYW1lIiwgInJvb3QiKSwgMzIpLAogICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJkZXZtYWpvciIsIDApLCA4LCBmb3JtYXQpLAogICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJkZXZtaW5vciIsIDApLCA4LCBmb3JtYXQpLAogICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJwcmVmaXgiLCAiIiksIDE1NSkKQEAgLTEyNTQsMTIgKzEyNzIsOSBAQAogICAgICAgICAgICAgb2Zmc2V0ICs9IHNlbGYuX2Jsb2NrKHNlbGYuc2l6ZSkKICAgICAgICAgdGFyZmlsZS5vZmZzZXQgPSBvZmZzZXQKIAotICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoIHNhdmVkIGV4dGVuZGVkCisgICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IHdpdGggc2F2ZWQgZ2xvYmFsCiAgICAgICAgICMgaGVhZGVyIGluZm9ybWF0aW9uLgotICAgICAgICBmb3Iga2V5d29yZCwgdmFsdWUgaW4gdGFyZmlsZS5wYXhfaGVhZGVycy5pdGVyaXRlbXMoKToKLSAgICAgICAgICAgIGlmIGtleXdvcmQgaW4gUEFYX0ZJRUxEUzoKLSAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleXdvcmQsIHZhbHVlKQotICAgICAgICAgICAgc2VsZi5wYXhfaGVhZGVyc1trZXl3b3JkXSA9IHZhbHVlCisgICAgICAgIHNlbGYuX2FwcGx5X3BheF9pbmZvKHRhcmZpbGUucGF4X2hlYWRlcnMsIHRhcmZpbGUuZW5jb2RpbmcsIHRhcmZpbGUuZXJyb3JzKQogCiAgICAgICAgIHJldHVybiBzZWxmCiAKQEAgLTEyNzAsMTggKzEyODUsMTcgQEAKICAgICAgICAgYnVmID0gdGFyZmlsZS5maWxlb2JqLnJlYWQoc2VsZi5fYmxvY2soc2VsZi5zaXplKSkKIAogICAgICAgICAjIEZldGNoIHRoZSBuZXh0IGhlYWRlciBhbmQgcHJvY2VzcyBpdC4KLSAgICAgICAgYiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKLSAgICAgICAgdCA9IHNlbGYuZnJvbWJ1ZihiKQotICAgICAgICB0Lm9mZnNldCA9IHNlbGYub2Zmc2V0Ci0gICAgICAgIG5leHQgPSB0Ll9wcm9jX21lbWJlcih0YXJmaWxlKQorICAgICAgICBuZXh0ID0gc2VsZi5mcm9tdGFyZmlsZSh0YXJmaWxlKQorICAgICAgICBpZiBuZXh0IGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBIZWFkZXJFcnJvcigibWlzc2luZyBzdWJzZXF1ZW50IGhlYWRlciIpCiAKICAgICAgICAgIyBQYXRjaCB0aGUgVGFySW5mbyBvYmplY3QgZnJvbSB0aGUgbmV4dCBoZWFkZXIgd2l0aAogICAgICAgICAjIHRoZSBsb25nbmFtZSBpbmZvcm1hdGlvbi4KICAgICAgICAgbmV4dC5vZmZzZXQgPSBzZWxmLm9mZnNldAogICAgICAgICBpZiBzZWxmLnR5cGUgPT0gR05VVFlQRV9MT05HTkFNRToKLSAgICAgICAgICAgIG5leHQubmFtZSA9IGJ1Zi5yc3RyaXAoTlVMKQorICAgICAgICAgICAgbmV4dC5uYW1lID0gbnRzKGJ1ZikKICAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gR05VVFlQRV9MT05HTElOSzoKLSAgICAgICAgICAgIG5leHQubGlua25hbWUgPSBidWYucnN0cmlwKE5VTCkKKyAgICAgICAgICAgIG5leHQubGlua25hbWUgPSBudHMoYnVmKQogCiAgICAgICAgIHJldHVybiBuZXh0CiAKQEAgLTEzNTYsMjEgKzEzNzAsMTAgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHBheF9oZWFkZXJzID0gdGFyZmlsZS5wYXhfaGVhZGVycy5jb3B5KCkKIAotICAgICAgICAjIEZpZWxkcyBpbiBQT1NJWC4xLTIwMDEgdGhhdCBhcmUgbnVtYmVycywgYWxsIG90aGVyIGZpZWxkcwotICAgICAgICAjIGFyZSB0cmVhdGVkIGFzIFVURi04IHN0cmluZ3MuCi0gICAgICAgIHR5cGVfbWFwcGluZyA9IHsKLSAgICAgICAgICAgICJhdGltZSI6ICAgICAgICBmbG9hdCwKLSAgICAgICAgICAgICJjdGltZSI6ICAgICAgICBmbG9hdCwKLSAgICAgICAgICAgICJtdGltZSI6ICAgICAgICBmbG9hdCwKLSAgICAgICAgICAgICJ1aWQiOiAgICAgICAgICBpbnQsCi0gICAgICAgICAgICAiZ2lkIjogICAgICAgICAgaW50LAotICAgICAgICAgICAgInNpemUiOiAgICAgICAgIGludAotICAgICAgICB9Ci0KICAgICAgICAgIyBQYXJzZSBwYXggaGVhZGVyIGluZm9ybWF0aW9uLiBBIHJlY29yZCBsb29rcyBsaWtlIHRoYXQ6CiAgICAgICAgICMgIiVkICVzPSVzXG4iICUgKGxlbmd0aCwga2V5d29yZCwgdmFsdWUpLiBsZW5ndGggaXMgdGhlIHNpemUKICAgICAgICAgIyBvZiB0aGUgY29tcGxldGUgcmVjb3JkIGluY2x1ZGluZyB0aGUgbGVuZ3RoIGZpZWxkIGl0c2VsZiBhbmQKLSAgICAgICAgIyB0aGUgbmV3bGluZS4KKyAgICAgICAgIyB0aGUgbmV3bGluZS4ga2V5d29yZCBhbmQgdmFsdWUgYXJlIGJvdGggVVRGLTggZW5jb2RlZCBzdHJpbmdzLgogICAgICAgICByZWdleCA9IHJlLmNvbXBpbGUociIoXGQrKSAoW149XSspPSIsIHJlLlUpCiAgICAgICAgIHBvcyA9IDAKICAgICAgICAgd2hpbGUgVHJ1ZToKQEAgLTEzODMsMzUgKzEzODYsNTUgQEAKICAgICAgICAgICAgIHZhbHVlID0gYnVmW21hdGNoLmVuZCgyKSArIDE6bWF0Y2guc3RhcnQoMSkgKyBsZW5ndGggLSAxXQogCiAgICAgICAgICAgICBrZXl3b3JkID0ga2V5d29yZC5kZWNvZGUoInV0ZjgiKQotICAgICAgICAgICAga2V5d29yZCA9IGtleXdvcmQuZW5jb2RlKHRhcmZpbGUuZW5jb2RpbmcpCi0KICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZGVjb2RlKCJ1dGY4IikKLSAgICAgICAgICAgIGlmIGtleXdvcmQgaW4gdHlwZV9tYXBwaW5nOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0eXBlX21hcHBpbmdba2V5d29yZF0odmFsdWUpCi0gICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gMAotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmVuY29kZSh0YXJmaWxlLmVuY29kaW5nKQogCiAgICAgICAgICAgICBwYXhfaGVhZGVyc1trZXl3b3JkXSA9IHZhbHVlCiAgICAgICAgICAgICBwb3MgKz0gbGVuZ3RoCiAKLSAgICAgICAgIyBGZXRjaCB0aGUgbmV4dCBoZWFkZXIgdGhhdCB3aWxsIGJlIHBhdGNoZWQgd2l0aCB0aGUKLSAgICAgICAgIyBzdXBwbGVtZW50IGluZm9ybWF0aW9uIGZyb20gdGhlIHBheCBoZWFkZXIgKGV4dGVuZGVkCi0gICAgICAgICMgb25seSkuCi0gICAgICAgIHQgPSBzZWxmLmZyb210YXJmaWxlKHRhcmZpbGUpCisgICAgICAgICMgRmV0Y2ggdGhlIG5leHQgaGVhZGVyLgorICAgICAgICBuZXh0ID0gc2VsZi5mcm9tdGFyZmlsZSh0YXJmaWxlKQogCi0gICAgICAgIGlmIHNlbGYudHlwZSAhPSBYR0xUWVBFIGFuZCB0IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgIyBQYXRjaCB0aGUgVGFySW5mbyBvYmplY3QgZnJvbSB0aGUgbmV4dCBoZWFkZXIgd2l0aAotICAgICAgICAgICAgIyB0aGUgcGF4IGhlYWRlcidzIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgZm9yIGtleXdvcmQsIHZhbHVlIGluIHBheF9oZWFkZXJzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgaWYga2V5d29yZCBpbiBQQVhfRklFTERTOgotICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHQsIGtleXdvcmQsIHZhbHVlKQotICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW2tleXdvcmRdID0gdmFsdWUKLSAgICAgICAgICAgIHQucGF4X2hlYWRlcnMgPSBwYXhfaGVhZGVycy5jb3B5KCkKKyAgICAgICAgaWYgc2VsZi50eXBlIGluIChYSERUWVBFLCBTT0xBUklTX1hIRFRZUEUpOgorICAgICAgICAgICAgaWYgbmV4dCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIEhlYWRlckVycm9yKCJtaXNzaW5nIHN1YnNlcXVlbnQgaGVhZGVyIikKIAotICAgICAgICByZXR1cm4gdAorICAgICAgICAgICAgIyBQYXRjaCB0aGUgVGFySW5mbyBvYmplY3Qgd2l0aCB0aGUgZXh0ZW5kZWQgaGVhZGVyIGluZm8uCisgICAgICAgICAgICBuZXh0Ll9hcHBseV9wYXhfaW5mbyhwYXhfaGVhZGVycywgdGFyZmlsZS5lbmNvZGluZywgdGFyZmlsZS5lcnJvcnMpCisgICAgICAgICAgICBuZXh0Lm9mZnNldCA9IHNlbGYub2Zmc2V0CisKKyAgICAgICAgICAgIGlmIHBheF9oZWFkZXJzLmhhc19rZXkoInNpemUiKToKKyAgICAgICAgICAgICAgICAjIElmIHRoZSBleHRlbmRlZCBoZWFkZXIgcmVwbGFjZXMgdGhlIHNpemUgZmllbGQsCisgICAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBvZmZzZXQgd2hlcmUgdGhlIG5leHQKKyAgICAgICAgICAgICAgICAjIGhlYWRlciBzdGFydHMuCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbmV4dC5vZmZzZXRfZGF0YQorICAgICAgICAgICAgICAgIGlmIG5leHQuaXNyZWcoKSBvciBuZXh0LnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG5leHQuX2Jsb2NrKG5leHQuc2l6ZSkKKyAgICAgICAgICAgICAgICB0YXJmaWxlLm9mZnNldCA9IG9mZnNldAorCisgICAgICAgIHJldHVybiBuZXh0CisKKyAgICBkZWYgX2FwcGx5X3BheF9pbmZvKHNlbGYsIHBheF9oZWFkZXJzLCBlbmNvZGluZywgZXJyb3JzKToKKyAgICAgICAgIiIiUmVwbGFjZSBmaWVsZHMgd2l0aCBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb24gZnJvbSBhIHByZXZpb3VzCisgICAgICAgICAgIHBheCBleHRlbmRlZCBvciBnbG9iYWwgaGVhZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGtleXdvcmQsIHZhbHVlIGluIHBheF9oZWFkZXJzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYga2V5d29yZCBub3QgaW4gUEFYX0ZJRUxEUzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBrZXl3b3JkID09ICJwYXRoIjoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJzdHJpcCgiLyIpCisKKyAgICAgICAgICAgIGlmIGtleXdvcmQgaW4gUEFYX05VTUJFUl9GSUVMRFM6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFBBWF9OVU1CRVJfRklFTERTW2tleXdvcmRdKHZhbHVlKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB1dHModmFsdWUsIGVuY29kaW5nLCBlcnJvcnMpCisKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwga2V5d29yZCwgdmFsdWUpCisKKyAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHBheF9oZWFkZXJzLmNvcHkoKQogCiAgICAgZGVmIF9ibG9jayhzZWxmLCBjb3VudCk6CiAgICAgICAgICIiIlJvdW5kIHVwIGEgYnl0ZSBjb3VudCBieSBCTE9DS1NJWkUgYW5kIHJldHVybiBpdCwKQEAgLTE0NjIsOCArMTQ4NSw5IEBACiAKICAgICBmb3JtYXQgPSBERUZBVUxUX0ZPUk1BVCAgICAgIyBUaGUgZm9ybWF0IHRvIHVzZSB3aGVuIGNyZWF0aW5nIGFuIGFyY2hpdmUuCiAKLSAgICBlbmNvZGluZyA9IEVOQ09ESU5HICAgICAgICAgIyBUcmFuc2ZlciBVVEYtOCBzdHJpbmdzIGZyb20gUE9TSVguMS0yMDAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaGVhZGVycyB0byB0aGlzIGVuY29kaW5nLgorICAgIGVuY29kaW5nID0gRU5DT0RJTkcgICAgICAgICAjIEVuY29kaW5nIGZvciA4LWJpdCBjaGFyYWN0ZXIgc3RyaW5ncy4KKworICAgIGVycm9ycyA9IE5vbmUgICAgICAgICAgICAgICAjIEVycm9yIGhhbmRsZXIgZm9yIHVuaWNvZGUgY29udmVyc2lvbi4KIAogICAgIHRhcmluZm8gPSBUYXJJbmZvICAgICAgICAgICAjIFRoZSBkZWZhdWx0IFRhckluZm8gY2xhc3MgdG8gdXNlLgogCkBAIC0xNDcxLDcgKzE0OTUsNyBAQAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgZm9ybWF0PU5vbmUsCiAgICAgICAgICAgICB0YXJpbmZvPU5vbmUsIGRlcmVmZXJlbmNlPU5vbmUsIGlnbm9yZV96ZXJvcz1Ob25lLCBlbmNvZGluZz1Ob25lLAotICAgICAgICAgICAgcGF4X2hlYWRlcnM9Tm9uZSwgZGVidWc9Tm9uZSwgZXJyb3JsZXZlbD1Ob25lKToKKyAgICAgICAgICAgIGVycm9ycz1Ob25lLCBwYXhfaGVhZGVycz1Ob25lLCBkZWJ1Zz1Ob25lLCBlcnJvcmxldmVsPU5vbmUpOgogICAgICAgICAiIiJPcGVuIGFuICh1bmNvbXByZXNzZWQpIHRhciBhcmNoaXZlIGBuYW1lJy4gYG1vZGUnIGlzIGVpdGhlciAncicgdG8KICAgICAgICAgICAgcmVhZCBmcm9tIGFuIGV4aXN0aW5nIGFyY2hpdmUsICdhJyB0byBhcHBlbmQgZGF0YSB0byBhbiBleGlzdGluZwogICAgICAgICAgICBmaWxlIG9yICd3JyB0byBjcmVhdGUgYSBuZXcgZmlsZSBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBvbmUuIGBtb2RlJwpAQCAtMTUxMiw2ICsxNTM2LDE5IEBACiAgICAgICAgICAgICBzZWxmLmlnbm9yZV96ZXJvcyA9IGlnbm9yZV96ZXJvcwogICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZworCisgICAgICAgIGlmIGVycm9ycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCisgICAgICAgIGVsaWYgbW9kZSA9PSAiciI6CisgICAgICAgICAgICBzZWxmLmVycm9ycyA9ICJ1dGYtOCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZXJyb3JzID0gInN0cmljdCIKKworICAgICAgICBpZiBwYXhfaGVhZGVycyBpcyBub3QgTm9uZSBhbmQgc2VsZi5mb3JtYXQgPT0gUEFYX0ZPUk1BVDoKKyAgICAgICAgICAgIHNlbGYucGF4X2hlYWRlcnMgPSBwYXhfaGVhZGVycworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHt9CisKICAgICAgICAgaWYgZGVidWcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBzZWxmLmRlYnVnID0gZGVidWcKICAgICAgICAgaWYgZXJyb3JsZXZlbCBpcyBub3QgTm9uZToKQEAgLTE1MjQsNyArMTU2MSw2IEBACiAgICAgICAgIHNlbGYub2Zmc2V0ID0gMEwgICAgICAgICMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYXJjaGl2ZSBmaWxlCiAgICAgICAgIHNlbGYuaW5vZGVzID0ge30gICAgICAgICMgZGljdGlvbmFyeSBjYWNoaW5nIHRoZSBpbm9kZXMgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmNoaXZlIG1lbWJlcnMgYWxyZWFkeSBhZGRlZAotICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0ge30gICAjIHNhdmUgY29udGVudHMgb2YgZ2xvYmFsIHBheCBoZWFkZXJzCiAKICAgICAgICAgaWYgc2VsZi5tb2RlID09ICJyIjoKICAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBOb25lCkBAIC0xNTQzLDkgKzE1NzksOCBAQAogICAgICAgICBpZiBzZWxmLm1vZGUgaW4gImF3IjoKICAgICAgICAgICAgIHNlbGYuX2xvYWRlZCA9IFRydWUKIAotICAgICAgICAgICAgaWYgcGF4X2hlYWRlcnM6Ci0gICAgICAgICAgICAgICAgYnVmID0gc2VsZi50YXJpbmZvLmNyZWF0ZV9wYXhfZ2xvYmFsX2hlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzLmNvcHkoKSwgc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgIGlmIHNlbGYucGF4X2hlYWRlcnM6CisgICAgICAgICAgICAgICAgYnVmID0gc2VsZi50YXJpbmZvLmNyZWF0ZV9wYXhfZ2xvYmFsX2hlYWRlcihzZWxmLnBheF9oZWFkZXJzLmNvcHkoKSkKICAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoYnVmKQogICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IGxlbihidWYpCiAKQEAgLTE4MTcsOCArMTg1Miw2IEBACiAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5vZGVzW2lub2RlXSA9IGFyY25hbWUKICAgICAgICAgZWxpZiBzdGF0LlNfSVNESVIoc3RtZCk6CiAgICAgICAgICAgICB0eXBlID0gRElSVFlQRQotICAgICAgICAgICAgaWYgYXJjbmFtZVstMTpdICE9ICIvIjoKLSAgICAgICAgICAgICAgICBhcmNuYW1lICs9ICIvIgogICAgICAgICBlbGlmIHN0YXQuU19JU0ZJRk8oc3RtZCk6CiAgICAgICAgICAgICB0eXBlID0gRklGT1RZUEUKICAgICAgICAgZWxpZiBzdGF0LlNfSVNMTksoc3RtZCk6CkBAIC0xOTUyLDcgKzE5ODUsNyBAQAogCiAgICAgICAgIHRhcmluZm8gPSBjb3B5LmNvcHkodGFyaW5mbykKIAotICAgICAgICBidWYgPSB0YXJpbmZvLnRvYnVmKHNlbGYuZm9ybWF0LCBzZWxmLmVuY29kaW5nKQorICAgICAgICBidWYgPSB0YXJpbmZvLnRvYnVmKHNlbGYuZm9ybWF0LCBzZWxmLmVuY29kaW5nLCBzZWxmLmVycm9ycykKICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKGJ1ZikKICAgICAgICAgc2VsZi5vZmZzZXQgKz0gbGVuKGJ1ZikKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CmluZGV4IGYwZmI2YjEuLjA0ZjliYTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKQEAgLTEsNCArMSw0IEBACi0jIGVuY29kaW5nOiBpc284ODU5LTEKKyMgLSotIGNvZGluZzogaXNvLTg4NTktMTUgLSotCiAKIGltcG9ydCBzeXMKIGltcG9ydCBvcwpAQCAtMzcyLDkgKzM3Miw5IEBACiAKICAgICBkZWYgdGVzdF9yZWFkX2xvbmduYW1lKHNlbGYpOgogICAgICAgICAjIFRlc3QgcmVhZGluZyBvZiBsb25nbmFtZSAoYnVnICMxNDcxNDI3KS4KLSAgICAgICAgbmFtZSA9IHNlbGYuc3ViZGlyICsgIi8iICsgIjEyMy8iICogMTI1ICsgImxvbmduYW1lIgorICAgICAgICBsb25nbmFtZSA9IHNlbGYuc3ViZGlyICsgIi8iICsgIjEyMy8iICogMTI1ICsgImxvbmduYW1lIgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKG5hbWUpCisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKGxvbmduYW1lKQogICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICBzZWxmLmZhaWwoImxvbmduYW1lIG5vdCBmb3VuZCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLnR5cGUgIT0gdGFyZmlsZS5ESVJUWVBFLCAicmVhZCBsb25nbmFtZSBhcyBkaXJ0eXBlIikKQEAgLTM5MywxMyArMzkzLDI0IEBACiAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobG9uZ25hbWUpCiAgICAgICAgIG9mZnNldCA9IHRhcmluZm8ub2Zmc2V0CiAgICAgICAgIHNlbGYudGFyLmZpbGVvYmouc2VlayhvZmZzZXQpCi0gICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTyhzZWxmLnRhci5maWxlb2JqLnJlYWQoMTUzNikpCisgICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTyhzZWxmLnRhci5maWxlb2JqLnJlYWQoMyAqIDUxMikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIG5hbWU9ImZvby50YXIiLCBmaWxlb2JqPWZvYmopCiAKKyAgICBkZWYgdGVzdF9oZWFkZXJfb2Zmc2V0KHNlbGYpOgorICAgICAgICAjIFRlc3QgaWYgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgVGFySW5mbyBvYmplY3QgaW5jbHVkZXMKKyAgICAgICAgIyB0aGUgcHJlY2VkaW5nIGV4dGVuZGVkIGhlYWRlci4KKyAgICAgICAgbG9uZ25hbWUgPSBzZWxmLnN1YmRpciArICIvIiArICIxMjMvIiAqIDEyNSArICJsb25nbmFtZSIKKyAgICAgICAgb2Zmc2V0ID0gc2VsZi50YXIuZ2V0bWVtYmVyKGxvbmduYW1lKS5vZmZzZXQKKyAgICAgICAgZm9iaiA9IG9wZW4odGFybmFtZSkKKyAgICAgICAgZm9iai5zZWVrKG9mZnNldCkKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mby5mcm9tYnVmKGZvYmoucmVhZCg1MTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udHlwZSwgc2VsZi5sb25nbmFtZXR5cGUpCisKIAogY2xhc3MgR05VUmVhZFRlc3QoTG9uZ25hbWVUZXN0KToKIAogICAgIHN1YmRpciA9ICJnbnUiCisgICAgbG9uZ25hbWV0eXBlID0gdGFyZmlsZS5HTlVUWVBFX0xPTkdOQU1FCiAKICAgICBkZWYgdGVzdF9zcGFyc2VfZmlsZShzZWxmKToKICAgICAgICAgdGFyaW5mbzEgPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3NwYXJzZSIpCkBAIC00MTAsMjYgKzQyMSw0MCBAQAogICAgICAgICAgICAgICAgICJzcGFyc2UgZmlsZSBleHRyYWN0aW9uIGZhaWxlZCIpCiAKIAotY2xhc3MgUGF4UmVhZFRlc3QoUmVhZFRlc3QpOgorY2xhc3MgUGF4UmVhZFRlc3QoTG9uZ25hbWVUZXN0KToKIAogICAgIHN1YmRpciA9ICJwYXgiCisgICAgbG9uZ25hbWV0eXBlID0gdGFyZmlsZS5YSERUWVBFCiAKLSAgICBkZWYgdGVzdF9wYXhfZ2xvYmhlYWRlcnMoc2VsZik6CisgICAgZGVmIHRlc3RfcGF4X2dsb2JhbF9oZWFkZXJzKHNlbGYpOgogICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisKICAgICAgICAgdGFyaW5mbyA9IHRhci5nZXRtZW1iZXIoInBheC9yZWd0eXBlMSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51bmFtZSwgImZvbyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5nbmFtZSwgImJhciIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5wYXhfaGVhZGVycy5nZXQoIlZFTkRPUi51bWxhdXRzIiksICLE1tzk9vzfIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnBheF9oZWFkZXJzLmdldCgiVkVORE9SLnVtbGF1dHMiKSwgdSLE1tzk9vzfIikKIAogICAgICAgICB0YXJpbmZvID0gdGFyLmdldG1lbWJlcigicGF4L3JlZ3R5cGUyIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnVuYW1lLCAiIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLmduYW1lLCAiYmFyIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnBheF9oZWFkZXJzLmdldCgiVkVORE9SLnVtbGF1dHMiKSwgIsTW3OT2/N8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ucGF4X2hlYWRlcnMuZ2V0KCJWRU5ET1IudW1sYXV0cyIpLCB1IsTW3OT2/N8iKQogCiAgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTMiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICJ0YXJmaWxlIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLmduYW1lLCAidGFyZmlsZSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5wYXhfaGVhZGVycy5nZXQoIlZFTkRPUi51bWxhdXRzIiksICLE1tzk9vzfIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnBheF9oZWFkZXJzLmdldCgiVkVORE9SLnVtbGF1dHMiKSwgdSLE1tzk9vzfIikKKworICAgIGRlZiB0ZXN0X3BheF9udW1iZXJfZmllbGRzKHNlbGYpOgorICAgICAgICAjIEFsbCBmb2xsb3dpbmcgbnVtYmVyIGZpZWxkcyBhcmUgcmVhZCBmcm9tIHRoZSBwYXggaGVhZGVyLgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgNzAxMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnVpZCwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uZ2lkLCAxMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5tdGltZSwgMTA0MTgwODc4My4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodGFyaW5mby5tdGltZSksIGZsb2F0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KHRhcmluZm8ucGF4X2hlYWRlcnNbImF0aW1lIl0pLCAxMDQxODA4NzgzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQodGFyaW5mby5wYXhfaGVhZGVyc1siY3RpbWUiXSksIDEwNDE4MDg3ODMuMCkKIAogCiBjbGFzcyBXcml0ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNzAwLDY4ICs3MjUsMTYxIEBACiAgICAgICAgICAgICBuID0gdGFyLmdldG1lbWJlcnMoKVswXS5uYW1lCiAgICAgICAgICAgICBzZWxmLmFzc2VydF8obmFtZSA9PSBuLCAiUEFYIGxvbmduYW1lIGNyZWF0aW9uIGZhaWxlZCIpCiAKLSAgICBkZWYgdGVzdF9pc284ODU5XzE1X2ZpbGVuYW1lKHNlbGYpOgotICAgICAgICBzZWxmLl90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoImlzbzg4NTktMTUiKQorICAgIGRlZiB0ZXN0X3BheF9nbG9iYWxfaGVhZGVyKHNlbGYpOgorICAgICAgICBwYXhfaGVhZGVycyA9IHsKKyAgICAgICAgICAgICAgICB1ImZvbyI6IHUiYmFyIiwKKyAgICAgICAgICAgICAgICB1InVpZCI6IHUiMCIsCisgICAgICAgICAgICAgICAgdSJtdGltZSI6IHUiMS4yMyIsCisgICAgICAgICAgICAgICAgdSJ0ZXN0IjogdSLk9vwiLAorICAgICAgICAgICAgICAgIHUi5Pb8IjogdSJ0ZXN0In0KKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9dGFyZmlsZS5QQVhfRk9STUFULCBcCisgICAgICAgICAgICAgICAgcGF4X2hlYWRlcnM9cGF4X2hlYWRlcnMpCisgICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbygidGVzdCIpKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgICAgICMgVGVzdCBpZiB0aGUgZ2xvYmFsIGhlYWRlciB3YXMgd3JpdHRlbiBjb3JyZWN0bHkuCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBlbmNvZGluZz0iaXNvODg1OS0xIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIucGF4X2hlYWRlcnMsIHBheF9oZWFkZXJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRtZW1iZXJzKClbMF0ucGF4X2hlYWRlcnMsIHBheF9oZWFkZXJzKQorCisgICAgICAgICMgVGVzdCBpZiBhbGwgdGhlIGZpZWxkcyBhcmUgdW5pY29kZS4KKyAgICAgICAgZm9yIGtleSwgdmFsIGluIHRhci5wYXhfaGVhZGVycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKGtleSkgaXMgdW5pY29kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHZhbCkgaXMgdW5pY29kZSkKKyAgICAgICAgICAgIGlmIGtleSBpbiB0YXJmaWxlLlBBWF9OVU1CRVJfRklFTERTOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdGFyZmlsZS5QQVhfTlVNQkVSX0ZJRUxEU1trZXldKHZhbCkKKyAgICAgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidW5hYmxlIHRvIGNvbnZlcnQgcGF4IGhlYWRlciBmaWVsZCIpCisKKyAgICBkZWYgdGVzdF9wYXhfZXh0ZW5kZWRfaGVhZGVyKHNlbGYpOgorICAgICAgICAjIFRoZSBmaWVsZHMgZnJvbSB0aGUgcGF4IGhlYWRlciBoYXZlIHByaW9yaXR5IG92ZXIgdGhlCisgICAgICAgICMgVGFySW5mby4KKyAgICAgICAgcGF4X2hlYWRlcnMgPSB7dSJwYXRoIjogdSJmb28iLCB1InVpZCI6IHUiMTIzIn0KKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9dGFyZmlsZS5QQVhfRk9STUFULCBlbmNvZGluZz0iaXNvODg1OS0xIikKKyAgICAgICAgdCA9IHRhcmZpbGUuVGFySW5mbygpCisgICAgICAgIHQubmFtZSA9IHUi5Pb8IiAgICAgIyBub24tQVNDSUkKKyAgICAgICAgdC51aWQgPSA4Kio4ICAgICAgICAjIHRvbyBsYXJnZQorICAgICAgICB0LnBheF9oZWFkZXJzID0gcGF4X2hlYWRlcnMKKyAgICAgICAgdGFyLmFkZGZpbGUodCkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisgICAgICAgIHQgPSB0YXIuZ2V0bWVtYmVycygpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5wYXhfaGVhZGVycywgcGF4X2hlYWRlcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5uYW1lLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnVpZCwgMTIzKQorCisKK2NsYXNzIFVzdGFyVW5pY29kZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgQWxsICpVbmljb2RlVGVzdHMgRklYTUUKKworICAgIGZvcm1hdCA9IHRhcmZpbGUuVVNUQVJfRk9STUFUCisKKyAgICBkZWYgdGVzdF9pc284ODU5XzFfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfdW5pY29kZV9maWxlbmFtZSgiaXNvODg1OS0xIikKKworICAgIGRlZiB0ZXN0X3V0ZjdfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfdW5pY29kZV9maWxlbmFtZSgidXRmNyIpCiAKICAgICBkZWYgdGVzdF91dGY4X2ZpbGVuYW1lKHNlbGYpOgogICAgICAgICBzZWxmLl90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoInV0ZjgiKQogCi0gICAgZGVmIHRlc3RfdXRmMTZfZmlsZW5hbWUoc2VsZik6Ci0gICAgICAgIHNlbGYuX3Rlc3RfdW5pY29kZV9maWxlbmFtZSgidXRmMTYiKQotCiAgICAgZGVmIF90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoc2VsZiwgZW5jb2RpbmcpOgotICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9dGFyZmlsZS5QQVhfRk9STUFUKQotICAgICAgICBuYW1lID0gdSJcdTIwYWMiLmVuY29kZShlbmNvZGluZykgIyBFdXJvIHNpZ24KLSAgICAgICAgdGFyLmVuY29kaW5nID0gZW5jb2RpbmcKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXNlbGYuZm9ybWF0LCBlbmNvZGluZz1lbmNvZGluZywgZXJyb3JzPSJzdHJpY3QiKQorICAgICAgICBuYW1lID0gdSLk9vwiCiAgICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbyhuYW1lKSkKICAgICAgICAgdGFyLmNsb3NlKCkKIAogICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZW5jb2Rpbmc9ZW5jb2RpbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG1lbWJlcnMoKVswXS5uYW1lLCBuYW1lKQorICAgICAgICBzZWxmLmFzc2VydF8odHlwZSh0YXIuZ2V0bmFtZXMoKVswXSkgaXMgbm90IHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG1lbWJlcnMoKVswXS5uYW1lLCBuYW1lLmVuY29kZShlbmNvZGluZykpCiAgICAgICAgIHRhci5jbG9zZSgpCiAKICAgICBkZWYgdGVzdF91bmljb2RlX2ZpbGVuYW1lX2Vycm9yKHNlbGYpOgotICAgICAgICAjIFRoZSBldXJvIHNpZ24gZmlsZW5hbWUgY2Fubm90IGJlIHRyYW5zbGF0ZWQgdG8gaXNvODg1OS0xIGVuY29kaW5nLgotICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9dGFyZmlsZS5QQVhfRk9STUFULCBlbmNvZGluZz0idXRmOCIpCi0gICAgICAgIG5hbWUgPSB1Ilx1MjBhYyIuZW5jb2RlKCJ1dGY4IikgIyBFdXJvIHNpZ24KLSAgICAgICAgdGFyLmFkZGZpbGUodGFyZmlsZS5UYXJJbmZvKG5hbWUpKQorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9c2VsZi5mb3JtYXQsIGVuY29kaW5nPSJhc2NpaSIsIGVycm9ycz0ic3RyaWN0IikKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygpCisKKyAgICAgICAgdGFyaW5mby5uYW1lID0gIuT2/CIKKyAgICAgICAgaWYgc2VsZi5mb3JtYXQgPT0gdGFyZmlsZS5QQVhfRk9STUFUOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB0YXIuYWRkZmlsZSwgdGFyaW5mbykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRhci5hZGRmaWxlKHRhcmluZm8pCisKKyAgICAgICAgdGFyaW5mby5uYW1lID0gdSLk9vwiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdGFyLmFkZGZpbGUsIHRhcmluZm8pCisKKyAgICAgICAgdGFyaW5mby5uYW1lID0gImZvbyIKKyAgICAgICAgdGFyaW5mby51bmFtZSA9IHUi5Pb8IgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHRhci5hZGRmaWxlLCB0YXJpbmZvKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9hcmd1bWVudChzZWxmKToKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsICJyIiwgZW5jb2Rpbmc9Imlzbzg4NTktMSIsIGVycm9ycz0ic3RyaWN0IikKKyAgICAgICAgZm9yIHQgaW4gdGFyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodC5uYW1lKSBpcyBzdHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8odHlwZSh0LmxpbmtuYW1lKSBpcyBzdHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8odHlwZSh0LnVuYW1lKSBpcyBzdHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8odHlwZSh0LmduYW1lKSBpcyBzdHIpCiAgICAgICAgIHRhci5jbG9zZSgpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB0YXJmaWxlLm9wZW4sIHRtcG5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQorICAgIGRlZiB0ZXN0X3VuYW1lX3VuaWNvZGUoc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluICh1IuT2/CIsICLk9vwiKToKKyAgICAgICAgICAgIHQgPSB0YXJmaWxlLlRhckluZm8oImZvbyIpCisgICAgICAgICAgICB0LnVuYW1lID0gbmFtZQorICAgICAgICAgICAgdC5nbmFtZSA9IG5hbWUKIAotICAgIGRlZiB0ZXN0X3BheF9oZWFkZXJzKHNlbGYpOgotICAgICAgICBzZWxmLl90ZXN0X3BheF9oZWFkZXJzKHsiZm9vIjogImJhciIsICJ1aWQiOiAwLCAibXRpbWUiOiAxLjIzfSkKKyAgICAgICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oImZvby50YXIiLCBtb2RlPSJ3IiwgZmlsZW9iaj1mb2JqLCBmb3JtYXQ9c2VsZi5mb3JtYXQsIGVuY29kaW5nPSJpc284ODU5LTEiKQorICAgICAgICAgICAgdGFyLmFkZGZpbGUodCkKKyAgICAgICAgICAgIHRhci5jbG9zZSgpCisgICAgICAgICAgICBmb2JqLnNlZWsoMCkKIAotICAgICAgICBzZWxmLl90ZXN0X3BheF9oZWFkZXJzKHsiZXVybyI6IHUiXHUyMGFjIi5lbmNvZGUoInV0ZjgiKX0pCisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oImZvby50YXIiLCBmaWxlb2JqPWZvYmosIGVuY29kaW5nPSJpc284ODU5LTEiKQorICAgICAgICAgICAgdCA9IHRhci5nZXRtZW1iZXIoImZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudW5hbWUsICLk9vwiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmduYW1lLCAi5Pb8IikKIAotICAgICAgICBzZWxmLl90ZXN0X3BheF9oZWFkZXJzKHsiZXVybyI6IHUiXHUyMGFjIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJldXJvIjogdSJcdTIwYWMiLmVuY29kZSgidXRmOCIpfSkKIAotICAgICAgICBzZWxmLl90ZXN0X3BheF9oZWFkZXJzKHt1Ilx1MjBhYyI6ICJldXJvIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3UiXHUyMGFjIi5lbmNvZGUoInV0ZjgiKTogImV1cm8ifSkKK2NsYXNzIEdOVVVuaWNvZGVUZXN0KFVzdGFyVW5pY29kZVRlc3QpOgogCi0gICAgZGVmIF90ZXN0X3BheF9oZWFkZXJzKHNlbGYsIHBheF9oZWFkZXJzLCBjbXBfaGVhZGVycz1Ob25lKToKLSAgICAgICAgaWYgY21wX2hlYWRlcnMgaXMgTm9uZToKLSAgICAgICAgICAgIGNtcF9oZWFkZXJzID0gcGF4X2hlYWRlcnMKKyAgICBmb3JtYXQgPSB0YXJmaWxlLkdOVV9GT1JNQVQKIAotICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9dGFyZmlsZS5QQVhfRk9STUFULCBcCi0gICAgICAgICAgICAgICAgcGF4X2hlYWRlcnM9cGF4X2hlYWRlcnMsIGVuY29kaW5nPSJ1dGY4IikKLSAgICAgICAgdGFyLmFkZGZpbGUodGFyZmlsZS5UYXJJbmZvKCJ0ZXN0IikpCisKK2NsYXNzIFBheFVuaWNvZGVUZXN0KFVzdGFyVW5pY29kZVRlc3QpOgorCisgICAgZm9ybWF0ID0gdGFyZmlsZS5QQVhfRk9STUFUCisKKyAgICBkZWYgX2NyZWF0ZV91bmljb2RlX25hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD1zZWxmLmZvcm1hdCkKKyAgICAgICAgdCA9IHRhcmZpbGUuVGFySW5mbygpCisgICAgICAgIHQucGF4X2hlYWRlcnNbInBhdGgiXSA9IG5hbWUKKyAgICAgICAgdGFyLmFkZGZpbGUodCkKICAgICAgICAgdGFyLmNsb3NlKCkKIAotICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZW5jb2Rpbmc9InV0ZjgiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5wYXhfaGVhZGVycywgY21wX2hlYWRlcnMpCisgICAgZGVmIHRlc3RfZXJyb3JfaGFuZGxlcnMoc2VsZik6CisgICAgICAgICMgVGVzdCBpZiB0aGUgdW5pY29kZSBlcnJvciBoYW5kbGVycyB3b3JrIGNvcnJlY3RseSBmb3IgY2hhcmFjdGVycworICAgICAgICAjIHRoYXQgY2Fubm90IGJlIGV4cHJlc3NlZCBpbiBhIGdpdmVuIGVuY29kaW5nLgorICAgICAgICBzZWxmLl9jcmVhdGVfdW5pY29kZV9uYW1lKHUi5Pb8IikKIAotICAgIGRlZiB0ZXN0X3RydW5jYXRlZF9oZWFkZXIoc2VsZik6Ci0gICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD10YXJmaWxlLlBBWF9GT1JNQVQpCi0gICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMy8iICogMTI2ICsgImxvbmduYW1lIikKLSAgICAgICAgdGFyLmFkZGZpbGUodGFyaW5mbykKLSAgICAgICAgdGFyLmNsb3NlKCkKKyAgICAgICAgZm9yIGhhbmRsZXIsIG5hbWUgaW4gKCgidXRmLTgiLCB1IuT2/CIuZW5jb2RlKCJ1dGY4IikpLAorICAgICAgICAgICAgICAgICAgICAoInJlcGxhY2UiLCAiPz8/IiksICgiaWdub3JlIiwgIiIpKToKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBmb3JtYXQ9c2VsZi5mb3JtYXQsIGVuY29kaW5nPSJhc2NpaSIsCisgICAgICAgICAgICAgICAgICAgIGVycm9ycz1oYW5kbGVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bmFtZXMoKVswXSwgbmFtZSkKIAotICAgICAgICAjIFNpbXVsYXRlIGEgcHJlbWF0dXJlIEVPRi4KLSAgICAgICAgb3Blbih0bXBuYW1lLCAicmIrIikudHJ1bmNhdGUoMTUzNikKLSAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG1lbWJlcnMoKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdGFyZmlsZS5vcGVuLCB0bXBuYW1lLAorICAgICAgICAgICAgICAgIGVuY29kaW5nPSJhc2NpaSIsIGVycm9ycz0ic3RyaWN0IikKKworICAgIGRlZiB0ZXN0X2Vycm9yX2hhbmRsZXJfdXRmOChzZWxmKToKKyAgICAgICAgIyBDcmVhdGUgYSBwYXRobmFtZSB0aGF0IGhhcyBvbmUgY29tcG9uZW50IHJlcHJlc2VudGFibGUgdXNpbmcKKyAgICAgICAgIyBpc284ODU5LTEgYW5kIHRoZSBvdGhlciBvbmx5IGluIGlzbzg4NTktMTUuCisgICAgICAgIHNlbGYuX2NyZWF0ZV91bmljb2RlX25hbWUodSLk9vwvpCIpCisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGZvcm1hdD1zZWxmLmZvcm1hdCwgZW5jb2Rpbmc9Imlzbzg4NTktMSIsCisgICAgICAgICAgICAgICAgZXJyb3JzPSJ1dGYtOCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG5hbWVzKClbMF0sICLk9vwvIiArIHUipCIuZW5jb2RlKCJ1dGY4IikpCiAKIAogY2xhc3MgQXBwZW5kVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC04MzYsNjMgKzk1NCw1OCBAQAogICAgIGRlZiB0ZXN0X3VzdGFyX2xpbWl0cyhzZWxmKToKICAgICAgICAgIyAxMDAgY2hhciBuYW1lCiAgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjAxMjM0NTY3ODkiICogMTApCi0gICAgICAgIHRhcmluZm8uY3JlYXRlX3VzdGFyX2hlYWRlcigpCisgICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5VU1RBUl9GT1JNQVQpCiAKICAgICAgICAgIyAxMDEgY2hhciBuYW1lIHRoYXQgY2Fubm90IGJlIHN0b3JlZAogICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIwMTIzNDU2Nzg5IiAqIDEwICsgIjAiKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLmNyZWF0ZV91c3Rhcl9oZWFkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8udG9idWYsIHRhcmZpbGUuVVNUQVJfRk9STUFUKQogCiAgICAgICAgICMgMjU2IGNoYXIgbmFtZSB3aXRoIGEgc2xhc2ggYXQgcG9zIDE1NgogICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDYyICsgImxvbmduYW1lIikKLSAgICAgICAgdGFyaW5mby5jcmVhdGVfdXN0YXJfaGVhZGVyKCkKKyAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLlVTVEFSX0ZPUk1BVCkKIAogICAgICAgICAjIDI1NiBjaGFyIG5hbWUgdGhhdCBjYW5ub3QgYmUgc3RvcmVkCiAgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMzQ1NjcvIiAqIDMxICsgImxvbmduYW1lIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby5jcmVhdGVfdXN0YXJfaGVhZGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLnRvYnVmLCB0YXJmaWxlLlVTVEFSX0ZPUk1BVCkKIAogICAgICAgICAjIDUxMiBjaGFyIG5hbWUKICAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLmNyZWF0ZV91c3Rhcl9oZWFkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8udG9idWYsIHRhcmZpbGUuVVNUQVJfRk9STUFUKQogCiAgICAgICAgICMgNTEyIGNoYXIgbGlua25hbWUKICAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibG9uZ2xpbmsiKQogICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gIjEyMy8iICogMTI2ICsgImxvbmduYW1lIgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLmNyZWF0ZV91c3Rhcl9oZWFkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8udG9idWYsIHRhcmZpbGUuVVNUQVJfRk9STUFUKQogCiAgICAgICAgICMgdWlkID4gOCBkaWdpdHMKICAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibmFtZSIpCiAgICAgICAgIHRhcmluZm8udWlkID0gMDEwMDAwMDAwCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8uY3JlYXRlX3VzdGFyX2hlYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby50b2J1ZiwgdGFyZmlsZS5VU1RBUl9GT1JNQVQpCiAKICAgICBkZWYgdGVzdF9nbnVfbGltaXRzKHNlbGYpOgogICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIpCi0gICAgICAgIHRhcmluZm8uY3JlYXRlX2dudV9oZWFkZXIoKQorICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuR05VX0ZPUk1BVCkKIAogICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJsb25nbGluayIpCiAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSAiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiCi0gICAgICAgIHRhcmluZm8uY3JlYXRlX2dudV9oZWFkZXIoKQorICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuR05VX0ZPUk1BVCkKIAogICAgICAgICAjIHVpZCA+PSAyNTYgKiogNwogICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJuYW1lIikKICAgICAgICAgdGFyaW5mby51aWQgPSAwNDAwMDAwMDAwMDAwMDAwMDAwMEwKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby5jcmVhdGVfZ251X2hlYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby50b2J1ZiwgdGFyZmlsZS5HTlVfRk9STUFUKQogCiAgICAgZGVmIHRlc3RfcGF4X2xpbWl0cyhzZWxmKToKLSAgICAgICAgIyBBIDI1NiBjaGFyIG5hbWUgdGhhdCBjYW4gYmUgc3RvcmVkIHdpdGhvdXQgYW4gZXh0ZW5kZWQgaGVhZGVyLgotICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDYyICsgImxvbmduYW1lIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbih0YXJpbmZvLmNyZWF0ZV9wYXhfaGVhZGVyKCJ1dGY4IikpID09IDUxMiwKLSAgICAgICAgICAgICAgICAiY3JlYXRlX3BheF9oZWFkZXIgYXR0YWNoZWQgc3VwZXJmbHVvdXMgZXh0ZW5kZWQgaGVhZGVyIikKLQogICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIpCi0gICAgICAgIHRhcmluZm8uY3JlYXRlX3BheF9oZWFkZXIoInV0ZjgiKQorICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuUEFYX0ZPUk1BVCkKIAogICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJsb25nbGluayIpCiAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSAiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiCi0gICAgICAgIHRhcmluZm8uY3JlYXRlX3BheF9oZWFkZXIoInV0ZjgiKQorICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuUEFYX0ZPUk1BVCkKIAogICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJuYW1lIikKICAgICAgICAgdGFyaW5mby51aWQgPSAwNDAwMDAwMDAwMDAwMDAwMDAwMEwKLSAgICAgICAgdGFyaW5mby5jcmVhdGVfcGF4X2hlYWRlcigidXRmOCIpCisgICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5QQVhfRk9STUFUKQogCiAKIGNsYXNzIEd6aXBNaXNjUmVhZFRlc3QoTWlzY1JlYWRUZXN0KToKQEAgLTk0MCw2ICsxMDUzLDkgQEAKICAgICAgICAgU3RyZWFtV3JpdGVUZXN0LAogICAgICAgICBHTlVXcml0ZVRlc3QsCiAgICAgICAgIFBheFdyaXRlVGVzdCwKKyAgICAgICAgVXN0YXJVbmljb2RlVGVzdCwKKyAgICAgICAgR05VVW5pY29kZVRlc3QsCisgICAgICAgIFBheFVuaWNvZGVUZXN0LAogICAgICAgICBBcHBlbmRUZXN0LAogICAgICAgICBMaW1pdHNUZXN0LAogICAgIF0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3R0YXIudGFyIGIvTGliL3Rlc3QvdGVzdHRhci50YXIKaW5kZXggYzRjODJiOC4uMzUyOWJkZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdHRhci50YXIKKysrIGIvTGliL3Rlc3QvdGVzdHRhci50YXIKQmluYXJ5IGZpbGVzIGRpZmZlcgo=