ZGlmZiAtLWdpdCBhL2xpYnFyL3FyZW5jb2RlLmMgYi9saWJxci9xcmVuY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwODM3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJxci9xcmVuY29kZS5jCkBAIC0wLDAgKzEsMTQ3NCBAQAorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAicXJlbmNvZGUuaCIKKwordHlwZWRlZiBlbnVtCit7CisgIEZBTFNFID0gMCwKKyAgVFJVRSA9ICFGQUxTRQorfSBib29sOworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEJZVEU7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgV09SRDsKKworI2RlZmluZSBRUl9MRVZFTF9MCTAKKyNkZWZpbmUgUVJfTEVWRUxfTQkxCisjZGVmaW5lIFFSX0xFVkVMX1EJMgorI2RlZmluZSBRUl9MRVZFTF9ICTMKKworI2RlZmluZSBRUl9NT0RFX05VTUVSQUwJCTAKKyNkZWZpbmUgUVJfTU9ERV9BTFBIQUJFVAkxCisjZGVmaW5lIFFSX01PREVfOEJJVAkJMgorCisjZGVmaW5lIFFSX1ZSRVNJT05fUwkwCisjZGVmaW5lIFFSX1ZSRVNJT05fTQkxCisjZGVmaW5lIFFSX1ZSRVNJT05fTAkyCisKKyNkZWZpbmUgTUFYX0FMTENPREVXT1JECSAxNzIgLy83MzPKx7Dmsb4xNtDo0qq1xNfutPO/1bzkCisjZGVmaW5lIE1BWF9EQVRBQ09ERVdPUkQgMTM2IC8vNTg5ysew5rG+MTbQ6NKqtcTX7rTzv9W85AorI2RlZmluZSBNQVhfQ09ERUJMT0NLCSAgMTUzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0cnVjdCBSU19CTE9DS0lORk8KK3sKKyAgaW50IG5jUlNCbG9jazsKKyAgaW50IG5jQWxsQ29kZVdvcmQ7CisgIGludCBuY0RhdGFDb2RlV29yZDsKK307CisKK3N0cnVjdCBRUl9WRVJTSU9OSU5GTworeworICBpbnQgblZlcnNpb25ObzsKKyAgaW50IG5jQWxsQ29kZVdvcmQ7CisKKyAgaW50IG5jRGF0YUNvZGVXb3JkWzRdOworICBpbnQgbmNBbGlnblBvaW50OworICBpbnQgbkFsaWduUG9pbnRbNl07CisKKyAgc3RydWN0IFJTX0JMT0NLSU5GTyBSU19CbG9ja0luZm8xWzRdOworICBzdHJ1Y3QgUlNfQkxPQ0tJTkZPIFJTX0Jsb2NrSW5mbzJbNF07Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IFFSX1ZFUlNJT05JTkZPIFFSX1ZlcnNvbkluZm9bXSA9IHt7MH0sIC8vIFZlci4wCisgIHsKKyAgICAxLCAvLyBWZXIuMQorICAgIDI2LCAgIDE5LCAgIDE2LCAgIDEzLCAgICA5LAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMSwgIDI2LCAgMTksCisgICAgMSwgIDI2LCAgMTYsCisgICAgMSwgIDI2LCAgMTMsCisgICAgMSwgIDI2LCAgIDksCisgICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAKKyAgfSwKKyAgeworICAgIDIsIC8vIFZlci4yCisgICAgNDQsICAgMzQsICAgMjgsICAgMjIsICAgMTYsCisgICAgMSwgIDE4LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxLCAgNDQsICAzNCwKKyAgICAxLCAgNDQsICAyOCwKKyAgICAxLCAgNDQsICAyMiwKKyAgICAxLCAgNDQsICAxNiwKKyAgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMAorICB9LAorICB7CisgICAgMywgLy8gVmVyLjMKKyAgICA3MCwgICA1NSwgICA0NCwgICAzNCwgICAyNiwKKyAgICAxLCAgMjIsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDEsICA3MCwgIDU1LAorICAgIDEsICA3MCwgIDQ0LAorICAgIDIsICAzNSwgIDE3LAorICAgIDIsICAzNSwgIDEzLAorICAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwCisgIH0sCisgIHsKKyAgICA0LCAvLyBWZXIuNAorICAgIDEwMCwgICA4MCwgICA2NCwgICA0OCwgICAzNiwKKyAgICAxLCAgMjYsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDEsIDEwMCwgIDgwLAorICAgIDIsICA1MCwgIDMyLAorICAgIDIsICA1MCwgIDI0LAorICAgIDQsICAyNSwgICA5LAorICAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwCisgIH0sCisgIHsKKyAgICA1LCAvLyBWZXIuNQorICAgIDEzNCwgIDEwOCwgICA4NiwgICA2MiwgICA0NiwKKyAgICAxLCAgMzAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDEsIDEzNCwgMTA4LAorICAgIDIsICA2NywgIDQzLAorICAgIDIsICAzMywgIDE1LAorICAgIDIsICAzMywgIDExLAorICAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLAorICAgIDIsICAzNCwgIDE2LAorICAgIDIsICAzNCwgIDEyCisgIH0sCisgIHsKKyAgICA2LCAvLyBWZXIuNgorICAgIDE3MiwgIDEzNiwgIDEwOCwgICA3NiwgICA2MCwKKyAgICAxLCAgMzQsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDIsICA4NiwgIDY4LAorICAgIDQsICA0MywgIDI3LAorICAgIDQsICA0MywgIDE5LAorICAgIDQsICA0MywgIDE1LAorICAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwCisgIH0sCit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitzdGF0aWMgY29uc3QgQllURSBieUV4cFRvSW50W10gPSB7ICAxLCAgIDIsICAgNCwgICA4LCAgMTYsICAzMiwgIDY0LCAxMjgsICAyOSwgIDU4LCAxMTYsIDIzMiwgMjA1LCAxMzUsICAxOSwgIDM4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzYsIDE1MiwgIDQ1LCAgOTAsIDE4MCwgMTE3LCAyMzQsIDIwMSwgMTQzLCAgIDMsICAgNiwgIDEyLCAgMjQsICA0OCwgIDk2LCAxOTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTcsICAzOSwgIDc4LCAxNTYsICAzNywgIDc0LCAxNDgsICA1MywgMTA2LCAyMTIsIDE4MSwgMTE5LCAyMzgsIDE5MywgMTU5LCAgMzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MCwgMTQwLCAgIDUsICAxMCwgIDIwLCAgNDAsICA4MCwgMTYwLCAgOTMsIDE4NiwgMTA1LCAyMTAsIDE4NSwgMTExLCAyMjIsIDE2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk1LCAxOTAsICA5NywgMTk0LCAxNTMsICA0NywgIDk0LCAxODgsIDEwMSwgMjAyLCAxMzcsICAxNSwgIDMwLCAgNjAsIDEyMCwgMjQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUzLCAyMzEsIDIxMSwgMTg3LCAxMDcsIDIxNCwgMTc3LCAxMjcsIDI1NCwgMjI1LCAyMjMsIDE2MywgIDkxLCAxODIsIDExMywgMjI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE3LCAxNzUsICA2NywgMTM0LCAgMTcsICAzNCwgIDY4LCAxMzYsICAxMywgIDI2LCAgNTIsIDEwNCwgMjA4LCAxODksIDEwMywgMjA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI5LCAgMzEsICA2MiwgMTI0LCAyNDgsIDIzNywgMTk5LCAxNDcsICA1OSwgMTE4LCAyMzYsIDE5NywgMTUxLCAgNTEsIDEwMiwgMjA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMzLCAgMjMsICA0NiwgIDkyLCAxODQsIDEwOSwgMjE4LCAxNjksICA3OSwgMTU4LCAgMzMsICA2NiwgMTMyLCAgMjEsICA0MiwgIDg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY4LCAgNzcsIDE1NCwgIDQxLCAgODIsIDE2NCwgIDg1LCAxNzAsICA3MywgMTQ2LCAgNTcsIDExNCwgMjI4LCAyMTMsIDE4MywgMTE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMwLCAyMDksIDE5MSwgIDk5LCAxOTgsIDE0NSwgIDYzLCAxMjYsIDI1MiwgMjI5LCAyMTUsIDE3OSwgMTIzLCAyNDYsIDI0MSwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI3LCAyMTksIDE3MSwgIDc1LCAxNTAsICA0OSwgIDk4LCAxOTYsIDE0OSwgIDU1LCAxMTAsIDIyMCwgMTY1LCAgODcsIDE3NCwgIDY1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMwLCAgMjUsICA1MCwgMTAwLCAyMDAsIDE0MSwgICA3LCAgMTQsICAyOCwgIDU2LCAxMTIsIDIyNCwgMjIxLCAxNjcsICA4MywgMTY2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODEsIDE2MiwgIDg5LCAxNzgsIDEyMSwgMjQyLCAyNDksIDIzOSwgMTk1LCAxNTUsICA0MywgIDg2LCAxNzIsICA2OSwgMTM4LCAgIDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwgIDM2LCAgNzIsIDE0NCwgIDYxLCAxMjIsIDI0NCwgMjQ1LCAyNDcsIDI0MywgMjUxLCAyMzUsIDIwMywgMTM5LCAgMTEsICAyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LCAgODgsIDE3NiwgMTI1LCAyNTAsIDIzMywgMjA3LCAxMzEsICAyNywgIDU0LCAxMDgsIDIxNiwgMTczLCAgNzEsIDE0MiwgICAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitzdGF0aWMgY29uc3QgQllURSBieUludFRvRXhwW10gPSB7ICAwLCAgIDAsICAgMSwgIDI1LCAgIDIsICA1MCwgIDI2LCAxOTgsICAgMywgMjIzLCAgNTEsIDIzOCwgIDI3LCAxMDQsIDE5OSwgIDc1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMTAwLCAyMjQsICAxNCwgIDUyLCAxNDEsIDIzOSwgMTI5LCAgMjgsIDE5MywgMTA1LCAyNDgsIDIwMCwgICA4LCAgNzYsIDExMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDEzOCwgMTAxLCAgNDcsIDIyNSwgIDM2LCAgMTUsICAzMywgIDUzLCAxNDcsIDE0MiwgMjE4LCAyNDAsICAxOCwgMTMwLCAgNjksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwgMTgxLCAxOTQsIDEyNSwgMTA2LCAgMzksIDI0OSwgMTg1LCAyMDEsIDE1NCwgICA5LCAxMjAsICA3NywgMjI4LCAxMTQsIDE2NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDE5MSwgMTM5LCAgOTgsIDEwMiwgMjIxLCAgNDgsIDI1MywgMjI2LCAxNTIsICAzNywgMTc5LCAgMTYsIDE0NSwgIDM0LCAxMzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NCwgMjA4LCAxNDgsIDIwNiwgMTQzLCAxNTAsIDIxOSwgMTg5LCAyNDEsIDIxMCwgIDE5LCAgOTIsIDEzMSwgIDU2LCAgNzAsICA2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLCAgNjYsIDE4MiwgMTYzLCAxOTUsICA3MiwgMTI2LCAxMTAsIDEwNywgIDU4LCAgNDAsICA4NCwgMjUwLCAxMzMsIDE4NiwgIDYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAyLCAgOTQsIDE1NSwgMTU5LCAgMTAsICAyMSwgMTIxLCAgNDMsICA3OCwgMjEyLCAyMjksIDE3MiwgMTE1LCAyNDMsIDE2NywgIDg3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgMTEyLCAxOTIsIDI0NywgMTQwLCAxMjgsICA5OSwgIDEzLCAxMDMsICA3NCwgMjIyLCAyMzcsICA0OSwgMTk3LCAyNTQsICAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyNywgMTY1LCAxNTMsIDExOSwgIDM4LCAxODQsIDE4MCwgMTI0LCAgMTcsICA2OCwgMTQ2LCAyMTcsICAzNSwgIDMyLCAxMzcsICA0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1LCAgNjMsIDIwOSwgIDkxLCAxNDksIDE4OCwgMjA3LCAyMDUsIDE0NCwgMTM1LCAxNTEsIDE3OCwgMjIwLCAyNTIsIDE5MCwgIDk3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQyLCAgODYsIDIxMSwgMTcxLCAgMjAsICA0MiwgIDkzLCAxNTgsIDEzMiwgIDYwLCAgNTcsICA4MywgIDcxLCAxMDksICA2NSwgMTYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEsICA0NSwgIDY3LCAyMTYsIDE4MywgMTIzLCAxNjQsIDExOCwgMTk2LCAgMjMsICA3MywgMjM2LCAxMjcsICAxMiwgMTExLCAyNDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDgsIDE2MSwgIDU5LCAgODIsICA0MSwgMTU3LCAgODUsIDE3MCwgMjUxLCAgOTYsIDEzNCwgMTc3LCAxODcsIDIwNCwgIDYyLCAgOTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDMsICA4OSwgIDk1LCAxNzYsIDE1NiwgMTY5LCAxNjAsICA4MSwgIDExLCAyNDUsICAyMiwgMjM1LCAxMjIsIDExNywgIDQ0LCAyMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OSwgMTc0LCAyMTMsIDIzMywgMjMwLCAyMzEsIDE3MywgMjMyLCAxMTYsIDIxNCwgMjQ0LCAyMzQsIDE2OCwgIDgwLCAgODgsIDE3NQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworc3RhdGljIGNvbnN0IEJZVEUgYnlSU0V4cDdbXSAgPSB7ODcsIDIyOSwgMTQ2LCAxNDksIDIzOCwgMTAyLCAgMjF9Oworc3RhdGljIGNvbnN0IEJZVEUgYnlSU0V4cDEwW10gPSB7MjUxLCAgNjcsICA0NiwgIDYxLCAxMTgsICA3MCwgIDY0LCAgOTQsICAzMiwgIDQ1fTsKK3N0YXRpYyBjb25zdCBCWVRFIGJ5UlNFeHAxM1tdID0geyA3NCwgMTUyLCAxNzYsIDEwMCwgIDg2LCAxMDAsIDEwNiwgMTA0LCAxMzAsIDIxOCwgMjA2LCAxNDAsICA3OH07CitzdGF0aWMgY29uc3QgQllURSBieVJTRXhwMTVbXSA9IHsgIDgsIDE4MywgIDYxLCAgOTEsIDIwMiwgIDM3LCAgNTEsICA1OCwgIDU4LCAyMzcsIDE0MCwgMTI0LCAgIDUsICA5OSwgMTA1fTsKK3N0YXRpYyBjb25zdCBCWVRFIGJ5UlNFeHAxNltdID0gezEyMCwgMTA0LCAxMDcsIDEwOSwgMTAyLCAxNjEsICA3NiwgICAzLCAgOTEsIDE5MSwgMTQ3LCAxNjksIDE4MiwgMTk0LCAyMjUsIDEyMH07CitzdGF0aWMgY29uc3QgQllURSBieVJTRXhwMTdbXSA9IHsgNDMsIDEzOSwgMjA2LCAgNzgsICA0MywgMjM5LCAxMjMsIDIwNiwgMjE0LCAxNDcsICAyNCwgIDk5LCAxNTAsICAzOSwgMjQzLCAxNjMsIDEzNn07CitzdGF0aWMgY29uc3QgQllURSBieVJTRXhwMThbXSA9IHsyMTUsIDIzNCwgMTU4LCAgOTQsIDE4NCwgIDk3LCAxMTgsIDE3MCwgIDc5LCAxODcsIDE1MiwgMTQ4LCAyNTIsIDE3OSwgICA1LCAgOTgsICA5NiwgMTUzfTsKK3N0YXRpYyBjb25zdCBCWVRFIGJ5UlNFeHAyMFtdID0geyAxNywgIDYwLCAgNzksICA1MCwgIDYxLCAxNjMsICAyNiwgMTg3LCAyMDIsIDE4MCwgMjIxLCAyMjUsICA4MywgMjM5LCAxNTYsIDE2NCwgMjEyLCAyMTIsIDE4OCwgMTkwfTsKK3N0YXRpYyBjb25zdCBCWVRFIGJ5UlNFeHAyMltdID0gezIxMCwgMTcxLCAyNDcsIDI0MiwgIDkzLCAyMzAsICAxNCwgMTA5LCAyMjEsICA1MywgMjAwLCAgNzQsICAgOCwgMTcyLCAgOTgsICA4MCwgMjE5LCAxMzQsIDE2MCwgMTA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY1LCAyMzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK3N0YXRpYyBjb25zdCBCWVRFIGJ5UlNFeHAyNFtdID0gezIyOSwgMTIxLCAxMzUsICA0OCwgMjExLCAxMTcsIDI1MSwgMTI2LCAxNTksIDE4MCwgMTY5LCAxNTIsIDE5MiwgMjI2LCAyMjgsIDIxOCwgMTExLCAgIDAsIDExNywgMjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODcsICA5NiwgMjI3LCAgMjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK3N0YXRpYyBjb25zdCBCWVRFIGJ5UlNFeHAyNltdID0gezE3MywgMTI1LCAxNTgsICAgMiwgMTAzLCAxODIsIDExOCwgIDE3LCAxNDUsIDIwMSwgMTExLCAgMjgsIDE2NSwgIDUzLCAxNjEsICAyMSwgMjQ1LCAxNDIsICAxMywgMTAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsIDIyNywgMTUzLCAxNDUsIDIxOCwgIDcwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitzdGF0aWMgY29uc3QgQllURSBieVJTRXhwMjhbXSA9IHsxNjgsIDIyMywgMjAwLCAxMDQsIDIyNCwgMjM0LCAxMDgsIDE4MCwgMTEwLCAxOTAsIDE5NSwgMTQ3LCAyMDUsICAyNywgMjMyLCAyMDEsICAyMSwgIDQzLCAyNDUsICA4NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyLCAxOTUsIDIxMiwgMTE5LCAyNDIsICAzNywgICA5LCAxMjMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK3N0YXRpYyBjb25zdCBCWVRFIGJ5UlNFeHAzMFtdID0geyA0MSwgMTczLCAxNDUsIDE1MiwgMjE2LCAgMzEsIDE3OSwgMTgyLCAgNTAsICA0OCwgMTEwLCAgODYsIDIzOSwgIDk2LCAyMjIsIDEyNSwgIDQyLCAxNzMsIDIyNiwgMTkzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyNCwgMTMwLCAxNTYsICAzNywgMjUxLCAyMTYsIDIzOCwgIDQwLCAxOTIsIDE4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Oworc3RhdGljIGNvbnN0IEJZVEUgYnlSU0V4cDMyW10gPSB7IDEwLCAgIDYsIDEwNiwgMTkwLCAyNDksIDE2NywgICA0LCAgNjcsIDIwOSwgMTM4LCAxMzgsICAzMiwgMjQyLCAxMjMsICA4OSwgIDI3LCAxMjAsIDE4NSwgIDgwLCAxNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgsICA2OSwgMTcxLCAgNjAsICAyOCwgMjIyLCAgODAsICA1MiwgMjU0LCAxODUsIDIyMCwgMjQxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitzdGF0aWMgY29uc3QgQllURSBieVJTRXhwMzRbXSA9IHsxMTEsICA3NywgMTQ2LCAgOTQsICAyNiwgIDIxLCAxMDgsICAxOSwgMTA1LCAgOTQsIDExMywgMTkzLCAgODYsIDE0MCwgMTYzLCAxMjUsICA1OCwgMTU4LCAyMjksIDIzOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxOCwgMTAzLCAgNTYsICA3MCwgMTE0LCAgNjEsIDE4MywgMTI5LCAxNjcsICAxMywgIDk4LCAgNjIsIDEyOSwgIDUxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitzdGF0aWMgY29uc3QgQllURSBieVJTRXhwMzZbXSA9IHsyMDAsIDE4MywgIDk4LCAgMTYsIDE3MiwgIDMxLCAyNDYsIDIzNCwgIDYwLCAxNTIsIDExNSwgICAwLCAxNjcsIDE1MiwgMTEzLCAyNDgsIDIzOCwgMTA3LCAgMTgsICA2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxOCwgIDM3LCAgODcsIDIxMCwgMTA1LCAxNzcsIDEyMCwgIDc0LCAxMjEsIDE5NiwgMTE3LCAyNTEsIDExMywgMjMzLCAgMzAsIDEyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Oworc3RhdGljIGNvbnN0IEJZVEUgYnlSU0V4cDM4W10gPSB7MTU5LCAgMzQsICAzOCwgMjI4LCAyMzAsICA1OSwgMjQzLCAgOTUsICA0OSwgMjE4LCAxNzYsIDE2NCwgIDIwLCAgNjUsICA0NSwgMTExLCAgMzksICA4MSwgIDQ5LCAxMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTMsIDIyMiwgMTkzLCAyNTAsIDI0MiwgMTY4LCAyMTcsICA0MSwgMTY0LCAyNDcsIDE3NywgIDMwLCAyMzgsICAxOCwgMTIwLCAxNTMsICA2MCwgMTkzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitzdGF0aWMgY29uc3QgQllURSBieVJTRXhwNDBbXSA9IHsgNTksIDExNiwgIDc5LCAxNjEsIDI1MiwgIDk4LCAxMjgsIDIwNSwgMTI4LCAxNjEsIDI0NywgIDU3LCAxNjMsICA1NiwgMjM1LCAxMDYsICA1MywgIDI2LCAxODcsIDE3NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjYsIDEwNCwgMTcwLCAgIDcsIDE3NSwgIDM1LCAxODEsIDExNCwgIDg4LCAgNDEsICA0NywgMTYzLCAxMjUsIDEzNCwgIDcyLCAgMjAsIDIzMiwgIDUzLCAgMzUsICAxNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Oworc3RhdGljIGNvbnN0IEJZVEUgYnlSU0V4cDQyW10gPSB7MjUwLCAxMDMsIDIyMSwgMjMwLCAgMjUsICAxOCwgMTM3LCAyMzEsICAgMCwgICAzLCAgNTgsIDI0MiwgMjIxLCAxOTEsIDExMCwgIDg0LCAyMzAsICAgOCwgMTg4LCAxMDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwgMTQ3LCAgMTUsIDEzMSwgMTM5LCAgMzQsIDEwMSwgMjIzLCAgMzksIDEwMSwgMjEzLCAxOTksIDIzNywgMjU0LCAyMDEsIDEyMywgMTcxLCAxNjIsIDE5NCwgMTE3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAsICA5NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Oworc3RhdGljIGNvbnN0IEJZVEUgYnlSU0V4cDQ0W10gPSB7MTkwLCAgIDcsICA2MSwgMTIxLCAgNzEsIDI0NiwgIDY5LCAgNTUsIDE2OCwgMTg4LCAgODksIDI0MywgMTkxLCAgMjUsICA3MiwgMTIzLCAgIDksIDE0NSwgIDE0LCAyNDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAyMzgsICA0NCwgIDc4LCAxNDMsICA2MiwgMjI0LCAxMjYsIDExOCwgMTE0LCAgNjgsIDE2MywgIDUyLCAxOTQsIDIxNywgMTQ3LCAyMDQsIDE2OSwgIDM3LCAxMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTMsIDEwMiwgIDczLCAxODEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK3N0YXRpYyBjb25zdCBCWVRFIGJ5UlNFeHA0NltdID0gezExMiwgIDk0LCAgODgsIDExMiwgMjUzLCAyMjQsIDIwMiwgMTE1LCAxODcsICA5OSwgIDg5LCAgIDUsICA1NCwgMTEzLCAxMjksICA0NCwgIDU4LCAgMTYsIDEzNSwgMjE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY5LCAyMTEsICAzNiwgICAxLCAgIDQsICA5NiwgIDYwLCAyNDEsICA3MywgMTA0LCAyMzQsICAgOCwgMjQ5LCAyNDUsIDExOSwgMTc0LCAgNTIsICAyNSwgMTU3LCAyMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywgMjAyLCAyMjMsICAxOSwgIDgyLCAgMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK3N0YXRpYyBjb25zdCBCWVRFIGJ5UlNFeHA0OFtdID0gezIyOCwgIDI1LCAxOTYsIDEzMCwgMjExLCAxNDYsICA2MCwgIDI0LCAyNTEsICA5MCwgIDM5LCAxMDIsIDI0MCwgIDYxLCAxNzgsICA2MywgIDQ2LCAxMjMsIDExNSwgIDE4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxLCAxMTEsIDEzNSwgMTYwLCAxODIsIDIwNSwgMTA3LCAyMDYsICA5NSwgMTUwLCAxMjAsIDE4NCwgIDkxLCAgMjEsIDI0NywgMTU2LCAxNDAsIDIzOCwgMTkxLCAgMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NCwgMjI3LCAgODQsICA1MCwgMTYzLCAgMzksICAzNCwgMTA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitzdGF0aWMgY29uc3QgQllURSBieVJTRXhwNTBbXSA9IHsyMzIsIDEyNSwgMTU3LCAxNjEsIDE2NCwgICA5LCAxMTgsICA0NiwgMjA5LCAgOTksIDIwMywgMTkzLCAgMzUsICAgMywgMjA5LCAxMTEsIDE5NSwgMjQyLCAyMDMsIDIyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LCAgMTMsICAzMiwgMTYwLCAxMjYsIDIwOSwgMTMwLCAxNjAsIDI0MiwgMjE1LCAyNDIsICA3NSwgIDc3LCAgNDIsIDE4OSwgIDMyLCAxMTMsICA2NSwgMTI0LCAgNjksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjgsIDExNCwgMjM1LCAxNzUsIDEyNCwgMTcwLCAyMTUsIDIzMiwgMTMzLCAyMDUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK3N0YXRpYyBjb25zdCBCWVRFIGJ5UlNFeHA1MltdID0gezExNiwgIDUwLCAgODYsIDE4NiwgIDUwLCAyMjAsIDI1MSwgIDg5LCAxOTIsICA0NiwgIDg2LCAxMjcsIDEyNCwgIDE5LCAxODQsIDIzMywgMTUxLCAyMTUsICAyMiwgIDE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTksIDE0NSwgIDM3LCAyNDIsIDIwMywgMTM0LCAyNTQsICA4OSwgMTkwLCAgOTQsICA1OSwgIDY1LCAxMjQsIDExMywgMTAwLCAyMzMsIDIzNSwgMTIxLCAgMjIsICA3NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg2LCAgOTcsICAzOSwgMjQyLCAyMDAsIDIyMCwgMTAxLCAgMzMsIDIzOSwgMjU0LCAxMTYsICA1MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Oworc3RhdGljIGNvbnN0IEJZVEUgYnlSU0V4cDU0W10gPSB7MTgzLCAgMjYsIDIwMSwgIDg3LCAyMTAsIDIyMSwgMTEzLCAgMjEsICA0NiwgIDY1LCAgNDUsICA1MCwgMjM4LCAxODQsIDI0OSwgMjI1LCAxMDIsICA1OCwgMjA5LCAyMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDksIDE2NSwgIDI2LCAgOTUsIDE4NCwgMTkyLCAgNTIsIDI0NSwgIDM1LCAyNTQsIDIzOCwgMTc1LCAxNzIsICA3OSwgMTIzLCAgMjUsIDEyMiwgIDQzLCAxMjAsIDEwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxNSwgIDgwLCAxMjgsIDIwMSwgMjM1LCAgIDgsIDE1MywgIDU5LCAxMDEsICAzMSwgMTk4LCAgNzYsICAzMSwgMTU2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitzdGF0aWMgY29uc3QgQllURSBieVJTRXhwNTZbXSA9IHsxMDYsIDEyMCwgMTA3LCAxNTcsIDE2NCwgMjE2LCAxMTIsIDExNiwgICAyLCAgOTEsIDI0OCwgMTYzLCAgMzYsIDIwMSwgMjAyLCAyMjksICAgNiwgMTQ0LCAyNTQsIDE1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNSwgMjA4LCAxNzAsIDIwOSwgIDEyLCAxMzksIDEyNywgMTQyLCAxODIsIDI0OSwgMTc3LCAxNzQsIDE5MCwgIDI4LCAgMTAsICA4NSwgMjM5LCAxODQsIDEwMSwgMTI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUyLCAyMDYsICA5NiwgIDIzLCAxNjMsICA2MSwgIDI3LCAxOTYsIDI0NywgMTUxLCAxNTQsIDIwMiwgMjA3LCAgMjAsICA2MSwgIDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitzdGF0aWMgY29uc3QgQllURSBieVJTRXhwNThbXSA9IHsgODIsIDExNiwgIDI2LCAyNDcsICA2NiwgIDI3LCAgNjIsIDEwNywgMjUyLCAxODIsIDIwMCwgMTg1LCAyMzUsICA1NSwgMjUxLCAyNDIsIDIxMCwgMTQ0LCAxNTQsIDIzNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzYsIDE0MSwgMTkyLCAyNDgsIDE1MiwgMjQ5LCAyMDYsICA4NSwgMjUzLCAxNDIsICA2NSwgMTY1LCAxMjUsICAyMywgIDI0LCAgMzAsIDEyMiwgMjQwLCAyMTQsICAgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjksIDIxOCwgIDI5LCAxNDUsIDEyNywgMTM0LCAyMDYsIDI0NSwgMTE3LCAgMjksICA0MSwgIDYzLCAxNTksIDE0MiwgMjMzLCAxMjUsIDE0OCwgMTIzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitzdGF0aWMgY29uc3QgQllURSBieVJTRXhwNjBbXSA9IHsxMDcsIDE0MCwgIDI2LCAgMTIsICAgOSwgMTQxLCAyNDMsIDE5NywgMjI2LCAxOTcsIDIxOSwgIDQ1LCAyMTEsIDEwMSwgMjE5LCAxMjAsICAyOCwgMTgxLCAxMjcsICAgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgMjQ3LCAgIDIsIDIwNSwgMTk4LCAgNTcsIDExNSwgMjE5LCAxMDEsIDEwOSwgMTYwLCAgODIsICAzNywgIDM4LCAyMzgsICA0OSwgMTYwLCAyMDksIDEyMSwgIDg2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEsIDEyNCwgIDMwLCAxODEsICA4NCwgIDI1LCAxOTQsICA4NywgIDY1LCAxMDIsIDE5MCwgMjIwLCAgNzAsICAyNywgMjA5LCAgMTYsICA4OSwgICA3LCAgMzMsIDI0MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Oworc3RhdGljIGNvbnN0IEJZVEUgYnlSU0V4cDYyW10gPSB7IDY1LCAyMDIsIDExMywgIDk4LCAgNzEsIDIyMywgMjQ4LCAxMTgsIDIxNCwgIDk0LCAgIDAsIDEyMiwgIDM3LCAgMjMsICAgMiwgMjI4LCAgNTgsIDEyMSwgICA3LCAxMDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM1LCAgNzgsIDI0MywgMTE4LCAgNzAsICA3NiwgMjIzLCAgODksICA3MiwgIDUwLCAgNzAsIDExMSwgMTk0LCAgMTcsIDIxMiwgMTI2LCAxODEsICAzNSwgMjIxLCAxMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM1LCAgMTEsIDIyOSwgMTQ5LCAxNDcsIDEyMywgMjEzLCAgNDAsIDExNSwgICA2LCAyMDAsIDEwMCwgIDI2LCAyNDYsIDE4MiwgMjE4LCAxMjcsIDIxNSwgIDM2LCAxODYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwLCAxMDYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK3N0YXRpYyBjb25zdCBCWVRFIGJ5UlNFeHA2NFtdID0geyA0NSwgIDUxLCAxNzUsICAgOSwgICA3LCAxNTgsIDE1OSwgIDQ5LCAgNjgsIDExOSwgIDkyLCAxMjMsIDE3NywgMjA0LCAxODcsIDI1NCwgMjAwLCAgNzgsIDE0MSwgMTQ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOSwgIDI2LCAxMjcsICA1MywgMTYwLCAgOTMsIDE5OSwgMjEyLCAgMjksICAyNCwgMTQ1LCAxNTYsIDIwOCwgMTUwLCAyMTgsIDIwOSwgICA0LCAyMTYsICA5MSwgIDQ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4NCwgMTQ2LCAgNDcsIDE0MCwgMTk1LCAxOTUsIDEyNSwgMjQyLCAyMzgsICA2MywgIDk5LCAxMDgsIDE0MCwgMjMwLCAyNDIsICAzMSwgMjA0LCAgMTEsIDE3OCwgMjQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxNywgMTU2LCAyMTMsIDIzMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Oworc3RhdGljIGNvbnN0IEJZVEUgYnlSU0V4cDY2W10gPSB7ICA1LCAxMTgsIDIyMiwgMTgwLCAxMzYsIDEzNiwgMTYyLCAgNTEsICA0NiwgMTE3LCAgMTMsIDIxNSwgIDgxLCAgMTcsIDEzOSwgMjQ3LCAxOTcsIDE3MSwgIDk1LCAxNzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1LCAxMzcsIDE3OCwgIDY4LCAxMTEsICA5NSwgMTAxLCAgNDEsICA3MiwgMjE0LCAxNjksIDE5NywgIDk1LCAgIDcsICA0NCwgMTU0LCAgNzcsIDExMSwgMjM2LCAgNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMSwgMTQzLCAgNjMsICA4NywgIDgwLCAyNTMsIDI0MCwgMTI2LCAyMTcsICA3NywgIDM0LCAyMzIsIDEwNiwgIDUwLCAxNjgsICA4MiwgIDc2LCAxNDYsICA2NywgMTA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzEsICAyNSwgMTMyLCAgOTMsICA0NSwgMTA1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitzdGF0aWMgY29uc3QgQllURSBieVJTRXhwNjhbXSA9IHsyNDcsIDE1OSwgMjIzLCAgMzMsIDIyNCwgIDkzLCAgNzcsICA3MCwgIDkwLCAxNjAsICAzMiwgMjU0LCAgNDMsIDE1MCwgIDg0LCAxMDEsIDE5MCwgMjA1LCAxMzMsICA1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwLCAyMDIsIDE2NSwgMjIwLCAyMDMsIDE1MSwgIDkzLCAgODQsICAxNSwgIDg0LCAyNTMsIDE3MywgMTYwLCAgODksIDIyNywgIDUyLCAxOTksICA5NywgIDk1LCAyMzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MiwgMTc3LCAgNDEsIDEyNSwgMTM3LCAyNDEsIDE2NiwgMjI1LCAxMTgsICAgMiwgIDU0LCAgMzIsICA4MiwgMjE1LCAxNzUsIDE5OCwgIDQzLCAyMzgsIDIzNSwgIDI3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxLCAxODQsIDEyNywgICAzLCAgIDUsICAgOCwgMTYzLCAyMzgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworc3RhdGljIGNvbnN0IEJZVEUqIGJ5UlNFeHBbXSA9IHtOVUxMLCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICBOVUxMLCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICBOVUxMLCAgICAgIGJ5UlNFeHA3LCAgTlVMTCwgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieVJTRXhwMTAsIE5VTEwsICAgICAgTlVMTCwgICAgICBieVJTRXhwMTMsIE5VTEwsICAgICAgYnlSU0V4cDE1LCBieVJTRXhwMTYsIGJ5UlNFeHAxNywgYnlSU0V4cDE4LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieVJTRXhwMjAsIE5VTEwsICAgICAgYnlSU0V4cDIyLCBOVUxMLCAgICAgIGJ5UlNFeHAyNCwgTlVMTCwgICAgICBieVJTRXhwMjYsIE5VTEwsICAgICAgYnlSU0V4cDI4LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieVJTRXhwMzAsIE5VTEwsICAgICAgYnlSU0V4cDMyLCBOVUxMLCAgICAgIGJ5UlNFeHAzNCwgTlVMTCwgICAgICBieVJTRXhwMzYsIE5VTEwsICAgICAgYnlSU0V4cDM4LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieVJTRXhwNDAsIE5VTEwsICAgICAgYnlSU0V4cDQyLCBOVUxMLCAgICAgIGJ5UlNFeHA0NCwgTlVMTCwgICAgICBieVJTRXhwNDYsIE5VTEwsICAgICAgYnlSU0V4cDQ4LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieVJTRXhwNTAsIE5VTEwsICAgICAgYnlSU0V4cDUyLCBOVUxMLCAgICAgIGJ5UlNFeHA1NCwgTlVMTCwgICAgICBieVJTRXhwNTYsIE5VTEwsICAgICAgYnlSU0V4cDU4LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieVJTRXhwNjAsIE5VTEwsICAgICAgYnlSU0V4cDYyLCBOVUxMLCAgICAgIGJ5UlNFeHA2NCwgTlVMTCwgICAgICBieVJTRXhwNjYsIE5VTEwsICAgICAgYnlSU0V4cDY4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworc3RhdGljIGNvbnN0IGludCBuSW5kaWNhdG9yTGVuTnVtZXJhbFtdICA9IHsxMCwgMTIsIDE0fTsKK3N0YXRpYyBjb25zdCBpbnQgbkluZGljYXRvckxlbkFscGhhYmV0W10gPSB7IDksIDExLCAxM307CitzdGF0aWMgY29uc3QgaW50IG5JbmRpY2F0b3JMZW44Qml0W10JICA9IHsgOCwgMTYsIDE2fTsKKworc3RhdGljIGludCBtX25jRGF0YUNvZGVXb3JkQml0Oworc3RhdGljIEJZVEUgbV9ieURhdGFDb2RlV29yZFtNQVhfREFUQUNPREVXT1JEXTsKKworc3RhdGljIGludCBtX25jRGF0YUJsb2NrOworc3RhdGljIEJZVEUgbV9ieUJsb2NrTW9kZVtNQVhfREFUQUNPREVXT1JEXTsKK3N0YXRpYyBpbnQgbV9uQmxvY2tMZW5ndGhbTUFYX0RBVEFDT0RFV09SRF07CisKK3N0YXRpYyBpbnQgbV9uY0FsbENvZGVXb3JkOworc3RhdGljIEJZVEUgbV9ieUFsbENvZGVXb3JkW01BWF9BTExDT0RFV09SRF07CitzdGF0aWMgQllURSBtX2J5UlNXb3JrW01BWF9DT0RFQkxPQ0tdOworCitzdGF0aWMgaW50IG1fbkxldmVsOworc3RhdGljIGludCBtX25WZXJzaW9uOworc3RhdGljIGludCBtX25NYXNraW5nTm87CisKK2ludCBtX25TeW1ibGVTaXplOworQllURSBtX2J5TW9kdWxlRGF0YVtNQVhfTU9EVUxFU0laRV1bTUFYX01PRFVMRVNJWkVdOworCisjZGVmaW5lIG1pbihhLGIpCSgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKworc3RhdGljIGJvb2wgSXNOdW1lcmFsRGF0YSh1bnNpZ25lZCBjaGFyIGMpCit7CisgIGlmKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgIHJldHVybiBUUlVFOworCisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGJvb2wgSXNBbHBoYWJldERhdGEodW5zaWduZWQgY2hhciBjKQoreworICBpZihjID49ICcwJyAmJiBjIDw9ICc5JykKKyAgICByZXR1cm4gVFJVRTsKKworICBpZihjID49ICdBJyAmJiBjIDw9ICdaJykKKyAgICByZXR1cm4gVFJVRTsKKworICBpZihjID09ICcgJyB8fCBjID09ICckJyB8fCBjID09ICclJyB8fCBjID09ICcqJyB8fCBjID09ICcrJyB8fCBjID09ICctJyB8fCBjID09ICcuJworICAgICAgfHwgYyA9PSAnLycgfHwgYyA9PSAnOicpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgQllURSBBbHBoYWJldFRvQmluYWx5KEJZVEUgYykKK3sKKyAgaWYoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHJldHVybiAoQllURSkoYyAtICcwJyk7CisKKyAgaWYoYyA+PSAnQScgJiYgYyA8PSAnWicpIHJldHVybiAoQllURSkoYyAtICdBJyArIDEwKTsKKworICBpZihjID09ICcgJykgcmV0dXJuIDM2OworCisgIGlmKGMgPT0gJyQnKSByZXR1cm4gMzc7CisKKyAgaWYoYyA9PSAnJScpIHJldHVybiAzODsKKworICBpZihjID09ICcqJykgcmV0dXJuIDM5OworCisgIGlmKGMgPT0gJysnKSByZXR1cm4gNDA7CisKKyAgaWYoYyA9PSAnLScpIHJldHVybiA0MTsKKworICBpZihjID09ICcuJykgcmV0dXJuIDQyOworCisgIGlmKGMgPT0gJy8nKSByZXR1cm4gNDM7CisKKyAgcmV0dXJuIDQ0OworfQorc3RhdGljIGludCBHZXRCaXRMZW5ndGgoQllURSBuTW9kZSwgaW50IG5jRGF0YSwgaW50IG5WZXJHcm91cCkKK3sKKyAgaW50IG5jQml0cyA9IDA7CisKKyAgc3dpdGNoKG5Nb2RlKQorICB7CisgIGNhc2UgUVJfTU9ERV9OVU1FUkFMOgorICAgIG5jQml0cyA9IDQgKyBuSW5kaWNhdG9yTGVuTnVtZXJhbFtuVmVyR3JvdXBdICsgKDEwICogKG5jRGF0YSAvIDMpKTsKKyAgICBzd2l0Y2gobmNEYXRhICUgMykKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgbmNCaXRzICs9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBuY0JpdHMgKz0gNzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlIFFSX01PREVfQUxQSEFCRVQ6CisgICAgbmNCaXRzID0gNCArIG5JbmRpY2F0b3JMZW5BbHBoYWJldFtuVmVyR3JvdXBdICsgKDExICogKG5jRGF0YSAvIDIpKSArICg2ICogKG5jRGF0YSAlIDIpKTsKKyAgICBicmVhazsKKworICBjYXNlIFFSX01PREVfOEJJVDoKKyAgICBuY0JpdHMgPSA0ICsgbkluZGljYXRvckxlbjhCaXRbblZlckdyb3VwXSArICg4ICogbmNEYXRhKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIG5jQml0czsKK30KKworc3RhdGljIGludCBTZXRCaXRTdHJlYW0oaW50IG5JbmRleCwgV09SRCB3RGF0YSwgaW50IG5jRGF0YSkKK3sKKyAgaW50IGk7CisKKyAgaWYobkluZGV4ID09IC0xIHx8IG5JbmRleCArIG5jRGF0YSA+IE1BWF9EQVRBQ09ERVdPUkQgKiA4KQorICAgIHJldHVybiAtMTsKKworICBmb3IoaSA9IDA7IGkgPCBuY0RhdGE7ICsraSkKKyAgeworICAgIGlmKHdEYXRhICYgKDEgPDwgKG5jRGF0YSAtIGkgLSAxKSkpCisgICAgeworICAgICAgbV9ieURhdGFDb2RlV29yZFsobkluZGV4ICsgaSkgLyA4XSB8PSAxIDw8ICg3IC0gKChuSW5kZXggKyBpKSAlIDgpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gbkluZGV4ICsgbmNEYXRhOworfQorCitzdGF0aWMgdm9pZCBHZXRSU0NvZGVXb3JkKEJZVEUqIGxwYnlSU1dvcmssIGludCBuY0RhdGFDb2RlV29yZCwgaW50IG5jUlNDb2RlV29yZCkKK3sKKyAgaW50IGksIGo7CisKKyAgZm9yKGkgPSAwOyBpIDwgbmNEYXRhQ29kZVdvcmQgOyArK2kpCisgIHsKKyAgICBpZihscGJ5UlNXb3JrWzBdICE9IDApCisgICAgeworICAgICAgQllURSBuRXhwRmlyc3QgPSBieUludFRvRXhwW2xwYnlSU1dvcmtbMF1dOworCisgICAgICBmb3IoaiA9IDA7IGogPCBuY1JTQ29kZVdvcmQ7ICsraikKKyAgICAgIHsKKyAgICAgICAgQllURSBuRXhwRWxlbWVudCA9IChCWVRFKSgoKGludCkoYnlSU0V4cFtuY1JTQ29kZVdvcmRdW2pdICsgbkV4cEZpcnN0KSkgJSAyNTUpOworCisgICAgICAgIGxwYnlSU1dvcmtbal0gPSAoQllURSkobHBieVJTV29ya1tqICsgMV0gXiBieUV4cFRvSW50W25FeHBFbGVtZW50XSk7CisgICAgICB9CisKKyAgICAgIGZvcihqID0gbmNSU0NvZGVXb3JkOyBqIDwgbmNEYXRhQ29kZVdvcmQgKyBuY1JTQ29kZVdvcmQgLSAxOyArK2opCisgICAgICAgIGxwYnlSU1dvcmtbal0gPSBscGJ5UlNXb3JrW2ogKyAxXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGZvcihqID0gMDsgaiA8IG5jRGF0YUNvZGVXb3JkICsgbmNSU0NvZGVXb3JkIC0gMTsgKytqKQorICAgICAgICBscGJ5UlNXb3JrW2pdID0gbHBieVJTV29ya1tqICsgMV07CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFNldEFsaWdubWVudFBhdHRlcm4oaW50IHgsIGludCB5KQoreworICBzdGF0aWMgQllURSBieVBhdHRlcm5bXSA9IHsweDFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgaW50IGksIGo7CisKKyAgaWYobV9ieU1vZHVsZURhdGFbeF1beV0gJiAweDIwKQorICAgIHJldHVybjsKKworICB4IC09IDI7IHkgLT0gMjsKKworICBmb3IoaSA9IDA7IGkgPCA1OyArK2kpCisgIHsKKyAgICBmb3IoaiA9IDA7IGogPCA1OyArK2opCisgICAgeworICAgICAgbV9ieU1vZHVsZURhdGFbeCArIGpdW3kgKyBpXSA9IChieVBhdHRlcm5baV0gJiAoMSA8PCAoNCAtIGopKSkgPyAnXHgzMCcgOiAnXHgyMCc7CisgICAgfQorICB9Cit9CitzdGF0aWMgdm9pZCBTZXRGaW5kZXJQYXR0ZXJuKGludCB4LCBpbnQgeSkKK3sKKyAgc3RhdGljIEJZVEUgYnlQYXR0ZXJuW10gPSB7MHg3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgIGludCBpLCBqOworCisgIGZvcihpID0gMDsgaSA8IDc7ICsraSkKKyAgeworICAgIGZvcihqID0gMDsgaiA8IDc7ICsraikKKyAgICB7CisgICAgICBtX2J5TW9kdWxlRGF0YVt4ICsgal1beSArIGldID0gKGJ5UGF0dGVybltpXSAmICgxIDw8ICg2IC0gaikpKSA/ICdceDMwJyA6ICdceDIwJzsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgU2V0VmVyc2lvblBhdHRlcm4odm9pZCkKK3sKKyAgaW50IGksIGo7CisgIGludCBuVmVyRGF0YTsKKworICBpZihtX25WZXJzaW9uIDw9IDYpCisgICAgcmV0dXJuOworCisgIG5WZXJEYXRhID0gbV9uVmVyc2lvbiA8PCAxMjsKKworICBmb3IoaSA9IDA7IGkgPCA2OyArK2kpCisgIHsKKyAgICBpZihuVmVyRGF0YSAmICgxIDw8ICgxNyAtIGkpKSkKKyAgICB7CisgICAgICBuVmVyRGF0YSBePSAoMHgxZjI1IDw8ICg1IC0gaSkpOworICAgIH0KKyAgfQorCisgIG5WZXJEYXRhICs9IG1fblZlcnNpb24gPDwgMTI7CisKKyAgZm9yKGkgPSAwOyBpIDwgNjsgKytpKQorICB7CisgICAgZm9yKGogPSAwOyBqIDwgMzsgKytqKQorICAgIHsKKyAgICAgIG1fYnlNb2R1bGVEYXRhW21fblN5bWJsZVNpemUgLSAxMSArIGpdW2ldID0gbV9ieU1vZHVsZURhdGFbaV1bbV9uU3ltYmxlU2l6ZSAtIDExICsgal0gPQorICAgICAgICAgICAgKG5WZXJEYXRhICYgKDEgPDwgKGkgKiAzICsgaikpKSA/ICdceDMwJyA6ICdceDIwJzsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgU2V0Q29kZVdvcmRQYXR0ZXJuKHZvaWQpCit7CisgIGludCB4ID0gbV9uU3ltYmxlU2l6ZTsKKyAgaW50IHkgPSBtX25TeW1ibGVTaXplIC0gMTsKKworICBpbnQgbkNvZWZfeCA9IDE7CisgIGludCBuQ29lZl95ID0gMTsKKworICBpbnQgaSwgajsKKworICBmb3IoaSA9IDA7IGkgPCBtX25jQWxsQ29kZVdvcmQ7ICsraSkKKyAgeworICAgIGZvcihqID0gMDsgaiA8IDg7ICsraikKKyAgICB7CisgICAgICBkbworICAgICAgeworICAgICAgICB4ICs9IG5Db2VmX3g7CisgICAgICAgIG5Db2VmX3ggKj0gLTE7CisKKyAgICAgICAgaWYobkNvZWZfeCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICB5ICs9IG5Db2VmX3k7CisKKyAgICAgICAgICBpZih5IDwgMCB8fCB5ID09IG1fblN5bWJsZVNpemUpCisgICAgICAgICAgeworICAgICAgICAgICAgeSA9ICh5IDwgMCkgPyAwIDogbV9uU3ltYmxlU2l6ZSAtIDE7CisgICAgICAgICAgICBuQ29lZl95ICo9IC0xOworCisgICAgICAgICAgICB4IC09IDI7CisKKyAgICAgICAgICAgIGlmKHggPT0gNikKKyAgICAgICAgICAgICAgLS14OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgd2hpbGUobV9ieU1vZHVsZURhdGFbeF1beV0gJiAweDIwKTsKKworICAgICAgbV9ieU1vZHVsZURhdGFbeF1beV0gPSAobV9ieUFsbENvZGVXb3JkW2ldICYgKDEgPDwgKDcgLSBqKSkpID8gJ1x4MDInIDogJ1x4MDAnOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBTZXRNYXNraW5nUGF0dGVybihpbnQgblBhdHRlcm5ObykKK3sKKyAgaW50IGksIGo7CisKKyAgZm9yKGkgPSAwOyBpIDwgbV9uU3ltYmxlU2l6ZTsgKytpKQorICB7CisgICAgZm9yKGogPSAwOyBqIDwgbV9uU3ltYmxlU2l6ZTsgKytqKQorICAgIHsKKyAgICAgIGlmKCEobV9ieU1vZHVsZURhdGFbal1baV0gJiAweDIwKSkKKyAgICAgIHsKKyAgICAgICAgYm9vbCBiTWFzazsKKworICAgICAgICBzd2l0Y2goblBhdHRlcm5ObykKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgYk1hc2sgPSAoYm9vbCkoKGkgKyBqKSAlIDIgPT0gMCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGJNYXNrID0gKGJvb2wpKGkgJSAyID09IDApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBiTWFzayA9IChib29sKShqICUgMyA9PSAwKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgYk1hc2sgPSAoYm9vbCkoKGkgKyBqKSAlIDMgPT0gMCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgIGJNYXNrID0gKGJvb2wpKCgoaSAvIDIpICsgKGogLyAzKSkgJSAyID09IDApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICBiTWFzayA9IChib29sKSgoKGkgKiBqKSAlIDIpICsgKChpICogaikgJSAzKSA9PSAwKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgYk1hc2sgPSAoYm9vbCkoKCgoaSAqIGopICUgMikgKyAoKGkgKiBqKSAlIDMpKSAlIDIgPT0gMCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBiTWFzayA9IChib29sKSgoKChpICogaikgJSAzKSArICgoaSArIGopICUgMikpICUgMiA9PSAwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1fYnlNb2R1bGVEYXRhW2pdW2ldID0gKEJZVEUpKChtX2J5TW9kdWxlRGF0YVtqXVtpXSAmIDB4ZmUpIHwgKCgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9ieU1vZHVsZURhdGFbal1baV0gJiAweDAyKSA+IDEpIF4gYk1hc2spKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgU2V0Rm9ybWF0SW5mb1BhdHRlcm4oaW50IG5QYXR0ZXJuTm8pCit7CisgIGludCBuRm9ybWF0SW5mbzsKKyAgaW50IGk7CisgIGludCBuRm9ybWF0RGF0YTsKKworICBzd2l0Y2gobV9uTGV2ZWwpCisgIHsKKyAgY2FzZSBRUl9MRVZFTF9NOgorICAgIG5Gb3JtYXRJbmZvID0gMHgwMDsKKyAgICBicmVhazsKKworICBjYXNlIFFSX0xFVkVMX0w6CisgICAgbkZvcm1hdEluZm8gPSAweDA4OworICAgIGJyZWFrOworCisgIGNhc2UgUVJfTEVWRUxfUToKKyAgICBuRm9ybWF0SW5mbyA9IDB4MTg7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICBuRm9ybWF0SW5mbyA9IDB4MTA7CisgICAgYnJlYWs7CisgIH0KKworICBuRm9ybWF0SW5mbyArPSBuUGF0dGVybk5vOworCisgIG5Gb3JtYXREYXRhID0gbkZvcm1hdEluZm8gPDwgMTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgNTsgKytpKQorICB7CisgICAgaWYobkZvcm1hdERhdGEgJiAoMSA8PCAoMTQgLSBpKSkpCisgICAgeworICAgICAgbkZvcm1hdERhdGEgXj0gKDB4MDUzNyA8PCAoNCAtIGkpKTsKKyAgICB9CisgIH0KKworICBuRm9ybWF0RGF0YSArPSBuRm9ybWF0SW5mbyA8PCAxMDsKKworICBuRm9ybWF0RGF0YSBePSAweDU0MTI7CisKKyAgZm9yKGkgPSAwOyBpIDw9IDU7ICsraSkKKyAgICBtX2J5TW9kdWxlRGF0YVs4XVtpXSA9IChuRm9ybWF0RGF0YSAmICgxIDw8IGkpKSA/ICdceDMwJyA6ICdceDIwJzsKKworICBtX2J5TW9kdWxlRGF0YVs4XVs3XSA9IChuRm9ybWF0RGF0YSAmICgxIDw8IDYpKSA/ICdceDMwJyA6ICdceDIwJzsKKyAgbV9ieU1vZHVsZURhdGFbOF1bOF0gPSAobkZvcm1hdERhdGEgJiAoMSA8PCA3KSkgPyAnXHgzMCcgOiAnXHgyMCc7CisgIG1fYnlNb2R1bGVEYXRhWzddWzhdID0gKG5Gb3JtYXREYXRhICYgKDEgPDwgOCkpID8gJ1x4MzAnIDogJ1x4MjAnOworCisgIGZvcihpID0gOTsgaSA8PSAxNDsgKytpKQorICAgIG1fYnlNb2R1bGVEYXRhWzE0IC0gaV1bOF0gPSAobkZvcm1hdERhdGEgJiAoMSA8PCBpKSkgPyAnXHgzMCcgOiAnXHgyMCc7CisKKyAgZm9yKGkgPSAwOyBpIDw9IDc7ICsraSkKKyAgICBtX2J5TW9kdWxlRGF0YVttX25TeW1ibGVTaXplIC0gMSAtIGldWzhdID0gKG5Gb3JtYXREYXRhICYgKDEgPDwgaSkpID8gJ1x4MzAnIDogJ1x4MjAnOworCisgIG1fYnlNb2R1bGVEYXRhWzhdW21fblN5bWJsZVNpemUgLSA4XSA9ICdceDMwJzsKKworICBmb3IoaSA9IDg7IGkgPD0gMTQ7ICsraSkKKyAgICBtX2J5TW9kdWxlRGF0YVs4XVttX25TeW1ibGVTaXplIC0gMTUgKyBpXSA9IChuRm9ybWF0RGF0YSAmICgxIDw8IGkpKSA/ICdceDMwJyA6ICdceDIwJzsKK30KKworc3RhdGljIGludCBDb3VudFBlbmFsdHkodm9pZCkKK3sKKyAgaW50IG5QZW5hbHR5ID0gMDsKKyAgaW50IGksIGosIGs7CisgIGludCBuQ291bnQgPSAwLCBzX25Db3VudDsKKworICBmb3IoaSA9IDA7IGkgPCBtX25TeW1ibGVTaXplOyArK2kpCisgIHsKKyAgICBmb3IoaiA9IDA7IGogPCBtX25TeW1ibGVTaXplIC0gNDsgKytqKQorICAgIHsKKyAgICAgIGludCBuQ291bnQgPSAxOworCisgICAgICBmb3IoayA9IGogKyAxOyBrIDwgbV9uU3ltYmxlU2l6ZTsgaysrKQorICAgICAgeworICAgICAgICBpZigoKG1fYnlNb2R1bGVEYXRhW2ldW2pdICYgMHgxMSkgPT0gMCkgPT0gKChtX2J5TW9kdWxlRGF0YVtpXVtrXSAmIDB4MTEpID09IDApKQorICAgICAgICAgICsrbkNvdW50OworICAgICAgICBlbHNlCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmKG5Db3VudCA+PSA1KQorICAgICAgeworICAgICAgICBuUGVuYWx0eSArPSAzICsgKG5Db3VudCAtIDUpOworICAgICAgfQorCisgICAgICBqID0gayAtIDE7CisgICAgfQorICB9CisKKyAgZm9yKGkgPSAwOyBpIDwgbV9uU3ltYmxlU2l6ZTsgKytpKQorICB7CisgICAgZm9yKGogPSAwOyBqIDwgbV9uU3ltYmxlU2l6ZSAtIDQ7ICsraikKKyAgICB7CisgICAgICBpbnQgbkNvdW50ID0gMTsKKworICAgICAgZm9yKGsgPSBqICsgMTsgayA8IG1fblN5bWJsZVNpemU7IGsrKykKKyAgICAgIHsKKyAgICAgICAgaWYoKChtX2J5TW9kdWxlRGF0YVtqXVtpXSAmIDB4MTEpID09IDApID09ICgobV9ieU1vZHVsZURhdGFba11baV0gJiAweDExKSA9PSAwKSkKKyAgICAgICAgICArK25Db3VudDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZihuQ291bnQgPj0gNSkKKyAgICAgIHsKKyAgICAgICAgblBlbmFsdHkgKz0gMyArIChuQ291bnQgLSA1KTsKKyAgICAgIH0KKworICAgICAgaiA9IGsgLSAxOworICAgIH0KKyAgfQorCisgIGZvcihpID0gMDsgaSA8IG1fblN5bWJsZVNpemUgLSAxOyArK2kpCisgIHsKKyAgICBmb3IoaiA9IDA7IGogPCBtX25TeW1ibGVTaXplIC0gMTsgKytqKQorICAgIHsKKyAgICAgIGlmKCgoKG1fYnlNb2R1bGVEYXRhW2ldW2pdICYgMHgxMSkgPT0gMCkgPT0gKChtX2J5TW9kdWxlRGF0YVtpICsgMV1bal0JCSYgMHgxMSkgPT0gMCkpICYmCisgICAgICAgICAgKCgobV9ieU1vZHVsZURhdGFbaV1bal0gJiAweDExKSA9PSAwKSA9PSAoKG1fYnlNb2R1bGVEYXRhW2ldCVtqICsgMV0gJiAweDExKSA9PSAwKSkgJiYKKyAgICAgICAgICAoKChtX2J5TW9kdWxlRGF0YVtpXVtqXSAmIDB4MTEpID09IDApID09ICgobV9ieU1vZHVsZURhdGFbaSArIDFdW2ogKyAxXSAmIDB4MTEpID09IDApKSkKKyAgICAgIHsKKyAgICAgICAgblBlbmFsdHkgKz0gMzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmb3IoaSA9IDA7IGkgPCBtX25TeW1ibGVTaXplOyArK2kpCisgIHsKKyAgICBmb3IoaiA9IDA7IGogPCBtX25TeW1ibGVTaXplIC0gNjsgKytqKQorICAgIHsKKyAgICAgIGlmKCgoaiA9PSAwKSB8fCAoIShtX2J5TW9kdWxlRGF0YVtpXVtqIC0gMV0gJiAweDExKSkpICYmICAgICAgIC8vIMP3u/K3+7rFzeIKKyAgICAgICAgICAobV9ieU1vZHVsZURhdGFbaV1bal0gICAgICYgMHgxMSkgICAmJiAgICAvLyCwtSAtIDEKKyAgICAgICAgICAoIShtX2J5TW9kdWxlRGF0YVtpXVtqICsgMV0gJiAweDExKSkgICYmICAvLyDD9yAtIDEKKyAgICAgICAgICAobV9ieU1vZHVsZURhdGFbaV1baiArIDJdICYgMHgxMSkgICAmJiAgICAvLyCwtSCptAorICAgICAgICAgIChtX2J5TW9kdWxlRGF0YVtpXVtqICsgM10gJiAweDExKSAgICYmICAgIC8vILC1IKmmMworICAgICAgICAgIChtX2J5TW9kdWxlRGF0YVtpXVtqICsgNF0gJiAweDExKSAgICYmICAgIC8vILC1IKm8CisgICAgICAgICAgKCEobV9ieU1vZHVsZURhdGFbaV1baiArIDVdICYgMHgxMSkpICAmJiAgLy8gw/cgLSAxCisgICAgICAgICAgKG1fYnlNb2R1bGVEYXRhW2ldW2ogKyA2XSAmIDB4MTEpICAgJiYgICAgLy8gsLUgLSAxCisgICAgICAgICAgKChqID09IG1fblN5bWJsZVNpemUgLSA3KSB8fCAoIShtX2J5TW9kdWxlRGF0YVtpXVtqICsgN10gJiAweDExKSkpKSAgICAvLyDD97vyt/u6xc3iCisgICAgICB7CisgICAgICAgIGlmKCgoaiA8IDIgfHwgIShtX2J5TW9kdWxlRGF0YVtpXVtqIC0gMl0gJiAweDExKSkgJiYKKyAgICAgICAgICAgIChqIDwgMyB8fCAhKG1fYnlNb2R1bGVEYXRhW2ldW2ogLSAzXSAmIDB4MTEpKSAmJgorICAgICAgICAgICAgKGogPCA0IHx8ICEobV9ieU1vZHVsZURhdGFbaV1baiAtIDRdICYgMHgxMSkpKSB8fAorICAgICAgICAgICAgKChqID49IG1fblN5bWJsZVNpemUgLSA4ICB8fCAhKG1fYnlNb2R1bGVEYXRhW2ldW2ogKyA4XSAgJiAweDExKSkgJiYKKyAgICAgICAgICAgICAoaiA+PSBtX25TeW1ibGVTaXplIC0gOSAgfHwgIShtX2J5TW9kdWxlRGF0YVtpXVtqICsgOV0gICYgMHgxMSkpICYmCisgICAgICAgICAgICAgKGogPj0gbV9uU3ltYmxlU2l6ZSAtIDEwIHx8ICEobV9ieU1vZHVsZURhdGFbaV1baiArIDEwXSAmIDB4MTEpKSkpCisgICAgICAgIHsKKyAgICAgICAgICBuUGVuYWx0eSArPSA0MDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvcihpID0gMDsgaSA8IG1fblN5bWJsZVNpemU7ICsraSkKKyAgeworICAgIGZvcihqID0gMDsgaiA8IG1fblN5bWJsZVNpemUgLSA2OyArK2opCisgICAgeworICAgICAgaWYoKChqID09IDApIHx8ICghKG1fYnlNb2R1bGVEYXRhW2ogLSAxXVtpXSAmIDB4MTEpKSkgJiYgICAgICAgLy8gw/e78rf7usXN4gorICAgICAgICAgIChtX2J5TW9kdWxlRGF0YVtqXSAgICBbaV0gJiAweDExKSAgICYmICAgIC8vILC1IC0gMQorICAgICAgICAgICghKG1fYnlNb2R1bGVEYXRhW2ogKyAxXVtpXSAmIDB4MTEpKSAgJiYgIC8vIMP3IC0gMQorICAgICAgICAgIChtX2J5TW9kdWxlRGF0YVtqICsgMl1baV0gJiAweDExKSAgICYmICAgIC8vILC1IKm0CisgICAgICAgICAgKG1fYnlNb2R1bGVEYXRhW2ogKyAzXVtpXSAmIDB4MTEpICAgJiYgICAgLy8gsLUgqaYzCisgICAgICAgICAgKG1fYnlNb2R1bGVEYXRhW2ogKyA0XVtpXSAmIDB4MTEpICAgJiYgICAgLy8gsLUgqbwKKyAgICAgICAgICAoIShtX2J5TW9kdWxlRGF0YVtqICsgNV1baV0gJiAweDExKSkgICYmICAvLyDD9yAtIDEKKyAgICAgICAgICAobV9ieU1vZHVsZURhdGFbaiArIDZdW2ldICYgMHgxMSkgICAmJiAgICAvLyCwtSAtIDEKKyAgICAgICAgICAoKGogPT0gbV9uU3ltYmxlU2l6ZSAtIDcpIHx8ICghKG1fYnlNb2R1bGVEYXRhW2ogKyA3XVtpXSAmIDB4MTEpKSkpICAgIC8vIMP3u/K3+7rFzeIKKyAgICAgIHsKKyAgICAgICAgaWYoKChqIDwgMiB8fCAhKG1fYnlNb2R1bGVEYXRhW2ogLSAyXVtpXSAmIDB4MTEpKSAmJgorICAgICAgICAgICAgKGogPCAzIHx8ICEobV9ieU1vZHVsZURhdGFbaiAtIDNdW2ldICYgMHgxMSkpICYmCisgICAgICAgICAgICAoaiA8IDQgfHwgIShtX2J5TW9kdWxlRGF0YVtqIC0gNF1baV0gJiAweDExKSkpIHx8CisgICAgICAgICAgICAoKGogPj0gbV9uU3ltYmxlU2l6ZSAtIDggIHx8ICEobV9ieU1vZHVsZURhdGFbaiArIDhdW2ldICAmIDB4MTEpKSAmJgorICAgICAgICAgICAgIChqID49IG1fblN5bWJsZVNpemUgLSA5ICB8fCAhKG1fYnlNb2R1bGVEYXRhW2ogKyA5XVtpXSAgJiAweDExKSkgJiYKKyAgICAgICAgICAgICAoaiA+PSBtX25TeW1ibGVTaXplIC0gMTAgfHwgIShtX2J5TW9kdWxlRGF0YVtqICsgMTBdW2ldICYgMHgxMSkpKSkKKyAgICAgICAgeworICAgICAgICAgIG5QZW5hbHR5ICs9IDQwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgZm9yKGkgPSAwOyBpIDwgbV9uU3ltYmxlU2l6ZTsgKytpKQorICB7CisgICAgZm9yKGogPSAwOyBqIDwgbV9uU3ltYmxlU2l6ZTsgKytqKQorICAgIHsKKyAgICAgIGlmKCEobV9ieU1vZHVsZURhdGFbaV1bal0gJiAweDExKSkKKyAgICAgIHsKKyAgICAgICAgKytuQ291bnQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYoKDUwIC0gKChuQ291bnQgKiAxMDApIC8gKG1fblN5bWJsZVNpemUgKiBtX25TeW1ibGVTaXplKSkpID4gMCkKKyAgICBzX25Db3VudCA9IDUwIC0gKChuQ291bnQgKiAxMDApIC8gKG1fblN5bWJsZVNpemUgKiBtX25TeW1ibGVTaXplKSk7CisgIGVsc2UKKyAgICBzX25Db3VudCA9IDAgLSAoNTAgLSAoKG5Db3VudCAqIDEwMCkgLyAobV9uU3ltYmxlU2l6ZSAqIG1fblN5bWJsZVNpemUpKSk7CisgIG5QZW5hbHR5ICs9IChzX25Db3VudCAvIDUpICogMTA7CisKKyAgcmV0dXJuIG5QZW5hbHR5OworfQorCitzdGF0aWMgYm9vbCBFbmNvZGVTb3VyY2VEYXRhKGNoYXIqIGxwc1NvdXJjZSwgaW50IG5jTGVuZ3RoLCBpbnQgblZlckdyb3VwKQoreworICBpbnQgaSwgajsKKyAgaW50IG5jU3JjQml0cywgbmNEc3RCaXRzOworICBpbnQgbkJsb2NrID0gMDsKKyAgaW50IG5jQ29tcGxldGUgPSAwOworICBXT1JEIHdCaW5Db2RlOworCisgIG1lbXNldChtX25CbG9ja0xlbmd0aCwgMCwgc2l6ZW9mKG1fbkJsb2NrTGVuZ3RoKSk7CisKKyAgZm9yKG1fbmNEYXRhQmxvY2sgPSBpID0gMDsgaSA8IG5jTGVuZ3RoOyArK2kpCisgIHsKKyAgICBCWVRFIGJ5TW9kZTsKKworICAgIGlmKElzTnVtZXJhbERhdGEobHBzU291cmNlW2ldKSkKKyAgICAgIGJ5TW9kZSA9IFFSX01PREVfTlVNRVJBTDsKKyAgICBlbHNlIGlmKElzQWxwaGFiZXREYXRhKGxwc1NvdXJjZVtpXSkpCisgICAgICBieU1vZGUgPSBRUl9NT0RFX0FMUEhBQkVUOworICAgIGVsc2UKKyAgICAgIGJ5TW9kZSA9IFFSX01PREVfOEJJVDsKKworICAgIGlmKGkgPT0gMCkKKyAgICAgIG1fYnlCbG9ja01vZGVbMF0gPSBieU1vZGU7CisKKyAgICBpZihtX2J5QmxvY2tNb2RlW21fbmNEYXRhQmxvY2tdICE9IGJ5TW9kZSkKKyAgICAgIG1fYnlCbG9ja01vZGVbKyttX25jRGF0YUJsb2NrXSA9IGJ5TW9kZTsKKworICAgICsrbV9uQmxvY2tMZW5ndGhbbV9uY0RhdGFCbG9ja107CisgIH0KKworICArK21fbmNEYXRhQmxvY2s7CisKKyAgd2hpbGUobkJsb2NrIDwgbV9uY0RhdGFCbG9jayAtIDEpCisgIHsKKyAgICBpbnQgbmNKb2luRnJvbnQsIG5jSm9pbkJlaGluZDsKKyAgICBpbnQgbkpvaW5Qb3NpdGlvbiA9IDA7CisKKyAgICBpZigobV9ieUJsb2NrTW9kZVtuQmxvY2tdID09IFFSX01PREVfTlVNRVJBTAorICAgICAgICAmJiBtX2J5QmxvY2tNb2RlW25CbG9jayArIDFdID09IFFSX01PREVfQUxQSEFCRVQpIHx8CisgICAgICAgIChtX2J5QmxvY2tNb2RlW25CbG9ja10gPT0gUVJfTU9ERV9BTFBIQUJFVAorICAgICAgICAgJiYgbV9ieUJsb2NrTW9kZVtuQmxvY2sgKyAxXSA9PSBRUl9NT0RFX05VTUVSQUwpKQorICAgIHsKKyAgICAgIG5jU3JjQml0cyA9IEdldEJpdExlbmd0aChtX2J5QmxvY2tNb2RlW25CbG9ja10sIG1fbkJsb2NrTGVuZ3RoW25CbG9ja10sIG5WZXJHcm91cCkgKworICAgICAgICAgICAgICAgICAgR2V0Qml0TGVuZ3RoKG1fYnlCbG9ja01vZGVbbkJsb2NrICsgMV0sIG1fbkJsb2NrTGVuZ3RoW25CbG9jayArIDFdLCBuVmVyR3JvdXApOworCisgICAgICBuY0RzdEJpdHMgPSBHZXRCaXRMZW5ndGgoUVJfTU9ERV9BTFBIQUJFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25CbG9ja0xlbmd0aFtuQmxvY2tdICsgbV9uQmxvY2tMZW5ndGhbbkJsb2NrICsgMV0sIG5WZXJHcm91cCk7CisKKyAgICAgIGlmKG5jU3JjQml0cyA+IG5jRHN0Qml0cykKKyAgICAgIHsKKyAgICAgICAgaWYobkJsb2NrID49IDEgJiYgbV9ieUJsb2NrTW9kZVtuQmxvY2sgLSAxXSA9PSBRUl9NT0RFXzhCSVQpCisgICAgICAgIHsKKyAgICAgICAgICBuY0pvaW5Gcm9udCA9IEdldEJpdExlbmd0aChRUl9NT0RFXzhCSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uQmxvY2tMZW5ndGhbbkJsb2NrIC0gMV0gKyBtX25CbG9ja0xlbmd0aFtuQmxvY2tdLCBuVmVyR3JvdXApICsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdExlbmd0aChtX2J5QmxvY2tNb2RlW25CbG9jayArIDFdLCBtX25CbG9ja0xlbmd0aFtuQmxvY2sgKyAxXSwgblZlckdyb3VwKTsKKworICAgICAgICAgIGlmKG5jSm9pbkZyb250ID4gbmNEc3RCaXRzICsgR2V0Qml0TGVuZ3RoKFFSX01PREVfOEJJVCwgbV9uQmxvY2tMZW5ndGhbbkJsb2NrIC0gMV0sCisgICAgICAgICAgICAgIG5WZXJHcm91cCkpCisgICAgICAgICAgICBuY0pvaW5Gcm9udCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIG5jSm9pbkZyb250ID0gMDsKKworICAgICAgICBpZihuQmxvY2sgPCBtX25jRGF0YUJsb2NrIC0gMiAmJiBtX2J5QmxvY2tNb2RlW25CbG9jayArIDJdID09IFFSX01PREVfOEJJVCkKKyAgICAgICAgeworICAgICAgICAgIG5jSm9pbkJlaGluZCA9IEdldEJpdExlbmd0aChtX2J5QmxvY2tNb2RlW25CbG9ja10sIG1fbkJsb2NrTGVuZ3RoW25CbG9ja10sIG5WZXJHcm91cCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdExlbmd0aChRUl9NT0RFXzhCSVQsIG1fbkJsb2NrTGVuZ3RoW25CbG9jayArIDFdICsgbV9uQmxvY2tMZW5ndGhbbkJsb2NrICsgMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5WZXJHcm91cCk7CisKKyAgICAgICAgICBpZihuY0pvaW5CZWhpbmQgPiBuY0RzdEJpdHMgKyBHZXRCaXRMZW5ndGgoUVJfTU9ERV84QklULCBtX25CbG9ja0xlbmd0aFtuQmxvY2sgKyAyXSwKKyAgICAgICAgICAgICAgblZlckdyb3VwKSkKKyAgICAgICAgICAgIG5jSm9pbkJlaGluZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIG5jSm9pbkJlaGluZCA9IDA7CisKKyAgICAgICAgaWYobmNKb2luRnJvbnQgIT0gMCAmJiBuY0pvaW5CZWhpbmQgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIG5Kb2luUG9zaXRpb24gPSAobmNKb2luRnJvbnQgPCBuY0pvaW5CZWhpbmQpID8gLTEgOiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG5Kb2luUG9zaXRpb24gPSAobmNKb2luRnJvbnQgIT0gMCkgPyAtMSA6ICgobmNKb2luQmVoaW5kICE9IDApID8gMSA6IDApOworICAgICAgICB9CisKKyAgICAgICAgaWYobkpvaW5Qb3NpdGlvbiAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYobkpvaW5Qb3NpdGlvbiA9PSAtMSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBtX25CbG9ja0xlbmd0aFtuQmxvY2sgLSAxXSArPSBtX25CbG9ja0xlbmd0aFtuQmxvY2tdOworCisgICAgICAgICAgICBmb3IoaSA9IG5CbG9jazsgaSA8IG1fbmNEYXRhQmxvY2sgLSAxOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1fYnlCbG9ja01vZGVbaV0gID0gbV9ieUJsb2NrTW9kZVtpICsgMV07CisgICAgICAgICAgICAgIG1fbkJsb2NrTGVuZ3RoW2ldID0gbV9uQmxvY2tMZW5ndGhbaSArIDFdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgbV9ieUJsb2NrTW9kZVtuQmxvY2sgKyAxXSA9IFFSX01PREVfOEJJVDsKKyAgICAgICAgICAgIG1fbkJsb2NrTGVuZ3RoW25CbG9jayArIDFdICs9IG1fbkJsb2NrTGVuZ3RoW25CbG9jayArIDJdOworCisgICAgICAgICAgICBmb3IoaSA9IG5CbG9jayArIDI7IGkgPCBtX25jRGF0YUJsb2NrIC0gMTsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtX2J5QmxvY2tNb2RlW2ldICA9IG1fYnlCbG9ja01vZGVbaSArIDFdOworICAgICAgICAgICAgICBtX25CbG9ja0xlbmd0aFtpXSA9IG1fbkJsb2NrTGVuZ3RoW2kgKyAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAtLW1fbmNEYXRhQmxvY2s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYobkJsb2NrIDwgbV9uY0RhdGFCbG9jayAtIDIgJiYgbV9ieUJsb2NrTW9kZVtuQmxvY2sgKyAyXSA9PSBRUl9NT0RFX0FMUEhBQkVUKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG1fbkJsb2NrTGVuZ3RoW25CbG9jayArIDFdICs9IG1fbkJsb2NrTGVuZ3RoW25CbG9jayArIDJdOworCisgICAgICAgICAgICBmb3IoaSA9IG5CbG9jayArIDI7IGkgPCBtX25jRGF0YUJsb2NrIC0gMTsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtX2J5QmxvY2tNb2RlW2ldICA9IG1fYnlCbG9ja01vZGVbaSArIDFdOworICAgICAgICAgICAgICBtX25CbG9ja0xlbmd0aFtpXSA9IG1fbkJsb2NrTGVuZ3RoW2kgKyAxXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLS1tX25jRGF0YUJsb2NrOworICAgICAgICAgIH0KKworICAgICAgICAgIG1fYnlCbG9ja01vZGVbbkJsb2NrXSA9IFFSX01PREVfQUxQSEFCRVQ7CisgICAgICAgICAgbV9uQmxvY2tMZW5ndGhbbkJsb2NrXSArPSBtX25CbG9ja0xlbmd0aFtuQmxvY2sgKyAxXTsKKworICAgICAgICAgIGZvcihpID0gbkJsb2NrICsgMTsgaSA8IG1fbmNEYXRhQmxvY2sgLSAxOyArK2kpCisgICAgICAgICAgeworICAgICAgICAgICAgbV9ieUJsb2NrTW9kZVtpXSAgPSBtX2J5QmxvY2tNb2RlW2kgKyAxXTsKKyAgICAgICAgICAgIG1fbkJsb2NrTGVuZ3RoW2ldID0gbV9uQmxvY2tMZW5ndGhbaSArIDFdOworICAgICAgICAgIH0KKworICAgICAgICAgIC0tbV9uY0RhdGFCbG9jazsKKworICAgICAgICAgIGlmKG5CbG9jayA+PSAxICYmIG1fYnlCbG9ja01vZGVbbkJsb2NrIC0gMV0gPT0gUVJfTU9ERV9BTFBIQUJFVCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBtX25CbG9ja0xlbmd0aFtuQmxvY2sgLSAxXSArPSBtX25CbG9ja0xlbmd0aFtuQmxvY2tdOworCisgICAgICAgICAgICBmb3IoaSA9IG5CbG9jazsgaSA8IG1fbmNEYXRhQmxvY2sgLSAxOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1fYnlCbG9ja01vZGVbaV0gID0gbV9ieUJsb2NrTW9kZVtpICsgMV07CisgICAgICAgICAgICAgIG1fbkJsb2NrTGVuZ3RoW2ldID0gbV9uQmxvY2tMZW5ndGhbaSArIDFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAtLW1fbmNEYXRhQmxvY2s7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorCisgICAgKytuQmxvY2s7CisgIH0KKworICBuQmxvY2sgPSAwOworCisgIHdoaWxlKG5CbG9jayA8IG1fbmNEYXRhQmxvY2sgLSAxKQorICB7CisgICAgbmNTcmNCaXRzID0gR2V0Qml0TGVuZ3RoKG1fYnlCbG9ja01vZGVbbkJsb2NrXSwgbV9uQmxvY2tMZW5ndGhbbkJsb2NrXSwgblZlckdyb3VwKQorICAgICAgICAgICAgICAgICsgR2V0Qml0TGVuZ3RoKG1fYnlCbG9ja01vZGVbbkJsb2NrICsgMV0sIG1fbkJsb2NrTGVuZ3RoW25CbG9jayArIDFdLCBuVmVyR3JvdXApOworCisgICAgbmNEc3RCaXRzID0gR2V0Qml0TGVuZ3RoKFFSX01PREVfOEJJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uQmxvY2tMZW5ndGhbbkJsb2NrXSArIG1fbkJsb2NrTGVuZ3RoW25CbG9jayArIDFdLCBuVmVyR3JvdXApOworCisgICAgaWYobkJsb2NrID49IDEgJiYgbV9ieUJsb2NrTW9kZVtuQmxvY2sgLSAxXSA9PSBRUl9NT0RFXzhCSVQpCisgICAgICBuY0RzdEJpdHMgLT0gKDQgKyBuSW5kaWNhdG9yTGVuOEJpdFtuVmVyR3JvdXBdKTsKKworICAgIGlmKG5CbG9jayA8IG1fbmNEYXRhQmxvY2sgLSAyICYmIG1fYnlCbG9ja01vZGVbbkJsb2NrICsgMl0gPT0gUVJfTU9ERV84QklUKQorICAgICAgbmNEc3RCaXRzIC09ICg0ICsgbkluZGljYXRvckxlbjhCaXRbblZlckdyb3VwXSk7CisKKyAgICBpZihuY1NyY0JpdHMgPiBuY0RzdEJpdHMpCisgICAgeworICAgICAgaWYobkJsb2NrID49IDEgJiYgbV9ieUJsb2NrTW9kZVtuQmxvY2sgLSAxXSA9PSBRUl9NT0RFXzhCSVQpCisgICAgICB7CisgICAgICAgIG1fbkJsb2NrTGVuZ3RoW25CbG9jayAtIDFdICs9IG1fbkJsb2NrTGVuZ3RoW25CbG9ja107CisKKyAgICAgICAgZm9yKGkgPSBuQmxvY2s7IGkgPCBtX25jRGF0YUJsb2NrIC0gMTsgKytpKQorICAgICAgICB7CisgICAgICAgICAgbV9ieUJsb2NrTW9kZVtpXSAgPSBtX2J5QmxvY2tNb2RlW2kgKyAxXTsKKyAgICAgICAgICBtX25CbG9ja0xlbmd0aFtpXSA9IG1fbkJsb2NrTGVuZ3RoW2kgKyAxXTsKKyAgICAgICAgfQorCisgICAgICAgIC0tbV9uY0RhdGFCbG9jazsKKyAgICAgICAgLS1uQmxvY2s7CisgICAgICB9CisKKyAgICAgIGlmKG5CbG9jayA8IG1fbmNEYXRhQmxvY2sgLSAyICYmIG1fYnlCbG9ja01vZGVbbkJsb2NrICsgMl0gPT0gUVJfTU9ERV84QklUKQorICAgICAgeworICAgICAgICBtX25CbG9ja0xlbmd0aFtuQmxvY2sgKyAxXSArPSBtX25CbG9ja0xlbmd0aFtuQmxvY2sgKyAyXTsKKworICAgICAgICBmb3IoaSA9IG5CbG9jayArIDI7IGkgPCBtX25jRGF0YUJsb2NrIC0gMTsgKytpKQorICAgICAgICB7CisgICAgICAgICAgbV9ieUJsb2NrTW9kZVtpXSAgPSBtX2J5QmxvY2tNb2RlW2kgKyAxXTsKKyAgICAgICAgICBtX25CbG9ja0xlbmd0aFtpXSA9IG1fbkJsb2NrTGVuZ3RoW2kgKyAxXTsKKyAgICAgICAgfQorCisgICAgICAgIC0tbV9uY0RhdGFCbG9jazsKKyAgICAgIH0KKworICAgICAgbV9ieUJsb2NrTW9kZVtuQmxvY2tdID0gUVJfTU9ERV84QklUOworICAgICAgbV9uQmxvY2tMZW5ndGhbbkJsb2NrXSArPSBtX25CbG9ja0xlbmd0aFtuQmxvY2sgKyAxXTsKKworICAgICAgZm9yKGkgPSBuQmxvY2sgKyAxOyBpIDwgbV9uY0RhdGFCbG9jayAtIDE7ICsraSkKKyAgICAgIHsKKyAgICAgICAgbV9ieUJsb2NrTW9kZVtpXSAgPSBtX2J5QmxvY2tNb2RlW2kgKyAxXTsKKyAgICAgICAgbV9uQmxvY2tMZW5ndGhbaV0gPSBtX25CbG9ja0xlbmd0aFtpICsgMV07CisgICAgICB9CisKKyAgICAgIC0tbV9uY0RhdGFCbG9jazsKKworICAgICAgaWYobkJsb2NrID49IDEpCisgICAgICAgIC0tbkJsb2NrOworCisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICArK25CbG9jazsKKyAgfQorCisgIG1fbmNEYXRhQ29kZVdvcmRCaXQgPSAwOworCisgIG1lbXNldChtX2J5RGF0YUNvZGVXb3JkLCAwLCBNQVhfREFUQUNPREVXT1JEKTsKKworICBmb3IoaSA9IDA7IGkgPCBtX25jRGF0YUJsb2NrICYmIG1fbmNEYXRhQ29kZVdvcmRCaXQgIT0gLTE7ICsraSkKKyAgeworICAgIGlmKG1fYnlCbG9ja01vZGVbaV0gPT0gUVJfTU9ERV9OVU1FUkFMKQorICAgIHsKKyAgICAgIG1fbmNEYXRhQ29kZVdvcmRCaXQgPSBTZXRCaXRTdHJlYW0obV9uY0RhdGFDb2RlV29yZEJpdCwgMSwgNCk7CisKKyAgICAgIG1fbmNEYXRhQ29kZVdvcmRCaXQgPSBTZXRCaXRTdHJlYW0obV9uY0RhdGFDb2RlV29yZEJpdCwgKFdPUkQpbV9uQmxvY2tMZW5ndGhbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5JbmRpY2F0b3JMZW5OdW1lcmFsW25WZXJHcm91cF0pOworCisgICAgICBmb3IoaiA9IDA7IGogPCBtX25CbG9ja0xlbmd0aFtpXTsgaiArPSAzKQorICAgICAgeworICAgICAgICBpZihqIDwgbV9uQmxvY2tMZW5ndGhbaV0gLSAyKQorICAgICAgICB7CisgICAgICAgICAgd0JpbkNvZGUgPSAoV09SRCkoKChscHNTb3VyY2VbbmNDb21wbGV0ZSArIGpdCSAgLSAnMCcpICogMTAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChscHNTb3VyY2VbbmNDb21wbGV0ZSArIGogKyAxXSAtICcwJykgKiAxMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChscHNTb3VyY2VbbmNDb21wbGV0ZSArIGogKyAyXSAtICcwJykpOworCisgICAgICAgICAgbV9uY0RhdGFDb2RlV29yZEJpdCA9IFNldEJpdFN0cmVhbShtX25jRGF0YUNvZGVXb3JkQml0LCB3QmluQ29kZSwgMTApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoaiA9PSBtX25CbG9ja0xlbmd0aFtpXSAtIDIpCisgICAgICAgIHsKKyAgICAgICAgICB3QmluQ29kZSA9IChXT1JEKSgoKGxwc1NvdXJjZVtuY0NvbXBsZXRlICsgal0gLSAnMCcpICogMTApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobHBzU291cmNlW25jQ29tcGxldGUgKyBqICsgMV0gLSAnMCcpKTsKKworICAgICAgICAgIG1fbmNEYXRhQ29kZVdvcmRCaXQgPSBTZXRCaXRTdHJlYW0obV9uY0RhdGFDb2RlV29yZEJpdCwgd0JpbkNvZGUsIDcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoaiA9PSBtX25CbG9ja0xlbmd0aFtpXSAtIDEpCisgICAgICAgIHsKKyAgICAgICAgICB3QmluQ29kZSA9IChXT1JEKShscHNTb3VyY2VbbmNDb21wbGV0ZSArIGpdIC0gJzAnKTsKKworICAgICAgICAgIG1fbmNEYXRhQ29kZVdvcmRCaXQgPSBTZXRCaXRTdHJlYW0obV9uY0RhdGFDb2RlV29yZEJpdCwgd0JpbkNvZGUsIDQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIG5jQ29tcGxldGUgKz0gbV9uQmxvY2tMZW5ndGhbaV07CisgICAgfQorCisgICAgZWxzZSBpZihtX2J5QmxvY2tNb2RlW2ldID09IFFSX01PREVfQUxQSEFCRVQpCisgICAgeworICAgICAgbV9uY0RhdGFDb2RlV29yZEJpdCA9IFNldEJpdFN0cmVhbShtX25jRGF0YUNvZGVXb3JkQml0LCAyLCA0KTsKKworICAgICAgbV9uY0RhdGFDb2RlV29yZEJpdCA9IFNldEJpdFN0cmVhbShtX25jRGF0YUNvZGVXb3JkQml0LCAoV09SRCltX25CbG9ja0xlbmd0aFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkluZGljYXRvckxlbkFscGhhYmV0W25WZXJHcm91cF0pOworCisgICAgICBmb3IoaiA9IDA7IGogPCBtX25CbG9ja0xlbmd0aFtpXTsgaiArPSAyKQorICAgICAgeworICAgICAgICBpZihqIDwgbV9uQmxvY2tMZW5ndGhbaV0gLSAxKQorICAgICAgICB7CisgICAgICAgICAgd0JpbkNvZGUgPSAoV09SRCkoKEFscGhhYmV0VG9CaW5hbHkobHBzU291cmNlW25jQ29tcGxldGUgKyBqXSkgKiA0NSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFscGhhYmV0VG9CaW5hbHkobHBzU291cmNlW25jQ29tcGxldGUgKyBqICsgMV0pKTsKKworICAgICAgICAgIG1fbmNEYXRhQ29kZVdvcmRCaXQgPSBTZXRCaXRTdHJlYW0obV9uY0RhdGFDb2RlV29yZEJpdCwgd0JpbkNvZGUsIDExKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3QmluQ29kZSA9IChXT1JEKUFscGhhYmV0VG9CaW5hbHkobHBzU291cmNlW25jQ29tcGxldGUgKyBqXSk7CisKKyAgICAgICAgICBtX25jRGF0YUNvZGVXb3JkQml0ID0gU2V0Qml0U3RyZWFtKG1fbmNEYXRhQ29kZVdvcmRCaXQsIHdCaW5Db2RlLCA2KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBuY0NvbXBsZXRlICs9IG1fbkJsb2NrTGVuZ3RoW2ldOworICAgIH0KKworICAgIGVsc2UgaWYobV9ieUJsb2NrTW9kZVtpXSA9PSBRUl9NT0RFXzhCSVQpCisgICAgeworICAgICAgbV9uY0RhdGFDb2RlV29yZEJpdCA9IFNldEJpdFN0cmVhbShtX25jRGF0YUNvZGVXb3JkQml0LCA0LCA0KTsKKworICAgICAgbV9uY0RhdGFDb2RlV29yZEJpdCA9IFNldEJpdFN0cmVhbShtX25jRGF0YUNvZGVXb3JkQml0LCAoV09SRCltX25CbG9ja0xlbmd0aFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkluZGljYXRvckxlbjhCaXRbblZlckdyb3VwXSk7CisKKyAgICAgIGZvcihqID0gMDsgaiA8IG1fbkJsb2NrTGVuZ3RoW2ldOyArK2opCisgICAgICB7CisgICAgICAgIG1fbmNEYXRhQ29kZVdvcmRCaXQgPSBTZXRCaXRTdHJlYW0obV9uY0RhdGFDb2RlV29yZEJpdCwgKFdPUkQpbHBzU291cmNlW25jQ29tcGxldGUgKyBqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsKKyAgICAgIH0KKworICAgICAgbmNDb21wbGV0ZSArPSBtX25CbG9ja0xlbmd0aFtpXTsKKyAgICB9CisgIH0KKworICByZXR1cm4gKGJvb2wpKG1fbmNEYXRhQ29kZVdvcmRCaXQgIT0gLTEpOworfQorCitzdGF0aWMgaW50IEdldEVuY29kZVZlcnNpb24oaW50IG5WZXJzaW9uLCBjaGFyKiBscHNTb3VyY2UsIGludCBuY0xlbmd0aCkKK3sKKyAgaW50IG5WZXJHcm91cCA9IG5WZXJzaW9uID49IDI3ID8gUVJfVlJFU0lPTl9MIDogKG5WZXJzaW9uID49IDEwID8gUVJfVlJFU0lPTl9NIDoKKyAgICAgICAgICAgICAgICAgIFFSX1ZSRVNJT05fUyk7CisgIGludCBpLCBqOworCisgIGZvcihpID0gblZlckdyb3VwOyBpIDw9IFFSX1ZSRVNJT05fTDsgKytpKQorICB7CisgICAgaWYoRW5jb2RlU291cmNlRGF0YShscHNTb3VyY2UsIG5jTGVuZ3RoLCBpKSkKKyAgICB7CisgICAgICBpZihpID09IFFSX1ZSRVNJT05fUykKKyAgICAgIHsKKyAgICAgICAgZm9yKGogPSAxOyBqIDw9IDk7ICsraikKKyAgICAgICAgeworICAgICAgICAgIGlmKChtX25jRGF0YUNvZGVXb3JkQml0ICsgNykgLyA4IDw9IFFSX1ZlcnNvbkluZm9bal0ubmNEYXRhQ29kZVdvcmRbbV9uTGV2ZWxdKQorICAgICAgICAgICAgcmV0dXJuIGo7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoaSA9PSBRUl9WUkVTSU9OX00pCisgICAgICB7CisgICAgICAgIGZvcihqID0gMTA7IGogPD0gMjY7ICsraikKKyAgICAgICAgeworICAgICAgICAgIGlmKChtX25jRGF0YUNvZGVXb3JkQml0ICsgNykgLyA4IDw9IFFSX1ZlcnNvbkluZm9bal0ubmNEYXRhQ29kZVdvcmRbbV9uTGV2ZWxdKQorICAgICAgICAgICAgcmV0dXJuIGo7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoaSA9PSBRUl9WUkVTSU9OX0wpCisgICAgICB7CisgICAgICAgIGZvcihqID0gMjc7IGogPD0gNDA7ICsraikKKyAgICAgICAgeworICAgICAgICAgIGlmKChtX25jRGF0YUNvZGVXb3JkQml0ICsgNykgLyA4IDw9IFFSX1ZlcnNvbkluZm9bal0ubmNEYXRhQ29kZVdvcmRbbV9uTGV2ZWxdKQorICAgICAgICAgICAgcmV0dXJuIGo7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIFNldEZ1bmN0aW9uTW9kdWxlKHZvaWQpCit7CisgIGludCBpLCBqOworCisgIFNldEZpbmRlclBhdHRlcm4oMCwgMCk7CisgIFNldEZpbmRlclBhdHRlcm4obV9uU3ltYmxlU2l6ZSAtIDcsIDApOworICBTZXRGaW5kZXJQYXR0ZXJuKDAsIG1fblN5bWJsZVNpemUgLSA3KTsKKworICBmb3IoaSA9IDA7IGkgPCA4OyArK2kpCisgIHsKKyAgICBtX2J5TW9kdWxlRGF0YVtpXVs3XSA9IG1fYnlNb2R1bGVEYXRhWzddW2ldID0gJ1x4MjAnOworICAgIG1fYnlNb2R1bGVEYXRhW21fblN5bWJsZVNpemUgLSA4XVtpXSA9IG1fYnlNb2R1bGVEYXRhW21fblN5bWJsZVNpemUgLSA4ICsgaV1bN10gPSAnXHgyMCc7CisgICAgbV9ieU1vZHVsZURhdGFbaV1bbV9uU3ltYmxlU2l6ZSAtIDhdID0gbV9ieU1vZHVsZURhdGFbN11bbV9uU3ltYmxlU2l6ZSAtIDggKyBpXSA9ICdceDIwJzsKKyAgfQorCisgIGZvcihpID0gMDsgaSA8IDk7ICsraSkKKyAgeworICAgIG1fYnlNb2R1bGVEYXRhW2ldWzhdID0gbV9ieU1vZHVsZURhdGFbOF1baV0gPSAnXHgyMCc7CisgIH0KKworICBmb3IoaSA9IDA7IGkgPCA4OyArK2kpCisgIHsKKyAgICBtX2J5TW9kdWxlRGF0YVttX25TeW1ibGVTaXplIC0gOCArIGldWzhdID0gbV9ieU1vZHVsZURhdGFbOF1bbV9uU3ltYmxlU2l6ZSAtIDggKyBpXSA9CisgICAgICAgICAgJ1x4MjAnOworICB9CisKKyAgU2V0VmVyc2lvblBhdHRlcm4oKTsKKworICBmb3IoaSA9IDA7IGkgPCBRUl9WZXJzb25JbmZvW21fblZlcnNpb25dLm5jQWxpZ25Qb2ludDsgKytpKQorICB7CisgICAgU2V0QWxpZ25tZW50UGF0dGVybihRUl9WZXJzb25JbmZvW21fblZlcnNpb25dLm5BbGlnblBvaW50W2ldLCA2KTsKKyAgICBTZXRBbGlnbm1lbnRQYXR0ZXJuKDYsIFFSX1ZlcnNvbkluZm9bbV9uVmVyc2lvbl0ubkFsaWduUG9pbnRbaV0pOworCisgICAgZm9yKGogPSAwOyBqIDwgUVJfVmVyc29uSW5mb1ttX25WZXJzaW9uXS5uY0FsaWduUG9pbnQ7ICsraikKKyAgICB7CisgICAgICBTZXRBbGlnbm1lbnRQYXR0ZXJuKFFSX1ZlcnNvbkluZm9bbV9uVmVyc2lvbl0ubkFsaWduUG9pbnRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFSX1ZlcnNvbkluZm9bbV9uVmVyc2lvbl0ubkFsaWduUG9pbnRbal0pOworICAgIH0KKyAgfQorCisgIGZvcihpID0gODsgaSA8PSBtX25TeW1ibGVTaXplIC0gOTsgKytpKQorICB7CisgICAgbV9ieU1vZHVsZURhdGFbaV1bNl0gPSAoaSAlIDIpID09IDAgPyAnXHgzMCcgOiAnXHgyMCc7CisgICAgbV9ieU1vZHVsZURhdGFbNl1baV0gPSAoaSAlIDIpID09IDAgPyAnXHgzMCcgOiAnXHgyMCc7CisgIH0KK30KKworc3RhdGljIHZvaWQgRm9ybWF0TW9kdWxlKHZvaWQpCit7CisgIGludCBpLCBqOworICBpbnQgbk1pblBlbmFsdHksIG5QZW5hbHR5OworCisgIG1lbXNldChtX2J5TW9kdWxlRGF0YSwgMCwgc2l6ZW9mKG1fYnlNb2R1bGVEYXRhKSk7CisKKyAgU2V0RnVuY3Rpb25Nb2R1bGUoKTsKKworICBTZXRDb2RlV29yZFBhdHRlcm4oKTsKKworICBpZihtX25NYXNraW5nTm8gPT0gLTEpCisgIHsKKyAgICBtX25NYXNraW5nTm8gPSAwOworCisgICAgU2V0TWFza2luZ1BhdHRlcm4obV9uTWFza2luZ05vKTsKKyAgICBTZXRGb3JtYXRJbmZvUGF0dGVybihtX25NYXNraW5nTm8pOworCisgICAgbk1pblBlbmFsdHkgPSBDb3VudFBlbmFsdHkoKTsKKworICAgIGZvcihpID0gMTsgaSA8PSA3OyArK2kpCisgICAgeworICAgICAgU2V0TWFza2luZ1BhdHRlcm4oaSk7CisgICAgICBTZXRGb3JtYXRJbmZvUGF0dGVybihpKTsKKworICAgICAgblBlbmFsdHkgPSBDb3VudFBlbmFsdHkoKTsKKworICAgICAgaWYoblBlbmFsdHkgPCBuTWluUGVuYWx0eSkKKyAgICAgIHsKKyAgICAgICAgbk1pblBlbmFsdHkgPSBuUGVuYWx0eTsKKyAgICAgICAgbV9uTWFza2luZ05vID0gaTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBTZXRNYXNraW5nUGF0dGVybihtX25NYXNraW5nTm8pOworICBTZXRGb3JtYXRJbmZvUGF0dGVybihtX25NYXNraW5nTm8pOworCisgIGZvcihpID0gMDsgaSA8IG1fblN5bWJsZVNpemU7ICsraSkKKyAgeworICAgIGZvcihqID0gMDsgaiA8IG1fblN5bWJsZVNpemU7ICsraikKKyAgICB7CisgICAgICBtX2J5TW9kdWxlRGF0YVtpXVtqXSA9IChCWVRFKSgobV9ieU1vZHVsZURhdGFbaV1bal0gJiAweDExKSAhPSAwKTsKKyAgICB9CisgIH0KK30KKworaW50IFFSZW5jb2RlKGNoYXIqIGxwc1NvdXJjZSwgY2hhciogcXIpCit7CisgIGludCBpLCBqLCBuVmVyc2lvbj0yLCBiQXV0b0V4dGVudD0xOworICBpbnQgbmNMZW5ndGgsIG5FbmNvZGVWZXJzaW9uLCBuY0RhdGFDb2RlV29yZCwgbmNUZXJtaW5hdGVyOworICBCWVRFIGJ5UGFkZGluZ0NvZGUgPSAweGVjOworICBpbnQgbkRhdGFDd0luZGV4ID0gMCwgbmNCbG9jazEsIG5jQmxvY2syLCBuY0Jsb2NrU3VtOworICBpbnQgbkJsb2NrTm8gPSAwLCBuY0RhdGFDdzEsIG5jRGF0YUN3MjsKKyAgaW50IG5jUlNDdzEsIG5jUlNDdzI7CisKKyAgbV9uTGV2ZWwgPSBRUl9MRVZFTF9NOworICBtX25NYXNraW5nTm8gPSAwOworCisgIG5jTGVuZ3RoID0gc3RybGVuKGxwc1NvdXJjZSk7CisgIGlmKG5jTGVuZ3RoID09IDApCisgICAgcmV0dXJuIC0xOworCisgIG5FbmNvZGVWZXJzaW9uID0gR2V0RW5jb2RlVmVyc2lvbihuVmVyc2lvbiwgbHBzU291cmNlLCBuY0xlbmd0aCk7CisgIGlmKG5FbmNvZGVWZXJzaW9uID09IDApCisgICAgcmV0dXJuIC0xOworCisgIGlmKG5WZXJzaW9uID09IDApCisgIHsKKyAgICBtX25WZXJzaW9uID0gbkVuY29kZVZlcnNpb247CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYobkVuY29kZVZlcnNpb24gPD0gblZlcnNpb24pCisgICAgeworICAgICAgbV9uVmVyc2lvbiA9IG5WZXJzaW9uOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYoYkF1dG9FeHRlbnQpCisgICAgICAgIG1fblZlcnNpb24gPSBuRW5jb2RlVmVyc2lvbjsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIG5jRGF0YUNvZGVXb3JkID0gUVJfVmVyc29uSW5mb1ttX25WZXJzaW9uXS5uY0RhdGFDb2RlV29yZFttX25MZXZlbF07CisKKyAgbmNUZXJtaW5hdGVyID0gbWluKDQsIChuY0RhdGFDb2RlV29yZCAqIDgpIC0gbV9uY0RhdGFDb2RlV29yZEJpdCk7CisKKyAgaWYobmNUZXJtaW5hdGVyID4gMCkKKyAgICBtX25jRGF0YUNvZGVXb3JkQml0ID0gU2V0Qml0U3RyZWFtKG1fbmNEYXRhQ29kZVdvcmRCaXQsIDAsIG5jVGVybWluYXRlcik7CisKKyAgZm9yKGkgPSAobV9uY0RhdGFDb2RlV29yZEJpdCArIDcpIC8gODsgaSA8IG5jRGF0YUNvZGVXb3JkOyArK2kpCisgIHsKKyAgICBtX2J5RGF0YUNvZGVXb3JkW2ldID0gYnlQYWRkaW5nQ29kZTsKKworICAgIGJ5UGFkZGluZ0NvZGUgPSAoQllURSkoYnlQYWRkaW5nQ29kZSA9PSAweGVjID8gMHgxMSA6IDB4ZWMpOworICB9CisKKyAgbV9uY0FsbENvZGVXb3JkID0gUVJfVmVyc29uSW5mb1ttX25WZXJzaW9uXS5uY0FsbENvZGVXb3JkOworICBtZW1zZXQobV9ieUFsbENvZGVXb3JkLCAwLCBtX25jQWxsQ29kZVdvcmQpOworCisgIG5jQmxvY2sxID0gUVJfVmVyc29uSW5mb1ttX25WZXJzaW9uXS5SU19CbG9ja0luZm8xW21fbkxldmVsXS5uY1JTQmxvY2s7CisgIG5jQmxvY2syID0gUVJfVmVyc29uSW5mb1ttX25WZXJzaW9uXS5SU19CbG9ja0luZm8yW21fbkxldmVsXS5uY1JTQmxvY2s7CisgIG5jQmxvY2tTdW0gPSBuY0Jsb2NrMSArIG5jQmxvY2syOworCisgIG5jRGF0YUN3MSA9IFFSX1ZlcnNvbkluZm9bbV9uVmVyc2lvbl0uUlNfQmxvY2tJbmZvMVttX25MZXZlbF0ubmNEYXRhQ29kZVdvcmQ7CisgIG5jRGF0YUN3MiA9IFFSX1ZlcnNvbkluZm9bbV9uVmVyc2lvbl0uUlNfQmxvY2tJbmZvMlttX25MZXZlbF0ubmNEYXRhQ29kZVdvcmQ7CisKKyAgZm9yKGkgPSAwOyBpIDwgbmNCbG9jazE7ICsraSkKKyAgeworICAgIGZvcihqID0gMDsgaiA8IG5jRGF0YUN3MTsgKytqKQorICAgIHsKKyAgICAgIG1fYnlBbGxDb2RlV29yZFsobmNCbG9ja1N1bSAqIGopICsgbkJsb2NrTm9dID0gbV9ieURhdGFDb2RlV29yZFtuRGF0YUN3SW5kZXgrK107CisgICAgfQorCisgICAgKytuQmxvY2tObzsKKyAgfQorCisgIGZvcihpID0gMDsgaSA8IG5jQmxvY2syOyArK2kpCisgIHsKKyAgICBmb3IoaiA9IDA7IGogPCBuY0RhdGFDdzI7ICsraikKKyAgICB7CisgICAgICBpZihqIDwgbmNEYXRhQ3cxKQorICAgICAgeworICAgICAgICBtX2J5QWxsQ29kZVdvcmRbKG5jQmxvY2tTdW0gKiBqKSArIG5CbG9ja05vXSA9IG1fYnlEYXRhQ29kZVdvcmRbbkRhdGFDd0luZGV4KytdOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBtX2J5QWxsQ29kZVdvcmRbKG5jQmxvY2tTdW0gKiBuY0RhdGFDdzEpICsgaV0gID0gbV9ieURhdGFDb2RlV29yZFtuRGF0YUN3SW5kZXgrK107CisgICAgICB9CisgICAgfQorCisgICAgKytuQmxvY2tObzsKKyAgfQorCisgIG5jUlNDdzEgPSBRUl9WZXJzb25JbmZvW21fblZlcnNpb25dLlJTX0Jsb2NrSW5mbzFbbV9uTGV2ZWxdLm5jQWxsQ29kZVdvcmQgLSBuY0RhdGFDdzE7CisgIG5jUlNDdzIgPSBRUl9WZXJzb25JbmZvW21fblZlcnNpb25dLlJTX0Jsb2NrSW5mbzJbbV9uTGV2ZWxdLm5jQWxsQ29kZVdvcmQgLSBuY0RhdGFDdzI7CisKKyAgbkRhdGFDd0luZGV4ID0gMDsKKyAgbkJsb2NrTm8gPSAwOworCisgIGZvcihpID0gMDsgaSA8IG5jQmxvY2sxOyArK2kpCisgIHsKKyAgICBtZW1zZXQobV9ieVJTV29yaywgMCwgc2l6ZW9mKG1fYnlSU1dvcmspKTsKKworICAgIG1lbW1vdmUobV9ieVJTV29yaywgbV9ieURhdGFDb2RlV29yZCArIG5EYXRhQ3dJbmRleCwgbmNEYXRhQ3cxKTsKKworICAgIEdldFJTQ29kZVdvcmQobV9ieVJTV29yaywgbmNEYXRhQ3cxLCBuY1JTQ3cxKTsKKworICAgIGZvcihqID0gMDsgaiA8IG5jUlNDdzE7ICsraikKKyAgICB7CisgICAgICBtX2J5QWxsQ29kZVdvcmRbbmNEYXRhQ29kZVdvcmQgKyAobmNCbG9ja1N1bSAqIGopICsgbkJsb2NrTm9dID0gbV9ieVJTV29ya1tqXTsKKyAgICB9CisKKyAgICBuRGF0YUN3SW5kZXggKz0gbmNEYXRhQ3cxOworICAgICsrbkJsb2NrTm87CisgIH0KKworICBmb3IoaSA9IDA7IGkgPCBuY0Jsb2NrMjsgKytpKQorICB7CisgICAgbWVtc2V0KG1fYnlSU1dvcmssIDAsIHNpemVvZihtX2J5UlNXb3JrKSk7CisKKyAgICBtZW1tb3ZlKG1fYnlSU1dvcmssIG1fYnlEYXRhQ29kZVdvcmQgKyBuRGF0YUN3SW5kZXgsIG5jRGF0YUN3Mik7CisKKyAgICBHZXRSU0NvZGVXb3JkKG1fYnlSU1dvcmssIG5jRGF0YUN3MiwgbmNSU0N3Mik7CisKKyAgICBmb3IoaiA9IDA7IGogPCBuY1JTQ3cyOyArK2opCisgICAgeworICAgICAgbV9ieUFsbENvZGVXb3JkW25jRGF0YUNvZGVXb3JkICsgKG5jQmxvY2tTdW0gKiBqKSArIG5CbG9ja05vXSA9IG1fYnlSU1dvcmtbal07CisgICAgfQorCisgICAgbkRhdGFDd0luZGV4ICs9IG5jRGF0YUN3MjsKKyAgICArK25CbG9ja05vOworICB9CisKKyAgbV9uU3ltYmxlU2l6ZSA9IG1fblZlcnNpb24gKiA0ICsgMTc7CisKKyAgRm9ybWF0TW9kdWxlKCk7CisKKyAgLy82NHg2NAorICAvLyAJZm9yIChpID0gMDsgaSA8IE1BWF9NT0RVTEVTSVpFOyBpKyspIHsKKyAgLy8gCQlmb3IgKGogPSAwOyBqIDwgTUFYX01PRFVMRVNJWkU7IGorKykgeworICAvLyAJCQluX2J5TW9kdWxlRGF0YVtpKjJdW2oqMl0gPSBtX2J5TW9kdWxlRGF0YVtpXVtqXTsKKyAgLy8gCQkJbl9ieU1vZHVsZURhdGFbaSoyXVtqKjIrMV0gPSBtX2J5TW9kdWxlRGF0YVtpXVtqXTsKKyAgLy8gCQl9CisgIC8vIAkJbWVtY3B5KG5fYnlNb2R1bGVEYXRhW2kqMisxXSwgbl9ieU1vZHVsZURhdGFbaSoyXSwgTUFYX01PRFVMRVNJWkUqMik7CisgIC8vIAl9CisgIC8vIAlmb3IgKGkgPSAwOyBpIDwgTUFYX01PRFVMRVNJWkUyOyBpKyspIHsKKyAgLy8gCQlmb3IgKGogPSAwOyBqIDwgKE1BWF9NT0RVTEVTSVpFMi84KTsgaisrKSB7CisgIC8vIAkJCXFyW2kgKiAoTUFYX01PRFVMRVNJWkUyLzggKyAxKSArIGpdICA9IG5fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDBdIDw8IDc7CisgIC8vIAkJCXFyW2kgKiAoTUFYX01PRFVMRVNJWkUyLzggKyAxKSArIGpdIHw9IG5fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDFdIDw8IDY7CisgIC8vIAkJCXFyW2kgKiAoTUFYX01PRFVMRVNJWkUyLzggKyAxKSArIGpdIHw9IG5fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDJdIDw8IDU7CisgIC8vIAkJCXFyW2kgKiAoTUFYX01PRFVMRVNJWkUyLzggKyAxKSArIGpdIHw9IG5fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDNdIDw8IDQ7CisgIC8vIAkJCXFyW2kgKiAoTUFYX01PRFVMRVNJWkUyLzggKyAxKSArIGpdIHw9IG5fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDRdIDw8IDM7CisgIC8vIAkJCXFyW2kgKiAoTUFYX01PRFVMRVNJWkUyLzggKyAxKSArIGpdIHw9IG5fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDVdIDw8IDI7CisgIC8vIAkJCXFyW2kgKiAoTUFYX01PRFVMRVNJWkUyLzggKyAxKSArIGpdIHw9IG5fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDZdIDw8IDE7CisgIC8vIAkJCXFyW2kgKiAoTUFYX01PRFVMRVNJWkUyLzggKyAxKSArIGpdIHw9IG5fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDddOworICAvLyAJCX0KKyAgLy8gCQlpZiAoaiA9PSBNQVhfTU9EVUxFU0laRTIvOCkgeworICAvLyAJCQlxcltpICogKE1BWF9NT0RVTEVTSVpFMi84ICsgMSkgKyBqXSAgPSBuX2J5TW9kdWxlRGF0YVtpXVtqKjggKyAwXSA8PCA3OworICAvLyAJCQlxcltpICogKE1BWF9NT0RVTEVTSVpFMi84ICsgMSkgKyBqXSB8PSBuX2J5TW9kdWxlRGF0YVtpXVtqKjggKyAxXSA8PCA2OworICAvLyAJCX0KKyAgLy8gCX0KKworICAvLzQ4eDQ4CisgIC8vCWZvciAoaSA9IDA7IGkgPCBNQVhfTU9EVUxFU0laRTsgaSsrKSB7CisgIC8vCQlxcltpICogKChNQVhfTU9EVUxFU0laRS0xKS84ICsgMSldID0gbV9ieU1vZHVsZURhdGFbaV1bMF07CisgIC8vCQlmb3IgKGogPSAxOyBqIDwgKChNQVhfTU9EVUxFU0laRS0xKS84ICsgMSk7IGorKykgeworICAvLwkJCXFyW2kgKiAoKE1BWF9NT0RVTEVTSVpFLTEpLzggKyAxKSArIGpdID0gbV9ieU1vZHVsZURhdGFbaV1bKGotMSkqOCArIDFdIDw8IDc7CisgIC8vCQkJcXJbaSAqICgoTUFYX01PRFVMRVNJWkUtMSkvOCArIDEpICsgal0gfD0gbV9ieU1vZHVsZURhdGFbaV1bKGotMSkqOCArIDJdIDw8IDY7CisgIC8vCQkJcXJbaSAqICgoTUFYX01PRFVMRVNJWkUtMSkvOCArIDEpICsgal0gfD0gbV9ieU1vZHVsZURhdGFbaV1bKGotMSkqOCArIDNdIDw8IDU7CisgIC8vCQkJcXJbaSAqICgoTUFYX01PRFVMRVNJWkUtMSkvOCArIDEpICsgal0gfD0gbV9ieU1vZHVsZURhdGFbaV1bKGotMSkqOCArIDRdIDw8IDQ7CisgIC8vCQkJcXJbaSAqICgoTUFYX01PRFVMRVNJWkUtMSkvOCArIDEpICsgal0gfD0gbV9ieU1vZHVsZURhdGFbaV1bKGotMSkqOCArIDVdIDw8IDM7CisgIC8vCQkJcXJbaSAqICgoTUFYX01PRFVMRVNJWkUtMSkvOCArIDEpICsgal0gfD0gbV9ieU1vZHVsZURhdGFbaV1bKGotMSkqOCArIDZdIDw8IDI7CisgIC8vCQkJcXJbaSAqICgoTUFYX01PRFVMRVNJWkUtMSkvOCArIDEpICsgal0gfD0gbV9ieU1vZHVsZURhdGFbaV1bKGotMSkqOCArIDddIDw8IDE7CisgIC8vCQkJcXJbaSAqICgoTUFYX01PRFVMRVNJWkUtMSkvOCArIDEpICsgal0gfD0gbV9ieU1vZHVsZURhdGFbaV1bKGotMSkqOCArIDhdOworICAvLwkJfQorICAvLwl9CisgIC8vCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKyAgLy8JCWZvciAoaiA9IDA7IGogPCAoTUFYX01PRFVMRVNJWkUtMSkvOCArIDE7IGorKykgeworICAvLwkJCXFyW01BWF9NT0RVTEVTSVpFICogNiArIGkgKyBqXSA9IDA7CisgIC8vCQl9CisgIC8vCX0KKworICAvLzMyeDMyCisgIC8vIAlmb3IgKGkgPSAwOyBpIDwgTUFYX01PRFVMRVNJWkU7IGkrKykgeworICAvLyAJCWZvciAoaiA9IDA7IGogPCAoTUFYX01PRFVMRVNJWkUvOCk7IGorKykgeworICAvLyAJCQlxcltpICogKE1BWF9NT0RVTEVTSVpFLzggKyAxKSArIGpdICA9IG1fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDBdIDw8IDc7CisgIC8vIAkJCXFyW2kgKiAoTUFYX01PRFVMRVNJWkUvOCArIDEpICsgal0gfD0gbV9ieU1vZHVsZURhdGFbaV1baio4ICsgMV0gPDwgNjsKKyAgLy8gCQkJcXJbaSAqIChNQVhfTU9EVUxFU0laRS84ICsgMSkgKyBqXSB8PSBtX2J5TW9kdWxlRGF0YVtpXVtqKjggKyAyXSA8PCA1OworICAvLyAJCQlxcltpICogKE1BWF9NT0RVTEVTSVpFLzggKyAxKSArIGpdIHw9IG1fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDNdIDw8IDQ7CisgIC8vIAkJCXFyW2kgKiAoTUFYX01PRFVMRVNJWkUvOCArIDEpICsgal0gfD0gbV9ieU1vZHVsZURhdGFbaV1baio4ICsgNF0gPDwgMzsKKyAgLy8gCQkJcXJbaSAqIChNQVhfTU9EVUxFU0laRS84ICsgMSkgKyBqXSB8PSBtX2J5TW9kdWxlRGF0YVtpXVtqKjggKyA1XSA8PCAyOworICAvLyAJCQlxcltpICogKE1BWF9NT0RVTEVTSVpFLzggKyAxKSArIGpdIHw9IG1fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDZdIDw8IDE7CisgIC8vIAkJCXFyW2kgKiAoTUFYX01PRFVMRVNJWkUvOCArIDEpICsgal0gfD0gbV9ieU1vZHVsZURhdGFbaV1baio4ICsgN107CisgIC8vIAkJfQorICAvLyAJCWlmIChqID09IE1BWF9NT0RVTEVTSVpFLzgpIHsKKyAgLy8gCQkJcXJbaSAqIChNQVhfTU9EVUxFU0laRS84ICsgMSkgKyBqXSAgPSBtX2J5TW9kdWxlRGF0YVtpXVtqKjggKyAwXSA8PCA3OworICAvLyAJCQlxcltpICogKE1BWF9NT0RVTEVTSVpFLzggKyAxKSArIGpdIHw9IG1fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDFdIDw8IDY7CisgIC8vIAkJCXFyW2kgKiAoTUFYX01PRFVMRVNJWkUvOCArIDEpICsgal0gfD0gbV9ieU1vZHVsZURhdGFbaV1baio4ICsgMl0gPDwgNTsKKyAgLy8gCQkJcXJbaSAqIChNQVhfTU9EVUxFU0laRS84ICsgMSkgKyBqXSB8PSBtX2J5TW9kdWxlRGF0YVtpXVtqKjggKyAzXSA8PCA0OworICAvLyAJCQlxcltpICogKE1BWF9NT0RVTEVTSVpFLzggKyAxKSArIGpdIHw9IG1fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDRdIDw8IDM7CisgIC8vIAkJfQorICAvLyAJfQorICAvLzQweDQwCisgIGlmKHFyKQorICB7CisgICAgZm9yKGkgPSAwOyBpIDwgTUFYX01PRFVMRVNJWkU7IGkrKykKKyAgICB7CisgICAgICBmb3IoaiA9IDA7IGogPCAoTUFYX01PRFVMRVNJWkUvOCk7IGorKykKKyAgICAgIHsKKyAgICAgICAgcXJbaSAqIChNQVhfTU9EVUxFU0laRS84ICsgMSkgKyBqXSAgPSBtX2J5TW9kdWxlRGF0YVtpXVtqKjggKyAwXSA8PCA3OworICAgICAgICBxcltpICogKE1BWF9NT0RVTEVTSVpFLzggKyAxKSArIGpdIHw9IG1fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDFdIDw8IDY7CisgICAgICAgIHFyW2kgKiAoTUFYX01PRFVMRVNJWkUvOCArIDEpICsgal0gfD0gbV9ieU1vZHVsZURhdGFbaV1baio4ICsgMl0gPDwgNTsKKyAgICAgICAgcXJbaSAqIChNQVhfTU9EVUxFU0laRS84ICsgMSkgKyBqXSB8PSBtX2J5TW9kdWxlRGF0YVtpXVtqKjggKyAzXSA8PCA0OworICAgICAgICBxcltpICogKE1BWF9NT0RVTEVTSVpFLzggKyAxKSArIGpdIHw9IG1fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDRdIDw8IDM7CisgICAgICAgIHFyW2kgKiAoTUFYX01PRFVMRVNJWkUvOCArIDEpICsgal0gfD0gbV9ieU1vZHVsZURhdGFbaV1baio4ICsgNV0gPDwgMjsKKyAgICAgICAgcXJbaSAqIChNQVhfTU9EVUxFU0laRS84ICsgMSkgKyBqXSB8PSBtX2J5TW9kdWxlRGF0YVtpXVtqKjggKyA2XSA8PCAxOworICAgICAgICBxcltpICogKE1BWF9NT0RVTEVTSVpFLzggKyAxKSArIGpdIHw9IG1fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDddOworICAgICAgfQorICAgICAgaWYoaiA9PSBNQVhfTU9EVUxFU0laRS84KQorICAgICAgeworICAgICAgICBxcltpICogKE1BWF9NT0RVTEVTSVpFLzggKyAxKSArIGpdICA9IG1fYnlNb2R1bGVEYXRhW2ldW2oqOCArIDBdIDw8IDc7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9saWJxci9xcmVuY29kZS5oIGIvbGlicXIvcXJlbmNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ExMTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicXIvcXJlbmNvZGUuaApAQCAtMCwwICsxLDQ4IEBACisjaWZuZGVmIFFSRU5DT0RFX0gKKyNkZWZpbmUgUVJFTkNPREVfSAorCisjZGVmaW5lIE1BWF9NT0RVTEVTSVpFCSAgMjUgLy80MSAvLzUwCS8vIDIxOlZlcnNpb249MSzX7rTz19a3+z0xNyg4LjW49rq619YpCisJCQkJCQkJCS8vIDI1OlZlcnNpb249MizX7rTz19a3+z0zMigxNrj2urrX1ikKKwkJCQkJCQkJLy8gMjk6VmVyc2lvbj0zLNfutPPX1rf7PTUzKDI2LjW49rq619YpCisJCQkJCQkJCS8vIDMzOlZlcnNpb249NCzX7rTz19a3+z03OCgzObj2urrX1ikKKwkJCQkJCQkJLy8gMzc6VmVyc2lvbj01LNfutPPX1rf7PTEwNig1M7j2urrX1ikgCisJCQkJCQkJCS8vIDQxOlZlcnNpb249NizX7rTz19a3+z0xMzQoNje49rq619YpIHRoZSBvbmUKKwkJCQkJCQkgCS8vIDQ1OlZlcnNpb249NyzX7rTz19a3+z0xNTQoNze49rq619YpCisJCQkJCQkJIAkvLyA0OTpWZXJzaW9uPTgs1+6089fWt/s9MTkyKDk2uPa6utfWKQorCQkJCQkJCQkvLyA1MzogOQorCQkJCQkJCQkvLyA1NzogMTAKKwkJCQkJCQkJLy8gNjE6IDExCisvLyAjZGVmaW5lIFFSX01BUkdJTgk0CisKK2ludCBRUmVuY29kZShjaGFyICpscHNTb3VyY2UsIGNoYXIgKnFyKTsKKworLy9pbnQgR2V0RW5jb2RlVmVyc2lvbihpbnQgblZlcnNpb24sIGNoYXIgKmxwc1NvdXJjZSwgaW50IG5jTGVuZ3RoKTsKKy8vYm9vbCBFbmNvZGVTb3VyY2VEYXRhKGNoYXIgKmxwc1NvdXJjZSwgaW50IG5jTGVuZ3RoLCBpbnQgblZlckdyb3VwKTsKKworLy9pbnQgR2V0Qml0TGVuZ3RoKEJZVEUgbk1vZGUsIGludCBuY0RhdGEsIGludCBuVmVyR3JvdXApOworCisvL2ludCBTZXRCaXRTdHJlYW0oaW50IG5JbmRleCwgV09SRCB3RGF0YSwgaW50IG5jRGF0YSk7CisKKy8vYm9vbCBJc051bWVyYWxEYXRhKHVuc2lnbmVkIGNoYXIgYyk7CisvL2Jvb2wgSXNBbHBoYWJldERhdGEodW5zaWduZWQgY2hhciBjKTsKKworLy9CWVRFIEFscGhhYmV0VG9CaW5hbHkodW5zaWduZWQgY2hhciBjKTsKKworLy92b2lkIEdldFJTQ29kZVdvcmQoQllURSAqbHBieVJTV29yaywgaW50IG5jRGF0YUNvZGVXb3JkLCBpbnQgbmNSU0NvZGVXb3JkKTsKKworLy92b2lkIEZvcm1hdE1vZHVsZSh2b2lkKTsKKworLy92b2lkIFNldEZ1bmN0aW9uTW9kdWxlKHZvaWQpOworLy92b2lkIFNldEZpbmRlclBhdHRlcm4oaW50IHgsIGludCB5KTsKKy8vdm9pZCBTZXRBbGlnbm1lbnRQYXR0ZXJuKGludCB4LCBpbnQgeSk7CisvL3ZvaWQgU2V0VmVyc2lvblBhdHRlcm4odm9pZCk7CisvL3ZvaWQgU2V0Q29kZVdvcmRQYXR0ZXJuKHZvaWQpOworLy92b2lkIFNldE1hc2tpbmdQYXR0ZXJuKGludCBuUGF0dGVybk5vKTsKKy8vdm9pZCBTZXRGb3JtYXRJbmZvUGF0dGVybihpbnQgblBhdHRlcm5Obyk7CisvL2ludCBDb3VudFBlbmFsdHkodm9pZCk7CisKK2V4dGVybiBpbnQgbV9uU3ltYmxlU2l6ZTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIG1fYnlNb2R1bGVEYXRhW01BWF9NT0RVTEVTSVpFXVtNQVhfTU9EVUxFU0laRV07CisKKyNlbmRpZgorCg==