ZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvLkNUWVBFU19ERVZFTCBiL0xpYi9jdHlwZXMvLkNUWVBFU19ERVZFTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjNkNDYzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy8uQ1RZUEVTX0RFVkVMCkBAIC0wLDAgKzEsMTQgQEAKKyMgLSotIHB5dGhvbiAtKi0KK2RlZiBpbnN0YWxsKCk6CisgICAgaW1wb3J0IHN5cywgb3MKKworICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQorICAgIHBsYXRfc3BlY2lmaWVyID0gIi4lcy0lcyIgJSAoZ2V0X3BsYXRmb3JtKCksIHN5cy52ZXJzaW9uWzA6M10pCisgICAgYnVpbGRfZGlyID0gb3MucGF0aC5qb2luKCIuLiIsICdidWlsZCcsICdsaWInICsgcGxhdF9zcGVjaWZpZXIpCisKKyAgICBwID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCBidWlsZF9kaXIpKQorICAgIHN5cy5wYXRoLmluc2VydCgwLCBwKQorICAgIGRlbCBzeXMKKworaW5zdGFsbCgpCitkZWwgaW5zdGFsbApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy8uY3ZzaWdub3JlIGIvTGliL2N0eXBlcy8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNjI0NmEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzLy5jdnNpZ25vcmUKQEAgLTAsMCArMSw0IEBACisKKyoucHljCisqLnB5bworY29tCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL19faW5pdF9fLnB5IGIvTGliL2N0eXBlcy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2NhZDJlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDQ4OSBAQAorIiIiY3JlYXRlIGFuZCBtYW5pcHVsYXRlIEMgZGF0YSB0eXBlcyBpbiBQeXRob24iIiIKKworIyBzcGVjaWFsIGRldmVsb3BlciBzdXBwb3J0IHRvIHVzZSBjdHlwZXMgZnJvbSB0aGUgQ1ZTIHNhbmRib3gsCisjIHdpdGhvdXQgaW5zdGFsbGluZyBpdAoraW1wb3J0IG9zIGFzIF9vcywgc3lzIGFzIF9zeXMKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbiBhcyBfY2hhaW4KKworX21hZ2ljZmlsZSA9IF9vcy5wYXRoLmpvaW4oX29zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICIuQ1RZUEVTX0RFVkVMIikKK2lmIF9vcy5wYXRoLmlzZmlsZShfbWFnaWNmaWxlKToKKyAgICBleGVjZmlsZShfbWFnaWNmaWxlKQorZGVsIF9tYWdpY2ZpbGUKKworX192ZXJzaW9uX18gPSAiMC45LjkuNCIKKworZnJvbSBfY3R5cGVzIGltcG9ydCBVbmlvbiwgU3RydWN0dXJlLCBBcnJheQorZnJvbSBfY3R5cGVzIGltcG9ydCBfUG9pbnRlcgorZnJvbSBfY3R5cGVzIGltcG9ydCBDRnVuY1B0ciBhcyBfQ0Z1bmNQdHIKK2Zyb20gX2N0eXBlcyBpbXBvcnQgX192ZXJzaW9uX18gYXMgX2N0eXBlc192ZXJzaW9uCit0cnk6CisgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBSVExEX0xPQ0FMLCBSVExEX0dMT0JBTAorZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgIFJUTERfR0xPQkFMID0gUlRMRF9MT0NBTCA9IE5vbmUKKworZnJvbSBfY3R5cGVzIGltcG9ydCBBcmd1bWVudEVycm9yCisKK2Zyb20gc3RydWN0IGltcG9ydCBjYWxjc2l6ZSBhcyBfY2FsY3NpemUKKworaWYgX192ZXJzaW9uX18gIT0gX2N0eXBlc192ZXJzaW9uOgorICAgIHJhaXNlIEV4Y2VwdGlvbiwgKCJWZXJzaW9uIG51bWJlciBtaXNtYXRjaCIsIF9fdmVyc2lvbl9fLCBfY3R5cGVzX3ZlcnNpb24pCisKK2lmIF9vcy5uYW1lIGluICgibnQiLCAiY2UiKToKKyAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IEZvcm1hdEVycm9yCisKK2Zyb20gX2N0eXBlcyBpbXBvcnQgRlVOQ0ZMQUdfQ0RFQ0wgYXMgX0ZVTkNGTEFHX0NERUNMLCBcCisgICAgIEZVTkNGTEFHX1BZVEhPTkFQSSBhcyBfRlVOQ0ZMQUdfUFlUSE9OQVBJCisKK2Zyb20gY3R5cGVzLl9sb2FkZXIgaW1wb3J0IExpYnJhcnlMb2FkZXIKKworIiIiCitXSU5PTEVBUEkgLT4gSFJFU1VMVAorV0lOT0xFQVBJXyh0eXBlKQorCitTVERNRVRIT0RDQUxMVFlQRQorCitTVERNRVRIT0QobmFtZSkKK1NURE1FVEhPRF8odHlwZSwgbmFtZSkKKworU1REQVBJQ0FMTFRZUEUKKyIiIgorCitkZWYgY3JlYXRlX3N0cmluZ19idWZmZXIoaW5pdCwgc2l6ZT1Ob25lKToKKyAgICAiIiJjcmVhdGVfc3RyaW5nX2J1ZmZlcihhU3RyaW5nKSAtPiBjaGFyYWN0ZXIgYXJyYXkKKyAgICBjcmVhdGVfc3RyaW5nX2J1ZmZlcihhbkludGVnZXIpIC0+IGNoYXJhY3RlciBhcnJheQorICAgIGNyZWF0ZV9zdHJpbmdfYnVmZmVyKGFTdHJpbmcsIGFuSW50ZWdlcikgLT4gY2hhcmFjdGVyIGFycmF5CisgICAgIiIiCisgICAgaWYgaXNpbnN0YW5jZShpbml0LCAoc3RyLCB1bmljb2RlKSk6CisgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHNpemUgPSBsZW4oaW5pdCkrMQorICAgICAgICBidWZ0eXBlID0gY19jaGFyICogc2l6ZQorICAgICAgICBidWYgPSBidWZ0eXBlKCkKKyAgICAgICAgYnVmLnZhbHVlID0gaW5pdAorICAgICAgICByZXR1cm4gYnVmCisgICAgZWxpZiBpc2luc3RhbmNlKGluaXQsIChpbnQsIGxvbmcpKToKKyAgICAgICAgYnVmdHlwZSA9IGNfY2hhciAqIGluaXQKKyAgICAgICAgYnVmID0gYnVmdHlwZSgpCisgICAgICAgIHJldHVybiBidWYKKyAgICByYWlzZSBUeXBlRXJyb3IsIGluaXQKKworZGVmIGNfYnVmZmVyKGluaXQsIHNpemU9Tm9uZSk6CisjIyAgICAiZGVwcmVjYXRlZCwgdXNlIGNyZWF0ZV9zdHJpbmdfYnVmZmVyIGluc3RlYWQiCisjIyAgICBpbXBvcnQgd2FybmluZ3MKKyMjICAgIHdhcm5pbmdzLndhcm4oImNfYnVmZmVyIGlzIGRlcHJlY2F0ZWQsIHVzZSBjcmVhdGVfc3RyaW5nX2J1ZmZlciBpbnN0ZWFkIiwKKyMjICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgcmV0dXJuIGNyZWF0ZV9zdHJpbmdfYnVmZmVyKGluaXQsIHNpemUpCisKK19jX2Z1bmN0eXBlX2NhY2hlID0ge30KK2RlZiBDRlVOQ1RZUEUocmVzdHlwZSwgKmFyZ3R5cGVzKToKKyAgICAiIiJDRlVOQ1RZUEUocmVzdHlwZSwgKmFyZ3R5cGVzKSAtPiBmdW5jdGlvbiBwcm90b3R5cGUuCisgICAgCisgICAgcmVzdHlwZTogdGhlIHJlc3VsdCB0eXBlCisgICAgYXJndHlwZXM6IGEgc2VxdWVuY2Ugc3BlY2lmeWluZyB0aGUgYXJndW1lbnQgdHlwZXMKKyAgICAKKyAgICBUaGUgZnVuY3Rpb24gcHJvdG90eXBlIGNhbiBiZSBjYWxsZWQgaW4gdGhyZWUgd2F5cyB0byBjcmVhdGUgYQorICAgIGNhbGxhYmxlIG9iamVjdDoKKyAgICAKKyAgICBwcm90b3R5cGUoZnVuY3QpIC0gcmV0dXJucyBhIEMgY2FsbGFibGUgZnVuY3Rpb24gY2FsbGluZyBmdW5jdAorICAgIHByb3RvdHlwZSh2dGJsX2luZGV4LCBtZXRob2RfbmFtZVssIHBhcmFtZmxhZ3NdKSAtIGEgUHl0aG9uIGNhbGxhYmxlIHRoYXQgY2FsbHMgYSBDT00gbWV0aG9kCisgICAgcHJvdG90eXBlKGZ1bmN0X25hbWUsIGRsbFssIHBhcmFtZmxhZ3NdKSAtIGEgUHl0aG9uIGNhbGxhYmxlIHRoYXQgY2FsbHMgYW4gZXhwb3J0ZWQgZnVuY3Rpb24gaW4gYSBkbGwKKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBfY19mdW5jdHlwZV9jYWNoZVsocmVzdHlwZSwgYXJndHlwZXMpXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgY2xhc3MgQ0Z1bmN0aW9uVHlwZShfQ0Z1bmNQdHIpOgorICAgICAgICAgICAgX2FyZ3R5cGVzXyA9IGFyZ3R5cGVzCisgICAgICAgICAgICBfcmVzdHlwZV8gPSByZXN0eXBlCisgICAgICAgICAgICBfZmxhZ3NfID0gX0ZVTkNGTEFHX0NERUNMCisgICAgICAgIF9jX2Z1bmN0eXBlX2NhY2hlWyhyZXN0eXBlLCBhcmd0eXBlcyldID0gQ0Z1bmN0aW9uVHlwZQorICAgICAgICByZXR1cm4gQ0Z1bmN0aW9uVHlwZQorCitpZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CisgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBMb2FkTGlicmFyeSBhcyBfZGxvcGVuCisgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBGVU5DRkxBR19TVERDQUxMIGFzIF9GVU5DRkxBR19TVERDQUxMCisgICAgaWYgX29zLm5hbWUgPT0gImNlIjoKKyAgICAgICAgIyAnY2UnIGRvZXNuJ3QgaGF2ZSB0aGUgc3RkY2FsbCBjYWxsaW5nIGNvbnZlbnRpb24KKyAgICAgICAgX0ZVTkNGTEFHX1NURENBTEwgPSBfRlVOQ0ZMQUdfQ0RFQ0wKKworICAgIF93aW5fZnVuY3R5cGVfY2FjaGUgPSB7fQorICAgIGRlZiBXSU5GVU5DVFlQRShyZXN0eXBlLCAqYXJndHlwZXMpOgorICAgICAgICAjIGRvY3N0cmluZyBzZXQgbGF0ZXIgKHZlcnkgc2ltaWxhciB0byBDRlVOQ1RZUEUuX19kb2NfXykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIF93aW5fZnVuY3R5cGVfY2FjaGVbKHJlc3R5cGUsIGFyZ3R5cGVzKV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgY2xhc3MgV2luRnVuY3Rpb25UeXBlKF9DRnVuY1B0cik6CisgICAgICAgICAgICAgICAgX2FyZ3R5cGVzXyA9IGFyZ3R5cGVzCisgICAgICAgICAgICAgICAgX3Jlc3R5cGVfID0gcmVzdHlwZQorICAgICAgICAgICAgICAgIF9mbGFnc18gPSBfRlVOQ0ZMQUdfU1REQ0FMTAorICAgICAgICAgICAgX3dpbl9mdW5jdHlwZV9jYWNoZVsocmVzdHlwZSwgYXJndHlwZXMpXSA9IFdpbkZ1bmN0aW9uVHlwZQorICAgICAgICAgICAgcmV0dXJuIFdpbkZ1bmN0aW9uVHlwZQorICAgIGlmIFdJTkZVTkNUWVBFLl9fZG9jX186CisgICAgICAgIFdJTkZVTkNUWVBFLl9fZG9jX18gPSBDRlVOQ1RZUEUuX19kb2NfXy5yZXBsYWNlKCJDRlVOQ1RZUEUiLCAiV0lORlVOQ1RZUEUiKQorCitlbGlmIF9vcy5uYW1lID09ICJwb3NpeCI6CisgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBkbG9wZW4gYXMgX2Rsb3BlbgorCitmcm9tIF9jdHlwZXMgaW1wb3J0IHNpemVvZiwgYnlyZWYsIGFkZHJlc3NvZiwgYWxpZ25tZW50Citmcm9tIF9jdHlwZXMgaW1wb3J0IF9TaW1wbGVDRGF0YQorCitjbGFzcyBweV9vYmplY3QoX1NpbXBsZUNEYXRhKToKKyAgICBfdHlwZV8gPSAiTyIKKworY2xhc3MgY19zaG9ydChfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJoIgorCitjbGFzcyBjX3VzaG9ydChfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJIIgorCitjbGFzcyBjX2xvbmcoX1NpbXBsZUNEYXRhKToKKyAgICBfdHlwZV8gPSAibCIKKworY2xhc3MgY191bG9uZyhfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJMIgorICAgIAoraWYgX2NhbGNzaXplKCJpIikgPT0gX2NhbGNzaXplKCJsIik6CisgICAgIyBpZiBpbnQgYW5kIGxvbmcgaGF2ZSB0aGUgc2FtZSBzaXplLCBtYWtlIGNfaW50IGFuIGFsaWFzIGZvciBjX2xvbmcKKyAgICBjX2ludCA9IGNfbG9uZworICAgIGNfdWludCA9IGNfdWxvbmcKK2Vsc2U6CisgICAgY2xhc3MgY19pbnQoX1NpbXBsZUNEYXRhKToKKyAgICAgICAgX3R5cGVfID0gImkiCisKKyAgICBjbGFzcyBjX3VpbnQoX1NpbXBsZUNEYXRhKToKKyAgICAgICAgX3R5cGVfID0gIkkiCisKK2NsYXNzIGNfZmxvYXQoX1NpbXBsZUNEYXRhKToKKyAgICBfdHlwZV8gPSAiZiIKKyAgICAKK2NsYXNzIGNfZG91YmxlKF9TaW1wbGVDRGF0YSk6CisgICAgX3R5cGVfID0gImQiCisKK2lmIF9jYWxjc2l6ZSgibCIpID09IF9jYWxjc2l6ZSgicSIpOgorICAgICMgaWYgbG9uZyBhbmQgbG9uZyBsb25nIGhhdmUgdGhlIHNhbWUgc2l6ZSwgbWFrZSBjX2xvbmdsb25nIGFuIGFsaWFzIGZvciBjX2xvbmcKKyAgICBjX2xvbmdsb25nID0gY19sb25nCisgICAgY191bG9uZ2xvbmcgPSBjX3Vsb25nCitlbHNlOgorICAgIGNsYXNzIGNfbG9uZ2xvbmcoX1NpbXBsZUNEYXRhKToKKyAgICAgICAgX3R5cGVfID0gInEiCisKKyAgICBjbGFzcyBjX3Vsb25nbG9uZyhfU2ltcGxlQ0RhdGEpOgorICAgICAgICBfdHlwZV8gPSAiUSIKKyAgICAjIyAgICBkZWYgZnJvbV9wYXJhbShjbHMsIHZhbCk6CisgICAgIyMgICAgICAgIHJldHVybiAoJ2QnLCBmbG9hdCh2YWwpLCB2YWwpCisgICAgIyMgICAgZnJvbV9wYXJhbSA9IGNsYXNzbWV0aG9kKGZyb21fcGFyYW0pCisKK2NsYXNzIGNfdWJ5dGUoX1NpbXBsZUNEYXRhKToKKyAgICBfdHlwZV8gPSAiQiIKK2NfdWJ5dGUuX19jdHlwZV9sZV9fID0gY191Ynl0ZS5fX2N0eXBlX2JlX18gPSBjX3VieXRlCisjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CisjI2NfdWNoYXIgPSBjX3VieXRlCisKK2NsYXNzIGNfYnl0ZShfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJiIgorY19ieXRlLl9fY3R5cGVfbGVfXyA9IGNfYnl0ZS5fX2N0eXBlX2JlX18gPSBjX2J5dGUKKworY2xhc3MgY19jaGFyKF9TaW1wbGVDRGF0YSk6CisgICAgX3R5cGVfID0gImMiCitjX2NoYXIuX19jdHlwZV9sZV9fID0gY19jaGFyLl9fY3R5cGVfYmVfXyA9IGNfY2hhcgorCitjbGFzcyBjX2NoYXJfcChfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJ6IgorCitjbGFzcyBjX3ZvaWRfcChfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJQIgorY192b2lkcCA9IGNfdm9pZF9wICMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKHRvIGEgYnVnKQorCisjIFRoaXMgY2FjaGUgbWFwcyB0eXBlcyB0byBwb2ludGVycyB0byB0aGVtLgorX3BvaW50ZXJfdHlwZV9jYWNoZSA9IHt9CisKK2RlZiBQT0lOVEVSKGNscyk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gX3BvaW50ZXJfdHlwZV9jYWNoZVtjbHNdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBwYXNzCisgICAgaWYgdHlwZShjbHMpIGlzIHN0cjoKKyAgICAgICAga2xhc3MgPSB0eXBlKF9Qb2ludGVyKSgiTFBfJXMiICUgY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfUG9pbnRlciwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9KQorICAgICAgICBfcG9pbnRlcl90eXBlX2NhY2hlW2lkKGtsYXNzKV0gPSBrbGFzcworICAgICAgICByZXR1cm4ga2xhc3MKKyAgICBlbHNlOgorICAgICAgICBuYW1lID0gIkxQXyVzIiAlIGNscy5fX25hbWVfXworICAgICAgICBrbGFzcyA9IHR5cGUoX1BvaW50ZXIpKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9Qb2ludGVyLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydfdHlwZV8nOiBjbHN9KQorICAgICAgICBfcG9pbnRlcl90eXBlX2NhY2hlW2Nsc10gPSBrbGFzcworICAgIHJldHVybiBrbGFzcworCit0cnk6CisgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBzZXRfY29udmVyc2lvbl9tb2RlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBpZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CisgICAgICAgIHNldF9jb252ZXJzaW9uX21vZGUoIm1iY3MiLCAiaWdub3JlIikKKyAgICBlbHNlOgorICAgICAgICBzZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQorCisgICAgY2xhc3MgY193Y2hhcl9wKF9TaW1wbGVDRGF0YSk6CisgICAgICAgIF90eXBlXyA9ICJaIgorCisgICAgY2xhc3MgY193Y2hhcihfU2ltcGxlQ0RhdGEpOgorICAgICAgICBfdHlwZV8gPSAidSIKKworICAgIFBPSU5URVIoY193Y2hhcikuZnJvbV9wYXJhbSA9IGNfd2NoYXJfcC5mcm9tX3BhcmFtICNfU2ltcGxlQ0RhdGEuY193Y2hhcl9wX2Zyb21fcGFyYW0KKworICAgIGRlZiBjcmVhdGVfdW5pY29kZV9idWZmZXIoaW5pdCwgc2l6ZT1Ob25lKToKKyAgICAgICAgIiIiY3JlYXRlX3VuaWNvZGVfYnVmZmVyKGFTdHJpbmcpIC0+IGNoYXJhY3RlciBhcnJheQorICAgICAgICBjcmVhdGVfdW5pY29kZV9idWZmZXIoYW5JbnRlZ2VyKSAtPiBjaGFyYWN0ZXIgYXJyYXkKKyAgICAgICAgY3JlYXRlX3VuaWNvZGVfYnVmZmVyKGFTdHJpbmcsIGFuSW50ZWdlcikgLT4gY2hhcmFjdGVyIGFycmF5CisgICAgICAgICIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKGluaXQsIChzdHIsIHVuaWNvZGUpKToKKyAgICAgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzaXplID0gbGVuKGluaXQpKzEKKyAgICAgICAgICAgIGJ1ZnR5cGUgPSBjX3djaGFyICogc2l6ZQorICAgICAgICAgICAgYnVmID0gYnVmdHlwZSgpCisgICAgICAgICAgICBidWYudmFsdWUgPSBpbml0CisgICAgICAgICAgICByZXR1cm4gYnVmCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpbml0LCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICBidWZ0eXBlID0gY193Y2hhciAqIGluaXQKKyAgICAgICAgICAgIGJ1ZiA9IGJ1ZnR5cGUoKQorICAgICAgICAgICAgcmV0dXJuIGJ1ZgorICAgICAgICByYWlzZSBUeXBlRXJyb3IsIGluaXQKKworUE9JTlRFUihjX2NoYXIpLmZyb21fcGFyYW0gPSBjX2NoYXJfcC5mcm9tX3BhcmFtICNfU2ltcGxlQ0RhdGEuY19jaGFyX3BfZnJvbV9wYXJhbQorCisjIFhYWCBEZXByZWNhdGVkCitkZWYgU2V0UG9pbnRlclR5cGUocG9pbnRlciwgY2xzKToKKyAgICBpZiBfcG9pbnRlcl90eXBlX2NhY2hlLmdldChjbHMsIE5vbmUpIGlzIG5vdCBOb25lOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIFwKKyAgICAgICAgICAgICAgIlRoaXMgdHlwZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY2FjaGUiCisgICAgaWYgbm90IF9wb2ludGVyX3R5cGVfY2FjaGUuaGFzX2tleShpZChwb2ludGVyKSk6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAorICAgICAgICAgICAgICAiV2hhdCdzIHRoaXM/Pz8iCisgICAgcG9pbnRlci5zZXRfdHlwZShjbHMpCisgICAgX3BvaW50ZXJfdHlwZV9jYWNoZVtjbHNdID0gcG9pbnRlcgorICAgIGRlbCBfcG9pbnRlcl90eXBlX2NhY2hlW2lkKHBvaW50ZXIpXQorCisKK2RlZiBwb2ludGVyKGluc3QpOgorICAgIHJldHVybiBQT0lOVEVSKHR5cGUoaW5zdCkpKGluc3QpCisKKyMgWFhYIERlcHJlY2F0ZWQKK2RlZiBBUlJBWSh0eXAsIGxlbik6CisgICAgcmV0dXJuIHR5cCAqIGxlbgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworY2xhc3MgQ0RMTChvYmplY3QpOgorICAgICIiIkFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGxvYWRlZCBkbGwvc2hhcmVkCisgICAgbGlicmFyeSwgZXhwb3J0aW5nIGZ1bmN0aW9ucyB1c2luZyB0aGUgc3RhbmRhcmQgQyBjYWxsaW5nCisgICAgY29udmVudGlvbiAobmFtZWQgJ2NkZWNsJyBvbiBXaW5kb3dzKS4KKworICAgIFRoZSBleHBvcnRlZCBmdW5jdGlvbnMgY2FuIGJlIGFjY2Vzc2VkIGFzIGF0dHJpYnV0ZXMsIG9yIGJ5CisgICAgaW5kZXhpbmcgd2l0aCB0aGUgZnVuY3Rpb24gbmFtZS4gIEV4YW1wbGVzOgorCisgICAgPG9iaj4ucXNvcnQgLT4gY2FsbGFibGUgb2JqZWN0CisgICAgPG9iaj5bJ3Fzb3J0J10gLT4gY2FsbGFibGUgb2JqZWN0CisKKyAgICBDYWxsaW5nIHRoZSBmdW5jdGlvbnMgcmVsZWFzZXMgdGhlIFB5dGhvbiBHSUwgZHVyaW5nIHRoZSBjYWxsIGFuZAorICAgIHJlYXF1aXJlcyBpdCBhZnRlcndhcmRzLgorICAgICIiIgorICAgIGNsYXNzIF9GdW5jUHRyKF9DRnVuY1B0cik6CisgICAgICAgIF9mbGFnc18gPSBfRlVOQ0ZMQUdfQ0RFQ0wKKyAgICAgICAgX3Jlc3R5cGVfID0gY19pbnQgIyBkZWZhdWx0LCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBpbnN0YW5jZXMKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2RlPVJUTERfTE9DQUwsIGhhbmRsZT1Ob25lKToKKyAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKKyAgICAgICAgaWYgaGFuZGxlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9oYW5kbGUgPSBfZGxvcGVuKHNlbGYuX25hbWUsIG1vZGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9oYW5kbGUgPSBoYW5kbGUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8JXMgJyVzJywgaGFuZGxlICV4IGF0ICV4PiIgJSBcCisgICAgICAgICAgICAgICAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX25hbWUsCisgICAgICAgICAgICAgICAgKHNlbGYuX2hhbmRsZSAmIChfc3lzLm1heGludCoyICsgMSkpLAorICAgICAgICAgICAgICAgIGlkKHNlbGYpKQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ19fJykgYW5kIG5hbWUuZW5kc3dpdGgoJ19fJyk6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgbmFtZQorICAgICAgICByZXR1cm4gc2VsZi5fX2dldGl0ZW1fXyhuYW1lKQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgorICAgICAgICBmdW5jID0gc2VsZi5fRnVuY1B0cihuYW1lLCBzZWxmKQorICAgICAgICBmdW5jLl9fbmFtZV9fID0gbmFtZQorICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGZ1bmMpCisgICAgICAgIHJldHVybiBmdW5jCisKK2NsYXNzIFB5RExMKENETEwpOgorICAgICIiIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgUHl0aG9uIGxpYnJhcnkgaXRzZWxmLiAgSXQgYWxsb3dzIHRvCisgICAgYWNjZXNzIFB5dGhvbiBBUEkgZnVuY3Rpb25zLiAgVGhlIEdJTCBpcyBub3QgcmVsZWFzZWQsIGFuZAorICAgIFB5dGhvbiBleGNlcHRpb25zIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KKyAgICAiIiIKKyAgICBjbGFzcyBfRnVuY1B0cihfQ0Z1bmNQdHIpOgorICAgICAgICBfZmxhZ3NfID0gX0ZVTkNGTEFHX0NERUNMIHwgX0ZVTkNGTEFHX1BZVEhPTkFQSQorICAgICAgICBfcmVzdHlwZV8gPSBjX2ludCAjIGRlZmF1bHQsIGNhbiBiZSBvdmVycmlkZGVuIGluIGluc3RhbmNlcworCitpZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CisgICAgICAgIAorICAgIGNsYXNzIFdpbkRMTChDRExMKToKKyAgICAgICAgIiIiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgZGxsIGV4cG9ydGluZyBmdW5jdGlvbnMgdXNpbmcgdGhlCisgICAgICAgIFdpbmRvd3Mgc3RkY2FsbCBjYWxsaW5nIGNvbnZlbnRpb24uCisgICAgICAgICIiIgorICAgICAgICBjbGFzcyBfRnVuY1B0cihfQ0Z1bmNQdHIpOgorICAgICAgICAgICAgX2ZsYWdzXyA9IF9GVU5DRkxBR19TVERDQUxMCisgICAgICAgICAgICBfcmVzdHlwZV8gPSBjX2ludCAjIGRlZmF1bHQsIGNhbiBiZSBvdmVycmlkZGVuIGluIGluc3RhbmNlcworCisgICAgIyBYWFggSG0sIHdoYXQgYWJvdXQgSFJFU1VMVCBhcyBub3JtYWwgcGFyYW1ldGVyPworICAgICMgTXVzdG4ndCBpdCBkZXJpdmUgZnJvbSBjX2xvbmcgdGhlbj8KKyAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IF9jaGVja19IUkVTVUxULCBfU2ltcGxlQ0RhdGEKKyAgICBjbGFzcyBIUkVTVUxUKF9TaW1wbGVDRGF0YSk6CisgICAgICAgIF90eXBlXyA9ICJsIgorICAgICAgICAjIF9jaGVja19yZXR2YWxfIGlzIGNhbGxlZCB3aXRoIHRoZSBmdW5jdGlvbidzIHJlc3VsdCB3aGVuIGl0CisgICAgICAgICMgaXMgdXNlZCBhcyByZXN0eXBlLiAgSXQgY2hlY2tzIGZvciB0aGUgRkFJTEVEIGJpdCwgYW5kCisgICAgICAgICMgcmFpc2VzIGEgV2luZG93c0Vycm9yIGlmIGl0IGlzIHNldC4KKyAgICAgICAgIworICAgICAgICAjIFRoZSBfY2hlY2tfcmV0dmFsXyBtZXRob2QgaXMgaW1wbGVtZW50ZWQgaW4gQywgc28gdGhhdCB0aGUKKyAgICAgICAgIyBtZXRob2QgZGVmaW5pdGlvbiBpdHNlbGYgaXMgbm90IGluY2x1ZGVkIGluIHRoZSB0cmFjZWJhY2sKKyAgICAgICAgIyB3aGVuIGl0IHJhaXNlcyBhbiBlcnJvciAtIHRoYXQgaXMgd2hhdCB3ZSB3YW50IChhbmQgUHl0aG9uCisgICAgICAgICMgZG9lc24ndCBoYXZlIGEgd2F5IHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiBpbiB0aGUgY2FsbGVyJ3MKKyAgICAgICAgIyBmcmFtZSkuCisgICAgICAgIF9jaGVja19yZXR2YWxfID0gX2NoZWNrX0hSRVNVTFQKKyAgICAgICAgCisgICAgY2xhc3MgT2xlRExMKENETEwpOgorICAgICAgICAiIiJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBkbGwgZXhwb3J0aW5nIGZ1bmN0aW9ucyB1c2luZyB0aGUKKyAgICAgICAgV2luZG93cyBzdGRjYWxsIGNhbGxpbmcgY29udmVudGlvbiwgYW5kIHJldHVybmluZyBIUkVTVUxULgorICAgICAgICBIUkVTVUxUIGVycm9yIHZhbHVlcyBhcmUgYXV0b21hdGljYWxseSByYWlzZWQgYXMgV2luZG93c0Vycm9yCisgICAgICAgIGV4Y2VwdGlvbnMuCisgICAgICAgICIiIgorICAgICAgICBjbGFzcyBfRnVuY1B0cihfQ0Z1bmNQdHIpOgorICAgICAgICAgICAgX2ZsYWdzXyA9IF9GVU5DRkxBR19TVERDQUxMCisgICAgICAgICAgICBfcmVzdHlwZV8gPSBIUkVTVUxUCisKK2NkbGwgPSBMaWJyYXJ5TG9hZGVyKENETEwpCitweWRsbCA9IExpYnJhcnlMb2FkZXIoUHlETEwpCisKK2lmIF9vcy5uYW1lIGluICgibnQiLCAiY2UiKToKKyAgICBweXRob25hcGkgPSBQeURMTCgicHl0aG9uIGRsbCIsIE5vbmUsIF9zeXMuZGxsaGFuZGxlKQorZWxpZiBfc3lzLnBsYXRmb3JtID09ICJjeWd3aW4iOgorICAgIHB5dGhvbmFwaSA9IFB5RExMKCJsaWJweXRob24lZC4lZC5kbGwiICUgX3N5cy52ZXJzaW9uX2luZm9bOjJdKQorZWxzZToKKyAgICBweXRob25hcGkgPSBQeURMTChOb25lKQorCisKK2lmIF9vcy5uYW1lIGluICgibnQiLCAiY2UiKToKKyAgICB3aW5kbGwgPSBMaWJyYXJ5TG9hZGVyKFdpbkRMTCkKKyAgICBvbGVkbGwgPSBMaWJyYXJ5TG9hZGVyKE9sZURMTCkKKworICAgIGlmIF9vcy5uYW1lID09ICJudCI6CisgICAgICAgIEdldExhc3RFcnJvciA9IHdpbmRsbC5rZXJuZWwzMi5HZXRMYXN0RXJyb3IKKyAgICBlbHNlOgorICAgICAgICBHZXRMYXN0RXJyb3IgPSB3aW5kbGwuY29yZWRsbC5HZXRMYXN0RXJyb3IKKworICAgIGRlZiBXaW5FcnJvcihjb2RlPU5vbmUsIGRlc2NyPU5vbmUpOgorICAgICAgICBpZiBjb2RlIGlzIE5vbmU6CisgICAgICAgICAgICBjb2RlID0gR2V0TGFzdEVycm9yKCkKKyAgICAgICAgaWYgZGVzY3IgaXMgTm9uZToKKyAgICAgICAgICAgIGRlc2NyID0gRm9ybWF0RXJyb3IoY29kZSkuc3RyaXAoKQorICAgICAgICByZXR1cm4gV2luZG93c0Vycm9yKGNvZGUsIGRlc2NyKQorCitfcG9pbnRlcl90eXBlX2NhY2hlW05vbmVdID0gY192b2lkX3AKKworIyBmdW5jdGlvbnMKKworZnJvbSBfY3R5cGVzIGltcG9ydCBfbWVtbW92ZV9hZGRyLCBfbWVtc2V0X2FkZHIsIF9zdHJpbmdfYXRfYWRkciwgY2FzdAorCitpZiBzaXplb2YoY191aW50KSA9PSBzaXplb2YoY192b2lkX3ApOgorICAgIGNfc2l6ZV90ID0gY191aW50CitlbGlmIHNpemVvZihjX3Vsb25nKSA9PSBzaXplb2YoY192b2lkX3ApOgorICAgIGNfc2l6ZV90ID0gY191bG9uZworCisjIyB2b2lkICptZW1tb3ZlKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworbWVtbW92ZSA9IENGVU5DVFlQRShjX3ZvaWRfcCwgY192b2lkX3AsIGNfdm9pZF9wLCBjX3NpemVfdCkoX21lbW1vdmVfYWRkcikKKworIyMgdm9pZCAqbWVtc2V0KHZvaWQgKiwgaW50LCBzaXplX3QpCittZW1zZXQgPSBDRlVOQ1RZUEUoY192b2lkX3AsIGNfdm9pZF9wLCBjX2ludCwgY19zaXplX3QpKF9tZW1zZXRfYWRkcikKKworX3N0cmluZ19hdCA9IENGVU5DVFlQRShweV9vYmplY3QsIGNfdm9pZF9wLCBjX2ludCkoX3N0cmluZ19hdF9hZGRyKQorZGVmIHN0cmluZ19hdChwdHIsIHNpemU9MCk6CisgICAgIiIic3RyaW5nX2F0KGFkZHJbLCBzaXplXSkgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gdGhlIHN0cmluZyBhdCBhZGRyLiIiIgorICAgIHJldHVybiBfc3RyaW5nX2F0KHB0ciwgc2l6ZSkKKwordHJ5OgorICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgX3dzdHJpbmdfYXRfYWRkcgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgX3dzdHJpbmdfYXQgPSBDRlVOQ1RZUEUocHlfb2JqZWN0LCBjX3ZvaWRfcCwgY19pbnQpKF93c3RyaW5nX2F0X2FkZHIpCisgICAgZGVmIHdzdHJpbmdfYXQocHRyLCBzaXplPTApOgorICAgICAgICAiIiJ3c3RyaW5nX2F0KGFkZHJbLCBzaXplXSkgLT4gc3RyaW5nCisKKyAgICAgICAgUmV0dXJuIHRoZSBzdHJpbmcgYXQgYWRkci4iIiIKKyAgICAgICAgcmV0dXJuIF93c3RyaW5nX2F0KHB0ciwgc2l6ZSkKKyAgICAKKworaWYgX29zLm5hbWUgPT0gIm50IjogIyBDT00gc3R1ZmYKKyAgICBkZWYgRGxsR2V0Q2xhc3NPYmplY3QocmNsc2lkLCByaWlkLCBwcHYpOgorICAgICAgICAjIEZpcnN0IGFzayBjdHlwZXMuY29tLnNlcnZlciB0aGFuIGNvbXR5cGVzLnNlcnZlciBmb3IgdGhlCisgICAgICAgICMgY2xhc3Mgb2JqZWN0LgorCisgICAgICAgICMgdHJpY2sgcHkyZXhlIGJ5IGRvaW5nIGR5bmFtaWMgaW1wb3J0cworICAgICAgICByZXN1bHQgPSAtMjE0NzIyMTIzMSAjIENMQVNTX0VfQ0xBU1NOT1RBVkFJTEFCTEUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3Rjb20gPSBfX2ltcG9ydF9fKCJjdHlwZXMuY29tLnNlcnZlciIsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnKiddKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXN1bHQgPSBjdGNvbS5EbGxHZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdikKKworICAgICAgICBpZiByZXN1bHQgPT0gLTIxNDcyMjEyMzE6ICMgQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNjb20gPSBfX2ltcG9ydF9fKCJjb210eXBlcy5zZXJ2ZXIiLCBnbG9iYWxzKCksIGxvY2FscygpLCBbJyonXSkKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNjb20uRGxsR2V0Q2xhc3NPYmplY3QocmNsc2lkLCByaWlkLCBwcHYpCisKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIERsbENhblVubG9hZE5vdygpOgorICAgICAgICAjIEZpcnN0IGFzayBjdHlwZXMuY29tLnNlcnZlciB0aGFuIGNvbXR5cGVzLnNlcnZlciBpZiB3ZSBjYW4gdW5sb2FkIG9yIG5vdC4KKyAgICAgICAgIyB0cmljayBweTJleGUgYnkgZG9pbmcgZHluYW1pYyBpbXBvcnRzCisgICAgICAgIHJlc3VsdCA9IDAgIyBTX09LCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN0Y29tID0gX19pbXBvcnRfXygiY3R5cGVzLmNvbS5zZXJ2ZXIiLCBnbG9iYWxzKCksIGxvY2FscygpLCBbJyonXSkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0ID0gY3Rjb20uRGxsQ2FuVW5sb2FkTm93KCkKKyAgICAgICAgICAgIGlmIHJlc3VsdCAhPSAwOiAjICE9IFNfT0sKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2NvbSA9IF9faW1wb3J0X18oImNvbXR5cGVzLnNlcnZlciIsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnKiddKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBjY29tLkRsbENhblVubG9hZE5vdygpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCitmcm9tIGN0eXBlcy5fZW5kaWFuIGltcG9ydCBCaWdFbmRpYW5TdHJ1Y3R1cmUsIExpdHRsZUVuZGlhblN0cnVjdHVyZQorCisjIEZpbGwgaW4gc3BlY2lmaWNhbGx5LXNpemVkIHR5cGVzCitjX2ludDggPSBjX2J5dGUKK2NfdWludDggPSBjX3VieXRlCitmb3Iga2luZCBpbiBbY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19sb25nbG9uZ106CisgICAgaWYgc2l6ZW9mKGtpbmQpID09IDI6IGNfaW50MTYgPSBraW5kCisgICAgZWxpZiBzaXplb2Yoa2luZCkgPT0gNDogY19pbnQzMiA9IGtpbmQKKyAgICBlbGlmIHNpemVvZihraW5kKSA9PSA4OiBjX2ludDY0ID0ga2luZAorZm9yIGtpbmQgaW4gW2NfdXNob3J0LCBjX3VpbnQsIGNfdWxvbmcsIGNfdWxvbmdsb25nXToKKyAgICBpZiBzaXplb2Yoa2luZCkgPT0gMjogY191aW50MTYgPSBraW5kCisgICAgZWxpZiBzaXplb2Yoa2luZCkgPT0gNDogY191aW50MzIgPSBraW5kCisgICAgZWxpZiBzaXplb2Yoa2luZCkgPT0gODogY191aW50NjQgPSBraW5kCitkZWwoa2luZCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvX2VuZGlhbi5weSBiL0xpYi9jdHlwZXMvX2VuZGlhbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzM5NGI2Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy9fZW5kaWFuLnB5CkBAIC0wLDAgKzEsNTggQEAKK2ltcG9ydCBzeXMKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK19hcnJheV90eXBlID0gdHlwZShjX2ludCAqIDMpCisKK2RlZiBfb3RoZXJfZW5kaWFuKHR5cCk6CisgICAgIiIiUmV0dXJuIHRoZSB0eXBlIHdpdGggdGhlICdvdGhlcicgYnl0ZSBvcmRlci4gIFNpbXBsZSB0eXBlcyBsaWtlCisgICAgY19pbnQgYW5kIHNvIG9uIGFscmVhZHkgaGF2ZSBfX2N0eXBlX2JlX18gYW5kIF9fY3R5cGVfbGVfXworICAgIGF0dHJpYnV0ZXMgd2hpY2ggY29udGFpbiB0aGUgdHlwZXMsIGZvciBtb3JlIGNvbXBsaWNhdGVkIHR5cGVzCisgICAgb25seSBhcnJheXMgYXJlIHN1cHBvcnRlZC4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBnZXRhdHRyKHR5cCwgX09USEVSX0VORElBTikKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIGlmIHR5cGUodHlwKSA9PSBfYXJyYXlfdHlwZToKKyAgICAgICAgICAgIHJldHVybiBfb3RoZXJfZW5kaWFuKHR5cC5fdHlwZV8pICogdHlwLl9sZW5ndGhfCisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiVGhpcyB0eXBlIGRvZXMgbm90IHN1cHBvcnQgb3RoZXIgZW5kaWFuOiAlcyIgJSB0eXApCisKK2NsYXNzIF9zd2FwcGVkX21ldGEodHlwZShTdHJ1Y3R1cmUpKToKKyAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgYXR0cm5hbWUsIHZhbHVlKToKKyAgICAgICAgaWYgYXR0cm5hbWUgPT0gIl9maWVsZHNfIjoKKyAgICAgICAgICAgIGZpZWxkcyA9IFtdCisgICAgICAgICAgICBmb3IgZGVzYyBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICBuYW1lID0gZGVzY1swXQorICAgICAgICAgICAgICAgIHR5cCA9IGRlc2NbMV0KKyAgICAgICAgICAgICAgICByZXN0ID0gZGVzY1syOl0KKyAgICAgICAgICAgICAgICBmaWVsZHMuYXBwZW5kKChuYW1lLCBfb3RoZXJfZW5kaWFuKHR5cCkpICsgcmVzdCkKKyAgICAgICAgICAgIHZhbHVlID0gZmllbGRzCisgICAgICAgIHN1cGVyKF9zd2FwcGVkX21ldGEsIHNlbGYpLl9fc2V0YXR0cl9fKGF0dHJuYW1lLCB2YWx1ZSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIE5vdGU6IFRoZSBTdHJ1Y3R1cmUgbWV0YWNsYXNzIGNoZWNrcyBmb3IgdGhlICpwcmVzZW5jZSogKG5vdCB0aGUKKyMgdmFsdWUhKSBvZiBhIF9zd2FwcGVkX2J5dGVzXyBhdHRyaWJ1dGUgdG8gZGV0ZXJtaW5lIHRoZSBiaXQgb3JkZXIgaW4KKyMgc3RydWN0dXJlcyBjb250YWluaW5nIGJpdCBmaWVsZHMuCisKK2lmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgX09USEVSX0VORElBTiA9ICJfX2N0eXBlX2JlX18iCisKKyAgICBMaXR0bGVFbmRpYW5TdHJ1Y3R1cmUgPSBTdHJ1Y3R1cmUKKworICAgIGNsYXNzIEJpZ0VuZGlhblN0cnVjdHVyZShTdHJ1Y3R1cmUpOgorICAgICAgICAiIiJTdHJ1Y3R1cmUgd2l0aCBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIiIiIKKyAgICAgICAgX19tZXRhY2xhc3NfXyA9IF9zd2FwcGVkX21ldGEKKyAgICAgICAgX3N3YXBwZWRieXRlc18gPSBOb25lCisKK2VsaWYgc3lzLmJ5dGVvcmRlciA9PSAiYmlnIjoKKyAgICBfT1RIRVJfRU5ESUFOID0gIl9fY3R5cGVfbGVfXyIKKworICAgIEJpZ0VuZGlhblN0cnVjdHVyZSA9IFN0cnVjdHVyZQorICAgIGNsYXNzIExpdHRsZUVuZGlhblN0cnVjdHVyZShTdHJ1Y3R1cmUpOgorICAgICAgICAiIiJTdHJ1Y3R1cmUgd2l0aCBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIiIiIKKyAgICAgICAgX19tZXRhY2xhc3NfXyA9IF9zd2FwcGVkX21ldGEKKyAgICAgICAgX3N3YXBwZWRieXRlc18gPSBOb25lCisKK2Vsc2U6CisgICAgcmFpc2UgUnVudGltZUVycm9yKCJJbnZhbGlkIGJ5dGVvcmRlciIpCisKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvX2xvYWRlci5weSBiL0xpYi9jdHlwZXMvX2xvYWRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWVlYzhlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy9fbG9hZGVyLnB5CkBAIC0wLDAgKzEsMjYyIEBACisjIFdPUksgSU4gUFJPR1JFU1MhICBETyBOT1QgKHlldCkgVVNFIQoraW1wb3J0IHN5cywgb3MKK2ltcG9ydCBjdHlwZXMKKworX19hbGxfXyA9IFsiTGlicmFyeUxvYWRlciIsICJSVExEX0xPQ0FMIiwgIlJUTERfR0xPQkFMIl0KKworaWYgb3MubmFtZSBpbiAoIm50IiwgImNlIik6CisgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBMb2FkTGlicmFyeSBhcyBkbG9wZW4KKyAgICBSVExEX0xPQ0FMID0gUlRMRF9HTE9CQUwgPSBOb25lCitlbHNlOgorICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgZGxvcGVuLCBSVExEX0xPQ0FMLCBSVExEX0dMT0JBTAorCisjIF9maW5kTGliKG5hbWUpIHJldHVybnMgYW4gaXRlcmFibGUgb2YgcG9zc2libGUgbmFtZXMgZm9yIGEgbGlicmFyeS4KK2lmIG9zLm5hbWUgaW4gKCJudCIsICJjZSIpOgorICAgIGRlZiBfZmluZExpYihuYW1lKToKKyAgICAgICAgcmV0dXJuIFtuYW1lXQorCitpZiBvcy5uYW1lID09ICJwb3NpeCIgYW5kIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICBmcm9tIGN0eXBlcy5tYWNob2xpYi5keWxkIGltcG9ydCBkeWxkX2ZpbmQgYXMgX2R5bGRfZmluZAorICAgIGRlZiBfZmluZExpYihuYW1lKToKKyAgICAgICAgcG9zc2libGUgPSBbJ2xpYiVzLmR5bGliJyAlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICclcy5keWxpYicgJSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAnJXMuZnJhbWV3b3JrLyVzJyAlIChuYW1lLCBuYW1lKV0KKyAgICAgICAgZm9yIG5hbWUgaW4gcG9zc2libGU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFtfZHlsZF9maW5kKG5hbWUpXQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcmV0dXJuIFtdCisKK2VsaWYgb3MubmFtZSA9PSAicG9zaXgiOgorICAgICMgQW5kcmVhcyBEZWdlcnQncyBmaW5kIGZ1bmN0aW9ucywgdXNpbmcgZ2NjLCAvc2Jpbi9sZGNvbmZpZywgb2JqZHVtcAorICAgIGltcG9ydCByZSwgdGVtcGZpbGUKKworICAgIGRlZiBfZmluZExpYl9nY2MobmFtZSk6CisgICAgICAgIGV4cHIgPSAnW15cKFwpXHNdKmxpYiVzXC5bXlwoXClcc10qJyAlIG5hbWUKKyAgICAgICAgY21kID0gJ2lmIHR5cGUgZ2NjICY+L2Rldi9udWxsOyB0aGVuIENDPWdjYzsgZWxzZSBDQz1jYzsgZmk7JyBcCisgICAgICAgICAgICAgICckQ0MgLVdsLC10IC1vIC9kZXYvbnVsbCAyPiYxIC1sJyArIG5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmRvdXQsIG91dGZpbGUgPSAgdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgICAgICBmZCA9IG9zLnBvcGVuKGNtZCkKKyAgICAgICAgICAgIHRyYWNlID0gZmQucmVhZCgpCisgICAgICAgICAgICBlcnIgPSBmZC5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKG91dGZpbGUpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmVzID0gcmUuc2VhcmNoKGV4cHIsIHRyYWNlKQorICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHJlcy5ncm91cCgwKQorCisgICAgZGVmIF9maW5kTGliX2xkKG5hbWUpOgorICAgICAgICBleHByID0gJy9bXlwoXClcc10qbGliJXNcLlteXChcKVxzXSonICUgbmFtZQorICAgICAgICByZXMgPSByZS5zZWFyY2goZXhwciwgb3MucG9wZW4oJy9zYmluL2xkY29uZmlnIC1wIDI+L2Rldi9udWxsJykucmVhZCgpKQorICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHJlcy5ncm91cCgwKQorCisgICAgZGVmIF9nZXRfc29uYW1lKGYpOgorICAgICAgICBjbWQgPSAib2JqZHVtcCAtcCAtaiAuZHluYW1pYyAyPi9kZXYvbnVsbCAiICsgZgorICAgICAgICByZXMgPSByZS5zZWFyY2gocidcc1NPTkFNRVxzKyhbXlxzXSspJywgb3MucG9wZW4oY21kKS5yZWFkKCkpCisgICAgICAgIGlmIG5vdCByZXM6CisgICAgICAgICAgICByZXR1cm4gZgorICAgICAgICByZXR1cm4gcmVzLmdyb3VwKDEpCisKKyAgICBkZWYgX2ZpbmRMaWIobmFtZSk6CisgICAgICAgIGxpYiA9IF9maW5kTGliX2xkKG5hbWUpCisgICAgICAgIGlmIG5vdCBsaWI6CisgICAgICAgICAgICBsaWIgPSBfZmluZExpYl9nY2MobmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBsaWI6CisgICAgICAgICAgICAgICAgcmV0dXJuIFtuYW1lXQorICAgICAgICByZXR1cm4gW19nZXRfc29uYW1lKGxpYildCisKK2NsYXNzIExpYnJhcnlMb2FkZXIob2JqZWN0KToKKyAgICAiIiJMb2FkZXIgZm9yIHNoYXJlZCBsaWJyYXJpZXMuCisKKyAgICBTaGFyZWQgbGlicmFyaWVzIGFyZSBhY2Nlc3NlZCB3aGVuIGNvbXBpbGluZy9saW5raW5nIGEgcHJvZ3JhbSwKKyAgICBhbmQgd2hlbiB0aGUgcHJvZ3JhbSBpcyBydW4uICBUaGUgcHVycG9zZSBvZiB0aGUgJ2ZpbmQnIG1ldGhvZCBpcworICAgIHRvIGxvY2F0ZSBhIGxpYnJhcnkgc2ltaWxhciB0byB3aGF0IHRoZSBjb21waWxlciBkb2VzIChvbiBtYWNoaW5lcworICAgIHdpdGggc2V2ZXJhbCB2ZXJzaW9ucyBvZiBhIHNoYXJlZCBsaWJyYXJ5IHRoZSBtb3N0IHJlY2VudCBzaG91bGQKKyAgICBiZSBsb2FkZWQpLCB3aGlsZSAnbG9hZCcgYWN0cyBsaWtlIHdoZW4gdGhlIHByb2dyYW0gaXMgcnVuLCBhbmQKKyAgICB1c2VzIHRoZSBydW50aW1lIGxvYWRlciBkaXJlY3RseS4gICdsb2FkX3ZlcnNpb24nIHdvcmtzIGxpa2UKKyAgICAnbG9hZCcgYnV0IHRyaWVzIHRvIGJlIHBsYXRmb3JtIGluZGVwZW5kZW5kIChmb3IgY2FzZXMgd2hlcmUgdGhpcworICAgIG1ha2VzIHNlbnNlKS4gIExvYWRpbmcgdmlhIGF0dHJpYnV0ZSBhY2Nlc3MgaXMgYSBzaG9ydGhhbmQKKyAgICBub3RhdGlvbiBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgaW50ZXJhY3RpdmUgdXNlLiIiIgorCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGxsdHlwZSwgbW9kZT1SVExEX0xPQ0FMKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbGlicmFyeSBsb2FkZXIgaW5zdGFuY2Ugd2hpY2ggbG9hZHMgbGlicmFyaWVzIGJ5CisgICAgICAgIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mICdkbGx0eXBlJy4gICdtb2RlJyBjYW4gYmUgUlRMRF9MT0NBTAorICAgICAgICBvciBSVExEX0dMT0JBTCwgaXQgaXMgaWdub3JlZCBvbiBXaW5kb3dzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fZGxsdHlwZSA9IGRsbHR5cGUKKyAgICAgICAgc2VsZi5fbW9kZSA9IG1vZGUKKworICAgIGRlZiBsb2FkKHNlbGYsIGxpYm5hbWUsIG1vZGU9Tm9uZSk6CisgICAgICAgICIiIkxvYWQgYW5kIHJldHVybiB0aGUgbGlicmFyeSB3aXRoIHRoZSBnaXZlbiBsaWJuYW1lLiAgT24KKyAgICAgICAgbW9zdCBzeXN0ZW1zICdsaWJuYW1lJyBpcyB0aGUgZmlsZW5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5OworICAgICAgICB3aGVuIGl0J3Mgbm90IGEgcGF0aG5hbWUgaXQgd2lsbCBiZSBzZWFyY2hlZCBpbiBhIHN5c3RlbQorICAgICAgICBkZXBlbmRlbmQgbGlzdCBvZiBsb2NhdGlvbnMgKG9uIG1hbnkgc3lzdGVtcyBhZGRpdGlvbmFsIHNlYXJjaAorICAgICAgICBwYXRocyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGFuIGVudmlyb25tZW50IHZhcmlhYmxlKS4gIFNvbWV0aW1lcworICAgICAgICB0aGUgZXh0ZW5zaW9uIChsaWtlICcuZGxsJyBvbiBXaW5kb3dzKSBjYW4gYmUgb21pdHRlZC4KKworICAgICAgICAnbW9kZScgYWxsb3dzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZsYWdzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgICAgY29uc3RydWN0b3IsIGl0IGlzIGlnbm9yZWQgb24gV2luZG93cy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG1vZGUgaXMgTm9uZToKKyAgICAgICAgICAgIG1vZGUgPSBzZWxmLl9tb2RlCisgICAgICAgIHJldHVybiBzZWxmLl9sb2FkKGxpYm5hbWUsIG1vZGUpCisKKyAgICBkZWYgbG9hZF9saWJyYXJ5KHNlbGYsIGxpYm5hbWUsIG1vZGU9Tm9uZSk6CisgICAgICAgICIiIkxvYWQgYW5kIHJldHVybiB0aGUgbGlicmFyeSB3aXRoIHRoZSBnaXZlbiBsaWJuYW1lLiAgVGhpcworICAgICAgICBtZXRob2QgcGFzc2VzIHRoZSBzcGVjaWZpZWQgJ2xpYm5hbWUnIGRpcmVjdGx5IHRvIHRoZQorICAgICAgICBwbGF0Zm9ybSdzIGxpYnJhcnkgbG9hZGluZyBmdW5jdGlvbiAoZGxvcGVuLCBvciBMb2FkTGlicmFyeSkuCisKKyAgICAgICAgJ21vZGUnIGFsbG93cyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBmbGFncyBzcGVjaWZpZWQgaW4gdGhlCisgICAgICAgIGNvbnN0cnVjdG9yLCBpdCBpcyBpZ25vcmVkIG9uIFdpbmRvd3MuCisgICAgICAgICIiIgorICAgICAgICBpZiBtb2RlIGlzIE5vbmU6CisgICAgICAgICAgICBtb2RlID0gc2VsZi5fbW9kZQorICAgICAgICByZXR1cm4gc2VsZi5fZGxsdHlwZShsaWJuYW1lLCBtb2RlKQorCisgICAgIyBhbGlhcyBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJsaXR5CisgICAgTG9hZExpYnJhcnkgPSBsb2FkX2xpYnJhcnkKKworICAgICMgSGVscGVycyBmb3IgbG9hZCBhbmQgbG9hZF92ZXJzaW9uIC0gYXNzZW1ibGVzIGEgZmlsZW5hbWUgZnJvbSBuYW1lIGFuZCBmaWxlbmFtZQorICAgIGlmIG9zLm5hbWUgaW4gKCJudCIsICJjZSIpOgorICAgICAgICAjIFdpbmRvd3MgKFhYWCB3aGF0IGFib3V0IGN5Z3dpbj8pCisgICAgICAgIGRlZiBfcGxhdF9sb2FkX3ZlcnNpb24oc2VsZiwgbmFtZSwgdmVyc2lvbiwgbW9kZSk6CisgICAgICAgICAgICAjIG5vdCBzdXJlIGlmIHRoaXMgbWFrZXMgc2Vuc2UKKyAgICAgICAgICAgIGlmIHZlcnNpb24gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZChuYW1lICsgdmVyc2lvbiwgbW9kZSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWQobmFtZSwgbW9kZSkKKworICAgICAgICBfbG9hZCA9IGxvYWRfbGlicmFyeQorCisgICAgZWxpZiBvcy5uYW1lID09ICJwb3NpeCIgYW5kIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgIyBNYWMgT1MgWAorICAgICAgICBkZWYgX3BsYXRfbG9hZF92ZXJzaW9uKHNlbGYsIG5hbWUsIHZlcnNpb24sIG1vZGUpOgorICAgICAgICAgICAgaWYgdmVyc2lvbjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkKCJsaWIlcy4lcy5keWxpYiIgJSAobmFtZSwgdmVyc2lvbiksIG1vZGUpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkKCJsaWIlcy5keWxpYiIgJSBuYW1lLCBtb2RlKQorCisgICAgICAgIGRlZiBfbG9hZChzZWxmLCBsaWJuYW1lLCBtb2RlKToKKyAgICAgICAgICAgICMgX2R5bGRfZmluZCByYWlzZXMgVmFsdWVFcnJvciwgY29udmVydCB0aGlzIGludG8gT1NFcnJvcgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhdGhuYW1lID0gX2R5bGRfZmluZChsaWJuYW1lKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgT1NFcnJvcigiTGlicmFyeSAlcyBjb3VsZCBub3QgYmUgZm91bmQiICUgbGlibmFtZSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRfbGlicmFyeShwYXRobmFtZSwgbW9kZSkKKyAgICAgICAgICAgIAorICAgIGVsaWYgb3MubmFtZSA9PSAicG9zaXgiOgorICAgICAgICAjIFBvc2l4CisgICAgICAgIGRlZiBfcGxhdF9sb2FkX3ZlcnNpb24oc2VsZiwgbmFtZSwgdmVyc2lvbiwgbW9kZSk6CisgICAgICAgICAgICBpZiB2ZXJzaW9uOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWQoImxpYiVzLnNvLiVzIiAlIChuYW1lLCB2ZXJzaW9uKSwgbW9kZSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWQoImxpYiVzLnNvIiAlIG5hbWUsIG1vZGUpCisKKyAgICAgICAgX2xvYWQgPSBsb2FkX2xpYnJhcnkKKworICAgIGVsc2U6CisgICAgICAgICMgT3RoZXJzLCBUQkQKKyAgICAgICAgZGVmIF9wbGF0X2xvYWRfdmVyc2lvbihzZWxmLCBuYW1lLCB2ZXJzaW9uLCBtb2RlPU5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZChuYW1lLCBtb2RlKQorCisgICAgICAgIF9sb2FkID0gbG9hZF9saWJyYXJ5CisKKyAgICBkZWYgbG9hZF92ZXJzaW9uKHNlbGYsIG5hbWUsIHZlcnNpb249Tm9uZSwgbW9kZT1Ob25lKToKKyAgICAgICAgIiIiQnVpbGQgYSAoc3lzdGVtIGRlcGVuZGVuZCkgZmlsZW5hbWUgZnJvbSAnbmFtZScgYW5kCisgICAgICAgICd2ZXJzaW9uJywgdGhlbiBsb2FkIGFuZCByZXR1cm4gaXQuICAnbmFtZScgaXMgdGhlIGxpYnJhcnkKKyAgICAgICAgbmFtZSB3aXRob3V0IGFueSBwcmVmaXggbGlrZSAnbGliJyBhbmQgc3VmZml4IGxpa2UgJy5zbycgb3IKKyAgICAgICAgJy5keWxpYicuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpZiBhIGxpYnJhcnkgaXMKKyAgICAgICAgYXZhaWxhYmxlIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMsIHVzaW5nIHRoZSBwYXJ0aWN1bGFyIG5hbWluZworICAgICAgICBjb252ZW50aW9uIG9mIGVhY2ggcGxhdGZvcm0uCisKKyAgICAgICAgJ21vZGUnIGFsbG93cyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBmbGFncyBzcGVjaWZpZWQgaW4gdGhlCisgICAgICAgIGNvbnN0cnVjdG9yLCBpdCBpcyBpZ25vcmVkIG9uIFdpbmRvd3MuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fcGxhdF9sb2FkX3ZlcnNpb24obmFtZSwgdmVyc2lvbiwgbW9kZSkKKworICAgIGRlZiBmaW5kKHNlbGYsIG5hbWUsIG1vZGU9Tm9uZSk6CisgICAgICAgICIiIlRyeSB0byBmaW5kIGEgbGlicmFyeSwgbG9hZCBhbmQgcmV0dXJuIGl0LiAgJ25hbWUnIGlzIHRoZQorICAgICAgICBsaWJyYXJ5IG5hbWUgd2l0aG91dCBhbnkgcHJlZml4IGxpa2UgJ2xpYicsIHN1ZmZpeCBsaWtlICcuc28nLAorICAgICAgICAnLmR5bGliJyBvciB2ZXJzaW9uIG51bWJlciAodGhpcyBpcyB0aGUgZm9ybSB1c2VkIGZvciB0aGUKKyAgICAgICAgcG9zaXggbGlua2VyIG9wdGlvbiAnLWwnKS4KKworICAgICAgICAnbW9kZScgYWxsb3dzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZsYWdzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgICAgY29uc3RydWN0b3IsIGl0IGlzIGlnbm9yZWQgb24gV2luZG93cy4KKworICAgICAgICBPbiB3aW5kb3dzLCB0aGlzIG1ldGhvZCBkb2VzIHRoZSBzYW1lIGFzIHRoZSAnbG9hZCcgbWV0aG9kLgorCisgICAgICAgIE9uIG90aGVyIHBsYXRmb3JtcywgdGhpcyBmdW5jdGlvbiBtaWdodCBjYWxsIG90aGVyIHByb2dyYW1zCisgICAgICAgIGxpa2UgdGhlIGNvbXBpbGVyIHRvIGZpbmQgdGhlIGxpYnJhcnkuICBXaGVuIHVzaW5nIGN0eXBlcyB0bworICAgICAgICB3cml0ZSBhIHNoYXJlZCBsaWJyYXJ5IHdyYXBwaW5nLCBjb25zaWRlciB1c2luZyAubG9hZCgpIG9yCisgICAgICAgIC5sb2FkX3ZlcnNpb24oKSBpbnN0ZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGxpYm5hbWUgaW4gX2ZpbmRMaWIobmFtZSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZChsaWJuYW1lLCBtb2RlKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcmFpc2UgT1NFcnJvcigiTGlicmFyeSAlciBub3QgZm91bmQiICUgbmFtZSkKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiTG9hZCBhIGxpYnJhcnkgdmlhIGF0dHJpYnV0ZSBhY2Nlc3MuICBDYWxscworICAgICAgICAubG9hZF92ZXJzaW9uKCkuICBUaGUgcmVzdWx0IGlzIGNhY2hlZC4iIiIKKyAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCJfIik6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihuYW1lKQorICAgICAgICBkbGwgPSBzZWxmLmxvYWRfdmVyc2lvbihuYW1lKQorICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGRsbCkKKyAgICAgICAgcmV0dXJuIGRsbAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHRlc3QgY29kZQorCitjbGFzcyBDRExMKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG1vZGUpOgorICAgICAgICBzZWxmLl9oYW5kbGUgPSBkbG9wZW4obmFtZSwgbW9kZSkKKyAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8JXMgJyVzJywgaGFuZGxlICV4IGF0ICV4PiIgJSBcCisgICAgICAgICAgICAgICAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX25hbWUsCisgICAgICAgICAgICAgICAgKHNlbGYuX2hhbmRsZSAmIChzeXMubWF4aW50KjIgKyAxKSksCisgICAgICAgICAgICAgICAgaWQoc2VsZikpCisKK2NkbGwgPSBMaWJyYXJ5TG9hZGVyKENETEwpCisKK2RlZiB0ZXN0KCk6CisgICAgaWYgb3MubmFtZSA9PSAibnQiOgorICAgICAgICBwcmludCBjZGxsLm1zdmNydAorICAgICAgICBwcmludCBjZGxsLmxvYWQoIm1zdmNydCIpCisgICAgICAgICMgbG9hZF92ZXJzaW9uIGxvb2tzIG1vcmUgbGlrZSBhbiBhcnRlZmFjdDoKKyAgICAgICAgcHJpbnQgY2RsbC5sb2FkX3ZlcnNpb24oIm1zdmNyIiwgInQiKQorICAgICAgICBwcmludCBjZGxsLmZpbmQoIm1zdmNydCIpCisKKyAgICBpZiBvcy5uYW1lID09ICJwb3NpeCI6CisgICAgICAgICMgZmluZCBhbmQgbG9hZF92ZXJzaW9uCisgICAgICAgIHByaW50IGNkbGwuZmluZCgibSIpCisgICAgICAgIHByaW50IGNkbGwuZmluZCgiYyIpCisgICAgICAgIHByaW50IGNkbGwubG9hZF92ZXJzaW9uKCJjcnlwdG8iLCAiMC45LjciKQorCisgICAgICAgICMgZ2V0YXR0cgorICAgICAgICBwcmludCBjZGxsLm0KKyAgICAgICAgcHJpbnQgY2RsbC5iejIKKworICAgICAgICAjIGxvYWQKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgICAgICAgICAgcHJpbnQgY2RsbC5sb2FkKCJsaWJtLmR5bGliIikKKyAgICAgICAgICAgIHByaW50IGNkbGwubG9hZCgibGliY3J5cHRvLmR5bGliIikKKyAgICAgICAgICAgIHByaW50IGNkbGwubG9hZCgibGliU3lzdGVtLmR5bGliIikKKyAgICAgICAgICAgIHByaW50IGNkbGwubG9hZCgiU3lzdGVtLmZyYW1ld29yay9TeXN0ZW0iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgY2RsbC5sb2FkKCJsaWJtLnNvIikKKyAgICAgICAgICAgIHByaW50IGNkbGwubG9hZCgibGliY3J5cHQuc28iKQorICAgICAgICAgICAgcHJpbnQgY2RsbC5maW5kKCJjcnlwdCIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL21hY2hvbGliLy5jdnNpZ25vcmUgYi9MaWIvY3R5cGVzL21hY2hvbGliLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjMDQ4NgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvbWFjaG9saWIvLmN2c2lnbm9yZQpAQCAtMCwwICsxLDMgQEAKKyoucHljCisqLnB5bworLnN2bgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy9tYWNob2xpYi9SRUFETUUuY3R5cGVzIGIvTGliL2N0eXBlcy9tYWNob2xpYi9SRUFETUUuY3R5cGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTBjYmUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL21hY2hvbGliL1JFQURNRS5jdHlwZXMKQEAgLTAsMCArMSw3IEBACitGaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBmcm9tIGZyb20gQm9iIElwcG9saXRvJ3MgcHkyYXBwLgorCitMaWNlbnNlOiBBbnkgY29tcG9uZW50cyBvZiB0aGUgcHkyYXBwIHN1aXRlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlcgordGhlIE1JVCBvciBQU0Ygb3BlbiBzb3VyY2UgbGljZW5zZXMuCisKK1RoaXMgaXMgdmVyc2lvbiAxLjAsIFNWTiByZXZpc2lvbiA3ODksIGZyb20gMjAwNi8wMS8yNS4KK1RoZSBtYWluIHJlcG9zaXRvcnkgaXMgaHR0cDovL3N2bi5yZWQtYmVhbi5jb20vYm9iL21hY2hvbGliL3RydW5rL21hY2hvbGliLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvbWFjaG9saWIvX19pbml0X18ucHkgYi9MaWIvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjFkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsOSBAQAorIiIiCitFbm91Z2ggTWFjaC1PIHRvIG1ha2UgeW91ciBoZWFkIHNwaW4uCisKK1NlZSB0aGUgcmVsZXZhbnQgaGVhZGVyIGZpbGVzIGluIC91c3IvaW5jbHVkZS9tYWNoLW8KKworQW5kIGFsc28gQXBwbGUncyBkb2N1bWVudGF0aW9uLgorIiIiCisKK19fdmVyc2lvbl9fID0gJzEuMCcKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvbWFjaG9saWIvZHlsZC5weSBiL0xpYi9jdHlwZXMvbWFjaG9saWIvZHlsZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzM2ZmQwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy9tYWNob2xpYi9keWxkLnB5CkBAIC0wLDAgKzEsMTY2IEBACisiIiIKK2R5bGQgZW11bGF0aW9uCisiIiIKKworaW1wb3J0IG9zCitmcm9tIGZyYW1ld29yayBpbXBvcnQgZnJhbWV3b3JrX2luZm8KK2Zyb20gZHlsaWIgaW1wb3J0IGR5bGliX2luZm8KK2Zyb20gaXRlcnRvb2xzIGltcG9ydCAqCisKK19fYWxsX18gPSBbCisgICAgJ2R5bGRfZmluZCcsICdmcmFtZXdvcmtfZmluZCcsCisgICAgJ2ZyYW1ld29ya19pbmZvJywgJ2R5bGliX2luZm8nLAorXQorCisjIFRoZXNlIGFyZSB0aGUgZGVmYXVsdHMgYXMgcGVyIG1hbiBkeWxkKDEpCisjCitERUZBVUxUX0ZSQU1FV09SS19GQUxMQkFDSyA9IFsKKyAgICBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vTGlicmFyeS9GcmFtZXdvcmtzIiksCisgICAgIi9MaWJyYXJ5L0ZyYW1ld29ya3MiLAorICAgICIvTmV0d29yay9MaWJyYXJ5L0ZyYW1ld29ya3MiLAorICAgICIvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3JrcyIsCitdCisKK0RFRkFVTFRfTElCUkFSWV9GQUxMQkFDSyA9IFsKKyAgICBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vbGliIiksCisgICAgIi91c3IvbG9jYWwvbGliIiwKKyAgICAiL2xpYiIsCisgICAgIi91c3IvbGliIiwKK10KKworZGVmIGVuc3VyZV91dGY4KHMpOgorICAgICIiIk5vdCBhbGwgb2YgUHlPYmpDIGFuZCBQeXRob24gdW5kZXJzdGFuZCB1bmljb2RlIHBhdGhzIHZlcnkgd2VsbCB5ZXQiIiIKKyAgICBpZiBpc2luc3RhbmNlKHMsIHVuaWNvZGUpOgorICAgICAgICByZXR1cm4gcy5lbmNvZGUoJ3V0ZjgnKQorICAgIHJldHVybiBzCisKK2RlZiBkeWxkX2VudihlbnYsIHZhcik6CisgICAgaWYgZW52IGlzIE5vbmU6CisgICAgICAgIGVudiA9IG9zLmVudmlyb24KKyAgICBydmFsID0gZW52LmdldCh2YXIpCisgICAgaWYgcnZhbCBpcyBOb25lOgorICAgICAgICByZXR1cm4gW10KKyAgICByZXR1cm4gcnZhbC5zcGxpdCgnOicpCisKK2RlZiBkeWxkX2ltYWdlX3N1ZmZpeChlbnY9Tm9uZSk6CisgICAgaWYgZW52IGlzIE5vbmU6CisgICAgICAgIGVudiA9IG9zLmVudmlyb24KKyAgICByZXR1cm4gZW52LmdldCgnRFlMRF9JTUFHRV9TVUZGSVgnKQorCitkZWYgZHlsZF9mcmFtZXdvcmtfcGF0aChlbnY9Tm9uZSk6CisgICAgcmV0dXJuIGR5bGRfZW52KGVudiwgJ0RZTERfRlJBTUVXT1JLX1BBVEgnKQorCitkZWYgZHlsZF9saWJyYXJ5X3BhdGgoZW52PU5vbmUpOgorICAgIHJldHVybiBkeWxkX2VudihlbnYsICdEWUxEX0xJQlJBUllfUEFUSCcpCisKK2RlZiBkeWxkX2ZhbGxiYWNrX2ZyYW1ld29ya19wYXRoKGVudj1Ob25lKToKKyAgICByZXR1cm4gZHlsZF9lbnYoZW52LCAnRFlMRF9GQUxMQkFDS19GUkFNRVdPUktfUEFUSCcpCisKK2RlZiBkeWxkX2ZhbGxiYWNrX2xpYnJhcnlfcGF0aChlbnY9Tm9uZSk6CisgICAgcmV0dXJuIGR5bGRfZW52KGVudiwgJ0RZTERfRkFMTEJBQ0tfTElCUkFSWV9QQVRIJykKKworZGVmIGR5bGRfaW1hZ2Vfc3VmZml4X3NlYXJjaChpdGVyYXRvciwgZW52PU5vbmUpOgorICAgICIiIkZvciBhIHBvdGVudGlhbCBwYXRoIGl0ZXJhdG9yLCBhZGQgRFlMRF9JTUFHRV9TVUZGSVggc2VtYW50aWNzIiIiCisgICAgc3VmZml4ID0gZHlsZF9pbWFnZV9zdWZmaXgoZW52KQorICAgIGlmIHN1ZmZpeCBpcyBOb25lOgorICAgICAgICByZXR1cm4gaXRlcmF0b3IKKyAgICBkZWYgX2luamVjdChpdGVyYXRvcj1pdGVyYXRvciwgc3VmZml4PXN1ZmZpeCk6CisgICAgICAgIGZvciBwYXRoIGluIGl0ZXJhdG9yOgorICAgICAgICAgICAgaWYgcGF0aC5lbmRzd2l0aCgnLmR5bGliJyk6CisgICAgICAgICAgICAgICAgeWllbGQgcGF0aFs6LWxlbignLmR5bGliJyldICsgc3VmZml4ICsgJy5keWxpYicKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgcGF0aCArIHN1ZmZpeAorICAgICAgICAgICAgeWllbGQgcGF0aAorICAgIHJldHVybiBfaW5qZWN0KCkKKworZGVmIGR5bGRfb3ZlcnJpZGVfc2VhcmNoKG5hbWUsIGVudj1Ob25lKToKKyAgICAjIElmIERZTERfRlJBTUVXT1JLX1BBVEggaXMgc2V0IGFuZCB0aGlzIGR5bGliX25hbWUgaXMgYQorICAgICMgZnJhbWV3b3JrIG5hbWUsIHVzZSB0aGUgZmlyc3QgZmlsZSB0aGF0IGV4aXN0cyBpbiB0aGUgZnJhbWV3b3JrCisgICAgIyBwYXRoIGlmIGFueS4gIElmIHRoZXJlIGlzIG5vbmUgZ28gb24gdG8gc2VhcmNoIHRoZSBEWUxEX0xJQlJBUllfUEFUSAorICAgICMgaWYgYW55LgorCisgICAgZnJhbWV3b3JrID0gZnJhbWV3b3JrX2luZm8obmFtZSkKKworICAgIGlmIGZyYW1ld29yayBpcyBub3QgTm9uZToKKyAgICAgICAgZm9yIHBhdGggaW4gZHlsZF9mcmFtZXdvcmtfcGF0aChlbnYpOgorICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHBhdGgsIGZyYW1ld29ya1snbmFtZSddKQorCisgICAgIyBJZiBEWUxEX0xJQlJBUllfUEFUSCBpcyBzZXQgdGhlbiB1c2UgdGhlIGZpcnN0IGZpbGUgdGhhdCBleGlzdHMKKyAgICAjIGluIHRoZSBwYXRoLiAgSWYgbm9uZSB1c2UgdGhlIG9yaWdpbmFsIG5hbWUuCisgICAgZm9yIHBhdGggaW4gZHlsZF9saWJyYXJ5X3BhdGgoZW52KToKKyAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHBhdGgsIG9zLnBhdGguYmFzZW5hbWUobmFtZSkpCisKK2RlZiBkeWxkX2V4ZWN1dGFibGVfcGF0aF9zZWFyY2gobmFtZSwgZXhlY3V0YWJsZV9wYXRoPU5vbmUpOgorICAgICMgSWYgd2UgaGF2ZW4ndCBkb25lIGFueSBzZWFyY2hpbmcgYW5kIGZvdW5kIGEgbGlicmFyeSBhbmQgdGhlCisgICAgIyBkeWxpYl9uYW1lIHN0YXJ0cyB3aXRoICJAZXhlY3V0YWJsZV9wYXRoLyIgdGhlbiBjb25zdHJ1Y3QgdGhlCisgICAgIyBsaWJyYXJ5IG5hbWUuCisgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdAZXhlY3V0YWJsZV9wYXRoLycpIGFuZCBleGVjdXRhYmxlX3BhdGggaXMgbm90IE5vbmU6CisgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihleGVjdXRhYmxlX3BhdGgsIG5hbWVbbGVuKCdAZXhlY3V0YWJsZV9wYXRoLycpOl0pCisKK2RlZiBkeWxkX2RlZmF1bHRfc2VhcmNoKG5hbWUsIGVudj1Ob25lKToKKyAgICB5aWVsZCBuYW1lCisKKyAgICBmcmFtZXdvcmsgPSBmcmFtZXdvcmtfaW5mbyhuYW1lKQorCisgICAgaWYgZnJhbWV3b3JrIGlzIG5vdCBOb25lOgorICAgICAgICBmYWxsYmFja19mcmFtZXdvcmtfcGF0aCA9IGR5bGRfZmFsbGJhY2tfZnJhbWV3b3JrX3BhdGgoZW52KQorICAgICAgICBmb3IgcGF0aCBpbiBmYWxsYmFja19mcmFtZXdvcmtfcGF0aDoKKyAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihwYXRoLCBmcmFtZXdvcmtbJ25hbWUnXSkKKworICAgIGZhbGxiYWNrX2xpYnJhcnlfcGF0aCA9IGR5bGRfZmFsbGJhY2tfbGlicmFyeV9wYXRoKGVudikKKyAgICBmb3IgcGF0aCBpbiBmYWxsYmFja19saWJyYXJ5X3BhdGg6CisgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihwYXRoLCBvcy5wYXRoLmJhc2VuYW1lKG5hbWUpKQorCisgICAgaWYgZnJhbWV3b3JrIGlzIG5vdCBOb25lIGFuZCBub3QgZmFsbGJhY2tfZnJhbWV3b3JrX3BhdGg6CisgICAgICAgIGZvciBwYXRoIGluIERFRkFVTFRfRlJBTUVXT1JLX0ZBTExCQUNLOgorICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHBhdGgsIGZyYW1ld29ya1snbmFtZSddKQorCisgICAgaWYgbm90IGZhbGxiYWNrX2xpYnJhcnlfcGF0aDoKKyAgICAgICAgZm9yIHBhdGggaW4gREVGQVVMVF9MSUJSQVJZX0ZBTExCQUNLOgorICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHBhdGgsIG9zLnBhdGguYmFzZW5hbWUobmFtZSkpCisKK2RlZiBkeWxkX2ZpbmQobmFtZSwgZXhlY3V0YWJsZV9wYXRoPU5vbmUsIGVudj1Ob25lKToKKyAgICAiIiIKKyAgICBGaW5kIGEgbGlicmFyeSBvciBmcmFtZXdvcmsgdXNpbmcgZHlsZCBzZW1hbnRpY3MKKyAgICAiIiIKKyAgICBuYW1lID0gZW5zdXJlX3V0ZjgobmFtZSkKKyAgICBleGVjdXRhYmxlX3BhdGggPSBlbnN1cmVfdXRmOChleGVjdXRhYmxlX3BhdGgpCisgICAgZm9yIHBhdGggaW4gZHlsZF9pbWFnZV9zdWZmaXhfc2VhcmNoKGNoYWluKAorICAgICAgICAgICAgICAgIGR5bGRfb3ZlcnJpZGVfc2VhcmNoKG5hbWUsIGVudiksCisgICAgICAgICAgICAgICAgZHlsZF9leGVjdXRhYmxlX3BhdGhfc2VhcmNoKG5hbWUsIGV4ZWN1dGFibGVfcGF0aCksCisgICAgICAgICAgICAgICAgZHlsZF9kZWZhdWx0X3NlYXJjaChuYW1lLCBlbnYpLAorICAgICAgICAgICAgKSwgZW52KToKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CisgICAgICAgICAgICByZXR1cm4gcGF0aAorICAgIHJhaXNlIFZhbHVlRXJyb3IsICJkeWxpYiAlcyBjb3VsZCBub3QgYmUgZm91bmQiICUgKG5hbWUsKQorCitkZWYgZnJhbWV3b3JrX2ZpbmQoZm4sIGV4ZWN1dGFibGVfcGF0aD1Ob25lLCBlbnY9Tm9uZSk6CisgICAgIiIiCisgICAgRmluZCBhIGZyYW1ld29yayB1c2luZyBkeWxkIHNlbWFudGljcyBpbiBhIHZlcnkgbG9vc2UgbWFubmVyLgorCisgICAgV2lsbCB0YWtlIGlucHV0IHN1Y2ggYXM6CisgICAgICAgIFB5dGhvbgorICAgICAgICBQeXRob24uZnJhbWV3b3JrCisgICAgICAgIFB5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudAorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGR5bGRfZmluZChmbiwgZXhlY3V0YWJsZV9wYXRoPWV4ZWN1dGFibGVfcGF0aCwgZW52PWVudikKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgICAgcGFzcworICAgIGZtd2tfaW5kZXggPSBmbi5yZmluZCgnLmZyYW1ld29yaycpCisgICAgaWYgZm13a19pbmRleCA9PSAtMToKKyAgICAgICAgZm13a19pbmRleCA9IGxlbihmbikKKyAgICAgICAgZm4gKz0gJy5mcmFtZXdvcmsnCisgICAgZm4gPSBvcy5wYXRoLmpvaW4oZm4sIG9zLnBhdGguYmFzZW5hbWUoZm5bOmZtd2tfaW5kZXhdKSkKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBkeWxkX2ZpbmQoZm4sIGV4ZWN1dGFibGVfcGF0aD1leGVjdXRhYmxlX3BhdGgsIGVudj1lbnYpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHJhaXNlIGUKKworZGVmIHRlc3RfZHlsZF9maW5kKCk6CisgICAgZW52ID0ge30KKyAgICBhc3NlcnQgZHlsZF9maW5kKCdsaWJTeXN0ZW0uZHlsaWInKSA9PSAnL3Vzci9saWIvbGliU3lzdGVtLmR5bGliJworICAgIGFzc2VydCBkeWxkX2ZpbmQoJ1N5c3RlbS5mcmFtZXdvcmsvU3lzdGVtJykgPT0gJy9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL1N5c3RlbS5mcmFtZXdvcmsvU3lzdGVtJworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfZHlsZF9maW5kKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvbWFjaG9saWIvZHlsaWIucHkgYi9MaWIvY3R5cGVzL21hY2hvbGliL2R5bGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMTA3NTAKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL21hY2hvbGliL2R5bGliLnB5CkBAIC0wLDAgKzEsNjMgQEAKKyIiIgorR2VuZXJpYyBkeWxpYiBwYXRoIG1hbmlwdWxhdGlvbgorIiIiCisKK2ltcG9ydCByZQorCitfX2FsbF9fID0gWydkeWxpYl9pbmZvJ10KKworRFlMSUJfUkUgPSByZS5jb21waWxlKHIiIiIoP3gpCisoP1A8bG9jYXRpb24+Xi4qKSg/Ol58LykKKyg/UDxuYW1lPgorICAgICg/UDxzaG9ydG5hbWU+XHcrPykKKyAgICAoPzpcLig/UDx2ZXJzaW9uPlteLl9dKykpPworICAgICg/Ol8oP1A8c3VmZml4PlteLl9dKykpPworICAgIFwuZHlsaWIkCispCisiIiIpCisKK2RlZiBkeWxpYl9pbmZvKGZpbGVuYW1lKToKKyAgICAiIiIKKyAgICBBIGR5bGliIG5hbWUgY2FuIHRha2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgZm91ciBmb3JtczoKKyAgICAgICAgTG9jYXRpb24vTmFtZS5Tb21lVmVyc2lvbl9TdWZmaXguZHlsaWIKKyAgICAgICAgTG9jYXRpb24vTmFtZS5Tb21lVmVyc2lvbi5keWxpYgorICAgICAgICBMb2NhdGlvbi9OYW1lX1N1ZmZpeC5keWxpYgorICAgICAgICBMb2NhdGlvbi9OYW1lLmR5bGliCisKKyAgICByZXR1cm5zIE5vbmUgaWYgbm90IGZvdW5kIG9yIGEgbWFwcGluZyBlcXVpdmFsZW50IHRvOgorICAgICAgICBkaWN0KAorICAgICAgICAgICAgbG9jYXRpb249J0xvY2F0aW9uJywKKyAgICAgICAgICAgIG5hbWU9J05hbWUuU29tZVZlcnNpb25fU3VmZml4LmR5bGliJywKKyAgICAgICAgICAgIHNob3J0bmFtZT0nTmFtZScsCisgICAgICAgICAgICB2ZXJzaW9uPSdTb21lVmVyc2lvbicsCisgICAgICAgICAgICBzdWZmaXg9J1N1ZmZpeCcsCisgICAgICAgICkKKworICAgIE5vdGUgdGhhdCBTb21lVmVyc2lvbiBhbmQgU3VmZml4IGFyZSBvcHRpb25hbCBhbmQgbWF5IGJlIE5vbmUKKyAgICBpZiBub3QgcHJlc2VudC4KKyAgICAiIiIKKyAgICBpc19keWxpYiA9IERZTElCX1JFLm1hdGNoKGZpbGVuYW1lKQorICAgIGlmIG5vdCBpc19keWxpYjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gaXNfZHlsaWIuZ3JvdXBkaWN0KCkKKworCitkZWYgdGVzdF9keWxpYl9pbmZvKCk6CisgICAgZGVmIGQobG9jYXRpb249Tm9uZSwgbmFtZT1Ob25lLCBzaG9ydG5hbWU9Tm9uZSwgdmVyc2lvbj1Ob25lLCBzdWZmaXg9Tm9uZSk6CisgICAgICAgIHJldHVybiBkaWN0KAorICAgICAgICAgICAgbG9jYXRpb249bG9jYXRpb24sCisgICAgICAgICAgICBuYW1lPW5hbWUsCisgICAgICAgICAgICBzaG9ydG5hbWU9c2hvcnRuYW1lLAorICAgICAgICAgICAgdmVyc2lvbj12ZXJzaW9uLAorICAgICAgICAgICAgc3VmZml4PXN1ZmZpeAorICAgICAgICApCisgICAgYXNzZXJ0IGR5bGliX2luZm8oJ2NvbXBsZXRlbHkvaW52YWxpZCcpIGlzIE5vbmUKKyAgICBhc3NlcnQgZHlsaWJfaW5mbygnY29tcGxldGVseS9pbnZhbGlkZV9kZWJ1ZycpIGlzIE5vbmUKKyAgICBhc3NlcnQgZHlsaWJfaW5mbygnUC9Gb28uZHlsaWInKSA9PSBkKCdQJywgJ0Zvby5keWxpYicsICdGb28nKQorICAgIGFzc2VydCBkeWxpYl9pbmZvKCdQL0Zvb19kZWJ1Zy5keWxpYicpID09IGQoJ1AnLCAnRm9vX2RlYnVnLmR5bGliJywgJ0ZvbycsIHN1ZmZpeD0nZGVidWcnKQorICAgIGFzc2VydCBkeWxpYl9pbmZvKCdQL0Zvby5BLmR5bGliJykgPT0gZCgnUCcsICdGb28uQS5keWxpYicsICdGb28nLCAnQScpCisgICAgYXNzZXJ0IGR5bGliX2luZm8oJ1AvRm9vX2RlYnVnLkEuZHlsaWInKSA9PSBkKCdQJywgJ0Zvb19kZWJ1Zy5BLmR5bGliJywgJ0Zvb19kZWJ1ZycsICdBJykKKyAgICBhc3NlcnQgZHlsaWJfaW5mbygnUC9Gb28uQV9kZWJ1Zy5keWxpYicpID09IGQoJ1AnLCAnRm9vLkFfZGVidWcuZHlsaWInLCAnRm9vJywgJ0EnLCAnZGVidWcnKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfZHlsaWJfaW5mbygpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL21hY2hvbGliL2ZldGNoX21hY2hvbGliIGIvTGliL2N0eXBlcy9tYWNob2xpYi9mZXRjaF9tYWNob2xpYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNmQ2YTIyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy9tYWNob2xpYi9mZXRjaF9tYWNob2xpYgpAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9zaAorc3ZuIGV4cG9ydCAtLWZvcmNlIGh0dHA6Ly9zdm4ucmVkLWJlYW4uY29tL2JvYi9tYWNob2xpYi90cnVuay9tYWNob2xpYi8gLgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy9tYWNob2xpYi9mZXRjaF9tYWNob2xpYi5iYXQgYi9MaWIvY3R5cGVzL21hY2hvbGliL2ZldGNoX21hY2hvbGliLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWUxYzBkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy9tYWNob2xpYi9mZXRjaF9tYWNob2xpYi5iYXQKQEAgLTAsMCArMSBAQAorc3ZuIGV4cG9ydCAtLWZvcmNlIGh0dHA6Ly9zdm4ucmVkLWJlYW4uY29tL2JvYi9tYWNob2xpYi90cnVuay9tYWNob2xpYi8gLgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy9tYWNob2xpYi9mcmFtZXdvcmsucHkgYi9MaWIvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDZlZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy9tYWNob2xpYi9mcmFtZXdvcmsucHkKQEAgLTAsMCArMSw2NSBAQAorIiIiCitHZW5lcmljIGZyYW1ld29yayBwYXRoIG1hbmlwdWxhdGlvbgorIiIiCisKK2ltcG9ydCByZQorCitfX2FsbF9fID0gWydmcmFtZXdvcmtfaW5mbyddCisKK1NUUklDVF9GUkFNRVdPUktfUkUgPSByZS5jb21waWxlKHIiIiIoP3gpCisoP1A8bG9jYXRpb24+Xi4qKSg/Ol58LykKKyg/UDxuYW1lPgorICAgICg/UDxzaG9ydG5hbWU+XHcrKS5mcmFtZXdvcmsvCisgICAgKD86VmVyc2lvbnMvKD9QPHZlcnNpb24+W14vXSspLyk/CisgICAgKD9QPXNob3J0bmFtZSkKKyAgICAoPzpfKD9QPHN1ZmZpeD5bXl9dKykpPworKSQKKyIiIikKKworZGVmIGZyYW1ld29ya19pbmZvKGZpbGVuYW1lKToKKyAgICAiIiIKKyAgICBBIGZyYW1ld29yayBuYW1lIGNhbiB0YWtlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvdXIgZm9ybXM6CisgICAgICAgIExvY2F0aW9uL05hbWUuZnJhbWV3b3JrL1ZlcnNpb25zL1NvbWVWZXJzaW9uL05hbWVfU3VmZml4CisgICAgICAgIExvY2F0aW9uL05hbWUuZnJhbWV3b3JrL1ZlcnNpb25zL1NvbWVWZXJzaW9uL05hbWUKKyAgICAgICAgTG9jYXRpb24vTmFtZS5mcmFtZXdvcmsvTmFtZV9TdWZmaXgKKyAgICAgICAgTG9jYXRpb24vTmFtZS5mcmFtZXdvcmsvTmFtZQorCisgICAgcmV0dXJucyBOb25lIGlmIG5vdCBmb3VuZCwgb3IgYSBtYXBwaW5nIGVxdWl2YWxlbnQgdG86CisgICAgICAgIGRpY3QoCisgICAgICAgICAgICBsb2NhdGlvbj0nTG9jYXRpb24nLAorICAgICAgICAgICAgbmFtZT0nTmFtZS5mcmFtZXdvcmsvVmVyc2lvbnMvU29tZVZlcnNpb24vTmFtZV9TdWZmaXgnLAorICAgICAgICAgICAgc2hvcnRuYW1lPSdOYW1lJywKKyAgICAgICAgICAgIHZlcnNpb249J1NvbWVWZXJzaW9uJywKKyAgICAgICAgICAgIHN1ZmZpeD0nU3VmZml4JywKKyAgICAgICAgKQorCisgICAgTm90ZSB0aGF0IFNvbWVWZXJzaW9uIGFuZCBTdWZmaXggYXJlIG9wdGlvbmFsIGFuZCBtYXkgYmUgTm9uZQorICAgIGlmIG5vdCBwcmVzZW50CisgICAgIiIiCisgICAgaXNfZnJhbWV3b3JrID0gU1RSSUNUX0ZSQU1FV09SS19SRS5tYXRjaChmaWxlbmFtZSkKKyAgICBpZiBub3QgaXNfZnJhbWV3b3JrOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiBpc19mcmFtZXdvcmsuZ3JvdXBkaWN0KCkKKworZGVmIHRlc3RfZnJhbWV3b3JrX2luZm8oKToKKyAgICBkZWYgZChsb2NhdGlvbj1Ob25lLCBuYW1lPU5vbmUsIHNob3J0bmFtZT1Ob25lLCB2ZXJzaW9uPU5vbmUsIHN1ZmZpeD1Ob25lKToKKyAgICAgICAgcmV0dXJuIGRpY3QoCisgICAgICAgICAgICBsb2NhdGlvbj1sb2NhdGlvbiwKKyAgICAgICAgICAgIG5hbWU9bmFtZSwKKyAgICAgICAgICAgIHNob3J0bmFtZT1zaG9ydG5hbWUsCisgICAgICAgICAgICB2ZXJzaW9uPXZlcnNpb24sCisgICAgICAgICAgICBzdWZmaXg9c3VmZml4CisgICAgICAgICkKKyAgICBhc3NlcnQgZnJhbWV3b3JrX2luZm8oJ2NvbXBsZXRlbHkvaW52YWxpZCcpIGlzIE5vbmUKKyAgICBhc3NlcnQgZnJhbWV3b3JrX2luZm8oJ2NvbXBsZXRlbHkvaW52YWxpZC9fZGVidWcnKSBpcyBOb25lCisgICAgYXNzZXJ0IGZyYW1ld29ya19pbmZvKCdQL0YuZnJhbWV3b3JrJykgaXMgTm9uZQorICAgIGFzc2VydCBmcmFtZXdvcmtfaW5mbygnUC9GLmZyYW1ld29yay9fZGVidWcnKSBpcyBOb25lCisgICAgYXNzZXJ0IGZyYW1ld29ya19pbmZvKCdQL0YuZnJhbWV3b3JrL0YnKSA9PSBkKCdQJywgJ0YuZnJhbWV3b3JrL0YnLCAnRicpCisgICAgYXNzZXJ0IGZyYW1ld29ya19pbmZvKCdQL0YuZnJhbWV3b3JrL0ZfZGVidWcnKSA9PSBkKCdQJywgJ0YuZnJhbWV3b3JrL0ZfZGVidWcnLCAnRicsIHN1ZmZpeD0nZGVidWcnKQorICAgIGFzc2VydCBmcmFtZXdvcmtfaW5mbygnUC9GLmZyYW1ld29yay9WZXJzaW9ucycpIGlzIE5vbmUKKyAgICBhc3NlcnQgZnJhbWV3b3JrX2luZm8oJ1AvRi5mcmFtZXdvcmsvVmVyc2lvbnMvQScpIGlzIE5vbmUKKyAgICBhc3NlcnQgZnJhbWV3b3JrX2luZm8oJ1AvRi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9GJykgPT0gZCgnUCcsICdGLmZyYW1ld29yay9WZXJzaW9ucy9BL0YnLCAnRicsICdBJykKKyAgICBhc3NlcnQgZnJhbWV3b3JrX2luZm8oJ1AvRi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9GX2RlYnVnJykgPT0gZCgnUCcsICdGLmZyYW1ld29yay9WZXJzaW9ucy9BL0ZfZGVidWcnLCAnRicsICdBJywgJ2RlYnVnJykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X2ZyYW1ld29ya19pbmZvKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC8uY3ZzaWdub3JlIGIvTGliL2N0eXBlcy90ZXN0Ly5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyYTk4MwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsNCBAQAorKi5weWMKKyoucHlvCitfdGVzdGZpbGUucHkKK190ZXN0ZmlsZS54bWwKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC9fX2luaXRfXy5weSBiL0xpYi9jdHlwZXMvdGVzdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDY0YjFjCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMjAyIEBACitpbXBvcnQgZ2xvYiwgb3MsIHN5cywgdW5pdHRlc3QsIGdldG9wdCwgdGltZQorCit1c2VfcmVzb3VyY2VzID0gW10KKworY2xhc3MgUmVzb3VyY2VEZW5pZWQoRXhjZXB0aW9uKToKKyAgICAiIiJUZXN0IHNraXBwZWQgYmVjYXVzZSBpdCByZXF1ZXN0ZWQgYSBkaXNhbGxvd2VkIHJlc291cmNlLgorCisgICAgVGhpcyBpcyByYWlzZWQgd2hlbiBhIHRlc3QgY2FsbHMgcmVxdWlyZXMoKSBmb3IgYSByZXNvdXJjZSB0aGF0CisgICAgaGFzIG5vdCBiZSBlbmFibGVkLiAgUmVzb3VyY2VzIGFyZSBkZWZpbmVkIGJ5IHRlc3QgbW9kdWxlcy4KKyAgICAiIiIKKworZGVmIGlzX3Jlc291cmNlX2VuYWJsZWQocmVzb3VyY2UpOgorICAgICIiIlRlc3Qgd2hldGhlciBhIHJlc291cmNlIGlzIGVuYWJsZWQuCisKKyAgICBJZiB0aGUgY2FsbGVyJ3MgbW9kdWxlIGlzIF9fbWFpbl9fIHRoZW4gYXV0b21hdGljYWxseSByZXR1cm4gVHJ1ZS4iIiIKKyAgICBpZiBzeXMuX2dldGZyYW1lKCkuZl9iYWNrLmZfZ2xvYmFscy5nZXQoIl9fbmFtZV9fIikgPT0gIl9fbWFpbl9fIjoKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXN1bHQgPSB1c2VfcmVzb3VyY2VzIGlzIG5vdCBOb25lIGFuZCBcCisgICAgICAgICAgIChyZXNvdXJjZSBpbiB1c2VfcmVzb3VyY2VzIG9yICIqIiBpbiB1c2VfcmVzb3VyY2VzKQorICAgIGlmIG5vdCByZXN1bHQ6CisgICAgICAgIF91bmF2YWlsW3Jlc291cmNlXSA9IE5vbmUKKyAgICByZXR1cm4gcmVzdWx0CisKK191bmF2YWlsID0ge30KK2RlZiByZXF1aXJlcyhyZXNvdXJjZSwgbXNnPU5vbmUpOgorICAgICIiIlJhaXNlIFJlc291cmNlRGVuaWVkIGlmIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgaXMgbm90IGF2YWlsYWJsZS4KKworICAgIElmIHRoZSBjYWxsZXIncyBtb2R1bGUgaXMgX19tYWluX18gdGhlbiBhdXRvbWF0aWNhbGx5IHJldHVybiBUcnVlLiIiIgorICAgICMgc2VlIGlmIHRoZSBjYWxsZXIncyBtb2R1bGUgaXMgX19tYWluX18gLSBpZiBzbywgdHJlYXQgYXMgaWYKKyAgICAjIHRoZSByZXNvdXJjZSB3YXMgc2V0CisgICAgaWYgc3lzLl9nZXRmcmFtZSgpLmZfYmFjay5mX2dsb2JhbHMuZ2V0KCJfX25hbWVfXyIpID09ICJfX21haW5fXyI6CisgICAgICAgIHJldHVybgorICAgIGlmIG5vdCBpc19yZXNvdXJjZV9lbmFibGVkKHJlc291cmNlKToKKyAgICAgICAgaWYgbXNnIGlzIE5vbmU6CisgICAgICAgICAgICBtc2cgPSAiVXNlIG9mIHRoZSBgJXMnIHJlc291cmNlIG5vdCBlbmFibGVkIiAlIHJlc291cmNlCisgICAgICAgIHJhaXNlIFJlc291cmNlRGVuaWVkKG1zZykKKworZGVmIGZpbmRfcGFja2FnZV9tb2R1bGVzKHBhY2thZ2UsIG1hc2spOgorICAgIGltcG9ydCBmbm1hdGNoCisgICAgaWYgaGFzYXR0cihwYWNrYWdlLCAiX19sb2FkZXJfXyIpOgorICAgICAgICBwYXRoID0gcGFja2FnZS5fX25hbWVfXy5yZXBsYWNlKCIuIiwgb3MucGF0aC5zZXApCisgICAgICAgIG1hc2sgPSBvcy5wYXRoLmpvaW4ocGF0aCwgbWFzaykKKyAgICAgICAgZm9yIGZubSBpbiBwYWNrYWdlLl9fbG9hZGVyX18uX2ZpbGVzLml0ZXJrZXlzKCk6CisgICAgICAgICAgICBpZiBmbm1hdGNoLmZubWF0Y2hjYXNlKGZubSwgbWFzayk6CisgICAgICAgICAgICAgICAgeWllbGQgb3MucGF0aC5zcGxpdGV4dChmbm0pWzBdLnJlcGxhY2Uob3MucGF0aC5zZXAsICIuIikKKyAgICBlbHNlOgorICAgICAgICBwYXRoID0gcGFja2FnZS5fX3BhdGhfX1swXQorICAgICAgICBmb3IgZm5tIGluIG9zLmxpc3RkaXIocGF0aCk6CisgICAgICAgICAgICBpZiBmbm1hdGNoLmZubWF0Y2hjYXNlKGZubSwgbWFzayk6CisgICAgICAgICAgICAgICAgeWllbGQgIiVzLiVzIiAlIChwYWNrYWdlLl9fbmFtZV9fLCBvcy5wYXRoLnNwbGl0ZXh0KGZubSlbMF0pCisKK2RlZiBnZXRfdGVzdHMocGFja2FnZSwgbWFzaywgdmVyYm9zaXR5KToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHNraXBwZWQgdGVzdCBtb2R1bGVzLCBhbmQgYSBsaXN0IG9mIHRlc3QgY2FzZXMuIiIiCisgICAgdGVzdHMgPSBbXQorICAgIHNraXBwZWQgPSBbXQorICAgIGZvciBtb2RuYW1lIGluIGZpbmRfcGFja2FnZV9tb2R1bGVzKHBhY2thZ2UsIG1hc2spOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKG1vZG5hbWUsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnKiddKQorICAgICAgICBleGNlcHQgUmVzb3VyY2VEZW5pZWQsIGRldGFpbDoKKyAgICAgICAgICAgIHNraXBwZWQuYXBwZW5kKG1vZG5hbWUpCisgICAgICAgICAgICBpZiB2ZXJib3NpdHkgPiAxOgorICAgICAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJTa2lwcGVkICVzOiAlcyIgJSAobW9kbmFtZSwgZGV0YWlsKQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZGV0YWlsOgorICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIldhcm5pbmc6IGNvdWxkIG5vdCBpbXBvcnQgJXM6ICVzIiAlIChtb2RuYW1lLCBkZXRhaWwpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmb3IgbmFtZSBpbiBkaXIobW9kKToKKyAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgiXyIpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBvID0gZ2V0YXR0cihtb2QsIG5hbWUpCisgICAgICAgICAgICBpZiB0eXBlKG8pIGlzIHR5cGUodW5pdHRlc3QuVGVzdENhc2UpIGFuZCBpc3N1YmNsYXNzKG8sIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgICAgICB0ZXN0cy5hcHBlbmQobykKKyAgICByZXR1cm4gc2tpcHBlZCwgdGVzdHMKKworZGVmIHVzYWdlKCk6CisgICAgcHJpbnQgX19kb2NfXworICAgIHJldHVybiAxCisKK2RlZiB0ZXN0X3dpdGhfcmVmY291bnRzKHJ1bm5lciwgdmVyYm9zaXR5LCB0ZXN0Y2FzZSk6CisgICAgIiIiUnVuIHRlc3RjYXNlIHNldmVyYWwgdGltZXMsIHRyYWNraW5nIHJlZmVyZW5jZSBjb3VudHMuIiIiCisgICAgaW1wb3J0IGdjCisgICAgaW1wb3J0IGN0eXBlcworICAgIHB0YyA9IGN0eXBlcy5fcG9pbnRlcl90eXBlX2NhY2hlLmNvcHkoKQorICAgIGNmYyA9IGN0eXBlcy5fY19mdW5jdHlwZV9jYWNoZS5jb3B5KCkKKyAgICB3ZmMgPSBjdHlwZXMuX3dpbl9mdW5jdHlwZV9jYWNoZS5jb3B5KCkKKyAgICAKKyAgICAjIHdoZW4gc2VhcmNoaW5nIGZvciByZWZjb3VudCBsZWFrcywgd2UgaGF2ZSB0byBtYW51YWxseSByZXNldCBhbnkKKyAgICAjIGNhY2hlcyB0aGF0IGN0eXBlcyBoYXMuCisgICAgZGVmIGNsZWFudXAoKToKKyAgICAgICAgY3R5cGVzLl9wb2ludGVyX3R5cGVfY2FjaGUgPSBwdGMuY29weSgpCisgICAgICAgIGN0eXBlcy5fY19mdW5jdHlwZV9jYWNoZSA9IGNmYy5jb3B5KCkKKyAgICAgICAgY3R5cGVzLl93aW5fZnVuY3R5cGVfY2FjaGUgPSB3ZmMuY29weSgpCisgICAgICAgIGdjLmNvbGxlY3QoKQorCisgICAgdGVzdCA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZSh0ZXN0Y2FzZSkKKyAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgcmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgIHJ1bm5lci5ydW4odGVzdCkKKyAgICAgICAgY2xlYW51cCgpCisgICAgQ09VTlQgPSA1CisgICAgcmVmY291bnRzID0gW05vbmVdICogQ09VTlQKKyAgICBmb3IgaSBpbiByYW5nZShDT1VOVCk6CisgICAgICAgIHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBydW5uZXIucnVuKHRlc3QpCisgICAgICAgIGNsZWFudXAoKQorICAgICAgICByZWZjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpIC0gcmMKKyAgICBpZiBmaWx0ZXIoTm9uZSwgcmVmY291bnRzKToKKyAgICAgICAgcHJpbnQgIiVzIGxlYWtzOlxuXHQiICUgdGVzdGNhc2UsIHJlZmNvdW50cworICAgIGVsaWYgdmVyYm9zaXR5OgorICAgICAgICBwcmludCAiJXM6IG9rLiIgJSB0ZXN0Y2FzZQorCitjbGFzcyBUZXN0UnVubmVyKHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKToKKyAgICBkZWYgcnVuKHNlbGYsIHRlc3QsIHNraXBwZWQpOgorICAgICAgICAiUnVuIHRoZSBnaXZlbiB0ZXN0IGNhc2Ugb3IgdGVzdCBzdWl0ZS4iCisgICAgICAgICMgU2FtZSBhcyB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lci5ydW4sIGV4Y2VwdCB0aGF0IGl0IHJlcG9ydHMKKyAgICAgICAgIyBza2lwcGVkIHRlc3RzLgorICAgICAgICByZXN1bHQgPSBzZWxmLl9tYWtlUmVzdWx0KCkKKyAgICAgICAgc3RhcnRUaW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgdGVzdChyZXN1bHQpCisgICAgICAgIHN0b3BUaW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgdGltZVRha2VuID0gc3RvcFRpbWUgLSBzdGFydFRpbWUKKyAgICAgICAgcmVzdWx0LnByaW50RXJyb3JzKCkKKyAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbihyZXN1bHQuc2VwYXJhdG9yMikKKyAgICAgICAgcnVuID0gcmVzdWx0LnRlc3RzUnVuCisgICAgICAgIGlmIF91bmF2YWlsOiAjc2tpcHBlZDoKKyAgICAgICAgICAgIHJlcXVlc3RlZCA9IF91bmF2YWlsLmtleXMoKQorICAgICAgICAgICAgcmVxdWVzdGVkLnNvcnQoKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigiUmFuICVkIHRlc3QlcyBpbiAlLjNmcyAoJXMgbW9kdWxlJXMgc2tpcHBlZCkiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJ1biwgcnVuICE9IDEgYW5kICJzIiBvciAiIiwgdGltZVRha2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKHNraXBwZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKHNraXBwZWQpICE9IDEgYW5kICJzIiBvciAiIikpCisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKCJVbmF2YWlsYWJsZSByZXNvdXJjZXM6ICVzIiAlICIsICIuam9pbihyZXF1ZXN0ZWQpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigiUmFuICVkIHRlc3QlcyBpbiAlLjNmcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocnVuLCBydW4gIT0gMSBhbmQgInMiIG9yICIiLCB0aW1lVGFrZW4pKQorICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKCkKKyAgICAgICAgaWYgbm90IHJlc3VsdC53YXNTdWNjZXNzZnVsKCk6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgiRkFJTEVEICgiKQorICAgICAgICAgICAgZmFpbGVkLCBlcnJvcmVkID0gbWFwKGxlbiwgKHJlc3VsdC5mYWlsdXJlcywgcmVzdWx0LmVycm9ycykpCisgICAgICAgICAgICBpZiBmYWlsZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoImZhaWx1cmVzPSVkIiAlIGZhaWxlZCkKKyAgICAgICAgICAgIGlmIGVycm9yZWQ6CisgICAgICAgICAgICAgICAgaWYgZmFpbGVkOiBzZWxmLnN0cmVhbS53cml0ZSgiLCAiKQorICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKCJlcnJvcnM9JWQiICUgZXJyb3JlZCkKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oIikiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigiT0siKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKworZGVmIG1haW4oKnBhY2thZ2VzKToKKyAgICB0cnk6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgInJxdnU6IikKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yOgorICAgICAgICByZXR1cm4gdXNhZ2UoKQorCisgICAgdmVyYm9zaXR5ID0gMQorICAgIHNlYXJjaF9sZWFrcyA9IEZhbHNlCisgICAgZm9yIGZsYWcsIHZhbHVlIGluIG9wdHM6CisgICAgICAgIGlmIGZsYWcgPT0gIi1xIjoKKyAgICAgICAgICAgIHZlcmJvc2l0eSAtPSAxCisgICAgICAgIGVsaWYgZmxhZyA9PSAiLXYiOgorICAgICAgICAgICAgdmVyYm9zaXR5ICs9IDEKKyAgICAgICAgZWxpZiBmbGFnID09ICItciI6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3lzLmdldHRvdGFscmVmY291bnQKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiLXIgZmxhZyByZXF1aXJlcyBQeXRob24gZGVidWcgYnVpbGQiCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBzZWFyY2hfbGVha3MgPSBUcnVlCisgICAgICAgIGVsaWYgZmxhZyA9PSAiLXUiOgorICAgICAgICAgICAgdXNlX3Jlc291cmNlcy5leHRlbmQodmFsdWUuc3BsaXQoIiwiKSkKKworICAgIG1hc2sgPSAidGVzdF8qLnB5IgorICAgIGlmIGFyZ3M6CisgICAgICAgIG1hc2sgPSBhcmdzWzBdCisKKyAgICBmb3IgcGFja2FnZSBpbiBwYWNrYWdlczoKKyAgICAgICAgcnVuX3Rlc3RzKHBhY2thZ2UsIG1hc2ssIHZlcmJvc2l0eSwgc2VhcmNoX2xlYWtzKQorCisKK2RlZiBydW5fdGVzdHMocGFja2FnZSwgbWFzaywgdmVyYm9zaXR5LCBzZWFyY2hfbGVha3MpOgorICAgIHNraXBwZWQsIHRlc3RjYXNlcyA9IGdldF90ZXN0cyhwYWNrYWdlLCBtYXNrLCB2ZXJib3NpdHkpCisgICAgcnVubmVyID0gVGVzdFJ1bm5lcih2ZXJib3NpdHk9dmVyYm9zaXR5KQorCisgICAgc3VpdGVzID0gW3VuaXR0ZXN0Lm1ha2VTdWl0ZShvKSBmb3IgbyBpbiB0ZXN0Y2FzZXNdCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoc3VpdGVzKQorICAgIHJlc3VsdCA9IHJ1bm5lci5ydW4oc3VpdGUsIHNraXBwZWQpCisKKyAgICBpZiBzZWFyY2hfbGVha3M6CisgICAgICAgICMgaHVudCBmb3IgcmVmY291bnQgbGVha3MKKyAgICAgICAgcnVubmVyID0gQmFzaWNUZXN0UnVubmVyKCkKKyAgICAgICAgZm9yIHQgaW4gdGVzdGNhc2VzOgorICAgICAgICAgICAgdGVzdF93aXRoX3JlZmNvdW50cyhydW5uZXIsIHZlcmJvc2l0eSwgdCkKKworICAgIHJldHVybiBib29sKHJlc3VsdC5lcnJvcnMpCisKK2NsYXNzIEJhc2ljVGVzdFJ1bm5lcjoKKyAgICBkZWYgcnVuKHNlbGYsIHRlc3QpOgorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgdGVzdChyZXN1bHQpCisgICAgICAgIHJldHVybiByZXN1bHQKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC9ydW50ZXN0cy5weSBiL0xpYi9jdHlwZXMvdGVzdC9ydW50ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGQ3Y2FhCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3J1bnRlc3RzLnB5CkBAIC0wLDAgKzEsMTcgQEAKKyIiIlVzYWdlOiBydW50ZXN0cy5weSBbLXFdIFstcl0gWy12XSBbLXUgcmVzb3VyY2VzXSBbbWFza10KKworUnVuIGFsbCB0ZXN0cyBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeSwgYW5kIHByaW50IGEgc3VtbWFyeSBvZiB0aGUgcmVzdWx0cy4KK0NvbW1hbmQgbGluZSBmbGFnczoKKyAgLXEgICAgIHF1aWV0IG1vZGU6IGRvbid0IHBybnQgYW55dGhpbmcgd2hpbGUgdGhlIHRlc3RzIGFyZSBydW5uaW5nCisgIC1yICAgICBydW4gdGVzdHMgcmVwZWF0ZWRseSwgbG9vayBmb3IgcmVmY291bnQgbGVha3MKKyAgLXU8cmVzb3VyY2VzPgorICAgICAgICAgQWRkIHJlc291cmNlcyB0byB0aGUgbGl0cyBvZiBhbGxvd2VkIHJlc291cmNlcy4gJyonIGFsbG93cyBhbGwKKyAgICAgICAgIHJlc291cmNlcy4KKyAgLXYgICAgIHZlcmJvc2UgbW9kZTogcHJpbnQgdGhlIHRlc3QgY3VycmVudGx5IGV4ZWN1dGVkCisgIG1hc2sgICBtYXNrIHRvIHNlbGVjdCBmaWxlbmFtZXMgY29udGFpbmluZyB0ZXN0Y2FzZXMsIHdpbGRjYXJkcyBhbGxvd2VkCisiIiIKK2ltcG9ydCBzeXMKK2ltcG9ydCBjdHlwZXMudGVzdAorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5leGl0KGN0eXBlcy50ZXN0Lm1haW4oY3R5cGVzLnRlc3QpKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlfaW5fcG9pbnRlci5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FycmF5X2luX3BvaW50ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZlMzYzMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FycmF5X2luX3BvaW50ZXIucHkKQEAgLTAsMCArMSw2NCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBiaW5hc2NpaSBpbXBvcnQgaGV4bGlmeQoraW1wb3J0IHJlCisKK2RlZiBkdW1wKG9iaik6CisgICAgIyBoZWxwZXIgZnVuY3Rpb24gdG8gZHVtcCBtZW1vcnkgY29udGVudHMgaW4gaGV4LCB3aXRoIGEgaHlwaGVuCisgICAgIyBiZXR3ZWVuIHRoZSBieXRlcy4KKyAgICBoID0gaGV4bGlmeShidWZmZXIob2JqKSkKKyAgICByZXR1cm4gcmUuc3ViKHIiKC4uKSIsIHIiXDEtIiwgaClbOi0xXQorICAgIAorCitjbGFzcyBWYWx1ZShTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygidmFsIiwgY19ieXRlKV0KKworY2xhc3MgQ29udGFpbmVyKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJwdmFsdWVzIiwgUE9JTlRFUihWYWx1ZSkpXQorCitjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgIyBjcmVhdGUgYW4gYXJyYXkgb2YgNCB2YWx1ZXMKKyAgICAgICAgdmFsX2FycmF5ID0gKFZhbHVlICogNCkoKQorCisgICAgICAgICMgY3JlYXRlIGEgY29udGFpbmVyLCB3aGljaCBob2xkcyBhIHBvaW50ZXIgdG8gdGhlIHB2YWx1ZXMgYXJyYXkuCisgICAgICAgIGMgPSBDb250YWluZXIoKQorICAgICAgICBjLnB2YWx1ZXMgPSB2YWxfYXJyYXkKKworICAgICAgICAjIG1lbW9yeSBjb250YWlucyA0IE5VTCBieXRlcyBub3csIHRoYXQncyBjb3JyZWN0CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIwMC0wMC0wMC0wMCIsIGR1bXAodmFsX2FycmF5KSkKKworICAgICAgICAjIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBhcnJheSB0aHJvdWdoIHRoZSBwb2ludGVyOgorICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKKyAgICAgICAgICAgIGMucHZhbHVlc1tpXS52YWwgPSBpICsgMQorCisgICAgICAgIHZhbHVlcyA9IFtjLnB2YWx1ZXNbaV0udmFsIGZvciBpIGluIHJhbmdlKDQpXQorCisgICAgICAgICMgVGhlc2UgYXJlIHRoZSBleHBlY3RlZCByZXN1bHRzOiBoZXJlIHMgdGhlIGJ1ZyEKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICAodmFsdWVzLCBkdW1wKHZhbF9hcnJheSkpLAorICAgICAgICAgICAgKFsxLCAyLCAzLCA0XSwgIjAxLTAyLTAzLTA0IikKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKworICAgICAgICB2YWxfYXJyYXkgPSAoVmFsdWUgKiA0KSgpCisKKyAgICAgICAgIyBtZW1vcnkgY29udGFpbnMgNCBOVUwgYnl0ZXMgbm93LCB0aGF0J3MgY29ycmVjdAorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiMDAtMDAtMDAtMDAiLCBkdW1wKHZhbF9hcnJheSkpCisKKyAgICAgICAgcHRyID0gY2FzdCh2YWxfYXJyYXksIFBPSU5URVIoVmFsdWUpKQorICAgICAgICAjIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBhcnJheSB0aHJvdWdoIHRoZSBwb2ludGVyOgorICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKKyAgICAgICAgICAgIHB0cltpXS52YWwgPSBpICsgMQorCisgICAgICAgIHZhbHVlcyA9IFtwdHJbaV0udmFsIGZvciBpIGluIHJhbmdlKDQpXQorCisgICAgICAgICMgVGhlc2UgYXJlIHRoZSBleHBlY3RlZCByZXN1bHRzOiBoZXJlIHMgdGhlIGJ1ZyEKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICAodmFsdWVzLCBkdW1wKHZhbF9hcnJheSkpLAorICAgICAgICAgICAgKFsxLCAyLCAzLCA0XSwgIjAxLTAyLTAzLTA0IikKKyAgICAgICAgKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MTJmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheXMucHkKQEAgLTAsMCArMSwxMTIgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworZm9ybWF0cyA9ICJiQmhIaUlsTHFRZmQiCisKK2Zvcm1hdHMgPSBjX2J5dGUsIGNfdWJ5dGUsIGNfc2hvcnQsIGNfdXNob3J0LCBjX2ludCwgY191aW50LCBcCisgICAgICAgICAgY19sb25nLCBjX3Vsb25nbG9uZywgY19mbG9hdCwgY19kb3VibGUKKworY2xhc3MgQXJyYXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgorICAgICAgICAjIGNyZWF0ZSBjbGFzc2VzIGhvbGRpbmcgc2ltcGxlIG51bWVyaWMgdHlwZXMsIGFuZCBjaGVjaworICAgICAgICAjIHZhcmlvdXMgcHJvcGVydGllcy4KKworICAgICAgICBpbml0ID0gcmFuZ2UoMTUsIDI1KQorCisgICAgICAgIGZvciBmbXQgaW4gZm9ybWF0czoKKyAgICAgICAgICAgIGFsZW4gPSBsZW4oaW5pdCkKKyAgICAgICAgICAgIGludF9hcnJheSA9IEFSUkFZKGZtdCwgYWxlbikKKworICAgICAgICAgICAgaWEgPSBpbnRfYXJyYXkoKmluaXQpCisgICAgICAgICAgICAjIGxlbmd0aCBvZiBpbnN0YW5jZSBvaz8KKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihpYSksIGFsZW4pCisKKyAgICAgICAgICAgICMgc2xvdCB2YWx1ZXMgb2s/CisgICAgICAgICAgICB2YWx1ZXMgPSBbaWFbaV0gZm9yIGkgaW4gcmFuZ2UobGVuKGluaXQpKV0KKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbHVlcywgaW5pdCkKKworICAgICAgICAgICAgIyBjaGFuZ2UgdGhlIGl0ZW1zCisgICAgICAgICAgICBmcm9tIG9wZXJhdG9yIGltcG9ydCBzZXRpdGVtCisgICAgICAgICAgICBuZXdfdmFsdWVzID0gcmFuZ2UoNDIsIDQyK2FsZW4pCisgICAgICAgICAgICBbc2V0aXRlbShpYSwgbiwgbmV3X3ZhbHVlc1tuXSkgZm9yIG4gaW4gcmFuZ2UoYWxlbildCisgICAgICAgICAgICB2YWx1ZXMgPSBbaWFbaV0gZm9yIGkgaW4gcmFuZ2UobGVuKGluaXQpKV0KKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbHVlcywgbmV3X3ZhbHVlcykKKworICAgICAgICAgICAgIyBhcmUgdGhlIGl0ZW1zIGluaXRpYWxpemVkIHRvIDA/CisgICAgICAgICAgICBpYSA9IGludF9hcnJheSgpCisgICAgICAgICAgICB2YWx1ZXMgPSBbaWFbaV0gZm9yIGkgaW4gcmFuZ2UobGVuKGluaXQpKV0KKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbHVlcywgWzBdICogbGVuKGluaXQpKQorCisgICAgICAgICAgICAjIFRvbyBtYW55IGluIGl0aWFsaXplcnMgc2hvdWxkIGJlIGNhdWdodAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgaW50X2FycmF5LCAqcmFuZ2UoYWxlbioyKSkKKworICAgICAgICBDaGFyQXJyYXkgPSBBUlJBWShjX2NoYXIsIDMpCisKKyAgICAgICAgY2EgPSBDaGFyQXJyYXkoImEiLCAiYiIsICJjIikKKworICAgICAgICAjIFNob3VsZCB0aGlzIHdvcms/IEl0IGRvZXNuJ3Q6CisgICAgICAgICMgQ2hhckFycmF5KCJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIENoYXJBcnJheSwgImFiYyIpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FbMF0sICJhIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FbMV0sICJiIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FbMl0sICJjIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FbLTNdLCAiYSIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNhWy0yXSwgImIiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjYVstMV0sICJjIikKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oY2EpLCAzKQorCisgICAgICAgICMgc2xpY2luZyBpcyBub3cgc3VwcG9ydGVkLCBidXQgbm90IGV4dGVuZGVkIHNsaWNpbmcgKDMtYXJndW1lbnQpIQorICAgICAgICBmcm9tIG9wZXJhdG9yIGltcG9ydCBnZXRzbGljZSwgZGVsaXRlbQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldHNsaWNlLCBjYSwgMCwgMSwgLTEpCisKKyAgICAgICAgIyBjYW5ub3QgZGVsZXRlIGl0ZW1zCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGVsaXRlbSwgY2EsIDApCisKKyAgICBkZWYgdGVzdF9udW1lcmljX2FycmF5cyhzZWxmKToKKworICAgICAgICBhbGVuID0gNQorCisgICAgICAgIG51bWFycmF5ID0gQVJSQVkoY19pbnQsIGFsZW4pCisKKyAgICAgICAgbmEgPSBudW1hcnJheSgpCisgICAgICAgIHZhbHVlcyA9IFtuYVtpXSBmb3IgaSBpbiByYW5nZShhbGVuKV0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsdWVzLCBbMF0gKiBhbGVuKQorCisgICAgICAgIG5hID0gbnVtYXJyYXkoKltjX2ludCgpXSAqIGFsZW4pCisgICAgICAgIHZhbHVlcyA9IFtuYVtpXSBmb3IgaSBpbiByYW5nZShhbGVuKV0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsdWVzLCBbMF0qYWxlbikKKworICAgICAgICBuYSA9IG51bWFycmF5KDEsIDIsIDMsIDQsIDUpCisgICAgICAgIHZhbHVlcyA9IFtpIGZvciBpIGluIG5hXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWx1ZXMsIFsxLCAyLCAzLCA0LCA1XSkKKworICAgICAgICBuYSA9IG51bWFycmF5KCptYXAoY19pbnQsICgxLCAyLCAzLCA0LCA1KSkpCisgICAgICAgIHZhbHVlcyA9IFtpIGZvciBpIGluIG5hXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWx1ZXMsIFsxLCAyLCAzLCA0LCA1XSkKKworICAgIGRlZiB0ZXN0X2NsYXNzY2FjaGUoc2VsZik6CisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgQVJSQVkoY19pbnQsIDMpIGlzIEFSUkFZKGNfaW50LCA0KSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKEFSUkFZKGNfaW50LCAzKSBpcyBBUlJBWShjX2ludCwgMykpCisKKyAgICBkZWYgdGVzdF9mcm9tX2FkZHJlc3Moc2VsZik6CisgICAgICAgICMgRmFpbGVkIHdpdGggMC45LjgsIHJlcG9ydGVkIGJ5IEpVcm5lcgorICAgICAgICBwID0gY3JlYXRlX3N0cmluZ19idWZmZXIoImZvbyIpCisgICAgICAgIHN6ID0gKGNfY2hhciAqIDMpLmZyb21fYWRkcmVzcyhhZGRyZXNzb2YocCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN6WzpdLCAiZm9vIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3oudmFsdWUsICJmb28iKQorCisgICAgdHJ5OgorICAgICAgICBjcmVhdGVfdW5pY29kZV9idWZmZXIKKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgZGVmIHRlc3RfZnJvbV9hZGRyZXNzVyhzZWxmKToKKyAgICAgICAgICAgIHAgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoImZvbyIpCisgICAgICAgICAgICBzeiA9IChjX3djaGFyICogMykuZnJvbV9hZGRyZXNzKGFkZHJlc3NvZihwKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN6WzpdLCAiZm9vIikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN6LnZhbHVlLCAiZm9vIikKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWQ4NzA5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5CkBAIC0wLDAgKzEsMjE5IEBACitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKKworaW1wb3J0IGN0eXBlcworaW1wb3J0IF9jdHlwZXNfdGVzdAorCitjbGFzcyBCSVRTKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJBIiwgY19pbnQsIDEpLAorICAgICAgICAgICAgICAgICgiQiIsIGNfaW50LCAyKSwKKyAgICAgICAgICAgICAgICAoIkMiLCBjX2ludCwgMyksCisgICAgICAgICAgICAgICAgKCJEIiwgY19pbnQsIDQpLAorICAgICAgICAgICAgICAgICgiRSIsIGNfaW50LCA1KSwKKyAgICAgICAgICAgICAgICAoIkYiLCBjX2ludCwgNiksCisgICAgICAgICAgICAgICAgKCJHIiwgY19pbnQsIDcpLAorICAgICAgICAgICAgICAgICgiSCIsIGNfaW50LCA4KSwKKyAgICAgICAgICAgICAgICAoIkkiLCBjX2ludCwgOSksCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgKCJNIiwgY19zaG9ydCwgMSksCisgICAgICAgICAgICAgICAgKCJOIiwgY19zaG9ydCwgMiksCisgICAgICAgICAgICAgICAgKCJPIiwgY19zaG9ydCwgMyksCisgICAgICAgICAgICAgICAgKCJQIiwgY19zaG9ydCwgNCksCisgICAgICAgICAgICAgICAgKCJRIiwgY19zaG9ydCwgNSksCisgICAgICAgICAgICAgICAgKCJSIiwgY19zaG9ydCwgNiksCisgICAgICAgICAgICAgICAgKCJTIiwgY19zaG9ydCwgNyldCisKK2Z1bmMgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKS51bnBhY2tfYml0ZmllbGRzCitmdW5jLmFyZ3R5cGVzID0gUE9JTlRFUihCSVRTKSwgY19jaGFyCisKKyMjZm9yIG4gaW4gIkFCQ0RFRkdISU1OT1BRUlMiOgorIyMgICAgcHJpbnQgbiwgaGV4KGdldGF0dHIoQklUUywgbikuc2l6ZSksIGdldGF0dHIoQklUUywgbikub2Zmc2V0CisKK2NsYXNzIENfVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9pbnRzKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZSg1MTIpOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gIkFCQ0RFRkdISSI6CisgICAgICAgICAgICAgICAgYiA9IEJJVFMoKQorICAgICAgICAgICAgICAgIHNldGF0dHIoYiwgbmFtZSwgaSkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgobmFtZSwgaSwgZ2V0YXR0cihiLCBuYW1lKSksIChuYW1lLCBpLCBmdW5jKGJ5cmVmKGIpLCBuYW1lKSkpCisKKyAgICBkZWYgdGVzdF9zaG9ydHMoc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiAiTU5PUFFSUyI6CisgICAgICAgICAgICAgICAgYiA9IEJJVFMoKQorICAgICAgICAgICAgICAgIHNldGF0dHIoYiwgbmFtZSwgaSkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgobmFtZSwgaSwgZ2V0YXR0cihiLCBuYW1lKSksIChuYW1lLCBpLCBmdW5jKGJ5cmVmKGIpLCBuYW1lKSkpCisKK3NpZ25lZF9pbnRfdHlwZXMgPSAoY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2xvbmdsb25nKQordW5zaWduZWRfaW50X3R5cGVzID0gKGNfdWJ5dGUsIGNfdXNob3J0LCBjX3VpbnQsIGNfdWxvbmcsIGNfdWxvbmdsb25nKQoraW50X3R5cGVzID0gdW5zaWduZWRfaW50X3R5cGVzICsgc2lnbmVkX2ludF90eXBlcworCitjbGFzcyBCaXRGaWVsZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbG9uZ2xvbmcoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfbG9uZ2xvbmcsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19sb25nbG9uZywgNjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY19sb25nbG9uZywgMSldCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19sb25nbG9uZykpCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgeC5hLCB4LmIsIHguYyA9IC0xLCA3LCAtMQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoeC5hLCB4LmIsIHguYyksICgtMSwgNywgLTEpKQorICAgICAgICAKKyAgICBkZWYgdGVzdF91bG9uZ2xvbmcoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfdWxvbmdsb25nLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfdWxvbmdsb25nLCA2MiksCisgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3Vsb25nbG9uZywgMSldCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19sb25nbG9uZykpCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHguYSwgeC5iLCB4LmMpLCAoMCwgMCwgMCkpCisgICAgICAgIHguYSwgeC5iLCB4LmMgPSA3LCA3LCA3CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh4LmEsIHguYiwgeC5jKSwgKDEsIDcsIDEpKQorCisgICAgZGVmIHRlc3Rfc2lnbmVkKHNlbGYpOgorICAgICAgICBmb3IgY190eXAgaW4gc2lnbmVkX2ludF90eXBlczoKKyAgICAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImR1bW15IiwgY190eXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYSIsIGNfdHlwLCAzKSwgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY190eXAsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsIGNfdHlwLCAxKV0KKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfdHlwKSoyKQorCisgICAgICAgICAgICB4ID0gWCgpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIDAsIDAsIDApKQorICAgICAgICAgICAgeC5hID0gLTEKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKChjX3R5cCwgeC5hLCB4LmIsIHguYyksIChjX3R5cCwgLTEsIDAsIDApKQorICAgICAgICAgICAgeC5hLCB4LmIgPSAwLCAtMQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCAtMSwgMCkpCisKKworICAgIGRlZiB0ZXN0X3Vuc2lnbmVkKHNlbGYpOgorICAgICAgICBmb3IgY190eXAgaW4gdW5zaWduZWRfaW50X3R5cGVzOgorICAgICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfdHlwLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3R5cCwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY190eXAsIDEpXQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY190eXApKQorCisgICAgICAgICAgICB4ID0gWCgpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIDAsIDAsIDApKQorICAgICAgICAgICAgeC5hID0gLTEKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKChjX3R5cCwgeC5hLCB4LmIsIHguYyksIChjX3R5cCwgNywgMCwgMCkpCisgICAgICAgICAgICB4LmEsIHguYiA9IDAsIC0xCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIDAsIDcsIDApKQorCisKKyAgICBkZWYgZmFpbF9maWVsZHMoc2VsZiwgKmZpZWxkcyk6CisgICAgICAgIHJldHVybiBzZWxmLmdldF9leGNlcHQodHlwZShTdHJ1Y3R1cmUpLCAiWCIsICgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiX2ZpZWxkc18iOiBmaWVsZHN9KQorCisgICAgZGVmIHRlc3Rfbm9uaW50X3R5cGVzKHNlbGYpOgorICAgICAgICAjIGJpdCBmaWVsZHMgYXJlIG5vdCBhbGxvd2VkIG9uIG5vbi1pbnRlZ2VyIHR5cGVzLgorICAgICAgICByZXN1bHQgPSBzZWxmLmZhaWxfZmllbGRzKCgiYSIsIGNfY2hhcl9wLCAxKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBjX2NoYXJfcCcpKQorCisgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY192b2lkX3AsIDEpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfdm9pZF9wJykpCisKKyAgICAgICAgaWYgY19pbnQgIT0gY19sb25nOgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBQT0lOVEVSKGNfaW50KSwgMSkpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIExQX2NfaW50JykpCisKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBjX2NoYXIsIDEpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfY2hhcicpKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNfd2NoYXIKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY193Y2hhciwgMSkpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfd2NoYXInKSkKKworICAgICAgICBjbGFzcyBEdW1teShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbXQorCisgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgRHVtbXksIDEpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIER1bW15JykpCisKKyAgICBkZWYgdGVzdF9zaW5nbGVfYml0ZmllbGRfc2l6ZShzZWxmKToKKyAgICAgICAgZm9yIGNfdHlwIGluIGludF90eXBlczoKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY190eXAsIC0xKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgKFZhbHVlRXJyb3IsICdudW1iZXIgb2YgYml0cyBpbnZhbGlkIGZvciBiaXQgZmllbGQnKSkKKworICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBjX3R5cCwgMCkpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChWYWx1ZUVycm9yLCAnbnVtYmVyIG9mIGJpdHMgaW52YWxpZCBmb3IgYml0IGZpZWxkJykpCisKKyAgICAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX3R5cCwgMSldCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3R5cCkpCisKKyAgICAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX3R5cCwgc2l6ZW9mKGNfdHlwKSo4KV0KKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfdHlwKSkKKworICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBjX3R5cCwgc2l6ZW9mKGNfdHlwKSo4ICsgMSkpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChWYWx1ZUVycm9yLCAnbnVtYmVyIG9mIGJpdHMgaW52YWxpZCBmb3IgYml0IGZpZWxkJykpCisKKyAgICBkZWYgdGVzdF9tdWx0aV9iaXRmaWVsZHNfc2l6ZShzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19zaG9ydCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3Nob3J0LCAxNCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3Nob3J0LCAxKV0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19zaG9ydCkpCisKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19zaG9ydCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImExIiwgY19zaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3Nob3J0LCAxNCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3Nob3J0LCAxKV0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19zaG9ydCkqMykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5hLm9mZnNldCwgMCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5hMS5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5iLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFguYy5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSoyKQorCisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfc2hvcnQsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19zaG9ydCwgMTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY19zaG9ydCwgMTQpXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3Nob3J0KSozKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLmEub2Zmc2V0LCBzaXplb2YoY19zaG9ydCkqMCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5iLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFguYy5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSoyKQorCisKKyAgICBkZWYgZ2V0X2V4Y2VwdChzZWxmLCBmdW5jLCAqYXJncywgKiprdyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMoKmFyZ3MsICoqa3cpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGRldGFpbDoKKyAgICAgICAgICAgIHJldHVybiBkZXRhaWwuX19jbGFzc19fLCBzdHIoZGV0YWlsKQorCisgICAgZGVmIHRlc3RfbWl4ZWRfMShzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50LCA0KV0KKyAgICAgICAgaWYgb3MubmFtZSBpbiAoIm50IiwgImNlIik6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkqMikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSkKKworICAgIGRlZiB0ZXN0X21peGVkXzIoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfYnl0ZSwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCwgMzIpXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkqMikKKworICAgIGRlZiB0ZXN0X21peGVkXzMoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfYnl0ZSwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3VieXRlLCA0KV0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19ieXRlKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J1ZmZlcnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NGU4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5CkBAIC0wLDAgKzEsNTQgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgU3RyaW5nQnVmZmVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYnVmZmVyKHNlbGYpOgorICAgICAgICBiID0gY3JlYXRlX3N0cmluZ19idWZmZXIoMzIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihiKSwgMzIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihiKSwgMzIgKiBzaXplb2YoY19jaGFyKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoYlswXSkgaXMgc3RyKQorICAgICAgICAKKyAgICAgICAgYiA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKCJhYmMiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oYiksIDQpICMgdHJhaWxpbmcgbnVsIGNoYXIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKGIpLCA0ICogc2l6ZW9mKGNfY2hhcikpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKGJbMF0pIGlzIHN0cikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYlswXSwgImEiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzpdLCAiYWJjXDAiKQorICAgICAgICAKKyAgICBkZWYgdGVzdF9zdHJpbmdfY29udmVyc2lvbihzZWxmKToKKyAgICAgICAgYiA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKHUiYWJjIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKGIpLCA0KSAjIHRyYWlsaW5nIG51bCBjaGFyCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihiKSwgNCAqIHNpemVvZihjX2NoYXIpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShiWzBdKSBpcyBzdHIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbMF0sICJhIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYls6XSwgImFiY1wwIikKKworICAgIHRyeToKKyAgICAgICAgY193Y2hhcgorICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBkZWYgdGVzdF91bmljb2RlX2J1ZmZlcihzZWxmKToKKyAgICAgICAgICAgIGIgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoMzIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oYiksIDMyKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKGIpLCAzMiAqIHNpemVvZihjX3djaGFyKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKGJbMF0pIGlzIHVuaWNvZGUpCisKKyAgICAgICAgICAgIGIgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIodSJhYmMiKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKGIpLCA0KSAjIHRyYWlsaW5nIG51bCBjaGFyCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoYiksIDQgKiBzaXplb2YoY193Y2hhcikpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShiWzBdKSBpcyB1bmljb2RlKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYlswXSwgdSJhIikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOl0sICJhYmNcMCIpCisKKyAgICAgICAgZGVmIHRlc3RfdW5pY29kZV9jb252ZXJzaW9uKHNlbGYpOgorICAgICAgICAgICAgYiA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcigiYWJjIikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihiKSwgNCkgIyB0cmFpbGluZyBudWwgY2hhcgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKGIpLCA0ICogc2l6ZW9mKGNfd2NoYXIpKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoYlswXSkgaXMgdW5pY29kZSkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbMF0sIHUiYSIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzpdLCAiYWJjXDAiKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWE1ZjdmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHkKQEAgLTAsMCArMSwyMjEgQEAKK2ltcG9ydCBzeXMsIHVuaXR0ZXN0LCBzdHJ1Y3QsIG1hdGgKK2Zyb20gYmluYXNjaWkgaW1wb3J0IGhleGxpZnkKKworZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworZGVmIGJpbihzKToKKyAgICByZXR1cm4gaGV4bGlmeShidWZmZXIocykpLnVwcGVyKCkKKworIyBFYWNoICpzaW1wbGUqIHR5cGUgdGhhdCBzdXBwb3J0cyBkaWZmZXJlbnQgYnl0ZSBvcmRlcnMgaGFzIGFuCisjIF9fY3R5cGVfYmVfXyBhdHRyaWJ1dGUgdGhhdCBzcGVjaWZpZXMgdGhlIHNhbWUgdHlwZSBpbiBCSUcgRU5ESUFOCisjIGJ5dGUgb3JkZXIsIGFuZCBhIF9fY3R5cGVfbGVfXyBhdHRyaWJ1dGUgdGhhdCBpcyB0aGUgc2FtZSB0eXBlIGluCisjIExJVFRMRSBFTkRJQU4gYnl0ZSBvcmRlci4KKyMKKyMgRm9yIFN0cnVjdHVyZXMgYW5kIFVuaW9ucywgdGhlc2UgdHlwZXMgYXJlIGNyZWF0ZWQgb24gZGVtYW5kLiAKKworY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIFhfdGVzdChzZWxmKToKKyAgICAgICAgcHJpbnQgc3lzLmJ5dGVvcmRlcgorICAgICAgICBmb3IgaSBpbiByYW5nZSgzMik6CisgICAgICAgICAgICBiaXRzID0gQklUUygpCisgICAgICAgICAgICBzZXRhdHRyKGJpdHMsICJpJXMiICUgaSwgMSkKKyAgICAgICAgICAgIGR1bXAoYml0cykKKworICAgIGRlZiB0ZXN0X2VuZGlhbl9zaG9ydChzZWxmKToKKyAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX3Nob3J0Ll9fY3R5cGVfbGVfXyBpcyBjX3Nob3J0KQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfc2hvcnQuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX3Nob3J0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfc2hvcnQuX19jdHlwZV9iZV9fIGlzIGNfc2hvcnQpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19zaG9ydC5fX2N0eXBlX2xlX18uX19jdHlwZV9iZV9fIGlzIGNfc2hvcnQpCisgICAgICAgIHMgPSBjX3Nob3J0Ll9fY3R5cGVfYmVfXygweDEyMzQpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmgiLCAweDEyMzQpKSwgIjEyMzQiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4ocyksICIxMjM0IikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgMHgxMjM0KQorCisgICAgICAgIHMgPSBjX3Nob3J0Ll9fY3R5cGVfbGVfXygweDEyMzQpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPGgiLCAweDEyMzQpKSwgIjM0MTIiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4ocyksICIzNDEyIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgMHgxMjM0KQorCisgICAgICAgIHMgPSBjX3VzaG9ydC5fX2N0eXBlX2JlX18oMHgxMjM0KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oc3RydWN0LnBhY2soIj5oIiwgMHgxMjM0KSksICIxMjM0IikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiMTIzNCIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMudmFsdWUsIDB4MTIzNCkKKworICAgICAgICBzID0gY191c2hvcnQuX19jdHlwZV9sZV9fKDB4MTIzNCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8aCIsIDB4MTIzNCkpLCAiMzQxMiIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzKSwgIjM0MTIiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCAweDEyMzQpCisKKyAgICBkZWYgdGVzdF9lbmRpYW5faW50KHNlbGYpOgorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfaW50Ll9fY3R5cGVfbGVfXyBpcyBjX2ludCkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2ludC5fX2N0eXBlX2JlX18uX19jdHlwZV9sZV9fIGlzIGNfaW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfaW50Ll9fY3R5cGVfYmVfXyBpcyBjX2ludCkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2ludC5fX2N0eXBlX2xlX18uX19jdHlwZV9iZV9fIGlzIGNfaW50KQorCisgICAgICAgIHMgPSBjX2ludC5fX2N0eXBlX2JlX18oMHgxMjM0NTY3OCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI+aSIsIDB4MTIzNDU2NzgpKSwgIjEyMzQ1Njc4IikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiMTIzNDU2NzgiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4KQorCisgICAgICAgIHMgPSBjX2ludC5fX2N0eXBlX2xlX18oMHgxMjM0NTY3OCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8aSIsIDB4MTIzNDU2NzgpKSwgIjc4NTYzNDEyIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4KQorCisgICAgICAgIHMgPSBjX3VpbnQuX19jdHlwZV9iZV9fKDB4MTIzNDU2NzgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPkkiLCAweDEyMzQ1Njc4KSksICIxMjM0NTY3OCIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzKSwgIjEyMzQ1Njc4IikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgMHgxMjM0NTY3OCkKKworICAgICAgICBzID0gY191aW50Ll9fY3R5cGVfbGVfXygweDEyMzQ1Njc4KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oc3RydWN0LnBhY2soIjxJIiwgMHgxMjM0NTY3OCkpLCAiNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4ocyksICI3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMudmFsdWUsIDB4MTIzNDU2NzgpCisKKyAgICBkZWYgdGVzdF9lbmRpYW5fbG9uZ2xvbmcoc2VsZik6CisgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19sb25nbG9uZy5fX2N0eXBlX2xlX18gaXMgY19sb25nbG9uZykKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2xvbmdsb25nLl9fY3R5cGVfYmVfXy5fX2N0eXBlX2xlX18gaXMgY19sb25nbG9uZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2xvbmdsb25nLl9fY3R5cGVfYmVfXyBpcyBjX2xvbmdsb25nKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfbG9uZ2xvbmcuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2xvbmdsb25nKQorCisgICAgICAgIHMgPSBjX2xvbmdsb25nLl9fY3R5cGVfYmVfXygweDEyMzQ1Njc4OTBBQkNERUYpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPnEiLCAweDEyMzQ1Njc4OTBBQkNERUYpKSwgIjEyMzQ1Njc4OTBBQkNERUYiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4ocyksICIxMjM0NTY3ODkwQUJDREVGIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgMHgxMjM0NTY3ODkwQUJDREVGKQorCisgICAgICAgIHMgPSBjX2xvbmdsb25nLl9fY3R5cGVfbGVfXygweDEyMzQ1Njc4OTBBQkNERUYpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPHEiLCAweDEyMzQ1Njc4OTBBQkNERUYpKSwgIkVGQ0RBQjkwNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4ocyksICJFRkNEQUI5MDc4NTYzNDEyIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgMHgxMjM0NTY3ODkwQUJDREVGKQorCisgICAgICAgIHMgPSBjX3Vsb25nbG9uZy5fX2N0eXBlX2JlX18oMHgxMjM0NTY3ODkwQUJDREVGKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oc3RydWN0LnBhY2soIj5RIiwgMHgxMjM0NTY3ODkwQUJDREVGKSksICIxMjM0NTY3ODkwQUJDREVGIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiMTIzNDU2Nzg5MEFCQ0RFRiIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMudmFsdWUsIDB4MTIzNDU2Nzg5MEFCQ0RFRikKKworICAgICAgICBzID0gY191bG9uZ2xvbmcuX19jdHlwZV9sZV9fKDB4MTIzNDU2Nzg5MEFCQ0RFRikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8USIsIDB4MTIzNDU2Nzg5MEFCQ0RFRikpLCAiRUZDREFCOTA3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzKSwgIkVGQ0RBQjkwNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4OTBBQkNERUYpCisKKyAgICBkZWYgdGVzdF9lbmRpYW5fZmxvYXQoc2VsZik6CisgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19mbG9hdC5fX2N0eXBlX2xlX18gaXMgY19mbG9hdCkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2Zsb2F0Ll9fY3R5cGVfYmVfXy5fX2N0eXBlX2xlX18gaXMgY19mbG9hdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2Zsb2F0Ll9fY3R5cGVfYmVfXyBpcyBjX2Zsb2F0KQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfZmxvYXQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2Zsb2F0KQorICAgICAgICBzID0gY19mbG9hdChtYXRoLnBpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oc3RydWN0LnBhY2soImYiLCBtYXRoLnBpKSksIGJpbihzKSkKKyAgICAgICAgIyBIbSwgd2hhdCdzIHRoZSBwcmVjaXNpb24gb2YgYSBmbG9hdCBjb21wYXJlZCB0byBhIGRvdWJsZT8KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzQWxtb3N0RXF1YWwocy52YWx1ZSwgbWF0aC5waSwgNikKKyAgICAgICAgcyA9IGNfZmxvYXQuX19jdHlwZV9sZV9fKG1hdGgucGkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0FsbW9zdEVxdWFsKHMudmFsdWUsIG1hdGgucGksIDYpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPGYiLCBtYXRoLnBpKSksIGJpbihzKSkKKyAgICAgICAgcyA9IGNfZmxvYXQuX19jdHlwZV9iZV9fKG1hdGgucGkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0FsbW9zdEVxdWFsKHMudmFsdWUsIG1hdGgucGksIDYpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmYiLCBtYXRoLnBpKSksIGJpbihzKSkKKworICAgIGRlZiB0ZXN0X2VuZGlhbl9kb3VibGUoc2VsZik6CisgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19kb3VibGUuX19jdHlwZV9sZV9fIGlzIGNfZG91YmxlKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfZG91YmxlLl9fY3R5cGVfYmVfXy5fX2N0eXBlX2xlX18gaXMgY19kb3VibGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19kb3VibGUuX19jdHlwZV9iZV9fIGlzIGNfZG91YmxlKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfZG91YmxlLl9fY3R5cGVfbGVfXy5fX2N0eXBlX2JlX18gaXMgY19kb3VibGUpCisgICAgICAgIHMgPSBjX2RvdWJsZShtYXRoLnBpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCBtYXRoLnBpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oc3RydWN0LnBhY2soImQiLCBtYXRoLnBpKSksIGJpbihzKSkKKyAgICAgICAgcyA9IGNfZG91YmxlLl9fY3R5cGVfbGVfXyhtYXRoLnBpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCBtYXRoLnBpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oc3RydWN0LnBhY2soIjxkIiwgbWF0aC5waSkpLCBiaW4ocykpCisgICAgICAgIHMgPSBjX2RvdWJsZS5fX2N0eXBlX2JlX18obWF0aC5waSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgbWF0aC5waSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI+ZCIsIG1hdGgucGkpKSwgYmluKHMpKQorCisgICAgZGVmIHRlc3RfZW5kaWFuX290aGVyKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19ieXRlLl9fY3R5cGVfbGVfXyBpcyBjX2J5dGUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2J5dGUuX19jdHlwZV9iZV9fIGlzIGNfYnl0ZSkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY191Ynl0ZS5fX2N0eXBlX2xlX18gaXMgY191Ynl0ZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfdWJ5dGUuX19jdHlwZV9iZV9fIGlzIGNfdWJ5dGUpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfY2hhci5fX2N0eXBlX2xlX18gaXMgY19jaGFyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19jaGFyLl9fY3R5cGVfYmVfXyBpcyBjX2NoYXIpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3RfZmllbGRzKHNlbGYpOgorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgICAgICAgICAgYmFzZSA9IEJpZ0VuZGlhblN0cnVjdHVyZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmFzZSA9IExpdHRsZUVuZGlhblN0cnVjdHVyZQorCisgICAgICAgIGNsYXNzIFQoYmFzZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfdWJ5dGUpLAorICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3Nob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgKCJkIiwgY191c2hvcnQpLAorICAgICAgICAgICAgICAgICAgICAoImUiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICgiZiIsIGNfdWludCksCisgICAgICAgICAgICAgICAgICAgICgiZyIsIGNfbG9uZyksCisgICAgICAgICAgICAgICAgICAgICgiaCIsIGNfdWxvbmcpLAorICAgICAgICAgICAgICAgICAgICAoImkiLCBjX2xvbmdsb25nKSwKKyAgICAgICAgICAgICAgICAgICAgKCJrIiwgY191bG9uZ2xvbmcpLAorICAgICAgICAgICAgICAgICAgICAoImwiLCBjX2Zsb2F0KSwKKyAgICAgICAgICAgICAgICAgICAgKCJtIiwgY19kb3VibGUpLAorICAgICAgICAgICAgICAgICAgICAoIm4iLCBjX2NoYXIpLAorCisgICAgICAgICAgICAgICAgICAgICgiYjEiLCBjX2J5dGUsIDMpLAorICAgICAgICAgICAgICAgICAgICAoImIyIiwgY19ieXRlLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgKCJiMyIsIGNfYnl0ZSwgMiksCisgICAgICAgICAgICAgICAgICAgICgiYSIsIGNfaW50ICogMyAqIDMgKiAzKV0KKyAgICAgICAgVC5fZmllbGRzXyA9IF9maWVsZHNfCisKKyAgICAgICAgIyB0aGVzZSBmaWVsZHMgZG8gbm90IHN1cHBvcnQgZGlmZmVyZW50IGJ5dGUgb3JkZXI6CisgICAgICAgIGZvciB0eXAgaW4gY193Y2hhciwgY192b2lkX3AsIFBPSU5URVIoY19pbnQpOgorICAgICAgICAgICAgX2ZpZWxkc18uYXBwZW5kKCgieCIsIHR5cCkpCisgICAgICAgICAgICBjbGFzcyBUKGJhc2UpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgVCwgIl9maWVsZHNfIiwgWygieCIsIHR5cCldKQorCisgICAgZGVmIHRlc3Rfc3RydWN0X3N0cnVjdChzZWxmKToKKyAgICAgICAgIyBOZXN0ZWQgc3RydWN0dXJlcyB3aXRoIGRpZmZlcmVudCBieXRlIG9yZGVyIG5vdCAoeWV0KSBzdXBwb3J0ZWQKKyAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKKyAgICAgICAgICAgIGJhc2UgPSBCaWdFbmRpYW5TdHJ1Y3R1cmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJhc2UgPSBMaXR0bGVFbmRpYW5TdHJ1Y3R1cmUKKworICAgICAgICBjbGFzcyBUKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCldCisgICAgICAgIGNsYXNzIFMoYmFzZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgUywgIl9maWVsZHNfIiwgWygicyIsIFQpXSkKKworICAgIGRlZiB0ZXN0X3N0cnVjdF9maWVsZHMoc2VsZik6CisgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICBiYXNlID0gQmlnRW5kaWFuU3RydWN0dXJlCisgICAgICAgICAgICBmbXQgPSAiPmJoaWQiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYXNlID0gTGl0dGxlRW5kaWFuU3RydWN0dXJlCisgICAgICAgICAgICBmbXQgPSAiPGJoaWQiCisKKyAgICAgICAgY2xhc3MgUyhiYXNlKToKKyAgICAgICAgICAgIF9wYWNrXyA9IDEgIyBzdHJ1Y3Qgd2l0aCAnPCcgb3IgJz4nIHVzZXMgc3RhbmRhcmQgYWxpZ25tZW50LgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJiIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaCIsIGNfc2hvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJpIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgY19kb3VibGUpXQorCisgICAgICAgIHMxID0gUygweDEyLCAweDEyMzQsIDB4MTIzNDU2NzgsIDMuMTQpCisgICAgICAgIHMyID0gc3RydWN0LnBhY2soZm10LCAweDEyLCAweDEyMzQsIDB4MTIzNDU2NzgsIDMuMTQpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzMSksIGJpbihzMikpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkZWU3OAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weQpAQCAtMCwwICsxLDEzOSBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IF9jdHlwZXNfdGVzdAorCitjbGFzcyBDYWxsYmFja3ModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGZ1bmN0eXBlID0gQ0ZVTkNUWVBFICAgIAorCisjIyAgICBkZWYgdGVhckRvd24oc2VsZik6CisjIyAgICAgICAgaW1wb3J0IGdjCisjIyAgICAgICAgZ2MuY29sbGVjdCgpCisKKyAgICBkZWYgY2FsbGJhY2soc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLmdvdF9hcmdzID0gYXJncworICAgICAgICByZXR1cm4gYXJnc1stMV0KKworICAgIGRlZiBjaGVja190eXBlKHNlbGYsIHR5cCwgYXJnKToKKyAgICAgICAgUFJPVE8gPSBzZWxmLmZ1bmN0eXBlLmltX2Z1bmModHlwLCB0eXApCisgICAgICAgIHJlc3VsdCA9IFBST1RPKHNlbGYuY2FsbGJhY2spKGFyZykKKyAgICAgICAgaWYgdHlwID09IGNfZmxvYXQ6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NBbG1vc3RFcXVhbChyZXN1bHQsIGFyZywgcGxhY2VzPTUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmdvdF9hcmdzLCAoYXJnLCkpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIGFyZykKKworICAgICAgICBQUk9UTyA9IHNlbGYuZnVuY3R5cGUuaW1fZnVuYyh0eXAsIGNfYnl0ZSwgdHlwKQorICAgICAgICByZXN1bHQgPSBQUk9UTyhzZWxmLmNhbGxiYWNrKSgtMywgYXJnKQorICAgICAgICBpZiB0eXAgPT0gY19mbG9hdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0FsbW9zdEVxdWFsKHJlc3VsdCwgYXJnLCBwbGFjZXM9NSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuZ290X2FyZ3MsICgtMywgYXJnKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgYXJnKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIworCisgICAgZGVmIHRlc3RfYnl0ZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfYnl0ZSwgNDIpCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2J5dGUsIC00MikKKworICAgIGRlZiB0ZXN0X3VieXRlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY191Ynl0ZSwgNDIpCisKKyAgICBkZWYgdGVzdF9zaG9ydChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfc2hvcnQsIDQyKQorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19zaG9ydCwgLTQyKQorCisgICAgZGVmIHRlc3RfdXNob3J0KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY191c2hvcnQsIDQyKQorCisgICAgZGVmIHRlc3RfaW50KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19pbnQsIDQyKQorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19pbnQsIC00MikKKworICAgIGRlZiB0ZXN0X3VpbnQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX3VpbnQsIDQyKQorCisgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfbG9uZywgNDIpCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2xvbmcsIC00MikKKworICAgIGRlZiB0ZXN0X3Vsb25nKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY191bG9uZywgNDIpCisKKyAgICBkZWYgdGVzdF9sb25nbG9uZyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfbG9uZ2xvbmcsIDQyKQorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19sb25nbG9uZywgLTQyKQorCisgICAgZGVmIHRlc3RfdWxvbmdsb25nKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY191bG9uZ2xvbmcsIDQyKQorCisgICAgZGVmIHRlc3RfZmxvYXQoc2VsZik6CisgICAgICAgICMgb25seSBhbG1vc3QgZXF1YWw6IGRvdWJsZSAtPiBmbG9hdCAtPiBkb3VibGUKKyAgICAgICAgaW1wb3J0IG1hdGgKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfZmxvYXQsIG1hdGguZSkKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfZmxvYXQsIC1tYXRoLmUpCisKKyAgICBkZWYgdGVzdF9kb3VibGUoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2RvdWJsZSwgMy4xNCkKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfZG91YmxlLCAtMy4xNCkKKworICAgIGRlZiB0ZXN0X2NoYXIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2NoYXIsICJ4IikKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfY2hhciwgImEiKQorCisgICAgIyBkaXNhYmxlZDogd291bGQgbm93IChjb3JyZWN0bHkpIHJhaXNlIGEgUnVudGltZVdhcm5pbmcgYWJvdXQKKyAgICAjIGEgbWVtb3J5IGxlYWsuICBBIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYSBub24taW50ZWdyYWwKKyAgICAjIEMgdHlwZSB3aXRob3V0IGNhdXNpbmcgYSBtZW1vcnkgbGVhay4KKyMjICAgIGRlZiB0ZXN0X2NoYXJfcChzZWxmKToKKyMjICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19jaGFyX3AsICJhYmMiKQorIyMgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2NoYXJfcCwgImRlZiIpCisKKyAgICBkZWYgdGVzdF9weW9iamVjdChzZWxmKToKKyAgICAgICAgbyA9ICgpCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBnZXRyZWZjb3VudCBhcyBncmMKKyAgICAgICAgZm9yIG8gaW4gKCksIFtdLCBvYmplY3QoKToKKyAgICAgICAgICAgIGluaXRpYWwgPSBncmMobykKKyAgICAgICAgICAgICMgVGhpcyBjYWxsIGxlYWtzIGEgcmVmZXJlbmNlIHRvICdvJy4uLgorICAgICAgICAgICAgc2VsZi5jaGVja190eXBlKHB5X29iamVjdCwgbykKKyAgICAgICAgICAgIGJlZm9yZSA9IGdyYyhvKQorICAgICAgICAgICAgIyAuLi5idXQgdGhpcyBjYWxsIGRvZXNuJ3QgbGVhayBhbnkgbW9yZS4gIFdoZXJlIGlzIHRoZSByZWZjb3VudD8KKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdHlwZShweV9vYmplY3QsIG8pCisgICAgICAgICAgICBhZnRlciA9IGdyYyhvKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGFmdGVyLCBvKSwgKGJlZm9yZSwgbykpCisKK3RyeToKKyAgICBXSU5GVU5DVFlQRQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGNsYXNzIFN0ZGNhbGxDYWxsYmFja3MoQ2FsbGJhY2tzKToKKyAgICAgICAgZnVuY3R5cGUgPSBXSU5GVU5DVFlQRQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIFNhbXBsZUNhbGxiYWNrc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2ludGVncmF0ZShzZWxmKToKKyAgICAgICAgIyBEZXJpdmVkIGZyb20gc29tZSB0aGVuIG5vbi13b3JraW5nIGNvZGUsIHBvc3RlZCBieSBEYXZpZCBGb3N0ZXIKKyAgICAgICAgZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKworICAgICAgICAjIFRoZSBmdW5jdGlvbiBwcm90b3R5cGUgY2FsbGVkIGJ5ICdpbnRlZ3JhdGUnOiBkb3VibGUgZnVuYyhkb3VibGUpOworICAgICAgICBDQUxMQkFDSyA9IENGVU5DVFlQRShjX2RvdWJsZSwgY19kb3VibGUpCisKKyAgICAgICAgIyBUaGUgaW50ZWdyYXRlIGZ1bmN0aW9uIGl0c2VsZiwgZXhwb3NlZCBmcm9tIHRoZSBfY3R5cGVzX3Rlc3QgZGxsCisgICAgICAgIGludGVncmF0ZSA9IGRsbC5pbnRlZ3JhdGUKKyAgICAgICAgaW50ZWdyYXRlLmFyZ3R5cGVzID0gKGNfZG91YmxlLCBjX2RvdWJsZSwgQ0FMTEJBQ0ssIGNfbG9uZykKKyAgICAgICAgaW50ZWdyYXRlLnJlc3R5cGUgPSBjX2RvdWJsZQorCisgICAgICAgIGRlZiBmdW5jKHgpOgorICAgICAgICAgICAgcmV0dXJuIHgqKjIKKworICAgICAgICByZXN1bHQgPSBpbnRlZ3JhdGUoMC4wLCAxLjAsIENBTExCQUNLKGZ1bmMpLCAxMCkKKyAgICAgICAgZGlmZiA9IGFicyhyZXN1bHQgLSAxLi8zLikKKyAgICAgICAgCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhkaWZmIDwgMC4wMSwgIiVzIG5vdCBsZXNzIHRoYW4gMC4wMSIgJSBkaWZmKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjI1ZmViCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weQpAQCAtMCwwICsxLDU1IEBACitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCisKK2NsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYXJyYXkycG9pbnRlcihzZWxmKToKKyAgICAgICAgYXJyYXkgPSAoY19pbnQgKiAzKSg0MiwgMTcsIDIpCisKKyAgICAgICAgIyBjYXN0aW5nIGFuIGFycmF5IHRvIGEgcG9pbnRlciB3b3Jrcy4KKyAgICAgICAgcHRyID0gY2FzdChhcnJheSwgUE9JTlRFUihjX2ludCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoMyldLCBbNDIsIDE3LCAyXSkKKworICAgICAgICBpZiAyKnNpemVvZihjX3Nob3J0KSA9PSBzaXplb2YoY19pbnQpOgorICAgICAgICAgICAgcHRyID0gY2FzdChhcnJheSwgUE9JTlRFUihjX3Nob3J0KSkKKyAgICAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoW3B0cltpXSBmb3IgaSBpbiByYW5nZSg2KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzQyLCAwLCAxNywgMCwgMiwgMF0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoNildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCA0MiwgMCwgMTcsIDAsIDJdKQorCisgICAgZGVmIHRlc3RfYWRkcmVzczJwb2ludGVyKHNlbGYpOgorICAgICAgICBhcnJheSA9IChjX2ludCAqIDMpKDQyLCAxNywgMikKKworICAgICAgICAjIG9uIEFNRDY0LCBzaXplb2YoaW50KSA9PSA0IGFuZCBzaXplb2Yodm9pZCAqKSA9PSA4LgorICAgICAgICAjIEJ5IGRlZmF1bHQsIGNhc3Qgd291bGQgY29udmVydCBhIFB5dGhvbiBpbnQgKG9yIGxvbmcpIGludG8KKyAgICAgICAgIyBhIEMgaW50LCB3aGljaCB3b3VsZCBiZSB0b28gc2hvcnQgdG8gcmVwcmVzZW50IGEgcG9pbnRlcgorICAgICAgICAjIG9uIHRoaXMgcGxhdGZvcm0uCisKKyAgICAgICAgIyBTbyB3ZSBoYXZlIHRvIHdyYXAgdGhlIGFkZHJlc3MgaW50byBhIGNfdm9pZF9wIGZvciB0aGlzIHRvIHdvcmsuCisgICAgICAgICMKKyAgICAgICAgIyBYWFggQmV0dGVyIHdvdWxkIGJlIHRvIGhpZGUgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSBjYXN0IGZ1bmN0aW9uLgorICAgICAgICBhZGRyZXNzID0gYWRkcmVzc29mKGFycmF5KQorICAgICAgICBwdHIgPSBjYXN0KGNfdm9pZF9wKGFkZHJlc3MpLCBQT0lOVEVSKGNfaW50KSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoW3B0cltpXSBmb3IgaSBpbiByYW5nZSgzKV0sIFs0MiwgMTcsIDJdKQorCisKKyAgICBkZWYgdGVzdF9wdHIyYXJyYXkoc2VsZik6CisgICAgICAgIGFycmF5ID0gKGNfaW50ICogMykoNDIsIDE3LCAyKQorCisjIyAgICAgICAgIyBIbSwgYWxyZWFkeSB0ZXN0ZWQgYWJvdmUuCisjIyAgICAgICAgcHRyID0gY2FzdChhcnJheSwgUE9JTlRFUihjX2ludCkpCisjIyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoW3B0cltpXSBmb3IgaSBpbiByYW5nZSgzKV0sIFs0MiwgMTcsIDJdKQorCisjICAgICAgICBwcmludCBjYXN0KGFkZHJlc3NvZihhcnJheSksIGNfaW50ICogMylbOl0KKyMjICAgICAgICBwdHIgPSBjYXN0KGFkZHJlc3NvZihwdHIpCisKKyMjICAgICAgICBwcmludCBwdHJbMF0sIHB0clsxXSwgcHRyWzJdCisjIyAgICAgICAgcHRyID0gUE9JTlRFUihjX2ludCkuZnJvbV9hZGRyZXNzKGFkZHJlc3NvZihhcnJheSkpCisjIyAgICAgICAgIyBYWFggdGhpcyBjcmFzaGVzOgorIyMgICAgICAgIHByaW50IHB0clswXSwgcHRyWzFdLCBwdHJbMl0KKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzJiMjhiCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5CkBAIC0wLDAgKzEsMTkxIEBACisjIEEgbG90IG9mIGZhaWx1cmVzIGluIHRoZXNlIHRlc3RzIG9uIE1hYyBPUyBYLgorIyBCeXRlIG9yZGVyIHJlbGF0ZWQ/CisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworaW1wb3J0IF9jdHlwZXNfdGVzdAorCitjbGFzcyBDRnVuY3Rpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBfZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKworICAgIGRlZiBTKHNlbGYpOgorICAgICAgICByZXR1cm4gY19sb25nbG9uZy5pbl9kbGwoc2VsZi5fZGxsLCAibGFzdF90Zl9hcmdfcyIpLnZhbHVlCisgICAgZGVmIFUoc2VsZik6CisgICAgICAgIHJldHVybiBjX3Vsb25nbG9uZy5pbl9kbGwoc2VsZi5fZGxsLCAibGFzdF90Zl9hcmdfdSIpLnZhbHVlCisKKyAgICBkZWYgdGVzdF9ieXRlKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfYi5yZXN0eXBlID0gY19ieXRlCisgICAgICAgIHNlbGYuX2RsbC50Zl9iLmFyZ3R5cGVzID0gKGNfYnl0ZSwpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iKC0xMjYpLCAtNDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtMTI2KQorCisgICAgZGVmIHRlc3RfYnl0ZV9wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfYmIucmVzdHlwZSA9IGNfYnl0ZQorICAgICAgICBzZWxmLl9kbGwudGZfYmIuYXJndHlwZXMgPSAoY19ieXRlLCBjX2J5dGUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iYigwLCAtMTI2KSwgLTQyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgLTEyNikKKworICAgIGRlZiB0ZXN0X3VieXRlKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfQi5yZXN0eXBlID0gY191Ynl0ZQorICAgICAgICBzZWxmLl9kbGwudGZfQi5hcmd0eXBlcyA9IChjX3VieXRlLCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX0IoMjU1KSwgODUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuVSgpLCAyNTUpCisKKyAgICBkZWYgdGVzdF91Ynl0ZV9wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfYkIucmVzdHlwZSA9IGNfdWJ5dGUKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JCLmFyZ3R5cGVzID0gKGNfYnl0ZSwgY191Ynl0ZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX2JCKDAsIDI1NSksIDg1KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlUoKSwgMjU1KQorCisgICAgZGVmIHRlc3Rfc2hvcnQoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9oLnJlc3R5cGUgPSBjX3Nob3J0CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9oKC0zMjc2NiksIC0xMDkyMikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC0zMjc2NikKKworICAgIGRlZiB0ZXN0X3Nob3J0X3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9iaC5yZXN0eXBlID0gY19zaG9ydAorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfYmgoMCwgLTMyNzY2KSwgLTEwOTIyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgLTMyNzY2KQorCisgICAgZGVmIHRlc3RfdXNob3J0KHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfSC5yZXN0eXBlID0gY191c2hvcnQKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX0goNjU1MzUpLCAyMTg0NSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5VKCksIDY1NTM1KQorCisgICAgZGVmIHRlc3RfdXNob3J0X3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9iSC5yZXN0eXBlID0gY191c2hvcnQKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX2JIKDAsIDY1NTM1KSwgMjE4NDUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuVSgpLCA2NTUzNSkKKworICAgIGRlZiB0ZXN0X2ludChzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2kucmVzdHlwZSA9IGNfaW50CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9pKC0yMTQ3NDgzNjQ2KSwgLTcxNTgyNzg4MikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC0yMTQ3NDgzNjQ2KQorCisgICAgZGVmIHRlc3RfaW50X3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9iaS5yZXN0eXBlID0gY19pbnQKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX2JpKDAsIC0yMTQ3NDgzNjQ2KSwgLTcxNTgyNzg4MikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC0yMTQ3NDgzNjQ2KQorCisgICAgZGVmIHRlc3RfdWludChzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX0kucmVzdHlwZSA9IGNfdWludAorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfSSg0Mjk0OTY3Mjk1KSwgMTQzMTY1NTc2NSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5VKCksIDQyOTQ5NjcyOTUpCisKKyAgICBkZWYgdGVzdF91aW50X3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9iSS5yZXN0eXBlID0gY191aW50CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iSSgwLCA0Mjk0OTY3Mjk1KSwgMTQzMTY1NTc2NSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5VKCksIDQyOTQ5NjcyOTUpCisKKyAgICBkZWYgdGVzdF9sb25nKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfbC5yZXN0eXBlID0gY19sb25nCisgICAgICAgIHNlbGYuX2RsbC50Zl9sLmFyZ3R5cGVzID0gKGNfbG9uZywpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9sKC0yMTQ3NDgzNjQ2KSwgLTcxNTgyNzg4MikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC0yMTQ3NDgzNjQ2KQorCisgICAgZGVmIHRlc3RfbG9uZ19wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfYmwucmVzdHlwZSA9IGNfbG9uZworICAgICAgICBzZWxmLl9kbGwudGZfYmwuYXJndHlwZXMgPSAoY19ieXRlLCBjX2xvbmcpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9ibCgwLCAtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKKworICAgIGRlZiB0ZXN0X3Vsb25nKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfTC5yZXN0eXBlID0gY191bG9uZworICAgICAgICBzZWxmLl9kbGwudGZfTC5hcmd0eXBlcyA9IChjX3Vsb25nLCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX0woNDI5NDk2NzI5NSksIDE0MzE2NTU3NjUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuVSgpLCA0Mjk0OTY3Mjk1KQorCisgICAgZGVmIHRlc3RfdWxvbmdfcGx1cyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JMLnJlc3R5cGUgPSBjX3Vsb25nCisgICAgICAgIHNlbGYuX2RsbC50Zl9iTC5hcmd0eXBlcyA9IChjX2NoYXIsIGNfdWxvbmcpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iTCgnICcsIDQyOTQ5NjcyOTUpLCAxNDMxNjU1NzY1KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlUoKSwgNDI5NDk2NzI5NSkKKworICAgIGRlZiB0ZXN0X2xvbmdsb25nKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfcS5yZXN0eXBlID0gY19sb25nbG9uZworICAgICAgICBzZWxmLl9kbGwudGZfcS5hcmd0eXBlcyA9IChjX2xvbmdsb25nLCApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9xKC05MjIzMzcyMDM2ODU0Nzc1ODA2KSwgLTMwNzQ0NTczNDU2MTgyNTg2MDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtOTIyMzM3MjAzNjg1NDc3NTgwNikKKworICAgIGRlZiB0ZXN0X2xvbmdsb25nX3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9icS5yZXN0eXBlID0gY19sb25nbG9uZworICAgICAgICBzZWxmLl9kbGwudGZfYnEuYXJndHlwZXMgPSAoY19ieXRlLCBjX2xvbmdsb25nKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfYnEoMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDYpLCAtMzA3NDQ1NzM0NTYxODI1ODYwMikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC05MjIzMzcyMDM2ODU0Nzc1ODA2KQorCisgICAgZGVmIHRlc3RfdWxvbmdsb25nKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfUS5yZXN0eXBlID0gY191bG9uZ2xvbmcKKyAgICAgICAgc2VsZi5fZGxsLnRmX1EuYXJndHlwZXMgPSAoY191bG9uZ2xvbmcsICkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX1EoMTg0NDY3NDQwNzM3MDk1NTE2MTUpLCA2MTQ4OTE0NjkxMjM2NTE3MjA1KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlUoKSwgMTg0NDY3NDQwNzM3MDk1NTE2MTUpCisKKyAgICBkZWYgdGVzdF91bG9uZ2xvbmdfcGx1cyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JRLnJlc3R5cGUgPSBjX3Vsb25nbG9uZworICAgICAgICBzZWxmLl9kbGwudGZfYlEuYXJndHlwZXMgPSAoY19ieXRlLCBjX3Vsb25nbG9uZykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX2JRKDAsIDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSwgNjE0ODkxNDY5MTIzNjUxNzIwNSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5VKCksIDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQorCisgICAgZGVmIHRlc3RfZmxvYXQoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9mLnJlc3R5cGUgPSBjX2Zsb2F0CisgICAgICAgIHNlbGYuX2RsbC50Zl9mLmFyZ3R5cGVzID0gKGNfZmxvYXQsKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfZigtNDIuKSwgLTE0LikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC00MikKKworICAgIGRlZiB0ZXN0X2Zsb2F0X3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9iZi5yZXN0eXBlID0gY19mbG9hdAorICAgICAgICBzZWxmLl9kbGwudGZfYmYuYXJndHlwZXMgPSAoY19ieXRlLCBjX2Zsb2F0KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfYmYoMCwgLTQyLiksIC0xNC4pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtNDIpCisKKyAgICBkZWYgdGVzdF9kb3VibGUoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9kLnJlc3R5cGUgPSBjX2RvdWJsZQorICAgICAgICBzZWxmLl9kbGwudGZfZC5hcmd0eXBlcyA9IChjX2RvdWJsZSwpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9kKDQyLiksIDE0LikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIDQyKQorCisgICAgZGVmIHRlc3RfZG91YmxlX3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9iZC5yZXN0eXBlID0gY19kb3VibGUKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JkLmFyZ3R5cGVzID0gKGNfYnl0ZSwgY19kb3VibGUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iZCgwLCA0Mi4pLCAxNC4pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCA0MikKKworICAgIGRlZiB0ZXN0X2NhbGx3aXRocmVzdWx0KHNlbGYpOgorICAgICAgICBkZWYgcHJvY2Vzc19yZXN1bHQocmVzdWx0KToKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQgKiAyCisgICAgICAgIHNlbGYuX2RsbC50Zl9pLnJlc3R5cGUgPSBwcm9jZXNzX3Jlc3VsdAorICAgICAgICBzZWxmLl9kbGwudGZfaS5hcmd0eXBlcyA9IChjX2ludCwpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9pKDQyKSwgMjgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCA0MikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX2koLTQyKSwgLTI4KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgLTQyKQorCisgICAgZGVmIHRlc3Rfdm9pZChzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnR2X2kucmVzdHlwZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fZGxsLnR2X2kuYXJndHlwZXMgPSAoY19pbnQsKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudHZfaSg0MiksIE5vbmUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCA0MikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnR2X2koLTQyKSwgTm9uZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC00MikKKworIyBUaGUgZm9sbG93aW5nIHJlcGVhdGVzIHRoZSBhYm92ZSB0ZXN0cyB3aXRoIHN0ZGNhbGwgZnVuY3Rpb25zICh3aGVyZQorIyB0aGV5IGFyZSBhdmFpbGFibGUpCit0cnk6CisgICAgV2luRExMCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgY2xhc3Mgc3RkY2FsbF9kbGwoV2luRExMKToKKyAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgaWYgbmFtZVs6Ml0gPT0gJ19fJyBhbmQgbmFtZVstMjpdID09ICdfXyc6CisgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKKyAgICAgICAgICAgIGZ1bmMgPSBzZWxmLl9GdW5jUHRyKCJzXyIgKyBuYW1lLCBzZWxmKQorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBmdW5jKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmMKKworICAgIGNsYXNzIHN0ZGNhbGxDRnVuY3Rpb25zKENGdW5jdGlvbnMpOgorICAgICAgICBfZGxsID0gc3RkY2FsbF9kbGwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBwYXNzCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NoZWNrcmV0dmFsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOWNkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weQpAQCAtMCwwICsxLDQwIEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKKworZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jaGVja3JldHZhbChzZWxmKToKKworICAgICAgICBjbGFzcyBDSEVDS0VEKGNfaW50KToKKyAgICAgICAgICAgIGRlZiBfY2hlY2tfcmV0dmFsXyh2YWx1ZSk6CisgICAgICAgICAgICAgICAgIyBSZWNlaXZlcyBhIENIRUNLRUQgaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cih2YWx1ZS52YWx1ZSkKKyAgICAgICAgICAgIF9jaGVja19yZXR2YWxfID0gc3RhdGljbWV0aG9kKF9jaGVja19yZXR2YWxfKQorCisgICAgICAgIGltcG9ydCBfY3R5cGVzX3Rlc3QKKyAgICAgICAgZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGRsbC5fdGVzdGZ1bmNfcF9wKDQyKSkKKworICAgICAgICBkbGwuX3Rlc3RmdW5jX3BfcC5yZXN0eXBlID0gQ0hFQ0tFRAorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiNDIiLCBkbGwuX3Rlc3RmdW5jX3BfcCg0MikpCisKKyAgICAgICAgZGxsLl90ZXN0ZnVuY19wX3AucmVzdHlwZSA9IE5vbmUKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZGxsLl90ZXN0ZnVuY19wX3AoNDIpKQorCisgICAgICAgIGRlbCBkbGwuX3Rlc3RmdW5jX3BfcC5yZXN0eXBlCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBkbGwuX3Rlc3RmdW5jX3BfcCg0MikpCisKKyAgICB0cnk6CisgICAgICAgIG9sZWRsbAorICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBkZWYgdGVzdF9vbGVkbGwoc2VsZik6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZWRsbC5vbGVhdXQzMi5DcmVhdGVUeXBlTGliMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZXJyY2hlY2sucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9lcnJjaGVjay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDkxM2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZXJyY2hlY2sucHkKQEAgLTAsMCArMSwxOSBAQAoraW1wb3J0IHN5cworZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworIyNjbGFzcyBITU9EVUxFKFN0cnVjdHVyZSk6CisjIyAgICBfZmllbGRzXyA9IFsoInZhbHVlIiwgY192b2lkX3ApXQorCisjIyAgICBkZWYgX19yZXByX18oc2VsZik6CisjIyAgICAgICAgcmV0dXJuICI8SE1PRFVMRSAlcz4iICUgc2VsZi52YWx1ZQorCisjI3dpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBLnJlc3R5cGUgPSBITU9EVUxFCisKKyMjcHJpbnQgd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoInB5dGhvbjIzLmRsbCIpCisjI3ByaW50IGhleChzeXMuZGxsaGFuZGxlKQorCisjI2RlZiBub256ZXJvKGhhbmRsZSk6CisjIyAgICByZXR1cm4gKEdldExhc3RFcnJvcigpLCBoYW5kbGUpCisKKyMjd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEuZXJyY2hlY2sgPSBub256ZXJvCisjI3ByaW50IHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBKCJzcGFtIikKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Z1bmNwdHIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYjQwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5CkBAIC0wLDAgKzEsMTI3IEBACitpbXBvcnQgb3MsIHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorCit0cnk6CisgICAgV0lORlVOQ1RZUEUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgIyBmYWtlIHRvIGVuYWJsZSB0aGlzIHRlc3Qgb24gTGludXgKKyAgICBXSU5GVU5DVFlQRSA9IENGVU5DVFlQRQorCitpbXBvcnQgX2N0eXBlc190ZXN0CitsaWIgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorCitjbGFzcyBDRnVuY1B0clRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgWCA9IFdJTkZVTkNUWVBFKGNfaW50LCBjX2ludCwgY19pbnQpCisKKyAgICAgICAgZGVmIGZ1bmMoKmFyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIGxlbihhcmdzKQorCisgICAgICAgIHggPSBYKGZ1bmMpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHgucmVzdHlwZSwgY19pbnQpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHguYXJndHlwZXMsIChjX2ludCwgY19pbnQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoeCksIHNpemVvZihjX3ZvaWRwKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY192b2lkcCkpCisKKyAgICBkZWYgdGVzdF9maXJzdChzZWxmKToKKyAgICAgICAgU3RkQ2FsbGJhY2sgPSBXSU5GVU5DVFlQRShjX2ludCwgY19pbnQsIGNfaW50KQorICAgICAgICBDZGVjbENhbGxiYWNrID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCwgY19pbnQpCisKKyAgICAgICAgZGVmIGZ1bmMoYSwgYik6CisgICAgICAgICAgICByZXR1cm4gYSArIGIKKworICAgICAgICBzID0gU3RkQ2FsbGJhY2soZnVuYykKKyAgICAgICAgYyA9IENkZWNsQ2FsbGJhY2soZnVuYykKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzKDEsIDIpLCAzKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjKDEsIDIpLCAzKQorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgbm8gbG9uZ2VyIHJhaXNlcyBhIFR5cGVFcnJvciAtIGl0IGlzIG5vdworICAgICAgICAjIHBvc3NpYmxlLCBhcyBpbiBDLCB0byBjYWxsIGNkZWNsIGZ1bmN0aW9ucyB3aXRoIG1vcmUgcGFyYW1ldGVycy4KKyAgICAgICAgI3NlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYywgMSwgMiwgMykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYygxLCAyLCAzLCA0LCA1LCA2KSwgMykKKyAgICAgICAgaWYgbm90IFdJTkZVTkNUWVBFIGlzIENGVU5DVFlQRSBhbmQgb3MubmFtZSAhPSAiY2UiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzLCAxLCAyLCAzKQorCisgICAgZGVmIHRlc3Rfc3RydWN0dXJlcyhzZWxmKToKKyAgICAgICAgV05EUFJPQyA9IFdJTkZVTkNUWVBFKGNfbG9uZywgY19pbnQsIGNfaW50LCBjX2ludCwgY19pbnQpCisKKyAgICAgICAgZGVmIHduZHByb2MoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk6CisgICAgICAgICAgICByZXR1cm4gaHduZCArIG1zZyArIHdQYXJhbSArIGxQYXJhbQorCisgICAgICAgIEhJTlNUQU5DRSA9IGNfaW50CisgICAgICAgIEhJQ09OID0gY19pbnQKKyAgICAgICAgSENVUlNPUiA9IGNfaW50CisgICAgICAgIExQQ1RTVFIgPSBjX2NoYXJfcAorCisgICAgICAgIGNsYXNzIFdORENMQVNTKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoInN0eWxlIiwgY191aW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgibHBmblduZFByb2MiLCBXTkRQUk9DKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiY2JDbHNFeHRyYSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiY2JXbmRFeHRyYSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaEluc3RhbmNlIiwgSElOU1RBTkNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaEljb24iLCBISUNPTiksCisgICAgICAgICAgICAgICAgICAgICAgICAoImhDdXJzb3IiLCBIQ1VSU09SKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgibHBzek1lbnVOYW1lIiwgTFBDVFNUUiksCisgICAgICAgICAgICAgICAgICAgICAgICAoImxwc3pDbGFzc05hbWUiLCBMUENUU1RSKV0KKworICAgICAgICB3bmRjbGFzcyA9IFdORENMQVNTKCkKKyAgICAgICAgd25kY2xhc3MubHBmblduZFByb2MgPSBXTkRQUk9DKHduZHByb2MpCisKKyAgICAgICAgV05EUFJPQ18yID0gV0lORlVOQ1RZUEUoY19sb25nLCBjX2ludCwgY19pbnQsIGNfaW50LCBjX2ludCkKKworICAgICAgICAjIFRoaXMgaXMgbm8gbG9uZ2VyIHRydWUsIG5vdyB0aGF0IFdJTkZVTkNUWVBFIGNhY2hlcyBjcmVhdGVkIHR5cGVzIGludGVybmFsbHkuCisgICAgICAgICMjICMgQ0Z1bmNQdHIgc3ViY2xhc3NlcyBhcmUgY29tcGFyZWQgYnkgaWRlbnRpdHksIHNvIHRoaXMgcmFpc2VzIGEgVHlwZUVycm9yOgorICAgICAgICAjIyBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHduZGNsYXNzLAorICAgICAgICAjIyAgICAgICAgICAgICAgICAgICJscGZuV25kUHJvYyIsIFdORFBST0NfMih3bmRwcm9jKSkKKyAgICAgICAgIyBpbnN0ZWFkOgorCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhXTkRQUk9DIGlzIFdORFBST0NfMikKKyAgICAgICAgIyAnd25kY2xhc3MubHBmblduZFByb2MnIGxlYWtzIDk0IHJlZmVyZW5jZXMuICBXaHk/CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHduZGNsYXNzLmxwZm5XbmRQcm9jKDEsIDIsIDMsIDQpLCAxMCkKKworCisgICAgICAgIGYgPSB3bmRjbGFzcy5scGZuV25kUHJvYworCisgICAgICAgIGRlbCB3bmRjbGFzcworICAgICAgICBkZWwgd25kcHJvYworCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGYoMTAsIDExLCAxMiwgMTMpLCA0NikKKworICAgIGRlZiB0ZXN0X2RsbGZ1bmN0aW9ucyhzZWxmKToKKworICAgICAgICBkZWYgTm9OdWxsSGFuZGxlKHZhbHVlKToKKyAgICAgICAgICAgIGlmIG5vdCB2YWx1ZToKKyAgICAgICAgICAgICAgICByYWlzZSBXaW5FcnJvcigpCisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKworICAgICAgICBzdHJjaHIgPSBsaWIubXlfc3RyY2hyCisgICAgICAgIHN0cmNoci5yZXN0eXBlID0gY19jaGFyX3AKKyAgICAgICAgc3RyY2hyLmFyZ3R5cGVzID0gKGNfY2hhcl9wLCBjX2NoYXIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmNocigiYWJjZGVmZ2hpIiwgImIiKSwgImJjZGVmZ2hpIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyY2hyKCJhYmNkZWZnaGkiLCAieCIpLCBOb25lKQorCisKKyAgICAgICAgc3RydG9rID0gbGliLm15X3N0cnRvaworICAgICAgICBzdHJ0b2sucmVzdHlwZSA9IGNfY2hhcl9wCisgICAgICAgICMgTmVpdGhlciBvZiB0aGlzIGRvZXMgd29yazogc3RydG9rIGNoYW5nZXMgdGhlIGJ1ZmZlciBpdCBpcyBwYXNzZWQKKyMjICAgICAgICBzdHJ0b2suYXJndHlwZXMgPSAoY19jaGFyX3AsIGNfY2hhcl9wKQorIyMgICAgICAgIHN0cnRvay5hcmd0eXBlcyA9IChjX3N0cmluZywgY19jaGFyX3ApCisKKyAgICAgICAgZGVmIGNfc3RyaW5nKGluaXQpOgorICAgICAgICAgICAgc2l6ZSA9IGxlbihpbml0KSArIDEKKyAgICAgICAgICAgIHJldHVybiAoY19jaGFyKnNpemUpKCppbml0KQorCisgICAgICAgIHMgPSAiYVxuYlxuYyIKKyAgICAgICAgYiA9IGNfc3RyaW5nKHMpCisKKyMjICAgICAgICBiID0gKGNfY2hhciAqIChsZW4ocykrMSkpKCkKKyMjICAgICAgICBiLnZhbHVlID0gcworCisjIyAgICAgICAgYiA9IGNfc3RyaW5nKHMpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cnRvayhiLCAiXG4iKSwgImEiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJ0b2soTm9uZSwgIlxuIiksICJiIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RydG9rKE5vbmUsICJcbiIpLCAiYyIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cnRvayhOb25lLCAiXG4iKSwgTm9uZSkKKyAgICAgICAgCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjY2I3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jdGlvbnMucHkKQEAgLTAsMCArMSwzODEgQEAKKyIiIgorSGVyZSBpcyBwcm9iYWJseSB0aGUgcGxhY2UgdG8gd3JpdGUgdGhlIGRvY3MsIHNpbmNlIHRoZSB0ZXN0LWNhc2VzCitzaG93IGhvdyB0aGUgdHlwZSBiZWhhdmUuCisKK0xhdGVyLi4uCisiIiIKKworZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCBzeXMsIHVuaXR0ZXN0CisKK3RyeToKKyAgICBXSU5GVU5DVFlQRQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAjIGZha2UgdG8gZW5hYmxlIHRoaXMgdGVzdCBvbiBMaW51eAorICAgIFdJTkZVTkNUWVBFID0gQ0ZVTkNUWVBFCisKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKK2RsbCA9IGNkbGwubG9hZChfY3R5cGVzX3Rlc3QuX19maWxlX18pCitpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICB3aW5kbGwgPSB3aW5kbGwubG9hZChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisKK2NsYXNzIEZ1bmN0aW9uVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbXJvKHNlbGYpOgorICAgICAgICAjIGluIFB5dGhvbiAyLjMsIHRoaXMgcmFpc2VzIFR5cGVFcnJvcjogTVJPIGNvbmZsaWN0IGFtb25nIGJhc2VzIGNsYXNzZXMsCisgICAgICAgICMgaW4gUHl0aG9uIDIuMiBpdCB3b3Jrcy4KKyAgICAgICAgIworICAgICAgICAjIEJ1dCBpbiBlYXJseSB2ZXJzaW9ucyBvZiBfY3R5cGVzLmMsIHRoZSByZXN1bHQgb2YgdHBfbmV3CisgICAgICAgICMgd2Fzbid0IGNoZWNrZWQsIGFuZCBpdCBldmVuIGNyYXNoZWQgUHl0aG9uLgorICAgICAgICAjIEZvdW5kIGJ5IEdyZWcgQ2hhcG1hbi4KKyAgICAgICAgCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsYXNzIFgob2JqZWN0LCBBcnJheSk6CisgICAgICAgICAgICAgICAgX2xlbmd0aF8gPSA1CisgICAgICAgICAgICAgICAgX3R5cGVfID0gImkiCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgCisKKyAgICAgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBfUG9pbnRlcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBYKG9iamVjdCwgX1BvaW50ZXIpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IF9TaW1wbGVDRGF0YQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBYKG9iamVjdCwgX1NpbXBsZUNEYXRhKToKKyAgICAgICAgICAgICAgICBfdHlwZV8gPSAiaSIKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBYKG9iamVjdCwgU3RydWN0dXJlKToKKyAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFtdCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKworICAgIGRlZiB0ZXN0X3djaGFyX3Bhcm0oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNfd2NoYXIKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19pX2JoaWxmZAorICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY193Y2hhciwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGVdCisgICAgICAgIHJlc3VsdCA9IGYoMSwgdSJ4IiwgMywgNCwgNS4wLCA2LjApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgMTM5KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHJlc3VsdCksIGludCkKKworICAgIGRlZiB0ZXN0X3djaGFyX3Jlc3VsdChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY193Y2hhcgorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2lfYmhpbGZkCisgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2RvdWJsZV0KKyAgICAgICAgZi5yZXN0eXBlID0gY193Y2hhcgorICAgICAgICByZXN1bHQgPSBmKDAsIDAsIDAsIDAsIDAsIDApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgdSdceDAwJykKKworICAgIGRlZiB0ZXN0X3ZvaWRyZXN1bHQoc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX3YKKyAgICAgICAgZi5yZXN0eXBlID0gTm9uZQorICAgICAgICBmLmFyZ3R5cGVzID0gW2NfaW50LCBjX2ludCwgUE9JTlRFUihjX2ludCldCisgICAgICAgIHJlc3VsdCA9IGNfaW50KCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZigxLCAyLCBieXJlZihyZXN1bHQpKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LnZhbHVlLCAzKQorCisgICAgZGVmIHRlc3RfaW50cmVzdWx0KHNlbGYpOgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19pX2JoaWxmZAorICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGVdCisgICAgICAgIHJlc3VsdCA9IGYoMSwgMiwgMywgNCwgNS4wLCA2LjApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgMjEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUocmVzdWx0KSwgaW50KQorCisgICAgICAgIHJlc3VsdCA9IGYoLTEsIC0yLCAtMywgLTQsIC01LjAsIC02LjApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgLTIxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHJlc3VsdCksIGludCkKKworICAgICAgICAjIElmIHdlIGRlY2xhcmUgdGhlIGZ1bmN0aW9uIHRvIHJldHVybiBhIHNob3J0LAorICAgICAgICAjIGlzIHRoZSBoaWdoIHBhcnQgc3BsaXQgb2ZmPworICAgICAgICBmLnJlc3R5cGUgPSBjX3Nob3J0CisgICAgICAgIHJlc3VsdCA9IGYoMSwgMiwgMywgNCwgNS4wLCA2LjApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgMjEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUocmVzdWx0KSwgaW50KQorICAgICAgICAKKyAgICAgICAgcmVzdWx0ID0gZigxLCAyLCAzLCAweDEwMDA0LCA1LjAsIDYuMCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAyMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCisKKyAgICAgICAgIyBZb3UgY2Fubm90IGFzc2luZyBjaGFyYWN0ZXIgZm9ybWF0IGNvZGVzIGFzIHJlc3R5cGUgYW55IGxvbmdlcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIGYsICJyZXN0eXBlIiwgImkiKQorCisgICAgZGVmIHRlc3RfZmxvYXRyZXN1bHQoc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2ZfYmhpbGZkCisgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2RvdWJsZV0KKyAgICAgICAgZi5yZXN0eXBlID0gY19mbG9hdAorICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDIxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQorCisgICAgICAgIHJlc3VsdCA9IGYoLTEsIC0yLCAtMywgLTQsIC01LjAsIC02LjApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgLTIxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQorICAgICAgICAKKyAgICBkZWYgdGVzdF9kb3VibGVyZXN1bHQoc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2RfYmhpbGZkCisgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2RvdWJsZV0KKyAgICAgICAgZi5yZXN0eXBlID0gY19kb3VibGUKKyAgICAgICAgcmVzdWx0ID0gZigxLCAyLCAzLCA0LCA1LjAsIDYuMCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAyMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShyZXN1bHQpLCBmbG9hdCkKKworICAgICAgICByZXN1bHQgPSBmKC0xLCAtMiwgLTMsIC00LCAtNS4wLCAtNi4wKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIC0yMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShyZXN1bHQpLCBmbG9hdCkKKyAgICAgICAgCisgICAgZGVmIHRlc3RfbG9uZ2xvbmdyZXN1bHQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNfbG9uZ2xvbmcKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19xX2JoaWxmZAorICAgICAgICBmLnJlc3R5cGUgPSBjX2xvbmdsb25nCisgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2RvdWJsZV0KKyAgICAgICAgcmVzdWx0ID0gZigxLCAyLCAzLCA0LCA1LjAsIDYuMCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAyMSkKKworICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19xX2JoaWxmZHEKKyAgICAgICAgZi5yZXN0eXBlID0gY19sb25nbG9uZworICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGUsIGNfbG9uZ2xvbmddCisgICAgICAgIHJlc3VsdCA9IGYoMSwgMiwgMywgNCwgNS4wLCA2LjAsIDIxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDQyKQorCisgICAgZGVmIHRlc3Rfc3RyaW5ncmVzdWx0KHNlbGYpOgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgZi5hcmd0eXBlcyA9IE5vbmUKKyAgICAgICAgZi5yZXN0eXBlID0gY19jaGFyX3AKKyAgICAgICAgcmVzdWx0ID0gZigiMTIzIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAiMTIzIikKKworICAgICAgICByZXN1bHQgPSBmKE5vbmUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3BvaW50ZXJzKHNlbGYpOgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgZi5yZXN0eXBlID0gUE9JTlRFUihjX2ludCkKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtQT0lOVEVSKGNfaW50KV0KKworICAgICAgICAjIFRoaXMgb25seSB3b3JrcyBpZiB0aGUgdmFsdWUgY19pbnQoNDIpIHBhc3NlZCB0byB0aGUKKyAgICAgICAgIyBmdW5jdGlvbiBpcyBzdGlsbCBhbGl2ZSB3aGlsZSB0aGUgcG9pbnRlciAodGhlIHJlc3VsdCkgaXMKKyAgICAgICAgIyB1c2VkLgorCisgICAgICAgIHYgPSBjX2ludCg0MikKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwb2ludGVyKHYpLmNvbnRlbnRzLnZhbHVlLCA0MikKKyAgICAgICAgcmVzdWx0ID0gZihwb2ludGVyKHYpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHJlc3VsdCksIFBPSU5URVIoY19pbnQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIDQyKQorCisgICAgICAgICMgVGhpcyBvbiB3b3Jrcy4uLgorICAgICAgICByZXN1bHQgPSBmKHBvaW50ZXIodikpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdC5jb250ZW50cy52YWx1ZSwgdi52YWx1ZSkKKworICAgICAgICBwID0gcG9pbnRlcihjX2ludCg5OSkpCisgICAgICAgIHJlc3VsdCA9IGYocCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LmNvbnRlbnRzLnZhbHVlLCA5OSkKKworICAgICAgICBhcmcgPSBieXJlZih2KQorICAgICAgICByZXN1bHQgPSBmKGFyZykKKyAgICAgICAgc2VsZi5mYWlsSWZFcXVhbChyZXN1bHQuY29udGVudHMsIHYudmFsdWUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgZiwgYnlyZWYoY19zaG9ydCgyMikpKQorCisgICAgICAgICMgSXQgaXMgZGFuZ2Vyb3VzLCBob3dldmVyLCBiZWNhdXNlIHlvdSBkb24ndCBjb250cm9sIHRoZSBsaWZldGltZQorICAgICAgICAjIG9mIHRoZSBwb2ludGVyOgorICAgICAgICByZXN1bHQgPSBmKGJ5cmVmKGNfaW50KDk5KSkpCisgICAgICAgIHNlbGYuZmFpbElmRXF1YWwocmVzdWx0LmNvbnRlbnRzLCA5OSkKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfcF9wCisgICAgICAgIGYucmVzdHlwZSA9IGNfaW50CisKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ5IiwgY19pbnQpXQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgWCgpKSAjY2Fubm90IGNvbnZlcnQgcGFyYW1ldGVyCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3Rfc2hvcnRzKHNlbGYpOgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19jYWxsYmFja19pX2lmCisKKyAgICAgICAgYXJncyA9IFtdCisgICAgICAgIGV4cGVjdGVkID0gWzI2MjE0NCwgMTMxMDcyLCA2NTUzNiwgMzI3NjgsIDE2Mzg0LCA4MTkyLCA0MDk2LCAyMDQ4LAorICAgICAgICAgICAgICAgICAgICAxMDI0LCA1MTIsIDI1NiwgMTI4LCA2NCwgMzIsIDE2LCA4LCA0LCAyLCAxXQorCisgICAgICAgIGRlZiBjYWxsYmFjayh2KToKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKHYpCisKKyAgICAgICAgQ2FsbEJhY2sgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50KQorCisgICAgICAgIGNiID0gQ2FsbEJhY2soY2FsbGJhY2spCisgICAgICAgIGYoMioqMTgsIGNiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhcmdzLCBleHBlY3RlZCkKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja3Moc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2NhbGxiYWNrX2lfaWYKKyAgICAgICAgZi5yZXN0eXBlID0gY19pbnQKKworICAgICAgICBNeUNhbGxiYWNrID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCkKKworICAgICAgICBkZWYgY2FsbGJhY2sodmFsdWUpOgorICAgICAgICAgICAgI3ByaW50ICJjYWxsZWQgYmFjayB3aXRoIiwgdmFsdWUKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICAKKyAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQorICAgICAgICByZXN1bHQgPSBmKC0xMCwgY2IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgLTE4KQorCisgICAgICAgICMgdGVzdCB3aXRoIHByb3RvdHlwZQorICAgICAgICBmLmFyZ3R5cGVzID0gW2NfaW50LCBNeUNhbGxiYWNrXQorICAgICAgICBjYiA9IE15Q2FsbGJhY2soY2FsbGJhY2spCisgICAgICAgIHJlc3VsdCA9IGYoLTEwLCBjYikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAtMTgpCisgICAgICAgICAgICAgICAgCisgICAgICAgIEFub3RoZXJDYWxsYmFjayA9IFdJTkZVTkNUWVBFKGNfaW50LCBjX2ludCwgY19pbnQsIGNfaW50LCBjX2ludCkKKworICAgICAgICAjIGNoZWNrIHRoYXQgdGhlIHByb3RvdHlwZSB3b3Jrczogd2UgY2FsbCBmIHdpdGggd3JvbmcKKyAgICAgICAgIyBhcmd1bWVudCB0eXBlcworICAgICAgICBjYiA9IEFub3RoZXJDYWxsYmFjayhjYWxsYmFjaykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgZiwgLTEwLCBjYikKKworCisgICAgZGVmIHRlc3RfY2FsbGJhY2tzXzIoc2VsZik6CisgICAgICAgICMgQ2FuIGFsc28gdXNlIHNpbXBsZSBkYXRhdHlwZXMgYXMgYXJndW1lbnQgdHlwZSBzcGVjaWZpZXJzCisgICAgICAgICMgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICAgICAgIyBJbiB0aGlzIGNhc2UgdGhlIGNhbGwgcmVjZWl2ZXMgYW4gaW5zdGFuY2Ugb2YgdGhhdCB0eXBlCisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2NhbGxiYWNrX2lfaWYKKyAgICAgICAgZi5yZXN0eXBlID0gY19pbnQKKworICAgICAgICBNeUNhbGxiYWNrID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCkKKworICAgICAgICBmLmFyZ3R5cGVzID0gW2NfaW50LCBNeUNhbGxiYWNrXQorCisgICAgICAgIGRlZiBjYWxsYmFjayh2YWx1ZSk6CisgICAgICAgICAgICAjcHJpbnQgImNhbGxlZCBiYWNrIHdpdGgiLCB2YWx1ZQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWx1ZSksIGludCkKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICAKKyAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQorICAgICAgICByZXN1bHQgPSBmKC0xMCwgY2IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgLTE4KQorCisgICAgZGVmIHRlc3RfbG9uZ2xvbmdfY2FsbGJhY2tzKHNlbGYpOgorCisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2NhbGxiYWNrX3FfcWYKKyAgICAgICAgZi5yZXN0eXBlID0gY19sb25nbG9uZworCisgICAgICAgIE15Q2FsbGJhY2sgPSBDRlVOQ1RZUEUoY19sb25nbG9uZywgY19sb25nbG9uZykKKworICAgICAgICBmLmFyZ3R5cGVzID0gW2NfbG9uZ2xvbmcsIE15Q2FsbGJhY2tdCisKKyAgICAgICAgZGVmIGNhbGxiYWNrKHZhbHVlKToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHZhbHVlLCAoaW50LCBsb25nKSkpCisgICAgICAgICAgICByZXR1cm4gdmFsdWUgJiAweDdGRkZGRkZGCisKKyAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEzNTc3NjI1NTg3LCBmKDEwMDAwMDAwMDAwMDAsIGNiKSkKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGdldGF0dHIsIGRsbCwgIl94eHhfeXl5IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY19pbnQuaW5fZGxsLCBkbGwsICJfeHh4X3l5eSIpCisKKyAgICBkZWYgdGVzdF9ieXZhbChzZWxmKToKKworICAgICAgICBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLCAoInkiLCBjX2ludCldCisKKyAgICAgICAgIyB3aXRob3V0IHByb3RvdHlwZQorICAgICAgICBwdGluID0gUE9JTlQoMSwgMikKKyAgICAgICAgcHRvdXQgPSBQT0lOVCgpCisgICAgICAgICMgRVhQT1JUIGludCBfdGVzdGZ1bmNfYnl2YWwocG9pbnQgaW4sIHBvaW50ICpwb3V0KQorICAgICAgICByZXN1bHQgPSBkbGwuX3Rlc3RmdW5jX2J5dmFsKHB0aW4sIGJ5cmVmKHB0b3V0KSkKKyAgICAgICAgZ290ID0gcmVzdWx0LCBwdG91dC54LCBwdG91dC55CisgICAgICAgIGV4cGVjdGVkID0gMywgMSwgMgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChnb3QsIGV4cGVjdGVkKQorCisgICAgICAgICMgd2l0aCBwcm90b3R5cGUKKyAgICAgICAgcHRpbiA9IFBPSU5UKDEwMSwgMTAyKQorICAgICAgICBwdG91dCA9IFBPSU5UKCkKKyAgICAgICAgZGxsLl90ZXN0ZnVuY19ieXZhbC5hcmd0eXBlcyA9IChQT0lOVCwgUE9JTlRFUihQT0lOVCkpCisgICAgICAgIGRsbC5fdGVzdGZ1bmNfYnl2YWwucmVzdHlwZSA9IGNfaW50CisgICAgICAgIHJlc3VsdCA9IGRsbC5fdGVzdGZ1bmNfYnl2YWwocHRpbiwgYnlyZWYocHRvdXQpKQorICAgICAgICBnb3QgPSByZXN1bHQsIHB0b3V0LngsIHB0b3V0LnkKKyAgICAgICAgZXhwZWN0ZWQgPSAyMDMsIDEwMSwgMTAyCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdvdCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3RfcmV0dXJuXzJIKHNlbGYpOgorICAgICAgICBjbGFzcyBTMkgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfc2hvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19zaG9ydCldCisgICAgICAgIGRsbC5yZXRfMmhfZnVuYy5yZXN0eXBlID0gUzJICisgICAgICAgIGRsbC5yZXRfMmhfZnVuYy5hcmd0eXBlcyA9IFtTMkhdCisgICAgICAgIGlucCA9IFMySCg5OSwgODgpCisgICAgICAgIHMyaCA9IGRsbC5yZXRfMmhfZnVuYyhpbnApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKChzMmgueCwgczJoLnkpLCAoOTkqMiwgODgqMykpCisKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICAgICAgZGVmIHRlc3Rfc3RydWN0X3JldHVybl8ySF9zdGRjYWxsKHNlbGYpOgorICAgICAgICAgICAgY2xhc3MgUzJIKFN0cnVjdHVyZSk6CisgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19zaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19zaG9ydCldCisKKyAgICAgICAgICAgIHdpbmRsbC5zX3JldF8yaF9mdW5jLnJlc3R5cGUgPSBTMkgKKyAgICAgICAgICAgIHdpbmRsbC5zX3JldF8yaF9mdW5jLmFyZ3R5cGVzID0gW1MySF0KKyAgICAgICAgICAgIHMyaCA9IHdpbmRsbC5zX3JldF8yaF9mdW5jKFMySCg5OSwgODgpKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHMyaC54LCBzMmgueSksICg5OSoyLCA4OCozKSkKKworICAgIGRlZiB0ZXN0X3N0cnVjdF9yZXR1cm5fOEgoc2VsZik6CisgICAgICAgIGNsYXNzIFM4SShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJlIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJmIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJnIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJoIiwgY19pbnQpXQorICAgICAgICBkbGwucmV0XzhpX2Z1bmMucmVzdHlwZSA9IFM4SQorICAgICAgICBkbGwucmV0XzhpX2Z1bmMuYXJndHlwZXMgPSBbUzhJXQorICAgICAgICBpbnAgPSBTOEkoOSwgOCwgNywgNiwgNSwgNCwgMywgMikKKyAgICAgICAgczhpID0gZGxsLnJldF84aV9mdW5jKGlucCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHM4aS5hLCBzOGkuYiwgczhpLmMsIHM4aS5kLCBzOGkuZSwgczhpLmYsIHM4aS5nLCBzOGkuaCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg5KjIsIDgqMywgNyo0LCA2KjUsIDUqNiwgNCo3LCAzKjgsIDIqOSkpCisKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICAgICAgZGVmIHRlc3Rfc3RydWN0X3JldHVybl84SF9zdGRjYWxsKHNlbGYpOgorICAgICAgICAgICAgY2xhc3MgUzhJKFN0cnVjdHVyZSk6CisgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImYiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJnIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaCIsIGNfaW50KV0KKyAgICAgICAgICAgIHdpbmRsbC5zX3JldF84aV9mdW5jLnJlc3R5cGUgPSBTOEkKKyAgICAgICAgICAgIHdpbmRsbC5zX3JldF84aV9mdW5jLmFyZ3R5cGVzID0gW1M4SV0KKyAgICAgICAgICAgIGlucCA9IFM4SSg5LCA4LCA3LCA2LCA1LCA0LCAzLCAyKQorICAgICAgICAgICAgczhpID0gd2luZGxsLnNfcmV0XzhpX2Z1bmMoaW5wKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHM4aS5hLCBzOGkuYiwgczhpLmMsIHM4aS5kLCBzOGkuZSwgczhpLmYsIHM4aS5nLCBzOGkuaCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOSoyLCA4KjMsIDcqNCwgNio1LCA1KjYsIDQqNywgMyo4LCAyKjkpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfaW5jb21wbGV0ZS5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2luY29tcGxldGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5ZjUwNAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2luY29tcGxldGUucHkKQEAgLTAsMCArMSw0MiBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRoZSBpbmNvbXBsZXRlIHBvaW50ZXIgZXhhbXBsZSBmcm9tIHRoZSB0dXRvcmlhbAorIworCitjbGFzcyBNeVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2luY29tcGxldGVfZXhhbXBsZShzZWxmKToKKyAgICAgICAgbHBjZWxsID0gUE9JTlRFUigiY2VsbCIpCisgICAgICAgIGNsYXNzIGNlbGwoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygibmFtZSIsIGNfY2hhcl9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgibmV4dCIsIGxwY2VsbCldCisKKyAgICAgICAgU2V0UG9pbnRlclR5cGUobHBjZWxsLCBjZWxsKQorCisgICAgICAgIGMxID0gY2VsbCgpCisgICAgICAgIGMxLm5hbWUgPSAiZm9vIgorICAgICAgICBjMiA9IGNlbGwoKQorICAgICAgICBjMi5uYW1lID0gImJhciIKKworICAgICAgICBjMS5uZXh0ID0gcG9pbnRlcihjMikKKyAgICAgICAgYzIubmV4dCA9IHBvaW50ZXIoYzEpCisKKyAgICAgICAgcCA9IGMxCisKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoOCk6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHAubmFtZSkKKyAgICAgICAgICAgIHAgPSBwLm5leHRbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCBbImZvbyIsICJiYXIiXSAqIDQpCisKKyAgICAgICAgIyB0byBub3QgbGVhayByZWZlcmVuY2VzLCB3ZSBtdXN0IGNsZWFuIF9wb2ludGVyX3R5cGVfY2FjaGUKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IF9wb2ludGVyX3R5cGVfY2FjaGUKKyAgICAgICAgZGVsIF9wb2ludGVyX3R5cGVfY2FjaGVbY2VsbF0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfaW5pdC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2luaXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5ZGM5MgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2luaXQucHkKQEAgLTAsMCArMSw0MCBAQAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICgiYiIsIGNfaW50KV0KKyAgICBuZXdfd2FzX2NhbGxlZCA9IEZhbHNlCisKKyAgICBkZWYgX19uZXdfXyhjbHMpOgorICAgICAgICByZXN1bHQgPSBzdXBlcihYLCBjbHMpLl9fbmV3X18oY2xzKQorICAgICAgICByZXN1bHQubmV3X3dhc19jYWxsZWQgPSBUcnVlCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5hID0gOQorICAgICAgICBzZWxmLmIgPSAxMgorCitjbGFzcyBZKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJ4IiwgWCldCisKKworY2xhc3MgSW5pdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2dldChzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgdGhlIG9ubHkgYWNjZXNzaW5nIGEgbmVzdGVkIHN0cnVjdHVyZQorICAgICAgICAjIGRvZXNuJ3QgY2FsbCB0aGUgc3RydWN0dXJlJ3MgX19uZXdfXyBhbmQgX19pbml0X18KKyAgICAgICAgeSA9IFkoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoeS54LmEsIHkueC5iKSwgKDAsIDApKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh5LngubmV3X3dhc19jYWxsZWQsIEZhbHNlKQorCisgICAgICAgICMgQnV0IGV4cGxpY2l0ZWx5IGNyZWF0aW5nIGFuIFggc3RydWN0dXJlIGNhbGxzIF9fbmV3X18gYW5kIF9faW5pdF9fLCBvZiBjb3Vyc2UuCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHguYSwgeC5iKSwgKDksIDEyKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5uZXdfd2FzX2NhbGxlZCwgVHJ1ZSkKKworICAgICAgICB5LnggPSB4CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh5LnguYSwgeS54LmIpLCAoOSwgMTIpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh5LngubmV3X3dhc19jYWxsZWQsIEZhbHNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfaW50ZWdlcnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlZ2Vycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjY0NTNhCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfaW50ZWdlcnMucHkKQEAgLTAsMCArMSw1IEBACisjIHN1cGVyc2VlZGVkIGJ5IHRlc3RfbnVtYmVycy5weQoraW1wb3J0IHVuaXR0ZXN0CisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlcm5hbHMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlcm5hbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiMjA0MAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2ludGVybmFscy5weQpAQCAtMCwwICsxLDEwMyBAQAorIyBUaGlzIHRlc3RzIHRoZSBpbnRlcm5hbCBfb2JqZWN0cyBhdHRyaWJ1dGUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gc3lzIGltcG9ydCBnZXRyZWZjb3VudCBhcyBncmMKKworIyBYWFggVGhpcyB0ZXN0IG11c3QgYmUgcmV2aWV3ZWQgZm9yIGNvcnJlY3RuZXNzISEhCisKKyIiIgorY3R5cGVzJyB0eXBlcyBhcmUgY29udGFpbmVyIHR5cGVzLgorCitUaGV5IGhhdmUgYW4gaW50ZXJuYWwgbWVtb3J5IGJsb2NrLCB3aGljaCBvbmx5IGNvbnNpc3RzIG9mIHNvbWUgYnl0ZXMsCitidXQgaXQgaGFzIHRvIGtlZXAgcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzIGFzIHdlbGwuIFRoaXMgaXMgbm90CityZWFsbHkgbmVlZGVkIGZvciB0cml2aWFsIEMgdHlwZXMgbGlrZSBpbnQgb3IgY2hhciwgYnV0IGl0IGlzIGltcG9ydGFudAorZm9yIGFnZ3JlZ2F0ZSB0eXBlcyBsaWtlIHN0cmluZ3Mgb3IgcG9pbnRlcnMgaW4gcGFydGljdWxhci4KKworV2hhdCBhYm91dCBwb2ludGVycz8KKworIiIiCisKK2NsYXNzIE9iamVjdHNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGZhaWxVbmxlc3NTYW1lKHNlbGYsIGEsIGIpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChpZChhKSwgaWQoYikpCisKKyAgICBkZWYgdGVzdF9pbnRzKHNlbGYpOgorICAgICAgICBpID0gNDIwMDAxMjMKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMywgZ3JjKGkpKQorICAgICAgICBjaSA9IGNfaW50KGkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDMsIGdyYyhpKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2kuX29iamVjdHMsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9jX2NoYXJfcChzZWxmKToKKyAgICAgICAgcyA9ICJIZWxsbywgV29ybGQiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDMsIGdyYyhzKSkKKyAgICAgICAgY3MgPSBjX2NoYXJfcChzKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0LCBncmMocykpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1NhbWUoY3MuX29iamVjdHMsIHMpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfc3RydWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCksICgiYiIsIGNfaW50KV0KKworICAgICAgICBhID0gNDIxMjM0CisgICAgICAgIGIgPSA0MjEyMzUKKyAgICAgICAgeCA9IFgoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4Ll9vYmplY3RzLCBOb25lKQorICAgICAgICB4LmEgPSBhCisgICAgICAgIHguYiA9IGIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5fb2JqZWN0cywgTm9uZSkKKworICAgIGRlZiB0ZXN0X2VtYmVkZGVkX3N0cnVjdHMoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KSwgKCJiIiwgY19pbnQpXQorCisgICAgICAgIGNsYXNzIFkoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIFgpLCAoInkiLCBYKV0KKworICAgICAgICB5ID0gWSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHkuX29iamVjdHMsIE5vbmUpCisKKyAgICAgICAgeDEsIHgyID0gWCgpLCBYKCkKKyAgICAgICAgeS54LCB5LnkgPSB4MSwgeDIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeS5fb2JqZWN0cywgeyIwIjoge30sICIxIjoge319KQorICAgICAgICB4MS5hLCB4Mi5iID0gNDIsIDkzCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHkuX29iamVjdHMsIHsiMCI6IHt9LCAiMSI6IHt9fSkKKworICAgIGRlZiB0ZXN0X3h4eChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19jaGFyX3ApLCAoImIiLCBjX2NoYXJfcCldCisKKyAgICAgICAgY2xhc3MgWShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgWCksICgieSIsIFgpXQorCisgICAgICAgIHMxID0gIkhlbGxvLCBXb3JsZCIKKyAgICAgICAgczIgPSAiSGFsbG8sIFdlbHQiCisKKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4LmEgPSBzMQorICAgICAgICB4LmIgPSBzMgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4Ll9vYmplY3RzLCB7IjAiOiBzMSwgIjEiOiBzMn0pCisKKyAgICAgICAgeSA9IFkoKQorICAgICAgICB5LnggPSB4CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHkuX29iamVjdHMsIHsiMCI6IHsiMCI6IHMxLCAiMSI6IHMyfX0pCisjIyAgICAgICAgeCA9IHkueAorIyMgICAgICAgIGRlbCB5CisjIyAgICAgICAgcHJpbnQgeC5fYl9iYXNlXy5fb2JqZWN0cworCisgICAgZGVmIHRlc3RfcHRyX3N0cnVjdChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJkYXRhIiwgUE9JTlRFUihjX2ludCkpXQorCisgICAgICAgIEEgPSBjX2ludCo0CisgICAgICAgIGEgPSBBKDExLCAyMiwgMzMsIDQ0KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhLl9vYmplY3RzLCBOb25lKQorCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgeC5kYXRhID0gYQorIyNYWFggICAgICAgIHByaW50IHguX29iamVjdHMKKyMjWFhYICAgICAgICBwcmludCB4LmRhdGFbMF0KKyMjWFhYICAgICAgICBwcmludCB4LmRhdGEuX29iamVjdHMKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxMWY5OAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CkBAIC0wLDAgKzEsMTQ0IEBACitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFNpbXBsZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9jaW50KHNlbGYpOgorICAgICAgICB4ID0gY19pbnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4Ll9vYmplY3RzLCBOb25lKQorICAgICAgICB4LnZhbHVlID0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5fb2JqZWN0cywgTm9uZSkKKyAgICAgICAgeCA9IGNfaW50KDk5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4Ll9vYmplY3RzLCBOb25lKQorCisgICAgZGVmIHRlc3RfY2NoYXJwKHNlbGYpOgorICAgICAgICB4ID0gY19jaGFyX3AoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4Ll9vYmplY3RzLCBOb25lKQorICAgICAgICB4LnZhbHVlID0gImFiYyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5fb2JqZWN0cywgImFiYyIpCisgICAgICAgIHggPSBjX2NoYXJfcCgic3BhbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHguX29iamVjdHMsICJzcGFtIikKKworY2xhc3MgU3RydWN0dXJlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NpbnRfc3RydWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCldCisKKyAgICAgICAgeCA9IFgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4Ll9vYmplY3RzLCBOb25lKQorICAgICAgICB4LmEgPSA0MgorICAgICAgICB4LmIgPSA5OQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4Ll9vYmplY3RzLCBOb25lKQorCisgICAgZGVmIHRlc3RfY2NoYXJwX3N0cnVjdChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19jaGFyX3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19jaGFyX3ApXQorICAgICAgICB4ID0gWCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHguX29iamVjdHMsIE5vbmUpCisKKyAgICAgICAgeC5hID0gInNwYW0iCisgICAgICAgIHguYiA9ICJmb28iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHguX29iamVjdHMsIHsiMCI6ICJzcGFtIiwgIjEiOiAiZm9vIn0pCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3Rfc3RydWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLCAoInkiLCBjX2ludCldCisgICAgICAgIGNsYXNzIFJFQ1QoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygidWwiLCBQT0lOVCksICgibHIiLCBQT0lOVCldCisKKyAgICAgICAgciA9IFJFQ1QoKQorICAgICAgICByLnVsLnggPSAwCisgICAgICAgIHIudWwueSA9IDEKKyAgICAgICAgci5sci54ID0gMgorICAgICAgICByLmxyLnkgPSAzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIuX29iamVjdHMsIE5vbmUpCisKKyAgICAgICAgciA9IFJFQ1QoKQorICAgICAgICBwdCA9IFBPSU5UKDEsIDIpCisgICAgICAgIHIudWwgPSBwdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyLl9vYmplY3RzLCB7JzAnOiB7fX0pCisgICAgICAgIHIudWwueCA9IDIyCisgICAgICAgIHIudWwueSA9IDQ0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIuX29iamVjdHMsIHsnMCc6IHt9fSkKKworY2xhc3MgQXJyYXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY2ludF9hcnJheShzZWxmKToKKyAgICAgICAgSU5UQVJSID0gY19pbnQgKiAzCisKKyAgICAgICAgaWEgPSBJTlRBUlIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpYS5fb2JqZWN0cywgTm9uZSkKKyAgICAgICAgaWFbMF0gPSAxCisgICAgICAgIGlhWzFdID0gMgorICAgICAgICBpYVsyXSA9IDMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaWEuX29iamVjdHMsIE5vbmUpCisKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJhIiwgSU5UQVJSKV0KKworICAgICAgICB4ID0gWCgpCisgICAgICAgIHgueCA9IDEwMDAKKyAgICAgICAgeC5hWzBdID0gNDIKKyAgICAgICAgeC5hWzFdID0gOTYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5fb2JqZWN0cywgTm9uZSkKKyAgICAgICAgeC5hID0gaWEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5fb2JqZWN0cywgeycxJzoge319KQorCitjbGFzcyBQb2ludGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBYX3Rlc3RfcF9jaW50KHNlbGYpOgorICAgICAgICB4ID0gcG9pbnRlcihjX2ludCg0MikpCisgICAgICAgIHByaW50IHguX29iamVjdHMKKworY2xhc3MgRGVsZXRlUG9pbnRlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgWF90ZXN0KHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoInAiLCBQT0lOVEVSKGNfY2hhcl9wKSldCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgaSA9IGNfY2hhcl9wKCJhYmMgZGVmIikKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IGdldHJlZmNvdW50IGFzIGdyYworICAgICAgICBwcmludCAiMj8iLCBncmMoaSkKKyAgICAgICAgeC5wID0gcG9pbnRlcihpKQorICAgICAgICBwcmludCAiMz8iLCBncmMoaSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMzIwKToKKyAgICAgICAgICAgIGNfaW50KDk5KQorICAgICAgICAgICAgeC5wWzBdCisgICAgICAgIHByaW50IHgucFswXQorIyMgICAgICAgIGRlbCB4CisjIyAgICAgICAgcHJpbnQgIjI/IiwgZ3JjKGkpCisjIyAgICAgICAgZGVsIGkKKyAgICAgICAgaW1wb3J0IGdjCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgzMjApOgorICAgICAgICAgICAgY19pbnQoOTkpCisgICAgICAgICAgICB4LnBbMF0KKyAgICAgICAgcHJpbnQgeC5wWzBdCisgICAgICAgIHByaW50IHgucC5jb250ZW50cworIyMgICAgICAgIHByaW50IHguX29iamVjdHMKKworICAgICAgICB4LnBbMF0gPSAic3BhbSBzcGFtIgorIyMgICAgICAgIHByaW50IHgucFswXQorICAgICAgICBwcmludCAiKyIgKiA0MgorICAgICAgICBwcmludCB4Ll9vYmplY3RzCisKK2NsYXNzIFBvaW50ZXJUb1N0cnVjdHVyZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksICgieSIsIGNfaW50KV0KKyAgICAgICAgY2xhc3MgUkVDVChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgUE9JTlRFUihQT0lOVCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgUE9JTlRFUihQT0lOVCkpXQorICAgICAgICByID0gUkVDVCgpCisgICAgICAgIHAxID0gUE9JTlQoMSwgMikKKyAgICAKKyAgICAgICAgci5hID0gcG9pbnRlcihwMSkKKyAgICAgICAgci5iID0gcG9pbnRlcihwMSkKKyMjICAgICAgICBmcm9tIHBwcmludCBpbXBvcnQgcHByaW50IGFzIHBwCisjIyAgICAgICAgcHAocDEuX29iamVjdHMpCisjIyAgICAgICAgcHAoci5fb2JqZWN0cykKKworICAgICAgICByLmFbMF0ueCA9IDQyCisgICAgICAgIHIuYVswXS55ID0gOTkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xlYWtzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbGVha3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhNDRiYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xlYWtzLnB5CkBAIC0wLDAgKzEsODggQEAKK2ltcG9ydCB1bml0dGVzdCwgc3lzLCBnYworZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzIGltcG9ydCBfcG9pbnRlcl90eXBlX2NhY2hlCisKK2NsYXNzIExlYWtUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIyMjIyMjIyMjIyMjIyMjCisKKyAgICBkZWYgbWFrZV9ub25jeWNsaWNfc3RydWN0dXJlcyhzZWxmLCByZXBlYXQpOgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UocmVwZWF0KToKKyAgICAgICAgICAgIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CisgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLCAoInkiLCBjX2ludCldCisgICAgICAgICAgICBjbGFzcyBSRUNUKFN0cnVjdHVyZSk6CisgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ1bCIsIFBPSU5UKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImJyIiwgUE9JTlQpXQorCisgICAgaWYgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisKKyAgICAgICAgZGVmIHRlc3Rfbm9fY3ljbGVzX3JlZmNvdW50KHNlbGYpOgorICAgICAgICAgICAgbGFzdF9yZWZjb3VudCA9IDAKKyAgICAgICAgICAgIGZvciB4IGluIHhyYW5nZSgyMCk6CisgICAgICAgICAgICAgICAgc2VsZi5tYWtlX25vbmN5Y2xpY19zdHJ1Y3R1cmVzKDEwMDApCisgICAgICAgICAgICAgICAgd2hpbGUgZ2MuY29sbGVjdCgpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgdG90YWxfcmVmY291bnQgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgICAgICAgICAgaWYgbGFzdF9yZWZjb3VudCA+PSB0b3RhbF9yZWZjb3VudDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICMgdGVzdCBwYXNzZWQKKyAgICAgICAgICAgICAgICBsYXN0X3JlZmNvdW50ID0gdG90YWxfcmVmY291bnQKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibGVha2luZyByZWZjb3VudHMiKQorCisgICAgZGVmIHRlc3Rfbm9fY3ljbGVzX29iamNvdW50KHNlbGYpOgorICAgICAgICAjIG5vdCBjb3JyZWN0IC0gZ2MuZ2V0X29iamVjdHMoKSByZXR1cm5zIG9ubHkgdGhvcyBvYmplY3RzCisgICAgICAgICMgdGhhdCB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgdHJhY2tzLiAgQ29ycmVjdCB3b3VsZCBiZSB0byB1c2UKKyAgICAgICAgIyBzeXMuZ2V0b2JqZWN0cygpLCBidXQgdGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBkZWJ1ZyBidWlsZC4KKyAgICAgICAgbGFzdF9vYmpjb3VudCA9IDAKKyAgICAgICAgZm9yIHggaW4geHJhbmdlKDIwKToKKyAgICAgICAgICAgIHNlbGYubWFrZV9ub25jeWNsaWNfc3RydWN0dXJlcygxMDAwKQorICAgICAgICAgICAgd2hpbGUgZ2MuY29sbGVjdCgpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRvdGFsX29iamNvdW50ID0gZ2MuZ2V0X29iamVjdHMoKQorICAgICAgICAgICAgaWYgbGFzdF9vYmpjb3VudCA+PSB0b3RhbF9vYmpjb3VudDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIyB0ZXN0IHBhc3NlZAorICAgICAgICAgICAgbGFzdF9vYmpjb3VudCA9IHRvdGFsX29iamNvdW50CisgICAgICAgIHNlbGYuZmFpbCgibGVha2luZyBvYmplY3RzIikKKworICAgICMjIyMjIyMjIyMjIyMjIyMKKworICAgIGRlZiBtYWtlX2N5Y2xpY19zdHJ1Y3R1cmVzKHNlbGYsIHJlcGVhdCk6CisgICAgICAgIGZvciBpIGluIHhyYW5nZShyZXBlYXQpOgorICAgICAgICAgICAgUExJU1QgPSBQT0lOVEVSKCJMSVNUIikKKyAgICAgICAgICAgIGNsYXNzIExJU1QoU3RydWN0dXJlKToKKyAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoInBuZXh0IiwgUExJU1QpXQorICAgICAgICAgICAgU2V0UG9pbnRlclR5cGUoUExJU1QsIExJU1QpCisgICAgICAgICAgICBkZWwgX3BvaW50ZXJfdHlwZV9jYWNoZVtMSVNUXSAjIFhYWCBzaG91bGQgdGhpcyBiZSBhIHdlYWtrZXlkaWN0PworCisgICAgaWYgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisKKyAgICAgICAgZGVmIHRlc3RfY3ljbGVzX3JlZmNvdW50KHNlbGYpOgorICAgICAgICAgICAgbGFzdF9yZWZjb3VudCA9IDAKKyAgICAgICAgICAgIGZvciB4IGluIHhyYW5nZSg1KToKKyAgICAgICAgICAgICAgICBzZWxmLm1ha2VfY3ljbGljX3N0cnVjdHVyZXMoMTAwMCkKKyAgICAgICAgICAgICAgICB3aGlsZSBnYy5jb2xsZWN0KCk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICB0b3RhbF9yZWZjb3VudCA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgICAgICAgICBpZiBsYXN0X3JlZmNvdW50ID49IHRvdGFsX3JlZmNvdW50OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBsYXN0X3JlZmNvdW50ID0gdG90YWxfcmVmY291bnQKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibGVha2luZyByZWZjb3VudHMiKQorCisgICAgZWxzZToKKworICAgICAgICBkZWYgdGVzdF9jeWNsZXNfb2JqY291bnQoc2VsZik6CisgICAgICAgICAgICAjIG5vdCBjb3JyZWN0IC0gZ2MuZ2V0X29iamVjdHMoKSByZXR1cm5zIG9ubHkgdGhvcyBvYmplY3RzCisgICAgICAgICAgICAjIHRoYXQgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRyYWNrcy4gIENvcnJlY3Qgd291bGQgYmUgdG8gdXNlCisgICAgICAgICAgICAjIHN5cy5nZXRvYmplY3RzKCksIGJ1dCB0aGlzIGlzIG9ubHkgYXZhaWxhYmxlIGluIGRlYnVnIGJ1aWxkLgorICAgICAgICAgICAgbGFzdF9vYmpjb3VudCA9IDAKKyAgICAgICAgICAgIGZvciB4IGluIHhyYW5nZSg4KToKKyAgICAgICAgICAgICAgICBzZWxmLm1ha2VfY3ljbGljX3N0cnVjdHVyZXMoMTAwMCkKKyAgICAgICAgICAgICAgICB3aGlsZSBnYy5jb2xsZWN0KCk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICB0b3RhbF9vYmpjb3VudCA9IGxlbihnYy5nZXRfb2JqZWN0cygpKQorICAgICAgICAgICAgICAgIGlmIGxhc3Rfb2JqY291bnQgPj0gdG90YWxfb2JqY291bnQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGxhc3Rfb2JqY291bnQgPSB0b3RhbF9vYmpjb3VudAorICAgICAgICAgICAgc2VsZi5mYWlsKCJsZWFraW5nIG9iamVjdHMiKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xpYmMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZkMjc4OQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xpYmMucHkKQEAgLTAsMCArMSwzMCBAQAoraW1wb3J0IHN5cywgb3MKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IF9jdHlwZXNfdGVzdAorCitsaWIgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorCitjbGFzcyBMaWJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9zcXJ0KHNlbGYpOgorICAgICAgICBsaWIubXlfc3FydC5hcmd0eXBlcyA9IGNfZG91YmxlLAorICAgICAgICBsaWIubXlfc3FydC5yZXN0eXBlID0gY19kb3VibGUKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGliLm15X3NxcnQoNC4wKSwgMi4wKQorICAgICAgICBpbXBvcnQgbWF0aAorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsaWIubXlfc3FydCgyLjApLCBtYXRoLnNxcnQoMi4wKSkKKworICAgIGRlZiB0ZXN0X3Fzb3J0KHNlbGYpOgorICAgICAgICBjb21wYXJlZnVuYyA9IENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihjX2NoYXIpLCBQT0lOVEVSKGNfY2hhcikpCisgICAgICAgIGxpYi5teV9xc29ydC5hcmd0eXBlcyA9IGNfdm9pZF9wLCBjX3NpemVfdCwgY19zaXplX3QsIGNvbXBhcmVmdW5jCisgICAgICAgIGxpYi5teV9xc29ydC5yZXN0eXBlID0gTm9uZQorCisgICAgICAgIGRlZiBzb3J0KGEsIGIpOgorICAgICAgICAgICAgcmV0dXJuIGNtcChhWzBdLCBiWzBdKQorCisgICAgICAgIGNoYXJzID0gY3JlYXRlX3N0cmluZ19idWZmZXIoInNwYW0sIHNwYW0sIGFuZCBzcGFtIikKKyAgICAgICAgbGliLm15X3Fzb3J0KGNoYXJzLCBsZW4oY2hhcnMpLTEsIHNpemVvZihjX2NoYXIpLCBjb21wYXJlZnVuYyhzb3J0KSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2hhcnMucmF3LCAiICAgLCxhYWFhZG1tbW5wcHBzc3NceDAwIikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNTY0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CkBAIC0wLDAgKzEsNDEgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgc3lzLCB1bml0dGVzdAoraW1wb3J0IG9zLCBTdHJpbmdJTworCitjbGFzcyBMb2FkZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIHVua25vd25kbGwgPSAieHhyYW5kb21uYW1leHgiCisKKyAgICBkZWYgdGVzdF9sb2FkKHNlbGYpOgorICAgICAgICBpZiBvcy5uYW1lID09ICJudCI6CisgICAgICAgICAgICBuYW1lID0gIm1zdmNydCIKKyAgICAgICAgZWxpZiBvcy5uYW1lID09ICJjZSI6CisgICAgICAgICAgICBuYW1lID0gImNvcmVkbGwiCisgICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgICAgICAgICAgbmFtZSA9ICJsaWJjLmR5bGliIgorICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJmcmVlYnNkIik6CisgICAgICAgICAgICBuYW1lID0gImxpYmMuc28iCisgICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICJzdW5vczUiOgorICAgICAgICAgICAgbmFtZSA9ICJsaWJjLnNvIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZSA9ICJsaWJjLnNvLjYiCisgICAgICAgIGNkbGwubG9hZChuYW1lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLmxvYWQsIHNlbGYudW5rbm93bmRsbCkKKworICAgIGRlZiB0ZXN0X2xvYWRfdmVyc2lvbihzZWxmKToKKyAgICAgICAgdmVyc2lvbiA9ICI2IgorICAgICAgICBuYW1lID0gImMiCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAibGludXgyIjoKKyAgICAgICAgICAgIGNkbGwubG9hZF92ZXJzaW9uKG5hbWUsIHZlcnNpb24pCisgICAgICAgICAgICAjIGxpbnV4IHVzZXMgdmVyc2lvbiwgbGliYyA5IHNob3VsZCBub3QgZXhpc3QKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwubG9hZF92ZXJzaW9uLCBuYW1lLCAiOSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwubG9hZF92ZXJzaW9uLCBzZWxmLnVua25vd25kbGwsICIiKQorCisgICAgaWYgb3MubmFtZSA9PSAicG9zaXgiIGFuZCBzeXMucGxhdGZvcm0gIT0gInN1bm9zNSI6CisgICAgICAgIGRlZiB0ZXN0X2ZpbmQoc2VsZik6CisgICAgICAgICAgICBuYW1lID0gImMiCisgICAgICAgICAgICBjZGxsLmZpbmQobmFtZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwuZmluZCwgc2VsZi51bmtub3duZGxsKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTcxNTg5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHkKQEAgLTAsMCArMSw2MiBAQAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworIyBCb2IgSXBwb2xpdG86CisiIiIKK09rLi4gdGhlIGNvZGUgdG8gZmluZCB0aGUgZmlsZW5hbWUgZm9yIF9fZ2V0YXR0cl9fIHNob3VsZCBsb29rCitzb21ldGhpbmcgbGlrZToKKworaW1wb3J0IG9zCitmcm9tIG1hY2hvbGliLmR5bGQgaW1wb3J0IGR5bGRfZmluZAorCitkZWYgZmluZF9saWIobmFtZSk6CisgICAgIHBvc3NpYmxlID0gWydsaWInK25hbWUrJy5keWxpYicsIG5hbWUrJy5keWxpYicsCisgICAgIG5hbWUrJy5mcmFtZXdvcmsvJytuYW1lXQorICAgICBmb3IgZHlsaWIgaW4gcG9zc2libGU6CisgICAgICAgICB0cnk6CisgICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGgucmVhbHBhdGgoZHlsZF9maW5kKGR5bGliKSkKKyAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgIHBhc3MKKyAgICAgcmFpc2UgVmFsdWVFcnJvciwgIiVzIG5vdCBmb3VuZCIgJSAobmFtZSwpCisKK0l0J2xsIGhhdmUgb3V0cHV0IGxpa2UgdGhpczoKKworID4+PiBmaW5kX2xpYigncHRocmVhZCcpCisnL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWInCisgPj4+IGZpbmRfbGliKCd6JykKKycvdXNyL2xpYi9saWJ6LjEuZHlsaWInCisgPj4+IGZpbmRfbGliKCdJT0tpdCcpCisnL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSU9LaXQuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSU9LaXQnCisKKy1ib2IKKworIiIiCisKK2Zyb20gY3R5cGVzLm1hY2hvbGliLmR5bGQgaW1wb3J0IGR5bGRfZmluZAorCitkZWYgZmluZF9saWIobmFtZSk6CisgICAgIHBvc3NpYmxlID0gWydsaWInK25hbWUrJy5keWxpYicsIG5hbWUrJy5keWxpYicsIG5hbWUrJy5mcmFtZXdvcmsvJytuYW1lXQorICAgICBmb3IgZHlsaWIgaW4gcG9zc2libGU6CisgICAgICAgICB0cnk6CisgICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGgucmVhbHBhdGgoZHlsZF9maW5kKGR5bGliKSkKKyAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgIHBhc3MKKyAgICAgcmFpc2UgVmFsdWVFcnJvciwgIiVzIG5vdCBmb3VuZCIgJSAobmFtZSwpCisKK2NsYXNzIE1hY2hPVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgICAgICBkZWYgdGVzdF9maW5kKHNlbGYpOgorCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmaW5kX2xpYigncHRocmVhZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliJykKKworICAgICAgICAgICAgcmVzdWx0ID0gZmluZF9saWIoJ3onKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlc3VsdC5zdGFydHN3aXRoKCcvdXNyL2xpYi9saWJ6LjEnKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXN1bHQuZW5kc3dpdGgoJy5keWxpYicpKQorCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmaW5kX2xpYignSU9LaXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9JT0tpdC5mcmFtZXdvcmsvVmVyc2lvbnMvQS9JT0tpdCcpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJhZTJjZQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X21lbWZ1bmN0aW9ucy5weQpAQCAtMCwwICsxLDU5IEBACitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK2NsYXNzIE1lbUZ1bmN0aW9uc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X21lbW1vdmUoc2VsZik6CisgICAgICAgICMgbGFyZ2UgYnVmZmVycyBhcHBhcmVudGx5IGluY3JlYXNlIHRoZSBjaGFuY2UgdGhhdCB0aGUgbWVtb3J5CisgICAgICAgICMgaXMgYWxsb2NhdGVkIGluIGhpZ2ggYWRkcmVzcyBzcGFjZS4KKyAgICAgICAgYSA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKDEwMDAwMDApCisgICAgICAgIHAgPSAiSGVsbG8sIFdvcmxkIgorICAgICAgICByZXN1bHQgPSBtZW1tb3ZlKGEsIHAsIGxlbihwKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYS52YWx1ZSwgIkhlbGxvLCBXb3JsZCIpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyaW5nX2F0KHJlc3VsdCksICJIZWxsbywgV29ybGQiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJpbmdfYXQocmVzdWx0LCA1KSwgIkhlbGxvIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyaW5nX2F0KHJlc3VsdCwgMTYpLCAiSGVsbG8sIFdvcmxkXDBcMFwwXDAiKQorCisgICAgZGVmIHRlc3RfbWVtc2V0KHNlbGYpOgorICAgICAgICBhID0gY3JlYXRlX3N0cmluZ19idWZmZXIoMTAwMDAwMCkKKyAgICAgICAgcmVzdWx0ID0gbWVtc2V0KGEsIG9yZCgneCcpLCAxNikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYS52YWx1ZSwgInh4eHh4eHh4eHh4eHh4eHgiKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmluZ19hdChyZXN1bHQpLCAieHh4eHh4eHh4eHh4eHh4eCIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmluZ19hdChhKSwgInh4eHh4eHh4eHh4eHh4eHgiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJpbmdfYXQoYSwgMjApLCAieHh4eHh4eHh4eHh4eHh4eFwwXDBcMFwwIikKKworICAgIGRlZiB0ZXN0X2Nhc3Qoc2VsZik6CisgICAgICAgIGEgPSAoY191Ynl0ZSAqIDMyKSgqbWFwKG9yZCwgImFiY2RlZiIpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjYXN0KGEsIGNfY2hhcl9wKS52YWx1ZSwgImFiY2RlZiIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNhc3QoYSwgUE9JTlRFUihjX2J5dGUpKVs6N10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAwXSkKKworICAgIGRlZiB0ZXN0X3N0cmluZ19hdChzZWxmKToKKyAgICAgICAgcyA9IHN0cmluZ19hdCgiZm9vIGJhciIpCisgICAgICAgICMgWFhYIFRoZSBmb2xsb3dpbmcgbWF5IGJlIHdyb25nLCBkZXBlbmRpbmcgb24gaG93IFB5dGhvbgorICAgICAgICAjIG1hbmFnZXMgc3RyaW5nIGluc3RhbmNlcworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgyLCBzeXMuZ2V0cmVmY291bnQocykpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLCAiZm9vIGJhciIpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyaW5nX2F0KCJmb28gYmFyIiwgOCksICJmb28gYmFyXDAiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJpbmdfYXQoImZvbyBiYXIiLCAzKSwgImZvbyIpCisKKyAgICB0cnk6CisgICAgICAgIGNyZWF0ZV91bmljb2RlX2J1ZmZlcgorICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBkZWYgdGVzdF93c3RyaW5nX2F0KHNlbGYpOgorICAgICAgICAgICAgcCA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcigiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgICAgIGEgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoMTAwMDAwMCkKKyAgICAgICAgICAgIHJlc3VsdCA9IG1lbW1vdmUoYSwgcCwgbGVuKHApICogc2l6ZW9mKGNfd2NoYXIpKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYS52YWx1ZSwgIkhlbGxvLCBXb3JsZCIpCisKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdzdHJpbmdfYXQoYSksICJIZWxsbywgV29ybGQiKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod3N0cmluZ19hdChhLCA1KSwgIkhlbGxvIikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdzdHJpbmdfYXQoYSwgMTYpLCAiSGVsbG8sIFdvcmxkXDBcMFwwXDAiKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X251bWJlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI0ZWM3MwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X251bWJlcnMucHkKQEAgLTAsMCArMSwyNDMgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMsIHN0cnVjdAorCitkZWYgdmFsaWRfcmFuZ2VzKCp0eXBlcyk6CisgICAgIyBnaXZlbiBhIHNlcXVlbmNlIG9mIG51bWVyaWMgdHlwZXMsIGNvbGxlY3QgdGhlaXIgX3R5cGVfCisgICAgIyBhdHRyaWJ1dGUsIHdoaWNoIGlzIGEgc2luZ2xlIGZvcm1hdCBjaGFyYWN0ZXIgY29tcGF0aWJsZSB3aXRoCisgICAgIyB0aGUgc3RydWN0IG1vZHVsZSwgdXNlIHRoZSBzdHJ1Y3QgbW9kdWxlIHRvIGNhbGN1bGF0ZSB0aGUKKyAgICAjIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUgYWxsb3dlZCBmb3IgdGhpcyBmb3JtYXQuCisgICAgIyBSZXR1cm5zIGEgbGlzdCBvZiAobWluLCBtYXgpIHZhbHVlcy4KKyAgICByZXN1bHQgPSBbXQorICAgIGZvciB0IGluIHR5cGVzOgorICAgICAgICBmbXQgPSB0Ll90eXBlXworICAgICAgICBzaXplID0gc3RydWN0LmNhbGNzaXplKGZtdCkKKyAgICAgICAgYSA9IHN0cnVjdC51bnBhY2soZm10LCAoIlx4MDAiKjMyKVs6c2l6ZV0pWzBdCisgICAgICAgIGIgPSBzdHJ1Y3QudW5wYWNrKGZtdCwgKCJceEZGIiozMilbOnNpemVdKVswXQorICAgICAgICBjID0gc3RydWN0LnVucGFjayhmbXQsICgiXHg3RiIrIlx4MDAiKjMyKVs6c2l6ZV0pWzBdCisgICAgICAgIGQgPSBzdHJ1Y3QudW5wYWNrKGZtdCwgKCJceDgwIisiXHhGRiIqMzIpWzpzaXplXSlbMF0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgobWluKGEsIGIsIGMsIGQpLCBtYXgoYSwgYiwgYywgZCkpKQorICAgIHJldHVybiByZXN1bHQKKworQXJnVHlwZSA9IHR5cGUoY19pbnQoMCkuX2FzX3BhcmFtZXRlcl8pCisKK3Vuc2lnbmVkX3R5cGVzID0gW2NfdWJ5dGUsIGNfdXNob3J0LCBjX3VpbnQsIGNfdWxvbmddCitzaWduZWRfdHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2xvbmdsb25nXQorCitmbG9hdF90eXBlcyA9IFtjX2RvdWJsZSwgY19mbG9hdF0KKwordHJ5OgorICAgIGNfdWxvbmdsb25nCisgICAgY19sb25nbG9uZworZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIHVuc2lnbmVkX3R5cGVzLmFwcGVuZChjX3Vsb25nbG9uZykKKyAgICBzaWduZWRfdHlwZXMuYXBwZW5kKGNfbG9uZ2xvbmcpCisgICAgCit1bnNpZ25lZF9yYW5nZXMgPSB2YWxpZF9yYW5nZXMoKnVuc2lnbmVkX3R5cGVzKQorc2lnbmVkX3JhbmdlcyA9IHZhbGlkX3Jhbmdlcygqc2lnbmVkX3R5cGVzKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIE51bWJlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAKKyAgICBkZWYgdGVzdF9kZWZhdWx0X2luaXQoc2VsZik6CisgICAgICAgICMgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldCB0byB6ZXJvCisgICAgICAgIGZvciB0IGluIHNpZ25lZF90eXBlcyArIHVuc2lnbmVkX3R5cGVzICsgZmxvYXRfdHlwZXM6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0KCkudmFsdWUsIDApCisKKyAgICBkZWYgdGVzdF91bnNpZ25lZF92YWx1ZXMoc2VsZik6CisgICAgICAgICMgdGhlIHZhbHVlIGdpdmVuIHRvIHRoZSBjb25zdHJ1Y3RvciBpcyBhdmFpbGFibGUKKyAgICAgICAgIyBhcyB0aGUgJ3ZhbHVlJyBhdHRyaWJ1dGUKKyAgICAgICAgZm9yIHQsIChsLCBoKSBpbiB6aXAodW5zaWduZWRfdHlwZXMsIHVuc2lnbmVkX3Jhbmdlcyk6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0KGwpLnZhbHVlLCBsKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodChoKS52YWx1ZSwgaCkKKworICAgIGRlZiB0ZXN0X3NpZ25lZF92YWx1ZXMoc2VsZik6CisgICAgICAgICMgc2VlIGFib3ZlCisgICAgICAgIGZvciB0LCAobCwgaCkgaW4gemlwKHNpZ25lZF90eXBlcywgc2lnbmVkX3Jhbmdlcyk6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0KGwpLnZhbHVlLCBsKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodChoKS52YWx1ZSwgaCkKKworICAgIGRlZiB0ZXN0X3R5cGVlcnJvcihzZWxmKToKKyAgICAgICAgIyBPbmx5IG51bWJlcnMgYXJlIGFsbG93ZWQgaW4gdGhlIGNvbnRydWN0b3IsCisgICAgICAgICMgb3RoZXJ3aXNlIFR5cGVFcnJvciBpcyByYWlzZWQKKyAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXMgKyBmbG9hdF90eXBlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdCwgIiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQsIE5vbmUpCisKKyMjICAgIGRlZiB0ZXN0X3ZhbGlkX3JhbmdlcyhzZWxmKToKKyMjICAgICAgICAjIGludmFsaWQgdmFsdWVzIG9mIHRoZSBjb3JyZWN0IHR5cGUKKyMjICAgICAgICAjIHJhaXNlIFZhbHVlRXJyb3IgKG5vdCBPdmVyZmxvd0Vycm9yKQorIyMgICAgICAgIGZvciB0LCAobCwgaCkgaW4gemlwKHVuc2lnbmVkX3R5cGVzLCB1bnNpZ25lZF9yYW5nZXMpOgorIyMgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LCBsLTEpCisjIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQsIGgrMSkKKworICAgIGRlZiB0ZXN0X2Zyb21fcGFyYW0oc2VsZik6CisgICAgICAgICMgdGhlIGZyb21fcGFyYW0gY2xhc3MgbWV0aG9kIGF0dHJpYnV0ZSBhbHdheXMKKyAgICAgICAgIyByZXR1cm5zIFB5Q0FyZ09iamVjdCBpbnN0YW5jZXMKKyAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXMgKyBmbG9hdF90eXBlczoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKEFyZ1R5cGUsIHR5cGUodC5mcm9tX3BhcmFtKDApKSkKKworICAgIGRlZiB0ZXN0X2FzX3BhcmFtZXRlcihzZWxmKToKKyAgICAgICAgIyBUaGUgX2FzX3BhcmFtZXRlcl8gcHJvcGVydHkgbXVzdCBhbHNvCisgICAgICAgICMgYmUgYSBQeUNBcmdPYmplY3QgaW5zdGFuY2UKKyAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXMgKyBmbG9hdF90eXBlczoKKyAgICAgICAgICAgIHBhcm0gPSB0KCkuX2FzX3BhcmFtZXRlcl8KKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKEFyZ1R5cGUsIHR5cGUocGFybSkpCisKKyAgICAgICAgICAgICMgX2FzX3BhcmFtZXRlcl8gaXMgcmVhZG9ubHkhCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIFB5dGhvbiAyLjMgYW5kIDIuNCByYWlzZSBhIFR5cGVFcnJvciB3aGVuIHRyeWluZyB0byBzZXQKKyAgICAgICAgICAgICMgYSByZWFkb25seSBhdHRyaWJ1dGUsIDIuNSByYWlzZXMgYW4gQXR0cmlidXRlRXJyb3IuCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvciksIHNldGF0dHIsIHQoKSwgIl9hc19wYXJhbWV0ZXJfIiwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2J5cmVmKHNlbGYpOgorICAgICAgICAjIGNhbGxpbmcgYnlyZWYgcmV0dXJucyBhbHNvIGEgUHlDQXJnT2JqZWN0IGluc3RhbmNlCisgICAgICAgIGZvciB0IGluIHNpZ25lZF90eXBlcyArIHVuc2lnbmVkX3R5cGVzICsgZmxvYXRfdHlwZXM6CisgICAgICAgICAgICBwYXJtID0gYnlyZWYodCgpKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoQXJnVHlwZSwgdHlwZShwYXJtKSkKKworCisgICAgZGVmIHRlc3RfZmxvYXRzKHNlbGYpOgorICAgICAgICAjIGNfZmxvYXQgYW5kIGNfZG91YmxlIGNhbiBiZSBjcmVhdGVkIGZyb20KKyAgICAgICAgIyBQeXRob24gaW50LCBsb25nIGFuZCBmbG9hdAorICAgICAgICBmb3IgdCBpbiBmbG9hdF90eXBlczoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHQoMi4wKS52YWx1ZSwgMi4wKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodCgyKS52YWx1ZSwgMi4wKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodCgyTCkudmFsdWUsIDIuMCkKKworICAgIGRlZiB0ZXN0X2ludGVnZXJzKHNlbGYpOgorICAgICAgICAjIGludGVnZXJzIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBmcm9tIGZsb2F0cworICAgICAgICBmb3IgdCBpbiBzaWduZWRfdHlwZXMgKyB1bnNpZ25lZF90eXBlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdCwgMy4xNCkKKworICAgIGRlZiB0ZXN0X3NpemVzKHNlbGYpOgorICAgICAgICBmb3IgdCBpbiBzaWduZWRfdHlwZXMgKyB1bnNpZ25lZF90eXBlcyArIGZsb2F0X3R5cGVzOgorICAgICAgICAgICAgc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZSh0Ll90eXBlXykKKyAgICAgICAgICAgICMgc2l6ZW9mIG9mIHRoZSB0eXBlLi4uCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YodCksIHNpemUpCisgICAgICAgICAgICAjIGFuZCBzaXplb2Ygb2YgYW4gaW5zdGFuY2UKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih0KCkpLCBzaXplKQorCisgICAgZGVmIHRlc3RfYWxpZ25tZW50cyhzZWxmKToKKyAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXMgKyBmbG9hdF90eXBlczoKKyAgICAgICAgICAgIGNvZGUgPSB0Ll90eXBlXyAjIHRoZSB0eXBlY29kZQorICAgICAgICAgICAgYWxpZ24gPSBzdHJ1Y3QuY2FsY3NpemUoImMlYyIgJSBjb2RlKSAtIHN0cnVjdC5jYWxjc2l6ZShjb2RlKQorCisgICAgICAgICAgICAjIGFsaWdubWVudCBvZiB0aGUgdHlwZS4uLgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGNvZGUsIGFsaWdubWVudCh0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29kZSwgYWxpZ24pKQorICAgICAgICAgICAgIyBhbmQgYWxpZ25tZW50IG9mIGFuIGluc3RhbmNlCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoY29kZSwgYWxpZ25tZW50KHQoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUsIGFsaWduKSkKKyAgICAgICAgICAgIAorICAgIGRlZiB0ZXN0X2ludF9mcm9tX2FkZHJlc3Moc2VsZik6CisgICAgICAgIGZyb20gYXJyYXkgaW1wb3J0IGFycmF5CisgICAgICAgIGZvciB0IGluIHNpZ25lZF90eXBlcyArIHVuc2lnbmVkX3R5cGVzOgorICAgICAgICAgICAgIyB0aGUgYXJyYXkgbW9kdWxlIGRvZXNuJ3Qgc3VwcHBvcnQgYWxsIGZvcm1hdCBjb2RlcworICAgICAgICAgICAgIyAobm8gJ3EnIG9yICdRJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhcnJheSh0Ll90eXBlXykKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBhID0gYXJyYXkodC5fdHlwZV8sIFsxMDBdKQorCisgICAgICAgICAgICAjIHYgbm93IGlzIGFuIGludGVnZXIgYXQgYW4gJ2V4dGVybmFsJyBtZW1vcnkgbG9jYXRpb24KKyAgICAgICAgICAgIHYgPSB0LmZyb21fYWRkcmVzcyhhLmJ1ZmZlcl9pbmZvKClbMF0pCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2KSwgdCkKKworICAgICAgICAgICAgIyBjaGFuZ2luZyB0aGUgdmFsdWUgYXQgdGhlIG1lbW9yeSBsb2NhdGlvbiBjaGFuZ2VzIHYncyB2YWx1ZSBhbHNvCisgICAgICAgICAgICBhWzBdID0gNDIKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHYudmFsdWUsIGFbMF0pCisgICAgICAgICAgICAKKworICAgIGRlZiB0ZXN0X2Zsb2F0X2Zyb21fYWRkcmVzcyhzZWxmKToKKyAgICAgICAgZnJvbSBhcnJheSBpbXBvcnQgYXJyYXkKKyAgICAgICAgZm9yIHQgaW4gZmxvYXRfdHlwZXM6CisgICAgICAgICAgICBhID0gYXJyYXkodC5fdHlwZV8sIFszLjE0XSkKKyAgICAgICAgICAgIHYgPSB0LmZyb21fYWRkcmVzcyhhLmJ1ZmZlcl9pbmZvKClbMF0pCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUodikgaXMgdCkKKyAgICAgICAgICAgIGFbMF0gPSAyLjM0NTZlMTcKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHYudmFsdWUsIGFbMF0pCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZSh2KSBpcyB0KQorCisgICAgZGVmIHRlc3RfY2hhcl9mcm9tX2FkZHJlc3Moc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX2NoYXIKKyAgICAgICAgZnJvbSBhcnJheSBpbXBvcnQgYXJyYXkKKyAgICAgICAgCisgICAgICAgIGEgPSBhcnJheSgnYycsICd4JykKKyAgICAgICAgdiA9IGNfY2hhci5mcm9tX2FkZHJlc3MoYS5idWZmZXJfaW5mbygpWzBdKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZSh2KSBpcyBjX2NoYXIpCisKKyAgICAgICAgYVswXSA9ICc/JworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnZhbHVlLCBhWzBdKQorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgIyBjX2ludCgpIGNhbiBiZSBpbml0aWFsaXplZCBmcm9tIFB5dGhvbidzIGludCwgYW5kIGNfaW50LgorICAgICAgICAjIE5vdCBmcm9tIGNfbG9uZyBvciBzbywgd2hpY2ggc2VlbXMgc3RyYW5nZSwgYWJkIHNob3VsZAorICAgICAgICAjIHByb2JhYmx5IGJlIGNoYW5nZWQ6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY19pbnQsIGNfbG9uZyg0MikpCisKKyMjICAgIGRlZiB0ZXN0X3BlcmYoc2VsZik6CisjIyAgICAgICAgY2hlY2tfcGVyZigpCisgICAgICAgIAorZnJvbSBjdHlwZXMgaW1wb3J0IF9TaW1wbGVDRGF0YQorY2xhc3MgY19pbnRfUyhfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJpIgorICAgIF9fc2xvdHNfXyA9IFtdCisKK2RlZiBydW5fdGVzdChyZXAsIG1zZywgZnVuYywgYXJnPU5vbmUpOgorIyMgICAgaXRlbXMgPSBbTm9uZV0gKiByZXAKKyAgICBpdGVtcyA9IHJhbmdlKHJlcCkKKyAgICBmcm9tIHRpbWUgaW1wb3J0IGNsb2NrCisgICAgaWYgYXJnIGlzIG5vdCBOb25lOgorICAgICAgICBzdGFydCA9IGNsb2NrKCkKKyAgICAgICAgZm9yIGkgaW4gaXRlbXM6CisgICAgICAgICAgICBmdW5jKGFyZyk7IGZ1bmMoYXJnKTsgZnVuYyhhcmcpOyBmdW5jKGFyZyk7IGZ1bmMoYXJnKQorICAgICAgICBzdG9wID0gY2xvY2soKQorICAgIGVsc2U6CisgICAgICAgIHN0YXJ0ID0gY2xvY2soKQorICAgICAgICBmb3IgaSBpbiBpdGVtczoKKyAgICAgICAgICAgIGZ1bmMoKTsgZnVuYygpOyBmdW5jKCk7IGZ1bmMoKTsgZnVuYygpCisgICAgICAgIHN0b3AgPSBjbG9jaygpCisgICAgcHJpbnQgIiUxNXM6ICUuMmYgdXMiICUgKG1zZywgKChzdG9wLXN0YXJ0KSoxZTYvNS9yZXApKQorCitkZWYgY2hlY2tfcGVyZigpOgorICAgICMgQ29uc3RydWN0IDUgb2JqZWN0cworICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX2ludAorCisgICAgUkVQID0gMjAwMDAwCisKKyAgICBydW5fdGVzdChSRVAsICJpbnQoKSIsIGludCkKKyAgICBydW5fdGVzdChSRVAsICJpbnQoOTk5KSIsIGludCkKKyAgICBydW5fdGVzdChSRVAsICJjX2ludCgpIiwgY19pbnQpCisgICAgcnVuX3Rlc3QoUkVQLCAiY19pbnQoOTk5KSIsIGNfaW50KQorICAgIHJ1bl90ZXN0KFJFUCwgImNfaW50X1MoKSIsIGNfaW50X1MpCisgICAgcnVuX3Rlc3QoUkVQLCAiY19pbnRfUyg5OTkpIiwgY19pbnRfUykKKworIyBQeXRob24gMi4zIC1PTywgd2luMmssIFA0IDcwMCBNSHo6CisjCisjICAgICAgICAgIGludCgpOiAwLjg3IHVzCisjICAgICAgIGludCg5OTkpOiAwLjg3IHVzCisjICAgICAgICBjX2ludCgpOiAzLjM1IHVzCisjICAgICBjX2ludCg5OTkpOiAzLjM0IHVzCisjICAgICAgY19pbnRfUygpOiAzLjIzIHVzCisjICAgY19pbnRfUyg5OTkpOiAzLjI0IHVzICAgIAorCisjIFB5dGhvbiAyLjIgLU9PLCB3aW4yaywgUDQgNzAwIE1IejoKKyMKKyMgICAgICAgICAgaW50KCk6IDAuODkgdXMKKyMgICAgICAgaW50KDk5OSk6IDAuODkgdXMKKyMgICAgICAgIGNfaW50KCk6IDkuOTkgdXMKKyMgICAgIGNfaW50KDk5OSk6IDEwLjAyIHVzCisjICAgICAgY19pbnRfUygpOiA5Ljg3IHVzCisjICAgY19pbnRfUyg5OTkpOiA5Ljg1IHVzCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisjIyAgICBjaGVja19wZXJmKCkKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ODhmM2EKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5CkBAIC0wLDAgKzEsMTUzIEBACitpbXBvcnQgdW5pdHRlc3QsIHN5cworCitjbGFzcyBTaW1wbGVUeXBlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaW1wb3J0IGN0eXBlcworICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IHNldF9jb252ZXJzaW9uX21vZGUKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wcmV2X2NvbnZfbW9kZSA9IHNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgc2V0X2NvbnZlcnNpb25fbW9kZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXRfY29udmVyc2lvbl9tb2RlKCpzZWxmLnByZXZfY29udl9tb2RlKQorICAgICAgICAKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzZXMoc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX3ZvaWRfcCwgY19jaGFyX3AKKyAgICAgICAgIyBjdHlwZXMgMC45LjUgYW5kIGJlZm9yZSBkaWQgb3ZlcndyaXRlIGZyb21fcGFyYW0gaW4gU2ltcGxlVHlwZV9uZXcKKyAgICAgICAgY2xhc3MgQ1ZPSURQKGNfdm9pZF9wKToKKyAgICAgICAgICAgIGRlZiBmcm9tX3BhcmFtKGNscywgdmFsdWUpOgorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAqIDIKKyAgICAgICAgICAgIGZyb21fcGFyYW0gPSBjbGFzc21ldGhvZChmcm9tX3BhcmFtKQorCisgICAgICAgIGNsYXNzIENDSEFSUChjX2NoYXJfcCk6CisgICAgICAgICAgICBkZWYgZnJvbV9wYXJhbShjbHMsIHZhbHVlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKiA0CisgICAgICAgICAgICBmcm9tX3BhcmFtID0gY2xhc3NtZXRob2QoZnJvbV9wYXJhbSkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChDVk9JRFAuZnJvbV9wYXJhbSgiYWJjIiksICJhYmNhYmMiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChDQ0hBUlAuZnJvbV9wYXJhbSgiYWJjIiksICJhYmNhYmNhYmNhYmMiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX3djaGFyX3AKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgY2xhc3MgQ1dDSEFSUChjX3djaGFyX3ApOgorICAgICAgICAgICAgZGVmIGZyb21fcGFyYW0oY2xzLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICogMworICAgICAgICAgICAgZnJvbV9wYXJhbSA9IGNsYXNzbWV0aG9kKGZyb21fcGFyYW0pCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoQ1dDSEFSUC5mcm9tX3BhcmFtKCJhYmMiKSwgImFiY2FiY2FiYyIpCisKKyAgICAjIFhYWCBSZXBsYWNlIGJ5IGNfY2hhcl9wIHRlc3RzCisgICAgZGVmIHRlc3RfY3N0cmluZ3Moc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX2NoYXJfcCwgYnlyZWYKKworICAgICAgICAjIGNfY2hhcl9wLmZyb21fcGFyYW0gb24gYSBQeXRob24gU3RyaW5nIHBhY2tzIHRoZSBzdHJpbmcKKyAgICAgICAgIyBpbnRvIGEgY3BhcmFtIG9iamVjdAorICAgICAgICBzID0gIjEyMyIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfY2hhcl9wLmZyb21fcGFyYW0ocykuX29iaiBpcyBzKQorCisgICAgICAgICMgbmV3IGluIDAuOS4xOiBjb252ZXJ0IChlbmNvZGUpIHVuaWNvZGUgdG8gYXNjaWkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY19jaGFyX3AuZnJvbV9wYXJhbSh1IjEyMyIpLl9vYmosICIxMjMiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsIGNfY2hhcl9wLmZyb21fcGFyYW0sIHUiMTIzXDM3NyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX2NoYXJfcC5mcm9tX3BhcmFtLCA0MikKKworICAgICAgICAjIGNhbGxpbmcgY19jaGFyX3AuZnJvbV9wYXJhbSB3aXRoIGEgY19jaGFyX3AgaW5zdGFuY2UKKyAgICAgICAgIyByZXR1cm5zIHRoZSBhcmd1bWVudCBpdHNlbGY6CisgICAgICAgIGEgPSBjX2NoYXJfcCgiMTIzIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfY2hhcl9wLmZyb21fcGFyYW0oYSkgaXMgYSkKKworICAgIGRlZiB0ZXN0X2N3X3N0cmluZ3Moc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBieXJlZgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY193Y2hhcl9wCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyMjICAgICAgICAgICAgcHJpbnQgIihObyBjX3djaGFyX3ApIgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHMgPSB1IjEyMyIKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY193Y2hhcl9wLmZyb21fcGFyYW0ocykuX29iaiBpcyBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX3djaGFyX3AuZnJvbV9wYXJhbSwgNDIpCisKKyAgICAgICAgICAgICMgbmV3IGluIDAuOS4xOiBjb252ZXJ0IChkZWNvZGUpIGFzY2lpIHRvIHVuaWNvZGUKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNfd2NoYXJfcC5mcm9tX3BhcmFtKCIxMjMiKS5fb2JqLCB1IjEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgY193Y2hhcl9wLmZyb21fcGFyYW0sICIxMjNcMzc3IikKKworICAgICAgICBwYSA9IGNfd2NoYXJfcC5mcm9tX3BhcmFtKGNfd2NoYXJfcCh1IjEyMyIpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHBhKSwgY193Y2hhcl9wKQorCisgICAgZGVmIHRlc3RfaW50X3BvaW50ZXJzKHNlbGYpOgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19zaG9ydCwgY191aW50LCBjX2ludCwgY19sb25nLCBQT0lOVEVSLCBwb2ludGVyCisgICAgICAgIExQSU5UID0gUE9JTlRFUihjX2ludCkKKworIyMgICAgICAgIHAgPSBwb2ludGVyKGNfaW50KDQyKSkKKyMjICAgICAgICB4ID0gTFBJTlQuZnJvbV9wYXJhbShwKQorICAgICAgICB4ID0gTFBJTlQuZnJvbV9wYXJhbShwb2ludGVyKGNfaW50KDQyKSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHguY29udGVudHMudmFsdWUsIDQyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChMUElOVChjX2ludCg0MikpLmNvbnRlbnRzLnZhbHVlLCA0MikKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChMUElOVC5mcm9tX3BhcmFtKE5vbmUpLCAwKQorCisgICAgICAgIGlmIGNfaW50ICE9IGNfbG9uZzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBJTlQuZnJvbV9wYXJhbSwgcG9pbnRlcihjX2xvbmcoNDIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBMUElOVC5mcm9tX3BhcmFtLCBwb2ludGVyKGNfdWludCg0MikpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQSU5ULmZyb21fcGFyYW0sIHBvaW50ZXIoY19zaG9ydCg0MikpKQorCisgICAgZGVmIHRlc3RfYnlyZWZfcG9pbnRlcihzZWxmKToKKyAgICAgICAgIyBUaGUgZnJvbV9wYXJhbSBjbGFzcyBtZXRob2Qgb2YgUE9JTlRFUih0eXApIGNsYXNzZXMgYWNjZXB0cyB3aGF0IGlzCisgICAgICAgICMgcmV0dXJuZWQgYnkgYnlyZWYob2JqKSwgaXQgdHlwZShvYmopID09IHR5cAorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19zaG9ydCwgY191aW50LCBjX2ludCwgY19sb25nLCBwb2ludGVyLCBQT0lOVEVSLCBieXJlZgorICAgICAgICBMUElOVCA9IFBPSU5URVIoY19pbnQpCisKKyAgICAgICAgTFBJTlQuZnJvbV9wYXJhbShieXJlZihjX2ludCg0MikpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBJTlQuZnJvbV9wYXJhbSwgYnlyZWYoY19zaG9ydCgyMikpKQorICAgICAgICBpZiBjX2ludCAhPSBjX2xvbmc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQSU5ULmZyb21fcGFyYW0sIGJ5cmVmKGNfbG9uZygyMikpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQSU5ULmZyb21fcGFyYW0sIGJ5cmVmKGNfdWludCgyMikpKQorCisgICAgZGVmIHRlc3RfYnlyZWZfcG9pbnRlcnBvaW50ZXIoc2VsZik6CisgICAgICAgICMgU2VlIGFib3ZlCisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX3Nob3J0LCBjX3VpbnQsIGNfaW50LCBjX2xvbmcsIHBvaW50ZXIsIFBPSU5URVIsIGJ5cmVmCisKKyAgICAgICAgTFBMUElOVCA9IFBPSU5URVIoUE9JTlRFUihjX2ludCkpCisgICAgICAgIExQTFBJTlQuZnJvbV9wYXJhbShieXJlZihwb2ludGVyKGNfaW50KDQyKSkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBMUElOVC5mcm9tX3BhcmFtLCBieXJlZihwb2ludGVyKGNfc2hvcnQoMjIpKSkpCisgICAgICAgIGlmIGNfaW50ICE9IGNfbG9uZzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBMUElOVC5mcm9tX3BhcmFtLCBieXJlZihwb2ludGVyKGNfbG9uZygyMikpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBMUExQSU5ULmZyb21fcGFyYW0sIGJ5cmVmKHBvaW50ZXIoY191aW50KDIyKSkpKQorCisgICAgZGVmIHRlc3RfYXJyYXlfcG9pbnRlcnMoc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX3Nob3J0LCBjX3VpbnQsIGNfaW50LCBjX2xvbmcsIFBPSU5URVIKKyAgICAgICAgSU5UQVJSQVkgPSBjX2ludCAqIDMKKyAgICAgICAgaWEgPSBJTlRBUlJBWSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihpYSksIDMpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFtpYVtpXSBmb3IgaSBpbiByYW5nZSgzKV0sIFswLCAwLCAwXSkKKworICAgICAgICAjIFBvaW50ZXJzIGFyZSBvbmx5IGNvbXBhdGlibGUgd2l0aCBhcnJheXMgY29udGFpbmluZyBpdGVtcyBvZgorICAgICAgICAjIHRoZSBzYW1lIHR5cGUhCisgICAgICAgIExQSU5UID0gUE9JTlRFUihjX2ludCkKKyAgICAgICAgTFBJTlQuZnJvbV9wYXJhbSgoY19pbnQqMykoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBMUElOVC5mcm9tX3BhcmFtLCBjX3Nob3J0KjMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBJTlQuZnJvbV9wYXJhbSwgY19sb25nKjMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBJTlQuZnJvbV9wYXJhbSwgY191aW50KjMpCisKKyMjICAgIGRlZiB0ZXN0X3BlcmZvcm1hbmNlKHNlbGYpOgorIyMgICAgICAgIGNoZWNrX3BlcmYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMTdlZGEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weQpAQCAtMCwwICsxLDE3MSBAQAoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgX2N0eXBlc190ZXN0CisKK2N0eXBlX3R5cGVzID0gW2NfYnl0ZSwgY191Ynl0ZSwgY19zaG9ydCwgY191c2hvcnQsIGNfaW50LCBjX3VpbnQsCisgICAgICAgICAgICAgICAgIGNfbG9uZywgY191bG9uZywgY19sb25nbG9uZywgY191bG9uZ2xvbmcsIGNfZG91YmxlLCBjX2Zsb2F0XQorcHl0aG9uX3R5cGVzID0gW2ludCwgaW50LCBpbnQsIGludCwgaW50LCBsb25nLAorICAgICAgICAgICAgICAgIGludCwgbG9uZywgbG9uZywgbG9uZywgZmxvYXQsIGZsb2F0XQorCitjbGFzcyBQb2ludGVyc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3BvaW50ZXJfY3Jhc2goc2VsZik6CisgICAgICAgIAorICAgICAgICBjbGFzcyBBKFBPSU5URVIoY191bG9uZykpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIFBPSU5URVIoY191bG9uZykoY191bG9uZygyMikpCisgICAgICAgICMgUG9pbnRlciBjYW4ndCBzZXQgY29udGVudHM6IGhhcyBubyBfdHlwZV8KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgQSwgY191bG9uZygzMykpCisKKyAgICBkZWYgdGVzdF9wYXNzX3BvaW50ZXJzKHNlbGYpOgorICAgICAgICBkbGwgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBmdW5jID0gZGxsLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgZnVuYy5yZXN0eXBlID0gY19sb25nCisKKyAgICAgICAgaSA9IGNfaW50KDEyMzQ1Njc4KQorIyMgICAgICAgIGZ1bmMuYXJndHlwZXMgPSAoUE9JTlRFUihjX2ludCksKQorICAgICAgICBhZGRyZXNzID0gZnVuYyhieXJlZihpKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY19pbnQuZnJvbV9hZGRyZXNzKGFkZHJlc3MpLnZhbHVlLCAxMjM0NTY3OCkKKworICAgICAgICBmdW5jLnJlc3R5cGUgPSBQT0lOVEVSKGNfaW50KQorICAgICAgICByZXMgPSBmdW5jKHBvaW50ZXIoaSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcy5jb250ZW50cy52YWx1ZSwgMTIzNDU2NzgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1swXSwgMTIzNDU2NzgpCisKKyAgICBkZWYgdGVzdF9jaGFuZ2VfcG9pbnRlcnMoc2VsZik6CisgICAgICAgIGRsbCA9IGNkbGwubG9hZChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIGZ1bmMgPSBkbGwuX3Rlc3RmdW5jX3BfcAorCisgICAgICAgIGkgPSBjX2ludCg4NzY1NCkKKyAgICAgICAgZnVuYy5yZXN0eXBlID0gUE9JTlRFUihjX2ludCkKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IChQT0lOVEVSKGNfaW50KSwpCisKKyAgICAgICAgcmVzID0gZnVuYyhwb2ludGVyKGkpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbMF0sIDg3NjU0KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMuY29udGVudHMudmFsdWUsIDg3NjU0KQorCisgICAgICAgICMgQyBjb2RlOiAqcmVzID0gNTQzNDUKKyAgICAgICAgcmVzWzBdID0gNTQzNDUKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaS52YWx1ZSwgNTQzNDUpCisKKyAgICAgICAgIyBDIGNvZGU6CisgICAgICAgICMgICBpbnQgeCA9IDEyMzIxOworICAgICAgICAjICAgcmVzID0gJngKKyAgICAgICAgcmVzLmNvbnRlbnRzID0gY19pbnQoMTIzMjEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGkudmFsdWUsIDU0MzQ1KQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tzX3dpdGhfcG9pbnRlcnMoc2VsZik6CisgICAgICAgICMgYSBmdW5jdGlvbiB0eXBlIHJlY2VpdmluZyBhIHBvaW50ZXIKKyAgICAgICAgUFJPVE9UWVBFID0gQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKGNfaW50KSkKKworICAgICAgICBzZWxmLnJlc3VsdCA9IFtdCisKKyAgICAgICAgZGVmIGZ1bmMoYXJnKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyMjICAgICAgICAgICAgICAgIHByaW50IGFyZ1tpXSwKKyAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdC5hcHBlbmQoYXJnW2ldKQorIyMgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgY2FsbGJhY2sgPSBQUk9UT1RZUEUoZnVuYykKKworICAgICAgICBkbGwgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICAjIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyBhIGZ1bmN0aW9uIHBvaW50ZXIsCisgICAgICAgICMgYW5kIGNhbGxzIHRoaXMgd2l0aCBhbiBpbnRlZ2VyIHBvaW50ZXIgYXMgcGFyYW1ldGVyLgorICAgICAgICAjIFRoZSBpbnQgcG9pbnRlciBwb2ludHMgdG8gYSB0YWJsZSBjb250YWluaW5nIHRoZSBudW1iZXJzIDEuLjEwCisgICAgICAgIGRvaXQgPSBkbGwuX3Rlc3RmdW5jX2NhbGxiYWNrX3dpdGhfcG9pbnRlcgorCisjIyAgICAgICAgaSA9IGNfaW50KDQyKQorIyMgICAgICAgIGNhbGxiYWNrKGJ5cmVmKGkpKQorIyMgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpLnZhbHVlID09IDg0KQorCisgICAgICAgIGRvaXQoY2FsbGJhY2spCisjIyAgICAgICAgcHJpbnQgc2VsZi5yZXN1bHQKKyAgICAgICAgZG9pdChjYWxsYmFjaykKKyMjICAgICAgICBwcmludCBzZWxmLnJlc3VsdAorICAgICAgICAKKyAgICBkZWYgdGVzdF9iYXNpY3Moc2VsZik6CisgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IGRlbGl0ZW0KKyAgICAgICAgZm9yIGN0LCBwdCBpbiB6aXAoY3R5cGVfdHlwZXMsIHB5dGhvbl90eXBlcyk6CisgICAgICAgICAgICBpID0gY3QoNDIpCisgICAgICAgICAgICBwID0gcG9pbnRlcihpKQorIyMgICAgICAgICAgICBwcmludCB0eXBlKHAuY29udGVudHMpLCBjdAorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUocC5jb250ZW50cykgaXMgY3QpCisgICAgICAgICAgICAjIHAuY29udGVudHMgaXMgdGhlIHNhbWUgYXMgcFswXQorIyMgICAgICAgICAgICBwcmludCBwLmNvbnRlbnRzCisjIyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhwLmNvbnRlbnRzID09IDQyKQorIyMgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MocFswXSA9PSA0MikKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkZWxpdGVtLCBwLCAwKQorCisgICAgZGVmIHRlc3RfZnJvbV9hZGRyZXNzKHNlbGYpOgorICAgICAgICBmcm9tIGFycmF5IGltcG9ydCBhcnJheQorICAgICAgICBhID0gYXJyYXkoJ2knLCBbMTAwLCAyMDAsIDMwMCwgNDAwLCA1MDBdKQorICAgICAgICBhZGRyID0gYS5idWZmZXJfaW5mbygpWzBdCisKKyAgICAgICAgcCA9IFBPSU5URVIoUE9JTlRFUihjX2ludCkpCisjIyAgICAgICAgcHJpbnQgZGlyKHApCisjIyAgICAgICAgcHJpbnQgcC5mcm9tX2FkZHJlc3MKKyMjICAgICAgICBwcmludCBwLmZyb21fYWRkcmVzcyhhZGRyKVswXVswXQorCisgICAgZGVmIHRlc3Rfb3RoZXIoc2VsZik6CisgICAgICAgIGNsYXNzIFRhYmxlKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX2ludCldCisKKyAgICAgICAgcHQgPSBwb2ludGVyKFRhYmxlKDEsIDIsIDMpKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHB0LmNvbnRlbnRzLmEsIDEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHB0LmNvbnRlbnRzLmIsIDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHB0LmNvbnRlbnRzLmMsIDMpCisKKyAgICAgICAgcHQuY29udGVudHMuYyA9IDMzCisKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IF9wb2ludGVyX3R5cGVfY2FjaGUKKyAgICAgICAgZGVsIF9wb2ludGVyX3R5cGVfY2FjaGVbVGFibGVdCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgcCA9IHBvaW50ZXIoY19pbnQoNDIpKQorICAgICAgICAjIEFsdGhvdWdoIGEgcG9pbnRlciBjYW4gYmUgaW5kZXhlZCwgaXQgaGEgbm8gbGVuZ3RoCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGVuLCBwKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzBdLCA0MikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocC5jb250ZW50cy52YWx1ZSwgNDIpCisgICAgICAgIAorICAgIGRlZiB0ZXN0X2luY29tcGxldGUoc2VsZik6CisgICAgICAgIGxwY2VsbCA9IFBPSU5URVIoImNlbGwiKQorICAgICAgICBjbGFzcyBjZWxsKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoInZhbHVlIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJuZXh0IiwgbHBjZWxsKV0KKyAgICAgICAgU2V0UG9pbnRlclR5cGUobHBjZWxsLCBjZWxsKQorCisgICAgICAgICMgTWFrZSBhIHN0cnVjdHVyZSBjb250YWluaW5nIGEgcG9pbnRlciB0byBpdHNlbGY6CisgICAgICAgIGMgPSBjZWxsKCkKKyAgICAgICAgYy52YWx1ZSA9IDQyCisgICAgICAgIGMubmV4dCA9IHBvaW50ZXIoYykKKworICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSg4KToKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYy52YWx1ZSkKKyAgICAgICAgICAgIGMgPSBjLm5leHRbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCBbNDJdICogOCkKKworICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgX3BvaW50ZXJfdHlwZV9jYWNoZQorICAgICAgICBkZWwgX3BvaW50ZXJfdHlwZV9jYWNoZVtjZWxsXQorCisgICAgZGVmIHRlc3RfY2hhcnBwKCBzZWxmICk6CisgICAgICAgICIiIlRlc3QgdGhhdCBhIGNoYXJhY3RlciBwb2ludGVyLXRvLXBvaW50ZXIgaXMgY29ycmVjdGx5IHBhc3NlZCIiIgorICAgICAgICBkbGwgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBmdW5jID0gZGxsLl90ZXN0ZnVuY19jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX2NoYXJfcAorICAgICAgICBhcmd2ID0gKGNfY2hhcl9wICogMikoKQorICAgICAgICBhcmdjID0gY19pbnQoIDIgKQorICAgICAgICBhcmd2WzBdID0gJ2hlbGxvJworICAgICAgICBhcmd2WzFdID0gJ3dvcmxkJworICAgICAgICByZXN1bHQgPSBmdW5jKCBieXJlZihhcmdjKSwgYXJndiApCisgICAgICAgIGFzc2VydCByZXN1bHQgPT0gJ3dvcmxkJywgcmVzdWx0CisKKyAgICAKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb3NpeC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Bvc2l4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExM2VjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb3NpeC5weQpAQCAtMCwwICsxLDM4IEBACitpbXBvcnQgdW5pdHRlc3QsIG9zLCBzeXMKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK2lmIG9zLm5hbWUgPT0gInBvc2l4IiBhbmQgc3lzLnBsYXRmb3JtID09ICJsaW51eDIiOgorICAgICMgSSBkb24ndCByZWFsbHkga25vdyBvbiB3aGljaCBwbGF0Zm9ybXMgdGhpcyB3b3JrcywKKyAgICAjIGxhdGVyIGl0IHNob3VsZCB1c2UgdGhlIGZpbmRfbGlicmFyeSBzdHVmZiB0byBhdm9pZAorICAgICMgaGFyZGNvZGluZyB0aGUgbmFtZXMuCisKKyAgICBjbGFzcyBUZXN0UlRMRF9HTE9CQUwodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBkZWYgdGVzdF9HTChzZWxmKToKKyAgICAgICAgICAgIGNkbGwubG9hZCgnbGliR0wuc28nLCBtb2RlPVJUTERfR0xPQkFMKQorICAgICAgICAgICAgY2RsbC5sb2FkKCdsaWJHTFUuc28nKQorICAgICAgICAgICAgCisjI2lmIG9zLm5hbWUgPT0gInBvc2l4IiBhbmQgc3lzLnBsYXRmb3JtICE9ICJkYXJ3aW4iOgorCisjIyAgICAjIE9uIHBsYXRmb3JtcyB3aGVyZSB0aGUgZGVmYXVsdCBzaGFyZWQgbGlicmFyeSBzdWZmaXggaXMgJy5zbycsCisjIyAgICAjIGF0IGxlYXN0IHNvbWUgbGlicmFyaWVzIGNhbiBiZSBsb2FkZWQgYXMgYXR0cmlidXRlcyBvZiB0aGUgY2RsbAorIyMgICAgIyBvYmplY3QsIHNpbmNlIGN0eXBlcyBub3cgdHJpZXMgbG9hZGluZyB0aGUgbGliIGFnYWluCisjIyAgICAjIHdpdGggJy5zbycgYXBwZW5kZWQgb2YgdGhlIGZpcnN0IHRyeSBmYWlscy4KKyMjICAgICMKKyMjICAgICMgV29uJ3Qgd29yayBmb3IgbGliYywgdW5mb3J0dW5hdGVseS4gIE9UT0gsIGl0IGlzbid0CisjIyAgICAjIG5lZWRlZCBmb3IgbGliYyBzaW5jZSB0aGlzIGlzIGFscmVhZHkgbWFwcGVkIGludG8gdGhlIGN1cnJlbnQKKyMjICAgICMgcHJvY2VzcyAoPykKKyMjICAgICMKKyMjICAgICMgT24gTUFDIE9TWCwgaXQgd29uJ3Qgd29yayBlaXRoZXIsIGJlY2F1c2UgZGxvcGVuKCkgbmVlZHMgYSBmdWxsIHBhdGgsCisjIyAgICAjIGFuZCB0aGUgZGVmYXVsdCBzdWZmaXggaXMgZWl0aGVyIG5vbmUgb3IgJy5keWxpYicuCisKKyMjICAgIGNsYXNzIExvYWRMaWJzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyMjICAgICAgICBkZWYgdGVzdF9saWJtKHNlbGYpOgorIyMgICAgICAgICAgICBpbXBvcnQgbWF0aAorIyMgICAgICAgICAgICBsaWJtID0gY2RsbC5saWJtCisjIyAgICAgICAgICAgIHNxcnQgPSBsaWJtLnNxcnQKKyMjICAgICAgICAgICAgc3FydC5hcmd0eXBlcyA9IChjX2RvdWJsZSwpCisjIyAgICAgICAgICAgIHNxcnQucmVzdHlwZSA9IGNfZG91YmxlCisjIyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNxcnQoMiksIG1hdGguc3FydCgyKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYjExM2IKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5CkBAIC0wLDAgKzEsMTg0IEBACitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IHVuaXR0ZXN0CisKKyMgSU1QT1JUQU5UIElORk86CisjCisjIENvbnNpZGVyIHRoaXMgY2FsbDoKKyMgICAgZnVuYy5yZXN0eXBlID0gY19jaGFyX3AKKyMgICAgZnVuYyhjX2NoYXJfcCgiMTIzIikpCisjIEl0IHJldHVybnMKKyMgICAgIjEyMyIKKyMKKyMgV0hZIElTIFRISVMgU08/CisjCisjIGFyZ3VtZW50IHR1cGxlIChjX2NoYXJfcCgiMTIzIiksICkgaXMgZGVzdHJveWVkIGFmdGVyIHRoZSBmdW5jdGlvbgorIyBmdW5jIGlzIGNhbGxlZCwgYnV0IE5PVCBiZWZvcmUgdGhlIHJlc3VsdCBpcyBhY3R1YWxseSBidWlsdC4KKyMKKyMgSWYgdGhlIGFyZ2xpc3Qgd291bGQgYmUgZGVzdHJveWVkIEJFRk9SRSB0aGUgcmVzdWx0IGhhcyBiZWVuIGJ1aWx0LAorIyB0aGUgY19jaGFyX3AoIjEyMyIpIG9iamVjdCB3b3VsZCBhbHJlYWR5IGhhdmUgYSB6ZXJvIHJlZmNvdW50LAorIyBhbmQgdGhlIHBvaW50ZXIgcGFzc2VkIHRvIChhbmQgcmV0dXJuZWQgYnkpIHRoZSBmdW5jdGlvbiB3b3VsZAorIyBwcm9iYWJseSBwb2ludCB0byBkZWFsbG9jYXRlZCBzcGFjZS4KKyMKKyMgSW4gdGhpcyBjYXNlLCB0aGVyZSB3b3VsZCBoYXZlIHRvIGJlIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBhcmd1bWVudC4uLgorCitpbXBvcnQgX2N0eXBlc190ZXN0Cit0ZXN0ZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKworZGVmIGNfd2J1ZmZlcihpbml0KToKKyAgICBuID0gbGVuKGluaXQpICsgMQorICAgIHJldHVybiAoY193Y2hhciAqIG4pKCppbml0KQorCitjbGFzcyBDaGFyUG9pbnRlcnNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgZnVuYy5yZXN0eXBlID0gY19sb25nCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBOb25lCisKKyAgICBkZWYgdGVzdF9pbnRfcG9pbnRlcl9hcmcoc2VsZik6CisgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgZnVuYy5yZXN0eXBlID0gY19sb25nCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIGZ1bmMoMCkpCisKKyAgICAgICAgY2kgPSBjX2ludCgwKQorCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBQT0lOVEVSKGNfaW50KSwKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYWRkcmVzc29mKGNpKSwgZnVuYyhieXJlZihjaSkpKQorICAgICAgICAKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfY2hhcl9wLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBmdW5jLCBieXJlZihjaSkpCisKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IFBPSU5URVIoY19zaG9ydCksCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50RXJyb3IsIGZ1bmMsIGJ5cmVmKGNpKSkKKworICAgICAgICBmdW5jLmFyZ3R5cGVzID0gUE9JTlRFUihjX2RvdWJsZSksCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50RXJyb3IsIGZ1bmMsIGJ5cmVmKGNpKSkKKworICAgIGRlZiB0ZXN0X1BPSU5URVJfY19jaGFyX2FyZyhzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX2NoYXJfcAorICAgICAgICBmdW5jLmFyZ3R5cGVzID0gUE9JTlRFUihjX2NoYXIpLAorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoTm9uZSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIxMjMiLCBmdW5jKCIxMjMiKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZnVuYyhjX2NoYXJfcChOb25lKSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIxMjMiLCBmdW5jKGNfY2hhcl9wKCIxMjMiKSkpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmMoY19idWZmZXIoIjEyMyIpKSkKKyAgICAgICAgY2EgPSBjX2NoYXIoImEiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYSIsIGZ1bmMocG9pbnRlcihjYSkpWzBdKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKKworICAgIGRlZiB0ZXN0X2NfY2hhcl9wX2FyZyhzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX2NoYXJfcAorICAgICAgICBmdW5jLmFyZ3R5cGVzID0gY19jaGFyX3AsCisgICAgICAgIAorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChOb25lLCBmdW5jKE5vbmUpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiMTIzIiwgZnVuYygiMTIzIikpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoY19jaGFyX3AoTm9uZSkpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiMTIzIiwgZnVuYyhjX2NoYXJfcCgiMTIzIikpKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIxMjMiLCBmdW5jKGNfYnVmZmVyKCIxMjMiKSkpCisgICAgICAgIGNhID0gY19jaGFyKCJhIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImEiLCBmdW5jKGJ5cmVmKGNhKSlbMF0pCisKKyAgICBkZWYgdGVzdF9jX3ZvaWRfcF9hcmcoc2VsZik6CisgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgZnVuYy5yZXN0eXBlID0gY19jaGFyX3AKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfdm9pZF9wLAorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoTm9uZSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIxMjMiLCBmdW5jKCIxMjMiKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmMoY19jaGFyX3AoIjEyMyIpKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZnVuYyhjX2NoYXJfcChOb25lKSkpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmMoY19idWZmZXIoIjEyMyIpKSkKKyAgICAgICAgY2EgPSBjX2NoYXIoImEiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYSIsIGZ1bmMocG9pbnRlcihjYSkpWzBdKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKKworICAgICAgICBmdW5jKGJ5cmVmKGNfaW50KCkpKQorICAgICAgICBmdW5jKHBvaW50ZXIoY19pbnQoKSkpCisgICAgICAgIGZ1bmMoKGNfaW50ICogMykoKSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX3djaGFyX3AKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHUiMTIzIiwgZnVuYyhjX3djaGFyX3AodSIxMjMiKSkpCisKKyMjICAgIGRlZiB0ZXN0X2luc3RhbmNlKHNlbGYpOgorIyMgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19wX3AKKworIyMgICAgICAgIGNsYXNzIFg6CisjIyAgICAgICAgICAgIF9hc19wYXJhbWV0ZXJfID0gMAorCisjIyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMCwgZnVuYyhYKCkpKQorCit0cnk6CisgICAgY193Y2hhcgorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGNsYXNzIFdDaGFyUG9pbnRlcnNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICAgICAgZnVuYy5yZXN0eXBlID0gY19pbnQKKyAgICAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBOb25lCisKKworICAgICAgICBkZWYgdGVzdF9QT0lOVEVSX2Nfd2NoYXJfYXJnKHNlbGYpOgorICAgICAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICAgICAgZnVuYy5yZXN0eXBlID0gY193Y2hhcl9wCisgICAgICAgICAgICBmdW5jLmFyZ3R5cGVzID0gUE9JTlRFUihjX3djaGFyKSwKKworICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHUiMTIzIiwgZnVuYyh1IjEyMyIpKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZnVuYyhjX3djaGFyX3AoTm9uZSkpKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodSIxMjMiLCBmdW5jKGNfd2NoYXJfcCh1IjEyMyIpKSkKKworICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodSIxMjMiLCBmdW5jKGNfd2J1ZmZlcih1IjEyMyIpKSkKKyAgICAgICAgICAgIGNhID0gY193Y2hhcigiYSIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh1ImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHUiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKKworICAgICAgICBkZWYgdGVzdF9jX3djaGFyX3BfYXJnKHNlbGYpOgorICAgICAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICAgICAgZnVuYy5yZXN0eXBlID0gY193Y2hhcl9wCisgICAgICAgICAgICBmdW5jLmFyZ3R5cGVzID0gY193Y2hhcl9wLAorCisgICAgICAgICAgICBjX3djaGFyX3AuZnJvbV9wYXJhbSh1IjEyMyIpCisKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoTm9uZSkpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiMTIzIiwgZnVuYyh1IjEyMyIpKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZnVuYyhjX3djaGFyX3AoTm9uZSkpKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmMoY193Y2hhcl9wKCIxMjMiKSkpCisKKyAgICAgICAgICAgICMgWFhYIEN1cnJlbnRseSwgdGhlc2UgcmFpc2UgVHlwZUVycm9ycywgYWx0aG91Z2ggdGhleSBzaG91bGRuJ3Q6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiMTIzIiwgZnVuYyhjX3didWZmZXIoIjEyMyIpKSkKKyAgICAgICAgICAgIGNhID0gY193Y2hhcigiYSIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYSIsIGZ1bmMocG9pbnRlcihjYSkpWzBdKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImEiLCBmdW5jKGJ5cmVmKGNhKSlbMF0pCisKK2NsYXNzIEFycmF5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19haTgKKyAgICAgICAgZnVuYy5yZXN0eXBlID0gUE9JTlRFUihjX2ludCkKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfaW50ICogOCwKKworICAgICAgICBmdW5jKChjX2ludCAqIDgpKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgpKQorCisgICAgICAgICMgVGhpcyBkaWQgY3Jhc2ggYmVmb3JlOgorCisgICAgICAgIGRlZiBmdW5jKCk6IHBhc3MKKyAgICAgICAgQ0ZVTkNUWVBFKE5vbmUsIGNfaW50ICogMykoZnVuYykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHl0aG9uX2FwaS5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3B5dGhvbl9hcGkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5YjcyMQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3B5dGhvbl9hcGkucHkKQEAgLTAsMCArMSw3NyBAQAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCB1bml0dGVzdCwgc3lzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhpcyBzZWN0aW9uIHNob3VsZCBiZSBtb3ZlZCBpbnRvIGN0eXBlc1xfX2luaXRfXy5weSwgd2hlbiBpdCdzIHJlYWR5LgorCitmcm9tIF9jdHlwZXMgaW1wb3J0IFB5T2JqX0Zyb21QdHIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitmcm9tIHN5cyBpbXBvcnQgZ2V0cmVmY291bnQgYXMgZ3JjCisKKworY2xhc3MgUHl0aG9uQVBJVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZik6CisgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplID0gcHl0aG9uYXBpLlB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplCisKKyAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUucmVzdHlwZSA9IHB5X29iamVjdAorICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZS5hcmd0eXBlcyA9IGNfY2hhcl9wLCBjX2ludAorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCJhYmNkZWZnaGkiLCAzKSwgImFiYyIpCisKKyAgICBkZWYgdGVzdF9QeVN0cmluZ19Gcm9tU3RyaW5nKHNlbGYpOgorICAgICAgICBweXRob25hcGkuUHlTdHJpbmdfRnJvbVN0cmluZy5yZXN0eXBlID0gcHlfb2JqZWN0CisgICAgICAgIHB5dGhvbmFwaS5QeVN0cmluZ19Gcm9tU3RyaW5nLmFyZ3R5cGVzID0gKGNfY2hhcl9wLCkKKworICAgICAgICBzID0gImFiYyIKKyAgICAgICAgcmVmY250ID0gZ3JjKHMpCisgICAgICAgIHB5b2IgPSBweXRob25hcGkuUHlTdHJpbmdfRnJvbVN0cmluZyhzKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChncmMocyksIHJlZmNudCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocywgcHlvYikKKyAgICAgICAgZGVsIHB5b2IKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKHMpLCByZWZjbnQpCisKKyAgICBkZWYgdGVzdF9QeUludF9Mb25nKHNlbGYpOgorICAgICAgICByZWY0MiA9IGdyYyg0MikKKyAgICAgICAgcHl0aG9uYXBpLlB5SW50X0Zyb21Mb25nLnJlc3R5cGUgPSBweV9vYmplY3QKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocHl0aG9uYXBpLlB5SW50X0Zyb21Mb25nKDQyKSwgNDIpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKDQyKSwgcmVmNDIpCisKKyAgICAgICAgcHl0aG9uYXBpLlB5SW50X0FzTG9uZy5hcmd0eXBlcyA9IChweV9vYmplY3QsKQorICAgICAgICBweXRob25hcGkuUHlJbnRfQXNMb25nLnJlc3R5cGUgPSBjX2xvbmcKKworICAgICAgICByZXMgPSBweXRob25hcGkuUHlJbnRfQXNMb25nKDQyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChncmMocmVzKSwgcmVmNDIgKyAxKQorICAgICAgICBkZWwgcmVzCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyg0MiksIHJlZjQyKQorCisgICAgZGVmIHRlc3RfUHlPYmpfRnJvbVB0cihzZWxmKToKKyAgICAgICAgcyA9ICJhYmMgZGVmIGdoaSBqa2wiCisgICAgICAgIHJlZiA9IGdyYyhzKQorICAgICAgICAjIGlkKHB5dGhvbi1vYmplY3QpIGlzIHRoZSBhZGRyZXNzCisgICAgICAgIHB5b2JqID0gUHlPYmpfRnJvbVB0cihpZChzKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMgaXMgcHlvYmopCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKHMpLCByZWYgKyAxKQorICAgICAgICBkZWwgcHlvYmoKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKHMpLCByZWYpCisKKyAgICBkZWYgdGVzdF9QeU9TX3NucHJpbnRmKHNlbGYpOgorICAgICAgICBQeU9TX3NucHJpbnRmID0gcHl0aG9uYXBpLlB5T1Nfc25wcmludGYKKyAgICAgICAgUHlPU19zbnByaW50Zi5hcmd0eXBlcyA9IFBPSU5URVIoY19jaGFyKSwgY19pbnQsIGNfY2hhcl9wCisKKyAgICAgICAgYnVmID0gY19idWZmZXIoMjU2KQorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJIZWxsbyBmcm9tICVzIiwgImN0eXBlcyIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgIkhlbGxvIGZyb20gY3R5cGVzIikKKworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJIZWxsbyBmcm9tICVzIiwgImN0eXBlcyIsIDEsIDIsIDMpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgIkhlbGxvIGZyb20gY3R5cGVzIikKKworICAgICAgICAjIG5vdCBlbm91Z2ggYXJndW1lbnRzCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIFB5T1Nfc25wcmludGYsIGJ1ZikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JhbmRvbV90aGluZ3MucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTBjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5CkBAIC0wLDAgKzEsNzMgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QsIHN5cworCitkZWYgY2FsbGJhY2tfZnVuYyhhcmcpOgorICAgIDQyIC8gYXJnCisgICAgcmFpc2UgVmFsdWVFcnJvciwgYXJnCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgorCisgICAgY2xhc3MgY2FsbF9mdW5jdGlvbl9UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICMgX2N0eXBlcy5jYWxsX2Z1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIHByaXZhdGUsIGJ1dCB1c2VkIGJ5CisgICAgICAgICMgR2FyeSBCaXNocCdzIHJlYWRsaW5lIG1vZHVsZS4gIElmIHdlIGhhdmUgaXQsIHdlIG11c3QgdGVzdCBpdCBhcyB3ZWxsLgorCisgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBjYWxsX2Z1bmN0aW9uCisgICAgICAgICAgICBoZGxsID0gd2luZGxsLmtlcm5lbDMyLkxvYWRMaWJyYXJ5QSgia2VybmVsMzIiKQorICAgICAgICAgICAgZnVuY2FkZHIgPSB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MoaGRsbCwgIkdldE1vZHVsZUhhbmRsZUEiKQorCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjYWxsX2Z1bmN0aW9uKGZ1bmNhZGRyLCAoTm9uZSwpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBKE5vbmUpKQorCitjbGFzcyBDYWxsYmFja1RyYWNiYWNrVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgV2hlbiBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGluIGEgY3R5cGVzIGNhbGxiYWNrIGZ1bmN0aW9uLCB0aGUgQworICAgICMgY29kZSBwcmludHMgYSB0cmFjZWJhY2suCisgICAgIworICAgICMgVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhlIGV4Y2VwdGlvbiB0eXBlcyAqYW5kKiB0aGUgZXhjZXB0aW9uCisgICAgIyB2YWx1ZSBpcyBwcmludGVkIGNvcnJlY3RseS4KKyAgICAjCisgICAgIyBDaGFuZ2VkIGluIDAuOS4zOiBObyBsb25nZXIgaXMgJyhpbiBjYWxsYmFjayknIHByZXBlbmRlZCB0byB0aGUKKyAgICAjIGVycm9yIG1lc3NhZ2UgLSBpbnN0ZWFkIGEgYWRkaXRpb25hbCBmcmFtZSBmb3IgdGhlIEMgY29kZSBpcworICAgICMgY3JlYXRlZCwgdGhlbiBhIGZ1bGwgdHJhY2ViYWNrIHByaW50ZWQuICBXaGVuIFN5c3RlbUV4aXQgaXMKKyAgICAjIHJhaXNlZCBpbiBhIGNhbGxiYWNrIGZ1bmN0aW9uLCB0aGUgaW50ZXJwcmV0ZXIgZXhpdHMuCisKKyAgICBkZWYgY2FwdHVyZV9zdGRlcnIoc2VsZiwgZnVuYywgKmFyZ3MsICoqa3cpOgorICAgICAgICAjIGhlbHBlciAtIGNhbGwgZnVuY3Rpb24gJ2Z1bmMnLCBhbmQgcmV0dXJuIHRoZSBjYXB0dXJlZCBzdGRlcnIKKyAgICAgICAgaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIG9sZF9zdGRlcnIgPSBzeXMuc3RkZXJyCisgICAgICAgIGxvZ2dlciA9IHN5cy5zdGRlcnIgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMoKmFyZ3MsICoqa3cpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3RkZXJyID0gb2xkX3N0ZGVycgorICAgICAgICByZXR1cm4gbG9nZ2VyLmdldHZhbHVlKCkKKworICAgIGRlZiB0ZXN0X1ZhbHVlRXJyb3Ioc2VsZik6CisgICAgICAgIGNiID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCkoY2FsbGJhY2tfZnVuYykKKyAgICAgICAgb3V0ID0gc2VsZi5jYXB0dXJlX3N0ZGVycihjYiwgNDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG91dC5zcGxpdGxpbmVzKClbLTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWVFcnJvcjogNDIiKQorCisgICAgZGVmIHRlc3RfSW50ZWdlckRpdmlzaW9uRXJyb3Ioc2VsZik6CisgICAgICAgIGNiID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCkoY2FsbGJhY2tfZnVuYykKKyAgICAgICAgb3V0ID0gc2VsZi5jYXB0dXJlX3N0ZGVycihjYiwgMCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZXJvRGl2aXNpb25FcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybyIpCisKKyAgICBkZWYgdGVzdF9GbG9hdERpdmlzaW9uRXJyb3Ioc2VsZik6CisgICAgICAgIGNiID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2RvdWJsZSkoY2FsbGJhY2tfZnVuYykKKyAgICAgICAgb3V0ID0gc2VsZi5jYXB0dXJlX3N0ZGVycihjYiwgMC4wKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvdXQuc3BsaXRsaW5lcygpWy0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplcm9EaXZpc2lvbkVycm9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdCBkaXZpc2lvbiIpCisKKyAgICBkZWYgdGVzdF9UeXBlRXJyb3JEaXZpc2lvbkVycm9yKHNlbGYpOgorICAgICAgICBjYiA9IENGVU5DVFlQRShjX2ludCwgY19jaGFyX3ApKGNhbGxiYWNrX2Z1bmMpCisgICAgICAgIG91dCA9IHNlbGYuY2FwdHVyZV9zdGRlcnIoY2IsICJzcGFtIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlRXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgLzogJ2ludCcgYW5kICdzdHInIikKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQwOGU2Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmVmY291bnRzLnB5CkBAIC0wLDAgKzEsOTggQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGN0eXBlcworaW1wb3J0IGdjCisKK015Q2FsbGJhY2sgPSBjdHlwZXMuQ0ZVTkNUWVBFKGN0eXBlcy5jX2ludCwgY3R5cGVzLmNfaW50KQorT3RoZXJDYWxsYmFjayA9IGN0eXBlcy5DRlVOQ1RZUEUoY3R5cGVzLmNfaW50LCBjdHlwZXMuY19pbnQsIGN0eXBlcy5jX3Vsb25nbG9uZykKKworaW1wb3J0IF9jdHlwZXNfdGVzdAorZGxsID0gY3R5cGVzLmNkbGwubG9hZChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisKK2NsYXNzIFJlZmNvdW50VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IGdldHJlZmNvdW50IGFzIGdyYworCisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2NhbGxiYWNrX2lfaWYKKyAgICAgICAgZi5yZXN0eXBlID0gY3R5cGVzLmNfaW50CisgICAgICAgIGYuYXJndHlwZXMgPSBbY3R5cGVzLmNfaW50LCBNeUNhbGxiYWNrXQorCisgICAgICAgIGRlZiBjYWxsYmFjayh2YWx1ZSk6CisgICAgICAgICAgICAjcHJpbnQgImNhbGxlZCBiYWNrIHdpdGgiLCB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKGNhbGxiYWNrKSwgMikKKyAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhncmMoY2FsbGJhY2spID4gMikKKyAgICAgICAgcmVzdWx0ID0gZigtMTAsIGNiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIC0xOCkKKyAgICAgICAgY2IgPSBOb25lCisKKyAgICAgICAgZ2MuY29sbGVjdCgpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKGNhbGxiYWNrKSwgMikKKworCisgICAgZGVmIHRlc3RfcmVmY291bnQoc2VsZik6CisgICAgICAgIGZyb20gc3lzIGltcG9ydCBnZXRyZWZjb3VudCBhcyBncmMKKyAgICAgICAgZGVmIGZ1bmMoKmFyZ3MpOgorICAgICAgICAgICAgcGFzcworICAgICAgICAjIHRoaXMgaXMgdGhlIHN0YW5kYXJkIHJlZmNvdW50IGZvciBmdW5jCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyhmdW5jKSwgMikKKworICAgICAgICAjIHRoZSBDRnVuY1B0ciBpbnN0YW5jZSBob2xkcyBhdHIgbGVhc3Qgb25lIHJlZmNvdW50IG9uIGZ1bmM6CisgICAgICAgIGYgPSBPdGhlckNhbGxiYWNrKGZ1bmMpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhncmMoZnVuYykgPiAyKQorCisgICAgICAgICMgYW5kIG1heSByZWxlYXNlIGl0IGFnYWluCisgICAgICAgIGRlbCBmCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhncmMoZnVuYykgPj0gMikKKyAgICAgICAgCisgICAgICAgICMgYnV0IG5vdyBpdCBtdXN0IGJlIGdvbmUKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhncmMoZnVuYykgPT0gMikKKworICAgICAgICBjbGFzcyBYKGN0eXBlcy5TdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgT3RoZXJDYWxsYmFjayldCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgeC5hID0gT3RoZXJDYWxsYmFjayhmdW5jKQorICAgICAgICAKKyAgICAgICAgIyB0aGUgQ0Z1bmNQdHIgaW5zdGFuY2UgaG9sZHMgYXRyIGxlYXN0IG9uZSByZWZjb3VudCBvbiBmdW5jOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZ3JjKGZ1bmMpID4gMikKKworICAgICAgICAjIGFuZCBtYXkgcmVsZWFzZSBpdCBhZ2FpbgorICAgICAgICBkZWwgeAorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZ3JjKGZ1bmMpID49IDIpCisgICAgICAgIAorICAgICAgICAjIGFuZCBub3cgaXQgbXVzdCBiZSBnb25lIGFnYWluCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChncmMoZnVuYyksIDIpCisKKyAgICAgICAgZiA9IE90aGVyQ2FsbGJhY2soZnVuYykKKworICAgICAgICAjIHRoZSBDRnVuY1B0ciBpbnN0YW5jZSBob2xkcyBhdHIgbGVhc3Qgb25lIHJlZmNvdW50IG9uIGZ1bmM6CisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhncmMoZnVuYykgPiAyKQorCisgICAgICAgICMgY3JlYXRlIGEgY3ljbGUKKyAgICAgICAgZi5jeWNsZSA9IGYKKworICAgICAgICBkZWwgZgorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKGZ1bmMpLCAyKQorICAgICAgICAKK2NsYXNzIEFub3RoZXJMZWFrKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9jYWxsYmFjayhzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworCisgICAgICAgIHByb3RvID0gY3R5cGVzLkNGVU5DVFlQRShjdHlwZXMuY19pbnQsIGN0eXBlcy5jX2ludCwgY3R5cGVzLmNfaW50KQorICAgICAgICBkZWYgZnVuYyhhLCBiKToKKyAgICAgICAgICAgIHJldHVybiBhICogYiAqIDIKKyAgICAgICAgZiA9IHByb3RvKGZ1bmMpCisgICAgICAgIAorICAgICAgICBhID0gc3lzLmdldHJlZmNvdW50KGN0eXBlcy5jX2ludCkKKyAgICAgICAgZigxLCAyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzeXMuZ2V0cmVmY291bnQoY3R5cGVzLmNfaW50KSwgYSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JlcHIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yZXByLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MGI4MmYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yZXByLnB5CkBAIC0wLDAgKzEsMjQgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QKKworbnVtcyA9IFtjX2J5dGUsIGNfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfbG9uZ2xvbmcsCisgICAgICAgIGNfdWJ5dGUsIGNfdXNob3J0LCBjX3VpbnQsIGNfdWxvbmcsIGNfdWxvbmdsb25nLAorICAgICAgICBjX2Zsb2F0LCBjX2RvdWJsZV0KKworY2xhc3MgUmVwclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X251bWJlcnMoc2VsZik6CisgICAgICAgIGZvciB0eXAgaW4gbnVtczoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXByKHR5cCg0MikpLnN0YXJ0c3dpdGgodHlwLl9fbmFtZV9fKSkKKyAgICAgICAgICAgIGNsYXNzIFgodHlwKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiPFggb2JqZWN0IGF0IiwgcmVwcihYKDQyKSlbOjEyXSkKKworICAgIGRlZiB0ZXN0X2NoYXIoc2VsZik6CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJjX2NoYXIoJ3gnKSIsIHJlcHIoY19jaGFyKCd4JykpKQorCisgICAgICAgIGNsYXNzIFgoY19jaGFyKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjxYIG9iamVjdCBhdCIsIHJlcHIoWCgneCcpKVs6MTJdKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yZXR1cm5mdW5jcHRycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDExYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKQEAgLTAsMCArMSwzNSBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorCitpbXBvcnQgX2N0eXBlc190ZXN0CisKK2NsYXNzIFJldHVybkZ1bmNQdHJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF93aXRoX3Byb3RvdHlwZShzZWxmKToKKyAgICAgICAgIyBUaGUgX2N0eXBlc190ZXN0IHNoYXJlZCBsaWIvZGxsIGV4cG9ydHMgcXVpdGUgc29tZSBmdW5jdGlvbnMgZm9yIHRlc3RpbmcuCisgICAgICAgICMgVGhlIGdldF9zdHJjaHIgZnVuY3Rpb24gcmV0dXJucyBhICpwb2ludGVyKiB0byB0aGUgQyBzdHJjaHIgZnVuY3Rpb24uCisgICAgICAgIGRsbCA9IGNkbGwubG9hZChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIGdldF9zdHJjaHIgPSBkbGwuZ2V0X3N0cmNocgorICAgICAgICBnZXRfc3RyY2hyLnJlc3R5cGUgPSBDRlVOQ1RZUEUoY19jaGFyX3AsIGNfY2hhcl9wLCBjX2NoYXIpCisgICAgICAgIHN0cmNociA9IGdldF9zdHJjaHIoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJjaHIoImFiY2RlZiIsICJiIiksICJiY2RlZiIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmNocigiYWJjZGVmIiwgIngiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgc3RyY2hyLCAiYWJjZGVmIiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdHJjaHIsICJhYmNkZWYiKQorICAgICAgICAKKyAgICBkZWYgdGVzdF93aXRob3V0X3Byb3RvdHlwZShzZWxmKToKKyAgICAgICAgZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgZ2V0X3N0cmNociA9IGRsbC5nZXRfc3RyY2hyCisgICAgICAgICMgdGhlIGRlZmF1bHQgJ2NfaW50JyB3b3VsZCBub3Qgd29yayBvbiBzeXN0ZW1zIHdoZXJlIHNpemVvZihpbnQpICE9IHNpemVvZih2b2lkICopCisgICAgICAgIGdldF9zdHJjaHIucmVzdHlwZSA9IGNfdm9pZF9wCisgICAgICAgIGFkZHIgPSBnZXRfc3RyY2hyKCkKKyAgICAgICAgIyBfQ0Z1bmNQdHIgaW5zdGFuY2VzIGFyZSBub3cgY2FsbGFibGUgd2l0aCBhbiBpbnRlZ2VyIGFyZ3VtZW50CisgICAgICAgICMgd2hpY2ggZGVub3RlcyBhIGZ1bmN0aW9uIGFkZHJlc3M6CisgICAgICAgIHN0cmNociA9IENGVU5DVFlQRShjX2NoYXJfcCwgY19jaGFyX3AsIGNfY2hhcikoYWRkcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cmNocigiYWJjZGVmIiwgImIiKSwgImJjZGVmIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyY2hyKCJhYmNkZWYiLCAieCIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBzdHJjaHIsICJhYmNkZWYiLCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN0cmNociwgImFiY2RlZiIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zaW1wbGVzdWJjbGFzc2VzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2ltcGxlc3ViY2xhc3Nlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTU1MTcwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2ltcGxlc3ViY2xhc3Nlcy5weQpAQCAtMCwwICsxLDU1IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK2NsYXNzIE15SW50KGNfaW50KToKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHR5cGUob3RoZXIpICE9IE15SW50OgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIHJldHVybiBjbXAoc2VsZi52YWx1ZSwgb3RoZXIudmFsdWUpCisKK2NsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTXlJbnQoMyksIE15SW50KDMpKQorICAgICAgICBzZWxmLmZhaWxJZkVxdWFsKE15SW50KDQyKSwgTXlJbnQoNDMpKQorCisgICAgZGVmIHRlc3RfaWdub3JlX3JldHZhbChzZWxmKToKKyAgICAgICAgIyBUZXN0IGlmIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBjYWxsYmFjayBpcyBpZ25vcmVkCisgICAgICAgICMgaWYgcmVzdHlwZSBpcyBOb25lCisgICAgICAgIHByb3RvID0gQ0ZVTkNUWVBFKE5vbmUpCisgICAgICAgIGRlZiBmdW5jKCk6CisgICAgICAgICAgICByZXR1cm4gKDEsICJhYmMiLCBOb25lKQorCisgICAgICAgIGNiID0gcHJvdG8oZnVuYykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgY2IoKSkKKworCisgICAgZGVmIHRlc3RfaW50X2NhbGxiYWNrKHNlbGYpOgorICAgICAgICBhcmdzID0gW10KKyAgICAgICAgZGVmIGZ1bmMoYXJnKToKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKGFyZykKKyAgICAgICAgICAgIHJldHVybiBhcmcKKworICAgICAgICBjYiA9IENGVU5DVFlQRShOb25lLCBNeUludCkoZnVuYykKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChOb25lLCBjYig0MikpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUoYXJnc1stMV0pLCBNeUludCkKKworICAgICAgICBjYiA9IENGVU5DVFlQRShjX2ludCwgY19pbnQpKGZ1bmMpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGNiKDQyKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShhcmdzWy0xXSksIGludCkKKworICAgIGRlZiB0ZXN0X2ludF9zdHJ1Y3Qoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIE15SW50KV0KKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYKCkueCwgTXlJbnQoKSkKKworICAgICAgICBzID0gWCgpCisgICAgICAgIHMueCA9IE15SW50KDQyKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMueCwgTXlJbnQoNDIpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmI5Y2EwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHkKQEAgLTAsMCArMSwyNCBAQAorIyBUZXN0IHNwZWNpZmljYWxseS1zaXplZCBjb250YWluZXJzLgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK2NsYXNzIFNpemVzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0Xzgoc2VsZik6CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEsIHNpemVvZihjX2ludDgpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgxLCBzaXplb2YoY191aW50OCkpCisKKyAgICBkZWYgdGVzdF8xNihzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMiwgc2l6ZW9mKGNfaW50MTYpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgyLCBzaXplb2YoY191aW50MTYpKQorCisgICAgZGVmIHRlc3RfMzIoc2VsZik6CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQsIHNpemVvZihjX2ludDMyKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNCwgc2l6ZW9mKGNfdWludDMyKSkKKworICAgIGRlZiB0ZXN0XzY0KHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg4LCBzaXplb2YoY19pbnQ2NCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDgsIHNpemVvZihjX3VpbnQ2NCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDZjNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weQpAQCAtMCwwICsxLDkwIEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKKworY2xhc3MgU2xpY2VzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2dldHNsaWNlX2NpbnQoc2VsZik6CisgICAgICAgIGEgPSAoY19pbnQgKiAxMDApKCp4cmFuZ2UoMTEwMCwgMTIwMCkpCisgICAgICAgIGIgPSByYW5nZSgxMTAwLCAxMjAwKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhWzA6Ml0sIGJbMDoyXSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKGEpLCBsZW4oYikpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbNTo3XSwgYls1OjddKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhWy0xXSwgYlstMV0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbOl0sIGJbOl0pCisKKyAgICAgICAgYVswOjVdID0gcmFuZ2UoNSwgMTApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbMDo1XSwgcmFuZ2UoNSwgMTApKQorCisgICAgZGVmIHRlc3Rfc2V0c2xpY2VfY2ludChzZWxmKToKKyAgICAgICAgYSA9IChjX2ludCAqIDEwMCkoKnhyYW5nZSgxMTAwLCAxMjAwKSkKKyAgICAgICAgYiA9IHJhbmdlKDExMDAsIDEyMDApCisKKyAgICAgICAgYVszMjo0N10gPSByYW5nZSgzMiwgNDcpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbMzI6NDddLCByYW5nZSgzMiwgNDcpKQorCisgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IHNldHNsaWNlCisKKyAgICAgICAgIyBUeXBlRXJyb3I6IGludCBleHBlY3RlZCBpbnN0ZWFkIG9mIHN0ciBpbnN0YW5jZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldHNsaWNlLCBhLCAwLCA1LCAiYWJjZGUiKQorICAgICAgICAjIFR5cGVFcnJvcjogaW50IGV4cGVjdGVkIGluc3RlYWQgb2Ygc3RyIGluc3RhbmNlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0c2xpY2UsIGEsIDAsIDUsIFsiYSIsICJiIiwgImMiLCAiZCIsICJlIl0pCisgICAgICAgICMgVHlwZUVycm9yOiBpbnQgZXhwZWN0ZWQgaW5zdGVhZCBvZiBmbG9hdCBpbnN0YW5jZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldHNsaWNlLCBhLCAwLCA1LCBbMSwgMiwgMywgNCwgMy4xNF0pCisgICAgICAgICMgVmFsdWVFcnJvcjogQ2FuIG9ubHkgYXNzaWduIHNlcXVlbmNlIG9mIHNhbWUgc2l6ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRzbGljZSwgYSwgMCwgNSwgcmFuZ2UoMzIpKQorCisgICAgZGVmIHRlc3RfY2hhcl9wdHIoc2VsZik6CisgICAgICAgIHMgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcMCIKKworICAgICAgICBkbGwgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBkbGwubXlfc3RyZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfY2hhcikKKyAgICAgICAgcmVzID0gZGxsLm15X3N0cmR1cChzKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbOmxlbihzKV0sIHMpCisKKyAgICAgICAgaW1wb3J0IG9wZXJhdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0c2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgMCwgNSwgdSJhYmNkZSIpCisKKyAgICAgICAgZGxsLm15X3N0cmR1cC5yZXN0eXBlID0gUE9JTlRFUihjX2J5dGUpCisgICAgICAgIHJlcyA9IGRsbC5teV9zdHJkdXAocykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzpsZW4ocyktMV0sIHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSsxKSkKKworICAgIGRlZiB0ZXN0X2NoYXJfYXJyYXkoc2VsZik6CisgICAgICAgIHMgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcMCIKKworICAgICAgICBwID0gKGNfY2hhciAqIDI3KSgqcykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6XSwgcykKKworCisgICAgdHJ5OgorICAgICAgICBjX3djaGFyCisgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGRlZiB0ZXN0X3djaGFyX3B0cihzZWxmKToKKyAgICAgICAgICAgIHMgPSB1ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XDAiCisKKyAgICAgICAgICAgIGRsbCA9IGNkbGwubG9hZChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfd2NoYXIpCisgICAgICAgICAgICBkbGwubXlfd2NzZHVwLmFyZ3R5cGVzID0gUE9JTlRFUihjX3djaGFyKSwKKyAgICAgICAgICAgIHJlcyA9IGRsbC5teV93Y3NkdXAocykKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1s6bGVuKHMpXSwgcykKKworICAgICAgICAgICAgaW1wb3J0IG9wZXJhdG9yCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldHNsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLCAwLCA1LCB1ImFiY2RlIikKKworICAgICAgICAgICAgaWYgc2l6ZW9mKGNfd2NoYXIpID09IHNpemVvZihjX3Nob3J0KToKKyAgICAgICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfc2hvcnQpCisgICAgICAgICAgICBlbGlmIHNpemVvZihjX3djaGFyKSA9PSBzaXplb2YoY19pbnQpOgorICAgICAgICAgICAgICAgIGRsbC5teV93Y3NkdXAucmVzdHlwZSA9IFBPSU5URVIoY19pbnQpCisgICAgICAgICAgICBlbGlmIHNpemVvZihjX3djaGFyKSA9PSBzaXplb2YoY19sb25nKToKKyAgICAgICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfbG9uZykKKyAgICAgICAgICAgIHJlcyA9IGRsbC5teV93Y3NkdXAocykKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1s6bGVuKHMpLTFdLCByYW5nZShvcmQoImEiKSwgb3JkKCJ6IikrMSkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3B0ci5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3B0ci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODNhNjBjCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncHRyLnB5CkBAIC0wLDAgKzEsNzUgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworaW1wb3J0IF9jdHlwZXNfdGVzdAorCitsaWIgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorCitjbGFzcyBTdHJpbmdQdHJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9fUE9JTlRFUl9jX2NoYXIoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygic3RyIiwgUE9JTlRFUihjX2NoYXIpKV0KKyAgICAgICAgeCA9IFgoKQorCisgICAgICAgICMgTlVMTCBwb2ludGVyIGFjY2VzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRhdHRyLCB4LnN0ciwgImNvbnRlbnRzIikKKyAgICAgICAgYiA9IGNfYnVmZmVyKCJIZWxsbywgV29ybGQiKQorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgZ2V0cmVmY291bnQgYXMgZ3JjCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyhiKSwgMikKKyAgICAgICAgeC5zdHIgPSBiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyhiKSwgMykKKworICAgICAgICAjIFBPSU5URVIoY19jaGFyKSBhbmQgUHl0aG9uIHN0cmluZyBpcyBOT1QgY29tcGF0aWJsZQorICAgICAgICAjIFBPSU5URVIoY19jaGFyKSBhbmQgY19idWZmZXIoKSBpcyBjb21wYXRpYmxlCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihiKSk6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiW2ldLCB4LnN0cltpXSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHgsICJzdHIiLCAiSGVsbG8sIFdvcmxkIikKKworICAgIGRlZiB0ZXN0X19jX2NoYXJfcChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJzdHIiLCBjX2NoYXJfcCldCisgICAgICAgIHggPSBYKCkKKworICAgICAgICAjIGNfY2hhcl9wIGFuZCBQeXRob24gc3RyaW5nIGlzIGNvbXBhdGlibGUKKyAgICAgICAgIyBjX2NoYXJfcCBhbmQgY19idWZmZXIgaXMgTk9UIGNvbXBhdGlibGUKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5zdHIsIE5vbmUpCisgICAgICAgIHguc3RyID0gIkhlbGxvLCBXb3JsZCIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5zdHIsICJIZWxsbywgV29ybGQiKQorICAgICAgICBiID0gY19idWZmZXIoIkhlbGxvLCBXb3JsZCIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHgsICJzdHIiLCBiKQorCisKKyAgICBkZWYgdGVzdF9mdW5jdGlvbnMoc2VsZik6CisgICAgICAgIHN0cmNociA9IGxpYi5teV9zdHJjaHIKKyAgICAgICAgc3RyY2hyLnJlc3R5cGUgPSBjX2NoYXJfcAorCisgICAgICAgICMgY19jaGFyX3AgYW5kIFB5dGhvbiBzdHJpbmcgaXMgY29tcGF0aWJsZQorICAgICAgICAjIGNfY2hhcl9wIGFuZCBjX2J1ZmZlciBhcmUgbm93IGNvbXBhdGlibGUKKyAgICAgICAgc3RyY2hyLmFyZ3R5cGVzID0gY19jaGFyX3AsIGNfY2hhcgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJjaHIoImFiY2RlZiIsICJjIiksICJjZGVmIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyY2hyKGNfYnVmZmVyKCJhYmNkZWYiKSwgImMiKSwgImNkZWYiKQorCisgICAgICAgICMgUE9JTlRFUihjX2NoYXIpIGFuZCBQeXRob24gc3RyaW5nIGlzIE5PVCBjb21wYXRpYmxlCisgICAgICAgICMgUE9JTlRFUihjX2NoYXIpIGFuZCBjX2J1ZmZlcigpIGlzIGNvbXBhdGlibGUKKyAgICAgICAgc3RyY2hyLmFyZ3R5cGVzID0gUE9JTlRFUihjX2NoYXIpLCBjX2NoYXIKKyAgICAgICAgYnVmID0gY19idWZmZXIoImFiY2RlZiIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmNocihidWYsICJjIiksICJjZGVmIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyY2hyKCJhYmNkZWYiLCAiYyIpLCAiY2RlZiIpCisKKyAgICAgICAgIyBYWFggVGhlc2UgY2FsbHMgYXJlIGRhbmdlcm91cywgYmVjYXVzZSB0aGUgZmlyc3QgYXJndW1lbnQKKyAgICAgICAgIyB0byBzdHJjaHIgaXMgbm8gbG9uZ2VyIHZhbGlkIGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zIQorICAgICAgICAjIFNvIHdlIG11c3Qga2VlcCBhIHJlZmVyZW5jZSB0byBidWYgc2VwYXJhdGVseQorCisgICAgICAgIHN0cmNoci5yZXN0eXBlID0gUE9JTlRFUihjX2NoYXIpCisgICAgICAgIGJ1ZiA9IGNfYnVmZmVyKCJhYmNkZWYiKQorICAgICAgICByID0gc3RyY2hyKGJ1ZiwgImMiKQorICAgICAgICB4ID0gclswXSwgclsxXSwgclsyXSwgclszXSwgcls0XQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4LCAoImMiLCAiZCIsICJlIiwgImYiLCAiXDAwMCIpKQorICAgICAgICBkZWwgYnVmCisgICAgICAgICMgeDEgd2lsbCBOT1QgYmUgdGhlIHNhbWUgYXMgeCwgdXN1YWxseToKKyAgICAgICAgeDEgPSByWzBdLCByWzFdLCByWzJdLCByWzNdLCByWzRdCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQwZjFkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncy5weQpAQCAtMCwwICsxLDIxNSBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorCitjbGFzcyBTdHJpbmdBcnJheVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgQlVGID0gY19jaGFyICogNAorCisgICAgICAgIGJ1ZiA9IEJVRigiYSIsICJiIiwgImMiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYudmFsdWUsICJhYmMiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYucmF3LCAiYWJjXDAwMCIpCisKKyAgICAgICAgYnVmLnZhbHVlID0gIkFCQ0QiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgIkFCQ0QiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYucmF3LCAiQUJDRCIpCisKKyAgICAgICAgYnVmLnZhbHVlID0gIngiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgIngiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYucmF3LCAieFwwMDBDRCIpCisKKyAgICAgICAgYnVmWzFdID0gIloiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgInhaQ0QiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYucmF3LCAieFpDRCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0YXR0ciwgYnVmLCAidmFsdWUiLCAiYWFhYWFhYWEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIGJ1ZiwgInZhbHVlIiwgNDIpCisKKyAgICBkZWYgdGVzdF9jX2J1ZmZlcl92YWx1ZShzZWxmKToKKyAgICAgICAgYnVmID0gY19idWZmZXIoMzIpCisKKyAgICAgICAgYnVmLnZhbHVlID0gIkhlbGxvLCBXb3JsZCIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmLnZhbHVlLCAiSGVsbG8sIFdvcmxkIikKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBidWYsICJ2YWx1ZSIsIGJ1ZmZlcigiSGVsbG8sIFdvcmxkIikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgYnVmLCAidmFsdWUiLCBidWZmZXIoImFiYyIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBidWYsICJyYXciLCBidWZmZXIoIngiICogMTAwKSkKKworICAgIGRlZiB0ZXN0X2NfYnVmZmVyX3JhdyhzZWxmKToKKyAgICAgICAgYnVmID0gY19idWZmZXIoMzIpCisKKyAgICAgICAgYnVmLnJhdyA9IGJ1ZmZlcigiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmLnZhbHVlLCAiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBidWYsICJ2YWx1ZSIsIGJ1ZmZlcigiYWJjIikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGF0dHIsIGJ1ZiwgInJhdyIsIGJ1ZmZlcigieCIgKiAxMDApKQorCisgICAgZGVmIHRlc3RfcGFyYW1fMShzZWxmKToKKyAgICAgICAgQlVGID0gY19jaGFyICogNAorICAgICAgICBidWYgPSBCVUYoKQorIyMgICAgICAgIHByaW50IGNfY2hhcl9wLmZyb21fcGFyYW0oYnVmKQorICAgICAgICAKKyAgICBkZWYgdGVzdF9wYXJhbV8yKHNlbGYpOgorICAgICAgICBCVUYgPSBjX2NoYXIgKiA0CisgICAgICAgIGJ1ZiA9IEJVRigpCisjIyAgICAgICAgcHJpbnQgQlVGLmZyb21fcGFyYW0oY19jaGFyX3AoInB5dGhvbiIpKQorIyMgICAgICAgIHByaW50IEJVRi5mcm9tX3BhcmFtKEJVRigqInB5dGgiKSkKKwordHJ5OgorICAgIGNfd2NoYXIKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBjbGFzcyBXU3RyaW5nQXJyYXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgQlVGID0gY193Y2hhciAqIDQKKworICAgICAgICAgICAgYnVmID0gQlVGKHUiYSIsIHUiYiIsIHUiYyIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYudmFsdWUsIHUiYWJjIikKKworICAgICAgICAgICAgYnVmLnZhbHVlID0gdSJBQkNEIgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmLnZhbHVlLCB1IkFCQ0QiKQorCisgICAgICAgICAgICBidWYudmFsdWUgPSB1IngiCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYudmFsdWUsIHUieCIpCisKKyAgICAgICAgICAgIGJ1ZlsxXSA9IHUiWiIKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgdSJ4WkNEIikKKworY2xhc3MgU3RyaW5nVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBYWF90ZXN0X2Jhc2ljX3N0cmluZ3Moc2VsZik6CisgICAgICAgIGNzID0gY19zdHJpbmcoImFiY2RlZiIpCisKKyAgICAgICAgIyBDYW5ub3QgY2FsbCBsZW4gb24gYSBjX3N0cmluZyBhbnkgbG9uZ2VyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGVuLCBjcykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKGNzKSwgNykKKworICAgICAgICAjIFRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyB0aGUgc3RyaW5nIHVwIHRvIHRoZSBmaXJzdCB0ZXJtaW5hdGluZyBOVUwuCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNzLnZhbHVlLCAiYWJjZGVmIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY19zdHJpbmcoImFiY1wwMDBkZWYiKS52YWx1ZSwgImFiYyIpCisKKyAgICAgICAgIyBUaGUgcmF3IHByb3BlcnR5IGlzIHRoZSB0b3RhbCBidWZmZXIgY29udGVudHM6CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNzLnJhdywgImFiY2RlZlwwMDAiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjX3N0cmluZygiYWJjXDAwMGRlZiIpLnJhdywgImFiY1wwMDBkZWZcMDAwIikKKworICAgICAgICAjIFdlIGNhbiBjaGFuZ2UgdGhlIHZhbHVlOgorICAgICAgICBjcy52YWx1ZSA9ICJhYiIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3MudmFsdWUsICJhYiIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNzLnJhdywgImFiXDAwMFwwMDBcMDAwXDAwMFwwMDAiKQorCisgICAgICAgIGNzLnJhdyA9ICJYWSIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3MudmFsdWUsICJYWSIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNzLnJhdywgIlhZXDAwMFwwMDBcMDAwXDAwMFwwMDAiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY19zdHJpbmcsIHUiMTIzIikKKworICAgIGRlZiBYWF90ZXN0X3NpemVkX3N0cmluZ3Moc2VsZik6CisKKyAgICAgICAgIyBOZXcgaW4gcmVsZWFzZXMgbGF0ZXIgdGhhbiAwLjQuMDogCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY19zdHJpbmcsIE5vbmUpCisgICAgICAgIAorICAgICAgICAjIE5ldyBpbiByZWxlYXNlcyBsYXRlciB0aGFuIDAuNC4wOgorICAgICAgICAjIGNfc3RyaW5nKG51bWJlcikgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgb2Ygc2l6ZSBudW1iZXIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxlbihjX3N0cmluZygzMikucmF3KSA9PSAzMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY19zdHJpbmcsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX3N0cmluZywgMCkKKworICAgICAgICAjIFRoZXNlIHRlc3RzIGZhaWwsIGJlY2F1c2UgaXQgaXMgbm8gbG9uZ2VyIGluaXRpYWxpemVkCisjIyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfc3RyaW5nKDIpLnZhbHVlID09ICIiKQorIyMgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX3N0cmluZygyKS5yYXcgPT0gIlwwMDBcMDAwIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfc3RyaW5nKDIpLnJhd1stMV0gPT0gIlwwMDAiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MobGVuKGNfc3RyaW5nKDIpLnJhdykgPT0gMikKKworICAgIGRlZiBYWF90ZXN0X2luaXRpYWxpemVkX3N0cmluZ3Moc2VsZik6CisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfc3RyaW5nKCJhYiIsIDQpLnJhd1s6Ml0gPT0gImFiIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfc3RyaW5nKCJhYiIsIDQpLnJhd1stMV0gPT0gIlwwMDAiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19zdHJpbmcoImFiIiwgMikucmF3ID09ICJhXDAwMCIpCisKKyAgICBkZWYgWFhfdGVzdF90b29sb25nKHNlbGYpOgorICAgICAgICBjcyA9IGNfc3RyaW5nKCJhYmNkZWYiKQorICAgICAgICAjIE11Y2ggdG9vIGxvbmcgc3RyaW5nOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBjcywgInZhbHVlIiwgIjEyMzQ1Njc4OTAxMjM0NSIpCisKKyAgICAgICAgIyBPbmUgY2hhciB0b28gbG9uZyB2YWx1ZXM6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGF0dHIsIGNzLCAidmFsdWUiLCAiMTIzNDU2NyIpCisKKyMjICAgIGRlZiB0ZXN0X3BlcmYoc2VsZik6CisjIyAgICAgICAgY2hlY2tfcGVyZigpCisKK3RyeToKKyAgICBjX3djaGFyCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgY2xhc3MgV1N0cmluZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgZGVmIHRlc3Rfd2NoYXIoc2VsZik6CisgICAgICAgICAgICBjX3djaGFyKHUieCIpCisgICAgICAgICAgICByZXByKGJ5cmVmKGNfd2NoYXIodSJ4IikpKQorICAgICAgICAgICAgY193Y2hhcigieCIpCisKKworICAgICAgICBkZWYgWF90ZXN0X2Jhc2ljX3dzdHJpbmdzKHNlbGYpOgorICAgICAgICAgICAgY3MgPSBjX3dzdHJpbmcodSJhYmNkZWYiKQorCisgICAgICAgICAgICAjIFhYWCBUaGlzIGJlaGF2aW91ciBpcyBhYm91dCB0byBjaGFuZ2U6CisgICAgICAgICAgICAjIGxlbiByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBidWZmZXIgaW4gYnl0ZXMuCisgICAgICAgICAgICAjIFRoaXMgaW5jbHVkZXMgdGhlIHRlcm1pbmF0aW5nIE5VTCBjaGFyYWN0ZXIuCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2l6ZW9mKGNzKSA9PSAxNCkKKworICAgICAgICAgICAgIyBUaGUgdmFsdWUgcHJvcGVydHkgaXMgdGhlIHN0cmluZyB1cCB0byB0aGUgZmlyc3QgdGVybWluYXRpbmcgTlVMLgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNzLnZhbHVlID09IHUiYWJjZGVmIikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX3dzdHJpbmcodSJhYmNcMDAwZGVmIikudmFsdWUgPT0gdSJhYmMiKQorCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnZhbHVlID09IHUiYWJjIikKKworICAgICAgICAgICAgIyBUaGUgcmF3IHByb3BlcnR5IGlzIHRoZSB0b3RhbCBidWZmZXIgY29udGVudHM6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY3MucmF3ID09IHUiYWJjZGVmXDAwMCIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnJhdyA9PSB1ImFiY1wwMDBkZWZcMDAwIikKKworICAgICAgICAgICAgIyBXZSBjYW4gY2hhbmdlIHRoZSB2YWx1ZToKKyAgICAgICAgICAgIGNzLnZhbHVlID0gdSJhYiIKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjcy52YWx1ZSA9PSB1ImFiIikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjcy5yYXcgPT0gdSJhYlwwMDBcMDAwXDAwMFwwMDBcMDAwIikKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX3dzdHJpbmcsICIxMjMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY193c3RyaW5nLCAwKQorCisgICAgICAgIGRlZiBYX3Rlc3RfdG9vbG9uZyhzZWxmKToKKyAgICAgICAgICAgIGNzID0gY193c3RyaW5nKHUiYWJjZGVmIikKKyAgICAgICAgICAgICMgTXVjaCB0b28gbG9uZyBzdHJpbmc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBjcywgInZhbHVlIiwgdSIxMjM0NTY3ODkwMTIzNDUiKQorCisgICAgICAgICAgICAjIE9uZSBjaGFyIHRvbyBsb25nIHZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGF0dHIsIGNzLCAidmFsdWUiLCB1IjEyMzQ1NjciKQorCisgICAgICAgIAorZGVmIHJ1bl90ZXN0KHJlcCwgbXNnLCBmdW5jLCBhcmcpOgorICAgIGl0ZW1zID0gcmFuZ2UocmVwKQorICAgIGZyb20gdGltZSBpbXBvcnQgY2xvY2sKKyAgICBzdGFydCA9IGNsb2NrKCkKKyAgICBmb3IgaSBpbiBpdGVtczoKKyAgICAgICAgZnVuYyhhcmcpOyBmdW5jKGFyZyk7IGZ1bmMoYXJnKTsgZnVuYyhhcmcpOyBmdW5jKGFyZykKKyAgICBzdG9wID0gY2xvY2soKQorICAgIHByaW50ICIlMjBzOiAlLjJmIHVzIiAlIChtc2csICgoc3RvcC1zdGFydCkqMWU2LzUvcmVwKSkKKworZGVmIGNoZWNrX3BlcmYoKToKKyAgICAjIENvbnN0cnVjdCA1IG9iamVjdHMKKworICAgIFJFUCA9IDIwMDAwMAorCisgICAgcnVuX3Rlc3QoUkVQLCAiY19zdHJpbmcoTm9uZSkiLCBjX3N0cmluZywgTm9uZSkKKyAgICBydW5fdGVzdChSRVAsICJjX3N0cmluZygnYWJjJykiLCBjX3N0cmluZywgJ2FiYycpCisKKyMgUHl0aG9uIDIuMyAtT08sIHdpbjJrLCBQNCA3MDAgTUh6OgorIworIyAgICAgIGNfc3RyaW5nKE5vbmUpOiAxLjc1IHVzCisjICAgICBjX3N0cmluZygnYWJjJyk6IDIuNzQgdXMKKworIyBQeXRob24gMi4yIC1PTywgd2luMmssIFA0IDcwMCBNSHo6CisjCisjICAgICAgY19zdHJpbmcoTm9uZSk6IDIuOTUgdXMKKyMgICAgIGNfc3RyaW5nKCdhYmMnKTogMy42NyB1cworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisjIyAgICBjaGVja19wZXJmKCkKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdF9maWVsZHMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3RfZmllbGRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNWZiNTAKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3RfZmllbGRzLnB5CkBAIC0wLDAgKzEsNTAgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworY2xhc3MgU3RydWN0RmllbGRzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgU3RydWN0dXJlL1VuaW9uIGNsYXNzZXMgbXVzdCBnZXQgJ2ZpbmFsaXplZCcgc29vbmVyIG9yCisgICAgIyBsYXRlciwgd2hlbiBvbmUgb2YgdGhlc2UgdGhpbmdzIGhhcHBlbjoKKyAgICAjCisgICAgIyAxLiBfZmllbGRzXyBpcyBzZXQuCisgICAgIyAyLiBBbiBpbnN0YW5jZSBpcyBjcmVhdGVkLgorICAgICMgMy4gVGhlIHR5cGUgaXMgdXNlZCBhcyBmaWVsZCBvZiBhbm90aGVyIFN0cnVjdHVyZS9Vbmlvbi4KKyAgICAjIDQuIFRoZSB0eXBlIGlzIHN1YmNsYXNzZWQKKyAgICAjCisgICAgIyBXaGVuIHRoZXkgYXJlIGZpbmFsaXplZCwgYXNzaWduaW5nIF9maWVsZHNfIGlzIG5vIGxvbmdlciBhbGxvd2VkLgorCisgICAgZGVmIHRlc3RfMV9BKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgMCkgIyBub3QgZmluYWxpemVkCisgICAgICAgIFguX2ZpZWxkc18gPSBbXSAjIGZpbmFsaXplZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgWCwgIl9maWVsZHNfIiwgW10pCisKKyAgICBkZWYgdGVzdF8xX0Ioc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gW10gIyBmaW5hbGl6ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIFgsICJfZmllbGRzXyIsIFtdKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBYKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIFgsICJfZmllbGRzXyIsIFtdKQorCisgICAgZGVmIHRlc3RfMyhzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBZKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBYKV0gIyBmaW5hbGl6ZXMgWAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgWCwgIl9maWVsZHNfIiwgW10pCisKKyAgICBkZWYgdGVzdF80KHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIFkoWCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBYLCAiX2ZpZWxkc18iLCBbXSkKKyAgICAgICAgWS5fZmllbGRzXyA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBYLCAiX2ZpZWxkc18iLCBbXSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NTllOGUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CkBAIC0wLDAgKzEsMzc2IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitmcm9tIHN0cnVjdCBpbXBvcnQgY2FsY3NpemUKKworY2xhc3MgU3ViY2xhc3Nlc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCldCisKKyAgICAgICAgY2xhc3MgWShYKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYiIsIGNfaW50KV0KKworICAgICAgICBjbGFzcyBaKFgpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFkpLCBzaXplb2YoY19pbnQpKjIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihaKSwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5fZmllbGRzXywgWygiYSIsIGNfaW50KV0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFkuX2ZpZWxkc18sIFsoImIiLCBjX2ludCldKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChaLl9maWVsZHNfLCBbKCJhIiwgY19pbnQpXSkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX2RlbGF5ZWQoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCAwKQorICAgICAgICBYLl9maWVsZHNfID0gWygiYSIsIGNfaW50KV0KKworICAgICAgICBjbGFzcyBZKFgpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWSksIHNpemVvZihYKSkKKyAgICAgICAgWS5fZmllbGRzXyA9IFsoImIiLCBjX2ludCldCisKKyAgICAgICAgY2xhc3MgWihYKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihZKSwgc2l6ZW9mKGNfaW50KSoyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWiksIHNpemVvZihjX2ludCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFguX2ZpZWxkc18sIFsoImEiLCBjX2ludCldKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLl9maWVsZHNfLCBbKCJiIiwgY19pbnQpXSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWi5fZmllbGRzXywgWygiYSIsIGNfaW50KV0pCisKK2NsYXNzIFN0cnVjdHVyZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBmb3JtYXRzID0geyJjIjogY19jaGFyLAorICAgICAgICAgICAgICAgImIiOiBjX2J5dGUsCisgICAgICAgICAgICAgICAiQiI6IGNfdWJ5dGUsCisgICAgICAgICAgICAgICAiaCI6IGNfc2hvcnQsCisgICAgICAgICAgICAgICAiSCI6IGNfdXNob3J0LAorICAgICAgICAgICAgICAgImkiOiBjX2ludCwKKyAgICAgICAgICAgICAgICJJIjogY191aW50LAorICAgICAgICAgICAgICAgImwiOiBjX2xvbmcsCisgICAgICAgICAgICAgICAiTCI6IGNfdWxvbmcsCisgICAgICAgICAgICAgICAicSI6IGNfbG9uZ2xvbmcsCisgICAgICAgICAgICAgICAiUSI6IGNfdWxvbmdsb25nLAorICAgICAgICAgICAgICAgImYiOiBjX2Zsb2F0LAorICAgICAgICAgICAgICAgImQiOiBjX2RvdWJsZSwKKyAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICBkZWYgdGVzdF9zaW1wbGVfc3RydWN0cyhzZWxmKToKKyAgICAgICAgZm9yIGNvZGUsIHRwIGluIHNlbGYuZm9ybWF0cy5pdGVtcygpOgorICAgICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfY2hhciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgdHApXQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHNpemVvZihYKSwgY29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FsY3NpemUoImMlYzAlYyIgJSAoY29kZSwgY29kZSkpLCBjb2RlKSkKKworICAgIGRlZiB0ZXN0X3VuaW9ucyhzZWxmKToKKyAgICAgICAgZm9yIGNvZGUsIHRwIGluIHNlbGYuZm9ybWF0cy5pdGVtcygpOgorICAgICAgICAgICAgY2xhc3MgWChVbmlvbik6CisgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19jaGFyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCB0cCldCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoc2l6ZW9mKFgpLCBjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWxjc2l6ZSgiJWMiICUgKGNvZGUpKSwgY29kZSkpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3RfYWxpZ25tZW50KHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2NoYXIgKiAzKV0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYWxpZ25tZW50KFgpLCBjYWxjc2l6ZSgicyIpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIGNhbGNzaXplKCIzcyIpKQorCisgICAgICAgIGNsYXNzIFkoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfY2hhciAqIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19pbnQpXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhbGlnbm1lbnQoWSksIGNhbGNzaXplKCJpIikpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihZKSwgY2FsY3NpemUoIjNzaSIpKQorCisgICAgICAgIGNsYXNzIFNJKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIFkpXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhbGlnbm1lbnQoU0kpLCBtYXgoYWxpZ25tZW50KFkpLCBhbGlnbm1lbnQoWCkpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoU0kpLCBjYWxjc2l6ZSgiM3MwaSAzc2kgMGkiKSkKKyAgICAgICAgCisgICAgICAgIGNsYXNzIElTKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImIiLCBZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYSIsIFgpXQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFsaWdubWVudChTSSksIG1heChhbGlnbm1lbnQoWCksIGFsaWdubWVudChZKSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihJUyksIGNhbGNzaXplKCIzc2kgM3MgMGkiKSkKKworICAgICAgICBjbGFzcyBYWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgWCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBYKV0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYWxpZ25tZW50KFhYKSwgYWxpZ25tZW50KFgpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWFgpLCBjYWxjc2l6ZSgiM3MgM3MgMHMiKSkKKworICAgIGRlZiB0ZXN0X2VtdHB5KHNlbGYpOgorICAgICAgICAjIEkgaGFkIHByb2JsZW1zIHdpdGggdGhlc2UKKyAgICAgICAgIworICAgICAgICAjIEFsdGhvdWdoIHRoZXNlIGFyZSBwYXRvbG9naWNhbCBjYXNlczogRW1wdHkgU3RydWN0dXJlcyEKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbXQorCisgICAgICAgIGNsYXNzIFkoVW5pb24pOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbXQorCisgICAgICAgICMgSXMgdGhpcyByZWFsbHkgdGhlIGNvcnJlY3QgYWxpZ25tZW50LCBvciBzaG91bGQgaXQgYmUgMD8KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGFsaWdubWVudChYKSA9PSBhbGlnbm1lbnQoWSkgPT0gMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNpemVvZihYKSA9PSBzaXplb2YoWSkgPT0gMCkKKworICAgICAgICBjbGFzcyBYWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgWCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBYKV0KKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhbGlnbm1lbnQoWFgpLCAxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWFgpLCAwKQorCisgICAgZGVmIHRlc3RfZmllbGRzKHNlbGYpOgorICAgICAgICAjIHRlc3QgdGhlIG9mZnNldCBhbmQgc2l6ZSBhdHRyaWJ1dGVzIG9mIFN0cnVjdHVyZS9Vbm9pbiBmaWVsZHMuCisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfY2hhcildCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC54Lm9mZnNldCwgMCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC54LnNpemUsIHNpemVvZihjX2ludCkpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC55Lm9mZnNldCwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC55LnNpemUsIHNpemVvZihjX2NoYXIpKQorCisgICAgICAgICMgcmVhZG9ubHkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBYLngsICJvZmZzZXQiLCA5MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBYLngsICJzaXplIiwgOTIpCisKKyAgICAgICAgY2xhc3MgWChVbmlvbik6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCBjX2NoYXIpXQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueC5vZmZzZXQsIDApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueC5zaXplLCBzaXplb2YoY19pbnQpKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueS5vZmZzZXQsIDApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueS5zaXplLCBzaXplb2YoY19jaGFyKSkKKworICAgICAgICAjIHJlYWRvbmx5CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgWC54LCAib2Zmc2V0IiwgOTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgWC54LCAic2l6ZSIsIDkyKQorCisgICAgICAgICMgWFhYIFNob3VsZCB3ZSBjaGVjayBuZXN0ZWQgZGF0YSB0eXBlcyBhbHNvPworICAgICAgICAjIG9mZnNldCBpcyBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIGNsYXNzLi4uCisKKyAgICBkZWYgdGVzdF9wYWNrZWQoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2xvbmdsb25nKV0KKyAgICAgICAgICAgIF9wYWNrXyA9IDEKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIDkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFguYi5vZmZzZXQsIDEpCisKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfbG9uZ2xvbmcpXQorICAgICAgICAgICAgX3BhY2tfID0gMgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIDEwKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLmIub2Zmc2V0LCAyKQorCisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2xvbmdsb25nKV0KKyAgICAgICAgICAgIF9wYWNrXyA9IDQKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCAxMikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5iLm9mZnNldCwgNCkKKworICAgICAgICBpbXBvcnQgc3RydWN0CisgICAgICAgIGxvbmdsb25nX3NpemUgPSBzdHJ1Y3QuY2FsY3NpemUoInEiKQorICAgICAgICBsb25nbG9uZ19hbGlnbiA9IHN0cnVjdC5jYWxjc2l6ZSgiYnEiKSAtIGxvbmdsb25nX3NpemUKKworICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19sb25nbG9uZyldCisgICAgICAgICAgICBfcGFja18gPSA4CisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBsb25nbG9uZ19hbGlnbiArIGxvbmdsb25nX3NpemUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFguYi5vZmZzZXQsIG1pbig4LCBsb25nbG9uZ19hbGlnbikpCisKKworICAgICAgICBkID0geyJfZmllbGRzXyI6IFsoImEiLCAiYiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCAicSIpXSwKKyAgICAgICAgICAgICAiX3BhY2tfIjogLTF9CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHR5cGUoU3RydWN0dXJlKSwgIlgiLCAoU3RydWN0dXJlLCksIGQpCisKKyAgICBkZWYgdGVzdF9pbml0aWFsaXplcnMoc2VsZik6CisgICAgICAgIGNsYXNzIFBlcnNvbihTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJuYW1lIiwgY19jaGFyKjYpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJhZ2UiLCBjX2ludCldCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBQZXJzb24sIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBQZXJzb24sICJhc2xka2phc2xrZGphc2xrZGoiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFBlcnNvbiwgIk5hbWUiLCAiSEkiKQorCisgICAgICAgICMgc2hvcnQgZW5vdWdoCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFBlcnNvbigiMTIzNDUiLCA1KS5uYW1lLCAiMTIzNDUiKQorICAgICAgICAjIGV4YWN0IGZpdAorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChQZXJzb24oIjEyMzQ1NiIsIDUpLm5hbWUsICIxMjM0NTYiKQorICAgICAgICAjIHRvbyBsb25nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIFBlcnNvbiwgIjEyMzQ1NjciLCA1KQorCisgICAgCisgICAgZGVmIHRlc3Rfa2V5d29yZF9pbml0aWFsaXplcnMoc2VsZik6CisgICAgICAgIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksICgieSIsIGNfaW50KV0KKyAgICAgICAgcHQgPSBQT0lOVCgxLCAyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgocHQueCwgcHQueSksICgxLCAyKSkKKworICAgICAgICBwdCA9IFBPSU5UKHk9MiwgeD0xKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgocHQueCwgcHQueSksICgxLCAyKSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfZmllbGRfdHlwZXMoc2VsZik6CisgICAgICAgIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgUE9JTlQsICJfZmllbGRzXyIsIFsoIngiLCAxKSwgKCJ5IiwgMildKQorCisgICAgZGVmIHRlc3RfaW50YXJyYXlfZmllbGRzKHNlbGYpOgorICAgICAgICBjbGFzcyBTb21lSW50cyhTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQgKiA0KV0KKworICAgICAgICAjIGNhbiB1c2UgdHVwbGUgdG8gaW5pdGlhbGl6ZSBhcnJheSAoYnV0IG5vdCBsaXN0ISkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoU29tZUludHMoKDEsIDIpKS5hWzpdLCBbMSwgMiwgMCwgMF0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFNvbWVJbnRzKCgxLCAyLCAzLCA0KSkuYVs6XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICAjIHRvbyBsb25nCisgICAgICAgICMgWFhYIFNob3VsZCByYWlzZSBWYWx1ZUVycm9yPywgbm90IFJ1bnRpbWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIFNvbWVJbnRzLCAoMSwgMiwgMywgNCwgNSkpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfaW5pdGlhbGl6ZXJzKHNlbGYpOgorICAgICAgICAjIHRlc3QgaW5pdGlhbGl6aW5nIG5lc3RlZCBzdHJ1Y3R1cmVzCisgICAgICAgIGNsYXNzIFBob25lKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImFyZWFjb2RlIiwgY19jaGFyKjYpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJudW1iZXIiLCBjX2NoYXIqMTIpXQorCisgICAgICAgIGNsYXNzIFBlcnNvbihTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJuYW1lIiwgY19jaGFyICogMTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJwaG9uZSIsIFBob25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYWdlIiwgY19pbnQpXQorCisgICAgICAgIHAgPSBQZXJzb24oIlNvbWVvbmUiLCAoIjEyMzQiLCAiNTY3OCIpLCA1KQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAubmFtZSwgIlNvbWVvbmUiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwLnBob25lLmFyZWFjb2RlLCAiMTIzNCIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAucGhvbmUubnVtYmVyLCAiNTY3OCIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAuYWdlLCA1KQorCisgICAgZGVmIHRlc3Rfc3RydWN0dXJlc193aXRoX3djaGFyKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjX3djaGFyCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gIyBubyB1bmljb2RlCisKKyAgICAgICAgY2xhc3MgUGVyc29uVyhTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJuYW1lIiwgY193Y2hhciAqIDEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYWdlIiwgY19pbnQpXQorCisgICAgICAgIHAgPSBQZXJzb25XKHUiU29tZW9uZSIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAubmFtZSwgIlNvbWVvbmUiKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFBlcnNvblcodSIxMjM0NTY3ODkwIikubmFtZSwgdSIxMjM0NTY3ODkwIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoUGVyc29uVyh1IjEyMzQ1Njc4OTAxIikubmFtZSwgdSIxMjM0NTY3ODkwMSIpCisgICAgICAgICMgZXhhY3QgZml0CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFBlcnNvblcodSIxMjM0NTY3ODkwMTIiKS5uYW1lLCB1IjEyMzQ1Njc4OTAxMiIpCisgICAgICAgICN0b28gbG9uZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBQZXJzb25XLCB1IjEyMzQ1Njc4OTAxMjMiKQorCisgICAgZGVmIHRlc3RfaW5pdF9lcnJvcnMoc2VsZik6CisgICAgICAgIGNsYXNzIFBob25lKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImFyZWFjb2RlIiwgY19jaGFyKjYpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJudW1iZXIiLCBjX2NoYXIqMTIpXQorCisgICAgICAgIGNsYXNzIFBlcnNvbihTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJuYW1lIiwgY19jaGFyICogMTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJwaG9uZSIsIFBob25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYWdlIiwgY19pbnQpXQorCisgICAgICAgIGNscywgbXNnID0gc2VsZi5nZXRfZXhjZXB0KFBlcnNvbiwgIlNvbWVvbmUiLCAoMSwgMikpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNscywgUnVudGltZUVycm9yKQorICAgICAgICAjIEluIFB5dGhvbiAyLjUsIEV4Y2VwdGlvbiBpcyBhIG5ldy1zdHlsZSBjbGFzcywgYW5kIHRoZSByZXByIGNoYW5nZWQKKyAgICAgICAgaWYgaXNzdWJjbGFzcyhFeGNlcHRpb24sIG9iamVjdCk6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBob25lKSA8Y2xhc3MgJ2V4Y2VwdGlvbnMuVHlwZUVycm9yJz46ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QsIGludCBmb3VuZCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBob25lKSBleGNlcHRpb25zLlR5cGVFcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCwgaW50IGZvdW5kIikKKworICAgICAgICBjbHMsIG1zZyA9IHNlbGYuZ2V0X2V4Y2VwdChQZXJzb24sICJTb21lb25lIiwgKCJhIiwgImIiLCAiYyIpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjbHMsIFJ1bnRpbWVFcnJvcikKKyAgICAgICAgaWYgaXNzdWJjbGFzcyhFeGNlcHRpb24sIG9iamVjdCk6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBob25lKSA8Y2xhc3MgJ2V4Y2VwdGlvbnMuVmFsdWVFcnJvcic+OiB0b28gbWFueSBpbml0aWFsaXplcnMiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobXNnLCAiKFBob25lKSBleGNlcHRpb25zLlZhbHVlRXJyb3I6IHRvbyBtYW55IGluaXRpYWxpemVycyIpCisKKworICAgIGRlZiBnZXRfZXhjZXB0KHNlbGYsIGZ1bmMsICphcmdzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYygqYXJncykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZGV0YWlsOgorICAgICAgICAgICAgcmV0dXJuIGRldGFpbC5fX2NsYXNzX18sIHN0cihkZXRhaWwpCisgICAgICAgICAgICAgICAgCisKKyMjICAgIGRlZiB0ZXN0X3N1YmNsYXNzX2NyZWF0aW9uKHNlbGYpOgorIyMgICAgICAgIG1ldGEgPSB0eXBlKFN0cnVjdHVyZSkKKyMjICAgICAgICAjIHNhbWUgYXMgJ2NsYXNzIFgoU3RydWN0dXJlKTogcGFzcycKKyMjICAgICAgICAjIGZhaWxzLCBzaW5jZSB3ZSBuZWVkIGVpdGhlciBhIF9maWVsZHNfIG9yIGEgX2Fic3RyYWN0XyBhdHRyaWJ1dGUKKyMjICAgICAgICBjbHMsIG1zZyA9IHNlbGYuZ2V0X2V4Y2VwdChtZXRhLCAiWCIsIChTdHJ1Y3R1cmUsKSwge30pCisjIyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGNscywgbXNnKSwKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXR0cmlidXRlRXJyb3IsICJjbGFzcyBtdXN0IGRlZmluZSBhICdfZmllbGRzXycgYXR0cmlidXRlIikpCisKKyAgICBkZWYgdGVzdF9hYnN0cmFjdF9jbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2Fic3RyYWN0XyA9ICJzb21ldGhpbmciCisgICAgICAgICMgdHJ5ICdYKCknCisgICAgICAgIGNscywgbXNnID0gc2VsZi5nZXRfZXhjZXB0KGV2YWwsICJYKCkiLCBsb2NhbHMoKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGNscywgbXNnKSwgKFR5cGVFcnJvciwgImFic3RyYWN0IGNsYXNzIikpCisKKyAgICBkZWYgdGVzdF9tZXRob2RzKHNlbGYpOgorIyMgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyMjICAgICAgICAgICAgX2ZpZWxkc18gPSBbXQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygiaW5fZGxsIiBpbiBkaXIodHlwZShTdHJ1Y3R1cmUpKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCJmcm9tX2FkZHJlc3MiIGluIGRpcih0eXBlKFN0cnVjdHVyZSkpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoImluX2RsbCIgaW4gZGlyKHR5cGUoU3RydWN0dXJlKSkpCisKK2NsYXNzIFBvaW50ZXJNZW1iZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgIyBhIFN0cnVjdHVyZSB3aXRoIGEgUE9JTlRFUiBmaWVsZAorICAgICAgICBjbGFzcyBTKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImFycmF5IiwgUE9JTlRFUihjX2ludCkpXQorCisgICAgICAgIHMgPSBTKCkKKyAgICAgICAgIyBXZSBjYW4gYXNzaWduIGFycmF5cyBvZiB0aGUgY29ycmVjdCB0eXBlCisgICAgICAgIHMuYXJyYXkgPSAoY19pbnQgKiAzKSgxLCAyLCAzKQorICAgICAgICBpdGVtcyA9IFtzLmFycmF5W2ldIGZvciBpIGluIHJhbmdlKDMpXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChpdGVtcywgWzEsIDIsIDNdKQorCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBhcmUgYnVncywgYnV0IGFyZSBpbmNsdWRlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaXR0ZXN0cworICAgICAgICAjIGFsc28gZGVzY3JpYmUgdGhlIGN1cnJlbnQgYmVoYXZpb3VyLgorICAgICAgICAjCisgICAgICAgICMgVGhpcyBmYWlscyB3aXRoIFN5c3RlbUVycm9yOiBiYWQgYXJnIHRvIGludGVybmFsIGZ1bmN0aW9uCisgICAgICAgICMgb3Igd2l0aCBJbmRleEVycm9yICh3aXRoIGEgcGF0Y2ggSSBoYXZlKQorCisgICAgICAgIHMuYXJyYXlbMF0gPSA0MgorCisgICAgICAgIGl0ZW1zID0gW3MuYXJyYXlbaV0gZm9yIGkgaW4gcmFuZ2UoMyldCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGl0ZW1zLCBbNDIsIDIsIDNdKQorCisgICAgICAgIHMuYXJyYXlbMF0gPSAxCisKKyMjICAgICAgICBzLmFycmF5WzFdID0gNDIKKworICAgICAgICBpdGVtcyA9IFtzLmFycmF5W2ldIGZvciBpIGluIHJhbmdlKDMpXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChpdGVtcywgWzEsIDIsIDNdKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQorCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjM5NzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weQpAQCAtMCwwICsxLDExNSBAQAorIyBjb2Rpbmc6IGxhdGluLTEKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGN0eXBlcworCit0cnk6CisgICAgY3R5cGVzLmNfd2NoYXIKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGltcG9ydCBfY3R5cGVzX3Rlc3QKKyAgICBkbGwgPSBjdHlwZXMuY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICB3Y3NsZW4gPSBkbGwubXlfd2NzbGVuCisgICAgd2NzbGVuLmFyZ3R5cGVzID0gW2N0eXBlcy5jX3djaGFyX3BdCisKKworICAgIGNsYXNzIFVuaWNvZGVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgICAgIHNlbGYucHJldl9jb252X21vZGUgPSBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKworICAgICAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgqc2VsZi5wcmV2X2NvbnZfbW9kZSkKKworICAgICAgICBkZWYgdGVzdF9hc2NpaV9zdHJpY3Qoc2VsZik6CisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKyAgICAgICAgICAgICMgbm8gY29udmVyc2lvbnMgdGFrZSBwbGFjZSB3aXRoIHVuaWNvZGUgYXJndW1lbnRzCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCisgICAgICAgICAgICAjIHN0cmluZyBhcmdzIGFyZSBjb252ZXJ0ZWQKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbigiYWJjIiksIDMpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoY3R5cGVzLkFyZ3VtZW50RXJyb3IsIHdjc2xlbiwgImFi5CIpCisKKyAgICAgICAgZGVmIHRlc3RfYXNjaWlfcmVwbGFjZShzZWxmKToKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbigiYWJjIiksIDMpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Y3NsZW4oImFi5CIpLCAzKQorCisgICAgICAgIGRlZiB0ZXN0X2FzY2lpX2lnbm9yZShzZWxmKToKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJpZ25vcmUiKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQorICAgICAgICAgICAgIyBpZ25vcmUgZXJyb3IgbW9kZSBza2lwcyBub24tYXNjaWkgY2hhcmFjdGVycworICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKCJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbigi5Pb83yIpLCAwKQorCisgICAgICAgIGRlZiB0ZXN0X2xhdGluMV9zdHJpY3Qoc2VsZik6CisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgibGF0aW4tMSIsICJzdHJpY3QiKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKCJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbigi5Pb83yIpLCA0KQorCisgICAgICAgIGRlZiB0ZXN0X2J1ZmZlcnMoc2VsZik6CisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKyAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoImFiYyIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oYnVmKSwgMysxKQorCisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCisgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYuT2/CIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOl0sIHUiYWJcdUZGRkRcdUZGRkRcdUZGRkRcMCIpCisKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJpZ25vcmUiKQorICAgICAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigiYWLk9vwiKQorICAgICAgICAgICAgIyBpcyB0aGF0IGNvcnJlY3Q/IG5vdCBzdXJlLiAgQnV0IHdpdGggJ2lnbm9yZScsIHlvdSBnZXQgd2hhdCB5b3UgcGF5IGZvci4uCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOl0sIHUiYWJcMFwwXDBcMCIpCisKKyAgICBpbXBvcnQgX2N0eXBlc190ZXN0CisgICAgZnVuYyA9IGN0eXBlcy5jZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKS5fdGVzdGZ1bmNfcF9wCisKKyAgICBjbGFzcyBTdHJpbmdUZXN0Q2FzZShVbmljb2RlVGVzdENhc2UpOgorICAgICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICAgICBzZWxmLnByZXZfY29udl9tb2RlID0gY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCisgICAgICAgICAgICBmdW5jLmFyZ3R5cGVzID0gW2N0eXBlcy5jX2NoYXJfcF0KKyAgICAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGN0eXBlcy5jX2NoYXJfcAorCisgICAgICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCpzZWxmLnByZXZfY29udl9tb2RlKQorICAgICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IE5vbmUKKyAgICAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGN0eXBlcy5jX2ludAorCisgICAgICAgIGRlZiB0ZXN0X2FzY2lpX3JlcGxhY2Uoc2VsZik6CisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGZ1bmModSJhYmMiKSwgImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjdHlwZXMuQXJndW1lbnRFcnJvciwgZnVuYywgdSJhYuQiKQorCisgICAgICAgIGRlZiB0ZXN0X2FzY2lpX2lnbm9yZShzZWxmKToKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJpZ25vcmUiKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZnVuYygiYWJjIiksICJhYmMiKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZnVuYyh1ImFiYyIpLCAiYWJjIikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGZ1bmModSLk9vzfIiksICIiKQorCisgICAgICAgIGRlZiB0ZXN0X2FzY2lpX3JlcGxhY2Uoc2VsZik6CisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKCJhYmMiKSwgImFiYyIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKHUiYWJjIiksICJhYmMiKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZnVuYyh1IuT2/N8iKSwgIj8/Pz8iKQorCisgICAgICAgIGRlZiB0ZXN0X2J1ZmZlcnMoc2VsZik6CisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKyAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcih1ImFiYyIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oYnVmKSwgMysxKQorCisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCisgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYuT2/CIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOl0sICJhYj8/P1wwIikKKworICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgImlnbm9yZSIpCisgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYuT2/CIpCisgICAgICAgICAgICAjIGlzIHRoYXQgY29ycmVjdD8gbm90IHN1cmUuICBCdXQgd2l0aCAnaWdub3JlJywgeW91IGdldCB3aGF0IHlvdSBwYXkgZm9yLi4KKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6XSwgImFiXDBcMFwwXDAiKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjVmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YWx1ZXMucHkKQEAgLTAsMCArMSw4MiBAQAorIiIiCitBIHRlc3RjYXNlIHdoaWNoIGFjY2Vzc2VzICp2YWx1ZXMqIGluIGEgZGxsLgorIiIiCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworaW1wb3J0IF9jdHlwZXNfdGVzdAorCitjbGFzcyBWYWx1ZXNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hbl9pbnRlZ2VyKHNlbGYpOgorICAgICAgICBjdGRsbCA9IGNkbGwubG9hZChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIGFuX2ludGVnZXIgPSBjX2ludC5pbl9kbGwoY3RkbGwsICJhbl9pbnRlZ2VyIikKKyAgICAgICAgeCA9IGFuX2ludGVnZXIudmFsdWUKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeCwgY3RkbGwuZ2V0X2FuX2ludGVnZXIoKSkKKyAgICAgICAgYW5faW50ZWdlci52YWx1ZSAqPSAyCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHgqMiwgY3RkbGwuZ2V0X2FuX2ludGVnZXIoKSkKKworICAgIGRlZiB0ZXN0X3VuZGVmaW5lZChzZWxmKToKKyAgICAgICAgY3RkbGwgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX2ludC5pbl9kbGwsIGN0ZGxsLCAiVW5kZWZpbmVkX1N5bWJvbCIpCisKKyAgICBjbGFzcyBXaW5fVmFsdWVzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAiIiJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aGVuIHB5dGhvbiBpdHNlbGYgaXMgYSBkbGwvc2hhcmVkIGxpYnJhcnkiIiIKKworICAgICAgICBkZWYgdGVzdF9vcHRpbWl6ZWZsYWcoc2VsZik6CisgICAgICAgICAgICAjIFRoaXMgdGVzdCBhY2Nlc3NlcyB0aGUgUHlfT3B0aW1pemVGbGFnIGludGdlciwgd2hpY2ggaXMKKyAgICAgICAgICAgICMgZXhwb3J0ZWQgYnkgdGhlIFB5dGhvbiBkbGwuCisKKyAgICAgICAgICAgICMgSXQncyB2YWx1ZSBpcyBzZXQgZGVwZW5kaW5nIG9uIHRoZSAtTyBhbmQgLU9PIGZsYWdzOgorICAgICAgICAgICAgIyBpZiBub3QgZ2l2ZW4sIGl0IGlzIDAgYW5kIF9fZGVidWdfXyBpcyAxLgorICAgICAgICAgICAgIyBJZiAtTyBpcyBnaXZlbiwgdGhlIGZsYWcgaXMgMSwgZm9yIC1PTyBpdCBpcyAyLgorICAgICAgICAgICAgIyBkb2NzdHJpbmdzIGFyZSBhbHNvIHJlbW92ZWQgaW4gdGhlIGxhdHRlciBjYXNlLgorICAgICAgICAgICAgb3B0ID0gY19pbnQuaW5fZGxsKHB5ZGxsLCAiUHlfT3B0aW1pemVGbGFnIikudmFsdWUKKyAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvcHQsIDApCisgICAgICAgICAgICBlbGlmIFZhbHVlc1Rlc3RDYXNlLl9fZG9jX18gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3B0LCAxKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvcHQsIDIpCisKKyAgICAgICAgZGVmIHRlc3RfZnJvemVudGFibGUoc2VsZik6CisgICAgICAgICAgICAjIFB5dGhvbiBleHBvcnRzIGEgUHlJbXBvcnRfRnJvemVuTW9kdWxlcyBzeW1ib2wuIFRoaXMgaXMgYQorICAgICAgICAgICAgIyBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHN0cnVjdCBfZnJvemVuIGVudHJpZXMuICBUaGUgZW5kIG9mIHRoZQorICAgICAgICAgICAgIyBhcnJheSBpcyBtYXJrZWQgYnkgYW4gZW50cnkgY29udGFpbmluZyBhIE5VTEwgbmFtZSBhbmQgemVybworICAgICAgICAgICAgIyBzaXplLgorCisgICAgICAgICAgICAjIEluIHN0YW5kYXJkIFB5dGhvbiwgdGhpcyB0YWJsZSBjb250YWlucyBhIF9faGVsbG9fXworICAgICAgICAgICAgIyBtb2R1bGUsIGFuZCBhIF9fcGhlbGxvX18gcGFja2FnZSBjb250YWluaW5nIGEgc3BhbQorICAgICAgICAgICAgIyBtb2R1bGUuCisgICAgICAgICAgICBjbGFzcyBzdHJ1Y3RfZnJvemVuKFN0cnVjdHVyZSk6CisgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJuYW1lIiwgY19jaGFyX3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiY29kZSIsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgic2l6ZSIsIGNfaW50KV0KKyAgICAgICAgICAgIEZyb3plblRhYmxlID0gUE9JTlRFUihzdHJ1Y3RfZnJvemVuKQorCisgICAgICAgICAgICBmdCA9IEZyb3plblRhYmxlLmluX2RsbChweWRsbCwgIlB5SW1wb3J0X0Zyb3plbk1vZHVsZXMiKQorICAgICAgICAgICAgIyBmdCBpcyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdF9mcm96ZW4gZW50cmllczoKKyAgICAgICAgICAgIGl0ZW1zID0gW10KKyAgICAgICAgICAgIGZvciBlbnRyeSBpbiBmdDoKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgZGFuZ2Vyb3VzLiBXZSAqY2FuKiBpdGVyYXRlIG92ZXIgYSBwb2ludGVyLCBidXQKKyAgICAgICAgICAgICAgICAjIHRoZSBsb29wIHdpbGwgbm90IHRlcm1pbmF0ZSAobWF5YmUgd2l0aCBhbiBhY2Nlc3MKKyAgICAgICAgICAgICAgICAjIHZpb2xhdGlvbjstKSBiZWNhdXNlIHRoZSBwb2ludGVyIGluc3RhbmNlIGhhcyBubyBzaXplLgorICAgICAgICAgICAgICAgIGlmIGVudHJ5Lm5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoKGVudHJ5Lm5hbWUsIGVudHJ5LnNpemUpKQorICAgICAgICAgICAgaW1wb3J0IHN5cworICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPj0gKDIsIDMpOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gWygiX19oZWxsb19fIiwgMTA0KSwgKCJfX3BoZWxsb19fIiwgLTEwNCksICgiX19waGVsbG9fXy5zcGFtIiwgMTA0KV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbKCJfX2hlbGxvX18iLCAxMDApLCAoIl9fcGhlbGxvX18iLCAtMTAwKSwgKCJfX3BoZWxsb19fLnNwYW0iLCAxMDApXQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaXRlbXMsIGV4cGVjdGVkKQorCisgICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgX3BvaW50ZXJfdHlwZV9jYWNoZQorICAgICAgICAgICAgZGVsIF9wb2ludGVyX3R5cGVfY2FjaGVbc3RydWN0X2Zyb3plbl0KKworICAgICAgICBkZWYgdGVzdF91bmRlZmluZWQoc2VsZik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX2ludC5pbl9kbGwsIHB5ZGxsLCAiVW5kZWZpbmVkX1N5bWJvbCIpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2N2U2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weQpAQCAtMCwwICsxLDY0IEBACisjIFdpbmRvd3Mgc3BlY2lmaWMgdGVzdHMKKworZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCB1bml0dGVzdCwgc3lzCisKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKKworaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisKKyAgICBjbGFzcyBXaW5kb3dzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBkZWYgdGVzdF9jYWxsY29udl8xKHNlbGYpOgorICAgICAgICAgICAgIyBUZXN0aW5nIHN0ZGNhbGwgZnVuY3Rpb24KKworICAgICAgICAgICAgSXNXaW5kb3cgPSB3aW5kbGwudXNlcjMyLklzV2luZG93CisgICAgICAgICAgICAjIFZhbHVlRXJyb3I6IFByb2NlZHVyZSBwcm9iYWJseSBjYWxsZWQgd2l0aCBub3QgZW5vdWdoIGFyZ3VtZW50cyAoNCBieXRlcyBtaXNzaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgSXNXaW5kb3cpCisKKyAgICAgICAgICAgICMgVGhpcyBvbmUgc2hvdWxkIHN1Y2NlZWVkLi4uCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBJc1dpbmRvdygwKSkKKworICAgICAgICAgICAgIyBWYWx1ZUVycm9yOiBQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggdG9vIG1hbnkgYXJndW1lbnRzICg4IGJ5dGVzIGluIGV4Y2VzcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIElzV2luZG93LCAwLCAwLCAwKQorCisgICAgICAgIGRlZiB0ZXN0X2NhbGxjb252XzIoc2VsZik6CisgICAgICAgICAgICAjIENhbGxpbmcgc3RkY2FsbCBmdW5jdGlvbiBhcyBjZGVjbAorCisgICAgICAgICAgICBJc1dpbmRvdyA9IGNkbGwudXNlcjMyLklzV2luZG93CisKKyAgICAgICAgICAgICMgVmFsdWVFcnJvcjogUHJvY2VkdXJlIGNhbGxlZCB3aXRoIG5vdCBlbm91Z2ggYXJndW1lbnRzICg0IGJ5dGVzIG1pc3NpbmcpCisgICAgICAgICAgICAjIG9yIHdyb25nIGNhbGxpbmcgY29udmVudGlvbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgSXNXaW5kb3csIE5vbmUpCisKKyAgICAgICAgZGVmIHRlc3RfU0VIKHNlbGYpOgorICAgICAgICAgICAgIyBDYWxsIGZ1bmN0aW9ucyB3aXRoIGludmFsaWQgYXJndW1lbnRzLCBhbmQgbWFrZSBzdXJlIHRoYXQgYWNjZXNzIHZpb2xhdGlvbnMKKyAgICAgICAgICAgICMgYXJlIHRyYXBwZWQgYW5kIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgTm9ybWFsbHksIGluIGEgZGVidWcgYnVpbGQgb2YgdGhlIF9jdHlwZXMgZXh0ZW5zaW9uCisgICAgICAgICAgICAjIG1vZHVsZSwgZXhjZXB0aW9ucyBhcmUgbm90IHRyYXBwZWQsIHNvIHdlIGNhbiBvbmx5IHJ1bgorICAgICAgICAgICAgIyB0aGlzIHRlc3QgaW4gYSByZWxlYXNlIGJ1aWxkLgorICAgICAgICAgICAgaW1wb3J0IHN5cworICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc3lzLCAiZ2V0b2JqZWN0cyIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFdpbmRvd3NFcnJvciwgd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEsIDMyKQorCitjbGFzcyBTdHJ1Y3R1cmVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICAgICBkZWYgdGVzdF9zdHJ1Y3RfYnlfdmFsdWUoc2VsZik6CisgICAgICAgICAgICBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfbG9uZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19sb25nKV0KKworICAgICAgICAgICAgY2xhc3MgUkVDVChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygibGVmdCIsIGNfbG9uZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ0b3AiLCBjX2xvbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgicmlnaHQiLCBjX2xvbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYm90dG9tIiwgY19sb25nKV0KKworICAgICAgICAgICAgZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKworICAgICAgICAgICAgcHQgPSBQT0lOVCgxMCwgMTApCisgICAgICAgICAgICByZWN0ID0gUkVDVCgwLCAwLCAyMCwgMjApCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgxLCBkbGwuUG9pbnRJblJlY3QoYnlyZWYocmVjdCksIHB0KSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvd2ludHlwZXMucHkgYi9MaWIvY3R5cGVzL3dpbnR5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjc5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3dpbnR5cGVzLnB5CkBAIC0wLDAgKzEsOTcgQEAKKyMgWFhYIFRoaXMgbW9kdWxlIG5lZWRzIGNsZWFudXAuCisKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK0RXT1JEID0gY191bG9uZworV09SRCA9IGNfdXNob3J0CitCWVRFID0gY19ieXRlCisKK1VMT05HID0gY191bG9uZworTE9ORyA9IGNfbG9uZworCitMQVJHRV9JTlRFR0VSID0gY19sb25nbG9uZworVUxBUkdFX0lOVEVHRVIgPSBjX3Vsb25nbG9uZworCisKK0hBTkRMRSA9IGNfdWxvbmcgIyBpbiB0aGUgaGVhZGVyIGZpbGVzOiB2b2lkICoKKworSFdORCA9IEhBTkRMRQorSERDID0gSEFORExFCitITU9EVUxFID0gSEFORExFCitISU5TVEFOQ0UgPSBIQU5ETEUKK0hSR04gPSBIQU5ETEUKK0hUQVNLID0gSEFORExFCitIS0VZID0gSEFORExFCitIUEVOID0gSEFORExFCitIR0RJT0JKID0gSEFORExFCitITUVOVSA9IEhBTkRMRQorCitMQ0lEID0gRFdPUkQKKworV1BBUkFNID0gY191aW50CitMUEFSQU0gPSBjX2xvbmcKKworQk9PTCA9IGNfbG9uZworVkFSSUFOVF9CT09MID0gY19zaG9ydAorCitMUENPTEVTVFIgPSBMUE9MRVNUUiA9IE9MRVNUUiA9IGNfd2NoYXJfcAorTFBDV1NUUiA9IExQV1NUUiA9IGNfd2NoYXJfcAorCitMUENTVFIgPSBMUFNUUiA9IGNfY2hhcl9wCisKK2NsYXNzIFJFQ1QoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoImxlZnQiLCBjX2xvbmcpLAorICAgICAgICAgICAgICAgICgidG9wIiwgY19sb25nKSwKKyAgICAgICAgICAgICAgICAoInJpZ2h0IiwgY19sb25nKSwKKyAgICAgICAgICAgICAgICAoImJvdHRvbSIsIGNfbG9uZyldCitSRUNUTCA9IFJFQ1QKKworY2xhc3MgUE9JTlQoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoIngiLCBjX2xvbmcpLAorICAgICAgICAgICAgICAgICgieSIsIGNfbG9uZyldCitQT0lOVEwgPSBQT0lOVAorCitjbGFzcyBTSVpFKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJjeCIsIGNfbG9uZyksCisgICAgICAgICAgICAgICAgKCJjeSIsIGNfbG9uZyldCitTSVpFTCA9IFNJWkUKKworZGVmIFJHQihyZWQsIGdyZWVuLCBibHVlKToKKyAgICByZXR1cm4gcmVkICsgKGdyZWVuIDw8IDgpICsgKGJsdWUgPDwgMTYpCisKK2NsYXNzIEZJTEVUSU1FKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJkd0xvd0RhdGVUaW1lIiwgRFdPUkQpLAorICAgICAgICAgICAgICAgICgiZHdIaWdoRGF0ZVRpbWUiLCBEV09SRCldCisKK2NsYXNzIE1TRyhTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygiaFduZCIsIEhXTkQpLAorICAgICAgICAgICAgICAgICgibWVzc2FnZSIsIGNfdWludCksCisgICAgICAgICAgICAgICAgKCJ3UGFyYW0iLCBXUEFSQU0pLAorICAgICAgICAgICAgICAgICgibFBhcmFtIiwgTFBBUkFNKSwKKyAgICAgICAgICAgICAgICAoInRpbWUiLCBEV09SRCksCisgICAgICAgICAgICAgICAgKCJwdCIsIFBPSU5UKV0KK01BWF9QQVRIID0gMjYwCisKK2NsYXNzIFdJTjMyX0ZJTkRfREFUQUEoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoImR3RmlsZUF0dHJpYnV0ZXMiLCBEV09SRCksCisgICAgICAgICAgICAgICAgKCJmdENyZWF0aW9uVGltZSIsIEZJTEVUSU1FKSwKKyAgICAgICAgICAgICAgICAoImZ0TGFzdEFjY2Vzc1RpbWUiLCBGSUxFVElNRSksCisgICAgICAgICAgICAgICAgKCJmdExhc3RXcml0ZVRpbWUiLCBGSUxFVElNRSksCisgICAgICAgICAgICAgICAgKCJuRmlsZVNpemVIaWdoIiwgRFdPUkQpLAorICAgICAgICAgICAgICAgICgibkZpbGVTaXplTG93IiwgRFdPUkQpLAorICAgICAgICAgICAgICAgICgiZHdSZXNlcnZlZDAiLCBEV09SRCksCisgICAgICAgICAgICAgICAgKCJkd1Jlc2VydmVkMSIsIERXT1JEKSwKKyAgICAgICAgICAgICAgICAoImNGaWxlTmFtZSIsIGNfY2hhciAqIE1BWF9QQVRIKSwKKyAgICAgICAgICAgICAgICAoImNBbHRlcm5hbWVGaWxlTmFtZSIsIGNfY2hhciAqIDE0KV0KKworY2xhc3MgV0lOMzJfRklORF9EQVRBVyhTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygiZHdGaWxlQXR0cmlidXRlcyIsIERXT1JEKSwKKyAgICAgICAgICAgICAgICAoImZ0Q3JlYXRpb25UaW1lIiwgRklMRVRJTUUpLAorICAgICAgICAgICAgICAgICgiZnRMYXN0QWNjZXNzVGltZSIsIEZJTEVUSU1FKSwKKyAgICAgICAgICAgICAgICAoImZ0TGFzdFdyaXRlVGltZSIsIEZJTEVUSU1FKSwKKyAgICAgICAgICAgICAgICAoIm5GaWxlU2l6ZUhpZ2giLCBEV09SRCksCisgICAgICAgICAgICAgICAgKCJuRmlsZVNpemVMb3ciLCBEV09SRCksCisgICAgICAgICAgICAgICAgKCJkd1Jlc2VydmVkMCIsIERXT1JEKSwKKyAgICAgICAgICAgICAgICAoImR3UmVzZXJ2ZWQxIiwgRFdPUkQpLAorICAgICAgICAgICAgICAgICgiY0ZpbGVOYW1lIiwgY193Y2hhciAqIE1BWF9QQVRIKSwKKyAgICAgICAgICAgICAgICAoImNBbHRlcm5hbWVGaWxlTmFtZSIsIGNfd2NoYXIgKiAxNCldCg==