ZGlmZiAtLWdpdCBhL3NyYy9hbWFzc3Byb3RvY29sLnB5IGIvc3JjL2FtYXNzcHJvdG9jb2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1NmZlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9hbWFzc3Byb3RvY29sLnB5CkBAIC0wLDAgKzEsMzg5IEBACisjIS91c3IvYmluL3B5dGhvbg0KKyMgLSotIGNvZGluZzogZ2JrIC0qLSANCisNCitpbXBvcnQgc3lzLGNvZGVjcyxzdHJ1Y3QNCisNCitJRlRfTlVMTD0wDQorSUZUX1VMT05HPTENCitJRlRfQllURT0yDQorSUZUX1VTSE9SVD0zDQorSUZUX0RBVEVUSU1FPTQNCitJRlRfQlVGRkVSPTUNCitJRlRfU1RSSU5HPTYNCitJRlRfTE9ORz03DQorDQorIyAoMCwwLDEsSUZUX0JZVEUsMCwibXNndHlwZSIsIs/7z6LC6yIpLA0KKw0KK0ZMRF9OT19JRFg9MA0KK0ZMRF9MRU5HVEhfSURYPTINCitGTERfVFlQRV9JRFg9Mw0KK0ZMRF9GTEFHX0lEWD00DQorRkxEX05BTUVfSURYPTUNCitGTERfREVTQ19JRFg9Ng0KKw0KK0hERmllbGRzRGVmID0gWw0KKygxLDAsMCxJRlRfTlVMTCwwLCJleHRlbmQiLCLAqdW50/K38SIpLA0KKygyLDAsNCxJRlRfVUxPTkcsMCwidGVybWluYWxzbiIsIiDW1bbL0PLB0LrFIiksDQorKDMsMCwyLElGVF9VU0hPUlQsMCwiYWRkcmVzcyIsIkNBTrXY1rciKSwNCisoNCwwLDQsSUZUX1VMT05HLDAsImNhcmRudW1iZXIiLCK/qLrFIiksDQorKDUsMCwxLElGVF9CWVRFLDAsImluZGV4b2ZldyIsIiDHrrD8y/fS/SIpLA0KKyg2LDAsMixJRlRfVVNIT1JULDAsInRyYWNlb2ZldyIsIiDHrrD8wffLrrrFIiksDQorKDcsMCw0LElGVF9MT05HLDAsImFtb3VudCIsIiC9u9LXvfC27iIpLA0KKyg4LDAsNCxJRlRfTE9ORywwLCJhZGRpdGlvbmFsYW1vdW50MSIsIri9vNO98LbuIiksDQorKDksMCw0LElGVF9VTE9ORywwLCJ0cmFjZW9mcG9zIiwiUE9TwffLrrrFIiksDQorKDEwLDAsNCxJRlRfVUxPTkcsMCwib3JndHJhbnN0cmFjZSIsItStvbvS18H3y666xSIpLA0KKygxMSwwLDcsSUZUX0RBVEVUSU1FLDAsImRhdGV0aW1lIiwivbvS18jVxtq6zcqxvOQiKSwNCisoMTIsMCwxLElGVF9CWVRFLDAsInJlc3BvbnNlY29kZSIsIs/s06bC6yIpLA0KKygxMywwLDIsSUZUX1VTSE9SVCwwLCJ0ZXJtaW5hbGlkIiwi1tW2y7rFIiksDQorKDE0LDAsMixJRlRfVVNIT1JULDAsInRlcm1pbmFsdHlwZSIsItbVtsvA4NDNIiksDQorKDE1LDAsMixJRlRfVVNIT1JULDAsIm1lcmNoYW50aWQiLCLJzLunKM34teMpusUiKSwNCisoMTYsMCw0LElGVF9VTE9ORywwLCJvcGVyYXRvcmlkIiwistnX99SxusUiKSwNCisoMTcsMCw4LElGVF9CVUZGRVIsMCwicGluIiwiuPbIy8q2sfDC61BJTiIpLA0KKygxOCwwLDQsSUZUX1VMT05HLDAsInZlcm9mbGlzdCIsIrraw/u1pbDmsb4iKSwNCisoMTksMCw0LElGVF9VTE9ORywwLCJtYW5hZ2VmZWUiLCK9u9LXxfq0zrrFKNTdsrvTwykiKSwNCisoMjAsMCwzNjAsSUZUX0JVRkZFUiwyLCJhZGRpdGlvbmFsZGF0YTEiLCK4vbzT0MXPojEiKSwNCisoMjEsMCw1MjgsSUZUX0JVRkZFUiwyLCJhZGRpdGlvbmFsZGF0YTIiLCK4vbzT0MXPojIiKSwNCisoMjIsMCw1MjgsSUZUX1NUUklORywyLCJhZGRpdGlvbmFsZGF0YTMiLCK4vbzT0MXPojMiKSwNCisoMjMsMCw1MjgsSUZUX1NUUklORywyLCJhZGRpdGlvbmFsZGF0YTQiLCK4vbzT0MXPojQiKSwNCisoMjQsMCwyLElGVF9VU0hPUlQsMCwibWFjIiwiz/vPosjP1qTC6yIpDQorXQ0KKw0KK2NsYXNzIEhEUGFjazoNCisgICAgJycnILvjtuAgODU4MyDQrdLpsPwgJycnDQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToNCisgICAgICAgIHNlbGYubXNnX3R5cGUgPSAwDQorICAgICAgICBzZWxmLnZhbHVlPXt9DQorICAgICAgICBzZWxmLmZpZWxkX2lkeD17fQ0KKyAgICAgICAgc2VsZi5maWVsZF9uYW1lPXt9DQorICAgICAgICBzZWxmLm1zZ3R5cGUgPSAwDQorICAgICAgICANCisgICAgICAgIHNlbGYubG9hZF9jb25maWcoKQ0KKyAgICAgICAgDQorICAgIGRlZiBfX2VxX18oc2VsZixvdGhlcik6DQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlcixIRFBhY2spOg0KKyAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KKyAgICAgICAgcmV0dXJuIHNlbGYuY29tcGFyZShvdGhlcikNCisgICAgZGVmIF9fbmVfXyhzZWxmLG90aGVyKToNCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLEhEUGFjayk6DQorICAgICAgICAgICAgcmV0dXJuIFRydWUNCisgICAgICAgIHJldHVybiBub3Qgc2VsZi5jb21wYXJlKG90aGVyKQ0KKyAgICAgICAgDQorICAgIGRlZiBjb21wYXJlKHNlbGYsb3RoZXIpOg0KKyAgICAgICAgaWYgc2VsZi5tc2d0eXBlICE9IG90aGVyLm1zZ3R5cGU6DQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQorICAgICAgICBmb3Igayx2IGluIHNlbGYudmFsdWUuaXRlbXMoKToNCisgICAgICAgICAgICBpZiBub3Qgb3RoZXIudmFsdWUuaGFzX2tleShrKToNCisgICAgICAgICAgICAgICAgcHJpbnQgImZpZWxkIFslc10gbm90IGVxdWFsIiAlIGsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQorICAgICAgICAgICAgaWYgdiA8PiBvdGhlci5nZXQoayk6DQorICAgICAgICAgICAgICAgIHByaW50ICJmaWVsZCBbJXNdIHZhbHVlIG5vdCBlcXVhbCBbJXMsJXNdIiAlIChrLHYsb3RoZXIuZ2V0KGspKQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UNCisgICAgICAgIHJldHVybiBUcnVlDQorICAgICAgICANCisgICAgZGVmIGxvYWRfY29uZmlnKHNlbGYpOg0KKyAgICAgICAgZm9yIGZpZWxkIGluIEhERmllbGRzRGVmOg0KKyAgICAgICAgICAgIGluZGV4LHQsbGVuLHR5cGUsZmxhZyxuYW1lLGRlc2MgPSBmaWVsZA0KKyAgICAgICAgICAgIHNlbGYuZmllbGRfaWR4W2luZGV4XSA9IGZpZWxkDQorICAgICAgICAgICAgc2VsZi5maWVsZF9uYW1lW25hbWVdID0gZmllbGQNCisgICAgICAgICNwcmludCBzZWxmLmZpZWxkX25hbWUNCisgICAgICANCisgICAgZGVmIGdldF9maWVsZF9kZWYoc2VsZixpbmRleCk6DQorICAgICAgICBmaWVsZF9kZWYgPSBOb25lDQorICAgICAgICBpZiBpc2luc3RhbmNlKGluZGV4LGludCk6DQorICAgICAgICAgICAgaWYgbm90IHNlbGYuZmllbGRfaWR4Lmhhc19rZXkoaW5kZXgpOg0KKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmaWVsZCBpbmRleCAlZCBub3QgZXhpc3RzIiAlIGluZGV4KQ0KKyAgICAgICAgICAgIGZpZWxkX2RlZiA9IHNlbGYuZmllbGRfaWR4W2luZGV4XQ0KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGluZGV4LHN0cik6DQorICAgICAgICAgICAgaWYgbm90IHNlbGYuZmllbGRfbmFtZS5oYXNfa2V5KGluZGV4KToNCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgaW5kZXggJXMgbm90IGV4aXN0cyIgJSBpbmRleCkNCisgICAgICAgICAgICBmaWVsZF9kZWYgPSBzZWxmLmZpZWxkX25hbWVbaW5kZXhdDQorICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkIGluZGV4IHR5cGUgbm90IHN1cHBvcnQiKQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgcmV0dXJuIGZpZWxkX2RlZg0KKyAgICAgICAgDQorICAgIGRlZiBzZXQoc2VsZixpbmRleCx2YWx1ZSk6DQorICAgICAgICBmaWVsZF9kZWYgPSBzZWxmLmdldF9maWVsZF9kZWYoaW5kZXgpDQorICAgICAgICB0ID0gZmllbGRfZGVmW0ZMRF9UWVBFX0lEWF0NCisgICAgICAgIG4gPSBmaWVsZF9kZWZbRkxEX05BTUVfSURYXQ0KKyAgICAgICAgbCA9IGZpZWxkX2RlZltGTERfTEVOR1RIX0lEWF0NCisgICAgICAgIGYgPSBmaWVsZF9kZWZbRkxEX0ZMQUdfSURYXQ0KKyAgICAgICAgaWYgdCA9PSBJRlRfVVNIT1JUIG9yIHQgPT0gSUZUX1VMT05HIG9yIHQgPT0gSUZUX05VTEwgb3IgdCA9PSBJRlRfQllURSBvciB0ID09IElGVF9MT05HOg0KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsaW50KToNCisgICAgICAgICAgICAgICAgYiA9IHZhbHVlDQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLHN0cik6DQorICAgICAgICAgICAgICAgIGlmIHZhbHVlLnN0YXJ0c3dpdGgoJzB4Jyk6DQorICAgICAgICAgICAgICAgICAgICBiID0gaW50KHZhbHVlLDE2KQ0KKyAgICAgICAgICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgICAgICAgICAgYiA9IGludCh2YWx1ZSkNCisgICAgICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmaWVsZCAlcyB2YWx1ZSB0eXBlIG5vdCBpbnRlZ2VyIiAlIG4pDQorICAgICAgICBlbGlmIHQgPT0gSUZUX0RBVEVUSU1FOg0KKyAgICAgICAgICAgIGlmIGxlbih2YWx1ZSkgIT0gMTIgYW5kIGxlbih2YWx1ZSkgIT0gMTQ6DQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkICVzIGxlbmd0aCBtdXN0IGJlIDEyIG9yIDE0IiAlIG4pDQorICAgICAgICAgICAgaWYgbGVuKHZhbHVlKSA9PSAxNDoNCisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsyOl0NCisgICAgICAgICAgICBiID0gdmFsdWUgKyAiMDAiDQorICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLHN0cik6DQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkICVzIHZhbHVlIHR5cGUgbm90IHN0cmluZyIgJSBuKQ0KKyAgICAgICAgICAgICAgICANCisgICAgICAgICAgICBpZiB0ID09IElGVF9EQVRFVElNRToNCisgICAgICAgICAgICAgICAgbCAqPSAyDQorICAgICAgICAgICAgZWxpZiB2YWx1ZS5zdGFydHN3aXRoKCcweCcpOg0KKyAgICAgICAgICAgICAgICBsICo9IDINCisgICAgICAgICAgICAgICAgbCArPSAyDQorICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmIGYgPD4gMiBhbmQgbGVuKHZhbHVlKSA8PiBsOg0KKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmaWVsZCAlcyB2YWx1ZSBkYXRhIGxlbmd0aCBub3QgZXF1YWwgJWQ8PiVkICIgJSAobixsZW4odmFsdWUpLGwpKQ0KKyAgICAgICAgICAgIGVsaWYgbGVuKHZhbHVlKSA+IGw6DQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkICVzIHZhbHVlIGRhdGEgbGVuZ3RoIGV4Y2VlZCAlZCAiICUgKG4sbCkpDQorICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGIgPSB2YWx1ZQ0KKyAgICAgICAgICAgICAgICANCisgICAgICAgIHNlbGYudmFsdWVbbl0gPSBiDQorICAgICAgICANCisgICAgZGVmIGdldChzZWxmLGluZGV4KToNCisgICAgICAgIGZpZWxkX2RlZiA9IHNlbGYuZ2V0X2ZpZWxkX2RlZihpbmRleCkNCisgICAgICAgIHQgPSBmaWVsZF9kZWZbM10NCisgICAgICAgIG4gPSBmaWVsZF9kZWZbNV0NCisgICAgICAgIA0KKyAgICAgICAgaWYgc2VsZi52YWx1ZS5oYXNfa2V5KG4pOg0KKyAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlW25dDQorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJGaWVsZCAlcyBub3Qgc3BlY2lmaWVkIiAlIG4pDQorICAgICAgICANCisgICAgICAgIA0KKyAgICBkZWYgZW5jb2RlX2JpdG1hcChzZWxmLGJpdG1hcCk6DQorICAgICAgICBidWZmZXIgPSAnJw0KKyAgICAgICAgb2Zmc2V0ID0gMA0KKyAgICAgICAgI3ByaW50ICJiaXQgbGVuWyVkXSIgJSBsZW4oYml0bWFwKQ0KKyAgICAgICAgd2hpbGUgb2Zmc2V0IDwgbGVuKGJpdG1hcCk6DQorICAgICAgICAgICAgYml0ID0gMA0KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDgpOg0KKyAgICAgICAgICAgICAgICB0ID0gb3JkKGJpdG1hcFtvZmZzZXQraV0pIC0gMHgzMA0KKyAgICAgICAgICAgICAgICBpZiB0ID09IDA6IGNvbnRpbnVlDQorICAgICAgICAgICAgICAgIGJpdCB8PSAoMSA8PCAoNyAtIGkgJSA4KSkNCisgICAgICAgICAgICBidWZmZXIgKz0gY2hyKGJpdCYweEZGKQ0KKyAgICAgICAgICAgIG9mZnNldCArPSA4DQorICAgICAgICByZXR1cm4gYnVmZmVyDQorICAgICAgICAgICAgDQorICAgIGRlZiBwYWNrKHNlbGYsd29ya2tleT1Ob25lKToNCisgICAgICAgIGJ1ZmZlciA9ICcnDQorICAgICAgICBiaXRtYXAgPSBbJzAnIGZvciBpIGluIHJhbmdlKDI0KV0NCisgICAgICAgIGZvciBmaWVsZCBpbiBIREZpZWxkc0RlZjoNCisgICAgICAgICAgICBpbmRleCx4LGxlbix0LGZsYWcsbmFtZSxkZXNjID0gZmllbGQNCisgICAgICAgICAgICBpZiBub3Qgc2VsZi52YWx1ZS5oYXNfa2V5KG5hbWUpOg0KKyAgICAgICAgICAgICAgICBjb250aW51ZQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmIHQgPT0gSUZUX1VTSE9SVCBvciB0ID09IElGVF9VTE9ORyBvciB0ID09IElGVF9OVUxMIG9yIHQgPT0gSUZUX0JZVEUgb3IgdCA9PSBJRlRfTE9ORzoNCisgICAgICAgICAgICAgICAgYnVmZmVyICs9IHNlbGYuaW50XzJfYnVmZmVyKHNlbGYudmFsdWVbbmFtZV0sdCxsZW4pDQorICAgICAgICAgICAgZWxzZToNCisgICAgICAgICAgICAgICAgYnVmZmVyICs9IHNlbGYuc3RyaW5nXzJfYnVmZmVyKHNlbGYudmFsdWVbbmFtZV0sdCxsZW4sZmxhZykNCisgICAgICAgICAgICBiaXRtYXBbaW5kZXgtMV0gPSAnMScNCisgICAgICAgICNwcmludCBiaXRtYXANCisgICAgICAgIA0KKyAgICAgICAgYml0bWFwX2J1ZmZlciA9IHNlbGYuZW5jb2RlX2JpdG1hcChiaXRtYXApDQorICAgICAgICBmdWxsX2RhdGEgPSBjaHIoc2VsZi5tc2d0eXBlJjB4RkYpICsgYml0bWFwX2J1ZmZlciArIGJ1ZmZlcg0KKyAgICAgICAgaGVhZGVyID0gc2VsZi5kYXRhX2hlYWRlcihmdWxsX2RhdGEpDQorICAgICAgICAjcHJpbnQgImhbJXNdZFslc10iICUgKGNvZGVjcy5lbmNvZGUoaGVhZGVyLCdoZXgnKSxjb2RlY3MuZW5jb2RlKGZ1bGxfZGF0YSwnaGV4JykpDQorICAgICAgICByZXR1cm4gaGVhZGVyICsgZnVsbF9kYXRhDQorICAgIA0KKyAgICBkZWYgZGF0YV9oZWFkZXIoc2VsZixidWZmZXIpOg0KKyAgICAgICAgaWYgbGVuKGJ1ZmZlcikgPiAweEZGRkY6DQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQnVmZmVyIG1heCBsZW5ndGggZXhjZWVkICVkIiwgbGVuKGJ1ZmZlcikpDQorICAgICAgICBoZWFkZXIgPSBzdHJ1Y3QucGFjaygnPEgnLGxlbihidWZmZXIpKQ0KKyAgICAgICAgcmV0dXJuIGhlYWRlcg0KKyAgICAgICAgDQorICAgIGRlZiBpbnRfMl9idWZmZXIoc2VsZix2YWx1ZSx0eXBlLGxlbmd0aCk6DQorICAgICAgICBidWZmZXIgPSAnJw0KKyAgICAgICAgaWYgdHlwZSA9PSBJRlRfQllURToNCisgICAgICAgICAgICBidWZmZXIgPSBjaHIodmFsdWUlMHgxMDApDQorICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX05VTEw6DQorICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcg0KKyAgICAgICAgZWxpZiB0eXBlID09IElGVF9VU0hPUlQ6DQorICAgICAgICAgICAgdiA9IHZhbHVlICUgMHgxMDAwMA0KKyAgICAgICAgICAgIGJ1ZmZlciA9IHN0cnVjdC5wYWNrKCc8SCcsdikNCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfVUxPTkc6DQorICAgICAgICAgICAgYnVmZmVyID0gc3RydWN0LnBhY2soJzxJJyx2YWx1ZSkNCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfTE9ORzoNCisgICAgICAgICAgICBidWZmZXIgPSBzdHJ1Y3QucGFjaygnPGknLHZhbHVlKQ0KKyAgICAgICAgZWxzZToNCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnB1dCBFcnJvcicpDQorICAgICAgICAgICAgDQorICAgICAgICByZXR1cm4gYnVmZmVyDQorICAgIA0KKyAgICBkZWYgZW5jb2RlX2JjZChzZWxmLHZhbHVlKToNCisgICAgICAgIGlmIGxlbih2YWx1ZSkgJSAyICE9IDA6DQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidmFsdWUgbGVuZ3RoIG11c3QgZGl2IDIiKQ0KKyAgICAgICAgaSA9IDANCisgICAgICAgICNwcmludCAidmFsdWUgWyVzXSIgJSB2YWx1ZQ0KKyAgICAgICAgYnVmZmVyID0gJycNCisgICAgICAgIHdoaWxlIGkgPCBsZW4odmFsdWUpOg0KKyAgICAgICAgICAgIHQxID0gKG9yZCh2YWx1ZVtpXSkgLSAweDMwKSYgMHhGRg0KKyAgICAgICAgICAgIHQyID0gKG9yZCh2YWx1ZVtpKzFdKSAtIDB4MzApICYgMHhGRg0KKyAgICAgICAgICAgICNwcmludCAidDFbJWRddDJbJWRdIiAlICh0MSx0MikNCisgICAgICAgICAgICB0ID0gKCh0MTw8NCkgfCB0MikgJiAweEZGDQorICAgICAgICAgICAgI3ByaW50ICJ0MVslZF10MlslZF10WyVkXSIgJSAodDEsdDIsdCkNCisgICAgICAgICAgICBidWZmZXIgKz0gY2hyKHQpDQorICAgICAgICAgICAgaSArPSAyDQorICAgICAgICAjcHJpbnQgImJjZCB2YWx1ZVslc10iICUgY29kZWNzLmVuY29kZShidWZmZXIsJ2hleCcpDQorICAgICAgICByZXR1cm4gYnVmZmVyDQorICAgICAgICANCisgICAgZGVmIGRlY29kZV9iY2Qoc2VsZix2YWx1ZSk6DQorICAgICAgICBidWZmZXIgPSAnJw0KKyAgICAgICAgI3ByaW50ICJiY2QgWyVzXSIgJSBjb2RlY3MuZW5jb2RlKHZhbHVlLCdoZXgnKQ0KKyAgICAgICAgZm9yIGMgaW4gdmFsdWU6DQorICAgICAgICAgICAgdCA9IG9yZChjKSAmIDB4RkYNCisgICAgICAgICAgICB0MSA9ICh0ID4+IDQpICYgMHgwRg0KKyAgICAgICAgICAgIHQyID0gdCAmIDB4MEYNCisgICAgICAgICAgICAjcHJpbnQgInRbJTAyeF10MVslZF10MlslZF0iICUgKHQsdDEsdDIpDQorICAgICAgICAgICAgYnVmZmVyICs9IGNocih0MSArIDB4MzApICsgY2hyKHQyICsgMHgzMCkNCisgICAgICAgICNwcmludCAiYmNkIHZhbHVlWyVzXSIgJSBidWZmZXINCisgICAgICAgIHJldHVybiBidWZmZXINCisgICAgICAgIA0KKyAgICBkZWYgc3RyaW5nXzJfYnVmZmVyKHNlbGYsdmFsdWUsdHlwZSxsZW5ndGgsZmxhZyk6DQorICAgICAgICBidWZmZXIgPSAnJw0KKyAgICAgICAgaWYgdHlwZSA9PSBJRlRfU1RSSU5HIG9yIHR5cGUgPT0gSUZUX0JVRkZFUjoNCisgICAgICAgICAgICBpZiB2YWx1ZS5zdGFydHN3aXRoKCcweCcpOg0KKyAgICAgICAgICAgICAgICBidWZmZXIgPSBjb2RlY3MuZGVjb2RlKHZhbHVlWzI6XSwnaGV4JykNCisgICAgICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgICAgICBidWZmZXIgPSB2YWx1ZQ0KKyAgICAgICAgZWxpZiB0eXBlID09IElGVF9EQVRFVElNRToNCisgICAgICAgICAgICBidWZmZXIgPSAnJw0KKyAgICAgICAgICAgIGkgPSAwDQorICAgICAgICAgICAgd2hpbGUgaSA8IGxlbih2YWx1ZSk6DQorICAgICAgICAgICAgICAgIHQgPSBpbnQodmFsdWVbaTppKzJdKQ0KKyAgICAgICAgICAgICAgICBidWZmZXIgKz0gY2hyKHQgJiAweEZGKQ0KKyAgICAgICAgICAgICAgICBpICs9IDINCisgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW5wdXQgRXJyb3InKQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgaWYgZmxhZyA9PSAyOg0KKyAgICAgICAgICAgIGhlYWRlciA9IHN0cnVjdC5wYWNrKCc8SCcsbGVuKGJ1ZmZlcikgJSAweDEwMDAwKQ0KKyAgICAgICAgICAgIHJldHVybiBoZWFkZXIgKyBidWZmZXINCisgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgI2lmIHR5cGUgPT0gSUZUX0JVRkZFUjoNCisgICAgICAgICAgICAjICAgIGlmIGxlbihidWZmZXIpICUgMiA8PiAwIG9yIGxlbihidWZmZXIpLzIgPD4gbGVuZ3RoOg0KKyAgICAgICAgICAgICMgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlZhbHVlIGxlbmd0aCBub3QgbWF0Y2hlZCBbJXNdIiAlIHZhbHVlKQ0KKyAgICAgICAgICAgICMgICAgYnVmZmVyID0gY29kZWNzLmRlY29kZShidWZmZXIsJ2hleCcpDQorICAgICAgICAgICAgaWYgbGVuKGJ1ZmZlcikgIT0gbGVuZ3RoOg0KKyAgICAgICAgICAgICAgICBwYWRsZW4gPSBsZW5ndGggLSBsZW4oYnVmZmVyKQ0KKyAgICAgICAgICAgICAgICBpZiBwYWRsZW4gPCAwOg0KKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVmFsdWUgbGVuZ3RoIG5vdCBtYXRjaGVkIFslc10iICUgdmFsdWUpDQorICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICBwYWQgPSBjaHIoMCkgKiBwYWRsZW4NCisgICAgICAgICAgICAgICAgYnVmZmVyID0gcGFkICsgYnVmZmVyDQorICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcg0KKyAgICAgICAgICAgIA0KKyAgICANCisgICAgZGVmIGRlY29kZV9iaXRtYXAoc2VsZixiaXRtYXApOg0KKyAgICAgICAgaWYgbGVuKGJpdG1hcCkgIT0gMzoNCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJiaXRtYXAgbGVuZ3RoIGVycm9yIikNCisgICAgICAgICNwcmludCAiYml0bWFwWyVzXSIgJSBjb2RlY3MuZW5jb2RlKGJpdG1hcCwnaGV4JykNCisgICAgICAgIGJ1ZmZlcj1bXQ0KKyAgICAgICAgZm9yIHQgaW4gYml0bWFwOg0KKyAgICAgICAgICAgIHYgPSBvcmQodCkgJiAweEZGDQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoOCk6DQorICAgICAgICAgICAgICAgIHggPSAodiAmICgxIDw8ICg3LWkpKSkNCisgICAgICAgICAgICAgICAgaWYgeCA+IDA6DQorICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCcxJykNCisgICAgICAgICAgICAgICAgZWxzZToNCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJzAnKQ0KKyAgICAgICAgcmV0dXJuIGJ1ZmZlcg0KKyAgICAgICAgICAgIA0KKyAgICBkZWYgdW5wYWNrKHNlbGYsZGF0YSk6DQorICAgICAgICBzZWxmLnZhbHVlID0ge30NCisgICAgICAgICNwcmludCAiZGF0YVslc10iICUgY29kZWNzLmVuY29kZShkYXRhLCdoZXgnKQ0KKyAgICAgICAgZGF0YV9sZW4gPSBzdHJ1Y3QudW5wYWNrKCc8SCcsZGF0YVs6Ml0pWzBdDQorICAgICAgICBpZiBsZW4oZGF0YSkgIT0gZGF0YV9sZW4gKyAyOg0KKyAgICAgICAgICAgIHByaW50ICJpbnB1dFslZF0gZXh0dWFsbHlbJWRdIiAlIChkYXRhX2xlbixsZW4oZGF0YSkpDQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQorICAgICAgICANCisgICAgICAgIG9mZnNldCA9IDINCisgICAgICAgIHNlbGYubXNndHlwZSA9IG9yZChkYXRhW29mZnNldF0pICYgMHhGRg0KKyAgICAgICAgb2Zmc2V0ICs9IDENCisgICAgICAgIGJpdG1hcCA9IHNlbGYuZGVjb2RlX2JpdG1hcChkYXRhW29mZnNldDpvZmZzZXQrM10pDQorICAgICAgICBvZmZzZXQgKz0gMw0KKyAgICAgICAgI3ByaW50IGJpdG1hcA0KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGJpdG1hcCkpOg0KKyAgICAgICAgICAgIGlmIGJpdG1hcFtpXSA9PSAnMCc6IGNvbnRpbnVlDQorICAgICAgICAgICAgZmluZGV4ID0gaSArIDENCisgICAgICAgICAgICBmaWVsZCA9IHNlbGYuZ2V0X2ZpZWxkX2RlZihmaW5kZXgpDQorICAgICAgICAgICAgZnR5cGUgPSBmaWVsZFtGTERfVFlQRV9JRFhdDQorICAgICAgICAgICAgZmxlbiA9IGZpZWxkW0ZMRF9MRU5HVEhfSURYXQ0KKyAgICAgICAgICAgIGZmbGFnID0gZmllbGRbRkxEX0ZMQUdfSURYXQ0KKyAgICAgICAgICAgIGZuYW1lID0gZmllbGRbRkxEX05BTUVfSURYXQ0KKyAgICAgICAgICAgICNwcmludCAicGFyc2UgZmllbGRbJXNdIFslZF1vZmZbJWRdWyVzXSIgJSAoZm5hbWUsZmZsYWcsb2Zmc2V0LGNvZGVjcy5lbmNvZGUoZGF0YVtvZmZzZXQ6b2Zmc2V0KzJdLCdoZXgnKSkNCisgICAgICAgICAgICBpZiBmZmxhZyA9PSAyOiAjILHks6TK/b7dDQorICAgICAgICAgICAgICAgICNwcmludCAibGVuIFslc10iICUgY29kZWNzLmVuY29kZShkYXRhW29mZnNldDpvZmZzZXQrMl0sJ2hleCcpDQorICAgICAgICAgICAgICAgIGVuZHBvcyA9IHNlbGYuYnVmZmVyXzJfaW50KGRhdGFbb2Zmc2V0Om9mZnNldCsyXSxJRlRfVVNIT1JUKQ0KKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMg0KKyAgICAgICAgICAgICAgICBlbmRwb3MgKz0gb2Zmc2V0IA0KKyAgICAgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgICAgIGVuZHBvcyA9IG9mZnNldCArIGZsZW4NCisgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgaWYgZnR5cGUgPT0gSUZUX1VTSE9SVCBvciBmdHlwZSA9PSBJRlRfVUxPTkcgb3IgZnR5cGUgPT0gSUZUX05VTEwgb3IgZnR5cGUgPT0gSUZUX0JZVEUgb3IgZnR5cGUgPT0gSUZUX0xPTkc6DQorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5idWZmZXJfMl9pbnQoZGF0YVtvZmZzZXQ6ZW5kcG9zXSxmdHlwZSkNCisgICAgICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgICAgICAjdGVtcCA9IHNlbGYuYnVmZmVyXzJfc3RyaW5nKGRhdGFbb2Zmc2V0OmVuZHBvc10sZnR5cGUpDQorICAgICAgICAgICAgICAgICNpZiBmZmxhZyAhPSAyIGFuZCBmdHlwZSA9PSBJRlRfU1RSSU5HOg0KKyAgICAgICAgICAgICAgICAjICAgIGZvciBpIGluIHRlbXA6DQorICAgICAgICAgICAgICAgICMgICAgICAgIHByaW50ICJjaGFyIFslMDJ4XSIgJSBvcmQoaSkNCisgICAgICAgICAgICAgICAgIyAgICAgICAgaWYgb3JkKGkpID4gMDoNCisgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIHZhbHVlICs9IGkNCisgICAgICAgICAgICAgICAgI2Vsc2U6DQorICAgICAgICAgICAgICAgICMgICAgdmFsdWUgPSB0ZW1wDQorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5idWZmZXJfMl9zdHJpbmcoZGF0YVtvZmZzZXQ6ZW5kcG9zXSxmdHlwZSkNCisgICAgICAgICAgICAgICAgaWYgZmZsYWcgPD4gMiBhbmQgZnR5cGUgPT0gSUZUX0JVRkZFUjoNCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gJzB4JyArIGNvZGVjcy5lbmNvZGUodmFsdWUsJ2hleCcpDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgc2VsZi5zZXQoZmluZGV4LHZhbHVlKQ0KKyAgICAgICAgICAgICNwcmludCAicGFyc2UgZmllbGRbJXNdIE9LID09PT09IiAlIGZuYW1lDQorICAgICAgICAgICAgb2Zmc2V0ID0gZW5kcG9zDQorICAgICAgICAjcHJpbnQgc2VsZi52YWx1ZQ0KKyAgICAgICAgcmV0dXJuIFRydWUNCisgICAgDQorICAgIGRlZiBidWZmZXJfMl9pbnQoc2VsZixkYXRhLHR5cGUpOg0KKyAgICAgICAgaWYgdHlwZSA9PSBJRlRfQllURToNCisgICAgICAgICAgICByZXR1cm4gb3JkKGRhdGEpDQorICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX1VTSE9SVDoNCisgICAgICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnPEgnLGRhdGEpWzBdDQorICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX1VMT05HOg0KKyAgICAgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCc8SScsZGF0YSlbMF0NCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfTE9ORzoNCisgICAgICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnPGknLGRhdGEpWzBdDQorICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX05VTEw6DQorICAgICAgICAgICAgcmV0dXJuIE5vbmUNCisgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW5wdXQgZGF0YSB0eXBlIGVycm9yIikNCisgICAgICAgICAgICANCisgICAgZGVmIGJ1ZmZlcl8yX3N0cmluZyhzZWxmLGRhdGEsdHlwZSk6DQorICAgICAgICBpZiB0eXBlID09IElGVF9TVFJJTkc6DQorICAgICAgICAgICAgcmV0dXJuIGRhdGENCisgICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfQlVGRkVSOg0KKyAgICAgICAgICAgIHJldHVybiBkYXRhDQorICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX0RBVEVUSU1FOg0KKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRlY29kZV9iY2QoZGF0YSkNCisgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW5wdXQgZGF0YSB0eXBlIGVycm9yIikNCisgICAgICAgICAgICANCisgICAgICAgICAgICANCisgICAgZGVmIGdldF8yYnl0ZV9pbnQoc2VsZixkYXRhKToNCisgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCI+SCIsZGF0YSlbMF0NCisgICAgICAgIA0KKyAgICBkZWYgZ2V0XzNieXRlX2ludChzZWxmLGRhdGEpOg0KKyAgICAgICAgdGVtcCA9IGRhdGEgKyBjaHIoMCkNCisgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCI8SSIsdGVtcClbMF0NCisgICAgICAgIA0KKyAgICBkZWYgZ2V0XzRieXRlX2ludChzZWxmLGRhdGEpOg0KKyAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soIjxJIixkYXRhKVswXQ0KKyAgICAgICAgDQorICAgIGRlZiBzZXRfMmJ5dGVfaW50KHNlbGYsZGF0YSk6DQorICAgICAgICByZXR1cm4gc3RydWN0LnBhY2soJzxIJyxkYXRhKQ0KKyAgICANCisgICAgZGVmIHNldF8zYnl0ZV9pbnQoc2VsZixkYXRhKToNCisgICAgICAgIHRlbXAgPSBzdHJ1Y3QucGFjaygnPEgnLGRhdGEpDQorICAgICAgICByZXR1cm4gdGVtcFs6LTFdDQorICAgICAgICAgICAgDQorICAgIGRlZiBzZXRfNGJ5dGVfaW50KHNlbGYsZGF0YSk6DQorICAgICAgICByZXR1cm4gc3RydWN0LnBhY2soJzxJJyxkYXRhKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9wYm9jZnVuYy5weSBiL3NyYy9wYm9jZnVuYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjFiZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Bib2NmdW5jLnB5CkBAIC0wLDAgKzEsMTMxIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uDQorIyB2aW06IHRhYnN0b3A9NA0KKw0KK2ltcG9ydCBweURlcywgY29kZWNzDQorDQorDQorDQorZGVmIGRlc2VuY3J5cHQoa2V5LCBkYXRhLCBtPXB5RGVzLkVDQik6DQorICAgIGsgPSBweURlcy5kZXMoa2V5LCBwYWQ9Tm9uZSwgcGFkbW9kZT1weURlcy5QQURfTk9STUFMLCBtb2RlPW0pDQorICAgIHJldHVybiBrLmVuY3J5cHQoZGF0YSkgDQorICAgIA0KK2RlZiBkZXNkZWNyeXB0KGtleSwgZGF0YSwgbT1weURlcy5FQ0IpOg0KKyAgICBrID0gcHlEZXMuZGVzKGtleSwgcGFkPU5vbmUsIHBhZG1vZGU9cHlEZXMuUEFEX05PUk1BTCwgbW9kZT1tKQ0KKyAgICByZXR1cm4gay5kZWNyeXB0KGRhdGEpIA0KKw0KK2RlZiB0cmlwbGVkZXNlbmNyeXB0KGtleSwgZGF0YSwgbT1weURlcy5FQ0IpOg0KKyAgICBrID0gcHlEZXMudHJpcGxlX2RlcyhrZXksIHBhZD1Ob25lLCBwYWRtb2RlPXB5RGVzLlBBRF9OT1JNQUwsIG1vZGU9bSkNCisgICAgcmV0dXJuIGsuZW5jcnlwdChkYXRhKQ0KKyAgICANCitkZWYgdHJpcGxlZGVzZGVjcnlwdChrZXksIGRhdGEsIG09cHlEZXMuRUNCKToNCisgICAgayA9IHB5RGVzLnRyaXBsZV9kZXMoa2V5LCBwYWQ9Tm9uZSwgcGFkbW9kZT1weURlcy5QQURfTk9STUFMLCBtb2RlPW0pDQorICAgIHJldHVybiBrLmRlY3J5cHQoZGF0YSkNCisNCisNCitkZWYgZGVzZW5jcnlwdGhleChrZXksIGRhdGEpOg0KKyAgICBrID0gcHlEZXMuZGVzKGNvZGVjcy5kZWNvZGUoa2V5LCAnaGV4JyksIHBhZD1Ob25lLCBwYWRtb2RlPXB5RGVzLlBBRF9OT1JNQUwpDQorICAgIGUgPSBrLmVuY3J5cHQoY29kZWNzLmRlY29kZShkYXRhLCAnaGV4JykpIA0KKyAgICByZXR1cm4gY29kZWNzLmVuY29kZShlLCAnaGV4JykNCisNCitkZWYgdHJpcGxlZGVzZW5jcnlwdGhleChrZXksIGRhdGEpOg0KKyAgICBrID0gcHlEZXMudHJpcGxlX2Rlcyhjb2RlY3MuZGVjb2RlKGtleSwgJ2hleCcpLCBwYWQ9Tm9uZSwgcGFkbW9kZT1weURlcy5QQURfTk9STUFMKQ0KKyAgICBlMSA9IGsuZW5jcnlwdChjb2RlY3MuZGVjb2RlKGRhdGEsICdoZXgnKSkNCisgICAgcmV0dXJuIGNvZGVjcy5lbmNvZGUoZTEsICdoZXgnKQ0KKw0KK2RlZiBEYXRhTm90KGRhdGEpOg0KKyAgICByID0gJycNCisgICAgZm9yIGEgaW4gZGF0YToNCisgICAgICAgIHIgPSByICsgY2hyKCh+b3JkKGEpKSAmIDB4RkYpDQorICAgIHJldHVybiByDQorICAgICAgICANCitkZWYgUGFkQ2FyZFBoeU5vKHBoeW5vKToNCisgICAgciA9ICcnDQorICAgIGlmIGxlbihwaHlubykgPCA4Og0KKyAgICAgICAgcGFkID0gIlx4ODBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIg0KKyAgICAgICAgbCA9IDggLSBsZW4ocGh5bm8pDQorICAgICAgICByID0gcGh5bm8gKyBwYWRbOmxdDQorICAgIGVsaWYgbGVuKHBoeW5vKSA9PSA4Og0KKyAgICAgICAgciA9IHBoeW5vDQorICAgIGVsc2U6DQorICAgICAgICByID0gcGh5bm9bOjhdDQorICAgIHJldHVybiByDQorICAgIA0KK2RlZiBQYWRDYXJkUGh5Tm9IZXgocGh5bm8pOg0KKyAgICByZXR1cm4gY29kZWNzLmVuY29kZShQYWRDYXJkUGh5Tm8oY29kZWNzLmRlY29kZShwaHlubywgJ2hleCcpKSwgJ2hleCcpDQorICAgIA0KK2RlZiBQYm9jRGVsaXZlcnlLZXkoZmFjdG9yLCBrZXkpOg0KKyAgICBjaXBoZXJkYXRhbm90ID0gJycNCisgICAgY2lwaGVyZGF0YSA9IFBhZENhcmRQaHlObyhmYWN0b3IpDQorICAgIA0KKyAgICBwcmludCAiZmFjdG9yIGlzIFslc10iICUgY29kZWNzLmVuY29kZShjaXBoZXJkYXRhLCAnaGV4JykNCisNCisgICAgaWYgbGVuKGtleSkgPT0gODogIyBzaW5nbGVkZXMgZGVsaXZlcnkNCisgICAgICAgIGsxID0gZGVzZW5jcnlwdChrZXksIGNpcGhlcmRhdGEpDQorICAgICAgICByZXR1cm4gazENCisgICAgZWxpZiBsZW4oa2V5KSA9PSAxNjoNCisgICAgICAgIGNpcGhlcmRhdGFub3QgPSBEYXRhTm90KGNpcGhlcmRhdGEpDQorICAgICAgICANCisgICAgICAgIGsxID0gdHJpcGxlZGVzZW5jcnlwdChrZXksIGNpcGhlcmRhdGEpDQorICAgICAgICBrMiA9IHRyaXBsZWRlc2VuY3J5cHQoa2V5LCBjaXBoZXJkYXRhbm90KQ0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gazEgKyBrMg0KKyAgICBlbHNlOg0KKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigna2V5IGxlbmd0aCBlcnJvcicpDQorICAgIA0KK2RlZiBQYm9jRGVsaXZlcnlLZXlIZXgoZmFjdG9yLCBrZXkpOg0KKyAgICBmID0gY29kZWNzLmRlY29kZShmYWN0b3IsICdoZXgnKQ0KKyAgICBrID0gY29kZWNzLmRlY29kZShrZXksICdoZXgnKQ0KKyAgICBrMSA9IFBib2NEZWxpdmVyeUtleShmLCBrKQ0KKyAgICByZXR1cm4gY29kZWNzLmVuY29kZShrMSwgJ2hleCcpDQorICAgDQorDQorZGVmIENhbGNNYWMzREVTKGRhdGEsIGluaXRkYXRhLCBrZXkpOg0KKyAgICBkYXRhbGVuID0gbGVuKGRhdGEpDQorICAgIGsgPSBweURlcy5kZXMoa2V5Wzo4XSwgcGFkPU5vbmUsIHBhZG1vZGU9cHlEZXMuUEFEX05PUk1BTCkNCisNCisgICAgZm9yIGkgaW4gcmFuZ2UoZGF0YWxlbiAvIDgpOg0KKyAgICAgICAgbSA9ICIiDQorICAgICAgICBmb3IgaiBpbiByYW5nZShsZW4oaW5pdGRhdGEpKToNCisgICAgICAgICAgICBtID0gbSArIGNocihvcmQoaW5pdGRhdGFbal0pIF4gb3JkKGRhdGFbaSAqIDggKyBqXSkpDQorDQorICAgICAgICBpbml0ZGF0YSA9IG0NCisgICAgICAgIHggPSBrLmVuY3J5cHQoaW5pdGRhdGEpDQorICAgICAgICBpbml0ZGF0YSA9IHgNCisNCisNCisgICAgazEgPSBweURlcy5kZXMoa2V5Wzg6XSwgcGFkPU5vbmUsIHBhZG1vZGU9cHlEZXMuUEFEX05PUk1BTCkNCisgICAgbiA9IGsxLmRlY3J5cHQoaW5pdGRhdGEpDQorICAgIGluaXRkYXRhID0gay5lbmNyeXB0KG4pDQorICAgIHJldHVybiBpbml0ZGF0YQ0KKyAgICANCitkZWYgQ2FsY01hYzNERVNIZXgoZGF0YSwgaW5pdGRhdGEsIGtleSk6DQorICAgIGQgPSBjb2RlY3MuZGVjb2RlKGRhdGEsICdoZXgnKQ0KKyAgICBpZCA9IGNvZGVjcy5kZWNvZGUoaW5pdGRhdGEsICdoZXgnKQ0KKyAgICBrID0gY29kZWNzLmRlY29kZShrZXksICdoZXgnKQ0KKyAgICBrMSA9IENhbGNNYWMzREVTKGQsIGlkLCBrKQ0KKyAgICByZXR1cm4gY29kZWNzLmVuY29kZShrMSwgJ2hleCcpDQorICAgIA0KK2RlZiBDYWxjTWFjREVTKGRhdGEsIGluaXRkYXRhLCBrZXkpOg0KKyAgICBkYXRhbGVuID0gbGVuKGRhdGEpDQorICAgIGsgPSBweURlcy5kZXMoa2V5LCBwYWQ9Tm9uZSwgcGFkbW9kZT1weURlcy5QQURfTk9STUFMKQ0KKyAgICANCisgICAgZm9yIGkgaW4gcmFuZ2UoZGF0YWxlbiAvIDgpOg0KKyAgICAgICAgbSA9ICIiDQorICAgICAgICBmb3IgaiBpbiByYW5nZShsZW4oaW5pdGRhdGEpKToNCisgICAgICAgICAgICBtID0gbSArIGNocihvcmQoaW5pdGRhdGFbal0pIF4gb3JkKGRhdGFbaSAqIDggKyBqXSkpDQorDQorICAgICAgICBpbml0ZGF0YSA9IG0NCisgICAgICAgIHggPSBrLmVuY3J5cHQoaW5pdGRhdGEpDQorICAgICAgICBpbml0ZGF0YSA9IHgNCisgICAgICAgIA0KKyAgICByZXR1cm4gaW5pdGRhdGENCisgICAgICAgIA0KK2RlZiBDYWxjTWFjREVTSGV4KGRhdGEsIGluaXRkYXRhLCBrZXkpOg0KKyAgICBkID0gY29kZWNzLmRlY29kZShkYXRhLCAnaGV4JykNCisgICAgaWQgPSBjb2RlY3MuZGVjb2RlKGluaXRkYXRhLCAnaGV4JykNCisgICAgayA9IGNvZGVjcy5kZWNvZGUoa2V5LCAnaGV4JykNCisgICAgazEgPSBDYWxjTWFjREVTKGQsIGlkLCBrKQ0KKyAgICByZXR1cm4gY29kZWNzLmVuY29kZShrMSwgJ2hleCcpDQorICAgIA0KKw0KKyAgICAgICAgDQpkaWZmIC0tZ2l0IGEvc3JjL3BlcmZvcm1hbmNlLnB5IGIvc3JjL3BlcmZvcm1hbmNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlM2NmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcGVyZm9ybWFuY2UucHkKQEAgLTAsMCArMSw3NSBAQAorIyEvdXNyL2Jpbi9lbnYNCisNCitpbXBvcnQgZGF0ZXRpbWUsIHRocmVhZGluZywgdGhyZWFkDQorDQorY2xhc3MgQ2hlY2tQZXJmOg0KKyAgICB3cml0ZWxvY2sgPSB0aHJlYWRpbmcuTG9jaygpDQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToNCisgICAgICAgIHNlbGYuYmVnaW50aW1lID0gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkNCisgICAgICAgIHNlbGYuZW5kdGltZSA9IE5vbmUNCisgICAgICAgIHNlbGYubWludGltZSA9IDAuMA0KKyAgICAgICAgc2VsZi5tYXh0aW1lID0gMC4wDQorICAgICAgICBzZWxmLnN1Y2Nlc3Njb3VudCA9IDANCisgICAgICAgIHNlbGYuZmFpbGVkY291bnQgPSAwDQorICAgICAgICBzZWxmLnRvdGFsdGltZSA9IDAuMA0KKyAgICAgICAgc2VsZi5yZXBvcnRtc2cgPSAnJw0KKyAgICAgICAgc2VsZi5wcmVjaGt0aW1lID0gTm9uZQ0KKyAgICAgICAgDQorICAgIGRlZiBzdGFydGNoayhzZWxmKToNCisgICAgICAgIHNlbGYuYmVnaW50aW1lID0gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkNCisgICAgICAgIHNlbGYuZW5kdGltZSA9IE5vbmUNCisgICAgICAgIHNlbGYubWludGltZSA9IDk5OTk5OTk5LjANCisgICAgICAgIHNlbGYubWF4dGltZSA9IDAuMA0KKyAgICAgICAgc2VsZi5jaGVja2NvdW50ID0gMA0KKyAgICAgICAgc2VsZi50b3RhbHRpbWUgPSAwLjANCisgICAgICAgIHNlbGYucmVwb3J0bXNnID0gJycNCisgICAgICAgIHNlbGYucHJlY2hrdGltZSA9IHNlbGYuYmVnaW50aW1lDQorICAgIA0KKyAgICBkZWYgc2V0Y2hrcG9pbnQoc2VsZiwgc3VjY2Vzcz1UcnVlKToNCisgICAgICAgIHNlbGYuZW5kdGltZSA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpDQorICAgICAgICBkZWx0YSA9IHNlbGYuZW5kdGltZSAtIHNlbGYucHJlY2hrdGltZQ0KKyAgICAgICAgdCA9IGRlbHRhLnNlY29uZHMgKyBkZWx0YS5taWNyb3NlY29uZHMgLyAxMDAwMDAwLjANCisgICAgICAgIGlmIHQgPCBzZWxmLm1pbnRpbWU6IHNlbGYubWludGltZSA9IHQNCisgICAgICAgIGlmIHQgPiBzZWxmLm1heHRpbWU6IHNlbGYubWF4dGltZSA9IHQNCisgICAgICAgIGlmIHN1Y2Nlc3M6DQorICAgICAgICAgICAgc2VsZi5zdWNjZXNzY291bnQgKz0gMQ0KKyAgICAgICAgZWxzZToNCisgICAgICAgICAgICBzZWxmLmZhaWxlZGNvdW50ICs9IDENCisgICAgICAgIHNlbGYudG90YWx0aW1lICs9IHQNCisgICAgICAgIHNlbGYucHJlY2hrdGltZSA9IHNlbGYuZW5kdGltZQ0KKyAgICAgICAgDQorICAgIGRlZiBfb3V0cHV0X2ZpbGUoc2VsZiwgb3V0X2ZpbGUpOg0KKyAgICAgICAgaGFuZGxlciA9IG9wZW4ob3V0X2ZpbGUsICdhK2InKQ0KKyAgICAgICAgaGFuZGxlci53cml0ZSgidGhyZFslZF0iICUgdGhyZWFkLmdldF9pZGVudCgpKQ0KKyAgICAgICAgaGFuZGxlci53cml0ZSgnIC0gJyArIHNlbGYucmVwb3J0bXNnICsgJ1xuJykNCisgICAgICAgIGhhbmRsZXIuY2xvc2UoKQ0KKyAgICAgICAgDQorICAgIGRlZiBfcmVwb3J0VG9GaWxlKHNlbGYsIG91dF9maWxlKToNCisgICAgICAgIENoZWNrUGVyZi53cml0ZWxvY2suYWNxdWlyZSgpDQorICAgICAgICB0cnk6DQorICAgICAgICAgICAgc2VsZi5fb3V0cHV0X2ZpbGUob3V0X2ZpbGUpDQorICAgICAgICAgICAgcHJpbnQgImdlbmVyYXRlIHJlcG9ydCBmaWxlICIgLCBvdXRfZmlsZQ0KKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZXg6DQorICAgICAgICAgICAgcHJpbnQgImdlbmVyYXRvciByZXBvcnQgZmlsZSAiLCBvdXRfZmlsZSAsICIgRXJyb3IgIiwgZXgNCisgICAgICAgIENoZWNrUGVyZi53cml0ZWxvY2sucmVsZWFzZSgpDQorICAgICAgICANCisgICAgZGVmIHJlcG9ydF9tc2coc2VsZik6DQorICAgICAgICB0b3RhbGNoZWNrY291bnQgPSBzZWxmLnN1Y2Nlc3Njb3VudCArIHNlbGYuZmFpbGVkY291bnQNCisgICAgICAgIGlmIHRvdGFsY2hlY2tjb3VudCA+IDI6DQorICAgICAgICAgICAgYXZnID0gKHNlbGYudG90YWx0aW1lIC0gc2VsZi5taW50aW1lIC0gc2VsZi5tYXh0aW1lKSAvICh0b3RhbGNoZWNrY291bnQgLSAyKQ0KKyAgICAgICAgZWxpZiB0b3RhbGNoZWNrY291bnQgPT0gMDoNCisgICAgICAgICAgICBycHQgPSAiTm8gY2hlY2sgcG9pbnQgaGFzIGJlZW4gc2V0Ig0KKyAgICAgICAgICAgIHJldHVybiBycHQNCisgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgYXZnID0gc2VsZi50b3RhbHRpbWUgLyB0b3RhbGNoZWNrY291bnQNCisgICAgICAgIHJwdCA9ICdleGVjdXRlWyVkXWNvdW50IGNvc3QocykgWyUuNGZdbWF4WyUuNGZdbWluWyUuNGZdYXZnWyUuNGZdIHN1Y2Nlc3NbJWRdIGZhaWxlZFslZF0nIFwNCisgICAgICAgICAgICAlICh0b3RhbGNoZWNrY291bnQsIHNlbGYudG90YWx0aW1lLCBzZWxmLm1heHRpbWUsIHNlbGYubWludGltZSwgYXZnLCBcDQorICAgICAgICAgICAgc2VsZi5zdWNjZXNzY291bnQsIHNlbGYuZmFpbGVkY291bnQpDQorICAgICAgICByZXR1cm4gcnB0DQorICAgICAgICANCisgICAgZGVmIHJlcG9ydChzZWxmLCBvdXRfZmlsZT1Ob25lKToNCisgICAgICAgIHNlbGYucmVwb3J0bXNnID0gc2VsZi5yZXBvcnRfbXNnKCkNCisgICAgICAgIGlmIG91dF9maWxlOg0KKyAgICAgICAgICAgIHNlbGYuX3JlcG9ydFRvRmlsZShvdXRfZmlsZSkNCisgICAgICAgIHJldHVybiBzZWxmLnJlcG9ydG1zZw0KKyAgICAgICAgDQpkaWZmIC0tZ2l0IGEvc3JjL3B5YmNjY2x0LnB5IGIvc3JjL3B5YmNjY2x0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMTA2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHliY2NjbHQucHkKQEAgLTAsMCArMSwzNTMgQEAKKyMhL3Vzci9iaW4vcHl0aG9uDQorIyAtKi0gY29kaW5nOiBnYmsgLSotDQorDQorZnJvbSBjdHlwZXMgaW1wb3J0ICoNCisNCitiY2NjbHRfZGxsID0gTm9uZQ0KK3hwYWNrX3BhdGggPSAnY3BhY2suZGF0Jw0KKw0KK2NwYWNrX2ZpZWxkcyA9IFsNCisic2N1c3Rfbm8iLA0KKyJzY3VzdF9ubzIiLA0KKyJzaG9sZGVyX2FjX25vIiwNCisic2hvbGRlcl9hY19ubzIiLA0KKyJzaG9sZGVyX3R5cGUiLA0KKyJzaG9sZGVyX3R5cGUyIiwNCisic25hbWUiLA0KKyJzbmFtZTIiLA0KKyJzYWxsX25hbWUiLA0KKyJzbWFya2V0X2NvZGUiLA0KKyJzbWFya2V0X2NvZGUyIiwNCisic2RhdGUwIiwNCisic2RhdGUxIiwNCisic2RhdGUyIiwNCisic2RhdGUzIiwNCisic3RpbWUwIiwNCisic3RpbWUxIiwNCisic3RpbWUyIiwNCisic3RpbWUzIiwNCisibHZvbDAiLA0KKyJsdm9sMSIsDQorImx2b2wyIiwNCisibHZvbDMiLA0KKyJsdm9sNCIsDQorImx2b2w1IiwNCisibHZvbDYiLA0KKyJsdm9sNyIsDQorImx2b2w4IiwNCisibHZvbDkiLA0KKyJsdm9sMTAiLA0KKyJsdm9sMTEiLA0KKyJsdm9sMTIiLA0KKyJkYW10MCIsDQorImRhbXQxIiwNCisiZGFtdDIiLA0KKyJkYW10MyIsDQorImRhbXQ0IiwNCisiZGFtdDUiLA0KKyJkYW10NiIsDQorImRhbXQ3IiwNCisiZGFtdDgiLA0KKyJkYW10OSIsDQorImRhbXQxMCIsDQorImRhbXQxMSIsDQorImRhbXQxMiIsDQorImRhbXQxMyIsDQorImRhbXQxNCIsDQorImRhbXQxNSIsDQorImRhbXQxNiIsDQorImRhbXQxNyIsDQorImRhbXQxOCIsDQorImRhbXQxOSIsDQorImRhbXQyMCIsDQorImRhbXQyMSIsDQorImRhbXQyMiIsDQorImRhbXQyMyIsDQorImRhbXQyNCIsDQorImRhbXQyNSIsDQorImRhbXQyNiIsDQorImRhbXQyNyIsDQorImRhbXQyOCIsDQorImRhbXQyOSIsDQorImRhbXQzMCIsDQorImRhbXQzMSIsDQorImRhbXQzMiIsDQorImRhbXQzMyIsDQorInNzdG9ja19jb2RlIiwNCisic3N0b2NrX2NvZGUyIiwNCisic2N1c3RfdHlwZSIsDQorInNjdXN0X3R5cGUyIiwNCisic3N0YXRfdHlwZSIsDQorInNzdGF0X3R5cGUyIiwNCisic3Jvb21fbm8iLA0KKyJzcm9vbV9ubzIiLA0KKyJzb3Blbl9lbXAiLA0KKyJzY2xvc2VfZW1wIiwNCisic2NoYW5nZV9lbXAiLA0KKyJzY2hlY2tfZW1wIiwNCisic2VtcCIsDQorInNuYXRpb25fY29kZSIsDQorImxjZXJ0X2NvZGUiLA0KKyJzdHhfcHdkIiwNCisic3R4X3B3ZDIiLA0KKyJzd2l0aGRyYXdfcHdkIiwNCisic3dpdGhkcmF3X3B3ZDIiLA0KKyJzZW1wX3B3ZCIsDQorInNlbXBfcHdkMiIsDQorInNiYW5rX3B3ZCIsDQorInNiYW5rX3B3ZDIiLA0KKyJzY3VzdF9hdXRoIiwNCisic2N1c3RfYXV0aDIiLA0KKyJzY3VzdF9saW1pdCIsDQorInNjdXN0X2xpbWl0MiIsDQorImxzYWZlX2xldmVsIiwNCisibHNhZmVfbGV2ZWwyIiwNCisic3Bvc3RfY29kZSIsDQorInNwb3N0X2NvZGUyIiwNCisic3Bob25lIiwNCisic3Bob25lMiIsDQorInNwaG9uZTMiLA0KKyJzcGFnZXIiLA0KKyJzZW1haWwiLA0KKyJzZW1haWwyIiwNCisic25vdGUiLA0KKyJzbm90ZTIiLA0KKyJzY2VydF9ubyIsDQorInNjZXJ0X25vMiIsDQorInNjZXJ0X2FkZHIiLA0KKyJzc3RhdHVzMCIsDQorInNzdGF0dXMxIiwNCisic3N0YXR1czIiLA0KKyJzc3RhdHVzMyIsDQorInNzdGF0dXM0IiwNCisibHdpdGhkcmF3X2ZsYWciLA0KKyJzYWRkciIsDQorInNhZGRyMiIsDQorInNzZXJpYWwwIiwNCisic3NlcmlhbDEiLA0KKyJzc2VyaWFsMiIsDQorInNzZXJpYWwzIiwNCisic3NlcmlhbDQiLA0KKyJzY3VycmVuY3lfdHlwZSIsDQorInNjdXJyZW5jeV90eXBlMiIsDQorInNicmFuY2hfY29kZTAiLA0KKyJzYnJhbmNoX2NvZGUxIiwNCisic2JyYW5jaF9jb2RlMiIsDQorInVzc2V0MCIsDQorInVzc2V0MSIsDQorInVzc2V0MiIsDQorInVzc2V0MyIsDQorInVzc2V0NCIsDQorInVzc2V0NSIsDQorInVzc2V0NiIsDQorInNzdGF0aW9uMCIsDQorInNzdGF0aW9uMSIsDQorInNiYW5rX2FjYyIsDQorInNiYW5rX2FjYzIiLA0KKyJsYmFua19hY2NfdHlwZSIsDQorImxiYW5rX2FjY190eXBlMiIsDQorInNtYWluX2ZsYWciLA0KKyJzbWFpbl9mbGFnMiIsDQorInNiYW5rX2NvZGUiLA0KKyJzYmFua19jb2RlMiIsDQorInNlbXBfbm8iLA0KKyJzZW1wX25vMiIsDQorImRyYXRlMCIsDQorImRyYXRlMSIsDQorImxzZXJpYWwwIiwNCisibHNlcmlhbDEiLA0KKyJzYmFua25hbWUiLA0KKyJzYmFua25hbWUyIiwNCisic2NhcmQwIiwNCisic2NhcmQxIiwNCisic29yZGVyMCIsDQorInNvcmRlcjEiLA0KKyJzb3JkZXIyIiwNCisic2N1c3R0eXBlcyIsDQorInNzZWN0eXBlcyIsDQorInZzbWVzcyIsDQorInZzdmFyc3RyMCIsDQorInZzdmFyc3RyMSIsDQorInZzdmFyc3RyMiINCitdDQorDQorZGVmIGxvYWRfYmNjY2x0KCk6DQorICAgIGdsb2JhbCBiY2NjbHRfZGxsDQorICAgIGJjY2NsdF9kbGwgPSBjZGxsLkxvYWRMaWJyYXJ5KCdiY2NjbHQuZGxsJykNCisgICAgDQorICANCitsb2FkX2JjY2NsdCgpICANCisNCitjbGFzcyBweUJjY2NsdDoNCisgICAgZHJ0cF9ubyA9IC0xDQorICAgIA0KKyAgICBkZWYgc2V0dXAoaXAscG9ydCx4cGFjaz0nY3BhY2suZGF0JyxkZWJ1Zz0wKToNCisgICAgICAgICcnJyCz9cq8u68gJycnDQorICAgICAgICBnbG9iYWwgeHBhY2tfcGF0aA0KKyAgICAgICAgeHBhY2tfcGF0aCA9IHhwYWNrDQorICAgICAgICBiY2NjbHRfZGxsLlNldERlYnVnU3dpdGNoKCBkZWJ1ZyApDQorICAgICAgICByID0gYmNjY2x0X2RsbC5CQ0NDTFRJbml0KDEpDQorICAgICAgICBpZiBub3QgcjoNCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIrP1yry7r8GsvdPKp7DcIikNCisgICAgICAgIG5vID0gYmNjY2x0X2RsbC5BZGREcnRwTm9kZShpcCxwb3J0KQ0KKyAgICAgICAgcHlCY2NjbHQuZHJ0cF9ubyA9IG5vDQorICAgICAgICBpZiBweUJjY2NsdC5kcnRwX25vIDwgMDoNCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ7P1yry7r82o0bbGvcyoway908qnsNwnKQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgDQorICAgICAgICANCisgICAgc2V0dXAgPSBzdGF0aWNtZXRob2Qoc2V0dXApDQorICAgICAgICANCisgICAgZGVmIF9faW5pdF9fKHNlbGYsbWFpbmZ1bmMpOg0KKyAgICAgICAgc2VsZi5oYW5kbGUgPSBiY2NjbHRfZGxsLk5ld1hwYWNrSGFuZGxlKCB4cGFja19wYXRoICkNCisgICAgICAgIHNlbGYubWFpbmZ1bmMgPSBtYWluZnVuYw0KKyAgICAgICAgc2VsZi5yZXNldCgpDQorICAgICAgICANCisgICAgZGVmIGdldF9lcnJvcm1zZyhzZWxmKToNCisgICAgICAgIHJldHVybiBzZWxmLmVycm9yX21zZy52YWx1ZQ0KKyAgICAgICAgDQorICAgIGRlZiByZXNldChzZWxmKToNCisgICAgICAgIHNlbGYucmVxdWVzdF9yb3cgPSAwDQorICAgICAgICBzZWxmLmVycm9yX2NvZGUgPSBjX2ludCgwKQ0KKyAgICAgICAgc2VsZi5lcnJvcl9tc2cgPSBjcmVhdGVfc3RyaW5nX2J1ZmZlcignXDAwMCcgKiAxMDI0KQ0KKyAgICAgICAgc2VsZi5yZXR1cm5fY29kZSA9IGNfaW50KDApDQorICAgICAgICBzZWxmLnJlY29yZF9jb3VudCA9IDANCisgICAgICAgIHNlbGYucmVjb3JkID0gTm9uZQ0KKyAgICAgICAgc2VsZi50aW1lb3V0ID0gNTAwMA0KKyAgICAgICAgc2VsZi5yZXNwb25zZV9yb3cgPSAwDQorICAgICAgICBiY2NjbHRfZGxsLlJlc2V0UGFja0hhbmRsZShzZWxmLmhhbmRsZSkNCisgICAgICAgIA0KKyAgICBkZWYgY2xvc2Uoc2VsZik6DQorICAgICAgICBpZiBzZWxmLmhhbmRsZSA8PiBOb25lOg0KKyAgICAgICAgICAgIGJjY2NsdF9kbGwuRGVsZXRlWHBhY2tIYW5kbGUoIHNlbGYuaGFuZGxlICkNCisgICAgICAgICAgICBzZWxmLmhhbmRsZSA9IE5vbmUNCisgICAgICAgIA0KKyAgICBkZWYgY2FsbHN2cihzZWxmLGZ1bmMscmVxdWVzdCx0aW1lb3V0ID0gMTAwMCk6DQorICAgICAgICBzZWxmLnJlc2V0KCkNCisgICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQNCisgICAgICAgIGZvciBrLHYgaW4gcmVxdWVzdC5pdGVyaXRlbXMoKToNCisgICAgICAgICAgICBpZiBrIG5vdCBpbiBjcGFja19maWVsZHM6DQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoItfWts4gJXMgsru05tTaIiAlIGspDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2LGludCk6DQorICAgICAgICAgICAgICAgIGJjY2NsdF9kbGwuU2V0SW50RmllbGRCeU5hbWUoc2VsZi5oYW5kbGUsc2VsZi5yZXF1ZXN0X3JvdyxrLHYpDQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHYsZmxvYXQpOg0KKyAgICAgICAgICAgICAgICBiY2NjbHRfZGxsLlNldERvdWJsZUZpZWxkQnlOYW1lKHNlbGYuaGFuZGxlLHNlbGYucmVxdWVzdF9yb3csayx2KQ0KKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2LHN0cik6DQorICAgICAgICAgICAgICAgIGJjY2NsdF9kbGwuU2V0U3RyaW5nRmllbGRCeU5hbWUoc2VsZi5oYW5kbGUsc2VsZi5yZXF1ZXN0X3JvdyxrLHYpDQorICAgICAgICAgICAgZWxzZToNCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigi19a2ziAlcyDK/b7dwODQzbTtzvMiICUgaykNCisgICAgICAgICAgICAgICANCisgICAgICAgIGJjY2NsdF9kbGwuU2V0UmVxdWVzdFR5cGUoc2VsZi5oYW5kbGUsZnVuYykNCisgICAgICAgICNwcmludCAiQ2FsbFJlcXVlc3QgJWQ6JWQiICUgKHNlbGYubWFpbmZ1bmMsZnVuYykNCisgICAgICAgIGlmIG5vdCBiY2NjbHRfZGxsLkNhbGxSZXF1ZXN0KHNlbGYuaGFuZGxlLHB5QmNjY2x0LmRydHBfbm8sMCxzZWxmLm1haW5mdW5jLHRpbWVvdXQsYnlyZWYoc2VsZi5lcnJvcl9jb2RlKSxzZWxmLmVycm9yX21zZyk6DQorICAgICAgICAgICAgI3ByaW50ICJDYWxsUmVxdWVzdCBlcnJvciAiDQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQorICAgICAgICAgICAgDQorICAgICAgICBzZWxmLmdldF9yZXR1cm5fZXJyb3IoKQ0KKyAgICAgICAgDQorICAgICAgICBjbnQgPSBjX2ludCgwKQ0KKyAgICAgICAgYmNjY2x0X2RsbC5HZXRSZWNvcmRDb3VudChzZWxmLmhhbmRsZSxieXJlZihjbnQpKQ0KKyAgICAgICAgc2VsZi5yZWNvcmRfY291bnQgPSBjbnQudmFsdWUNCisgICAgICAgIHJldHVybiBUcnVlDQorICAgICAgICAgICAgICAgIA0KKyAgICBkZWYgZ2V0X3JldGNvZGUoc2VsZik6DQorICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5fY29kZS52YWx1ZQ0KKyAgICAgICAgDQorICAgIGRlZiBnZXRfcmV0dXJuX2Vycm9yKHNlbGYpOg0KKyAgICAgICAgciA9IGJjY2NsdF9kbGwuR2V0UmV0Q29kZShzZWxmLmhhbmRsZSxieXJlZihzZWxmLnJldHVybl9jb2RlKSkNCisgICAgICAgIGlmIG5vdCByOg0KKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignyKG3tbvYwuu07c7zJykNCisgICAgICAgIGlmIHNlbGYuZ2V0X3JldGNvZGUoKSA8PiAwOg0KKyAgICAgICAgICAgIGJjY2NsdF9kbGwuR2V0U3RyaW5nRmllbGRCeU5hbWUoc2VsZi5oYW5kbGUsMCwidnNtZXNzIixzZWxmLmVycm9yX21zZykNCisgICAgICAgIHJldHVybiBzZWxmLnJldHVybl9jb2RlLnZhbHVlDQorICAgICAgICANCisgICAgZGVmIGhhc19tb3JlX3JlY29yZChzZWxmKToNCisgICAgICAgICNwcmludCAicmVzcDolZCwgcmVjb3JkOiAlZCIgJSAoc2VsZi5yZXNwb25zZV9yb3cgLCBzZWxmLnJlY29yZF9jb3VudCkNCisgICAgICAgIGlmIHNlbGYucmVzcG9uc2Vfcm93IDwgc2VsZi5yZWNvcmRfY291bnQ6DQorICAgICAgICAgICAgcmV0dXJuIFRydWUNCisgICAgICAgIGVsaWYgbm90IGJjY2NsdF9kbGwuSGF2ZU5leHRQYWNrKCBzZWxmLmhhbmRsZSApOg0KKyAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KKyAgICAgICAgZWxpZiBub3QgYmNjY2x0X2RsbC5DYWxsTmV4dChzZWxmLmhhbmRsZSxzZWxmLnRpbWVvdXQsYnlyZWYoc2VsZi5lcnJvcl9jb2RlKSxzZWxmLmVycm9yX21zZyk6DQorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCe78cihuvPQ+Mr9vt2w/NLss6MnKQ0KKyAgICAgICAgZWxzZToNCisgICAgICAgICAgICBzZWxmLnJlc3BvbnNlX3JvdyA9IDANCisgICAgICAgICAgICBzZWxmLnJlY29yZF9jb3VudCA9IDANCisgICAgICAgICAgICBzZWxmLmdldF9yZXR1cm5fZXJyb3IoKQ0KKyAgICAgICAgICAgIGlmIHNlbGYuZ2V0X3JldGNvZGUoKSA8PiAwOg0KKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ8ihuvPQ+Mr9vt23tbvYtO3O86OscmV0PSVkJyAlIHNlbGYuZ2V0X3JldGNvZGUoKSkNCisgICAgICAgICAgICBjbnQgPSBjX2ludCgwKQ0KKyAgICAgICAgICAgIGJjY2NsdF9kbGwuR2V0UmVjb3JkQ291bnQoc2VsZi5oYW5kbGUsYnlyZWYoY250KSkNCisgICAgICAgICAgICBzZWxmLnJlY29yZF9jb3VudCA9IGNudC52YWx1ZQ0KKyAgICAgICAgICAgIGlmIHNlbGYucmVzcG9uc2Vfcm93ICA8IHNlbGYucmVjb3JkX2NvdW50Og0KKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KKyAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KKyAgICANCisgICAgZGVmIGNvbnZlcnRfYXNjaWkoc2VsZixkYXRhKToNCisgICAgICAgIGkgPSAwDQorICAgICAgICBkYXRhbGVuID0gbGVuKGRhdGEpDQorICAgICAgICByZXN1bHQgPSAnJw0KKyAgICAgICAgd2hpbGUgaSA8IGRhdGFsZW46DQorICAgICAgICAgICAgdCA9IGRhdGFbaTppKzJdDQorICAgICAgICAgICAgdDEgPSBpbnQodCwxNikgJiAweEZGDQorICAgICAgICAgICAgaWYgKHQxIDwgb3JkKCcwJykgb3IgdDEgPiBvcmQoJzknKSkgYW5kICh0MSA8IG9yZCgnQScpIG9yIHQxID4gb3JkKCdGJykpOg0KKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJWYWx1ZSBpcyBub24taGV4ZGljaW1hbCAlczolZCIgJSAoY2hyKHQxKSx0MSkpDQorICAgICAgICAgICAgcmVzdWx0ICs9IGNocih0MSkNCisgICAgICAgICAgICBpICs9IDINCisgICAgICAgIHJldHVybiByZXN1bHQNCisgICAgICAgIA0KKyAgICBkZWYgbmV4dF9yZWNvcmQoc2VsZixmaWVsZHMpOg0KKyAgICAgICAgaWYgc2VsZi5yZXNwb25zZV9yb3cgPj0gc2VsZi5yZWNvcmRfY291bnQ6DQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignzt6/ydPDvMfCvCcpDQorICAgICAgICANCisgICAgICAgIHNlbGYucmVjb3JkID0ge30NCisgICAgICAgIGZvciBmIGluIGZpZWxkczoNCisgICAgICAgICAgICAjcHJpbnQgIrvxyKHX1rbOICIsZg0KKyAgICAgICAgICAgIGlmIGYgbm90IGluIGNwYWNrX2ZpZWxkczoNCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigi19a2ziAlcyCyu7Tm1NoiICUgZikNCisgICAgICAgICAgICANCisgICAgICAgICAgICBjdHlwZV9maWVsZCA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKGYpDQorICAgICAgICAgICAgaWYgZlswXSA9PSAnbCc6DQorICAgICAgICAgICAgICAgIHYgPSBjX2ludCgwKQ0KKyAgICAgICAgICAgICAgICByID0gYmNjY2x0X2RsbC5HZXRJbnRGaWVsZEJ5TmFtZShzZWxmLmhhbmRsZSxzZWxmLnJlc3BvbnNlX3JvdyxjdHlwZV9maWVsZCxieXJlZih2KSkNCisgICAgICAgICAgICAgICAgaWYgbm90IHI6DQorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCLX1rbOICVzIM60t7W72CIgJSBmKQ0KKyAgICAgICAgICAgICAgICBzZWxmLnJlY29yZFtmXSA9IHYudmFsdWUNCisgICAgICAgICAgICBlbGlmIGZbMF0gPT0gJ3MnOg0KKyAgICAgICAgICAgICAgICB2ID0gY3JlYXRlX3N0cmluZ19idWZmZXIoJ1wwMDAnICogNTEyKQ0KKyAgICAgICAgICAgICAgICByID0gYmNjY2x0X2RsbC5HZXRTdHJpbmdGaWVsZEJ5TmFtZShzZWxmLmhhbmRsZSxzZWxmLnJlc3BvbnNlX3JvdyxjdHlwZV9maWVsZCx2LDUxMSkNCisgICAgICAgICAgICAgICAgaWYgbm90IHI6DQorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCLX1rbOICVzIM60t7W72CIgJSBmKQ0KKyAgICAgICAgICAgICAgICAjcHJpbnQgIiVzOiAlcyIgJSAoZix2LnZhbHVlKQ0KKyAgICAgICAgICAgICAgICBzZWxmLnJlY29yZFtmXSA9IHYudmFsdWUNCisgICAgICAgICAgICBlbGlmIGZbMF0gPT0gJ2QnOg0KKyAgICAgICAgICAgICAgICB2ID0gY19kb3VibGUoMC4wKQ0KKyAgICAgICAgICAgICAgICByID0gYmNjY2x0X2RsbC5HZXREb3VibGVGaWVsZEJ5TmFtZShzZWxmLmhhbmRsZSxzZWxmLnJlc3BvbnNlX3JvdyxjdHlwZV9maWVsZCxieXJlZih2KSkNCisgICAgICAgICAgICAgICAgaWYgbm90IHI6DQorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCLX1rbOICVzIM60t7W72CIgJSBmKQ0KKyAgICAgICAgICAgICAgICBzZWxmLnJlY29yZFtmXSA9IHYudmFsdWUNCisgICAgICAgICAgICBlbGlmIGZbMF0gPT0gJ3UnOg0KKyAgICAgICAgICAgICAgICB2ID0gY3JlYXRlX3N0cmluZ19idWZmZXIoJ1wwMDAnICogMTAyNCkNCisgICAgICAgICAgICAgICAgciA9IGJjY2NsdF9kbGwuR2V0U3RyaW5nRmllbGRCeU5hbWUoc2VsZi5oYW5kbGUsc2VsZi5yZXNwb25zZV9yb3csY3R5cGVfZmllbGQsdiwxMDIzKQ0KKyAgICAgICAgICAgICAgICBpZiBub3QgcjoNCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoItfWts4gJXMgzrS3tbvYIiAlIGYpDQorICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgZGF0YSA9IHYudmFsdWUNCisgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFbMjpdDQorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLmNvbnZlcnRfYXNjaWkoZGF0YSkNCisgICAgICAgICAgICAgICAgc2VsZi5yZWNvcmRbZl0gPSBkYXRhDQorICAgICAgICAgICAgZWxzZToNCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcign19a2zsDg0M207c7zICVzJyAlIGYpDQorICAgICAgICBzZWxmLnJlc3BvbnNlX3JvdyArPSAxDQorICAgICAgICAjcHJpbnQgImZldGNoIG9uZSByZWNvcmQgLCAiICxzZWxmLnJlY29yZA0KKyAgICAgICAgcmV0dXJuIHNlbGYucmVjb3JkDQorICAgICAgICANCisgICAgZGVmIGZldGNoX3JlY29yZChzZWxmLGZpZWxkcyk6DQorICAgICAgICB3aGlsZSBzZWxmLmhhc19tb3JlX3JlY29yZCgpOg0KKyAgICAgICAgICAgIHJldCA9IHNlbGYubmV4dF9yZWNvcmQoZmllbGRzKQ0KKyAgICAgICAgICAgIHlpZWxkIHJldA0KKyAgICAgICAgICAgIA0KKyAgICANCisgICAgDQorICAgIA0KKyAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RjdXRpbHNfbW9kdWxlL19faW5pdF9fLnB5IGIvc3JjL3RjdXRpbHNfbW9kdWxlL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGN1dGlsc19tb2R1bGUvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3NyYy90Y3V0aWxzX21vZHVsZS90ZXN0bW9kdWxlLnB5IGIvc3JjL3RjdXRpbHNfbW9kdWxlL3Rlc3Rtb2R1bGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RmZWMwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90Y3V0aWxzX21vZHVsZS90ZXN0bW9kdWxlLnB5CkBAIC0wLDAgKzEsNSBAQAorJycnCitDcmVhdGVkIG9uIDIwMTEtOS0yNgorCitAYXV0aG9yOiBjaGVuZy50YW5nCisnJycK