IyAtKi0gY29kaW5nOiB1dGYtOA0KIiIiILvjtuDQrdLpt+LXsA0KIiIiDQppbXBvcnQgY29kZWNzDQppbXBvcnQgc3RydWN0DQoNCklGVF9OVUxMID0gMA0KSUZUX1VMT05HID0gMQ0KSUZUX0JZVEUgPSAyDQpJRlRfVVNIT1JUID0gMw0KSUZUX0RBVEVUSU1FID0gNA0KSUZUX0JVRkZFUiA9IDUNCklGVF9TVFJJTkcgPSA2DQpJRlRfTE9ORyA9IDcNCg0KIyAoMCwwLDEsSUZUX0JZVEUsMCwibXNndHlwZSIsIs/7z6LC6yIpLA0KDQpGTERfTk9fSURYID0gMA0KRkxEX0xFTkdUSF9JRFggPSAyDQpGTERfVFlQRV9JRFggPSAzDQpGTERfRkxBR19JRFggPSA0DQpGTERfTkFNRV9JRFggPSA1DQpGTERfREVTQ19JRFggPSA2DQoNCkhERmllbGRzRGVmID0gWw0KKDEsIDAsIDAsIElGVF9OVUxMLCAwLCAiZXh0ZW5kIiwgdSLAqdW50/K38SIpLA0KKDIsIDAsIDQsIElGVF9VTE9ORywgMCwgInRlcm1pbmFsc24iLCB1IiDW1bbL0PLB0LrFIiksDQooMywgMCwgMiwgSUZUX1VTSE9SVCwgMCwgImFkZHJlc3MiLCB1IkNBTrXY1rciKSwNCig0LCAwLCA0LCBJRlRfVUxPTkcsIDAsICJjYXJkbnVtYmVyIiwgdSK/qLrFIiksDQooNSwgMCwgMSwgSUZUX0JZVEUsIDAsICJpbmRleG9mZXciLCB1IiDHrrD8y/fS/SIpLA0KKDYsIDAsIDIsIElGVF9VU0hPUlQsIDAsICJ0cmFjZW9mZXciLCB1IiDHrrD8wffLrrrFIiksDQooNywgMCwgNCwgSUZUX0xPTkcsIDAsICJhbW91bnQiLCB1IiC9u9LXvfC27iIpLA0KKDgsIDAsIDQsIElGVF9MT05HLCAwLCAiYWRkaXRpb25hbGFtb3VudDEiLCB1Iri9vNO98LbuIiksDQooOSwgMCwgNCwgSUZUX1VMT05HLCAwLCAidHJhY2VvZnBvcyIsIHUiUE9TwffLrrrFIiksDQooMTAsIDAsIDQsIElGVF9VTE9ORywgMCwgIm9yZ3RyYW5zdHJhY2UiLCB1ItStvbvS18H3y666xSIpLA0KKDExLCAwLCA3LCBJRlRfREFURVRJTUUsIDAsICJkYXRldGltZSIsIHUivbvS18jVxtq6zcqxvOQiKSwNCigxMiwgMCwgMSwgSUZUX0JZVEUsIDAsICJyZXNwb25zZWNvZGUiLCB1Is/s06bC6yIpLA0KKDEzLCAwLCAyLCBJRlRfVVNIT1JULCAwLCAidGVybWluYWxpZCIsIHUi1tW2y7rFIiksDQooMTQsIDAsIDIsIElGVF9VU0hPUlQsIDAsICJ0ZXJtaW5hbHR5cGUiLCB1ItbVtsvA4NDNIiksDQooMTUsIDAsIDIsIElGVF9VU0hPUlQsIDAsICJtZXJjaGFudGlkIiwgdSLJzLunKM34teMpusUiKSwNCigxNiwgMCwgNCwgSUZUX1VMT05HLCAwLCAib3BlcmF0b3JpZCIsIHUistnX99SxusUiKSwNCigxNywgMCwgOCwgSUZUX0JVRkZFUiwgMCwgInBpbiIsIHUiuPbIy8q2sfDC61BJTiIpLA0KKDE4LCAwLCA0LCBJRlRfVUxPTkcsIDAsICJ2ZXJvZmxpc3QiLCB1Irraw/u1pbDmsb4iKSwNCigxOSwgMCwgNCwgSUZUX1VMT05HLCAwLCAibWFuYWdlZmVlIiwgdSK9u9LXxfq0zrrFKNTdsrvTwykiKSwNCigyMCwgMCwgMzYwLCBJRlRfQlVGRkVSLCAyLCAiYWRkaXRpb25hbGRhdGExIiwgdSK4vbzT0MXPojEiKSwNCigyMSwgMCwgNTI4LCBJRlRfQlVGRkVSLCAyLCAiYWRkaXRpb25hbGRhdGEyIiwgdSK4vbzT0MXPojIiKSwNCigyMiwgMCwgNTI4LCBJRlRfU1RSSU5HLCAyLCAiYWRkaXRpb25hbGRhdGEzIiwgdSK4vbzT0MXPojMiKSwNCigyMywgMCwgNTI4LCBJRlRfU1RSSU5HLCAyLCAiYWRkaXRpb25hbGRhdGE0IiwgdSK4vbzT0MXPojQiKSwNCigyNCwgMCwgMiwgSUZUX1VTSE9SVCwgMCwgIm1hYyIsIHUiz/vPosjP1qTC6yIpXQ0KDQoNCmNsYXNzIEhEUGFjazoNCiAgICAnJycgu+O24CA4NTgzINCt0umw/CAnJycNCiAgICBkZWYgX19pbml0X18oc2VsZik6DQogICAgICAgIHNlbGYubXNnX3R5cGUgPSAwDQogICAgICAgIHNlbGYudmFsdWUgPSB7fQ0KICAgICAgICBzZWxmLmZpZWxkX2lkeCA9IHt9DQogICAgICAgIHNlbGYuZmllbGRfbmFtZSA9IHt9DQogICAgICAgIHNlbGYubXNndHlwZSA9IDANCiAgICAgICAgc2VsZi5sb2FkX2NvbmZpZygpDQoNCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEhEUGFjayk6DQogICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYuY29tcGFyZShvdGhlcikNCg0KICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOg0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgSERQYWNrKToNCiAgICAgICAgICAgIHJldHVybiBUcnVlDQogICAgICAgIHJldHVybiBub3Qgc2VsZi5jb21wYXJlKG90aGVyKQ0KDQogICAgZGVmIGNvbXBhcmUoc2VsZiwgb3RoZXIpOg0KICAgICAgICBpZiBzZWxmLm1zZ3R5cGUgIT0gb3RoZXIubXNndHlwZToNCiAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KICAgICAgICBmb3IgaywgdiBpbiBzZWxmLnZhbHVlLml0ZW1zKCk6DQogICAgICAgICAgICBpZiBrIG5vdCBpbiBvdGhlci52YWx1ZToNCiAgICAgICAgICAgICAgICBwcmludCAiZmllbGQgWyVzXSBub3QgZXF1YWwiICUgaw0KICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KICAgICAgICAgICAgaWYgdiAhPSBvdGhlci5nZXQoayk6DQogICAgICAgICAgICAgICAgcHJpbnQgImZpZWxkIFslc10gdmFsdWUgbm90IGVxdWFsIFslcywlc10iICUgKGssIHYsIG90aGVyLmdldChrKSkNCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICAgICAgcmV0dXJuIFRydWUNCg0KICAgIGRlZiBsb2FkX2NvbmZpZyhzZWxmKToNCiAgICAgICAgZm9yIGZpZWxkIGluIEhERmllbGRzRGVmOg0KICAgICAgICAgICAgaW5kZXgsIHQsIGxlbiwgdHlwZSwgZmxhZywgbmFtZSwgZGVzYyA9IGZpZWxkDQogICAgICAgICAgICBzZWxmLmZpZWxkX2lkeFtpbmRleF0gPSBmaWVsZA0KICAgICAgICAgICAgc2VsZi5maWVsZF9uYW1lW25hbWVdID0gZmllbGQNCiAgICAgICAgI3ByaW50IHNlbGYuZmllbGRfbmFtZQ0KDQogICAgZGVmIGdldF9maWVsZF9kZWYoc2VsZiwgaW5kZXgpOg0KICAgICAgICBmaWVsZF9kZWYgPSBOb25lDQogICAgICAgIGlmIGlzaW5zdGFuY2UoaW5kZXgsIGludCk6DQogICAgICAgICAgICBpZiBpbmRleCBub3QgaW4gc2VsZi5maWVsZF9pZHg6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgaW5kZXggJWQgbm90IGV4aXN0cyIgJSBpbmRleCkNCiAgICAgICAgICAgIGZpZWxkX2RlZiA9IHNlbGYuZmllbGRfaWR4W2luZGV4XQ0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaW5kZXgsIHN0cik6DQogICAgICAgICAgICBpZiBpbmRleCBub3QgaW4gc2VsZi5maWVsZF9uYW1lOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkIGluZGV4ICVzIG5vdCBleGlzdHMiICUgaW5kZXgpDQogICAgICAgICAgICBmaWVsZF9kZWYgPSBzZWxmLmZpZWxkX25hbWVbaW5kZXhdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmaWVsZCBpbmRleCB0eXBlIG5vdCBzdXBwb3J0IikNCiAgICAgICAgcmV0dXJuIGZpZWxkX2RlZg0KDQogICAgZGVmIHNldChzZWxmLCBpbmRleCwgdmFsdWUpOg0KICAgICAgICBmaWVsZF9kZWYgPSBzZWxmLmdldF9maWVsZF9kZWYoaW5kZXgpDQogICAgICAgIHQgPSBmaWVsZF9kZWZbRkxEX1RZUEVfSURYXQ0KICAgICAgICBuID0gZmllbGRfZGVmW0ZMRF9OQU1FX0lEWF0NCiAgICAgICAgbCA9IGZpZWxkX2RlZltGTERfTEVOR1RIX0lEWF0NCiAgICAgICAgZiA9IGZpZWxkX2RlZltGTERfRkxBR19JRFhdDQogICAgICAgIGlmIHQgPT0gSUZUX1VTSE9SVCBvciB0ID09IElGVF9VTE9ORyBvciB0ID09IElGVF9OVUxMIG9yIHQgPT0gSUZUX0JZVEUgb3IgdCA9PSBJRlRfTE9ORzoNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGludCk6DQogICAgICAgICAgICAgICAgYiA9IHZhbHVlDQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cik6DQogICAgICAgICAgICAgICAgaWYgdmFsdWUuc3RhcnRzd2l0aCgnMHgnKToNCiAgICAgICAgICAgICAgICAgICAgYiA9IGludCh2YWx1ZSwgMTYpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgYiA9IGludCh2YWx1ZSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgJXMgdmFsdWUgdHlwZSBub3QgaW50ZWdlciIgJSBuKQ0KICAgICAgICBlbGlmIHQgPT0gSUZUX0RBVEVUSU1FOg0KICAgICAgICAgICAgaWYgbGVuKHZhbHVlKSAhPSAxMiBhbmQgbGVuKHZhbHVlKSAhPSAxNDoNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmaWVsZCAlcyBsZW5ndGggbXVzdCBiZSAxMiBvciAxNCIgJSBuKQ0KICAgICAgICAgICAgaWYgbGVuKHZhbHVlKSA9PSAxNDoNCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzI6XQ0KICAgICAgICAgICAgYiA9IHZhbHVlICsgIjAwIg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHN0cik6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgJXMgdmFsdWUgdHlwZSBub3Qgc3RyaW5nIiAlIG4pDQogICAgICAgICAgICBpZiB0ID09IElGVF9EQVRFVElNRToNCiAgICAgICAgICAgICAgICBsICo9IDINCiAgICAgICAgICAgIGVsaWYgdmFsdWUuc3RhcnRzd2l0aCgnMHgnKToNCiAgICAgICAgICAgICAgICBsICo9IDINCiAgICAgICAgICAgICAgICBsICs9IDINCiAgICAgICAgICAgIGlmIGYgIT0gMiBhbmQgbGVuKHZhbHVlKSAhPSBsOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpZWxkICVzIHZhbHVlIGRhdGEgbGVuZ3RoIG5vdCBlcXVhbCAlZDw+JWQgIiAlDQogICAgICAgICAgICAgICAgICAgIChuLCBsZW4odmFsdWUpLCBsKSkNCiAgICAgICAgICAgIGVsaWYgbGVuKHZhbHVlKSA+IGw6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmllbGQgJXMgdmFsdWUgZGF0YSBsZW5ndGggZXhjZWVkICVkICIgJSAobiwgbCkpDQogICAgICAgICAgICBiID0gdmFsdWUNCiAgICAgICAgc2VsZi52YWx1ZVtuXSA9IGINCg0KICAgIGRlZiBnZXQoc2VsZiwgaW5kZXgpOg0KICAgICAgICBmaWVsZF9kZWYgPSBzZWxmLmdldF9maWVsZF9kZWYoaW5kZXgpDQogICAgICAgICN0ID0gZmllbGRfZGVmWzNdDQogICAgICAgIG4gPSBmaWVsZF9kZWZbNV0NCiAgICAgICAgaWYgbiBpbiBzZWxmLnZhbHVlOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWVbbl0NCiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRmllbGQgJXMgbm90IHNwZWNpZmllZCIgJSBuKQ0KDQogICAgZGVmIGVuY29kZV9iaXRtYXAoc2VsZiwgYml0bWFwKToNCiAgICAgICAgYnVmZmVyID0gW10NCiAgICAgICAgb2Zmc2V0ID0gMA0KICAgICAgICAjcHJpbnQgImJpdCBsZW5bJWRdIiAlIGxlbihiaXRtYXApDQogICAgICAgIHdoaWxlIG9mZnNldCA8IGxlbihiaXRtYXApOg0KICAgICAgICAgICAgYml0ID0gMA0KICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoOCk6DQogICAgICAgICAgICAgICAgdCA9IG9yZChiaXRtYXBbb2Zmc2V0ICsgaV0pIC0gMHgzMA0KICAgICAgICAgICAgICAgIGlmIHQgPT0gMDogY29udGludWUNCiAgICAgICAgICAgICAgICBiaXQgfD0gKDEgPDwgKDcgLSBpICUgOCkpDQogICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNocihiaXQgJiAweEZGKSkNCiAgICAgICAgICAgIG9mZnNldCArPSA4DQogICAgICAgIHJldHVybiAiIi5qb2luKGJ1ZmZlcikNCg0KICAgIGRlZiBwYWNrKHNlbGYsIHdvcmtrZXk9Tm9uZSk6DQogICAgICAgIGJ1ZmZlciA9IFtdDQogICAgICAgIGJpdG1hcCA9IFsnMCcgZm9yIGkgaW4gcmFuZ2UoMjQpXQ0KICAgICAgICBmb3IgZmllbGQgaW4gSERGaWVsZHNEZWY6DQogICAgICAgICAgICBpbmRleCwgeCwgbGVuLCB0LCBmbGFnLCBuYW1lLCBkZXNjID0gZmllbGQNCiAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYudmFsdWU6DQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIGlmIHQgPT0gSUZUX1VTSE9SVCBvciB0ID09IElGVF9VTE9ORyBvciB0ID09IElGVF9OVUxMIG9yIHQgPT0gSUZUX0JZVEUgb3IgdCA9PSBJRlRfTE9ORzoNCiAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHNlbGYuaW50XzJfYnVmZmVyKHNlbGYudmFsdWVbbmFtZV0sIHQsIGxlbikpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoc2VsZi5zdHJpbmdfMl9idWZmZXIoc2VsZi52YWx1ZVtuYW1lXSwgdCwgbGVuLCBmbGFnKSkNCiAgICAgICAgICAgIGJpdG1hcFtpbmRleCAtIDFdID0gJzEnDQogICAgICAgICNwcmludCBiaXRtYXANCiAgICAgICAgYml0bWFwX2J1ZmZlciA9IHNlbGYuZW5jb2RlX2JpdG1hcChiaXRtYXApDQogICAgICAgIGZ1bGxfZGF0YSA9IGNocihzZWxmLm1zZ3R5cGUgJiAweEZGKSArIGJpdG1hcF9idWZmZXIgKyAiIi5qb2luKGJ1ZmZlcikNCiAgICAgICAgaGVhZGVyID0gc2VsZi5kYXRhX2hlYWRlcihmdWxsX2RhdGEpDQogICAgICAgICNwcmludCAiaFslc11kWyVzXSIgJSAoY29kZWNzLmVuY29kZShoZWFkZXIsJ2hleCcpLGNvZGVjcy5lbmNvZGUoZnVsbF9kYXRhLCdoZXgnKSkNCiAgICAgICAgcmV0dXJuIGhlYWRlciArIGZ1bGxfZGF0YQ0KDQogICAgZGVmIGRhdGFfaGVhZGVyKHNlbGYsIGJ1ZmZlcik6DQogICAgICAgIGlmIGxlbihidWZmZXIpID4gMHhGRkZGOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQnVmZmVyIG1heCBsZW5ndGggZXhjZWVkICVkIiwgbGVuKGJ1ZmZlcikpDQogICAgICAgIGhlYWRlciA9IHN0cnVjdC5wYWNrKCc8SCcsIGxlbihidWZmZXIpKQ0KICAgICAgICByZXR1cm4gaGVhZGVyDQoNCiAgICBkZWYgaW50XzJfYnVmZmVyKHNlbGYsIHZhbHVlLCB0eXBlLCBsZW5ndGgpOg0KICAgICAgICBidWZmZXIgPSAnJw0KICAgICAgICBpZiB0eXBlID09IElGVF9CWVRFOg0KICAgICAgICAgICAgYnVmZmVyID0gY2hyKHZhbHVlICUgMHgxMDApDQogICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfTlVMTDoNCiAgICAgICAgICAgIHJldHVybiBidWZmZXINCiAgICAgICAgZWxpZiB0eXBlID09IElGVF9VU0hPUlQ6DQogICAgICAgICAgICB2ID0gdmFsdWUgJSAweDEwMDAwDQogICAgICAgICAgICBidWZmZXIgPSBzdHJ1Y3QucGFjaygnPEgnLCB2KQ0KICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX1VMT05HOg0KICAgICAgICAgICAgYnVmZmVyID0gc3RydWN0LnBhY2soJzxJJywgdmFsdWUpDQogICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfTE9ORzoNCiAgICAgICAgICAgIGJ1ZmZlciA9IHN0cnVjdC5wYWNrKCc8aScsIHZhbHVlKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW5wdXQgRXJyb3InKQ0KICAgICAgICByZXR1cm4gYnVmZmVyDQoNCiAgICBkZWYgZW5jb2RlX2JjZChzZWxmLCB2YWx1ZSk6DQogICAgICAgIGlmIGxlbih2YWx1ZSkgJSAyICE9IDA6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ2YWx1ZSBsZW5ndGggbXVzdCBkaXYgMiIpDQogICAgICAgIGkgPSAwDQogICAgICAgICNwcmludCAidmFsdWUgWyVzXSIgJSB2YWx1ZQ0KICAgICAgICBidWZmZXIgPSBbXQ0KICAgICAgICB3aGlsZSBpIDwgbGVuKHZhbHVlKToNCiAgICAgICAgICAgIHQxID0gKG9yZCh2YWx1ZVtpXSkgLSAweDMwKSAmIDB4RkYNCiAgICAgICAgICAgIHQyID0gKG9yZCh2YWx1ZVtpICsgMV0pIC0gMHgzMCkgJiAweEZGDQogICAgICAgICAgICAjcHJpbnQgInQxWyVkXXQyWyVkXSIgJSAodDEsdDIpDQogICAgICAgICAgICB0ID0gKCh0MSA8PCA0KSB8IHQyKSAmIDB4RkYNCiAgICAgICAgICAgICNwcmludCAidDFbJWRddDJbJWRddFslZF0iICUgKHQxLHQyLHQpDQogICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNocih0KSkNCiAgICAgICAgICAgIGkgKz0gMg0KICAgICAgICAjcHJpbnQgImJjZCB2YWx1ZVslc10iICUgY29kZWNzLmVuY29kZShidWZmZXIsJ2hleCcpDQogICAgICAgIHJldHVybiAiIi5qb2luKGJ1ZmZlcikNCg0KICAgIGRlZiBkZWNvZGVfYmNkKHNlbGYsIHZhbHVlKToNCiAgICAgICAgYnVmZmVyID0gW10NCiAgICAgICAgI3ByaW50ICJiY2QgWyVzXSIgJSBjb2RlY3MuZW5jb2RlKHZhbHVlLCdoZXgnKQ0KICAgICAgICBmb3IgYyBpbiB2YWx1ZToNCiAgICAgICAgICAgIHQgPSBvcmQoYykgJiAweEZGDQogICAgICAgICAgICB0MSA9ICh0ID4+IDQpICYgMHgwRg0KICAgICAgICAgICAgdDIgPSB0ICYgMHgwRg0KICAgICAgICAgICAgI3ByaW50ICJ0WyUwMnhddDFbJWRddDJbJWRdIiAlICh0LHQxLHQyKQ0KICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjaHIodDEgKyAweDMwKSArIGNocih0MiArIDB4MzApKQ0KICAgICAgICAjcHJpbnQgImJjZCB2YWx1ZVslc10iICUgYnVmZmVyDQogICAgICAgIHJldHVybiAiIi5qb2luKGJ1ZmZlcikNCg0KICAgIGRlZiBzdHJpbmdfMl9idWZmZXIoc2VsZiwgdmFsdWUsIHR5cGUsIGxlbmd0aCwgZmxhZyk6DQogICAgICAgIGJ1ZmZlciA9ICcnDQogICAgICAgIGlmIHR5cGUgPT0gSUZUX1NUUklORyBvciB0eXBlID09IElGVF9CVUZGRVI6DQogICAgICAgICAgICBpZiB2YWx1ZS5zdGFydHN3aXRoKCcweCcpOg0KICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGNvZGVjcy5kZWNvZGUodmFsdWVbMjpdLCAnaGV4JykNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgYnVmZmVyID0gdmFsdWUNCiAgICAgICAgZWxpZiB0eXBlID09IElGVF9EQVRFVElNRToNCiAgICAgICAgICAgIGJ1ZmZlciA9ICcnDQogICAgICAgICAgICBpID0gMA0KICAgICAgICAgICAgd2hpbGUgaSA8IGxlbih2YWx1ZSk6DQogICAgICAgICAgICAgICAgdCA9IGludCh2YWx1ZVtpOmkgKyAyXSkNCiAgICAgICAgICAgICAgICBidWZmZXIgKz0gY2hyKHQgJiAweEZGKQ0KICAgICAgICAgICAgICAgIGkgKz0gMg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW5wdXQgRXJyb3InKQ0KICAgICAgICBpZiBmbGFnID09IDI6DQogICAgICAgICAgICBoZWFkZXIgPSBzdHJ1Y3QucGFjaygnPEgnLCBsZW4oYnVmZmVyKSAlIDB4MTAwMDApDQogICAgICAgICAgICByZXR1cm4gaGVhZGVyICsgYnVmZmVyDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICAjaWYgdHlwZSA9PSBJRlRfQlVGRkVSOg0KICAgICAgICAgICAgIyAgICBpZiBsZW4oYnVmZmVyKSAlIDIgPD4gMCBvciBsZW4oYnVmZmVyKS8yIDw+IGxlbmd0aDoNCiAgICAgICAgICAgICMgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlZhbHVlIGxlbmd0aCBub3QgbWF0Y2hlZCBbJXNdIiAlIHZhbHVlKQ0KICAgICAgICAgICAgIyAgICBidWZmZXIgPSBjb2RlY3MuZGVjb2RlKGJ1ZmZlciwnaGV4JykNCiAgICAgICAgICAgIGlmIGxlbihidWZmZXIpICE9IGxlbmd0aDoNCiAgICAgICAgICAgICAgICBwYWRsZW4gPSBsZW5ndGggLSBsZW4oYnVmZmVyKQ0KICAgICAgICAgICAgICAgIGlmIHBhZGxlbiA8IDA6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlZhbHVlIGxlbmd0aCBub3QgbWF0Y2hlZCBbJXNdIiAlIHZhbHVlKQ0KICAgICAgICAgICAgICAgIHBhZCA9IGNocigwKSAqIHBhZGxlbg0KICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHBhZCArIGJ1ZmZlcg0KICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcg0KDQogICAgZGVmIGRlY29kZV9iaXRtYXAoc2VsZiwgYml0bWFwKToNCiAgICAgICAgaWYgbGVuKGJpdG1hcCkgIT0gMzoNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImJpdG1hcCBsZW5ndGggZXJyb3IiKQ0KICAgICAgICAjcHJpbnQgImJpdG1hcFslc10iICUgY29kZWNzLmVuY29kZShiaXRtYXAsJ2hleCcpDQogICAgICAgIGJ1ZmZlciA9IFtdDQogICAgICAgIGZvciB0IGluIGJpdG1hcDoNCiAgICAgICAgICAgIHYgPSBvcmQodCkgJiAweEZGDQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg4KToNCiAgICAgICAgICAgICAgICB4ID0gKHYgJiAoMSA8PCAoNyAtIGkpKSkNCiAgICAgICAgICAgICAgICBpZiB4ID4gMDoNCiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnMScpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnMCcpDQogICAgICAgIHJldHVybiBidWZmZXINCg0KICAgIGRlZiB1bnBhY2soc2VsZiwgZGF0YSk6DQogICAgICAgIHNlbGYudmFsdWUgPSB7fQ0KICAgICAgICAjcHJpbnQgImRhdGFbJXNdIiAlIGNvZGVjcy5lbmNvZGUoZGF0YSwnaGV4JykNCiAgICAgICAgZGF0YV9sZW4gPSBzdHJ1Y3QudW5wYWNrKCc8SCcsIGRhdGFbOjJdKVswXQ0KICAgICAgICBpZiBsZW4oZGF0YSkgIT0gZGF0YV9sZW4gKyAyOg0KICAgICAgICAgICAgcHJpbnQgImlucHV0WyVkXSBleHR1YWxseVslZF0iICUgKGRhdGFfbGVuLCBsZW4oZGF0YSkpDQogICAgICAgICAgICByZXR1cm4gRmFsc2UNCiAgICAgICAgb2Zmc2V0ID0gMg0KICAgICAgICBzZWxmLm1zZ3R5cGUgPSBvcmQoZGF0YVtvZmZzZXRdKSAmIDB4RkYNCiAgICAgICAgb2Zmc2V0ICs9IDENCiAgICAgICAgYml0bWFwID0gc2VsZi5kZWNvZGVfYml0bWFwKGRhdGFbb2Zmc2V0Om9mZnNldCArIDNdKQ0KICAgICAgICBvZmZzZXQgKz0gMw0KICAgICAgICAjcHJpbnQgYml0bWFwDQogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihiaXRtYXApKToNCiAgICAgICAgICAgIGlmIGJpdG1hcFtpXSA9PSAnMCc6IGNvbnRpbnVlDQogICAgICAgICAgICBmaW5kZXggPSBpICsgMQ0KICAgICAgICAgICAgZmllbGQgPSBzZWxmLmdldF9maWVsZF9kZWYoZmluZGV4KQ0KICAgICAgICAgICAgZnR5cGUgPSBmaWVsZFtGTERfVFlQRV9JRFhdDQogICAgICAgICAgICBmbGVuID0gZmllbGRbRkxEX0xFTkdUSF9JRFhdDQogICAgICAgICAgICBmZmxhZyA9IGZpZWxkW0ZMRF9GTEFHX0lEWF0NCiAgICAgICAgICAgICNmbmFtZSA9IGZpZWxkW0ZMRF9OQU1FX0lEWF0NCiAgICAgICAgICAgICNwcmludCAicGFyc2UgZmllbGRbJXNdIFslZF1vZmZbJWRdWyVzXSIgJSAoZm5hbWUsZmZsYWcsb2Zmc2V0LGNvZGVjcy5lbmNvZGUoZGF0YVtvZmZzZXQ6b2Zmc2V0KzJdLCdoZXgnKSkNCiAgICAgICAgICAgICMgseSzpMr9vt0NCiAgICAgICAgICAgIGlmIGZmbGFnID09IDI6DQogICAgICAgICAgICAgICAgI3ByaW50ICJsZW4gWyVzXSIgJSBjb2RlY3MuZW5jb2RlKGRhdGFbb2Zmc2V0Om9mZnNldCsyXSwnaGV4JykNCiAgICAgICAgICAgICAgICBlbmRwb3MgPSBzZWxmLmJ1ZmZlcl8yX2ludChkYXRhW29mZnNldDpvZmZzZXQgKyAyXSwgSUZUX1VTSE9SVCkNCiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMg0KICAgICAgICAgICAgICAgIGVuZHBvcyArPSBvZmZzZXQNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgZW5kcG9zID0gb2Zmc2V0ICsgZmxlbg0KICAgICAgICAgICAgaWYgZnR5cGUgPT0gSUZUX1VTSE9SVCBvciBmdHlwZSA9PSBJRlRfVUxPTkcgb3IgZnR5cGUgPT0gSUZUX05VTEwgb3IgZnR5cGUgPT0gSUZUX0JZVEUgb3IgZnR5cGUgPT0gSUZUX0xPTkc6DQogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmJ1ZmZlcl8yX2ludChkYXRhW29mZnNldDplbmRwb3NdLCBmdHlwZSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgI3RlbXAgPSBzZWxmLmJ1ZmZlcl8yX3N0cmluZyhkYXRhW29mZnNldDplbmRwb3NdLGZ0eXBlKQ0KICAgICAgICAgICAgICAgICNpZiBmZmxhZyAhPSAyIGFuZCBmdHlwZSA9PSBJRlRfU1RSSU5HOg0KICAgICAgICAgICAgICAgICMgICAgZm9yIGkgaW4gdGVtcDoNCiAgICAgICAgICAgICAgICAjICAgICAgICBwcmludCAiY2hhciBbJTAyeF0iICUgb3JkKGkpDQogICAgICAgICAgICAgICAgIyAgICAgICAgaWYgb3JkKGkpID4gMDoNCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgdmFsdWUgKz0gaQ0KICAgICAgICAgICAgICAgICNlbHNlOg0KICAgICAgICAgICAgICAgICMgICAgdmFsdWUgPSB0ZW1wDQogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmJ1ZmZlcl8yX3N0cmluZyhkYXRhW29mZnNldDplbmRwb3NdLCBmdHlwZSkNCiAgICAgICAgICAgICAgICBpZiBmZmxhZyAhPSAyIGFuZCBmdHlwZSA9PSBJRlRfQlVGRkVSOg0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICcweCcgKyBjb2RlY3MuZW5jb2RlKHZhbHVlLCAnaGV4JykNCiAgICAgICAgICAgIHNlbGYuc2V0KGZpbmRleCwgdmFsdWUpDQogICAgICAgICAgICAjcHJpbnQgInBhcnNlIGZpZWxkWyVzXSBPSyA9PT09PSIgJSBmbmFtZQ0KICAgICAgICAgICAgb2Zmc2V0ID0gZW5kcG9zDQogICAgICAgICNwcmludCBzZWxmLnZhbHVlDQogICAgICAgIHJldHVybiBUcnVlDQoNCiAgICBkZWYgYnVmZmVyXzJfaW50KHNlbGYsIGRhdGEsIHR5cGUpOg0KICAgICAgICBpZiB0eXBlID09IElGVF9CWVRFOg0KICAgICAgICAgICAgcmV0dXJuIG9yZChkYXRhKQ0KICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX1VTSE9SVDoNCiAgICAgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCc8SCcsIGRhdGEpWzBdDQogICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfVUxPTkc6DQogICAgICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnPEknLCBkYXRhKVswXQ0KICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX0xPTkc6DQogICAgICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnPGknLCBkYXRhKVswXQ0KICAgICAgICBlbGlmIHR5cGUgPT0gSUZUX05VTEw6DQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW5wdXQgZGF0YSB0eXBlIGVycm9yIikNCg0KICAgIGRlZiBidWZmZXJfMl9zdHJpbmcoc2VsZiwgZGF0YSwgdHlwZSk6DQogICAgICAgIGlmIHR5cGUgPT0gSUZUX1NUUklORzoNCiAgICAgICAgICAgIHJldHVybiBkYXRhDQogICAgICAgIGVsaWYgdHlwZSA9PSBJRlRfQlVGRkVSOg0KICAgICAgICAgICAgcmV0dXJuIGRhdGENCiAgICAgICAgZWxpZiB0eXBlID09IElGVF9EQVRFVElNRToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLmRlY29kZV9iY2QoZGF0YSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImlucHV0IGRhdGEgdHlwZSBlcnJvciIpDQoNCiAgICBkZWYgZ2V0XzJieXRlX2ludChzZWxmLCBkYXRhKToNCiAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soIj5IIiwgZGF0YSlbMF0NCg0KICAgIGRlZiBnZXRfM2J5dGVfaW50KHNlbGYsIGRhdGEpOg0KICAgICAgICB0ZW1wID0gZGF0YSArIGNocigwKQ0KICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygiPEkiLCB0ZW1wKVswXQ0KDQogICAgZGVmIGdldF80Ynl0ZV9pbnQoc2VsZiwgZGF0YSk6DQogICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCI8SSIsIGRhdGEpWzBdDQoNCiAgICBkZWYgc2V0XzJieXRlX2ludChzZWxmLCBkYXRhKToNCiAgICAgICAgcmV0dXJuIHN0cnVjdC5wYWNrKCc8SCcsIGRhdGEpDQoNCiAgICBkZWYgc2V0XzNieXRlX2ludChzZWxmLCBkYXRhKToNCiAgICAgICAgdGVtcCA9IHN0cnVjdC5wYWNrKCc8SCcsIGRhdGEpDQogICAgICAgIHJldHVybiB0ZW1wWzotMV0NCg0KICAgIGRlZiBzZXRfNGJ5dGVfaW50KHNlbGYsIGRhdGEpOg0KICAgICAgICByZXR1cm4gc3RydWN0LnBhY2soJzxJJywgZGF0YSkNCg==