C语言 组播 老是不给我审核通过,也不知道哪里违规了,直接base64编码

友链


IyBb5Y+L6ZO+XShodHRwOi8vMTQ0LjM0LjE2NC4yMTcvKQoK55u46L6D5LqO5bm/5pKt77yM5bCx5piv5aSa5LqG5LiA5Liq6K6+572u5aSa5pKt57uE5ZKM5Yqg5YWl5aSa5pKt57uE55qE5pON5L2cCgpnY2MgMS5jIC1vIDEgLWxwdGhyZWFkCgpjdHJsK2bmkJzntKLmnI3liqHnq6/ku6PnoIHlkozlrqLmiLfnq6/ku6PnoIHojrflj5bku6PnoIHmlpzkvZPmoLflvI8K5pyN5Yqh56uv5Luj56CBOgpgYGBjCi8vIOOAgeOAgeS9v+eUqOWGheWtmOaYoOWwhOWPr+S7peaLt+i0neaWh+S7tgovKgrlr7nljp/lp4vmlofku7bov5vooYzlhoXlrZjmmKDlsIQK5Yib5bu65LiA5Liq5paw5paH5Lu2CuaKiuaWsOaWh+S7tueahOaVsOaNruaLt+i0neaYoOWwhOWIsOWGheWtmOS4rQrpgJrov4flhoXlrZjmi7fotJ3lsIbnrKzkuIDkuKrmlofku7bnmoTlhoXlrZjmmKDlsITljLrmi7fotJ3liLDnrKzkuozkuKrmlofku7bnmoTlhoXlrZjmmKDlsITljLoK6YeK5pS+6LWE5rqQCiovCgovLyDljL/lkI3mmKDlsITvvIzkuI3pnIDopoHmlofku7blrp7kvZPmnaXov5vooYzlhoXlrZjmmKDlsIQKLy8g5Y+q6IO955So5LqO5pyJ6KGA57yY5YWz57O755qE6L+b56iL6Ze06YCa5L+hCiNpbmNsdWRlIDxzeXMvbW1hbi5oPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+IAojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3dhaXQuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgovLyBpbnQgbWFpbigpCi8vIHsKCiAgICAvKgovLyBraWxs5Ye95pWwCi8vIHBpZOOAizDlsIbkv6Hlj7flj5HpgIHnu5nmjIflrprov5vnqIsKLy8gPTDvvJrlsIbkv6Hlj7flj5HpgIHnu5nlvZPliY3ov5vnqIvnu4QKLy8gPS0x77ya5bCG5L+h5Y+35Y+R6YCB57uZ5q+P5LiA5Liq5pyJ5p2D6ZmQ5o6l5Y+X6L+Z5Liq5L+h5Y+355qE6L+b56iLCi8vIOOAii0x77ya6L+b56iL57uEaWTnmoTnu53lr7nlgLwKLy8gc2ln77yM6KaB5Y+R6YCB55qE5L+h5Y+3Ci8vIGtpbGwoZ2V0cHBpZCgpLCA5KTsKLy8ga2lsbChnZXRwaWQoKSwgOSk7Ci8vIHJhaXNl5Ye95pWw77yM57uZ5b2T5YmN6L+b56iL5Y+R6YCB5L+h5Y+3Ci8vIHNpZ++8jOimgeWPkemAgeeahOS/oeWPt++8jOaIkOWKn+i/lOWbnjDvvIzlpLHotKXov5Tlm57pnZ4wKi8KLy8gYWxhcm3lh73mlbAKLy8g6K6+572u5a6a5pe25Zmo77yM5YCS6K6h5pe277yM5b2T5pe26Ze05Li6MOeahOaXtuWAme+8jOS8mue7meW9k+WJjei/m+eoi+WPkemAgeS4gOS4qiBTSUdBTEFSTeS/oeWPtwovLyDlj5bmtojlrprml7blmajvvIxhbGFybSgwKeWNs+WPrwovLyDov5Tlm57lgLzmmK91bnNpZ25lZCBpbnTvvIzlgJLorqHml7bliankvZnnmoTml7bpl7TvvIjkuIrkuIDkuKphbGFybeWJqeS9meeahOaXtumXtO+8iQovLyBTSUdBTFJBUk3kv6Hlj7fpu5jorqTnu4jmraLlvZPliY3ov5vnqIvvvIzmr4/kuKrov5vnqIvlj6rog73orr7nva7kuIDkuKrlrprml7blmagKLy8gaW50IHNlY29uZHMgPSBhbGFybSg1KTsKLy8gcHJpbnRmKCIlZFxuIiwgc2Vjb25kcyk7Ci8vICBzbGVlcCgyKTsKLy8gIHNlY29uZHMgPSBhbGFybSgzKTsKLy8gcHJpbnRmKCIlZFxuIiwgc2Vjb25kcyk7Ci8vIHdoaWxlKDEpewoKLy8gfQovLyAx56eS6ZKf55S16ISR6IO96L6T5aSa5bCR5Liq5pWwPwovL+aXoOiuuui/m+eoi+WkhOS6juS7gOS5iOeKtuaAge+8jGFsYXJt6YO95Lya5q2j5bi46K6h5pe2Ci8vIOWunumZheaXtumXtD3lhoXmoLjml7bpl7Qr55So5oi35pe26Ze0K2lv5raI6ICX55qE5pe26Ze0Ci8vIGFsYXJtKDEpOwovLyBpbnQgaSA9MDsKLy8gd2hpbGUoMSl7Ci8vICAgICBwcmludGYoIiVkXG4iLGkrKyk7Ci8vIH0KCi8vIHNldHRpbWVlcuWHveaVsO+8jOeUqOS6juabv+aNomFsYXJt5Ye95pWw77yM5LiU57K+5bqm5q+UYWxhcm3opoHpq5jlvojlpJrvvIwKLy8g5Y+C5pWwCi8vIHdoaWNo77yM5a6a5pe25Zmo5Lul5LuA5LmI5pe26Ze06K6h5pe2Ci8vICAgICBJVElNRV9SRUFM77yaIOecn+WunuaXtumXtO+8jOaXtumXtOWIsOi+vu+8jOWwseWPkemAgVNJR0FMUk0KLy8gICAgIElUSU1FX1ZJUlRVQUzvvJvnlKjmiLfml7bpl7TvvIzml7bpl7TliLDovr7lsLHlj5HpgIFTSUdWVEFMUk0KLy8gICAgIElUSU1FUl9QUk9G77ya6L+b56iL5Zyo5YaF5qC454q25oCB5LiL5raI6ICX55qE5pe26Ze0Ci8vIOi/hzPnp5LlkI7vvIzmr4/kuKTnp5LmiafooYzkuIDmrKEKLy8gc3RydWN0IGl0aW1lcnZhbCBuZXdfdmFsdWU7Ci8vIC8vIOiuvue9ruWAvAovLyBuZXdfdmFsdWUuaXRfaW50ZXJ2YWwudHZfc2VjID0gMjsKLy8gbmV3X3ZhbHVlLml0X2ludGVydmFsLnR2X3VzZWMgPTA7Ci8vIG5ld192YWx1ZS5pdF92YWx1ZS50dl9zZWM9MzsKLy8gbmV3X3ZhbHVlLml0X3ZhbHVlLnR2X3VzZWM9MDsKLy8gaW50IHJldCA9IHNldGl0aW1lcihJVElNRVJfUkVBTCwmbmV3X3ZhbHVlLE5VTEwpOwovLyBwcmludGYoIuWumuaXtuWZqOW8gOWni1xuIik7Ci8vIGlmIChyZXQ9PS0xKXsKLy8gICAgIHBlcnJvcigic2V0dGltZXIiKTsKLy8gICAgIGV4aXQoMCk7Ci8vIH0KLy8gZ2V0Y2hhcigpOwovLyBzaWduYWzmjZXojrfkv6Hlj7cKLy8gc2lna2lsbCxzaWdzdG9w5pei5LiN6IO96KKr5o2V5o2J5Lmf5LiN6IO96KKr5b+955WlCi8vIHNpZ251be+8muimgeaNleaNieeahOS/oeWPtwovLyBoYW5kbGVy77ya5o2V5o2J5Yiw5L+h5Y+35LmL5ZCO5aaC5L2V5aSE55CGCi8vICAgICBzaWdfaWdu77ya5b+955WlCi8vICAgICBzaWdfZGZs77ya5L2/55So5L+h5Y+36buY6K6k55qE6KGM5Li6Ci8vICAgICDlm57osIPlh73mlbA65o2V6I635Yiw5L+h5Y+35ZCO5omn6KGM6K+l5Ye95pWwCi8vIOi/hzPnp5LlkI7vvIzmr4/kuKTnp5LmiafooYzkuIDmrKEKLy8g5rOo5YaM5L+h5Y+35o2V5o2J5Ye95pWwCi8v5b+955Wl5L+h5Y+3Ci8vIHNpZ25hbChTSUdBTFJNLFNJR19JR04pOwovL+ebtOihjOS/oeWPt+eahOm7mOiupOWKqOS9nO+8iHNpZ19BTFJN57uT5p2f56iL5bqP77yJCi8vIHNpZ25hbChTSUdBTFJNLFNJR19ERkwpOwovLyB2b2lkICgqc2lnX2hhbmRsZXIpKGludCks6L+Z5piv5LiA5Liq5Ye95pWw5oyH6ZKI44CC6L+U5Zuedm9pZO+8jOWPguaVsGludO+8jOWHveaVsOWQjeensO+8mnNpZ19oYW5kbGVyCi8vIOiOt+WPluW9k+WJjee6v+eoi+eahOeOsOaIkGlkCiAgICBpbnQgYXNkYSA9NTsKICAgIC8v5omA5qyy55qE57q/56iL5bqU6K+l5YWx5Lqr6L+ZMTAw5byg6Zeo56WoCiAgICBpbnQgdGlja2V0cyA9MTAwOwogICAgLy8g5Yib5bu65LiA5Liq5LqS5pal6YePCiAgICAgcHRocmVhZF9tdXRleF90IG11dGV4OyAKCiAgICAvL+WHuueOsOS6huWQjOS4gOS4que6v+eoi++8jOS5sOWQjOS4gOW8oOelqOeahOaDheWGtQogICAgLy8g6ZyA6KaB56Gu5L+d5aSa5Liq57q/56iL5LiN5Lya5ZCM5pe25L+u5pS55LiA5Liq5Y+Y6YePCiAgICAvLyDkuLTnlYzljLrjgILvvJtp5L2g5aeQ6LWE5rqQCiAgICAvLyAjaW5jbHVkZTwKICAgICAgcHRocmVhZF9tdXRleF90IG11dGV4MTsKICAgICAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXgyOwp2b2lkICpzaWdfaGFuZGxlcih2b2lkKiBhcmcpIHsKLy8gICAgIHByaW50ZigiJWRcbiIsKihpbnQqKWFyZyk7Ci8vICAgICBwcmludGYoIuaNleiOt+WIsOWtkOe6v+eoi++8mlxuIik7Ci8vICAgICAvLyBzbGVlcCgzKTsKLy8gICAgIHByaW50ZigibGxsbGxsbGzlrZDnur/nqItkaWxsbGxsbGxdbueahOOAgW4lbGRcbiIscHRocmVhZF9zZWxmKCkpOwovLyAgICAgLy8gcmV0dXJuIE5VTEw7Ci8vICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykKLy8ge3ByaW50Zigi5oiR5piv5L2g5YS/5a2QJWRcbiIsaSk7Ci8vICAgICAvKiBjb2RlICovCi8vIH0KLy8gcmV0dXJuIE5VTEw7Ci8vICAgICBwdGhyZWFkX2V4aXQoKHZvaWQqKSZhc2RhKTsKLy8g5Y2W56WoCi8vIOaet+mUgQp3aGlsZSgxKXsKcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CnB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwogICAgaWYodGlja2V0cz4wKXsKICAgIHByaW50Zigi5a2Q57q/56iLJWxk5q2j5Zyo5Y2W5ZywJWTlvKDlk6bnpahcbiIscHRocmVhZF9zZWxmKCksMTAwLXRpY2tldHMrMSk7CiAgICB0aWNrZXRzLS07Cn1lbHNlIHtwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpO2JyZWFrO30KLy8g6Kej6ZSBCgpwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwpwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwp9CnJldHVybiBOVUxMOwp9CgoKLy8gICAgIHByaW50ZigiJWRcbiIsKihpbnQqKWFyZyk7Ci8vICAgICBwcmludGYoIuaNleiOt+WIsOWtkOe6v+eoi++8mlxuIik7Ci8vICAgICAvLyBzbGVlcCgzKTsKLy8gICAgIHByaW50ZigibGxsbGxsbGzlrZDnur/nqItkaWxsbGxsbGxdbueahOOAgW4lbGRcbiIscHRocmVhZF9zZWxmKCkpOwovLyAgICAgLy8gcmV0dXJuIE5VTEw7Ci8vICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykKLy8ge3ByaW50Zigi5oiR5piv5L2g5YS/5a2QJWRcbiIsaSk7Ci8vICAgICAvKiBjb2RlICovCi8vIH0KLy8gcmV0dXJuIE5VTEw7Ci8vICAgICBwdGhyZWFkX2V4aXQoKHZvaWQqKSZhc2RhKTsKLy8g5Y2W56WoCi8vIOaet+mUgQpwdGhyZWFkX211dGV4X3QgYXNkYXNkYXNkYXNkYXNkYXM7CmludCBudW1tID0xOwp2b2lkICpzaWdfaGFuZGxlcjEodm9pZCogYXJnKSB7Ci8vIC8vIHdoaWxlKDEpewoKLy8gcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleDEpOwogICAgd2hpbGUoMSl7CiAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZhc2Rhc2Rhc2Rhc2Rhc2Rhcyk7Cm51bW0rKzsKLy8gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhc2Rhc2Rhc2Rhc2Rhc2Rhcyk7CnByaW50ZigiKyvosKLosKLvvIx0aWQ6JWxkLG51bW1tOiVkXG4iLHB0aHJlYWRfc2VsZigpLG51bW0pOwogcHRocmVhZF9tdXRleF91bmxvY2soJmFzZGFzZGFzZGFzZGFzZGFzKTsKdXNsZWVwKDEpOwovLyAoMSk7CiAgICB9Ci8vIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgyKTsKLy8gcHJpbnRmKCJ3b3JrQe+8mu+8mlxuIik7CgovLyBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgyKTsKLy8gcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4MSk7Ci8vIC8vICAgICBpZih0aWNrZXRzPjApewovLyAvLyAgICAgcHJpbnRmKCLlrZDnur/nqIslbGTmraPlnKjljZblnLAlZOW8oOWTpuelqFxuIixwdGhyZWFkX3NlbGYoKSwxMDAtdGlja2V0cysxKTsKLy8gLy8gICAgIHRpY2tldHMtLTsKLy8gLy8gfWVsc2Uge3B0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7YnJlYWs7Ci8vIC8vIH0KLy8gLy8g6Kej6ZSBCgovLyAvLyBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwovLyAvLyBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwovLyAvLyB9CnJldHVybiBOVUxMOwp9Ci8vIOWtmOWcqOaVsOaNruWuieWFqOmXrumimGnvvIzor7vlhpnmt7fkubEKdm9pZCAqc2lnX2hhbmRsZXIxMjIzMih2b2lkKiBhcmcpIHsKLy8gLy8gd2hpbGUoMSl7Ci8vIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgyKTsKLy8gc2xlZXAoMSk7Ci8vIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgxKTsKLy8gcHJpbnRmKCLkuozom4vvvJrvvJpcbiIpOwoKLy8gcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4MSk7Ci8vIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleDIpOwovLyAvLyAgICAgaWYodGlja2V0cz4wKXsKLy8gLy8gICAgIHByaW50Zigi5a2Q57q/56iLJWxk5q2j5Zyo5Y2W5ZywJWTlvKDlk6bnpahcbiIscHRocmVhZF9zZWxmKCksMTAwLXRpY2tldHMrMSk7Ci8vIC8vICAgICB0aWNrZXRzLS07Ci8vIC8vIH1lbHNlIHtwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpO2JyZWFrOwovLyAvLyB9CiAgICB3aGlsZSgxKXsKLy8gbnVtbSsrOwogcHRocmVhZF9tdXRleF9sb2NrKCZhc2Rhc2Rhc2Rhc2Rhc2Rhcyk7CnByaW50ZigiKyvor7vor7vvvIx0aWQ6JWxkLG51bW1tOiVkXG4iLHB0aHJlYWRfc2VsZigpLG51bW0pOwogcHRocmVhZF9tdXRleF91bmxvY2soJmFzZGFzZGFzZGFzZGFzZGFzKTsKdXNsZWVwKDEpOwogICAgfQpyZXR1cm4gTlVMTDsKfQoKLy8gICAgIOS/oeWPt+mbhgovLyAgICAg5Lqn55Sf5L2G5piv6L+Y5rKh5pyJ6KKr5aSE55CG55qE5L+h5Y+36KKr5b2S5Yiw5pyq5Yaz5L+h5Y+36ZuGCgovLyAgICAgc2lnaW505L+h5Y+354q25oCB6KKr5a2Y5YKo5Zyo56ys5LqM5LiqYml05L2N5LiKCi8vICAgICAgICAgYml05L2N5Li6Me+8jOivtOaYjuS/oeWPt+WkhOS6juacquWGs+eKtuaAgQovLyDmnKrlhrPnirbmgIHlr7nnmoTkv6Hlj7fpnIDopoHlpIflpITnkIYKLy8g5L2G5piv5Zyo5aSE55CG5LmL5YmN6ZyA6KaB5ZKM5Y+m5LiA5Liq5Y+r5YGa6Zi75aGe5L+h5Y+36ZuG55qE5a+55bqU5q+U54m55L2N6L+b6KGM5q+U6L6DCi8vIOWmguaenOWvueW6lOS9jee9ruaYrzHvvIzpgqPkuYjlsLHor7TmmI7kv6Hlj7fooqvpmLvloZ7vvIzpgqPkuYjov5nkuKrkv6Hlj7flsLHkuI3kvJrooqvlpITnkIbvvIznm7TliLDmjIflj5jmiJAwCi8vIOmYu+WhnuS/oeWPt+mbhum7mOiupOS4jemYu+WhnuS7u+S9leS/oeWPt++8jOaIkeS7rOWPr+S7peaJi+WKqOi/m+ihjOiuvue9ru+8iOiwg+eUqOezu+e7n0FQSe+8iQoKLy8gc2lnZW1wdHlzZXTlh73mlbAKLy8gICAgIOa4heepuuS/oeWPt+mbhuS4reeahOaVsOaNru+8jOaJgOacieagh+W/l+S9jeiiq+iuvue9ruS4ujAKLy8gICAgIOWPguaVsO+8mnNldO+8jOimgeiuvue9rueahOS/oeWPt+mbhgovLyBzaWdmaWxsc2V05Ye95pWwCi8vICAgICDorr7kuLoxCi8vIHNpZ2FkZHNldOWHveaVsAovLyAgICAg6K6+572u5L+h5Y+36ZuG5Lit55qE5p+Q5LiA5Liq5qCH5b+X5L2N6K6+572u5Li6MQovLyBzaWdkZWxzZXQg5Ye95pWwCi8vICAgICDlkozkuIrpnaLnmoTnm7jlj43vvIwwCi8vIHNpZ2lzbWVtYmVy5Ye95pWwCi8vICAgICDliKTmlq3mn5DkuKrkv6Hlj7fmmK/lkKbpmLvloZ4KLy8g5LiK6Z2i55qE5Ye95pWw6YO95piv6Zi75aGe5L+h5Y+36ZuG55qE5pON5L2c5Ye95pWwCi8vIOWIm+W7uuS4gOS4quS/oeWPt+mbhgovLyBzaWdzZXRfdCBzZXQgOwovLyAvLyDlhYjmuIXnqboKLy8gc2lnZW1wdHlzZXQoJnNldCk7Ci8vIC8vIOWIpOaWreS/oeWPt+aYr+WQpuWcqOS/oeWPt+mbhuS4rQovLyBpbnQgcmV0ID0gc2lnaXNtZW1iZXIoJnNldCxTSUdJTlQpOwovLyBpZiAocmV0ID09IDApIHsKLy8gcHJpbnRmKCJTSUdJTlQg5LiN6Zi75aGeXG4iKTsKLy8gfWVsc2UgaWYocmV0ID09IDEpIHsKLy8gcHJpbnRmKCJTSUdJTlQg6Zi75aGeXG4iKTsKCi8vIH0KLy8gLy8g5re75Yqg5L+h5Y+35Yiw5L+h5Y+36ZuG5LitCi8vIHNpZ2FkZHNldCgmc2V0LFNJR0lOVCk7Ci8vIHNpZ2FkZHNldCgmc2V0LFNJR1FVSVQpOwovLyAgcmV0ID0gc2lnaXNtZW1iZXIoJnNldCxTSUdJTlQpOwovLyBpZiAocmV0ID09IDApIHsKLy8gcHJpbnRmKCJTSUdJTlQg5LiN6Zi75aGeXG4iKTsKLy8gfWVsc2UgaWYocmV0ID09IDEpIHsKLy8gcHJpbnRmKCJTSUdJTlQg6Zi75aGeXG4iKTsKCi8vIH0KLy8gIHJldCA9IHNpZ2lzbWVtYmVyKCZzZXQsU0lHUVVJVCk7Ci8vIGlmIChyZXQgPT0gMCkgewovLyBwcmludGYoIlNJR1FVSVQg5LiN6Zi75aGeXG4iKTsKLy8gfWVsc2UgaWYocmV0ID09IDEpIHsKLy8gcHJpbnRmKCJTSUdRVUlUIOmYu+WhnlxuIik7CgovLyB9Ci8vIHNpZ2RlbHNldCgmc2V0LCBTSUdRVUlUKTsKLy8gIHJldCA9IHNpZ2lzbWVtYmVyKCZzZXQsU0lHUVVJVCk7Ci8vIGlmIChyZXQgPT0gMCkgewovLyBwcmludGYoIlNJR1FVSVQg5LiN6Zi75aGeXG4iKTsKLy8gfWVsc2UgaWYocmV0ID09IDEpIHsKLy8gcHJpbnRmKCJTSUdRVUlUIOmYu+WhnlxuIik7CgovLyB9Ci8vIOezu+e7n+iwg+eUqOiuvue9ruS/oeWPt+mbhgovLyBzaWdwcm9jbWFzawovLyDor6Xlh73mlbDlj6/ku6XlsIbmiJHku6zoh6rlrprkuYnnmoTkv6Hlj7fpm4bmmKDlsITliLDlhoXmoLjkuK0KLy8gaG9377yaCi8vICAgICDlpoLkvZXlr7nlhoXmoLjkuK3nmoTpmLvloZ7kv6Hlj7fpm4bov5vooYzlpITnkIYKLy8gICAgICAgICBzaWdfYmxvY2vvvIxtYXNrfHNldAovLyAgICAgICAgIFNJR19VTkJMT0NLOiBtYXNrXnNldCjlvILmiJbmk43kvZwKLy8gICAgICAgICBzaWdfc2V0bWFzayDopobnm5blhoXmoLjnmoTmjIcKLy8gc2lncGVuZGluZwovLyAgICAg6I635Y+W5YaF5qC45b2T5Lit55qE5pyq5Yaz5L+h5Y+36ZuGCgovLyDnvJblhpnkuIDkuKrnqIvluo/vvIzlsIbmiYDmnInnmoTluLjop4Tkv6Hlj7fvvIgxLTMx77yJ55qE5pyq5Yaz54q25oCB5omT5Y2w5Ye65p2lCi8vIOiuvue9ruafkOS6m+S/oeWPt+aYr+mYu+WhnueahO+8jOmAmui/h+mUruebmOadpeS6p+eUn+i/meS6m+S/oeWPt2N0cmwrPwovLyDorr7nva4y44CBM+S/oeWPt+mYu+WhngovLyBzaWdzZXRfdCBzZXQ7Ci8vIHNpZ2VtcHR5c2V0KCZzZXQpOwovLyAvLyDlsIYy44CBM+S/oeWPt+a3u+WKoOWIsOS/oeWPt+mbhuS4rQovLyBzaWdhZGRzZXQoJnNldCxTSUdJTlQpOwovLyBzaWdhZGRzZXQoJnNldCxTSUdRVUlUKTsKLy8gLy/kv67mlLnlhoXmoLjkuK3nmoTpmLvloZ7kv6Hlj7fpm4YKLy8gc2lncHJvY21hc2soU0lHX0JMT0NLLCZzZXQsIE5VTEwpOwovLyBpbnQgbnVtPTA7Ci8vIHdoaWxlKDEpIHsKLy8gICAgIHByaW50ZigibnVt77yaJWRcbiIsbnVtKTsKLy8gICAgIGlmKG51bSA9PSA1KXsKLy8gICAgICAgICAvLyDop6PpmaRzaWdpbnTnmoTpmLvloZ4KLy8gICAgICAgICBzaWdwcm9jbWFzayhTSUdfVU5CTE9DSywmc2V0LE5VTEwpOwovLyAgICAgfQovLyAgICAgbnVtKys7Ci8vICAgICAvLyDojrflj5blvZPliY3nmoTmnKrlhrPkv6Hlj7fpm4YKLy8gICAgIHNpZ3NldF90IHBlbmRpbmdzZXQ7Ci8vICAgICBzaWdlbXB0eXNldCgmcGVuZGluZ3NldCk7Ci8vICAgICBzaWdwZW5kaW5nKCZwZW5kaW5nc2V0KTsKLy8gICAgIC8v6YGN5Y6GYml05L2NCi8vICAgICBmb3IoaW50IGk9MTtpPD0zMjtpKyspIHsKLy8gaWYoc2lnaXNtZW1iZXIoJnBlbmRpbmdzZXQsaSk9PTEpewovLyAgICAgcHJpbnRmKCIxIik7Ci8vIH1lbHNlIGlmKHNpZ2lzbWVtYmVyKCZwZW5kaW5nc2V0LCBpKT09MCkgewovLyAgICAgcHJpbnRmKCIwIik7Ci8vIH1lbHNlewovLyAgICAgcGVycm9yKCJzaWdpc21lbWJlclxuIik7ZXhpdCgwKTsKLy8gfQoKCi8vICAgICB9cHJpbnRmKCJcbiIpO3NsZWVwKDEpOwovLyB9Ci8vIHNpZ2FjdGlvbgovLyDmo4Dmn6XmiJbogIXmlLnlj5jkv6Hlj7fnmoTlpITnkIbmlrnlvI8KLy8gc2lnbnVt77yM6ZyA6KaB5o2V5o2J55qE5L+h5Y+3Ci8vIGFjdO+8jOaNleaNieWIsOS/oeWPt+WQjumcgOimgeaJp+ihjOeahOWKqOS9nAovLyBvbGRhYWN077yM5rKh55SoCgovLyBzdHJ1Y3Qgc2lnYWN0aW9uCi8vICAgICBzYV9oYW5kbGU65Zue6LCD5Ye95pWw5oyH6ZKICgovLyAgICAg5Li05pe26Zi75aGe5L+h5Y+36ZuGCi8vICAgICBzYV9tYXNrCi8vICAgICDkuLTml7bpmLvloZ7mn5Dkupvkv6Hlj7cKCi8vIOS9v+eUqOmCo+S4quS/oeWPt+WkhOeQhuWvueS/oeWPt+i/m+ihjOWkhOeQhuOAguWmguaenOaYrzDooajnpLrkvb/nlKjlm57osIPlh73mlbAKLy8gICAgIC8vIOW/hemhu+WcqOiuvue9ruWumuaXtuWZqOS5i+WJjeazqOWGjOWbnuiwg+WHveaVsAovLyDmnIDlpb3kvb/nlKhzaWdhY3Rpb27ljrvms6jlhozlm57osIPlh73mlbAKLy8gc3RydWN0IHNpZ2FjdGlvbiBhY3Q7Ci8vIGFjdC5zYV9mbGFncyA9IDA7Ci8vIGFjdC5zYV9zaWdhY3Rpb24gPSBzaWdfaGFuZGxlcjsKLy8gLy/muIXnqbrkuLTml7bpmLvloZ7kv6Hlj7fpm4YKLy8gc2lnZW1wdHlzZXQoJmFjdC5zYV9tYXNrKTsKLy8gc2lnYWN0aW9uKFNJR0FMUk0sJmFjdCxOVUxMKTsKLy8gLy8gc2lnX3QgcmV0ciA9ICBzaWduYWwoU0lHQUxSTSxzaWdfaGFuZGxlcik7Ci8vIC8vIGlmKHJldHI9PVNJR19FUlIpIHsKLy8gLy8gICAgIHBlcnJvcigic2lnbmFs5rOo5YaMIik7Ci8vIC8vICAgICBleGl0KC0xKTsKLy8gLy8gfQovLyBzdHJ1Y3QgaXRpbWVydmFsIG5ld192YWx1ZTsKLy8gLy8g6K6+572u5YC8Ci8vIG5ld192YWx1ZS5pdF9pbnRlcnZhbC50dl9zZWMgPSAyOwovLyBuZXdfdmFsdWUuaXRfaW50ZXJ2YWwudHZfdXNlYyA9MDsKLy8gbmV3X3ZhbHVlLml0X3ZhbHVlLnR2X3NlYz0zOwovLyBuZXdfdmFsdWUuaXRfdmFsdWUudHZfdXNlYz0wOwovLyBpbnQgcmV0ID0gc2V0aXRpbWVyKElUSU1FUl9SRUFMLCZuZXdfdmFsdWUsTlVMTCk7Ci8vIHByaW50Zigi5a6a5pe25Zmo5byA5aeLXG4iKTsKLy8gaWYgKHJldD09LTEpewovLyAgICAgcGVycm9yKCJzZXR0aW1lciIpOwovLyAgICAgZXhpdCgwKTsKLy8gfQovLyAvLyBnZXRjaGFyKCk7Ci8vIC8vIHdoaWxlKDEpOwovLyBzaWdjaGlsZOS/oeWPt+S6p+eUn+eahOadoeS7tgovLyAgICAg5a2Q6L+b56iL57uI5q2iCi8vICAgICDlrZDov5vnqIvmjqXmlLbliLBzaWdzdG9w5L+h5Y+35YGc5q2iCi8vICAgICDlrZDov5vnqIvlpITkuo7lgZzmu57nirbmgIHvvIzmlLbliLBzaWdjb2505ZCO5ZSk6YaSCi8vIOeItui/m+eoi+m7mOiupOiRq+iKpuivpeS/oeWPtwovLyDlj6/ku6XnlKjkuo7op6PlhrPlg7XlsLjov5vln47nmoTpl67popgKI2luY2x1ZGU8c3lzL3RpbWUuaD4KI2luY2x1ZGU8dGltZS5oPgp2b2lkIHNpZ19oYW5kbGVyMihpbnQgbnVtKXsKdGltZV90ICAgICB0bTIgPSB0aW1lKE5VTEwpOwpzdHJ1Y3QgdG0qIGxvYyA9IGxvY2FsdGltZSgmdG0yKTsKCi8vIGNoYXIgYnVmd2FlaHJzdGVkeXJ0ZWRzWzUyNF07Ci8vIHNwcmludGYoYnVmd2FlaHJzdGVkeXJ0ZWRzLCAiJWQtJWQtJWQgJWQ6JWQ6JWRcbiIsbG9jLT50bV95ZWFyLGxvYy0+dG1fbW9uLGxvYy0+dG1fbWRheSxsb2MtPnRtX2hvdXIsbG9jLT50bV9taW4sbG9jLT50bV9zZWMpOwovLyBwcmludGYoIiVzXG4iLGJ1ZndhZWhyc3RlZHlydGVkcyk7CmNoYXIqIHN0ciAgPWFzY3RpbWUobG9jKTsKaW50IGZkID1vcGVuKCJ0aW1lLnR4dCIsT19SRFdSfE9fQ1JFQVR8T19BUFBFTkQsMDY2NCk7CndyaXRlKGZkLHN0cixzdHJsZW4oc3RyKSk7CmNsb3NlKGZkKTsKICAgIC8vIHByaW50Zigi5o2V5o2J5aWl5b6X5L+h5Y+377yaJWRcbiIsbnVtKTsKICAgIC8vIC8vIOWbnummlue0q+emgeWfjgogICAgLy8gLy8gd2hpbGUoMSl7CiAgICAvLyAvLyB3YWl0KE5VTEwpO30KICAgIC8vIHdoaWxlICgxKQogICAgLy8ge2ludCByZXQgPXdhaXRwaWQoLTEsTlVMTCxXTk9IQU5HKTsKICAgIC8vICAgICAvKiBjb2RlICovCiAgICAvLyAgICAgaWYocmV0PjApewogICAgLy8gICAgICAgICBwcmludGYoIuS6jOWtl+aMguS6hu+8miVkXG4iLCByZXQpOwogICAgLy8gICAgIH1lbHNlIGlmKHJldCA9PTApIHsKICAgIC8vICAgICAgICAgLy8g6K+05piO6L+Y5pyJ5a2Q6L+b56iL5oiW6ICFCiAgICAvLyAgICAgICAgICAgYnJlYWs7CiAgICAvLyAgICAgfWVsc2UgaWYocmV0ID09LSAxKXsKICAgIC8vICAgICAgICAgLy8g5rKh5pyJ57Sr56aB5Z+O5LqGCiAgICAvLyAgICAgICAgIGJyZWFrOwogICAgLy8gICAgIH0KICAgIC8vIH0KICAgIAp9CiNpbmNsdWRlPHN5cy9zaG0uaD4KLy8gaW50IG1haW4oKQovLyB7Ci8vICAgICAvLyDmj5DliY3orr7nva7lpb3pmLvloZ7kv6Hlj7fpm4YKLy8gICAgIC8vIOmYu+WhnnNpZ2NoaWxkCi8vICAgICAvLyDlm6DkuLpVTuWcqOilv21haW7ov5nnp43lj6/og73vvJoKLy8gICAgIC8vICAgICDlrZDov5vnqIvlnKjms6jlhozlj7flm57osIPlh73mlbDkuYvliY3lsLHlt7Lnu4/nu5PmnZ/kuoYKLy8gc2lnc2V0X3Qgc2V0OwovLyBzaWdlbXB0eXNldCgmc2V0KTsKLy8gc2lnYWRkc2V0KCZzZXQsU0lHQ0hMRCk7Ci8vIHNpZ3Byb2NtYXNrKFNJR19CTE9DSywmc2V0ICAsTlVMTCk7CgoKLy8gcGlkX3QgcGlkOwovLyBpbnQgY291bnQ9MjA7Ci8vIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLy8gewovLyAgICAgcGlkID0gZm9yaygpOwovLyAgICAgaWYocGlkPT0wKXsKLy8gICAgICAgICBicmVhazsKLy8gICAgIH0KLy8gICAgIC8qIGNvZGUgKi8KCi8vIH0KLy8gLy8g5o2V5o2J5a2Q6L+b56iL5q275Lqh5pe25Y+R6YCB55qEc2lnY2hpbGTkv6Hlj7cKLy8gc3RydWN0IHNpZ2FjdGlvbiBhY3Q7Ci8vIGFjdC5zYV9mbGFncz0wOwovLyBhY3Quc2Ffc2lnYWN0aW9uID0gc2lnX2hhbmRsZXIyOwovLyBzaWdlbXB0eXNldCgmYWN0LnNhX21hc2spOwovLyBzaWdhY3Rpb24oU0lHQ0hMRCwmYWN0LE5VTEwpOwovLyAvLyDms6jlhozlrozkv6Hlj7fmjZXmjYnkuYvlkI7vvIzlsLHmjqXop6bpmLvloZ4KLy8gc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssJnNldCxOVUxMKTsKLy8gaWYocGlkPjApewovLyAgICAgLy8g54i26L+b56iLCi8vICAgICB3aGlsZSgxKXsKLy8gICAgICAgICBwcmludGYoIuaIkeaYr+S9oOeIuVxuIik7Ci8vICAgICAgICAgc2xlZXAoMik7Ci8vICAgICB9fSBlbHNlIGlmKHBpZD09MCl7Ci8vICAgICAgICAgcHJpbnRmKCLlhL/lrZfvvJolZFxuIixnZXRwaWQoKSk7Ci8vICAgICB9CgovLyBwaWRfdCBwaWQgPSBmb3JrKCk7Ci8vIGlmKHBpZD09MCl7Ci8vICAgICBmb3IoaW50IGk9MDtpPDU7aSsrKSB7Ci8vICAgICAgICAgcHJpbnRmKCLlranlrZDov5vnqIslZFxuIiwgaSk7Ci8vICAgICAgICAgc2xlZXAoMSk7Ci8vICAgICB9Ci8vIH1lbHNlIGlmKHBpZD4wKSB7Ci8vICAgcHJpbnRmKCLniLnov5vnqItcbiIpOwovLyAgIHNsZWVwKDIpOwovLyAgIHByaW50Zigi5YK75YS/5a2QXG4iKTsKLy8gICBraWxsKHBpZCxTSUdJTlQpOwovLyB9Ci8vIOWFseS6q+WGheWtmAovLyDliJvlu7rkuIDkuKrmlrDnmoTlhoXlrZjlhbHkuqvmrrUKLy8g5oiW6ICF6I635Y+W5LiA5LiqICAg5pei5pyJ55qE5YWx5Lqr5YaF5a2Y5q61Ci8vIHNobWF05ZKM5b2T5YmN6L+b56iL6L+b6KGM5YWz6IGUCi8vIHNobWRhdO+8jOenu+mZpOWSjOW9k+WJjei/m+eoi+eahOWFs+iBlAovLyBzaG1jdGwKLy8g5Yib5bu65LiA5Liq5YWx5Lqr5YaF5a2YCi8vIGludCBzaG1pZCA9IHNobWdldCg1MCw0MDk2LElQQ19DUkVBVHwwNjY0KTsKLy8gLy8g5ZKM5b2T5YmN6L+b56iL6L+b6KGM5YWz6IGUCi8vIHZvaWQqIHB0ciA9IHNobWF0KHNobWlkLE5VTEwsMCk7Ci8vIHByaW50ZigiJWRcbiIsIHNobWlkKTsKLy8gY2hhcipzdHIgPSAiaGVsbG8gd29ybGQiOwovLyBtZW1jcHkocHRyLHN0cixzdHJsZW4oc3RyKSsxKTsKLy8gcHJpbnRmKCLmjInku7vmhI/plK7nu6fnu61cbiIpOwovLyBnZXRjaGFyKCk7Ci8vIHNobWR0KHB0cik7Ci8vIHNobWN0bChzaG1pZCxJUENfUk1JRCxOVUxMKTsKLy8gZnRva+WHveaVsO+8jOagueaNruaMh+WumueahOi3r+W+hOWQjeWSjGludOaMh+eUn+aIkOS4gOS4quWFseS6q+WGheWtmOeahGtleQoKLy8g6Jm954S25pivaW5057G75Z6L55qE5oyH77yM5L2G5piv5YaF5qC45Y+q5Lya5L2/55So5LuW55qE5LiA5Liq5a2X6IqC77yM5Lmf5bCx5piv6K+06IyD5Zu05YW25a6e5pivMC0yNTUKLy8g5pON5L2c57O757uf5aaC5L2V55+l6YGT5LiA5Z2X5YWx5Lqr5YaF5a2Y5pyJ5aSa5bCR5Liq6L+b56iL5YWz6IGUCi8vICAgICDlhbHkuqvlhoXlrZjnu7TmiqTkuobkuIDkuKrnu5PmnoTkvZPvvIxzdHJ1Y3Qgc2htaWTigJTigJRkcwovLyAgICAg6K+l57uT5p6E5L2T5Lit5pyJ5LiA5Liq5oiQ5ZGYc2htX25vYXR0YWNo6K6w5b2V5LqG55u45YWz5L+h5oGvCi8vICAgICBpcGNzIC1t5Y+v5Lul5p+l55yLCi8vIOe8luWGmeS4gOS4quWuiOaKpOi/m+eoi++8jOavj+malOS4pOenkuiOt+WPluS4gOS4i+ezu+e7n+aXtumXtO+8jOWwhui/meS4quaXtumXtOWGmeWFpeejgeebmOaWh+S7tuS4rQovLyDliJvlu7rlrZDov5vnqIvvvIzmjqjlh7rniLbov5vnqIsKLy8gcGlkX3QgcGlkID1mb3JrKCk7Ci8vIGlmKHBpZD4wKXsKLy8gICAgIGV4aXQoMCk7Ci8vIH0KLy8gLy8g5bCG5a2Q6L+b56iL5o+Q5Y2H5Li65Zue6K+d77yMCi8vIHNldHNpZCgpOwovLyAvLyDorr7nva7mjqnnoIEKLy8gdW1hc2soMDIyKTsKLy8gLy8g5pu05pS55bel5L2c55uu5b2VCi8vIGNoZGlyKCIvIik7Ci8vIC8vIOWFs+mXreW5tumHjeWumuWQkeaWh+S7tuaPj+i/sOespgovLyAvLyBpbnQgZmQgPSBvcGVuKCIvZGV2L251bGwiLE9fUkRXUik7Ci8vIC8vIGR1cDIoZmQsU1RESU5fRklMRU5PKTsKLy8gLy8gZHVwMihmZCxTVERPVVRfRklMRU5PKTsKLy8gLy8gZHVwMihmZCxTVERFUlJfRklMRU5PKTsKLy8gLy8g5Lia5Yqh6YC76L6RCi8vIC8vIOWIm+W7uuWumuaXtuWZqAovLyAvLyBzZXRpdGltZXIoSVRJTUVSX1JFQUwsJnZhbCxOVUxMKTsKLy8gLy8g5o2V5o2J5a6a5piv5L+h5Y+3Ci8vIHN0cnVjdCBzaWdhY3Rpb24gYWN0OwovLyBhY3Quc2FfZmxhZ3MgPSAwOwovLyBhY3Quc2Ffc2lnYWN0aW9uID0gc2lnX2hhbmRsZXIyOwovLyBzaWdlbXB0eXNldCgmYWN0LnNhX21hc2spOwovLyBzaWdhY3Rpb24oU0lHQUxSTSwmYWN0LE5VTEwpOwovLyAvLyBzdHJ1Y3QgaXRpbWVydmFsIG5ld192YWx1ZTsKLy8gLy8g6K6+572u5YC8Ci8vIHN0cnVjdCBpdGltZXJ2YWwgbmV3X3ZhbHVlOwovLyBuZXdfdmFsdWUuaXRfaW50ZXJ2YWwudHZfc2VjID0gMjsKLy8gbmV3X3ZhbHVlLml0X2ludGVydmFsLnR2X3VzZWMgPTA7Ci8vIG5ld192YWx1ZS5pdF92YWx1ZS50dl9zZWM9MjsKLy8gbmV3X3ZhbHVlLml0X3ZhbHVlLnR2X3VzZWM9MDsKLy8gaW50IHJldCA9IHNldGl0aW1lcihJVElNRVJfUkVBTCwmbmV3X3ZhbHVlLE5VTEwpOwovLyB3aGlsZSgxKXsKLy8gICAgIHNsZWVwKDUpOwovLyB9Ci8vIHB0aHJlYWRfY3JlYXRl5Ye95pWwCi8vICAgICDnlKjkuo7liJvlu7rkuIDkuKrlrZDnur/nqIsKCi8vIOS4gOiIrOaDheWGteS4i++8jG1haW7lh73mlbDmiYDlnKjnmoTljr/ln47nmoTkuLrkuLvljr/ln44KLy8g5YW25L2Z5Yib5bu655qE546w5oiQ5Li65a2Q57q/56iLCi8vIOeoi+W6j+S4rem7mOiupOWPquacieS4gOS4que6v+eoi++8iOS4u+e6v+eoi++8iQovLyDosIPnlKhwdGhyZWFkX2NyZWF0ZeWIm+W7uuS4gOS4quaWsOeahOWOv+WfjgovLyBwdGhlcmVfZGV0YWNoCi8vICAgICDliIbnprvljr/ln44KLy8gICAgIOWli+WKm+S4gOS4quWOv+WOv+WfjuWxggovLyAgICAg6KKr5YiG56a755qE5Y6/5Z+O5Zyo5Lit5YC85b6X5pe25YCZ77yM6LWE5rqQ5Lya6Ieq5Yqo6L+U5Zue57uZ57O757ufCi8vICAgICDkuI3og73lpJrmrKHliIbnprsKLy8gICAgIOWQpuWImeS8muS6p+eUn+S4jeWPr+mihOaWmeeahOihjOS4ugovLyAgICAg5LiN6IO95Y676L+e5o6l5LiA5Liq5bey57uP5YiG56a755qE5Y6/5Z+OCi8vICAgICAgICAg5ZCm5YiZ5Lya5oql6ZSZCi8vICAgICDlj4LmlbDvvJoKLy8gICAgICAgICDliIbopoHliIbnprvnmoTljr/ln45pZAovLyAgICAgICAgIOaIkOWKn+i/lOWbnjDvvIzlpLHotKXov5Tlm57plJnor6/lj7cKLy8g5Yib5bu65LiA5Liq5pi+5oiQ54af5oCnCi8vIOWIm+W7ujXkuKrnlJ/kuqfogIXnur/nqIvvvIw15Liq5raI6LS56ICF57q/56iLCi8vIOS9v+eUqOmTvuihqOadpeWunueOsOWuueWZqAovLyDkvb/nlKjkupLmlqXph4/op6PlhrPlkIzmraXpl67popgKcHRocmVhZF9tdXRleF90IG11dGV4dDsKLy8g5Yib5bu65p2h5Lu25Y+Y6YePCnB0aHJlYWRfY29uZF90IGNvbmQ7CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KLy8g5Yib5bu65Lik5Liq5L+h5Y+36YePCnNlbV90IHBzZW07CnNlbV90IGNzZW07CnN0cnVjdCBOb2RlIHsKICAgIGludCBudW07CiAgICBzdHJ1Y3QgTm9kZSogbmV4dDsKfTsKLy8g5aS06IqC54K5CnN0cnVjdCBOb2RlKiBoZWFkID0gTlVMTDsKCnZvaWQqIHByb2R1Y2VyICh2b2lkKiBhcmcpIHsKICAgIHdoaWxlKDEpIHsKICAgICAgICAvLyDkuI3mlq3lnLDliJvlu7rmlrDnmoToioLngrnlubbmt7vliqDliLDpk77ooajlvZPkuK0KICAgICAgICBzZW1fd2FpdCgmcHNlbSk7CiAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CiAgICAgICAgc3RydWN0IE5vZGUqIG5ld19ub2RlID0gKHN0cnVjdCBOb2RlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBOb2RlKSk7CiAgICAgICAgbmV3X25vZGUtPm5leHQgPSBoZWFkOwogICAgICAgIGhlYWQgPSBuZXdfbm9kZTsKICAgICAgICBuZXdfbm9kZS0+bnVtID0gcmFuZCgpICUgMTAwMDsKICAgICAgICBwcmludGYoImFkZCBub2RlLCBudW0gJWQsIHRpZDogJWxkXG4iLCBuZXdfbm9kZS0+bnVtLCBwdGhyZWFkX3NlbGYoKSk7CiAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKICAgICAgICAvLyDpgJrnn6XmtojotLnogIXnlJ/kuqflh7rkuobkuIDkuKrkuqflk4EKICAgICAgICBzZW1fcG9zdCgmY3NlbSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQp2b2lkKiBjb25zdW1lciAodm9pZCogYXJnKSB7CiAgIHdoaWxlKDEpIHsKICAgICAgICBzZW1fd2FpdCgmY3NlbSk7CiAgICAgICAgIC8vIOS/neWtmOWktOe7k+eCueeahOaMh+mSiAogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwogICAgICAgIHN0cnVjdCBOb2RlKiB0bXAgPSBoZWFkOwogICAgICAgIGhlYWQgPSBoZWFkLT5uZXh0OwogICAgICAgIHByaW50ZigiZGVsZXRlIG5vZGUsIG51bTogJWQsIHRpZDogJWxkXG4iLCB0bXAtPm51bSwgcHRocmVhZF9zZWxmKCkpOwogICAgICAgIGZyZWUodG1wKTsKICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwogICAgICAgIC8vIOmAmuefpeeUn+S6p+iAheWPr+S7peWGjeeUn+S6p+S4gOS4qgogICAgICAgIHNlbV9wb3N0KCZwc2VtKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CiNpbmNsdWRlPGFycGEvaW5ldC5oPgojaW5jbHVkZTxiaXRzL3NvY2tldC5oPgp2b2lkIHJlY3lsZV9jaGlsZChpbnQgYXJnKSB7CiAgICB3aGlsZSgxKSB7CiAgICAgICAgaW50IHJldCA9IHdhaXRwaWQoLTEsIE5VTEwsIFdOT0hBTkcpOwogICAgICAgIGlmICgtMSA9PSByZXQpIHsKICAgICAgICAgICAgLy8g5omA5pyJ55qE5a2Q6L+b56iL6YO95Zue5pS25a6M5q+VCiAgICAgICAgICAgIHByaW50Zigi5omA5pyJ55qE5a2Q6L+b56iL5Zue5pS25a6M5q+VXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gMCkgewogICAgICAgICAgICAvLyDor7TmmI7ov5jmnInlrZDov5vnqIvmtLvnnYAKICAgICAgICAgICAgLy8g562J5b6F5LiL5LiA5qyh5L+h5Y+36L+b5p2lCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgewogICAgICAgICAgICAvLyDov5vnqIvooqvlm57mlLbkuoYKICAgICAgICAgICAgcHJpbnRmKCLlrZDov5vnqIslZOiiq+WbnuaUtuS6hlxuIiwgcmV0KTsKICAgICAgICB9CiAgICB9Cn0KI2luY2x1ZGU8ZXJybm8uaD4KI2luY2x1ZGU8Y3R5cGUuaD4KI2luY2x1ZGU8Y3R5cGUuaD4KI2luY2x1ZGU8Y3R5cGUuaD4KI2luY2x1ZGU8c3lzL3NlbGVjdC5oPgojaW5jbHVkZTxwb2xsLmg+CiNpbmNsdWRlPHN5cy9lcG9sbC5oPgppbnQgbWFpbigpCnsKICAgIC8vIOe7hOaSreWSjOW5v+aSreW3ruS4jeWkmu+8jOWwseaYr+mcgOimgeiuvue9ruS4gOS4que7hOaSree7hAogICAgLy8g5a6i5oi356uv5Yqg5YWl5Yiw5aSa5pKt57uECiAgICAvLyBsZXZlbDogICAgICBJUFBST1RPX0lQCiAgICAvLyBvcHRuYW1lOiAgICBJUF9BRERfTUVNQkVSU0hJUAogICAgLy8gb3B0dmFsOiAgICAgc3RydWN0IG1yZXFuCiAgICBpbnQgZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgMCk7CiAgICBpZiAoLTEgPT0gZmQpIHsKICAgICAgICBwZXJyb3IoIuiNieaLn+WQl3NvY2tldCIpOwogICAgICAgIGV4aXQoLTEpOwogICAgfQogICAgLy8g6K6+572u5aSa5pKt5bGe5oCn77yM6K6+572u5aSW5Ye65o6l5Y+jCiAgICBzdHJ1Y3QgaW5fYWRkciBpbXJfbXVsdGlhZGRyOwogICAgLy8g5Yid5aeL5YyW5aSa5pKt5Zyw5Z2ACiAgICBpbmV0X3B0b24oQUZfSU5FVCwgIjIzOS4wLjAuMSIsICZpbXJfbXVsdGlhZGRyLnNfYWRkcik7CiAgICBzZXRzb2Nrb3B0KGZkLCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfSUYsICZpbXJfbXVsdGlhZGRyLCBzaXplb2YoaW1yX211bHRpYWRkcikpOwoKCiAgICAvLyDliJ3lp4vljJblrqLmiLfnq6/lnLDlnYDkv6Hmga8KICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwogICAgYWRkci5zaW5fZmFtaWx5ICA9QUZfSU5FVDsKICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyg5OTk5KTsKICAgIGluZXRfcHRvbihBRl9JTkVULCAiMjM5LjAuMC4xIiwgJmFkZHIuc2luX2FkZHIuc19hZGRyKTsKCiAgICBpbnQgbnVtID0gMDsKICAgIHdoaWxlKDEpIHsKICAgICAgICAvLyBjaGFyIHJlY3ZidWZbMTI4XTsKICAgICAgICAvLyBjaGFyIGlwX2J1ZlsxNl07CiAgICAgICAgLy8gc3RydWN0IHNvY2thZGRyX2luIGNsaWFkZHI7CiAgICAgICAgLy8gaW50IGxlbiA9IHNpemVvZihjbGlhZGRyKTsKICAgICAgICAvLyBpbnQgbnVtID0gcmVjdmZyb20oZmQsIHJlY3ZidWYsIHNpemVvZihyZWN2YnVmKSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZjbGlhZGRyLCAoc29ja2xlbl90KikmbGVuKTsKICAgICAgICAvLyBpZiAoLTEgPT0gbnVtKSB7CiAgICAgICAgLy8gICAgIHBlcnJvcigi6I2J5ouf5ZCXcmVjdmZyb20iKTsKICAgICAgICAvLyAgICAgZXhpdCgtMSk7CiAgICAgICAgLy8gfQogICAgICAgIC8vIHByaW50Zigi5a6i5oi356uvSVDvvJolcywg56uv5Y+j77yaJWRcbiIsIAogICAgICAgIC8vICAgICBpbmV0X250b3AoQUZfSU5FVCwgJmNsaWFkZHIuc2luX2FkZHIuc19hZGRyLCBpcF9idWYsIHNpemVvZihpcF9idWYpKSwgCiAgICAgICAgLy8gICAgIG50b2hzKGNsaWFkZHIuc2luX3BvcnQpCiAgICAgICAgLy8gICAgICk7CiAgICAgICAgLy8gcHJpbnRmKCLmjqXmlLbliLDnmoTmlbDmja7vvJolc1xuIiwgcmVjdmJ1Zik7CiAgICAgICAgY2hhciBzZW5kYnVmWzEyOF07CiAgICAgICAgc3ByaW50ZihzZW5kYnVmLCJIZWxsbyDkuLTmvbwlZFxuIiwgbnVtKyspOwoKICAgICAgICAvLyDlj5HpgIHmlbDmja4KICAgICAgICBzZW5kdG8oZmQsIHNlbmRidWYsIHN0cmxlbihzZW5kYnVmKSsxLCAwLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7CiAgICAgICAgcHJpbnRmKCLnu4Tmkq3nmoTmlbDmja4lc1xuIiwgc2VuZGJ1Zik7CiAgICAgICAgc2xlZXAoMSk7CiAgICB9CiAgICBjbG9zZShmZCk7CiAgICByZXR1cm4gMDsKfQovLyAgICAgLy8g6K6+572u5bm/5pKt5bGe5oCnCi8vICAgICAvLyBzZXRzb2Nrb3B0Ci8vICAgICAvLyBsZXZlbDogU09MX1NPQ0tFVAovLyAgICAgLy8gb3B0bmFtZTogU09fQlJPQURDQVNUCi8vICAgICAvLyBvcHR2YWw6IGludOexu+Wei+eahOWAvOOAgjHooajnpLrlub/mkq0KLy8gICAgIC8vIG9wdGxlbjogb3B0dmFsdWXnmoTlpKflsI8KCi8vICAgICAvLyDlub/mkq3nmoTlrp7njrAKLy8gICAgIC8vIFVEUAovLyAgICAgLy8gc2VuZHRvCi8vICAgICAvLyByZWNlaXZlX2Zyb20KLy8gICAgIGludCBmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKLy8gICAgIGlmICgtMSA9PSBmZCkgewovLyAgICAgICAgIHBlcnJvcigi6I2J5ouf5ZCXc29ja2V0Iik7Ci8vICAgICAgICAgZXhpdCgtMSk7Ci8vICAgICB9Ci8vICAgICAvLyDorr7nva7lub/mkq3lsZ7mgKcKLy8gICAgIGludCBvcCA9IDE7Ci8vICAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19CUk9BRENBU1QsICZvcCwgc2l6ZW9mKG9wKSk7CgoKLy8gICAgIC8vIOWIm+W7uuS4gOS4quW5v+aSreeahOWcsOWdgAovLyAgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7Ci8vICAgICBhZGRyLnNpbl9mYW1pbHkgID1BRl9JTkVUOwovLyAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKDk5OTkpOwovLyAgICAgaW5ldF9wdG9uKEFGX0lORVQsICIxOTIuMTY4LjEwLjI1NSIsICZhZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci8vICAgICAvLyDkvb/nlKjlub/mkq3nmoTml7blgJnvvIzmnI3liqHnq6/kuI3pnIDopoHnu5HlrpoKLy8gICAgIC8vIGludCByZXQgPSBiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7Ci8vICAgICAvLyBpZiAoLTEgPT0gcmV0KSB7Ci8vICAgICAvLyAgICAgcGVycm9yKCLojYnmi5/lkJdiaW5kIik7Ci8vICAgICAvLyAgICAgZXhpdCgtMSk7Ci8vICAgICAvLyB9Ci8vICAgICAvLyDpgJrkv6EKLy8gICAgIGludCBudW0gPSAwOwovLyAgICAgd2hpbGUoMSkgewovLyAgICAgICAgIC8vIGNoYXIgcmVjdmJ1ZlsxMjhdOwovLyAgICAgICAgIC8vIGNoYXIgaXBfYnVmWzE2XTsKLy8gICAgICAgICAvLyBzdHJ1Y3Qgc29ja2FkZHJfaW4gY2xpYWRkcjsKLy8gICAgICAgICAvLyBpbnQgbGVuID0gc2l6ZW9mKGNsaWFkZHIpOwovLyAgICAgICAgIC8vIGludCBudW0gPSByZWN2ZnJvbShmZCwgcmVjdmJ1Ziwgc2l6ZW9mKHJlY3ZidWYpLCAwLCAoc3RydWN0IHNvY2thZGRyICopJmNsaWFkZHIsIChzb2NrbGVuX3QqKSZsZW4pOwovLyAgICAgICAgIC8vIGlmICgtMSA9PSBudW0pIHsKLy8gICAgICAgICAvLyAgICAgcGVycm9yKCLojYnmi5/lkJdyZWN2ZnJvbSIpOwovLyAgICAgICAgIC8vICAgICBleGl0KC0xKTsKLy8gICAgICAgICAvLyB9Ci8vICAgICAgICAgLy8gcHJpbnRmKCLlrqLmiLfnq69JUO+8miVzLCDnq6/lj6PvvJolZFxuIiwgCi8vICAgICAgICAgLy8gICAgIGluZXRfbnRvcChBRl9JTkVULCAmY2xpYWRkci5zaW5fYWRkci5zX2FkZHIsIGlwX2J1Ziwgc2l6ZW9mKGlwX2J1ZikpLCAKLy8gICAgICAgICAvLyAgICAgbnRvaHMoY2xpYWRkci5zaW5fcG9ydCkKLy8gICAgICAgICAvLyAgICAgKTsKLy8gICAgICAgICAvLyBwcmludGYoIuaOpeaUtuWIsOeahOaVsOaNru+8miVzXG4iLCByZWN2YnVmKTsKLy8gY2hhciBzZW5kYnVmWzEyOF07Ci8vIHNwcmludGYoc2VuZGJ1ZiwiSGVsbG8g5Li05r28JWRcbiIsIG51bSsrKTsKCi8vICAgICAgICAgLy8g5Y+R6YCB5pWw5o2uCi8vICAgICAgICAgc2VuZHRvKGZkLCBzZW5kYnVmLCBzdHJsZW4oc2VuZGJ1ZikrMSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpOwovLyAgICAgICAgIHByaW50Zigi5bm/5pKt55qE5pWw5o2uXG4iKTsKLy8gICAgICAgICBzbGVlcCgxKTsKLy8gICAgIH0KLy8gICAgIGNsb3NlKGZkKTsKLy8gICAgIHJldHVybiAwOwoKLy8gfQoKLy8gLy8gICAgIC8vIHNlbmR0bwovLyAvLyAgICAgLy8gcmVjZWl2ZV9mcm9tCi8vIC8vICAgICBpbnQgZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgMCk7Ci8vIC8vICAgICBpZiAoLTEgPT0gZmQpIHsKLy8gLy8gICAgICAgICBwZXJyb3IoIuiNieaLn+WQl3NvY2tldCIpOwovLyAvLyAgICAgICAgIGV4aXQoLTEpOwovLyAvLyAgICAgfQovLyAvLyAgICAgLy/nu5HlrpoKLy8gLy8gICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwovLyAvLyAgICAgYWRkci5zaW5fZmFtaWx5ICA9QUZfSU5FVDsKLy8gLy8gICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKLy8gLy8gICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyg5OTk5KTsKCgovLyAvLyAgICAgaW50IHJldCA9IGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKLy8gLy8gICAgIGlmICgtMSA9PSByZXQpIHsKLy8gLy8gICAgICAgICBwZXJyb3IoIuiNieaLn+WQl2JpbmQiKTsKLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gICAgIH0KLy8gLy8gICAgIC8vIOmAmuS/oQovLyAvLyAgICAgd2hpbGUoMSkgewovLyAvLyAgICAgICAgIGNoYXIgcmVjdmJ1ZlsxMjhdOwovLyAvLyAgICAgICAgIGNoYXIgaXBfYnVmWzE2XTsKLy8gLy8gICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gY2xpYWRkcjsKLy8gLy8gICAgICAgICBpbnQgbGVuID0gc2l6ZW9mKGNsaWFkZHIpOwovLyAvLyAgICAgICAgIGludCBudW0gPSByZWN2ZnJvbShmZCwgcmVjdmJ1Ziwgc2l6ZW9mKHJlY3ZidWYpLCAwLCAoc3RydWN0IHNvY2thZGRyICopJmNsaWFkZHIsIChzb2NrbGVuX3QqKSZsZW4pOwovLyAvLyAgICAgICAgIGlmICgtMSA9PSBudW0pIHsKLy8gLy8gICAgICAgICAgICAgcGVycm9yKCLojYnmi5/lkJdyZWN2ZnJvbSIpOwovLyAvLyAgICAgICAgICAgICBleGl0KC0xKTsKLy8gLy8gICAgICAgICB9Ci8vIC8vICAgICAgICAgcHJpbnRmKCLlrqLmiLfnq69JUO+8miVzLCDnq6/lj6PvvJolZFxuIiwgCi8vIC8vICAgICAgICAgICAgIGluZXRfbnRvcChBRl9JTkVULCAmY2xpYWRkci5zaW5fYWRkci5zX2FkZHIsIGlwX2J1Ziwgc2l6ZW9mKGlwX2J1ZikpLCAKLy8gLy8gICAgICAgICAgICAgbnRvaHMoY2xpYWRkci5zaW5fcG9ydCkKLy8gLy8gICAgICAgICAgICAgKTsKLy8gLy8gICAgICAgICBwcmludGYoIuaOpeaUtuWIsOeahOaVsOaNru+8miVzXG4iLCByZWN2YnVmKTsKCi8vIC8vICAgICAgICAgLy8g5Y+R6YCB5pWw5o2uCi8vIC8vICAgICAgICAgc2VuZHRvKGZkLCByZWN2YnVmLCBzdHJsZW4ocmVjdmJ1ZikrMSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZjbGlhZGRyLCBsZW4pOwovLyAvLyAgICAgfQovLyAvLyAgICAgY2xvc2UoZmQpOwovLyAvLyAgICAgcmV0dXJuIDA7Ci8vIC8vIH0KLy8gLy8gICAgIC8vIGVwb2xs55qE5bel5L2c5qih5byPCi8vIC8vICAgICAvLyBsdCAgbGV2ZWwgdHJpZ2dlciAg5rC05bmz6Kem5Y+R5qih5byPCi8vIC8vICAgICAvLyBldCAgZWRnZSB0cmlnZ2VyIOi+uee8mOinpuWPkQovLyAvLyAgICAgLy8gbHTmqKHlvI/mmK/pu5jorqTnmoQKLy8gLy8gICAgIC8vIGV05piv6auY6YCf5bel5L2c5pa55byPCi8vIC8vICAgICAvLyDliY3ogIXkvJrkuIDnm7TpgJrnn6XvvIzlkI7ogIXlj6rkvJrpgJrnn6XkuIDmrKHvvIzlpoLmnpzkvaDnvJPlhrLljLrph4zpnaLnmoTmlbDmja7msqHor7vlrozvvIzkuZ/kuI3kvJrlho3pgJrnn6XkuoYKLy8gLy8gICAgIC8vIOWQjuiAheavlOi+g+mrmOaViO+8jOS9huaYr+mcgOimgeino+WGs3JlYWTpmLvloZ7nmoTpl67popgKCiAgICAKLy8gLy8gICAgIC8qKgovLyAvLyAgKiBlcG9sbOeahOWOn+eQhgovLyAvLyAgKiBlcG9sbF9jcmVhdGUoKeWHveaVsOS8muWcqOWGheaguOWMuuWIhumFjeS4gOWdl+WGheWtmAovLyAvLyAgKiBlcG9sbC0+ZXZlbnQgcG9sbAovLyAvLyAgKiDov5Tlm57lgLzmmK/kuIDkuKrmlofku7bmj4/ov7DnrKYKLy8gLy8gICogc3RydWN0IGV2ZW50cG9sbCB7Ci8vIC8vICAqICAuLi4KLy8gLy8gICogIHN0cnVjdCByYl9yb290IHJicjsgLy/nuqLpu5HmoJEKLy8gLy8gICogIHN0cnVjdCBsaXN0X2hlYWQgcmRsaXN0OyAvLyByZWFkeSBsaXN0Ci8vIC8vICAqICAuLi4KLy8gLy8gICogfQovLyAvLyAgKiDnm7TmjqXmk43kvZzlhoXmoLjmgIHnmoTmlbDmja7vvIzkuI3nlKjku47nlKjmiLfmgIHlkozlhoXmoLjmgIHmnaXlm57liIfmjaLkuoYKLy8gLy8gICogCi8vIC8vICAqIGVwb2xsY3RsIAovLyAvLyAgKiAKLy8gLy8gICog55u05o6l5Zyo5YaF5qC45Lit5byA6L6f5LiA5Z2X5YaF5a2Y77yM5bCx5LiN55So5p2l5Zue5YiH5o2i5LqGCi8vIC8vICAqIOaPkOmrmOaViOeOhwovLyAvLyAgKiDnuqLpu5HmoJEgICDkuIDnp43pq5jmlYjnmoTmlbDmja7nu5PmnoQKLy8gLy8gICogCi8vIC8vICAqIOS5i+WJjeaYr+e6v+aAp+aVsOe7hOe7k+aehO+8jOeOsOWcqOaYr+e6oum7keagkee7k+aehAovLyAvLyAgKiAKLy8gLy8gICogZXBvbGxfY3RsKGVwZmQsIEVQT0xMX0NUTF9BREQsIGxmZCwgJmV2KTsKLy8gLy8gICogCi8vIC8vICAqIOesrOS4gOS4quWPguaVsOaYr2NyZWF0ZeaWueazleeahOi/lOWbnuWAvAovLyAvLyAgKiBFUE9MTF9DVExfQUREIOihqOekuui/m+ihjOa3u+WKoOaTjeS9nAovLyAvLyAgKiBsZmTmmK/opoHmo4DmtYvnmoTmj4/ov7DnrKYKLy8gLy8gICog56ys5Zub5Liq5Y+C5pWwZXbvvIzlp5TmiZjlhoXmoLjmo4DmtYvnmoTkuovku7YKLy8gLy8gICogCi8vIC8vICAqIHN0cnVjdCBlcG9sbF9ldmVudCBldjsKLy8gLy8gICogZXYuZXZlbnRzID0gRVBPTExJTiAvLyDor7vkuovku7YKLy8gLy8gICogZXYuZGF0YS5mZCA9IGxmZCAvLyDopoHmo4DmtYvnmoTmlofku7bmj4/ov7DnrKbnmoTmjIcKLy8gLy8gICogCi8vIC8vICAqIGVwb2xsX3dhaXQoZXBmZCkgLy8g6K+l5pa55rOV5Lya5bCGcmRsaXN05Lit55qE5pWw5o2u5ou36LSd5Zue55So5oi35oCBCi8vIC8vICAqIGZvciAoKXsKLy8gLy8gICogIAovLyAvLyAgKiB9Ci8vIC8vICAqIAovLyAvLyAgKiDnm7TmjqXpgY3ljobov5Tlm57nmoTmlbDmja7lsLHooYzkuobvvIzov5Tlm57nmoTnu5PmnpzmmK/lhbfkvZPlk6rlh6DkuKroioLngrnnmoTnirbmgIHlj5HnlJ/kuobmlLnlj5gKLy8gLy8gICogCi8vIC8vICAqIHJkbGlzdOaYr+S4gOS4quWPjOmTvuihqAovLyAvLyAgKiAKLy8gLy8gICogCi8vIC8vICAqIAovLyAvLyAgKi8KLy8gLy8gLy8g5Yib5bu65LiA5Liq5paw55qEZXBvbGzlrp7kvovvvIzlnKjlhoXmoLjkuK3liJvlu7rkuIDkuKrmlbDmja7vvIzov5nkuKrkuK3mnInkuKTkuKrmr5TovoPph43opoHnmoTmiJDlkZgKLy8gLy8gLy8g5LiA5Liq5piv6ZyA6KaB5qOA5rWL5paH5Lu25o+P6L+w56ym55qE5pWw5o2u77yI57qi6buR5qCR77yJ77yM5Y+m5LiA5Liq5piv5bCx5bqP5YiX6KGo77yM55So5LqO5a2Y5pS+5pWw5o2u5Y+R55Sf5pS55Y+Y55qE5paH5Lu25o+P6L+w56ym6ZuG5ZCI77yI5Y+M5ZCR6ZO+6KGo77yJCgovLyAvLyAvLyDlj4LmlbAgc2l6ZSDnm67liY3or6Xlj4LmlbDmmK/msqHmnInmhI/kuYnnmoTvvIzpmo/kvr/lhpnkuIDkuKrmlbDlsLHooYzvvIjpnZ4w77yJCgovLyAvLyAvLyDov5Tlm57lgLwgICA+MCDooajnpLrmlofku7bmj4/ov7DnrKbvvIzmmK/nlKjkuo7mk43kvZxlcG9sbOWunuS+i+eahCAgICAg5aSx6LSl6L+U5ZueLTEKCgoKLy8gLy8gLy8gIGludCByZXQgPSBlcG9sbF9jcmVhdGUoaW50IHNpemUpOwovLyAvLyAvLyDlr7llcG9sbOWunuS+i+i/m+ihjOeuoeeQhgovLyAvLyAvLyBlcG9sbF9jdGzvvIhpbnQgZXBmZCwgaW50IG9wLCBpbnQgZmQgLCBzdHJ1Y3QgZXBvbGxfZW5ldnQqIGV2ZW5077yJCi8vIC8vIC8vIGVwb2xsX2N0bF9hZGQgIGVwb2xsX2N0bF9tb2QgICBlcG9sbF9jdGxfZGVsCi8vIC8vIC8vIGZkICDluLjop4HnmoRlcG9sbOajgOa1i+S6i+S7tiAgIGVwb2xsSU4gIGVwb2xsb3V0IGVwb2xsZXJyCi8vIC8vIC8vIGVwb2xsX2N0bCAgIOa3u+WKoOaWh+S7tuaPj+i/sOespuS/oeaBryAgIOWIoOmZpCAg5L+u5pS5562J55qECi8vIC8vIC8vIOS/ruaUue+8jOWPr+S7peS/ruaUueimgeajgOa1i+eahOS6i+S7tu+8jOavlOWmguS7peWJjeimgeajgOa1i+ivu++8jOaIkeS7rOWPr+S7peS/ruaUueS4uuajgOa1i+WGmQovLyAvLyAgICAgLy8gCiAgICAKLy8gLy8gICAgIC8vIOajgOa1i+WHveaVsAovLyAvLyAgICAgLy8gZXBvbGzigJTigJR3YWl077yJ77yIaW50IGVwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCAqZXZlbnRzLCBpbnQgbWF4ZXZlbnRzLCBpbnQgdGltZW91dHPvvInigJQKLy8gLy8gICAgIC8vZXBmZCAgICAgICBlcG9sbOWunuS+i+WvueW6lOeahOaWh+S7tuaPj+i/sOespgovLyAvLyAvLyBldmVudHPkvKDlh7rlj4LmlbAgICDvvIzph4zpnaLkv53lrZjnmoTmnInlj5HnlJ/kuoblj5jljJbnmoTmlofku7bmj4/ov7DnrKbkv6Hmga/vvIjlk6rlh6DkuKrlj5HnlJ/kuoblj5jljJbvvIzlsLHov5Tlm57lk6rlh6DkuKrvvIkKLy8gLy8gLy8gbWF4ZXZlbnRzICAg56ys5LqM5Liq5Y+C5pWw57uT5p6E5L2T5pWw57uE55qE5aSn5bCPCi8vIC8vIC8vIHRpbWVvdXTpmLvloZ7ml7bpl7QgICAgIDDooajnpLrkuI3pmLvloZ7jgIItMeihqOekuumYu+WhniAgIOebtOWIsOajgOa1i+WIsGZk5pWw5o2u5Y+R55Sf5Y+Y5YyWICDlsLHkvJrop6PpmaTpmLvloZ4KCi8vIC8vIC8vICDjgIswIOihqOekuumYu+WhnueahOaXtumVv++8iOWNleS9jeaYr+avq+enku+8iQovLyAvLyAvLyDov5Tlm57lgLzvvIzov5Tlm57lj5HnlJ/lj5jljJbnmoTmlofku7bmj4/ov7DnrKbnmoTkuKrmlbAKCgovLyAvLyAvLyAvLyAKLy8gLy8gLy8gLy8gIOWIm+W7unNvY2tldAovLyAvLyAvLyAgICAgaW50IGxmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci8vIC8vIC8vICAgICBpZiAoLTEgPT0gbGZkKSB7Ci8vIC8vIC8vIAkJcGVycm9yKCJzb2NrZXQiKTsKLy8gLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gICAgIH0KCi8vIC8vIC8vICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyX2FkZHI7Ci8vIC8vIC8vICAgICBzZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLy8gLy8gLy8gICAgIHNlcnZlcl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7Ci8vIC8vIC8vICAgICBzZXJ2ZXJfYWRkci5zaW5fcG9ydCA9IGh0b25zKDk5OTkpOwoKLy8gLy8gLy8gICAgIC8vIGludCBvcHRfdmFsID0gMTsKLy8gLy8gLy8gICAgIC8vIHNldHNvY2tvcHQobGZkLCBTT0xfU09DS0VULCBTT19SRVVTRVBPUlQsICZvcHRfdmFsLCBzaXplb2Yob3B0X3ZhbCkpOwovLyAvLyAvLyAgICAgLy8g57uR5a6aCi8vIC8vIC8vICAgICBpbnQgcmV0ID0gYmluZChsZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzZXJ2ZXJfYWRkciwgc2l6ZW9mKHNlcnZlcl9hZGRyKSk7Ci8vIC8vIC8vICAgICBpZiAoLTEgPT0gcmV0KSB7Ci8vIC8vIC8vICAgICAgICAgcGVycm9yKCJiaW5kIik7Ci8vIC8vIC8vICAgICAgICAgZXhpdCgtMSk7Ci8vIC8vIC8vICAgICB9Ci8vIC8vIC8vIAkvLyDnm5HlkKwKLy8gLy8gLy8gICAgIHJldCA9IGxpc3RlbihsZmQsIDEyOCk7Ci8vIC8vIC8vICAgICBpZiAoLTEgPT0gcmV0KSB7Ci8vIC8vIC8vICAgICAgICAgcGVycm9yKCJsaXN0ZW4iKTsKLy8gLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gICAgIH0gCgovLyAvLyAvLyAgICAgLy8g6LCD55SoZXBvbGxfY3JlYXRlKCnliJvlu7rkuIDkuKplcG9sbOWunuS+iwovLyAvLyAvLyAgICAgaW50IGVwZmQgPSBlcG9sbF9jcmVhdGUoMTAwKTsKLy8gLy8gLy8gICAgIC8vIOWwhuebkeWQrOeahOaWh+S7tuaPj+i/sOespuebuOWFs+S/oeaBr+a3u+WKoOWIsGVwb2xs5a6e5L6L5b2T5LitCi8vIC8vIC8vICAgICBzdHJ1Y3QgIGVwb2xsX2V2ZW50IGVwZXY7Ci8vIC8vIC8vICAgICBlcGV2LmV2ZW50cyA9IEVQT0xMSU47Ci8vIC8vIC8vICAgICBlcGV2LmRhdGEuZmQgPSBsZmQ7CiAgICAKLy8gLy8gLy8gICAgIGVwb2xsX2N0bChlcGZkLCBFUE9MTF9DVExfQURELCBsZmQsICZlcGV2KTsKCiAgICAKLy8gLy8gLy8gICAgIHN0cnVjdCAgZXBvbGxfZXZlbnQgZXBldnNbMTAyNF0gPSB7MH07CgovLyAvLyAvLyAgICAgd2hpbGUoMSl7Ci8vIC8vIC8vICAgICAgICAgcHJpbnRmKCLov5Tlm57lvqrnjq9cbiIpOwovLyAvLyAvLyAgICAgICAgIC8vIOiwg+eUqGVwb2xs4oCU4oCUd2F0aeajgOa1i+aWh+S7tuaPj+i/sOespueahOWPmOWMlgovLyAvLyAvLyAgICAgICAgIGludCB0cmV0dCA9ZXBvbGxfd2FpdChlcGZkLCBlcGV2cywxMDI0LC0xKTsKLy8gLy8gLy8gICAgICAgICBpZiAoLTEgPT10cmV0dCkgewovLyAvLyAvLyAgICAgICAgICAgICBwZXJyb3IoImVwb2xsX3dhaXQiKTsKLy8gLy8gLy8gICAgICAgICAgICAgZXhpdCgtMSk7Ci8vIC8vIC8vICAgICAgICAgfQoKLy8gLy8gLy8gICAgICAgICAvLyDlj5HnlJ/mlLnlj5jnmoTkuKrmlbAKLy8gLy8gLy8gICAgICAgICBwcmludGYoImVwb2xsX3dhaXTlh73mlbDnmoTov5Tlm57lgLwgcmV0ID0gJWRcbiIsIHRyZXR0KTsKLy8gLy8gLy8gICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyZXR0OyBpKyspCi8vIC8vIC8vICAgICAgICAgeyAgIAovLyAvLyAvLyAgICAgICAgICAgICBpbnQgY3VyZmQgPSBlcGV2c1tpXS5kYXRhLmZkOwoKLy8gLy8gLy8gICAgICAgICAgICAgaWYoY3VyZmQ9PWxmZCkgewovLyAvLyAvLyAgICAgICAgICAgICAgICAgLy8g6KGo56S65pyJ5paw55qE5a6i5oi356uv6L+e5o6l6L+b5p2l5LqG77yIbGlzdGVu55qEbGZk77yJCi8vIC8vIC8vICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gY2xpZW50X2FkZHI7Ci8vIC8vIC8vICAgICAgICAgICAgICAgICBpbnQgbGVuID0gc2l6ZW9mKGNsaWVudF9hZGRyKTsKLy8gLy8gLy8gICAgICAgICAgICAgICAgIGludCBjZmQgPSBhY2NlcHQobGZkLCAoc3RydWN0IHNvY2thZGRyKikmY2xpZW50X2FkZHIsICZsZW4pOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgcHJpbnRmKCLmlrDnmoTlrqLmiLfnq6/ov5vmnaXkuoZcbiIpOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgY2hhciBjbGllbnRfaXBbMTZdOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQsICZjbGllbnRfYWRkci5zaW5fYWRkci5zX2FkZHIsIGNsaWVudF9pcCwgc2l6ZW9mKGNsaWVudF9pcCkpOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgY2xpZW50X3BvcnQgPSBudG9ocyhjbGllbnRfYWRkci5zaW5fcG9ydCk7Ci8vIC8vIC8vICAgICAgICAgICAgICAgICBwcmludGYoIuWuouaIt+err0lQ77yaJXNcbuerr+WPo++8miVkXG4iLCBjbGllbnRfaXAsIGNsaWVudF9wb3J0KTsKLy8gLy8gLy8gICAgICAgICAgICAgICAgIGlmICgtMSA9PSBjZmQpIHsKLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBpZiAoRUlOVFIgPT0gZXJybm8gKSB7Ci8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgIH0KLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBwZXJyb3IoImFjY2VwdCIpOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgIGV4aXQoLTEpOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgfQovLyAvLyAvLyAgICAgICAgICAgICAgICAgLy8g6L+95Yqg5paH5Lu25o+P6L+w56ymCi8vIC8vIC8vICAgICAgICAgICAgICAgICBlcGV2LmV2ZW50cz1FUE9MTElOfEVQT0xMRVQ7Ci8vIC8vIC8vICAgICAgICAgICAgICAgICBlcGV2LmRhdGEuZmQ9Y2ZkOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgZXBvbGxfY3RsKGVwZmQsIEVQT0xMX0NUTF9BREQsY2ZkLCZlcGV2KTsKLy8gLy8gLy8gICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIAovLyAvLyAvLyAgICAgICAgICAgICAgICAgaWYgKGVwZXZzW2ldLmV2ZW50cyAmRVBPTExPVVQpIGNvbnRpbnVlOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgLy8g5pyJ5pWw5o2u5Yiw6L6+Ci8vIC8vIC8vICAgICAgICAgICAgICAgICBwcmludGYoIuacieaVsOaNrui/m+adpVxuIik7Ci8vIC8vIC8vICAgICAgICAgICAgICAgICAvLyDor7TmmI7ov5nkuKrmlofku7bmj4/ov7DnrKblr7nlupTnmoTnvJPlhrLljLrmnaXmlbDmja7kuoYKLy8gLy8gLy8gICAgICAgICAgICAgICAgIC8vIOS4gOasoeWPquiDveivu+WPljXkuKrlrZfoioLnmoTmlbDmja4KLy8gLy8gLy8gICAgICAgICAgICAgICAgIC8vIOS4jeefpemBk+S4uuWVpeOAguS7luaAu+aYr+WQp+S5i+WJjei+k+WHuueahOWuouaIt+err0lQ5byE5YiwYnVm57yT5Yay5Yy65Lit77yM5Zug5q2k5oiR5Y+q5aW95aSa5Yid5aeL5YyW5LiA5Liq5a2X6IqCCi8vIC8vIC8vICAgICAgICAgICAgICAgICAvLyDov5nmoLflsLHkuI3kvJror7vliLDlpJrkvZnnmoTmlbDmja7kuoYKLy8gLy8gLy8gICAgICAgICAgICAgICAgIGNoYXIgYnVmd2FlaHJzdGVkeXJ0ZWRzWzZdPXswfTsKLy8gLy8gLy8gICAgICAgICAgICAgICAgIC8vIHByaW50Zigi5Yid5aeL55qEYnVmd2FlaHJzdGVkeXJ0ZWRzJXNcbiIsYnVmd2FlaHJzdGVkeXJ0ZWRzKTsKLy8gLy8gLy8gICAgICAgICAgICAgICAgIC8vIHByaW50Zigi57yT5Yay5Yy655qE6ZW/5bqmJWxkXG4iLHN0cmxlbihidWZ3YWVocnN0ZWR5cnRlZHMpKTsKICAgICAgICAgICAgICAgCi8vIC8vIC8vICAgICAgICAgICAgICAgICBpbnQgbGVuID0gcmVhZChjdXJmZCwgYnVmd2FlaHJzdGVkeXJ0ZWRzLCA1KTsKLy8gLy8gLy8gICAgICAgICAgICAgICAgIGlmICgtMSA9PSBsZW4pIHsKLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBwZXJyb3IoInJlYWQiKTsKLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoMCA9PSBsZW4pIHsKLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBwcmludGYoIuWuouaIt+err+aWreW8gOi/nuaOpeS6hlxuIik7Ci8vIC8vIC8vICAgICAgICAgICAgICAgICAvLyDliKDpmaTlrqLmiLfnq6/lr7nlupTnmoTmlofku7bmj4/ov7DnrKYKLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBlcG9sbF9jdGwoZXBmZCwgRVBPTExfQ1RMX0RFTCxjdXJmZCxOVUxMKTsKLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBjbG9zZShjdXJmZCk7Ci8vIC8vIC8vICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA+IDApIHsKLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICAvLyBwcmludGYoIuivu+WPluWIsOaVsOaNru+8miVzXG4iLCBidWZ3YWVocnN0ZWR5cnRlZHMpOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlKGN1cmZkLCBidWZ3YWVocnN0ZWR5cnRlZHMsIDUpOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgIC8vIOW+queOr+ivu+WPluWHuue8k+WGsuWMuuS4reeahOaJgOacieaVsOaNrgogICAgICAgICAgICAgICAgICAgIAovLyAvLyAvLyAgICAgICAgICAgICAgICAgfQovLyAvLyAvLyAgICAgICAgICAgICB9Ci8vIC8vIC8vICAgICAgICAgfQovLyAvLyAvLyAgICAgfQovLyAvLyAvLyAgICAgY2xvc2UobGZkKTsKLy8gLy8gLy8gICAgIGNsb3NlKGVwZmQpOwovLyAvLyAvLyAgICAgcmV0dXJuIDA7ICAgCi8vIC8vIC8vIH0KLy8gLy8gLy8gLy8gICAgIC8vIOazqOWGjOS/oeWPt+aNleaNie+8jOeUqOS6juWbnuaUtuWtkOi/m+eoiwovLyAvLyAvLyAvLyAgICAgc3RydWN0IHNpZ2FjdGlvbiBhY3Q7Ci8vIC8vIC8vIC8vICAgICBhY3Quc2FfZmxhZ3M9MDsKLy8gLy8gLy8gLy8gICAgIGFjdC5zYV9zaWdhY3Rpb24gPSByZWN5bGVfY2hpbGQ7Ci8vIC8vIC8vIC8vICAgICBzaWdlbXB0eXNldCgmYWN0LnNhX21hc2spOwogICAgCi8vIC8vIC8vIC8vICAgICBzaWdhY3Rpb24oU0lHQ0hMRCwgJmFjdCwgTlVMTCk7CgoKLy8gLy8gLy8gLy8gICAgIC8vIFRDUOmAmuS/oeacjeWKoeWZqOeahOW5tuWPkQovLyAvLyAvLyAvLyAgICAgLy8g5L2/55So5aSa57q/56iL5oiW6ICF5aSa6L+b56iL6Kej5YazCi8vIC8vIC8vIC8vICAgICAvLyDkuIDkuKrniLbov5vnqIvvvIzlpJrkuKrlrZDov5vnqIsKLy8gLy8gLy8gLy8gICAgIC8vIOeItui/m+eoi+eUqOS6juaOpeaUtuWuouaIt+err+i/nuaOpe+8iOW+queOr++8iQovLyAvLyAvLyAvLyAgICAgLy8g5a2Q6L+b56iL55So5LqO6YCa5L+h77yM5q+P5o6l5pS25LiA5Liq6L+e5o6l77yM5bCx5Yib5bu65LiA5Liq5a2Q6L+b56iLCiAgICAKLy8gLy8gLy8gLy8gICAgIC8vIOWIm+W7unNvY2tldAovLyAvLyAvLyAvLyAgICAgaW50IGxmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci8vIC8vIC8vIC8vICAgICBpZiAoLTEgPT0gbGZkKSB7Ci8vIC8vIC8vIC8vIAkJcGVycm9yKCJzb2NrZXQiKTsKLy8gLy8gLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gLy8gICAgIH0KCi8vIC8vIC8vIC8vICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyX2FkZHI7Ci8vIC8vIC8vIC8vICAgICBzZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLy8gLy8gLy8gLy8gICAgIHNlcnZlcl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7Ci8vIC8vIC8vIC8vICAgICBzZXJ2ZXJfYWRkci5zaW5fcG9ydCA9IGh0b25zKDk5OTkpOwoKLy8gLy8gLy8gLy8gICAgIC8vIGludCBvcHRfdmFsID0gMTsKLy8gLy8gLy8gLy8gICAgIC8vIHNldHNvY2tvcHQobGZkLCBTT0xfU09DS0VULCBTT19SRVVTRVBPUlQsICZvcHRfdmFsLCBzaXplb2Yob3B0X3ZhbCkpOwovLyAvLyAvLyAvLyAgICAgLy8g57uR5a6aCi8vIC8vIC8vIC8vICAgICBpbnQgcmV0ID0gYmluZChsZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzZXJ2ZXJfYWRkciwgc2l6ZW9mKHNlcnZlcl9hZGRyKSk7Ci8vIC8vIC8vIC8vICAgICBpZiAoLTEgPT0gcmV0KSB7Ci8vIC8vIC8vIC8vICAgICAgICAgcGVycm9yKCJiaW5kIik7Ci8vIC8vIC8vIC8vICAgICAgICAgZXhpdCgtMSk7Ci8vIC8vIC8vIC8vICAgICB9Ci8vIC8vIC8vIC8vIAkvLyDnm5HlkKwKLy8gLy8gLy8gLy8gICAgIHJldCA9IGxpc3RlbihsZmQsIDEyOCk7Ci8vIC8vIC8vIC8vICAgICBpZiAoLTEgPT0gcmV0KSB7Ci8vIC8vIC8vIC8vICAgICAgICAgcGVycm9yKCJsaXN0ZW4iKTsKLy8gLy8gLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gLy8gICAgIH0gCi8vIC8vIC8vIC8vICAgICAvLyBmZF9zZXQgcmVhZF9zZXQsIHRtcDsKLy8gLy8gLy8gLy8gICAgIC8vIEZEX1pFUk8oJnJlYWRfc2V0KTsKLy8gLy8gLy8gLy8gICAgIC8vIEZEX1NFVChsZmQsICZyZWFkX3NldCk7Ci8vIC8vIC8vIC8vICAgICAvLyBpbnQgbWF4X2ZkID0gbGZkOwovLyAvLyAvLyAvLyAgICAgLy8g5Yid5aeL5YyW5qOA5rWL55qE5paH5Lu25o+P6L+w56ym5pWw57uECi8vIC8vIC8vIC8vICAgICBzdHJ1Y3QgcG9sbGZkIGZkc1sxMDI0XTsKLy8gLy8gLy8gLy8gICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTAyNDsgaSsrKQovLyAvLyAvLyAvLyAgICAgewovLyAvLyAvLyAvLyAgICAgICAgIGZkc1tpXS5mZCA9IC0xOwovLyAvLyAvLyAvLyAgICAgICAgIGZkc1tpXS5ldmVudHMgPSBQT0xMSU47Ci8vIC8vIC8vIC8vICAgICB9Ci8vIC8vIC8vIC8vICAgICBmZHNbMF0uZmQgPSBsZmQ7Ci8vIC8vIC8vIC8vICAgICBpbnQgbmZkcyA9IDEwMjM7CgovLyAvLyAvLyAvLyAgICAgcHJpbnRmKCLnrYnlvoXlrqLmiLfnq6/ov57mjqUuLi5cbiIpOwovLyAvLyAvLyAvLyAgICAgLy8g5b6q546v562J5b6F5a6i5oi356uv6L+e5o6lCi8vIC8vIC8vIC8vICAgICB3aGlsZSgxKSB7Ci8vIC8vIC8vIC8vICAgICAgICAgLy8g6YG/5YWN5YaF5qC45L+u5pS55oiR5Lus55qE5Y6f5aeL5paH5Lu25o+P6L+w56ym5YiX6KGoCi8vIC8vIC8vIC8vICAgICAgICAgLy8gdG1wID0gcmVhZF9zZXQ7Ci8vIC8vIC8vIC8vICAgICAgICAgaW50IHJldCA9IHBvbGwoZmRzLCBuZmRzKzEsIC0xKTsKICAgICAgICAKLy8gLy8gLy8gLy8gICAgICAgICAvLyDmjqXlj5fov57mjqUKLy8gLy8gLy8gLy8gICAgICAgICAvLyDorr7nva5zZWxlY3TmsLjkuYXpmLvloZ7vvIzkuI3mo4DmtYvliLDmlofku7bmj4/ov7DnrKbnmoTlj5jljJblsLHkuI3kvJrov5Tlm54KLy8gLy8gLy8gLy8gICAgICAgICAvLyBpbnQgc2VsZWN0X3JldCA9IHNlbGVjdChtYXhfZmQrMSwgJnRtcCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci8vIC8vIC8vIC8vICAgICAgICAgaWYgKC0xID09IHJldCkgewovLyAvLyAvLyAvLyAgICAgICAgICAgICBwZXJyb3IoInBvbGwiKTsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgZXhpdCgtMSk7Ci8vIC8vIC8vIC8vICAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gMCkgewovLyAvLyAvLyAvLyAgICAgICAgICAgICBjb250aW51ZTsKLy8gLy8gLy8gLy8gICAgICAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKICAgICAgICAgIAovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgLy8g6K+05piO5qOA5rWL5Yiw5LqG5pyJ5paH5Lu25o+P6L+w56ym5a+55bqU55qE57yT5Yay5Yy655qE5pWw5o2u5Y+R55Sf5LqG5pS55Y+YCi8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAvLyDov5Tlm57nmoTmmK/lj5HnlJ/mlLnlj5jnmoTmlofku7bmj4/ov7DnrKbnmoTmlbDph4/vvIzmiJHku6zov5jpnIDopoHlho3ljrvpgY3ljobkuIDpgY3mnaXliKTmlq3lhbfkvZPmmK/lk6rkupvmlofku7bmj4/ov7DnrKblj5HnlJ/kuobmlLnlj5gKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgIGlmIChmZHNbMF0ucmV2ZW50cyAmIFBPTExJTikgewovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgIC8vIOihqOekuuacieaWsOeahOWuouaIt+err+i/nuaOpei/m+adpeS6hu+8iGxpc3RlbueahGxmZO+8iQovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBjbGllbnRfYWRkcjsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gc2l6ZW9mKGNsaWVudF9hZGRyKTsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBpbnQgY2ZkID0gYWNjZXB0KGZkc1swXS5mZCwgKHN0cnVjdCBzb2NrYWRkciopJmNsaWVudF9hZGRyLCAmbGVuKTsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBwcmludGYoIuaWsOeahOWuouaIt+err+i/m+adpeS6hlxuIik7Ci8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgY2hhciBjbGllbnRfaXBbMTZdOwovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgIGluZXRfbnRvcChBRl9JTkVULCAmY2xpZW50X2FkZHIuc2luX2FkZHIuc19hZGRyLCBjbGllbnRfaXAsIHNpemVvZihjbGllbnRfaXApKTsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBjbGllbnRfcG9ydCA9IG50b2hzKGNsaWVudF9hZGRyLnNpbl9wb3J0KTsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBwcmludGYoIuWuouaIt+err0lQ77yaJXNcbuerr+WPo++8miVkXG4iLCBjbGllbnRfaXAsIGNsaWVudF9wb3J0KTsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBpZiAoLTEgPT0gY2ZkKSB7Ci8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFSU5UUiA9PSBlcnJubyApIHsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgICAgICB9Ci8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnJvcigiYWNjZXB0Iik7Ci8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoLTEpOwovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgIH0KLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICAvLyDlsIbmlrDnmoTmlofku7bmj4/ov7DnrKbliqDlhaXliLDpm4blkIjkuK0KLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICAvLyBhY2NlcHTlh73mlbDov5Tlm57nmoTmlofku7bmj4/ov7DnrKYKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwMjQ7IGkrKykKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICB7Ci8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZHNbaV0uZmQgPT0gLTEpIHsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkc1tpXS5mZCA9IGNmZDsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkc1tpXS5ldmVudHMgPSBQT0xMSU47Ci8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIAovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgICAgICB9Ci8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgfQovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCAxMDI0OyBpKyspCi8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICB7Ci8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgLy8g5Yik5pat6K+l5paH5Lu25o+P6L+w56ym5piv5ZCm5Li6MQovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgIGlmIChmZHNbaV0ucmV2ZW50cyAmIFBPTExJTikgewovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAvLyDor7TmmI7ov5nkuKrmlofku7bmj4/ov7DnrKblr7nlupTnmoTnvJPlhrLljLrmnaXmlbDmja7kuoYKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBidWZ3YWVocnN0ZWR5cnRlZHNbMTAyNF0gPSB7MH07Ci8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSByZWFkKGZkc1tpXS5mZCwgYnVmd2FlaHJzdGVkeXJ0ZWRzLCA1KTsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0xID09IGxlbikgewovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVycm9yKCJyZWFkIik7Ci8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgwID09IGxlbikgewovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCLlrqLmiLfnq6/mlq3lvIDov57mjqXkuoZcbiIpOwovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoZmRzW2ldLmZkKTsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkc1tpXS5mZCA9IC0xOwovLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA+IDApIHsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigi6K+75Y+W5Yiw5pWw5o2u77yaJXNcbiIsIGJ1ZndhZWhyc3RlZHlydGVkcyk7Ci8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZShmZHNbaV0uZmQsIGJ1ZndhZWhyc3RlZHlydGVkcywgc3RybGVuKGJ1ZndhZWhyc3RlZHlydGVkcykrMSk7Ci8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgIH0KLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICB9Ci8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAKLy8gLy8gLy8gLy8gICAgICAgICB9CgovLyAvLyAvLyAvLyAgICAgfQovLyAvLyAvLyAvLyAgICAgY2xvc2UobGZkKTsKLy8gLy8gLy8gLy8gICAgIHJldHVybiAwOwovLyAvLyAvLyAvLyB9CgoKLy8gLy8gLy8gLy8gLy8gICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gY2xpYWRkcjsKLy8gLy8gLy8gLy8gLy8gICAgICAgICBpbnQgbGVuID0gc2l6ZW9mKGNsaWFkZHIpOwovLyAvLyAvLyAvLyAvLyAgICAgICAgIC8vIOeUseS6juWtkOi/m+eoi+eahOWbnuaUtuS6p+eUn+S6huS4gOS4qui9r+S4reaWre+8jOWvvOiHtGFjY3BldOWHuumUme+8jOmUmeivr+WPt+S4ukVJTlRSCi8vIC8vIC8vIC8vIC8vICAgICAgICAgaW50IGNmZCA9IGFjY2VwdChsZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZjbGlhZGRyLCAmbGVuKTsKLy8gLy8gLy8gLy8gLy8gCQlpZiAoLTEgPT0gY2ZkKSB7Ci8vIC8vIC8vIC8vIC8vICAgICAgICAgICAgIGlmIChFSU5UUiA9PSBlcnJubyApIHsKLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOwovLyAvLyAvLyAvLyAvLyAgICAgICAgICAgICB9Ci8vIC8vIC8vIC8vIC8vICAgICAgICAJCXBlcnJvcigiYWNjZXB0Iik7Ci8vIC8vIC8vIC8vIC8vICAgICAgICAgCWV4aXQoLTEpOwovLyAvLyAvLyAvLyAvLyAgICAgCX0KLy8gLy8gLy8gLy8gLy8gICAgICAgICAvLyDmr4/kuIDkuKrov57mjqXov5vmnaXvvIzlsLHliJvlu7rlh7rkuIDkuKrlrZDov5vnqIvmnaXlkozlrqLmiLfnq6/ov5vooYzpgJrkv6EKLy8gLy8gLy8gLy8gLy8gICAgICAgICBwaWRfdCBwaWQgPSBmb3JrKCk7Ci8vIC8vIC8vIC8vIC8vICAgICAgICAgaWYgKDAgPT0gcGlkKSB7Ci8vIC8vIC8vIC8vIC8vICAgICAgICAgICAgIC8vIOWtkOi/m+eoiwovLyAvLyAvLyAvLyAvLyAgICAgICAgICAgICAvLyDojrflj5blrqLmiLfnq6/kv6Hmga8KLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgY2hhciBjbGllbnRfaXBbMTZdOwovLyAvLyAvLyAvLyAvLyAJCQlpbmV0X250b3AoQUZfSU5FVCwgJmNsaWFkZHIuc2luX2FkZHIuc19hZGRyLCBjbGllbnRfaXAsIHNpemVvZihjbGllbnRfaXApKTsKLy8gLy8gLy8gLy8gLy8gCQkJdW5zaWduZWQgc2hvcnQgY2xpZW50X3BvcnQgPSBudG9ocyhjbGlhZGRyLnNpbl9wb3J0KTsKLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgcHJpbnRmKCLlrqLmiLfnq69JUO+8miVzXG7lrqLmiLfnq69QT1JU77yaJWRcbiIsIGNsaWVudF9pcCwgY2xpZW50X3BvcnQpOwovLyAvLyAvLyAvLyAvLyAgICAgICAgICAgICAvLyDmjqXmlLblrqLmiLfnq6/lj5HmnaXnmoTmlbDmja4KLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgY2hhciByZWN2X2J1ZndhZWhyc3RlZHlydGVkc1sxMDI0XTsKLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgd2hpbGUoMSkgewogICAgICAgICAgICAgICAgCi8vIC8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICBpbnQgbGVuID0gcmVjdihjZmQsIHJlY3ZfYnVmd2FlaHJzdGVkeXJ0ZWRzLCBzaXplb2YocmVjdl9idWZ3YWVocnN0ZWR5cnRlZHMpLCAwKTsKLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgIGlmICgtMSA9PSBsZW4pIHsKLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBwZXJyb3IoInJlYWQiKTsKLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuID4gMCkgewovLyAvLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgIHByaW50Zigi5o6l5pS25Yiw5pWw5o2u77yaJXNcbiIsIHJlY3ZfYnVmd2FlaHJzdGVkeXJ0ZWRzKTsKLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoMCA9PSBsZW4pIHsKLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBwcmludGYoIuWuouaIt+err+aWreW8gOi/nuaOpVxuIik7Ci8vIC8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci8vIC8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICB9Ci8vIC8vIC8vIC8vIC8vICAgICAgICAgICAgICAgICAvLyDlr7nlrqLmiLfnq6/kvKDov5vmnaXnmoTmlbDmja7ov5vooYzlsI/lhpnovazlpKflhpnnmoTovazmjaIKLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICByZWN2X2J1ZndhZWhyc3RlZHlydGVkc1tpXSA9IHRvdXBwZXIocmVjdl9idWZ3YWVocnN0ZWR5cnRlZHNbaV0pOwovLyAvLyAvLyAvLyAvLyAgICAgICAgICAgICAgICAgfQoKLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgIC8vIHNpemXliqAx5piv5Li65LqG5o6l5pS25a2X56ym5Liy55qE57uT5p2f56ymXDAKLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgICAgIHdyaXRlKGNmZCwgcmVjdl9idWZ3YWVocnN0ZWR5cnRlZHMsIHN0cmxlbihyZWN2X2J1ZndhZWhyc3RlZHlydGVkcykrMSk7Ci8vIC8vIC8vIC8vIC8vICAgICAgICAgICAgIH0KLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgY2xvc2UoY2ZkKTsKLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgcHJpbnRmKCLlrZDov5vnqIvnu5PmnZ9cbiIpOwovLyAvLyAvLyAvLyAvLyAgICAgICAgICAgICBleGl0KDApOwovLyAvLyAvLyAvLyAvLyAgICAgICAgIH0KLy8gLy8gLy8gLy8gLy8gICAgIH0KLy8gLy8gLy8gLy8gLy8gCWNsb3NlKGxmZCk7CgovLyAvLyAvLyAvLyAvLyAgICAgcmV0dXJuIDA7Ci8vIC8vIC8vIC8vIC8vIH0gICAgCi8vIC8vIC8vIC8vIC8vIC8vICAgICAvLyBUQ1DpgJrkv6HnmoTmnI3liqHnq68KLy8gLy8gLy8gLy8gLy8gLy8gICAgIC8vIOWIm+W7uueUqOS6juebkeWQrOeahOWll+aOpeWtlwovLyAvLyAvLyAvLyAvLyAvLyAgICAgaW50IGxmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICBpZiAoLTEgPT0gbGZkKSB7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICAgICAgcGVycm9yKCJzb2NrZXQiKTsKLy8gLy8gLy8gLy8gLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gLy8gLy8gLy8gICAgIH0KLy8gLy8gLy8gLy8gLy8gLy8gICAgIC8vIOe7keWummJpbmQKLy8gLy8gLy8gLy8gLy8gLy8gICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkcjsKLy8gLy8gLy8gLy8gLy8gLy8gICAgIHNhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwovLyAvLyAvLyAvLyAvLyAvLyAgICAgaW5ldF9wdG9uKEFGX0lORVQsICIxOTIuMTY4LjQzLjE5MyIsICZzYWRkci5zaW5fYWRkci5zX2FkZHIpOwovLyAvLyAvLyAvLyAvLyAvLyAgICAgc2FkZHIuc2luX3BvcnQgPSBodG9ucyg5OTk5KTsKLy8gLy8gLy8gLy8gLy8gLy8gICAgIGludCByZXQgPSBiaW5kKGxmZCwgKHN0cnVjdCBzb2NrYWRkciopJnNhZGRyLCBzaXplb2Yoc2FkZHIpKTsKLy8gLy8gLy8gLy8gLy8gLy8gICAgIGlmICgtMSA9PSByZXQpIHsKLy8gLy8gLy8gLy8gLy8gLy8gICAgICAgICBwZXJyb3IoImJpbmQiKTsKLy8gLy8gLy8gLy8gLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gLy8gLy8gLy8gICAgIH0KLy8gLy8gLy8gLy8gLy8gLy8gICAgIHJldCA9IGxpc3RlbihsZmQsIDgpOwovLyAvLyAvLyAvLyAvLyAvLyAgICAgaWYgKC0xID09IHJldCkgewovLyAvLyAvLyAvLyAvLyAvLyAgICAgICAgIHBlcnJvcigibGlzdGVuIik7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICAgICAgZXhpdCgtMSk7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICB9Ci8vIC8vIC8vIC8vIC8vIC8vICAgICBwcmludGYoIuetieW+heWuouaIt+err+i/nuaOpS4uLlxuIik7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICAvLyDmjqXmlLblrqLmiLfnq6/ov57mjqUKLy8gLy8gLy8gLy8gLy8gLy8gICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBjYWRkcjsKLy8gLy8gLy8gLy8gLy8gLy8gICAgIHNvY2tsZW5fdCBsZW4gPSBzaXplb2YoY2FkZHIpOwovLyAvLyAvLyAvLyAvLyAvLyAgICAgaW50IGNmZCA9IGFjY2VwdChsZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZjYWRkciwgJmxlbik7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICBpZiAoLTEgPT0gY2ZkKSB7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICAgICAgcGVycm9yKCJhY2NlcHQiKTsKLy8gLy8gLy8gLy8gLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gLy8gLy8gLy8gICAgIH0KLy8gLy8gLy8gLy8gLy8gLy8gICAgIC8vIOi+k+WHuuWuouaIt+err+S/oeaBrwovLyAvLyAvLyAvLyAvLyAvLyAgICAgY2hhciBjbGllbnRfaXBbMTZdOwovLyAvLyAvLyAvLyAvLyAvLyAgICAgaW5ldF9udG9wKEFGX0lORVQsICZjYWRkci5zaW5fYWRkci5zX2FkZHIsIGNsaWVudF9pcCwgc2l6ZW9mKGNsaWVudF9pcCkpOwovLyAvLyAvLyAvLyAvLyAvLyAgICAgdW5zaWduZWQgc2hvcnQgY2xpZW50X3BvcnQgPSBudG9ocyhjYWRkci5zaW5fcG9ydCk7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICBwcmludGYoIuWuouaIt+err0lQ77yaJXNcbuerr+WPo++8miVkXG4iLCBjbGllbnRfaXAsIGNsaWVudF9wb3J0KTsKLy8gLy8gLy8gLy8gLy8gLy8gICAgIC8vIOW8gOWni+mAmuS/oQovLyAvLyAvLyAvLyAvLyAvLyAgICAgY2hhciByZWN2X2J1ZndhZWhyc3RlZHlydGVkc1sxMDI0XSA9IHswfTsKLy8gLy8gLy8gLy8gLy8gLy8gICAgIHdoaWxlKDEpIHsKLy8gLy8gLy8gLy8gLy8gLy8gICAgICAgICAvLyDojrflj5blrqLmiLfnq6/nmoTmtojmga8KLy8gLy8gLy8gLy8gLy8gLy8gICAgICAgICBsZW4gPSByZWFkKGNmZCwgcmVjdl9idWZ3YWVocnN0ZWR5cnRlZHMsIHNpemVvZihyZWN2X2J1ZndhZWhyc3RlZHlydGVkcykpOwovLyAvLyAvLyAvLyAvLyAvLyAgICAgICAgIGlmICgtMSA9PSBsZW4pIHsKLy8gLy8gLy8gLy8gLy8gLy8gICAgICAgICAgICAgcGVycm9yKCJyZWFkIik7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICAgICAgICAgIGV4aXQoLTEpOwovLyAvLyAvLyAvLyAvLyAvLyAgICAgICAgIH0KLy8gLy8gLy8gLy8gLy8gLy8gICAgICAgICBlbHNlIGlmIChsZW4gPiAwKSB7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICAgICAgICAgIHByaW50Zigi5pS25Yiw5a6i5oi356uv55qE5raI5oGv77yaICVzXG4iLCByZWN2X2J1ZndhZWhyc3RlZHlydGVkcyk7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICAgICAgfSAgIAovLyAvLyAvLyAvLyAvLyAvLyAgICAgICAgIGVsc2UgaWYgKDAgPT0gbGVuKSB7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICAgICAgICAgIC8vIOihqOekuuWuouaIt+err+aWreW8gOi/nuaOpQovLyAvLyAvLyAvLyAvLyAvLyAgICAgICAgICAgICBwcmludGYoIuWuouaIt+err+aWreW8gOi/nuaOpVxuIik7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICAgICAgICAgIGJyZWFrOwovLyAvLyAvLyAvLyAvLyAvLyAgICAgICAgIH0KCi8vIC8vIC8vIC8vIC8vIC8vICAgICAgICAgY2hhciogZGF0YSAgPSAi5oiR5piv5pyN5Yqh5ZmoIjsKLy8gLy8gLy8gLy8gLy8gLy8gICAgICAgICAvLyDnu5nlrqLmiLfnq6/lj5HpgIHmtojmga8KLy8gLy8gLy8gLy8gLy8gLy8gICAgICAgICB3cml0ZShjZmQsIGRhdGEsIHN0cmxlbihkYXRhKSk7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICB9Ci8vIC8vIC8vIC8vIC8vIC8vICAgICAvLyDlhbPpl63mlofku7bmj4/ov7DnrKYKLy8gLy8gLy8gLy8gLy8gLy8gICAgIGNsb3NlKGxmZCk7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICBjbG9zZShjZmQpOwoKLy8gLy8gLy8gLy8gLy8gLy8gICAgIHJldHVybiAwOwovLyAvLyAvLyAvLyAvLyAvLyB9Ci8vIC8vIC8vIC8vIC8vIC8vICAgICAvLyAvLyDorrLlrZfnrKbkuLJJUOWcsOWdgOi9rOaNouS4umluZXTlnLDlnYAgCi8vIC8vIC8vIC8vIC8vIC8vICAgICAvLyAvLyDmlrDlu7rkuIDkuKpJUOWtl+espuS4su+8jOeCueWIhuWNgei/m+WItgovLyAvLyAvLyAvLyAvLyAvLyAgICAgLy8gY2hhciBidWZ3YWVocnN0ZWR5cnRlZHNbXSA9ICIxOTIuMTY4LjEuNCI7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICAvLyB1bnNpZ25lZCBpbnQgbnVtID0gMDsKLy8gLy8gLy8gLy8gLy8gLy8gICAgIC8vIC8vIOi9rOaNouS4uue9kee7nOWtl+iKguW6jwovLyAvLyAvLyAvLyAvLyAvLyAgICAgLy8gaW5ldF9wdG9uKEFGX0lORVQsIGJ1ZndhZWhyc3RlZHlydGVkcywgJm51bSk7Ci8vIC8vIC8vIC8vIC8vIC8vICAgICAvLyB1bnNpZ25lZCBjaGFyKiBwID0gKHVuc2lnbmVkIGNoYXIqKSZudW07Ci8vIC8vIC8vIC8vIC8vIC8vICAgICAvLyBwcmludGYoIiVkICVkICVkICVkXG4iLCAqcCwgKihwKzEpLCAqKHArMiksICoocCszKSk7CgovLyAvLyAvLyAvLyAvLyAgICAgLy8gcHJpbnRmKCI8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4iKTsKCi8vIC8vIC8vIC8vIC8vICAgICAvLyAvLyDorrLnvZHnu5zlrZfoioLluo/ovazmjaLmiJBJUOWtl+espuS4sgovLyAvLyAvLyAvLyAvLyAgICAgLy8gLy8gM+S4qi7vvIzmr4/kuKrkvY3nva7mnIDplb/kuLoz5L2N5pWw77yMMyo0KzMrMe+8jOacgOWQjui/meS4qjHmmK9cMAovLyAvLyAvLyAvLyAvLyAgICAgLy8gY2hhciBpcFsxNl0gPSAiIjsKLy8gLy8gLy8gLy8gLy8gICAgIC8vIGluZXRfbnRvcChBRl9JTkVULCAmbnVtLCBpcCwgMTYpOwovLyAvLyAvLyAvLyAvLyAgICAgLy8gcHJpbnRmKCIlc1xuIiwgaXApOwoKCgovLyAvLyAvLyAvLyAvLyAgICAgLy8gdW5pb24gewovLyAvLyAvLyAvLyAvLyAgICAgLy8gICAgIHNob3J0IHZhbHVlOwovLyAvLyAvLyAvLyAvLyAgICAgLy8gICAgIGNoYXIgYnl0ZXNbc2l6ZW9mKHNob3J0KV07Ci8vIC8vIC8vIC8vIC8vICAgICAvLyB9IHRlc3Q7Ci8vIC8vIC8vIC8vIC8vICAgICAvLyB0ZXN0LnZhbHVlID0gMHgwMTAyOwovLyAvLyAvLyAvLyAvLyAgICAgLy8gaWYgKHRlc3QuYnl0ZXNbMF0gPT0gMSAmJiB0ZXN0LmJ5dGVzWzFdID09IDIpIAovLyAvLyAvLyAvLyAvLyAgICAgLy8gICAgIHByaW50Zigi5b2T5YmN5Li75py65a2X6IqC5bqP77ya5aSn56uvXG4iKTsKLy8gLy8gLy8gLy8gLy8gICAgIC8vIGVsc2UgaWYgKHRlc3QuYnl0ZXNbMF0gPT0gMiAmJiB0ZXN0LmJ5dGVzWzFdID09IDEpIAovLyAvLyAvLyAvLyAvLyAgICAgLy8gICAgIHByaW50Zigi5b2T5YmN5Li75py65a2X6IqC5bqP77ya5bCP56uvXG4iKTsKCi8vIC8vIC8vIC8vICAgICAvLyDnvZHnu5zlrZfoioLluo/ljbPlpKfnq6/luo8KLy8gLy8gLy8gLy8gICAgIC8vIGhvc3QgdG8gbmV0d29yayBzaG9ydAovLyAvLyAvLyAvLyAgICAgLy8g5Li75py65a2X6IqC5bqP6L2s5o2i5oiQ572R57uc5a2X6IqC5bqPCi8vIC8vIC8vIC8vICAgICAvLyDnlKjkuo7ovazmjaLnq6/lj6MgMTZiaXQgc2hvcnQgaW50Ci8vIC8vIC8vIC8vICAgICAvLyBodG9ucwovLyAvLyAvLyAvLyAgICAgLy8gbnRvaHMKLy8gLy8gLy8gLy8gICAgIC8vIOeUqOS6jui9rOaNoklQIDMyYml0IGludAovLyAvLyAvLyAvLyAgICAgLy8gaG9zdCB0byBuZXR3b3JrIGxvbmcKLy8gLy8gLy8gLy8gICAgIC8vIGh0b25sCi8vIC8vIC8vIC8vICAgICAvLyBudG9obAoKLy8gLy8gLy8gLy8gICAgIC8vIHVuc2lnbmVkIHNob3J0IGggPSAweDAxMDI7Ci8vIC8vIC8vIC8vICAgICAvLyBwcmludGYoIiV4XG4iLCBoKTsKLy8gLy8gLy8gLy8gICAgIC8vIHVuc2lnbmVkIHNob3J0IG4gPSBodG9ucyhoKTsKLy8gLy8gLy8gLy8gICAgIC8vIHByaW50ZigiJXhcbiIsIG4pOwoKLy8gLy8gLy8gLy8gICAgIC8vIHByaW50ZigiPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuIik7CgovLyAvLyAvLyAvLyAgICAgLy8gdW5zaWduZWQgY2hhciBidWZ3YWVocnN0ZWR5cnRlZHNbNF0gPSB7MTkyLCAxNjgsIDEsIDEwMH07Ci8vIC8vIC8vIC8vICAgICAvLyBwcmludGYoIiVkXG4iLCAqYnVmd2FlaHJzdGVkeXJ0ZWRzKTsKLy8gLy8gLy8gLy8gICAgIC8vIHByaW50ZigiJWRcbiIsICooYnVmd2FlaHJzdGVkeXJ0ZWRzKzEpKTsKLy8gLy8gLy8gLy8gICAgIC8vIHByaW50ZigiJWRcbiIsICooYnVmd2FlaHJzdGVkeXJ0ZWRzKzIpKTsKLy8gLy8gLy8gLy8gICAgIC8vIHByaW50ZigiJWRcbiIsICooYnVmd2FlaHJzdGVkeXJ0ZWRzKzMpKTsKLy8gLy8gLy8gLy8gICAgIC8vIC8vIDTkuKpjaGFy55u45b2T5LqO5LiA5LiqaW5077yM6YO95pivNOWtl+iKggovLyAvLyAvLyAvLyAgICAgLy8gLy8g5oqK6L+Z5LiA5Z2X5YaF5a2Y6L2s5o2i5oiQaW505oyH6ZKI77yM54S25ZCO5Y+W5YC8Ci8vIC8vIC8vIC8vICAgICAvLyBpbnQgbnVtID0gKihpbnQgKilidWZ3YWVocnN0ZWR5cnRlZHM7Ci8vIC8vIC8vIC8vICAgICAvLyBpbnQgcmVzID0gaHRvbmwobnVtKTsKLy8gLy8gLy8gLy8gICAgIC8vIHVuc2lnbmVkIGNoYXIqIHAgPSAoY2hhciopJnJlczsKLy8gLy8gLy8gLy8gICAgIC8vIHByaW50ZigiJWRcbiIsICpwKTsKLy8gLy8gLy8gLy8gICAgIC8vIHByaW50ZigiJWRcbiIsICoocCsxKSk7Ci8vIC8vIC8vIC8vICAgICAvLyBwcmludGYoIiVkXG4iLCAqKHArMikpOwovLyAvLyAvLyAvLyAgICAgLy8gcHJpbnRmKCIlZFxuIiwgKihwKzMpKTsKCi8vIC8vIC8vIC8vIC8vICAgICBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4LCBOVUxMKTsKLy8gLy8gLy8gLy8gLy8gICAgIHB0aHJlYWRfY29uZF9pbml0KCZjb25kLCBOVUxMKTsKLy8gLy8gLy8gLy8gLy8gICAgIHNlbV9pbml0KCZwc2VtLCAwLCA4KTsKLy8gLy8gLy8gLy8gLy8gICAgIHNlbV9pbml0KCZjc2VtLCAwLCAwKTsKLy8gLy8gLy8gLy8gLy8gICAgIHB0aHJlYWRfdCBwdGlkc1s1XSwgY3RpZHNbNV07Ci8vIC8vIC8vIC8vIC8vICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDU7IGkrKykKLy8gLy8gLy8gLy8gLy8gICAgIHsKLy8gLy8gLy8gLy8gLy8gICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmcHRpZHNbaV0sIE5VTEwsIHByb2R1Y2VyLCBOVUxMKTsKLy8gLy8gLy8gLy8gLy8gICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmY3RpZHNbaV0sIE5VTEwsIGNvbnN1bWVyLCBOVUxMKTsKICAgICAgICAKLy8gLy8gLy8gLy8gLy8gICAgIH0KLy8gLy8gLy8gLy8gLy8gICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNTsgaSsrKQovLyAvLyAvLyAvLyAvLyAgICAgewovLyAvLyAvLyAvLyAvLyAgICAgICAgIHB0aHJlYWRfam9pbihwdGlkc1tpXSwgTlVMTCk7Ci8vIC8vIC8vIC8vIC8vICAgICAgICAgcHRocmVhZF9qb2luKGN0aWRzW2ldLCBOVUxMKTsKICAgICAgICAKLy8gLy8gLy8gLy8gLy8gICAgIH0KLy8gLy8gLy8gLy8gLy8gICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXgpOwovLyAvLyAvLyAvLyAvLyAgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJmNvbmQpOwovLyAvLyAvLyAvLyAvLyAgICAgcHRocmVhZF9leGl0KE5VTEwpOwoKLy8gLy8gLy8gLy8gLy8gICAgIHJldHVybiAwOwovLyAvLyAvLyAvLyAvLyB9Ci8vIC8vIC8vIC8vIC8vIC8vIHB0aHJlYWRfYXR0cl90IGF0dHI7Ci8vIC8vIC8vIC8vIC8vIC8vIC8vIOWIneWni+WMluWxnuaAp+WPmOmHjwovLyAvLyAvLyAvLyAvLyAvLyBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7Ci8vIC8vIC8vIC8vIC8vIC8vIC8vIOiuvue9ruWxnuaApwovLyAvLyAvLyAvLyAvLyAvLyBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOwovLyAvLyAvLyAvLyAvLyAvLyAvLyDkvb/nlKjlpJrnur/nqIvlrp7njrDkubDnpajnmoTmoYjkvosKLy8gLy8gLy8gLy8gLy8gLy8gLy8gM+S4queql+WPo++8jOWNljEwMOW8oOelqAovLyAvLyAvLyAvLyAvLyAvLyAvLyDliJvlu7rkuInkuKrlrZflkrjkuqgKCi8vIC8vIC8vIC8vIC8vIC8vIC8vIOiOt+WPlue6v+eoi+aagueahOWkp+WwjwovLyAvLyAvLyAvLyAvLyAvLyAvLyDnlJ/kuqfogIXmtojotLnogIXmqKHlnosKLy8gLy8gLy8gLy8gLy8gLy8g5Yib5bu6NeS4queUn+S6p+iAhee6v+eoiyw15Liq5raI6LS56ICF57q/56iLCi8vIC8vIC8vIC8vIC8vIHB0aHJlYWRfdCBwdGlkc1s1XSwgY3RpZHNbNV07Ci8vIC8vIC8vIC8vIC8vIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLy8gLy8gLy8gLy8gLy8gewovLyAvLyAvLyAvLyAvLyAgICAgcHRocmVhZF9jcmVhdGUoJnB0aWRzW2ldKQovLyAvLyAvLyAvLyAvLyB9CgovLyAvLyAvLyAvLyAvLyBzaXplX3Qgc2l6ZTsKLy8gLy8gLy8gLy8gcHRocmVhZF9hdHRyX2dldHN0YWNrc2l6ZSgmYXR0ciwmc2l6ZSk7Ci8vIC8vIC8vIC8vIHByaW50Zigi56uZ5aSn5bCP77ya4oCmJWxkXG4iLHNpemUpOwovLyAvLyAvLyAvLyBwdGhyZWFkX3QgIHRpZDEgLHRpZDIsdGlkMzsKLy8gLy8gLy8gLy8gLy8g5Yib5bu65LiJ5Liq5YaZ57q/56iL77yMNeS4quW6pue6v+eoiy8vIOWIm+W7uuS4gOS4quWtkOe6v+eoiwovLyAvLyAvLyAvLyBpbnQgbnVtID0gNTsKLy8gLy8gLy8gLy8gcHRocmVhZF9tdXRleF9pbml0KCZhc2Rhc2Rhc2Rhc2Rhc2RhcyxOVUxMKTsKLy8gLy8gLy8gLy8gcHRocmVhZF90ICB3c3RpZFszXSxydGlkc1s1XTsKLy8gLy8gLy8gLy8gZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspCi8vIC8vIC8vIC8vIHtpbnQgcmV0MiA9IHB0aHJlYWRfY3JlYXRlKCZydGlkc1tpXSxOVUxMLHNpZ19oYW5kbGVyMSwodm9pZCopJm51bSk7Ci8vIC8vIC8vIC8vICAgICAvKiBjb2RlICovCi8vIC8vIC8vIC8vIH0KLy8gLy8gLy8gLy8gZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCi8vIC8vIC8vIC8vIHtpbnQgcmV0MiA9IHB0aHJlYWRfY3JlYXRlKCZ3c3RpZFtpXSxOVUxMLHNpZ19oYW5kbGVyMTIyMzIsKHZvaWQqKSZudW0pOwovLyAvLyAvLyAvLyAgICAgLyogY29kZSAqLwovLyAvLyAvLyAvLyB9Ci8vIC8vIC8vIC8vIC8vIOiuvue9rue6v+eoi+WIhuemuwovLyAvLyAvLyAvLyBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykKLy8gLy8gLy8gLy8ge2ludCByZXQyID0gcHRocmVhZF9kZXRhY2gocnRpZHNbaV0pOwovLyAvLyAvLyAvLyAgICAgLyogY29kZSAqLwovLyAvLyAvLyAvLyB9Ci8vIC8vIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQovLyAvLyAvLyB7aW50IHJldDIgPSBwdGhyZWFkX2RldGFjaCh3c3RpZFtpXSk7Ci8vIC8vIC8vICAgICAvKiBjb2RlICovCi8vIC8vIC8vIH0KLy8gLy8gLy8gcHRocmVhZF9leGl0KE5VTEwpOwovLyAvLyAvLyBwcmludGYoIuS9oOiDveaJp+ihjOaIke+8n++8n++8n++8n1xuIik7Ci8vIC8vIC8vIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmYXNkYXNkYXNkYXNkYXNkYXMpOwovLyAvLyAvLyByZXR1cm4gMDt9Ci8vIC8vIC8vIC8v6K+75YaZ6ZSBCi8vIC8vIC8vIC8vIC8vIOivu+eahOaTjeS9nOmcgOimgeavlOi+g+Wkmu+8jOWboOS4uuivu+aTjeS9nOayoeW/heimgeiiq+mYu+WhngovLyAvLyAvLyAvLyAvLyByd2xvY2sKCgovLyAvLyAvLyAvLyAvLyDkupLmlqXph48KLy8gLy8gLy8gLy8gLy8gICAgcHRocmVhZF9tdXRleF90IG11dGV4MTsgCi8vIC8vIC8vIC8vIC8vICAgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDI7IAovLyAvLyAvLyAvLyBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4MSxOVUxMKTsKLy8gLy8gLy8gLy8gcHRocmVhZF9tdXRleF9pbml0KCZtdXRleDIsTlVMTCk7Ci8vIC8vIC8vIC8vIGludCByZXQyID0gcHRocmVhZF9jcmVhdGUoJnRpZDEsTlVMTCxzaWdfaGFuZGxlcjEsKHZvaWQqKSZudW0pOwovLyAvLyAvLyAvLyBpbnQgcmUzdCA9IHB0aHJlYWRfY3JlYXRlKCZ0aWQyLE5VTEwsc2lnX2hhbmRsZXIyMiwodm9pZCopJm51bSk7ICAKLy8gLy8gLy8gLy8gLy8gaW50IHJlMnQgPSBwdGhyZWFkX2NyZWF0ZSgmdGlkMyxOVUxMLHNpZ19oYW5kbGVyLCh2b2lkKikmbnVtKTsKLy8gLy8gLy8gLy8gLy8g5Zue5pS25a2Q57q/56iL6LWE5rqQCi8vIC8vIC8vIC8vIHB0aHJlYWRfam9pbih0aWQxLE5VTEwpOwovLyAvLyAvLyAvLyBwdGhyZWFkX2pvaW4odGlkMixOVUxMKTsKLy8gLy8gLy8gLy8gLy8gcHRocmVhZF9qb2luKHRpZDMsTlVMTCk7Ci8vIC8vIC8vIC8vIC8vIOiuvue9rue6v+eoi+WIhuemuwovLyAvLyAvLyAvLyAvLyBwdGhyZWFkX2RldGFjaCh0aWQxKTsKLy8gLy8gLy8gLy8gLy8gcHRocmVhZF9kZXRhY2godGlkMik7Ci8vIC8vIC8vIC8vIC8vIHB0aHJlYWRfZGV0YWNoKHRpZDMpOwovLyAvLyAvLyAvLyAvLyDmjqjlh7rkuLvnur/nqIsKLy8gLy8gLy8gLy8gcHRocmVhZF9leGl0KE5VTEwpOwovLyAvLyAvLyAvLyAvLyDph4rmlL7kupLmlqXph48KLy8gLy8gLy8gLy8gcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleDEpOwovLyAvLyAvLyAvLyBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm11dGV4Mik7Ci8vIC8vIC8vIC8vIC8vIGlmKDAhPXJldCl7Ci8vIC8vIC8vIC8vIC8vICAgICBjaGFyKiBlcnJzdHIgPSBzdHJlcnJvcihyZXQpOwovLyAvLyAvLyAvLyAvLyAgICAgcHJpbnRmKCJlcnJvcjogJXNcbiIsIGVycnN0cik7Ci8vIC8vIC8vIC8vIC8vIH0KLy8gLy8gLy8gLy8gLy8gLy8gcHRocmVhZF9jYW5jZWwodGlkKTsKCi8vIC8vIC8vIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQovLyAvLyAvLyAvLyB7cHJpbnRmKCIlZFxuIixpKTsKLy8gLy8gLy8gLy8gICAgIC8qIGNvZGUgKi8KLy8gLy8gLy8gLy8gfQovLyAvLyAvLyAvLyBwcmludGYoIuWtkOe6v+eoi2lkJWxk5Li757q/56iLSUTvvJolbGRcbiIsIHRpZCxwdGhyZWFkX3NlbGYoKSk7Ci8vIC8vIC8vIC8vIC8vIOaYvuaIkOeGn+aApwoKLy8gLy8gLy8gLy8gLy8gcHRocmVhZF9hdGZvcmsKLy8gLy8gLy8gLy8gLy8g5Zue6aaW57Sr56aB5Z+OCi8vIC8vIC8vIC8vIC8vIGludCogYXNkYXNkYXNkIDsKLy8gLy8gLy8gLy8gLy8gaW50IGNhb3Vzb2QgPSBwdGhyZWFkX2pvaW4odGlkLCh2b2lkICoqKSZhc2Rhc2Rhc2QpOwovLyAvLyAvLyAvLyAvLyBpZihyZXQhPTApewovLyAvLyAvLyAvLyAvLyAgICAgY2hhciogZXJyc3RyID0gc3RyZXJyb3IocmV0KTsKLy8gLy8gLy8gLy8gLy8gICAgIHByaW50ZigiZXJyb3I6ICVzIixlcnJzdHIpOwovLyAvLyAvLyAvLyAvLyB9ICAgCi8vIC8vIC8vIC8vIC8vIHByaW50Zigi57Sr56aB5Z+O55qE6L+U5Zue5YC8JWRcbiIsKmFzZGFzZGFzZCk7Ci8vIC8vIC8vIC8vIC8vIHByaW50Zigi5a2Q57q/56iL6LWE5rqQ5Zue5pS25oiQ5YqfXG4iKTsKLy8gLy8gLy8gLy8gLy8gc2xlZXAoNSk7Ci8vIC8vIC8vIC8vIC8vIOe7iOatouS4gOS4quWtkOe6v+eoiwovLyAvLyAvLyAvLyAvLyBwdGhyZWFkLWV4aXQKLy8gLy8gLy8gLy8gLy8gICAgIOmcgOimgeS8oOmAkuS4gOS4quaMh+mSiOS9nOS4uui/lOWbnuWAvAovLyAvLyAvLyAvLyAvLyAgICAg5Y+v5Lul5YaNcHRocmVhZF9qb2lu5Lit6I635Y+W5YiwCi8vIC8vIC8vIC8vIC8vIOe7iOatouS4gOS4quWOv+Wfju+8jOWcqOWTquS4queOsOaIkOS4reiwg+eUqO+8jOWwsee7iOatouWTquS4queOsOaIkAovLyAvLyAvLyAvLyAvLyDorqnkuLvnur/nqIvpgIDlh7oKLy8gLy8gLy8gLy8gLy8g5LiN5Lya5b2x5ZON5YW25LuW5Y6/5Z+OCgovLyAvLyAvLyAvLyAvLyDlrZDnur/nqIvnu5PmnZ/mmK/lr7nlupTnmoTotYTmupDlsLHkuI3pnIDopoHkuLvnur/nqIvljrvph4rmlL7kuoYKLy8gLy8gLy8gLy8gLy8gcHRocmVhZF9kZXRhY2godGlkKTsKLy8gLy8gLy8gLy8gLy8gcHRocmVhZF9jYW5jZWzlh73mlbAKLy8gLy8gLy8gLy8gLy8gICAgIOe7iOatoueOsOaIkO+8iOWPlua2iOeOsO+8iQovLyAvLyAvLyAvLyAvLyAgICAg5Y+W5raI5Liq546w5oiQ77yM56eN5qSN5p+Q5Liq5Y6/5Z+O77yM5L2G5bm25LiN5piv56uL6ams57uI5q2iCi8vIC8vIC8vIC8vIC8vICAgICDnrYnliLDnjrDmiJDmiafooYzliLDkuIDkuKrljrvlsI/lupfvvIznjrDmiJDmiY3kvJrnu4jmraIKLy8gLy8gLy8gLy8gLy8gICAgIOezu+e7n+inhOWumueahOezu+e7n+iwg+eUqAovLyAvLyAvLyAvLyAvLyAgICAg57KX55Wl55CG6Kej5Li655So5oi35rig6YGT5YaF5qC45LqM5Yy655qE5YiH5o2i5L2N572uCgovLyAvLyAvLyAvLyAvLyDlr7nliIbnprvnmoTlrZDnur/nqIvov5vooYzov57mjqUKLy8gLy8gLy8gLy8gLy8g5Lya5oql6ZSZ77yM5Zug5Li65bey57uP5YiG56a755qE5a2Q57q/56iL5LiN6IO95YaN6L+b6KGM6L+e5o6l5LqGCi8vIC8vIC8vIC8vIC8vIGludCByZXR0dHQgPSBwdGhyZWFkX2pvaW4odGlkLE5VTEwpOwovLyAvLyAvLyAvLyAvLyBpZigwIT1yZXR0dHQpewovLyAvLyAvLyAvLyAvLyAgICAgY2hhciogZXJyc3RyID0gc3RyZXJyb3IocmV0dHR0KTsKLy8gLy8gLy8gLy8gLy8gICAgIHByaW50ZigicmV0dHR0ICBlcnJvcjogJXNcbiIsIGVycnN0cik7Ci8vIC8vIC8vIC8vIC8vIH0KLy8gLy8gLy8gLy8gLy8g6YeK5pS+5pi+5oiQ54af5oCnCi8vIC8vIC8vIC8vIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKLy8gLy8gLy8gLy8gcHRocmVhZF9leGl0KE5VTEwpOwovLyAvLyAvLyAvLyAvLyBwcmludGYoIuaIkeS7luWmiOS4jeS8muaJp+ihjFxuIik7Ci8vIC8vIC8vIC8vIC8vIC8vIOavlOi+g+S4pOS4queOsOaIkGlk5piv5ZCm55u4562JCi8vIC8vIC8vIC8vIC8vIC8vIHB0aHJlYWRfZXF1YWwKLy8gLy8gLy8gLy8gLy8gLy8g5LiN5ZCM55qE5pON5L2c57O757uf77yM77yM5a6e546w5Y+R5ZOq5Liq5piv5Y+v6IO95LiN5aSq5LiA5qC35pyJ55qE5piv5peg56ym5Y+36ZW/5q2j5YW077yI5aSn6YOo5YiG77yJ77yM5pyJ55qE5piv57uT5p6E5L2T57G75Z6LCi8vIC8vIC8vIC8vIC8vIHB0aGVhZF9qb2luCi8vIC8vIC8vIC8vIC8vICAgIOaMpeaJi+iHqueOsOaIkOeahOi1hOa6kOOAguWSjHdhaXTlt67kuI3lpJoKLy8gLy8gLy8gLy8gLy8gICAg6L+Z5Liq5Ye95pWw5piv6Zi75aGe55qECi8vIC8vIC8vIC8vIC8vICAgIOiwg+eUqOS4gOasoeaZuuiDveWbnuaUtuS4gOS4quWtkOe6v+eoiwovLyAvLyAvLyAvLyAvLyAgICDvvIzkuIDoiKzlnKjkuLvnur/nqIvkuK3kvb/nlKgKLy8gLy8gLy8gLy8gLy8gICAgcmV0dmFsdTog5YuH5LqO5o6l5Y+X5a2Q57q/56iL6YCA5Ye65pe255qE6L+U5Zue5YC8Ci8vIC8vIC8vIC8vIC8vICAgICAgICAgICAgIOS6jOe6p+aMh+mSiAoKLy8gLy8gLy8gLyoKCi8vIC8vIC8vICAgICAvLyBjaGFyICogYnVmd2FlaHJzdGVkeXJ0ZWRzOwovLyAvLyAvLyAgICAgLy8gc3RyY3B5KGJ1ZndhZWhyc3RlZHlydGVkcywgImNhbyBuaW1hIik7cmV0dXJuIDA7fS8qCi8vIC8vIC8vICAgICAvLyDkv67mlLltbWFw55qEZmxhZ3Plj4LmlbDvvIzkuYvliY3kvb/nlKjnmoTmmK9NQVBfU0hBUkVECi8vIC8vIC8vICAgICAvLyDnjrDlnKjmiJHku6zopoHnlKjnmoTmmK9NQVBfQU5PTgovLyAvLyAvLyAgICAgaW50IGxlbiA9IDEyMDQ7Ci8vIC8vIC8vICAgICB2b2lkICpwdHIgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9BTk9OIHwgTUFQX1NIQVJFRCwgLTEsIDApOwovLyAvLyAvLyAgICAgaWYgKHB0ciA9PSBNQVBfRkFJTEVEKQovLyAvLyAvLyAgICAgewovLyAvLyAvLyAgICAgICAgIHBlcnJvcigibW1hcCIpOwovLyAvLyAvLyAgICAgICAgIGV4aXQoMCk7Ci8vIC8vIC8vICAgICB9Ci8vIC8vIC8vICAgICAvLyDniLblrZDov5vnqIvpl7TpgJrkv6EKLy8gLy8gLy8gICAgIGludCBwaWQgPSBmb3JrKCk7Ci8vIC8vIC8vICAgICBpZiAocGlkID4gMCkKLy8gLy8gLy8gICAgIHsKLy8gLy8gLy8gICAgICAgICBzdHJjcHkoKGNoYXIgKilwdHIsICJoZWxsbyB3b3JsZCIpOwovLyAvLyAvLyAgICAgICAgIHdhaXQoTlVMTCk7Ci8vIC8vIC8vICAgICB9Ci8vIC8vIC8vICAgICBlbHNlIGlmICgwID09IHBpZCkKLy8gLy8gLy8gICAgIHsKLy8gLy8gLy8gICAgICAgICBzbGVlcCgxKTsKLy8gLy8gLy8gICAgICAgICBwcmludGYoIiVzXG4iLCAoY2hhciAqKXB0cik7Ci8vIC8vIC8vICAgICB9Ci8vIC8vIC8vICAgICAvLyDph4rmlL7lhoXlrZjmmKDlsITljLoKLy8gLy8gLy8gICAgIGludCByZXQgPSBtdW5tYXAocHRyLCBsZW4pOwovLyAvLyAvLyAgICAgLy8gaW50IGZkID0gb3BlbigiZW5nbHNpaC50eHQiLCBPX1JET05MWSk7Ci8vIC8vIC8vICAgICAvLyAvLyDojrflj5bljp/lp4vmlofku7bnmoTlpKflsI8KLy8gLy8gLy8gICAgIC8vIGludCBsZW4gPSBsc2VlayhmZCwgMCwgU0VFS19FTkQpOwovLyAvLyAvLyAgICAgLy8gLy8g5Yib5bu65LiA5Liq5paw5paH5Lu277yM5bm25a+55YW25aSn5bCP6L+b6KGM5ouT5bGVCi8vIC8vIC8vICAgICAvLyBpbnQgZmQxID0gb3BlbigiY3B5LnR4dCIsIE9fQ1JFQVQgfCBPX1JEV1IsIDA2NjQpOwovLyAvLyAvLyAgICAgLy8gdHJ1bmNhdGUoImNweS50eHQiLCBsZW4pOwovLyAvLyAvLyAgICAgLy8gd3JpdGUoZmQxLCAiICIsIDEpOwovLyAvLyAvLyAgICAgLy8gLy8g5YiG5Yir6L+b6KGM5YaF5a2Y5pig5bCECi8vIC8vIC8vICAgICAvLyB2b2lkICpwdHIgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7Ci8vIC8vIC8vICAgICAvLyB2b2lkICpwdHIxID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkMSwgMCk7Ci8vIC8vIC8vICAgICAvLyBpZiAocHRyID09IE1BUF9GQUlMRUQpCi8vIC8vIC8vICAgICAvLyB7Ci8vIC8vIC8vICAgICAvLyAgICAgcGVycm9yKCJtbWFwIik7Ci8vIC8vIC8vICAgICAvLyAgICAgZXhpdCgwKTsKLy8gLy8gLy8gICAgIC8vIH0KLy8gLy8gLy8gICAgIC8vIGlmIChwdHIxID09IE1BUF9GQUlMRUQpCi8vIC8vIC8vICAgICAvLyB7Ci8vIC8vIC8vICAgICAvLyAgICAgcGVycm9yKCJtbWFwIik7Ci8vIC8vIC8vICAgICAvLyAgICAgZXhpdCgwKTsKLy8gLy8gLy8gICAgIC8vIH0KLy8gLy8gLy8gICAgIC8vIC8vIOWGheWtmOaLt+i0nQovLyAvLyAvLyAgICAgLy8gbWVtY3B5KHB0cjEsIHB0ciwgbGVuKTsKLy8gLy8gLy8gICAgIC8vIG11bm1hcChwdHIxLCBsZW4pOwovLyAvLyAvLyAgICAgLy8gbXVubWFwKHB0ciwgbGVuKTsKLy8gLy8gLy8gICAgIC8vIGNsb3NlKGZkMSk7Ci8vIC8vIC8vICAgICAvLyBjbG9zZShmZCk7Ci8vIC8vIC8vICAgICByZXR1cm4gMDsKLy8gLy8gLy8gfQovLyAvLyAvLyAqLwoKCmBgYAoK5a6i5oi356uv5Luj56CB77yaCmBgYGMKLy8g44CB44CB5L2/55So5YaF5a2Y5pig5bCE5Y+v5Lul5ou36LSd5paH5Lu2Ci8qCuWvueWOn+Wni+aWh+S7tui/m+ihjOWGheWtmOaYoOWwhArliJvlu7rkuIDkuKrmlrDmlofku7YK5oqK5paw5paH5Lu255qE5pWw5o2u5ou36LSd5pig5bCE5Yiw5YaF5a2Y5LitCumAmui/h+WGheWtmOaLt+i0neWwhuesrOS4gOS4quaWh+S7tueahOWGheWtmOaYoOWwhOWMuuaLt+i0neWIsOesrOS6jOS4quaWh+S7tueahOWGheWtmOaYoOWwhOWMugrph4rmlL7otYTmupAKKi8KCi8vIOWMv+WQjeaYoOWwhO+8jOS4jemcgOimgeaWh+S7tuWunuS9k+adpei/m+ihjOWGheWtmOaYoOWwhAovLyDlj6rog73nlKjkuo7mnInooYDnvJjlhbPns7vnmoTov5vnqIvpl7TpgJrkv6EKI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4gCiNpbmNsdWRlIDxzaWduYWwuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvd2FpdC5oPgojaW5jbHVkZSA8dW5pc3RkLmg+Ci8vIGludCBtYWluKCkKLy8gewoKICAgIC8qCi8vIGtpbGzlh73mlbAKLy8gcGlk44CLMOWwhuS/oeWPt+WPkemAgee7meaMh+Wumui/m+eoiwovLyA9MO+8muWwhuS/oeWPt+WPkemAgee7meW9k+WJjei/m+eoi+e7hAovLyA9LTHvvJrlsIbkv6Hlj7flj5HpgIHnu5nmr4/kuIDkuKrmnInmnYPpmZDmjqXlj5fov5nkuKrkv6Hlj7fnmoTov5vnqIsKLy8g44CKLTHvvJrov5vnqIvnu4RpZOeahOe7neWvueWAvAovLyBzaWfvvIzopoHlj5HpgIHnmoTkv6Hlj7cKLy8ga2lsbChnZXRwcGlkKCksIDkpOwovLyBraWxsKGdldHBpZCgpLCA5KTsKLy8gcmFpc2Xlh73mlbDvvIznu5nlvZPliY3ov5vnqIvlj5HpgIHkv6Hlj7cKLy8gc2ln77yM6KaB5Y+R6YCB55qE5L+h5Y+377yM5oiQ5Yqf6L+U5ZueMO+8jOWksei0pei/lOWbnumdnjAqLwovLyBhbGFybeWHveaVsAovLyDorr7nva7lrprml7blmajvvIzlgJLorqHml7bvvIzlvZPml7bpl7TkuLow55qE5pe25YCZ77yM5Lya57uZ5b2T5YmN6L+b56iL5Y+R6YCB5LiA5LiqIFNJR0FMQVJN5L+h5Y+3Ci8vIOWPlua2iOWumuaXtuWZqO+8jGFsYXJtKDAp5Y2z5Y+vCi8vIOi/lOWbnuWAvOaYr3Vuc2lnbmVkIGludO+8jOWAkuiuoeaXtuWJqeS9meeahOaXtumXtO+8iOS4iuS4gOS4qmFsYXJt5Ymp5L2Z55qE5pe26Ze077yJCi8vIFNJR0FMUkFSTeS/oeWPt+m7mOiupOe7iOatouW9k+WJjei/m+eoi++8jOavj+S4qui/m+eoi+WPquiDveiuvue9ruS4gOS4quWumuaXtuWZqAovLyBpbnQgc2Vjb25kcyA9IGFsYXJtKDUpOwovLyBwcmludGYoIiVkXG4iLCBzZWNvbmRzKTsKLy8gIHNsZWVwKDIpOwovLyAgc2Vjb25kcyA9IGFsYXJtKDMpOwovLyBwcmludGYoIiVkXG4iLCBzZWNvbmRzKTsKLy8gd2hpbGUoMSl7CgovLyB9Ci8vIDHnp5Lpkp/nlLXohJHog73ovpPlpJrlsJHkuKrmlbA/Ci8v5peg6K666L+b56iL5aSE5LqO5LuA5LmI54q25oCB77yMYWxhcm3pg73kvJrmraPluLjorqHml7YKLy8g5a6e6ZmF5pe26Ze0PeWGheaguOaXtumXtCvnlKjmiLfml7bpl7QraW/mtojogJfnmoTml7bpl7QKLy8gYWxhcm0oMSk7Ci8vIGludCBpID0wOwovLyB3aGlsZSgxKXsKLy8gICAgIHByaW50ZigiJWRcbiIsaSsrKTsKLy8gfQoKLy8gc2V0dGltZWVy5Ye95pWw77yM55So5LqO5pu/5o2iYWxhcm3lh73mlbDvvIzkuJTnsr7luqbmr5RhbGFybeimgemrmOW+iOWkmu+8jAovLyDlj4LmlbAKLy8gd2hpY2jvvIzlrprml7blmajku6Xku4DkuYjml7bpl7TorqHml7YKLy8gICAgIElUSU1FX1JFQUzvvJog55yf5a6e5pe26Ze077yM5pe26Ze05Yiw6L6+77yM5bCx5Y+R6YCBU0lHQUxSTQovLyAgICAgSVRJTUVfVklSVFVBTO+8m+eUqOaIt+aXtumXtO+8jOaXtumXtOWIsOi+vuWwseWPkemAgVNJR1ZUQUxSTQovLyAgICAgSVRJTUVSX1BST0bvvJrov5vnqIvlnKjlhoXmoLjnirbmgIHkuIvmtojogJfnmoTml7bpl7QKLy8g6L+HM+enkuWQju+8jOavj+S4pOenkuaJp+ihjOS4gOasoQovLyBzdHJ1Y3QgaXRpbWVydmFsIG5ld192YWx1ZTsKLy8gLy8g6K6+572u5YC8Ci8vIG5ld192YWx1ZS5pdF9pbnRlcnZhbC50dl9zZWMgPSAyOwovLyBuZXdfdmFsdWUuaXRfaW50ZXJ2YWwudHZfdXNlYyA9MDsKLy8gbmV3X3ZhbHVlLml0X3ZhbHVlLnR2X3NlYz0zOwovLyBuZXdfdmFsdWUuaXRfdmFsdWUudHZfdXNlYz0wOwovLyBpbnQgcmV0ID0gc2V0aXRpbWVyKElUSU1FUl9SRUFMLCZuZXdfdmFsdWUsTlVMTCk7Ci8vIHByaW50Zigi5a6a5pe25Zmo5byA5aeLXG4iKTsKLy8gaWYgKHJldD09LTEpewovLyAgICAgcGVycm9yKCJzZXR0aW1lciIpOwovLyAgICAgZXhpdCgwKTsKLy8gfQovLyBnZXRjaGFyKCk7Ci8vIHNpZ25hbOaNleiOt+S/oeWPtwovLyBzaWdraWxsLHNpZ3N0b3Dml6LkuI3og73ooqvmjZXmjYnkuZ/kuI3og73ooqvlv73nlaUKLy8gc2lnbnVt77ya6KaB5o2V5o2J55qE5L+h5Y+3Ci8vIGhhbmRsZXLvvJrmjZXmjYnliLDkv6Hlj7fkuYvlkI7lpoLkvZXlpITnkIYKLy8gICAgIHNpZ19pZ27vvJrlv73nlaUKLy8gICAgIHNpZ19kZmzvvJrkvb/nlKjkv6Hlj7fpu5jorqTnmoTooYzkuLoKLy8gICAgIOWbnuiwg+WHveaVsDrmjZXojrfliLDkv6Hlj7flkI7miafooYzor6Xlh73mlbAKLy8g6L+HM+enkuWQju+8jOavj+S4pOenkuaJp+ihjOS4gOasoQovLyDms6jlhozkv6Hlj7fmjZXmjYnlh73mlbAKLy/lv73nlaXkv6Hlj7cKLy8gc2lnbmFsKFNJR0FMUk0sU0lHX0lHTik7Ci8v55u06KGM5L+h5Y+355qE6buY6K6k5Yqo5L2c77yIc2lnX0FMUk3nu5PmnZ/nqIvluo/vvIkKLy8gc2lnbmFsKFNJR0FMUk0sU0lHX0RGTCk7Ci8vIHZvaWQgKCpzaWdfaGFuZGxlcikoaW50KSzov5nmmK/kuIDkuKrlh73mlbDmjIfpkojjgILov5Tlm552b2lk77yM5Y+C5pWwaW5077yM5Ye95pWw5ZCN56ew77yac2lnX2hhbmRsZXIKLy8g6I635Y+W5b2T5YmN57q/56iL55qE546w5oiQaWQKICAgIGludCBhc2RhID01OwogICAgLy/miYDmrLLnmoTnur/nqIvlupTor6XlhbHkuqvov5kxMDDlvKDpl6jnpagKICAgIGludCB0aWNrZXRzID0xMDA7CiAgICAvLyDliJvlu7rkuIDkuKrkupLmlqXph48KICAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7IAoKICAgIC8v5Ye6546w5LqG5ZCM5LiA5Liq57q/56iL77yM5Lmw5ZCM5LiA5byg56Wo55qE5oOF5Ya1CiAgICAvLyDpnIDopoHnoa7kv53lpJrkuKrnur/nqIvkuI3kvJrlkIzml7bkv67mlLnkuIDkuKrlj5jph48KICAgIC8vIOS4tOeVjOWMuuOAgu+8m2nkvaDlp5DotYTmupAKICAgIC8vICNpbmNsdWRlPAogICAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXgxOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDI7CnZvaWQgKnNpZ19oYW5kbGVyKHZvaWQqIGFyZykgewovLyAgICAgcHJpbnRmKCIlZFxuIiwqKGludCopYXJnKTsKLy8gICAgIHByaW50Zigi5o2V6I635Yiw5a2Q57q/56iL77yaXG4iKTsKLy8gICAgIC8vIHNsZWVwKDMpOwovLyAgICAgcHJpbnRmKCJsbGxsbGxsbOWtkOe6v+eoi2RpbGxsbGxsbF1u55qE44CBbiVsZFxuIixwdGhyZWFkX3NlbGYoKSk7Ci8vICAgICAvLyByZXR1cm4gTlVMTDsKLy8gICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQovLyB7cHJpbnRmKCLmiJHmmK/kvaDlhL/lrZAlZFxuIixpKTsKLy8gICAgIC8qIGNvZGUgKi8KLy8gfQovLyByZXR1cm4gTlVMTDsKLy8gICAgIHB0aHJlYWRfZXhpdCgodm9pZCopJmFzZGEpOwovLyDljZbnpagKLy8g5p636ZSBCndoaWxlKDEpewpwdGhyZWFkX211dGV4X2xvY2soJm11dGV4KTsKcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CiAgICBpZih0aWNrZXRzPjApewogICAgcHJpbnRmKCLlrZDnur/nqIslbGTmraPlnKjljZblnLAlZOW8oOWTpuelqFxuIixwdGhyZWFkX3NlbGYoKSwxMDAtdGlja2V0cysxKTsKICAgIHRpY2tldHMtLTsKfWVsc2Uge3B0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7YnJlYWs7fQovLyDop6PplIEKCnB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7CnB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7Cn0KcmV0dXJuIE5VTEw7Cn0KCgovLyAgICAgcHJpbnRmKCIlZFxuIiwqKGludCopYXJnKTsKLy8gICAgIHByaW50Zigi5o2V6I635Yiw5a2Q57q/56iL77yaXG4iKTsKLy8gICAgIC8vIHNsZWVwKDMpOwovLyAgICAgcHJpbnRmKCJsbGxsbGxsbOWtkOe6v+eoi2RpbGxsbGxsbF1u55qE44CBbiVsZFxuIixwdGhyZWFkX3NlbGYoKSk7Ci8vICAgICAvLyByZXR1cm4gTlVMTDsKLy8gICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQovLyB7cHJpbnRmKCLmiJHmmK/kvaDlhL/lrZAlZFxuIixpKTsKLy8gICAgIC8qIGNvZGUgKi8KLy8gfQovLyByZXR1cm4gTlVMTDsKLy8gICAgIHB0aHJlYWRfZXhpdCgodm9pZCopJmFzZGEpOwovLyDljZbnpagKLy8g5p636ZSBCnB0aHJlYWRfbXV0ZXhfdCBhc2Rhc2Rhc2Rhc2Rhc2RhczsKaW50IG51bW0gPTE7CnZvaWQgKnNpZ19oYW5kbGVyMSh2b2lkKiBhcmcpIHsKLy8gLy8gd2hpbGUoMSl7CgovLyBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4MSk7CiAgICB3aGlsZSgxKXsKICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmFzZGFzZGFzZGFzZGFzZGFzKTsKbnVtbSsrOwovLyAgcHRocmVhZF9tdXRleF91bmxvY2soJmFzZGFzZGFzZGFzZGFzZGFzKTsKcHJpbnRmKCIrK+iwouiwou+8jHRpZDolbGQsbnVtbW06JWRcbiIscHRocmVhZF9zZWxmKCksbnVtbSk7CiBwdGhyZWFkX211dGV4X3VubG9jaygmYXNkYXNkYXNkYXNkYXNkYXMpOwp1c2xlZXAoMSk7Ci8vICgxKTsKICAgIH0KLy8gcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleDIpOwovLyBwcmludGYoIndvcmtB77ya77yaXG4iKTsKCi8vIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleDIpOwovLyBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgxKTsKLy8gLy8gICAgIGlmKHRpY2tldHM+MCl7Ci8vIC8vICAgICBwcmludGYoIuWtkOe6v+eoiyVsZOato+WcqOWNluWcsCVk5byg5ZOm56WoXG4iLHB0aHJlYWRfc2VsZigpLDEwMC10aWNrZXRzKzEpOwovLyAvLyAgICAgdGlja2V0cy0tOwovLyAvLyB9ZWxzZSB7cHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTticmVhazsKLy8gLy8gfQovLyAvLyDop6PplIEKCi8vIC8vIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7Ci8vIC8vIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7Ci8vIC8vIH0KcmV0dXJuIE5VTEw7Cn0KLy8g5a2Y5Zyo5pWw5o2u5a6J5YWo6Zeu6aKYae+8jOivu+WGmea3t+S5sQp2b2lkICpzaWdfaGFuZGxlcjEyMjMyKHZvaWQqIGFyZykgewovLyAvLyB3aGlsZSgxKXsKLy8gcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleDIpOwovLyBzbGVlcCgxKTsKLy8gcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleDEpOwovLyBwcmludGYoIuS6jOibi++8mu+8mlxuIik7CgovLyBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgxKTsKLy8gcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Mik7Ci8vIC8vICAgICBpZih0aWNrZXRzPjApewovLyAvLyAgICAgcHJpbnRmKCLlrZDnur/nqIslbGTmraPlnKjljZblnLAlZOW8oOWTpuelqFxuIixwdGhyZWFkX3NlbGYoKSwxMDAtdGlja2V0cysxKTsKLy8gLy8gICAgIHRpY2tldHMtLTsKLy8gLy8gfWVsc2Uge3B0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7YnJlYWs7Ci8vIC8vIH0KICAgIHdoaWxlKDEpewovLyBudW1tKys7CiBwdGhyZWFkX211dGV4X2xvY2soJmFzZGFzZGFzZGFzZGFzZGFzKTsKcHJpbnRmKCIrK+ivu+ivu++8jHRpZDolbGQsbnVtbW06JWRcbiIscHRocmVhZF9zZWxmKCksbnVtbSk7CiBwdGhyZWFkX211dGV4X3VubG9jaygmYXNkYXNkYXNkYXNkYXNkYXMpOwp1c2xlZXAoMSk7CiAgICB9CnJldHVybiBOVUxMOwp9CgovLyAgICAg5L+h5Y+36ZuGCi8vICAgICDkuqfnlJ/kvYbmmK/ov5jmsqHmnInooqvlpITnkIbnmoTkv6Hlj7fooqvlvZLliLDmnKrlhrPkv6Hlj7fpm4YKCi8vICAgICBzaWdpbnTkv6Hlj7fnirbmgIHooqvlrZjlgqjlnKjnrKzkuozkuKpiaXTkvY3kuIoKLy8gICAgICAgICBiaXTkvY3kuLox77yM6K+05piO5L+h5Y+35aSE5LqO5pyq5Yaz54q25oCBCi8vIOacquWGs+eKtuaAgeWvueeahOS/oeWPt+mcgOimgeWkh+WkhOeQhgovLyDkvYbmmK/lnKjlpITnkIbkuYvliY3pnIDopoHlkozlj6bkuIDkuKrlj6vlgZrpmLvloZ7kv6Hlj7fpm4bnmoTlr7nlupTmr5TnibnkvY3ov5vooYzmr5TovoMKLy8g5aaC5p6c5a+55bqU5L2N572u5pivMe+8jOmCo+S5iOWwseivtOaYjuS/oeWPt+iiq+mYu+Whnu+8jOmCo+S5iOi/meS4quS/oeWPt+WwseS4jeS8muiiq+WkhOeQhu+8jOebtOWIsOaMh+WPmOaIkDAKLy8g6Zi75aGe5L+h5Y+36ZuG6buY6K6k5LiN6Zi75aGe5Lu75L2V5L+h5Y+377yM5oiR5Lus5Y+v5Lul5omL5Yqo6L+b6KGM6K6+572u77yI6LCD55So57O757ufQVBJ77yJCgovLyBzaWdlbXB0eXNldOWHveaVsAovLyAgICAg5riF56m65L+h5Y+36ZuG5Lit55qE5pWw5o2u77yM5omA5pyJ5qCH5b+X5L2N6KKr6K6+572u5Li6MAovLyAgICAg5Y+C5pWw77yac2V077yM6KaB6K6+572u55qE5L+h5Y+36ZuGCi8vIHNpZ2ZpbGxzZXTlh73mlbAKLy8gICAgIOiuvuS4ujEKLy8gc2lnYWRkc2V05Ye95pWwCi8vICAgICDorr7nva7kv6Hlj7fpm4bkuK3nmoTmn5DkuIDkuKrmoIflv5fkvY3orr7nva7kuLoxCi8vIHNpZ2RlbHNldCDlh73mlbAKLy8gICAgIOWSjOS4iumdoueahOebuOWPje+8jDAKLy8gc2lnaXNtZW1iZXLlh73mlbAKLy8gICAgIOWIpOaWreafkOS4quS/oeWPt+aYr+WQpumYu+WhngovLyDkuIrpnaLnmoTlh73mlbDpg73mmK/pmLvloZ7kv6Hlj7fpm4bnmoTmk43kvZzlh73mlbAKLy8g5Yib5bu65LiA5Liq5L+h5Y+36ZuGCi8vIHNpZ3NldF90IHNldCA7Ci8vIC8vIOWFiOa4heepugovLyBzaWdlbXB0eXNldCgmc2V0KTsKLy8gLy8g5Yik5pat5L+h5Y+35piv5ZCm5Zyo5L+h5Y+36ZuG5LitCi8vIGludCByZXQgPSBzaWdpc21lbWJlcigmc2V0LFNJR0lOVCk7Ci8vIGlmIChyZXQgPT0gMCkgewovLyBwcmludGYoIlNJR0lOVCDkuI3pmLvloZ5cbiIpOwovLyB9ZWxzZSBpZihyZXQgPT0gMSkgewovLyBwcmludGYoIlNJR0lOVCDpmLvloZ5cbiIpOwoKLy8gfQovLyAvLyDmt7vliqDkv6Hlj7fliLDkv6Hlj7fpm4bkuK0KLy8gc2lnYWRkc2V0KCZzZXQsU0lHSU5UKTsKLy8gc2lnYWRkc2V0KCZzZXQsU0lHUVVJVCk7Ci8vICByZXQgPSBzaWdpc21lbWJlcigmc2V0LFNJR0lOVCk7Ci8vIGlmIChyZXQgPT0gMCkgewovLyBwcmludGYoIlNJR0lOVCDkuI3pmLvloZ5cbiIpOwovLyB9ZWxzZSBpZihyZXQgPT0gMSkgewovLyBwcmludGYoIlNJR0lOVCDpmLvloZ5cbiIpOwoKLy8gfQovLyAgcmV0ID0gc2lnaXNtZW1iZXIoJnNldCxTSUdRVUlUKTsKLy8gaWYgKHJldCA9PSAwKSB7Ci8vIHByaW50ZigiU0lHUVVJVCDkuI3pmLvloZ5cbiIpOwovLyB9ZWxzZSBpZihyZXQgPT0gMSkgewovLyBwcmludGYoIlNJR1FVSVQg6Zi75aGeXG4iKTsKCi8vIH0KLy8gc2lnZGVsc2V0KCZzZXQsIFNJR1FVSVQpOwovLyAgcmV0ID0gc2lnaXNtZW1iZXIoJnNldCxTSUdRVUlUKTsKLy8gaWYgKHJldCA9PSAwKSB7Ci8vIHByaW50ZigiU0lHUVVJVCDkuI3pmLvloZ5cbiIpOwovLyB9ZWxzZSBpZihyZXQgPT0gMSkgewovLyBwcmludGYoIlNJR1FVSVQg6Zi75aGeXG4iKTsKCi8vIH0KLy8g57O757uf6LCD55So6K6+572u5L+h5Y+36ZuGCi8vIHNpZ3Byb2NtYXNrCi8vIOivpeWHveaVsOWPr+S7peWwhuaIkeS7rOiHquWumuS5ieeahOS/oeWPt+mbhuaYoOWwhOWIsOWGheaguOS4rQovLyBob3fvvJoKLy8gICAgIOWmguS9leWvueWGheaguOS4reeahOmYu+WhnuS/oeWPt+mbhui/m+ihjOWkhOeQhgovLyAgICAgICAgIHNpZ19ibG9ja++8jG1hc2t8c2V0Ci8vICAgICAgICAgU0lHX1VOQkxPQ0s6IG1hc2tec2V0KOW8guaIluaTjeS9nAovLyAgICAgICAgIHNpZ19zZXRtYXNrIOimhuebluWGheaguOeahOaMhwovLyBzaWdwZW5kaW5nCi8vICAgICDojrflj5blhoXmoLjlvZPkuK3nmoTmnKrlhrPkv6Hlj7fpm4YKCi8vIOe8luWGmeS4gOS4queoi+W6j++8jOWwhuaJgOacieeahOW4uOinhOS/oeWPt++8iDEtMzHvvInnmoTmnKrlhrPnirbmgIHmiZPljbDlh7rmnaUKLy8g6K6+572u5p+Q5Lqb5L+h5Y+35piv6Zi75aGe55qE77yM6YCa6L+H6ZSu55uY5p2l5Lqn55Sf6L+Z5Lqb5L+h5Y+3Y3RybCs/Ci8vIOiuvue9rjLjgIEz5L+h5Y+36Zi75aGeCi8vIHNpZ3NldF90IHNldDsKLy8gc2lnZW1wdHlzZXQoJnNldCk7Ci8vIC8vIOWwhjLjgIEz5L+h5Y+35re75Yqg5Yiw5L+h5Y+36ZuG5LitCi8vIHNpZ2FkZHNldCgmc2V0LFNJR0lOVCk7Ci8vIHNpZ2FkZHNldCgmc2V0LFNJR1FVSVQpOwovLyAvL+S/ruaUueWGheaguOS4reeahOmYu+WhnuS/oeWPt+mbhgovLyBzaWdwcm9jbWFzayhTSUdfQkxPQ0ssJnNldCwgTlVMTCk7Ci8vIGludCBudW09MDsKLy8gd2hpbGUoMSkgewovLyAgICAgcHJpbnRmKCJudW3vvJolZFxuIixudW0pOwovLyAgICAgaWYobnVtID09IDUpewovLyAgICAgICAgIC8vIOino+mZpHNpZ2ludOeahOmYu+WhngovLyAgICAgICAgIHNpZ3Byb2NtYXNrKFNJR19VTkJMT0NLLCZzZXQsTlVMTCk7Ci8vICAgICB9Ci8vICAgICBudW0rKzsKLy8gICAgIC8vIOiOt+WPluW9k+WJjeeahOacquWGs+S/oeWPt+mbhgovLyAgICAgc2lnc2V0X3QgcGVuZGluZ3NldDsKLy8gICAgIHNpZ2VtcHR5c2V0KCZwZW5kaW5nc2V0KTsKLy8gICAgIHNpZ3BlbmRpbmcoJnBlbmRpbmdzZXQpOwovLyAgICAgLy/pgY3ljoZiaXTkvY0KLy8gICAgIGZvcihpbnQgaT0xO2k8PTMyO2krKykgewovLyBpZihzaWdpc21lbWJlcigmcGVuZGluZ3NldCxpKT09MSl7Ci8vICAgICBwcmludGYoIjEiKTsKLy8gfWVsc2UgaWYoc2lnaXNtZW1iZXIoJnBlbmRpbmdzZXQsIGkpPT0wKSB7Ci8vICAgICBwcmludGYoIjAiKTsKLy8gfWVsc2V7Ci8vICAgICBwZXJyb3IoInNpZ2lzbWVtYmVyXG4iKTtleGl0KDApOwovLyB9CgoKLy8gICAgIH1wcmludGYoIlxuIik7c2xlZXAoMSk7Ci8vIH0KLy8gc2lnYWN0aW9uCi8vIOajgOafpeaIluiAheaUueWPmOS/oeWPt+eahOWkhOeQhuaWueW8jwovLyBzaWdudW3vvIzpnIDopoHmjZXmjYnnmoTkv6Hlj7cKLy8gYWN077yM5o2V5o2J5Yiw5L+h5Y+35ZCO6ZyA6KaB5omn6KGM55qE5Yqo5L2cCi8vIG9sZGFhY3TvvIzmsqHnlKgKCi8vIHN0cnVjdCBzaWdhY3Rpb24KLy8gICAgIHNhX2hhbmRsZTrlm57osIPlh73mlbDmjIfpkogKCi8vICAgICDkuLTml7bpmLvloZ7kv6Hlj7fpm4YKLy8gICAgIHNhX21hc2sKLy8gICAgIOS4tOaXtumYu+WhnuafkOS6m+S/oeWPtwoKLy8g5L2/55So6YKj5Liq5L+h5Y+35aSE55CG5a+55L+h5Y+36L+b6KGM5aSE55CG44CC5aaC5p6c5pivMOihqOekuuS9v+eUqOWbnuiwg+WHveaVsAovLyAgICAgLy8g5b+F6aG75Zyo6K6+572u5a6a5pe25Zmo5LmL5YmN5rOo5YaM5Zue6LCD5Ye95pWwCi8vIOacgOWlveS9v+eUqHNpZ2FjdGlvbuWOu+azqOWGjOWbnuiwg+WHveaVsAovLyBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKLy8gYWN0LnNhX2ZsYWdzID0gMDsKLy8gYWN0LnNhX3NpZ2FjdGlvbiA9IHNpZ19oYW5kbGVyOwovLyAvL+a4heepuuS4tOaXtumYu+WhnuS/oeWPt+mbhgovLyBzaWdlbXB0eXNldCgmYWN0LnNhX21hc2spOwovLyBzaWdhY3Rpb24oU0lHQUxSTSwmYWN0LE5VTEwpOwovLyAvLyBzaWdfdCByZXRyID0gIHNpZ25hbChTSUdBTFJNLHNpZ19oYW5kbGVyKTsKLy8gLy8gaWYocmV0cj09U0lHX0VSUikgewovLyAvLyAgICAgcGVycm9yKCJzaWduYWzms6jlhowiKTsKLy8gLy8gICAgIGV4aXQoLTEpOwovLyAvLyB9Ci8vIHN0cnVjdCBpdGltZXJ2YWwgbmV3X3ZhbHVlOwovLyAvLyDorr7nva7lgLwKLy8gbmV3X3ZhbHVlLml0X2ludGVydmFsLnR2X3NlYyA9IDI7Ci8vIG5ld192YWx1ZS5pdF9pbnRlcnZhbC50dl91c2VjID0wOwovLyBuZXdfdmFsdWUuaXRfdmFsdWUudHZfc2VjPTM7Ci8vIG5ld192YWx1ZS5pdF92YWx1ZS50dl91c2VjPTA7Ci8vIGludCByZXQgPSBzZXRpdGltZXIoSVRJTUVSX1JFQUwsJm5ld192YWx1ZSxOVUxMKTsKLy8gcHJpbnRmKCLlrprml7blmajlvIDlp4tcbiIpOwovLyBpZiAocmV0PT0tMSl7Ci8vICAgICBwZXJyb3IoInNldHRpbWVyIik7Ci8vICAgICBleGl0KDApOwovLyB9Ci8vIC8vIGdldGNoYXIoKTsKLy8gLy8gd2hpbGUoMSk7Ci8vIHNpZ2NoaWxk5L+h5Y+35Lqn55Sf55qE5p2h5Lu2Ci8vICAgICDlrZDov5vnqIvnu4jmraIKLy8gICAgIOWtkOi/m+eoi+aOpeaUtuWIsHNpZ3N0b3Dkv6Hlj7flgZzmraIKLy8gICAgIOWtkOi/m+eoi+WkhOS6juWBnOa7nueKtuaAge+8jOaUtuWIsHNpZ2NvbnTlkI7llKTphpIKLy8g54i26L+b56iL6buY6K6k6JGr6Iqm6K+l5L+h5Y+3Ci8vIOWPr+S7peeUqOS6juino+WGs+WDteWwuOi/m+WfjueahOmXrumimAojaW5jbHVkZTxzeXMvdGltZS5oPgojaW5jbHVkZTx0aW1lLmg+CnZvaWQgc2lnX2hhbmRsZXIyKGludCBudW0pewp0aW1lX3QgICAgIHRtMiA9IHRpbWUoTlVMTCk7CnN0cnVjdCB0bSogbG9jID0gbG9jYWx0aW1lKCZ0bTIpOwoKLy8gY2hhciBidWZ3YWVocnN0ZWR5cnRlZHNbNTI0XTsKLy8gc3ByaW50ZihidWZ3YWVocnN0ZWR5cnRlZHMsICIlZC0lZC0lZCAlZDolZDolZFxuIixsb2MtPnRtX3llYXIsbG9jLT50bV9tb24sbG9jLT50bV9tZGF5LGxvYy0+dG1faG91cixsb2MtPnRtX21pbixsb2MtPnRtX3NlYyk7Ci8vIHByaW50ZigiJXNcbiIsYnVmd2FlaHJzdGVkeXJ0ZWRzKTsKY2hhciogc3RyICA9YXNjdGltZShsb2MpOwppbnQgZmQgPW9wZW4oInRpbWUudHh0IixPX1JEV1J8T19DUkVBVHxPX0FQUEVORCwwNjY0KTsKd3JpdGUoZmQsc3RyLHN0cmxlbihzdHIpKTsKY2xvc2UoZmQpOwogICAgLy8gcHJpbnRmKCLmjZXmjYnlpaXlvpfkv6Hlj7fvvJolZFxuIixudW0pOwogICAgLy8gLy8g5Zue6aaW57Sr56aB5Z+OCiAgICAvLyAvLyB3aGlsZSgxKXsKICAgIC8vIC8vIHdhaXQoTlVMTCk7fQogICAgLy8gd2hpbGUgKDEpCiAgICAvLyB7aW50IHJldCA9d2FpdHBpZCgtMSxOVUxMLFdOT0hBTkcpOwogICAgLy8gICAgIC8qIGNvZGUgKi8KICAgIC8vICAgICBpZihyZXQ+MCl7CiAgICAvLyAgICAgICAgIHByaW50Zigi5LqM5a2X5oyC5LqG77yaJWRcbiIsIHJldCk7CiAgICAvLyAgICAgfWVsc2UgaWYocmV0ID09MCkgewogICAgLy8gICAgICAgICAvLyDor7TmmI7ov5jmnInlrZDov5vnqIvmiJbogIUKICAgIC8vICAgICAgICAgICBicmVhazsKICAgIC8vICAgICB9ZWxzZSBpZihyZXQgPT0tIDEpewogICAgLy8gICAgICAgICAvLyDmsqHmnInntKvnpoHln47kuoYKICAgIC8vICAgICAgICAgYnJlYWs7CiAgICAvLyAgICAgfQogICAgLy8gfQogICAgCn0KI2luY2x1ZGU8c3lzL3NobS5oPgovLyBpbnQgbWFpbigpCi8vIHsKLy8gICAgIC8vIOaPkOWJjeiuvue9ruWlvemYu+WhnuS/oeWPt+mbhgovLyAgICAgLy8g6Zi75aGec2lnY2hpbGQKLy8gICAgIC8vIOWboOS4ulVO5Zyo6KW/bWFpbui/meenjeWPr+iDve+8mgovLyAgICAgLy8gICAgIOWtkOi/m+eoi+WcqOazqOWGjOWPt+Wbnuiwg+WHveaVsOS5i+WJjeWwseW3sue7j+e7k+adn+S6hgovLyBzaWdzZXRfdCBzZXQ7Ci8vIHNpZ2VtcHR5c2V0KCZzZXQpOwovLyBzaWdhZGRzZXQoJnNldCxTSUdDSExEKTsKLy8gc2lncHJvY21hc2soU0lHX0JMT0NLLCZzZXQgICxOVUxMKTsKCgovLyBwaWRfdCBwaWQ7Ci8vIGludCBjb3VudD0yMDsKLy8gZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQovLyB7Ci8vICAgICBwaWQgPSBmb3JrKCk7Ci8vICAgICBpZihwaWQ9PTApewovLyAgICAgICAgIGJyZWFrOwovLyAgICAgfQovLyAgICAgLyogY29kZSAqLwoKLy8gfQovLyAvLyDmjZXmjYnlrZDov5vnqIvmrbvkuqHml7blj5HpgIHnmoRzaWdjaGlsZOS/oeWPtwovLyBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKLy8gYWN0LnNhX2ZsYWdzPTA7Ci8vIGFjdC5zYV9zaWdhY3Rpb24gPSBzaWdfaGFuZGxlcjI7Ci8vIHNpZ2VtcHR5c2V0KCZhY3Quc2FfbWFzayk7Ci8vIHNpZ2FjdGlvbihTSUdDSExELCZhY3QsTlVMTCk7Ci8vIC8vIOazqOWGjOWujOS/oeWPt+aNleaNieS5i+WQju+8jOWwseaOpeinpumYu+WhngovLyBzaWdwcm9jbWFzayhTSUdfVU5CTE9DSywmc2V0LE5VTEwpOwovLyBpZihwaWQ+MCl7Ci8vICAgICAvLyDniLbov5vnqIsKLy8gICAgIHdoaWxlKDEpewovLyAgICAgICAgIHByaW50Zigi5oiR5piv5L2g54i5XG4iKTsKLy8gICAgICAgICBzbGVlcCgyKTsKLy8gICAgIH19IGVsc2UgaWYocGlkPT0wKXsKLy8gICAgICAgICBwcmludGYoIuWEv+Wtl++8miVkXG4iLGdldHBpZCgpKTsKLy8gICAgIH0KCi8vIHBpZF90IHBpZCA9IGZvcmsoKTsKLy8gaWYocGlkPT0wKXsKLy8gICAgIGZvcihpbnQgaT0wO2k8NTtpKyspIHsKLy8gICAgICAgICBwcmludGYoIuWtqeWtkOi/m+eoiyVkXG4iLCBpKTsKLy8gICAgICAgICBzbGVlcCgxKTsKLy8gICAgIH0KLy8gfWVsc2UgaWYocGlkPjApIHsKLy8gICBwcmludGYoIueIuei/m+eoi1xuIik7Ci8vICAgc2xlZXAoMik7Ci8vICAgcHJpbnRmKCLlgrvlhL/lrZBcbiIpOwovLyAgIGtpbGwocGlkLFNJR0lOVCk7Ci8vIH0KLy8g5YWx5Lqr5YaF5a2YCi8vIOWIm+W7uuS4gOS4quaWsOeahOWGheWtmOWFseS6q+autQovLyDmiJbogIXojrflj5bkuIDkuKogICDml6LmnInnmoTlhbHkuqvlhoXlrZjmrrUKLy8gc2htYXTlkozlvZPliY3ov5vnqIvov5vooYzlhbPogZQKLy8gc2htZGF077yM56e76Zmk5ZKM5b2T5YmN6L+b56iL55qE5YWz6IGUCi8vIHNobWN0bAovLyDliJvlu7rkuIDkuKrlhbHkuqvlhoXlrZgKLy8gaW50IHNobWlkID0gc2htZ2V0KDUwLDQwOTYsSVBDX0NSRUFUfDA2NjQpOwovLyAvLyDlkozlvZPliY3ov5vnqIvov5vooYzlhbPogZQKLy8gdm9pZCogcHRyID0gc2htYXQoc2htaWQsTlVMTCwwKTsKLy8gcHJpbnRmKCIlZFxuIiwgc2htaWQpOwovLyBjaGFyKnN0ciA9ICJoZWxsbyB3b3JsZCI7Ci8vIG1lbWNweShwdHIsc3RyLHN0cmxlbihzdHIpKzEpOwovLyBwcmludGYoIuaMieS7u+aEj+mUrue7p+e7rVxuIik7Ci8vIGdldGNoYXIoKTsKLy8gc2htZHQocHRyKTsKLy8gc2htY3RsKHNobWlkLElQQ19STUlELE5VTEwpOwovLyBmdG9r5Ye95pWw77yM5qC55o2u5oyH5a6a55qE6Lev5b6E5ZCN5ZKMaW505oyH55Sf5oiQ5LiA5Liq5YWx5Lqr5YaF5a2Y55qEa2V5CgovLyDomb3nhLbmmK9pbnTnsbvlnovnmoTmjIfvvIzkvYbmmK/lhoXmoLjlj6rkvJrkvb/nlKjku5bnmoTkuIDkuKrlrZfoioLvvIzkuZ/lsLHmmK/or7TojIPlm7Tlhbblrp7mmK8wLTI1NQovLyDmk43kvZzns7vnu5/lpoLkvZXnn6XpgZPkuIDlnZflhbHkuqvlhoXlrZjmnInlpJrlsJHkuKrov5vnqIvlhbPogZQKLy8gICAgIOWFseS6q+WGheWtmOe7tOaKpOS6huS4gOS4que7k+aehOS9k++8jHN0cnVjdCBzaG1pZOKAlOKAlGRzCi8vICAgICDor6Xnu5PmnoTkvZPkuK3mnInkuIDkuKrmiJDlkZhzaG1fbm9hdHRhY2jorrDlvZXkuobnm7jlhbPkv6Hmga8KLy8gICAgIGlwY3MgLW3lj6/ku6Xmn6XnnIsKLy8g57yW5YaZ5LiA5Liq5a6I5oqk6L+b56iL77yM5q+P6ZqU5Lik56eS6I635Y+W5LiA5LiL57O757uf5pe26Ze077yM5bCG6L+Z5Liq5pe26Ze05YaZ5YWl56OB55uY5paH5Lu25LitCi8vIOWIm+W7uuWtkOi/m+eoi++8jOaOqOWHuueItui/m+eoiwovLyBwaWRfdCBwaWQgPWZvcmsoKTsKLy8gaWYocGlkPjApewovLyAgICAgZXhpdCgwKTsKLy8gfQovLyAvLyDlsIblrZDov5vnqIvmj5DljYfkuLrlm57or53vvIwKLy8gc2V0c2lkKCk7Ci8vIC8vIOiuvue9ruaOqeeggQovLyB1bWFzaygwMjIpOwovLyAvLyDmm7TmlLnlt6XkvZznm67lvZUKLy8gY2hkaXIoIi8iKTsKLy8gLy8g5YWz6Zet5bm26YeN5a6a5ZCR5paH5Lu25o+P6L+w56ymCi8vIC8vIGludCBmZCA9IG9wZW4oIi9kZXYvbnVsbCIsT19SRFdSKTsKLy8gLy8gZHVwMihmZCxTVERJTl9GSUxFTk8pOwovLyAvLyBkdXAyKGZkLFNURE9VVF9GSUxFTk8pOwovLyAvLyBkdXAyKGZkLFNUREVSUl9GSUxFTk8pOwovLyAvLyDkuJrliqHpgLvovpEKLy8gLy8g5Yib5bu65a6a5pe25ZmoCi8vIC8vIHNldGl0aW1lcihJVElNRVJfUkVBTCwmdmFsLE5VTEwpOwovLyAvLyDmjZXmjYnlrprmmK/kv6Hlj7cKLy8gc3RydWN0IHNpZ2FjdGlvbiBhY3Q7Ci8vIGFjdC5zYV9mbGFncyA9IDA7Ci8vIGFjdC5zYV9zaWdhY3Rpb24gPSBzaWdfaGFuZGxlcjI7Ci8vIHNpZ2VtcHR5c2V0KCZhY3Quc2FfbWFzayk7Ci8vIHNpZ2FjdGlvbihTSUdBTFJNLCZhY3QsTlVMTCk7Ci8vIC8vIHN0cnVjdCBpdGltZXJ2YWwgbmV3X3ZhbHVlOwovLyAvLyDorr7nva7lgLwKLy8gc3RydWN0IGl0aW1lcnZhbCBuZXdfdmFsdWU7Ci8vIG5ld192YWx1ZS5pdF9pbnRlcnZhbC50dl9zZWMgPSAyOwovLyBuZXdfdmFsdWUuaXRfaW50ZXJ2YWwudHZfdXNlYyA9MDsKLy8gbmV3X3ZhbHVlLml0X3ZhbHVlLnR2X3NlYz0yOwovLyBuZXdfdmFsdWUuaXRfdmFsdWUudHZfdXNlYz0wOwovLyBpbnQgcmV0ID0gc2V0aXRpbWVyKElUSU1FUl9SRUFMLCZuZXdfdmFsdWUsTlVMTCk7Ci8vIHdoaWxlKDEpewovLyAgICAgc2xlZXAoNSk7Ci8vIH0KLy8gcHRocmVhZF9jcmVhdGXlh73mlbAKLy8gICAgIOeUqOS6juWIm+W7uuS4gOS4quWtkOe6v+eoiwoKLy8g5LiA6Iis5oOF5Ya15LiL77yMbWFpbuWHveaVsOaJgOWcqOeahOWOv+WfjueahOS4uuS4u+WOv+WfjgovLyDlhbbkvZnliJvlu7rnmoTnjrDmiJDkuLrlrZDnur/nqIsKLy8g56iL5bqP5Lit6buY6K6k5Y+q5pyJ5LiA5Liq57q/56iL77yI5Li757q/56iL77yJCi8vIOiwg+eUqHB0aHJlYWRfY3JlYXRl5Yib5bu65LiA5Liq5paw55qE5Y6/5Z+OCi8vIHB0aGVyZV9kZXRhY2gKLy8gICAgIOWIhuemu+WOv+WfjgovLyAgICAg5aWL5Yqb5LiA5Liq5Y6/5Y6/5Z+O5bGCCi8vICAgICDooqvliIbnprvnmoTljr/ln47lnKjkuK3lgLzlvpfml7blgJnvvIzotYTmupDkvJroh6rliqjov5Tlm57nu5nns7vnu58KLy8gICAgIOS4jeiDveWkmuasoeWIhuemuwovLyAgICAg5ZCm5YiZ5Lya5Lqn55Sf5LiN5Y+v6aKE5paZ55qE6KGM5Li6Ci8vICAgICDkuI3og73ljrvov57mjqXkuIDkuKrlt7Lnu4/liIbnprvnmoTljr/ln44KLy8gICAgICAgICDlkKbliJnkvJrmiqXplJkKLy8gICAgIOWPguaVsO+8mgovLyAgICAgICAgIOWIhuimgeWIhuemu+eahOWOv+WfjmlkCi8vICAgICAgICAg5oiQ5Yqf6L+U5ZueMO+8jOWksei0pei/lOWbnumUmeivr+WPtwovLyDliJvlu7rkuIDkuKrmmL7miJDnhp/mgKcKLy8g5Yib5bu6NeS4queUn+S6p+iAhee6v+eoi++8jDXkuKrmtojotLnogIXnur/nqIsKLy8g5L2/55So6ZO+6KGo5p2l5a6e546w5a655ZmoCi8vIOS9v+eUqOS6kuaWpemHj+ino+WGs+WQjOatpemXrumimApwdGhyZWFkX211dGV4X3QgbXV0ZXh0OwovLyDliJvlu7rmnaHku7blj5jph48KcHRocmVhZF9jb25kX3QgY29uZDsKI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgovLyDliJvlu7rkuKTkuKrkv6Hlj7fph48Kc2VtX3QgcHNlbTsKc2VtX3QgY3NlbTsKc3RydWN0IE5vZGUgewogICAgaW50IG51bTsKICAgIHN0cnVjdCBOb2RlKiBuZXh0Owp9OwovLyDlpLToioLngrkKc3RydWN0IE5vZGUqIGhlYWQgPSBOVUxMOwoKdm9pZCogcHJvZHVjZXIgKHZvaWQqIGFyZykgewogICAgd2hpbGUoMSkgewogICAgICAgIC8vIOS4jeaWreWcsOWIm+W7uuaWsOeahOiKgueCueW5tua3u+WKoOWIsOmTvuihqOW9k+S4rQogICAgICAgIHNlbV93YWl0KCZwc2VtKTsKICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4KTsKICAgICAgICBzdHJ1Y3QgTm9kZSogbmV3X25vZGUgPSAoc3RydWN0IE5vZGUqKW1hbGxvYyhzaXplb2Yoc3RydWN0IE5vZGUpKTsKICAgICAgICBuZXdfbm9kZS0+bmV4dCA9IGhlYWQ7CiAgICAgICAgaGVhZCA9IG5ld19ub2RlOwogICAgICAgIG5ld19ub2RlLT5udW0gPSByYW5kKCkgJSAxMDAwOwogICAgICAgIHByaW50ZigiYWRkIG5vZGUsIG51bSAlZCwgdGlkOiAlbGRcbiIsIG5ld19ub2RlLT5udW0sIHB0aHJlYWRfc2VsZigpKTsKICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwogICAgICAgIC8vIOmAmuefpea2iOi0ueiAheeUn+S6p+WHuuS6huS4gOS4quS6p+WTgQogICAgICAgIHNlbV9wb3N0KCZjc2VtKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CnZvaWQqIGNvbnN1bWVyICh2b2lkKiBhcmcpIHsKICAgd2hpbGUoMSkgewogICAgICAgIHNlbV93YWl0KCZjc2VtKTsKICAgICAgICAgLy8g5L+d5a2Y5aS057uT54K555qE5oyH6ZKICiAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CiAgICAgICAgc3RydWN0IE5vZGUqIHRtcCA9IGhlYWQ7CiAgICAgICAgaGVhZCA9IGhlYWQtPm5leHQ7CiAgICAgICAgcHJpbnRmKCJkZWxldGUgbm9kZSwgbnVtOiAlZCwgdGlkOiAlbGRcbiIsIHRtcC0+bnVtLCBwdGhyZWFkX3NlbGYoKSk7CiAgICAgICAgZnJlZSh0bXApOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7CiAgICAgICAgLy8g6YCa55+l55Sf5Lqn6ICF5Y+v5Lul5YaN55Sf5Lqn5LiA5LiqCiAgICAgICAgc2VtX3Bvc3QoJnBzZW0pOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KI2luY2x1ZGU8YXJwYS9pbmV0Lmg+CiNpbmNsdWRlPGJpdHMvc29ja2V0Lmg+CnZvaWQgcmVjeWxlX2NoaWxkKGludCBhcmcpIHsKICAgIHdoaWxlKDEpIHsKICAgICAgICBpbnQgcmV0ID0gd2FpdHBpZCgtMSwgTlVMTCwgV05PSEFORyk7CiAgICAgICAgaWYgKC0xID09IHJldCkgewogICAgICAgICAgICAvLyDmiYDmnInnmoTlrZDov5vnqIvpg73lm57mlLblrozmr5UKICAgICAgICAgICAgcHJpbnRmKCLmiYDmnInnmoTlrZDov5vnqIvlm57mlLblrozmr5VcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CiAgICAgICAgICAgIC8vIOivtOaYjui/mOacieWtkOi/m+eoi+a0u+edgAogICAgICAgICAgICAvLyDnrYnlvoXkuIvkuIDmrKHkv6Hlj7fov5vmnaUKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CiAgICAgICAgICAgIC8vIOi/m+eoi+iiq+WbnuaUtuS6hgogICAgICAgICAgICBwcmludGYoIuWtkOi/m+eoiyVk6KKr5Zue5pS25LqGXG4iLCByZXQpOwogICAgICAgIH0KICAgIH0KfQojaW5jbHVkZTxlcnJuby5oPgojaW5jbHVkZTxjdHlwZS5oPgojaW5jbHVkZTxjdHlwZS5oPgojaW5jbHVkZTxjdHlwZS5oPgojaW5jbHVkZTxzeXMvc2VsZWN0Lmg+CiNpbmNsdWRlPHBvbGwuaD4KI2luY2x1ZGU8c3lzL2Vwb2xsLmg+CmludCBtYWluKCkKewoKICAgIC8vIHNlbmR0bwogICAgLy8gcmVjZWl2ZV9mcm9tCiAgICAvLyDliJvlu7pzb2NrZXQKICAgIGludCBmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKICAgIGlmICgtMSA9PSBmZCkgewogICAgICAgIHBlcnJvcigi6I2J5ouf5ZCXIik7CiAgICAgICAgZXhpdCgtMSk7CiAgICB9CiAgIAogICAgLy8gc2VuZHRvICAgIAogICAgc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOwogICAgc2FkZHIuc2luX2ZhbWlseSAgPUFGX0lORVQ7CiAgICBpbmV0X3B0b24oQUZfSU5FVCwgIjEyNy4wLjAuMSIsICZzYWRkci5zaW5fYWRkci5zX2FkZHIpOwogICAgc2FkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKICAgIHNhZGRyLnNpbl9wb3J0ID0gaHRvbnMoOTk5OSk7CiAgICBpbnQgbnVtID0gMDsKCiAgICBiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLHNpemVvZihzYWRkcikpOwoKICAgIC8vIOWKoOWFpeWIsOWkmuaSree7hAogICAgc3RydWN0IGlwX21yZXEgZnVja3lvdTsKICAgIAogICAgc3RydWN0IGluX2FkZHIgaW1yX211bHRpYWRkcjsKICAgIGluZXRfcHRvbihBRl9JTkVULCAiMjM5LjAuMC4xIiwgJmltcl9tdWx0aWFkZHIuc19hZGRyKTsKICAgIGZ1Y2t5b3UuaW1yX211bHRpYWRkciA9IGltcl9tdWx0aWFkZHI7CgogICAgc3RydWN0IGluX2FkZHIgaW1yX2ludGVyZmFjZTsKICAgIGluZXRfcHRvbihBRl9JTkVULCAiMTI3LjAuMC4xIiwgJmltcl9pbnRlcmZhY2Uuc19hZGRyKTsKICAgIGZ1Y2t5b3UuaW1yX2ludGVyZmFjZSA9IGltcl9pbnRlcmZhY2U7CgogICAgc2V0c29ja29wdChmZCwgSVBQUk9UT19JUCwgSVBfQUREX01FTUJFUlNISVAsICZmdWNreW91LCBzaXplb2YoZnVja3lvdSkpOwoKICAgIC8vIOmAmuS/oQogICAgd2hpbGUoMSkgewogICAgICAgICBjaGFyIHNlbmRidWZbMTI4XTsKICAgICAgICAvLyBzcHJpbnRmKHNlbmRidWYsICLmiJHmmK/lrqLmiLfnq6/ojYnkvaDlpojnmoQ6JWRcbiIsIG51bSsrKTsKICAgICAgICAvLyBzZW5kdG8oZmQsIHNlbmRidWYsIHN0cmxlbihzZW5kYnVmKSsxLCAwLCAoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCBzaXplb2Yoc2FkZHIpKTsKCiAgICAgICAgaW50IG51bTIgPSByZWN2ZnJvbShmZCwgc2VuZGJ1Ziwgc2l6ZW9mKHNlbmRidWYpLCAwLCBOVUxMLCBOVUxMKTsKICAgICAgICBpZiAoLTEgPT0gbnVtMikgewogICAgICAgICAgICBwZXJyb3IoIuiNieaLn+WQlyIpOwogICAgICAgICAgICBleGl0KC0xKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCLmjqXmlLbliLDnmoTmlbDmja7vvJolc1xuIiwgc2VuZGJ1Zik7CgogICAgICAgIC8vIHNsZWVwKDEpOwogICAgfQogICAgY2xvc2UoZmQpOwogICAgcmV0dXJuIDA7Cn0KICAgIC8vIGVwb2xs55qE5bel5L2c5qih5byPCiAgICAvLyBsdCAgbGV2ZWwgdHJpZ2dlciAg5rC05bmz6Kem5Y+R5qih5byPCiAgICAvLyBldCAgZWRnZSB0cmlnZ2VyIOi+uee8mOinpuWPkQogICAgLy8gbHTmqKHlvI/mmK/pu5jorqTnmoQKICAgIC8vIGV05piv6auY6YCf5bel5L2c5pa55byPCiAgICAvLyDliY3ogIXkvJrkuIDnm7TpgJrnn6XvvIzlkI7ogIXlj6rkvJrpgJrnn6XkuIDmrKHvvIzlpoLmnpzkvaDnvJPlhrLljLrph4zpnaLnmoTmlbDmja7msqHor7vlrozvvIzkuZ/kuI3kvJrlho3pgJrnn6XkuoYKICAgIC8vIOWQjuiAheavlOi+g+mrmOaViO+8jOS9huaYr+mcgOimgeino+WGs3JlYWTpmLvloZ7nmoTpl67popgKCiAgICAKICAgIC8qKgogKiBlcG9sbOeahOWOn+eQhgogKiBlcG9sbF9jcmVhdGUoKeWHveaVsOS8muWcqOWGheaguOWMuuWIhumFjeS4gOWdl+WGheWtmAogKiBlcG9sbC0+ZXZlbnQgcG9sbAogKiDov5Tlm57lgLzmmK/kuIDkuKrmlofku7bmj4/ov7DnrKYKICogc3RydWN0IGV2ZW50cG9sbCB7CiAqICAuLi4KICogIHN0cnVjdCByYl9yb290IHJicjsgLy/nuqLpu5HmoJEKICogIHN0cnVjdCBsaXN0X2hlYWQgcmRsaXN0OyAvLyByZWFkeSBsaXN0CiAqICAuLi4KICogfQogKiDnm7TmjqXmk43kvZzlhoXmoLjmgIHnmoTmlbDmja7vvIzkuI3nlKjku47nlKjmiLfmgIHlkozlhoXmoLjmgIHmnaXlm57liIfmjaLkuoYKICogCiAqIGVwb2xsY3RsIAogKiAKICog55u05o6l5Zyo5YaF5qC45Lit5byA6L6f5LiA5Z2X5YaF5a2Y77yM5bCx5LiN55So5p2l5Zue5YiH5o2i5LqGCiAqIOaPkOmrmOaViOeOhwogKiDnuqLpu5HmoJEgICDkuIDnp43pq5jmlYjnmoTmlbDmja7nu5PmnoQKICogCiAqIOS5i+WJjeaYr+e6v+aAp+aVsOe7hOe7k+aehO+8jOeOsOWcqOaYr+e6oum7keagkee7k+aehAogKiAKICogZXBvbGxfY3RsKGVwZmQsIEVQT0xMX0NUTF9BREQsIGxmZCwgJmV2KTsKICogCiAqIOesrOS4gOS4quWPguaVsOaYr2NyZWF0ZeaWueazleeahOi/lOWbnuWAvAogKiBFUE9MTF9DVExfQUREIOihqOekuui/m+ihjOa3u+WKoOaTjeS9nAogKiBsZmTmmK/opoHmo4DmtYvnmoTmj4/ov7DnrKYKICog56ys5Zub5Liq5Y+C5pWwZXbvvIzlp5TmiZjlhoXmoLjmo4DmtYvnmoTkuovku7YKICogCiAqIHN0cnVjdCBlcG9sbF9ldmVudCBldjsKICogZXYuZXZlbnRzID0gRVBPTExJTiAvLyDor7vkuovku7YKICogZXYuZGF0YS5mZCA9IGxmZCAvLyDopoHmo4DmtYvnmoTmlofku7bmj4/ov7DnrKbnmoTmjIcKICogCiAqIGVwb2xsX3dhaXQoZXBmZCkgLy8g6K+l5pa55rOV5Lya5bCGcmRsaXN05Lit55qE5pWw5o2u5ou36LSd5Zue55So5oi35oCBCiAqIGZvciAoKXsKICogIAogKiB9CiAqIAogKiDnm7TmjqXpgY3ljobov5Tlm57nmoTmlbDmja7lsLHooYzkuobvvIzov5Tlm57nmoTnu5PmnpzmmK/lhbfkvZPlk6rlh6DkuKroioLngrnnmoTnirbmgIHlj5HnlJ/kuobmlLnlj5gKICogCiAqIHJkbGlzdOaYr+S4gOS4quWPjOmTvuihqAogKiAKICogCiAqIAogKi8KLy8g5Yib5bu65LiA5Liq5paw55qEZXBvbGzlrp7kvovvvIzlnKjlhoXmoLjkuK3liJvlu7rkuIDkuKrmlbDmja7vvIzov5nkuKrkuK3mnInkuKTkuKrmr5TovoPph43opoHnmoTmiJDlkZgKLy8g5LiA5Liq5piv6ZyA6KaB5qOA5rWL5paH5Lu25o+P6L+w56ym55qE5pWw5o2u77yI57qi6buR5qCR77yJ77yM5Y+m5LiA5Liq5piv5bCx5bqP5YiX6KGo77yM55So5LqO5a2Y5pS+5pWw5o2u5Y+R55Sf5pS55Y+Y55qE5paH5Lu25o+P6L+w56ym6ZuG5ZCI77yI5Y+M5ZCR6ZO+6KGo77yJCgovLyDlj4LmlbAgc2l6ZSDnm67liY3or6Xlj4LmlbDmmK/msqHmnInmhI/kuYnnmoTvvIzpmo/kvr/lhpnkuIDkuKrmlbDlsLHooYzvvIjpnZ4w77yJCgovLyDov5Tlm57lgLwgICA+MCDooajnpLrmlofku7bmj4/ov7DnrKbvvIzmmK/nlKjkuo7mk43kvZxlcG9sbOWunuS+i+eahCAgICAg5aSx6LSl6L+U5ZueLTEKCgoKLy8gIGludCByZXQgPSBlcG9sbF9jcmVhdGUoaW50IHNpemUpOwovLyDlr7llcG9sbOWunuS+i+i/m+ihjOeuoeeQhgovLyBlcG9sbF9jdGzvvIhpbnQgZXBmZCwgaW50IG9wLCBpbnQgZmQgLCBzdHJ1Y3QgZXBvbGxfZW5ldnQqIGV2ZW5077yJCi8vIGVwb2xsX2N0bF9hZGQgIGVwb2xsX2N0bF9tb2QgICBlcG9sbF9jdGxfZGVsCi8vIGZkICDluLjop4HnmoRlcG9sbOajgOa1i+S6i+S7tiAgIGVwb2xsSU4gIGVwb2xsb3V0IGVwb2xsZXJyCi8vIGVwb2xsX2N0bCAgIOa3u+WKoOaWh+S7tuaPj+i/sOespuS/oeaBryAgIOWIoOmZpCAg5L+u5pS5562J55qECi8vIOS/ruaUue+8jOWPr+S7peS/ruaUueimgeajgOa1i+eahOS6i+S7tu+8jOavlOWmguS7peWJjeimgeajgOa1i+ivu++8jOaIkeS7rOWPr+S7peS/ruaUueS4uuajgOa1i+WGmQogICAgLy8gCiAgICAKICAgIC8vIOajgOa1i+WHveaVsAogICAgLy8gZXBvbGzigJTigJR3YWl077yJ77yIaW50IGVwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCAqZXZlbnRzLCBpbnQgbWF4ZXZlbnRzLCBpbnQgdGltZW91dHPvvInigJQKICAgIC8vZXBmZCAgICAgICBlcG9sbOWunuS+i+WvueW6lOeahOaWh+S7tuaPj+i/sOespgovLyBldmVudHPkvKDlh7rlj4LmlbAgICDvvIzph4zpnaLkv53lrZjnmoTmnInlj5HnlJ/kuoblj5jljJbnmoTmlofku7bmj4/ov7DnrKbkv6Hmga/vvIjlk6rlh6DkuKrlj5HnlJ/kuoblj5jljJbvvIzlsLHov5Tlm57lk6rlh6DkuKrvvIkKLy8gbWF4ZXZlbnRzICAg56ys5LqM5Liq5Y+C5pWw57uT5p6E5L2T5pWw57uE55qE5aSn5bCPCi8vIHRpbWVvdXTpmLvloZ7ml7bpl7QgICAgIDDooajnpLrkuI3pmLvloZ7jgIItMeihqOekuumYu+WhniAgIOebtOWIsOajgOa1i+WIsGZk5pWw5o2u5Y+R55Sf5Y+Y5YyWICDlsLHkvJrop6PpmaTpmLvloZ4KCi8vICDjgIswIOihqOekuumYu+WhnueahOaXtumVv++8iOWNleS9jeaYr+avq+enku+8iQovLyDov5Tlm57lgLzvvIzov5Tlm57lj5HnlJ/lj5jljJbnmoTmlofku7bmj4/ov7DnrKbnmoTkuKrmlbAKCgovLyAvLyAKLy8gLy8gIOWIm+W7unNvY2tldAovLyAgICAgaW50IGxmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci8vICAgICBpZiAoLTEgPT0gbGZkKSB7Ci8vIAkJcGVycm9yKCJzb2NrZXQiKTsKLy8gICAgICAgICBleGl0KC0xKTsKLy8gICAgIH0KCi8vICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyX2FkZHI7Ci8vICAgICBzZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLy8gICAgIHNlcnZlcl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7Ci8vICAgICBzZXJ2ZXJfYWRkci5zaW5fcG9ydCA9IGh0b25zKDk5OTkpOwoKLy8gICAgIC8vIGludCBvcHRfdmFsID0gMTsKLy8gICAgIC8vIHNldHNvY2tvcHQobGZkLCBTT0xfU09DS0VULCBTT19SRVVTRVBPUlQsICZvcHRfdmFsLCBzaXplb2Yob3B0X3ZhbCkpOwovLyAgICAgLy8g57uR5a6aCi8vICAgICBpbnQgcmV0ID0gYmluZChsZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzZXJ2ZXJfYWRkciwgc2l6ZW9mKHNlcnZlcl9hZGRyKSk7Ci8vICAgICBpZiAoLTEgPT0gcmV0KSB7Ci8vICAgICAgICAgcGVycm9yKCJiaW5kIik7Ci8vICAgICAgICAgZXhpdCgtMSk7Ci8vICAgICB9Ci8vIAkvLyDnm5HlkKwKLy8gICAgIHJldCA9IGxpc3RlbihsZmQsIDEyOCk7Ci8vICAgICBpZiAoLTEgPT0gcmV0KSB7Ci8vICAgICAgICAgcGVycm9yKCJsaXN0ZW4iKTsKLy8gICAgICAgICBleGl0KC0xKTsKLy8gICAgIH0gCgovLyAgICAgLy8g6LCD55SoZXBvbGxfY3JlYXRlKCnliJvlu7rkuIDkuKplcG9sbOWunuS+iwovLyAgICAgaW50IGVwZmQgPSBlcG9sbF9jcmVhdGUoMTAwKTsKLy8gICAgIC8vIOWwhuebkeWQrOeahOaWh+S7tuaPj+i/sOespuebuOWFs+S/oeaBr+a3u+WKoOWIsGVwb2xs5a6e5L6L5b2T5LitCi8vICAgICBzdHJ1Y3QgIGVwb2xsX2V2ZW50IGVwZXY7Ci8vICAgICBlcGV2LmV2ZW50cyA9IEVQT0xMSU47Ci8vICAgICBlcGV2LmRhdGEuZmQgPSBsZmQ7CiAgICAKLy8gICAgIGVwb2xsX2N0bChlcGZkLCBFUE9MTF9DVExfQURELCBsZmQsICZlcGV2KTsKCiAgICAKLy8gICAgIHN0cnVjdCAgZXBvbGxfZXZlbnQgZXBldnNbMTAyNF0gPSB7MH07CgovLyAgICAgd2hpbGUoMSl7Ci8vICAgICAgICAgcHJpbnRmKCLov5Tlm57lvqrnjq9cbiIpOwovLyAgICAgICAgIC8vIOiwg+eUqGVwb2xs4oCU4oCUd2F0aeajgOa1i+aWh+S7tuaPj+i/sOespueahOWPmOWMlgovLyAgICAgICAgIGludCB0cmV0dCA9ZXBvbGxfd2FpdChlcGZkLCBlcGV2cywxMDI0LC0xKTsKLy8gICAgICAgICBpZiAoLTEgPT10cmV0dCkgewovLyAgICAgICAgICAgICBwZXJyb3IoImVwb2xsX3dhaXQiKTsKLy8gICAgICAgICAgICAgZXhpdCgtMSk7Ci8vICAgICAgICAgfQoKLy8gICAgICAgICAvLyDlj5HnlJ/mlLnlj5jnmoTkuKrmlbAKLy8gICAgICAgICBwcmludGYoImVwb2xsX3dhaXTlh73mlbDnmoTov5Tlm57lgLwgcmV0ID0gJWRcbiIsIHRyZXR0KTsKLy8gICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyZXR0OyBpKyspCi8vICAgICAgICAgeyAgIAovLyAgICAgICAgICAgICBpbnQgY3VyZmQgPSBlcGV2c1tpXS5kYXRhLmZkOwoKLy8gICAgICAgICAgICAgaWYoY3VyZmQ9PWxmZCkgewovLyAgICAgICAgICAgICAgICAgLy8g6KGo56S65pyJ5paw55qE5a6i5oi356uv6L+e5o6l6L+b5p2l5LqG77yIbGlzdGVu55qEbGZk77yJCi8vICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gY2xpZW50X2FkZHI7Ci8vICAgICAgICAgICAgICAgICBpbnQgbGVuID0gc2l6ZW9mKGNsaWVudF9hZGRyKTsKLy8gICAgICAgICAgICAgICAgIGludCBjZmQgPSBhY2NlcHQobGZkLCAoc3RydWN0IHNvY2thZGRyKikmY2xpZW50X2FkZHIsICZsZW4pOwovLyAgICAgICAgICAgICAgICAgcHJpbnRmKCLmlrDnmoTlrqLmiLfnq6/ov5vmnaXkuoZcbiIpOwovLyAgICAgICAgICAgICAgICAgY2hhciBjbGllbnRfaXBbMTZdOwovLyAgICAgICAgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQsICZjbGllbnRfYWRkci5zaW5fYWRkci5zX2FkZHIsIGNsaWVudF9pcCwgc2l6ZW9mKGNsaWVudF9pcCkpOwovLyAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgY2xpZW50X3BvcnQgPSBudG9ocyhjbGllbnRfYWRkci5zaW5fcG9ydCk7Ci8vICAgICAgICAgICAgICAgICBwcmludGYoIuWuouaIt+err0lQ77yaJXNcbuerr+WPo++8miVkXG4iLCBjbGllbnRfaXAsIGNsaWVudF9wb3J0KTsKLy8gICAgICAgICAgICAgICAgIGlmICgtMSA9PSBjZmQpIHsKLy8gICAgICAgICAgICAgICAgICAgICBpZiAoRUlOVFIgPT0gZXJybm8gKSB7Ci8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwovLyAgICAgICAgICAgICAgICAgICAgIH0KLy8gICAgICAgICAgICAgICAgICAgICBwZXJyb3IoImFjY2VwdCIpOwovLyAgICAgICAgICAgICAgICAgICAgIGV4aXQoLTEpOwovLyAgICAgICAgICAgICAgICAgfQovLyAgICAgICAgICAgICAgICAgLy8g6L+95Yqg5paH5Lu25o+P6L+w56ymCi8vICAgICAgICAgICAgICAgICBlcGV2LmV2ZW50cz1FUE9MTElOfEVQT0xMRVQ7Ci8vICAgICAgICAgICAgICAgICBlcGV2LmRhdGEuZmQ9Y2ZkOwovLyAgICAgICAgICAgICAgICAgZXBvbGxfY3RsKGVwZmQsIEVQT0xMX0NUTF9BREQsY2ZkLCZlcGV2KTsKLy8gICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIAovLyAgICAgICAgICAgICAgICAgaWYgKGVwZXZzW2ldLmV2ZW50cyAmRVBPTExPVVQpIGNvbnRpbnVlOwovLyAgICAgICAgICAgICAgICAgLy8g5pyJ5pWw5o2u5Yiw6L6+Ci8vICAgICAgICAgICAgICAgICBwcmludGYoIuacieaVsOaNrui/m+adpVxuIik7Ci8vICAgICAgICAgICAgICAgICAvLyDor7TmmI7ov5nkuKrmlofku7bmj4/ov7DnrKblr7nlupTnmoTnvJPlhrLljLrmnaXmlbDmja7kuoYKLy8gICAgICAgICAgICAgICAgIC8vIOS4gOasoeWPquiDveivu+WPljXkuKrlrZfoioLnmoTmlbDmja4KLy8gICAgICAgICAgICAgICAgIC8vIOS4jeefpemBk+S4uuWVpeOAguS7luaAu+aYr+WQp+S5i+WJjei+k+WHuueahOWuouaIt+err0lQ5byE5YiwYnVm57yT5Yay5Yy65Lit77yM5Zug5q2k5oiR5Y+q5aW95aSa5Yid5aeL5YyW5LiA5Liq5a2X6IqCCi8vICAgICAgICAgICAgICAgICAvLyDov5nmoLflsLHkuI3kvJror7vliLDlpJrkvZnnmoTmlbDmja7kuoYKLy8gICAgICAgICAgICAgICAgIGNoYXIgYnVmd2FlaHJzdGVkeXJ0ZWRzWzZdPXswfTsKLy8gICAgICAgICAgICAgICAgIC8vIHByaW50Zigi5Yid5aeL55qEYnVmd2FlaHJzdGVkeXJ0ZWRzJXNcbiIsYnVmd2FlaHJzdGVkeXJ0ZWRzKTsKLy8gICAgICAgICAgICAgICAgIC8vIHByaW50Zigi57yT5Yay5Yy655qE6ZW/5bqmJWxkXG4iLHN0cmxlbihidWZ3YWVocnN0ZWR5cnRlZHMpKTsKICAgICAgICAgICAgICAgCi8vICAgICAgICAgICAgICAgICBpbnQgbGVuID0gcmVhZChjdXJmZCwgYnVmd2FlaHJzdGVkeXJ0ZWRzLCA1KTsKLy8gICAgICAgICAgICAgICAgIGlmICgtMSA9PSBsZW4pIHsKLy8gICAgICAgICAgICAgICAgICAgICBwZXJyb3IoInJlYWQiKTsKLy8gICAgICAgICAgICAgICAgICAgICBleGl0KC0xKTsKLy8gICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoMCA9PSBsZW4pIHsKLy8gICAgICAgICAgICAgICAgICAgICBwcmludGYoIuWuouaIt+err+aWreW8gOi/nuaOpeS6hlxuIik7Ci8vICAgICAgICAgICAgICAgICAvLyDliKDpmaTlrqLmiLfnq6/lr7nlupTnmoTmlofku7bmj4/ov7DnrKYKLy8gICAgICAgICAgICAgICAgICAgICBlcG9sbF9jdGwoZXBmZCwgRVBPTExfQ1RMX0RFTCxjdXJmZCxOVUxMKTsKLy8gICAgICAgICAgICAgICAgICAgICBjbG9zZShjdXJmZCk7Ci8vICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA+IDApIHsKLy8gICAgICAgICAgICAgICAgICAgICAvLyBwcmludGYoIuivu+WPluWIsOaVsOaNru+8miVzXG4iLCBidWZ3YWVocnN0ZWR5cnRlZHMpOwovLyAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlKGN1cmZkLCBidWZ3YWVocnN0ZWR5cnRlZHMsIDUpOwovLyAgICAgICAgICAgICAgICAgICAgIC8vIOW+queOr+ivu+WPluWHuue8k+WGsuWMuuS4reeahOaJgOacieaVsOaNrgogICAgICAgICAgICAgICAgICAgIAovLyAgICAgICAgICAgICAgICAgfQovLyAgICAgICAgICAgICB9Ci8vICAgICAgICAgfQovLyAgICAgfQovLyAgICAgY2xvc2UobGZkKTsKLy8gICAgIGNsb3NlKGVwZmQpOwovLyAgICAgcmV0dXJuIDA7ICAgCi8vIH0KLy8gLy8gICAgIC8vIOazqOWGjOS/oeWPt+aNleaNie+8jOeUqOS6juWbnuaUtuWtkOi/m+eoiwovLyAvLyAgICAgc3RydWN0IHNpZ2FjdGlvbiBhY3Q7Ci8vIC8vICAgICBhY3Quc2FfZmxhZ3M9MDsKLy8gLy8gICAgIGFjdC5zYV9zaWdhY3Rpb24gPSByZWN5bGVfY2hpbGQ7Ci8vIC8vICAgICBzaWdlbXB0eXNldCgmYWN0LnNhX21hc2spOwogICAgCi8vIC8vICAgICBzaWdhY3Rpb24oU0lHQ0hMRCwgJmFjdCwgTlVMTCk7CgoKLy8gLy8gICAgIC8vIFRDUOmAmuS/oeacjeWKoeWZqOeahOW5tuWPkQovLyAvLyAgICAgLy8g5L2/55So5aSa57q/56iL5oiW6ICF5aSa6L+b56iL6Kej5YazCi8vIC8vICAgICAvLyDkuIDkuKrniLbov5vnqIvvvIzlpJrkuKrlrZDov5vnqIsKLy8gLy8gICAgIC8vIOeItui/m+eoi+eUqOS6juaOpeaUtuWuouaIt+err+i/nuaOpe+8iOW+queOr++8iQovLyAvLyAgICAgLy8g5a2Q6L+b56iL55So5LqO6YCa5L+h77yM5q+P5o6l5pS25LiA5Liq6L+e5o6l77yM5bCx5Yib5bu65LiA5Liq5a2Q6L+b56iLCiAgICAKLy8gLy8gICAgIC8vIOWIm+W7unNvY2tldAovLyAvLyAgICAgaW50IGxmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci8vIC8vICAgICBpZiAoLTEgPT0gbGZkKSB7Ci8vIC8vIAkJcGVycm9yKCJzb2NrZXQiKTsKLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gICAgIH0KCi8vIC8vICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyX2FkZHI7Ci8vIC8vICAgICBzZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLy8gLy8gICAgIHNlcnZlcl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7Ci8vIC8vICAgICBzZXJ2ZXJfYWRkci5zaW5fcG9ydCA9IGh0b25zKDk5OTkpOwoKLy8gLy8gICAgIC8vIGludCBvcHRfdmFsID0gMTsKLy8gLy8gICAgIC8vIHNldHNvY2tvcHQobGZkLCBTT0xfU09DS0VULCBTT19SRVVTRVBPUlQsICZvcHRfdmFsLCBzaXplb2Yob3B0X3ZhbCkpOwovLyAvLyAgICAgLy8g57uR5a6aCi8vIC8vICAgICBpbnQgcmV0ID0gYmluZChsZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzZXJ2ZXJfYWRkciwgc2l6ZW9mKHNlcnZlcl9hZGRyKSk7Ci8vIC8vICAgICBpZiAoLTEgPT0gcmV0KSB7Ci8vIC8vICAgICAgICAgcGVycm9yKCJiaW5kIik7Ci8vIC8vICAgICAgICAgZXhpdCgtMSk7Ci8vIC8vICAgICB9Ci8vIC8vIAkvLyDnm5HlkKwKLy8gLy8gICAgIHJldCA9IGxpc3RlbihsZmQsIDEyOCk7Ci8vIC8vICAgICBpZiAoLTEgPT0gcmV0KSB7Ci8vIC8vICAgICAgICAgcGVycm9yKCJsaXN0ZW4iKTsKLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gICAgIH0gCi8vIC8vICAgICAvLyBmZF9zZXQgcmVhZF9zZXQsIHRtcDsKLy8gLy8gICAgIC8vIEZEX1pFUk8oJnJlYWRfc2V0KTsKLy8gLy8gICAgIC8vIEZEX1NFVChsZmQsICZyZWFkX3NldCk7Ci8vIC8vICAgICAvLyBpbnQgbWF4X2ZkID0gbGZkOwovLyAvLyAgICAgLy8g5Yid5aeL5YyW5qOA5rWL55qE5paH5Lu25o+P6L+w56ym5pWw57uECi8vIC8vICAgICBzdHJ1Y3QgcG9sbGZkIGZkc1sxMDI0XTsKLy8gLy8gICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTAyNDsgaSsrKQovLyAvLyAgICAgewovLyAvLyAgICAgICAgIGZkc1tpXS5mZCA9IC0xOwovLyAvLyAgICAgICAgIGZkc1tpXS5ldmVudHMgPSBQT0xMSU47Ci8vIC8vICAgICB9Ci8vIC8vICAgICBmZHNbMF0uZmQgPSBsZmQ7Ci8vIC8vICAgICBpbnQgbmZkcyA9IDEwMjM7CgovLyAvLyAgICAgcHJpbnRmKCLnrYnlvoXlrqLmiLfnq6/ov57mjqUuLi5cbiIpOwovLyAvLyAgICAgLy8g5b6q546v562J5b6F5a6i5oi356uv6L+e5o6lCi8vIC8vICAgICB3aGlsZSgxKSB7Ci8vIC8vICAgICAgICAgLy8g6YG/5YWN5YaF5qC45L+u5pS55oiR5Lus55qE5Y6f5aeL5paH5Lu25o+P6L+w56ym5YiX6KGoCi8vIC8vICAgICAgICAgLy8gdG1wID0gcmVhZF9zZXQ7Ci8vIC8vICAgICAgICAgaW50IHJldCA9IHBvbGwoZmRzLCBuZmRzKzEsIC0xKTsKICAgICAgICAKLy8gLy8gICAgICAgICAvLyDmjqXlj5fov57mjqUKLy8gLy8gICAgICAgICAvLyDorr7nva5zZWxlY3TmsLjkuYXpmLvloZ7vvIzkuI3mo4DmtYvliLDmlofku7bmj4/ov7DnrKbnmoTlj5jljJblsLHkuI3kvJrov5Tlm54KLy8gLy8gICAgICAgICAvLyBpbnQgc2VsZWN0X3JldCA9IHNlbGVjdChtYXhfZmQrMSwgJnRtcCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci8vIC8vICAgICAgICAgaWYgKC0xID09IHJldCkgewovLyAvLyAgICAgICAgICAgICBwZXJyb3IoInBvbGwiKTsKLy8gLy8gICAgICAgICAgICAgZXhpdCgtMSk7Ci8vIC8vICAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gMCkgewovLyAvLyAgICAgICAgICAgICBjb250aW51ZTsKLy8gLy8gICAgICAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKICAgICAgICAgIAovLyAvLyAgICAgICAgICAgICAgICAgLy8g6K+05piO5qOA5rWL5Yiw5LqG5pyJ5paH5Lu25o+P6L+w56ym5a+55bqU55qE57yT5Yay5Yy655qE5pWw5o2u5Y+R55Sf5LqG5pS55Y+YCi8vIC8vICAgICAgICAgICAgICAgICAvLyDov5Tlm57nmoTmmK/lj5HnlJ/mlLnlj5jnmoTmlofku7bmj4/ov7DnrKbnmoTmlbDph4/vvIzmiJHku6zov5jpnIDopoHlho3ljrvpgY3ljobkuIDpgY3mnaXliKTmlq3lhbfkvZPmmK/lk6rkupvmlofku7bmj4/ov7DnrKblj5HnlJ/kuobmlLnlj5gKLy8gLy8gICAgICAgICAgICAgICAgIGlmIChmZHNbMF0ucmV2ZW50cyAmIFBPTExJTikgewovLyAvLyAgICAgICAgICAgICAgICAgICAgIC8vIOihqOekuuacieaWsOeahOWuouaIt+err+i/nuaOpei/m+adpeS6hu+8iGxpc3RlbueahGxmZO+8iQovLyAvLyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBjbGllbnRfYWRkcjsKLy8gLy8gICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gc2l6ZW9mKGNsaWVudF9hZGRyKTsKLy8gLy8gICAgICAgICAgICAgICAgICAgICBpbnQgY2ZkID0gYWNjZXB0KGZkc1swXS5mZCwgKHN0cnVjdCBzb2NrYWRkciopJmNsaWVudF9hZGRyLCAmbGVuKTsKLy8gLy8gICAgICAgICAgICAgICAgICAgICBwcmludGYoIuaWsOeahOWuouaIt+err+i/m+adpeS6hlxuIik7Ci8vIC8vICAgICAgICAgICAgICAgICAgICAgY2hhciBjbGllbnRfaXBbMTZdOwovLyAvLyAgICAgICAgICAgICAgICAgICAgIGluZXRfbnRvcChBRl9JTkVULCAmY2xpZW50X2FkZHIuc2luX2FkZHIuc19hZGRyLCBjbGllbnRfaXAsIHNpemVvZihjbGllbnRfaXApKTsKLy8gLy8gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBjbGllbnRfcG9ydCA9IG50b2hzKGNsaWVudF9hZGRyLnNpbl9wb3J0KTsKLy8gLy8gICAgICAgICAgICAgICAgICAgICBwcmludGYoIuWuouaIt+err0lQ77yaJXNcbuerr+WPo++8miVkXG4iLCBjbGllbnRfaXAsIGNsaWVudF9wb3J0KTsKLy8gLy8gICAgICAgICAgICAgICAgICAgICBpZiAoLTEgPT0gY2ZkKSB7Ci8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFSU5UUiA9PSBlcnJubyApIHsKLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwovLyAvLyAgICAgICAgICAgICAgICAgICAgICAgICB9Ci8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnJvcigiYWNjZXB0Iik7Ci8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoLTEpOwovLyAvLyAgICAgICAgICAgICAgICAgICAgIH0KLy8gLy8gICAgICAgICAgICAgICAgICAgICAvLyDlsIbmlrDnmoTmlofku7bmj4/ov7DnrKbliqDlhaXliLDpm4blkIjkuK0KLy8gLy8gICAgICAgICAgICAgICAgICAgICAvLyBhY2NlcHTlh73mlbDov5Tlm57nmoTmlofku7bmj4/ov7DnrKYKLy8gLy8gICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwMjQ7IGkrKykKLy8gLy8gICAgICAgICAgICAgICAgICAgICB7Ci8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZHNbaV0uZmQgPT0gLTEpIHsKLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkc1tpXS5mZCA9IGNmZDsKLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkc1tpXS5ldmVudHMgPSBQT0xMSU47Ci8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIAovLyAvLyAgICAgICAgICAgICAgICAgICAgICAgICB9Ci8vIC8vICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAovLyAvLyAgICAgICAgICAgICAgICAgfQovLyAvLyAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCAxMDI0OyBpKyspCi8vIC8vICAgICAgICAgICAgICAgICB7Ci8vIC8vICAgICAgICAgICAgICAgICAgICAgLy8g5Yik5pat6K+l5paH5Lu25o+P6L+w56ym5piv5ZCm5Li6MQovLyAvLyAgICAgICAgICAgICAgICAgICAgIGlmIChmZHNbaV0ucmV2ZW50cyAmIFBPTExJTikgewovLyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAvLyDor7TmmI7ov5nkuKrmlofku7bmj4/ov7DnrKblr7nlupTnmoTnvJPlhrLljLrmnaXmlbDmja7kuoYKLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBidWZ3YWVocnN0ZWR5cnRlZHNbMTAyNF0gPSB7MH07Ci8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSByZWFkKGZkc1tpXS5mZCwgYnVmd2FlaHJzdGVkeXJ0ZWRzLCA1KTsKLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0xID09IGxlbikgewovLyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVycm9yKCJyZWFkIik7Ci8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KC0xKTsKLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgwID09IGxlbikgewovLyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCLlrqLmiLfnq6/mlq3lvIDov57mjqXkuoZcbiIpOwovLyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoZmRzW2ldLmZkKTsKLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkc1tpXS5mZCA9IC0xOwovLyAvLyAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA+IDApIHsKLy8gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigi6K+75Y+W5Yiw5pWw5o2u77yaJXNcbiIsIGJ1ZndhZWhyc3RlZHlydGVkcyk7Ci8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZShmZHNbaV0uZmQsIGJ1ZndhZWhyc3RlZHlydGVkcywgc3RybGVuKGJ1ZndhZWhyc3RlZHlydGVkcykrMSk7Ci8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgIH0KLy8gLy8gICAgICAgICAgICAgICAgICAgICB9Ci8vIC8vICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAKLy8gLy8gICAgICAgICB9CgovLyAvLyAgICAgfQovLyAvLyAgICAgY2xvc2UobGZkKTsKLy8gLy8gICAgIHJldHVybiAwOwovLyAvLyB9CgoKLy8gLy8gLy8gICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gY2xpYWRkcjsKLy8gLy8gLy8gICAgICAgICBpbnQgbGVuID0gc2l6ZW9mKGNsaWFkZHIpOwovLyAvLyAvLyAgICAgICAgIC8vIOeUseS6juWtkOi/m+eoi+eahOWbnuaUtuS6p+eUn+S6huS4gOS4qui9r+S4reaWre+8jOWvvOiHtGFjY3BldOWHuumUme+8jOmUmeivr+WPt+S4ukVJTlRSCi8vIC8vIC8vICAgICAgICAgaW50IGNmZCA9IGFjY2VwdChsZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZjbGlhZGRyLCAmbGVuKTsKLy8gLy8gLy8gCQlpZiAoLTEgPT0gY2ZkKSB7Ci8vIC8vIC8vICAgICAgICAgICAgIGlmIChFSU5UUiA9PSBlcnJubyApIHsKLy8gLy8gLy8gICAgICAgICAgICAgICAgIGNvbnRpbnVlOwovLyAvLyAvLyAgICAgICAgICAgICB9Ci8vIC8vIC8vICAgICAgICAJCXBlcnJvcigiYWNjZXB0Iik7Ci8vIC8vIC8vICAgICAgICAgCWV4aXQoLTEpOwovLyAvLyAvLyAgICAgCX0KLy8gLy8gLy8gICAgICAgICAvLyDmr4/kuIDkuKrov57mjqXov5vmnaXvvIzlsLHliJvlu7rlh7rkuIDkuKrlrZDov5vnqIvmnaXlkozlrqLmiLfnq6/ov5vooYzpgJrkv6EKLy8gLy8gLy8gICAgICAgICBwaWRfdCBwaWQgPSBmb3JrKCk7Ci8vIC8vIC8vICAgICAgICAgaWYgKDAgPT0gcGlkKSB7Ci8vIC8vIC8vICAgICAgICAgICAgIC8vIOWtkOi/m+eoiwovLyAvLyAvLyAgICAgICAgICAgICAvLyDojrflj5blrqLmiLfnq6/kv6Hmga8KLy8gLy8gLy8gICAgICAgICAgICAgY2hhciBjbGllbnRfaXBbMTZdOwovLyAvLyAvLyAJCQlpbmV0X250b3AoQUZfSU5FVCwgJmNsaWFkZHIuc2luX2FkZHIuc19hZGRyLCBjbGllbnRfaXAsIHNpemVvZihjbGllbnRfaXApKTsKLy8gLy8gLy8gCQkJdW5zaWduZWQgc2hvcnQgY2xpZW50X3BvcnQgPSBudG9ocyhjbGlhZGRyLnNpbl9wb3J0KTsKLy8gLy8gLy8gICAgICAgICAgICAgcHJpbnRmKCLlrqLmiLfnq69JUO+8miVzXG7lrqLmiLfnq69QT1JU77yaJWRcbiIsIGNsaWVudF9pcCwgY2xpZW50X3BvcnQpOwovLyAvLyAvLyAgICAgICAgICAgICAvLyDmjqXmlLblrqLmiLfnq6/lj5HmnaXnmoTmlbDmja4KLy8gLy8gLy8gICAgICAgICAgICAgY2hhciByZWN2X2J1ZndhZWhyc3RlZHlydGVkc1sxMDI0XTsKLy8gLy8gLy8gICAgICAgICAgICAgd2hpbGUoMSkgewogICAgICAgICAgICAgICAgCi8vIC8vIC8vICAgICAgICAgICAgICAgICBpbnQgbGVuID0gcmVjdihjZmQsIHJlY3ZfYnVmd2FlaHJzdGVkeXJ0ZWRzLCBzaXplb2YocmVjdl9idWZ3YWVocnN0ZWR5cnRlZHMpLCAwKTsKLy8gLy8gLy8gICAgICAgICAgICAgICAgIGlmICgtMSA9PSBsZW4pIHsKLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBwZXJyb3IoInJlYWQiKTsKLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuID4gMCkgewovLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgIHByaW50Zigi5o6l5pS25Yiw5pWw5o2u77yaJXNcbiIsIHJlY3ZfYnVmd2FlaHJzdGVkeXJ0ZWRzKTsKLy8gLy8gLy8gICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoMCA9PSBsZW4pIHsKLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBwcmludGYoIuWuouaIt+err+aWreW8gOi/nuaOpVxuIik7Ci8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci8vIC8vIC8vICAgICAgICAgICAgICAgICB9Ci8vIC8vIC8vICAgICAgICAgICAgICAgICAvLyDlr7nlrqLmiLfnq6/kvKDov5vmnaXnmoTmlbDmja7ov5vooYzlsI/lhpnovazlpKflhpnnmoTovazmjaIKLy8gLy8gLy8gICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICByZWN2X2J1ZndhZWhyc3RlZHlydGVkc1tpXSA9IHRvdXBwZXIocmVjdl9idWZ3YWVocnN0ZWR5cnRlZHNbaV0pOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgfQoKLy8gLy8gLy8gICAgICAgICAgICAgICAgIC8vIHNpemXliqAx5piv5Li65LqG5o6l5pS25a2X56ym5Liy55qE57uT5p2f56ymXDAKLy8gLy8gLy8gICAgICAgICAgICAgICAgIHdyaXRlKGNmZCwgcmVjdl9idWZ3YWVocnN0ZWR5cnRlZHMsIHN0cmxlbihyZWN2X2J1ZndhZWhyc3RlZHlydGVkcykrMSk7Ci8vIC8vIC8vICAgICAgICAgICAgIH0KLy8gLy8gLy8gICAgICAgICAgICAgY2xvc2UoY2ZkKTsKLy8gLy8gLy8gICAgICAgICAgICAgcHJpbnRmKCLlrZDov5vnqIvnu5PmnZ9cbiIpOwovLyAvLyAvLyAgICAgICAgICAgICBleGl0KDApOwovLyAvLyAvLyAgICAgICAgIH0KLy8gLy8gLy8gICAgIH0KLy8gLy8gLy8gCWNsb3NlKGxmZCk7CgovLyAvLyAvLyAgICAgcmV0dXJuIDA7Ci8vIC8vIC8vIH0gICAgCi8vIC8vIC8vIC8vICAgICAvLyBUQ1DpgJrkv6HnmoTmnI3liqHnq68KLy8gLy8gLy8gLy8gICAgIC8vIOWIm+W7uueUqOS6juebkeWQrOeahOWll+aOpeWtlwovLyAvLyAvLyAvLyAgICAgaW50IGxmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci8vIC8vIC8vIC8vICAgICBpZiAoLTEgPT0gbGZkKSB7Ci8vIC8vIC8vIC8vICAgICAgICAgcGVycm9yKCJzb2NrZXQiKTsKLy8gLy8gLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gLy8gICAgIH0KLy8gLy8gLy8gLy8gICAgIC8vIOe7keWummJpbmQKLy8gLy8gLy8gLy8gICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkcjsKLy8gLy8gLy8gLy8gICAgIHNhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwovLyAvLyAvLyAvLyAgICAgaW5ldF9wdG9uKEFGX0lORVQsICIxOTIuMTY4LjQzLjE5MyIsICZzYWRkci5zaW5fYWRkci5zX2FkZHIpOwovLyAvLyAvLyAvLyAgICAgc2FkZHIuc2luX3BvcnQgPSBodG9ucyg5OTk5KTsKLy8gLy8gLy8gLy8gICAgIGludCByZXQgPSBiaW5kKGxmZCwgKHN0cnVjdCBzb2NrYWRkciopJnNhZGRyLCBzaXplb2Yoc2FkZHIpKTsKLy8gLy8gLy8gLy8gICAgIGlmICgtMSA9PSByZXQpIHsKLy8gLy8gLy8gLy8gICAgICAgICBwZXJyb3IoImJpbmQiKTsKLy8gLy8gLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gLy8gICAgIH0KLy8gLy8gLy8gLy8gICAgIHJldCA9IGxpc3RlbihsZmQsIDgpOwovLyAvLyAvLyAvLyAgICAgaWYgKC0xID09IHJldCkgewovLyAvLyAvLyAvLyAgICAgICAgIHBlcnJvcigibGlzdGVuIik7Ci8vIC8vIC8vIC8vICAgICAgICAgZXhpdCgtMSk7Ci8vIC8vIC8vIC8vICAgICB9Ci8vIC8vIC8vIC8vICAgICBwcmludGYoIuetieW+heWuouaIt+err+i/nuaOpS4uLlxuIik7Ci8vIC8vIC8vIC8vICAgICAvLyDmjqXmlLblrqLmiLfnq6/ov57mjqUKLy8gLy8gLy8gLy8gICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBjYWRkcjsKLy8gLy8gLy8gLy8gICAgIHNvY2tsZW5fdCBsZW4gPSBzaXplb2YoY2FkZHIpOwovLyAvLyAvLyAvLyAgICAgaW50IGNmZCA9IGFjY2VwdChsZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZjYWRkciwgJmxlbik7Ci8vIC8vIC8vIC8vICAgICBpZiAoLTEgPT0gY2ZkKSB7Ci8vIC8vIC8vIC8vICAgICAgICAgcGVycm9yKCJhY2NlcHQiKTsKLy8gLy8gLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gLy8gICAgIH0KLy8gLy8gLy8gLy8gICAgIC8vIOi+k+WHuuWuouaIt+err+S/oeaBrwovLyAvLyAvLyAvLyAgICAgY2hhciBjbGllbnRfaXBbMTZdOwovLyAvLyAvLyAvLyAgICAgaW5ldF9udG9wKEFGX0lORVQsICZjYWRkci5zaW5fYWRkci5zX2FkZHIsIGNsaWVudF9pcCwgc2l6ZW9mKGNsaWVudF9pcCkpOwovLyAvLyAvLyAvLyAgICAgdW5zaWduZWQgc2hvcnQgY2xpZW50X3BvcnQgPSBudG9ocyhjYWRkci5zaW5fcG9ydCk7Ci8vIC8vIC8vIC8vICAgICBwcmludGYoIuWuouaIt+err0lQ77yaJXNcbuerr+WPo++8miVkXG4iLCBjbGllbnRfaXAsIGNsaWVudF9wb3J0KTsKLy8gLy8gLy8gLy8gICAgIC8vIOW8gOWni+mAmuS/oQovLyAvLyAvLyAvLyAgICAgY2hhciByZWN2X2J1ZndhZWhyc3RlZHlydGVkc1sxMDI0XSA9IHswfTsKLy8gLy8gLy8gLy8gICAgIHdoaWxlKDEpIHsKLy8gLy8gLy8gLy8gICAgICAgICAvLyDojrflj5blrqLmiLfnq6/nmoTmtojmga8KLy8gLy8gLy8gLy8gICAgICAgICBsZW4gPSByZWFkKGNmZCwgcmVjdl9idWZ3YWVocnN0ZWR5cnRlZHMsIHNpemVvZihyZWN2X2J1ZndhZWhyc3RlZHlydGVkcykpOwovLyAvLyAvLyAvLyAgICAgICAgIGlmICgtMSA9PSBsZW4pIHsKLy8gLy8gLy8gLy8gICAgICAgICAgICAgcGVycm9yKCJyZWFkIik7Ci8vIC8vIC8vIC8vICAgICAgICAgICAgIGV4aXQoLTEpOwovLyAvLyAvLyAvLyAgICAgICAgIH0KLy8gLy8gLy8gLy8gICAgICAgICBlbHNlIGlmIChsZW4gPiAwKSB7Ci8vIC8vIC8vIC8vICAgICAgICAgICAgIHByaW50Zigi5pS25Yiw5a6i5oi356uv55qE5raI5oGv77yaICVzXG4iLCByZWN2X2J1ZndhZWhyc3RlZHlydGVkcyk7Ci8vIC8vIC8vIC8vICAgICAgICAgfSAgIAovLyAvLyAvLyAvLyAgICAgICAgIGVsc2UgaWYgKDAgPT0gbGVuKSB7Ci8vIC8vIC8vIC8vICAgICAgICAgICAgIC8vIOihqOekuuWuouaIt+err+aWreW8gOi/nuaOpQovLyAvLyAvLyAvLyAgICAgICAgICAgICBwcmludGYoIuWuouaIt+err+aWreW8gOi/nuaOpVxuIik7Ci8vIC8vIC8vIC8vICAgICAgICAgICAgIGJyZWFrOwovLyAvLyAvLyAvLyAgICAgICAgIH0KCi8vIC8vIC8vIC8vICAgICAgICAgY2hhciogZGF0YSAgPSAi5oiR5piv5pyN5Yqh5ZmoIjsKLy8gLy8gLy8gLy8gICAgICAgICAvLyDnu5nlrqLmiLfnq6/lj5HpgIHmtojmga8KLy8gLy8gLy8gLy8gICAgICAgICB3cml0ZShjZmQsIGRhdGEsIHN0cmxlbihkYXRhKSk7Ci8vIC8vIC8vIC8vICAgICB9Ci8vIC8vIC8vIC8vICAgICAvLyDlhbPpl63mlofku7bmj4/ov7DnrKYKLy8gLy8gLy8gLy8gICAgIGNsb3NlKGxmZCk7Ci8vIC8vIC8vIC8vICAgICBjbG9zZShjZmQpOwoKLy8gLy8gLy8gLy8gICAgIHJldHVybiAwOwovLyAvLyAvLyAvLyB9Ci8vIC8vIC8vIC8vICAgICAvLyAvLyDorrLlrZfnrKbkuLJJUOWcsOWdgOi9rOaNouS4umluZXTlnLDlnYAgCi8vIC8vIC8vIC8vICAgICAvLyAvLyDmlrDlu7rkuIDkuKpJUOWtl+espuS4su+8jOeCueWIhuWNgei/m+WItgovLyAvLyAvLyAvLyAgICAgLy8gY2hhciBidWZ3YWVocnN0ZWR5cnRlZHNbXSA9ICIxOTIuMTY4LjEuNCI7Ci8vIC8vIC8vIC8vICAgICAvLyB1bnNpZ25lZCBpbnQgbnVtID0gMDsKLy8gLy8gLy8gLy8gICAgIC8vIC8vIOi9rOaNouS4uue9kee7nOWtl+iKguW6jwovLyAvLyAvLyAvLyAgICAgLy8gaW5ldF9wdG9uKEFGX0lORVQsIGJ1ZndhZWhyc3RlZHlydGVkcywgJm51bSk7Ci8vIC8vIC8vIC8vICAgICAvLyB1bnNpZ25lZCBjaGFyKiBwID0gKHVuc2lnbmVkIGNoYXIqKSZudW07Ci8vIC8vIC8vIC8vICAgICAvLyBwcmludGYoIiVkICVkICVkICVkXG4iLCAqcCwgKihwKzEpLCAqKHArMiksICoocCszKSk7CgovLyAvLyAvLyAvLyAgICAgLy8gcHJpbnRmKCI8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4iKTsKCi8vIC8vIC8vIC8vICAgICAvLyAvLyDorrLnvZHnu5zlrZfoioLluo/ovazmjaLmiJBJUOWtl+espuS4sgovLyAvLyAvLyAvLyAgICAgLy8gLy8gM+S4qi7vvIzmr4/kuKrkvY3nva7mnIDplb/kuLoz5L2N5pWw77yMMyo0KzMrMe+8jOacgOWQjui/meS4qjHmmK9cMAovLyAvLyAvLyAvLyAgICAgLy8gY2hhciBpcFsxNl0gPSAiIjsKLy8gLy8gLy8gLy8gICAgIC8vIGluZXRfbnRvcChBRl9JTkVULCAmbnVtLCBpcCwgMTYpOwovLyAvLyAvLyAvLyAgICAgLy8gcHJpbnRmKCIlc1xuIiwgaXApOwoKCgovLyAvLyAvLyAvLyAgICAgLy8gdW5pb24gewovLyAvLyAvLyAvLyAgICAgLy8gICAgIHNob3J0IHZhbHVlOwovLyAvLyAvLyAvLyAgICAgLy8gICAgIGNoYXIgYnl0ZXNbc2l6ZW9mKHNob3J0KV07Ci8vIC8vIC8vIC8vICAgICAvLyB9IHRlc3Q7Ci8vIC8vIC8vIC8vICAgICAvLyB0ZXN0LnZhbHVlID0gMHgwMTAyOwovLyAvLyAvLyAvLyAgICAgLy8gaWYgKHRlc3QuYnl0ZXNbMF0gPT0gMSAmJiB0ZXN0LmJ5dGVzWzFdID09IDIpIAovLyAvLyAvLyAvLyAgICAgLy8gICAgIHByaW50Zigi5b2T5YmN5Li75py65a2X6IqC5bqP77ya5aSn56uvXG4iKTsKLy8gLy8gLy8gLy8gICAgIC8vIGVsc2UgaWYgKHRlc3QuYnl0ZXNbMF0gPT0gMiAmJiB0ZXN0LmJ5dGVzWzFdID09IDEpIAovLyAvLyAvLyAvLyAgICAgLy8gICAgIHByaW50Zigi5b2T5YmN5Li75py65a2X6IqC5bqP77ya5bCP56uvXG4iKTsKCi8vIC8vIC8vIC8vICAgICAvLyDnvZHnu5zlrZfoioLluo/ljbPlpKfnq6/luo8KLy8gLy8gLy8gLy8gICAgIC8vIGhvc3QgdG8gbmV0d29yayBzaG9ydAovLyAvLyAvLyAvLyAgICAgLy8g5Li75py65a2X6IqC5bqP6L2s5o2i5oiQ572R57uc5a2X6IqC5bqPCi8vIC8vIC8vIC8vICAgICAvLyDnlKjkuo7ovazmjaLnq6/lj6MgMTZiaXQgc2hvcnQgaW50Ci8vIC8vIC8vIC8vICAgICAvLyBodG9ucwovLyAvLyAvLyAvLyAgICAgLy8gbnRvaHMKLy8gLy8gLy8gLy8gICAgIC8vIOeUqOS6jui9rOaNoklQIDMyYml0IGludAovLyAvLyAvLyAvLyAgICAgLy8gaG9zdCB0byBuZXR3b3JrIGxvbmcKLy8gLy8gLy8gLy8gICAgIC8vIGh0b25sCi8vIC8vIC8vIC8vICAgICAvLyBudG9obAoKLy8gLy8gLy8gLy8gICAgIC8vIHVuc2lnbmVkIHNob3J0IGggPSAweDAxMDI7Ci8vIC8vIC8vIC8vICAgICAvLyBwcmludGYoIiV4XG4iLCBoKTsKLy8gLy8gLy8gLy8gICAgIC8vIHVuc2lnbmVkIHNob3J0IG4gPSBodG9ucyhoKTsKLy8gLy8gLy8gLy8gICAgIC8vIHByaW50ZigiJXhcbiIsIG4pOwoKLy8gLy8gLy8gLy8gICAgIC8vIHByaW50ZigiPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuIik7CgovLyAvLyAvLyAvLyAgICAgLy8gdW5zaWduZWQgY2hhciBidWZ3YWVocnN0ZWR5cnRlZHNbNF0gPSB7MTkyLCAxNjgsIDEsIDEwMH07Ci8vIC8vIC8vIC8vICAgICAvLyBwcmludGYoIiVkXG4iLCAqYnVmd2FlaHJzdGVkeXJ0ZWRzKTsKLy8gLy8gLy8gLy8gICAgIC8vIHByaW50ZigiJWRcbiIsICooYnVmd2FlaHJzdGVkeXJ0ZWRzKzEpKTsKLy8gLy8gLy8gLy8gICAgIC8vIHByaW50ZigiJWRcbiIsICooYnVmd2FlaHJzdGVkeXJ0ZWRzKzIpKTsKLy8gLy8gLy8gLy8gICAgIC8vIHByaW50ZigiJWRcbiIsICooYnVmd2FlaHJzdGVkeXJ0ZWRzKzMpKTsKLy8gLy8gLy8gLy8gICAgIC8vIC8vIDTkuKpjaGFy55u45b2T5LqO5LiA5LiqaW5077yM6YO95pivNOWtl+iKggovLyAvLyAvLyAvLyAgICAgLy8gLy8g5oqK6L+Z5LiA5Z2X5YaF5a2Y6L2s5o2i5oiQaW505oyH6ZKI77yM54S25ZCO5Y+W5YC8Ci8vIC8vIC8vIC8vICAgICAvLyBpbnQgbnVtID0gKihpbnQgKilidWZ3YWVocnN0ZWR5cnRlZHM7Ci8vIC8vIC8vIC8vICAgICAvLyBpbnQgcmVzID0gaHRvbmwobnVtKTsKLy8gLy8gLy8gLy8gICAgIC8vIHVuc2lnbmVkIGNoYXIqIHAgPSAoY2hhciopJnJlczsKLy8gLy8gLy8gLy8gICAgIC8vIHByaW50ZigiJWRcbiIsICpwKTsKLy8gLy8gLy8gLy8gICAgIC8vIHByaW50ZigiJWRcbiIsICoocCsxKSk7Ci8vIC8vIC8vIC8vICAgICAvLyBwcmludGYoIiVkXG4iLCAqKHArMikpOwovLyAvLyAvLyAvLyAgICAgLy8gcHJpbnRmKCIlZFxuIiwgKihwKzMpKTsKCi8vIC8vIC8vIC8vIC8vICAgICBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4LCBOVUxMKTsKLy8gLy8gLy8gLy8gLy8gICAgIHB0aHJlYWRfY29uZF9pbml0KCZjb25kLCBOVUxMKTsKLy8gLy8gLy8gLy8gLy8gICAgIHNlbV9pbml0KCZwc2VtLCAwLCA4KTsKLy8gLy8gLy8gLy8gLy8gICAgIHNlbV9pbml0KCZjc2VtLCAwLCAwKTsKLy8gLy8gLy8gLy8gLy8gICAgIHB0aHJlYWRfdCBwdGlkc1s1XSwgY3RpZHNbNV07Ci8vIC8vIC8vIC8vIC8vICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDU7IGkrKykKLy8gLy8gLy8gLy8gLy8gICAgIHsKLy8gLy8gLy8gLy8gLy8gICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmcHRpZHNbaV0sIE5VTEwsIHByb2R1Y2VyLCBOVUxMKTsKLy8gLy8gLy8gLy8gLy8gICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmY3RpZHNbaV0sIE5VTEwsIGNvbnN1bWVyLCBOVUxMKTsKICAgICAgICAKLy8gLy8gLy8gLy8gLy8gICAgIH0KLy8gLy8gLy8gLy8gLy8gICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNTsgaSsrKQovLyAvLyAvLyAvLyAvLyAgICAgewovLyAvLyAvLyAvLyAvLyAgICAgICAgIHB0aHJlYWRfam9pbihwdGlkc1tpXSwgTlVMTCk7Ci8vIC8vIC8vIC8vIC8vICAgICAgICAgcHRocmVhZF9qb2luKGN0aWRzW2ldLCBOVUxMKTsKICAgICAgICAKLy8gLy8gLy8gLy8gLy8gICAgIH0KLy8gLy8gLy8gLy8gLy8gICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXgpOwovLyAvLyAvLyAvLyAvLyAgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJmNvbmQpOwovLyAvLyAvLyAvLyAvLyAgICAgcHRocmVhZF9leGl0KE5VTEwpOwoKLy8gLy8gLy8gLy8gLy8gICAgIHJldHVybiAwOwovLyAvLyAvLyAvLyAvLyB9Ci8vIC8vIC8vIC8vIC8vIC8vIHB0aHJlYWRfYXR0cl90IGF0dHI7Ci8vIC8vIC8vIC8vIC8vIC8vIC8vIOWIneWni+WMluWxnuaAp+WPmOmHjwovLyAvLyAvLyAvLyAvLyAvLyBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7Ci8vIC8vIC8vIC8vIC8vIC8vIC8vIOiuvue9ruWxnuaApwovLyAvLyAvLyAvLyAvLyAvLyBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOwovLyAvLyAvLyAvLyAvLyAvLyAvLyDkvb/nlKjlpJrnur/nqIvlrp7njrDkubDnpajnmoTmoYjkvosKLy8gLy8gLy8gLy8gLy8gLy8gLy8gM+S4queql+WPo++8jOWNljEwMOW8oOelqAovLyAvLyAvLyAvLyAvLyAvLyAvLyDliJvlu7rkuInkuKrlrZflkrjkuqgKCi8vIC8vIC8vIC8vIC8vIC8vIC8vIOiOt+WPlue6v+eoi+aagueahOWkp+WwjwovLyAvLyAvLyAvLyAvLyAvLyAvLyDnlJ/kuqfogIXmtojotLnogIXmqKHlnosKLy8gLy8gLy8gLy8gLy8gLy8g5Yib5bu6NeS4queUn+S6p+iAhee6v+eoiyw15Liq5raI6LS56ICF57q/56iLCi8vIC8vIC8vIC8vIC8vIHB0aHJlYWRfdCBwdGlkc1s1XSwgY3RpZHNbNV07Ci8vIC8vIC8vIC8vIC8vIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLy8gLy8gLy8gLy8gLy8gewovLyAvLyAvLyAvLyAvLyAgICAgcHRocmVhZF9jcmVhdGUoJnB0aWRzW2ldKQovLyAvLyAvLyAvLyAvLyB9CgovLyAvLyAvLyAvLyAvLyBzaXplX3Qgc2l6ZTsKLy8gLy8gLy8gLy8gcHRocmVhZF9hdHRyX2dldHN0YWNrc2l6ZSgmYXR0ciwmc2l6ZSk7Ci8vIC8vIC8vIC8vIHByaW50Zigi56uZ5aSn5bCP77ya4oCmJWxkXG4iLHNpemUpOwovLyAvLyAvLyAvLyBwdGhyZWFkX3QgIHRpZDEgLHRpZDIsdGlkMzsKLy8gLy8gLy8gLy8gLy8g5Yib5bu65LiJ5Liq5YaZ57q/56iL77yMNeS4quW6pue6v+eoiy8vIOWIm+W7uuS4gOS4quWtkOe6v+eoiwovLyAvLyAvLyAvLyBpbnQgbnVtID0gNTsKLy8gLy8gLy8gLy8gcHRocmVhZF9tdXRleF9pbml0KCZhc2Rhc2Rhc2Rhc2Rhc2RhcyxOVUxMKTsKLy8gLy8gLy8gLy8gcHRocmVhZF90ICB3c3RpZFszXSxydGlkc1s1XTsKLy8gLy8gLy8gLy8gZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspCi8vIC8vIC8vIC8vIHtpbnQgcmV0MiA9IHB0aHJlYWRfY3JlYXRlKCZydGlkc1tpXSxOVUxMLHNpZ19oYW5kbGVyMSwodm9pZCopJm51bSk7Ci8vIC8vIC8vIC8vICAgICAvKiBjb2RlICovCi8vIC8vIC8vIC8vIH0KLy8gLy8gLy8gLy8gZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCi8vIC8vIC8vIC8vIHtpbnQgcmV0MiA9IHB0aHJlYWRfY3JlYXRlKCZ3c3RpZFtpXSxOVUxMLHNpZ19oYW5kbGVyMTIyMzIsKHZvaWQqKSZudW0pOwovLyAvLyAvLyAvLyAgICAgLyogY29kZSAqLwovLyAvLyAvLyAvLyB9Ci8vIC8vIC8vIC8vIC8vIOiuvue9rue6v+eoi+WIhuemuwovLyAvLyAvLyAvLyBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykKLy8gLy8gLy8gLy8ge2ludCByZXQyID0gcHRocmVhZF9kZXRhY2gocnRpZHNbaV0pOwovLyAvLyAvLyAvLyAgICAgLyogY29kZSAqLwovLyAvLyAvLyAvLyB9Ci8vIC8vIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQovLyAvLyAvLyB7aW50IHJldDIgPSBwdGhyZWFkX2RldGFjaCh3c3RpZFtpXSk7Ci8vIC8vIC8vICAgICAvKiBjb2RlICovCi8vIC8vIC8vIH0KLy8gLy8gLy8gcHRocmVhZF9leGl0KE5VTEwpOwovLyAvLyAvLyBwcmludGYoIuS9oOiDveaJp+ihjOaIke+8n++8n++8n++8n1xuIik7Ci8vIC8vIC8vIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmYXNkYXNkYXNkYXNkYXNkYXMpOwovLyAvLyAvLyByZXR1cm4gMDt9Ci8vIC8vIC8vIC8v6K+75YaZ6ZSBCi8vIC8vIC8vIC8vIC8vIOivu+eahOaTjeS9nOmcgOimgeavlOi+g+Wkmu+8jOWboOS4uuivu+aTjeS9nOayoeW/heimgeiiq+mYu+WhngovLyAvLyAvLyAvLyAvLyByd2xvY2sKCgovLyAvLyAvLyAvLyAvLyDkupLmlqXph48KLy8gLy8gLy8gLy8gLy8gICAgcHRocmVhZF9tdXRleF90IG11dGV4MTsgCi8vIC8vIC8vIC8vIC8vICAgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDI7IAovLyAvLyAvLyAvLyBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4MSxOVUxMKTsKLy8gLy8gLy8gLy8gcHRocmVhZF9tdXRleF9pbml0KCZtdXRleDIsTlVMTCk7Ci8vIC8vIC8vIC8vIGludCByZXQyID0gcHRocmVhZF9jcmVhdGUoJnRpZDEsTlVMTCxzaWdfaGFuZGxlcjEsKHZvaWQqKSZudW0pOwovLyAvLyAvLyAvLyBpbnQgcmUzdCA9IHB0aHJlYWRfY3JlYXRlKCZ0aWQyLE5VTEwsc2lnX2hhbmRsZXIyMiwodm9pZCopJm51bSk7ICAKLy8gLy8gLy8gLy8gLy8gaW50IHJlMnQgPSBwdGhyZWFkX2NyZWF0ZSgmdGlkMyxOVUxMLHNpZ19oYW5kbGVyLCh2b2lkKikmbnVtKTsKLy8gLy8gLy8gLy8gLy8g5Zue5pS25a2Q57q/56iL6LWE5rqQCi8vIC8vIC8vIC8vIHB0aHJlYWRfam9pbih0aWQxLE5VTEwpOwovLyAvLyAvLyAvLyBwdGhyZWFkX2pvaW4odGlkMixOVUxMKTsKLy8gLy8gLy8gLy8gLy8gcHRocmVhZF9qb2luKHRpZDMsTlVMTCk7Ci8vIC8vIC8vIC8vIC8vIOiuvue9rue6v+eoi+WIhuemuwovLyAvLyAvLyAvLyAvLyBwdGhyZWFkX2RldGFjaCh0aWQxKTsKLy8gLy8gLy8gLy8gLy8gcHRocmVhZF9kZXRhY2godGlkMik7Ci8vIC8vIC8vIC8vIC8vIHB0aHJlYWRfZGV0YWNoKHRpZDMpOwovLyAvLyAvLyAvLyAvLyDmjqjlh7rkuLvnur/nqIsKLy8gLy8gLy8gLy8gcHRocmVhZF9leGl0KE5VTEwpOwovLyAvLyAvLyAvLyAvLyDph4rmlL7kupLmlqXph48KLy8gLy8gLy8gLy8gcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleDEpOwovLyAvLyAvLyAvLyBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm11dGV4Mik7Ci8vIC8vIC8vIC8vIC8vIGlmKDAhPXJldCl7Ci8vIC8vIC8vIC8vIC8vICAgICBjaGFyKiBlcnJzdHIgPSBzdHJlcnJvcihyZXQpOwovLyAvLyAvLyAvLyAvLyAgICAgcHJpbnRmKCJlcnJvcjogJXNcbiIsIGVycnN0cik7Ci8vIC8vIC8vIC8vIC8vIH0KLy8gLy8gLy8gLy8gLy8gLy8gcHRocmVhZF9jYW5jZWwodGlkKTsKCi8vIC8vIC8vIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQovLyAvLyAvLyAvLyB7cHJpbnRmKCIlZFxuIixpKTsKLy8gLy8gLy8gLy8gICAgIC8qIGNvZGUgKi8KLy8gLy8gLy8gLy8gfQovLyAvLyAvLyAvLyBwcmludGYoIuWtkOe6v+eoi2lkJWxk5Li757q/56iLSUTvvJolbGRcbiIsIHRpZCxwdGhyZWFkX3NlbGYoKSk7Ci8vIC8vIC8vIC8vIC8vIOaYvuaIkOeGn+aApwoKLy8gLy8gLy8gLy8gLy8gcHRocmVhZF9hdGZvcmsKLy8gLy8gLy8gLy8gLy8g5Zue6aaW57Sr56aB5Z+OCi8vIC8vIC8vIC8vIC8vIGludCogYXNkYXNkYXNkIDsKLy8gLy8gLy8gLy8gLy8gaW50IGNhb3Vzb2QgPSBwdGhyZWFkX2pvaW4odGlkLCh2b2lkICoqKSZhc2Rhc2Rhc2QpOwovLyAvLyAvLyAvLyAvLyBpZihyZXQhPTApewovLyAvLyAvLyAvLyAvLyAgICAgY2hhciogZXJyc3RyID0gc3RyZXJyb3IocmV0KTsKLy8gLy8gLy8gLy8gLy8gICAgIHByaW50ZigiZXJyb3I6ICVzIixlcnJzdHIpOwovLyAvLyAvLyAvLyAvLyB9ICAgCi8vIC8vIC8vIC8vIC8vIHByaW50Zigi57Sr56aB5Z+O55qE6L+U5Zue5YC8JWRcbiIsKmFzZGFzZGFzZCk7Ci8vIC8vIC8vIC8vIC8vIHByaW50Zigi5a2Q57q/56iL6LWE5rqQ5Zue5pS25oiQ5YqfXG4iKTsKLy8gLy8gLy8gLy8gLy8gc2xlZXAoNSk7Ci8vIC8vIC8vIC8vIC8vIOe7iOatouS4gOS4quWtkOe6v+eoiwovLyAvLyAvLyAvLyAvLyBwdGhyZWFkLWV4aXQKLy8gLy8gLy8gLy8gLy8gICAgIOmcgOimgeS8oOmAkuS4gOS4quaMh+mSiOS9nOS4uui/lOWbnuWAvAovLyAvLyAvLyAvLyAvLyAgICAg5Y+v5Lul5YaNcHRocmVhZF9qb2lu5Lit6I635Y+W5YiwCi8vIC8vIC8vIC8vIC8vIOe7iOatouS4gOS4quWOv+Wfju+8jOWcqOWTquS4queOsOaIkOS4reiwg+eUqO+8jOWwsee7iOatouWTquS4queOsOaIkAovLyAvLyAvLyAvLyAvLyDorqnkuLvnur/nqIvpgIDlh7oKLy8gLy8gLy8gLy8gLy8g5LiN5Lya5b2x5ZON5YW25LuW5Y6/5Z+OCgovLyAvLyAvLyAvLyAvLyDlrZDnur/nqIvnu5PmnZ/mmK/lr7nlupTnmoTotYTmupDlsLHkuI3pnIDopoHkuLvnur/nqIvljrvph4rmlL7kuoYKLy8gLy8gLy8gLy8gLy8gcHRocmVhZF9kZXRhY2godGlkKTsKLy8gLy8gLy8gLy8gLy8gcHRocmVhZF9jYW5jZWzlh73mlbAKLy8gLy8gLy8gLy8gLy8gICAgIOe7iOatoueOsOaIkO+8iOWPlua2iOeOsO+8iQovLyAvLyAvLyAvLyAvLyAgICAg5Y+W5raI5Liq546w5oiQ77yM56eN5qSN5p+Q5Liq5Y6/5Z+O77yM5L2G5bm25LiN5piv56uL6ams57uI5q2iCi8vIC8vIC8vIC8vIC8vICAgICDnrYnliLDnjrDmiJDmiafooYzliLDkuIDkuKrljrvlsI/lupfvvIznjrDmiJDmiY3kvJrnu4jmraIKLy8gLy8gLy8gLy8gLy8gICAgIOezu+e7n+inhOWumueahOezu+e7n+iwg+eUqAovLyAvLyAvLyAvLyAvLyAgICAg57KX55Wl55CG6Kej5Li655So5oi35rig6YGT5YaF5qC45LqM5Yy655qE5YiH5o2i5L2N572uCgovLyAvLyAvLyAvLyAvLyDlr7nliIbnprvnmoTlrZDnur/nqIvov5vooYzov57mjqUKLy8gLy8gLy8gLy8gLy8g5Lya5oql6ZSZ77yM5Zug5Li65bey57uP5YiG56a755qE5a2Q57q/56iL5LiN6IO95YaN6L+b6KGM6L+e5o6l5LqGCi8vIC8vIC8vIC8vIC8vIGludCByZXR0dHQgPSBwdGhyZWFkX2pvaW4odGlkLE5VTEwpOwovLyAvLyAvLyAvLyAvLyBpZigwIT1yZXR0dHQpewovLyAvLyAvLyAvLyAvLyAgICAgY2hhciogZXJyc3RyID0gc3RyZXJyb3IocmV0dHR0KTsKLy8gLy8gLy8gLy8gLy8gICAgIHByaW50ZigicmV0dHR0ICBlcnJvcjogJXNcbiIsIGVycnN0cik7Ci8vIC8vIC8vIC8vIC8vIH0KLy8gLy8gLy8gLy8gLy8g6YeK5pS+5pi+5oiQ54af5oCnCi8vIC8vIC8vIC8vIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKLy8gLy8gLy8gLy8gcHRocmVhZF9leGl0KE5VTEwpOwovLyAvLyAvLyAvLyAvLyBwcmludGYoIuaIkeS7luWmiOS4jeS8muaJp+ihjFxuIik7Ci8vIC8vIC8vIC8vIC8vIC8vIOavlOi+g+S4pOS4queOsOaIkGlk5piv5ZCm55u4562JCi8vIC8vIC8vIC8vIC8vIC8vIHB0aHJlYWRfZXF1YWwKLy8gLy8gLy8gLy8gLy8gLy8g5LiN5ZCM55qE5pON5L2c57O757uf77yM77yM5a6e546w5Y+R5ZOq5Liq5piv5Y+v6IO95LiN5aSq5LiA5qC35pyJ55qE5piv5peg56ym5Y+36ZW/5q2j5YW077yI5aSn6YOo5YiG77yJ77yM5pyJ55qE5piv57uT5p6E5L2T57G75Z6LCi8vIC8vIC8vIC8vIC8vIHB0aGVhZF9qb2luCi8vIC8vIC8vIC8vIC8vICAgIOaMpeaJi+iHqueOsOaIkOeahOi1hOa6kOOAguWSjHdhaXTlt67kuI3lpJoKLy8gLy8gLy8gLy8gLy8gICAg6L+Z5Liq5Ye95pWw5piv6Zi75aGe55qECi8vIC8vIC8vIC8vIC8vICAgIOiwg+eUqOS4gOasoeaZuuiDveWbnuaUtuS4gOS4quWtkOe6v+eoiwovLyAvLyAvLyAvLyAvLyAgICDvvIzkuIDoiKzlnKjkuLvnur/nqIvkuK3kvb/nlKgKLy8gLy8gLy8gLy8gLy8gICAgcmV0dmFsdTog5YuH5LqO5o6l5Y+X5a2Q57q/56iL6YCA5Ye65pe255qE6L+U5Zue5YC8Ci8vIC8vIC8vIC8vIC8vICAgICAgICAgICAgIOS6jOe6p+aMh+mSiAoKLy8gLy8gLy8gLyoKCi8vIC8vIC8vICAgICAvLyBjaGFyICogYnVmd2FlaHJzdGVkeXJ0ZWRzOwovLyAvLyAvLyAgICAgLy8gc3RyY3B5KGJ1ZndhZWhyc3RlZHlydGVkcywgImNhbyBuaW1hIik7cmV0dXJuIDA7fS8qCi8vIC8vIC8vICAgICAvLyDkv67mlLltbWFw55qEZmxhZ3Plj4LmlbDvvIzkuYvliY3kvb/nlKjnmoTmmK9NQVBfU0hBUkVECi8vIC8vIC8vICAgICAvLyDnjrDlnKjmiJHku6zopoHnlKjnmoTmmK9NQVBfQU5PTgovLyAvLyAvLyAgICAgaW50IGxlbiA9IDEyMDQ7Ci8vIC8vIC8vICAgICB2b2lkICpwdHIgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9BTk9OIHwgTUFQX1NIQVJFRCwgLTEsIDApOwovLyAvLyAvLyAgICAgaWYgKHB0ciA9PSBNQVBfRkFJTEVEKQovLyAvLyAvLyAgICAgewovLyAvLyAvLyAgICAgICAgIHBlcnJvcigibW1hcCIpOwovLyAvLyAvLyAgICAgICAgIGV4aXQoMCk7Ci8vIC8vIC8vICAgICB9Ci8vIC8vIC8vICAgICAvLyDniLblrZDov5vnqIvpl7TpgJrkv6EKLy8gLy8gLy8gICAgIGludCBwaWQgPSBmb3JrKCk7Ci8vIC8vIC8vICAgICBpZiAocGlkID4gMCkKLy8gLy8gLy8gICAgIHsKLy8gLy8gLy8gICAgICAgICBzdHJjcHkoKGNoYXIgKilwdHIsICJoZWxsbyB3b3JsZCIpOwovLyAvLyAvLyAgICAgICAgIHdhaXQoTlVMTCk7Ci8vIC8vIC8vICAgICB9Ci8vIC8vIC8vICAgICBlbHNlIGlmICgwID09IHBpZCkKLy8gLy8gLy8gICAgIHsKLy8gLy8gLy8gICAgICAgICBzbGVlcCgxKTsKLy8gLy8gLy8gICAgICAgICBwcmludGYoIiVzXG4iLCAoY2hhciAqKXB0cik7Ci8vIC8vIC8vICAgICB9Ci8vIC8vIC8vICAgICAvLyDph4rmlL7lhoXlrZjmmKDlsITljLoKLy8gLy8gLy8gICAgIGludCByZXQgPSBtdW5tYXAocHRyLCBsZW4pOwovLyAvLyAvLyAgICAgLy8gaW50IGZkID0gb3BlbigiZW5nbHNpaC50eHQiLCBPX1JET05MWSk7Ci8vIC8vIC8vICAgICAvLyAvLyDojrflj5bljp/lp4vmlofku7bnmoTlpKflsI8KLy8gLy8gLy8gICAgIC8vIGludCBsZW4gPSBsc2VlayhmZCwgMCwgU0VFS19FTkQpOwovLyAvLyAvLyAgICAgLy8gLy8g5Yib5bu65LiA5Liq5paw5paH5Lu277yM5bm25a+55YW25aSn5bCP6L+b6KGM5ouT5bGVCi8vIC8vIC8vICAgICAvLyBpbnQgZmQxID0gb3BlbigiY3B5LnR4dCIsIE9fQ1JFQVQgfCBPX1JEV1IsIDA2NjQpOwovLyAvLyAvLyAgICAgLy8gdHJ1bmNhdGUoImNweS50eHQiLCBsZW4pOwovLyAvLyAvLyAgICAgLy8gd3JpdGUoZmQxLCAiICIsIDEpOwovLyAvLyAvLyAgICAgLy8gLy8g5YiG5Yir6L+b6KGM5YaF5a2Y5pig5bCECi8vIC8vIC8vICAgICAvLyB2b2lkICpwdHIgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7Ci8vIC8vIC8vICAgICAvLyB2b2lkICpwdHIxID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkMSwgMCk7Ci8vIC8vIC8vICAgICAvLyBpZiAocHRyID09IE1BUF9GQUlMRUQpCi8vIC8vIC8vICAgICAvLyB7Ci8vIC8vIC8vICAgICAvLyAgICAgcGVycm9yKCJtbWFwIik7Ci8vIC8vIC8vICAgICAvLyAgICAgZXhpdCgwKTsKLy8gLy8gLy8gICAgIC8vIH0KLy8gLy8gLy8gICAgIC8vIGlmIChwdHIxID09IE1BUF9GQUlMRUQpCi8vIC8vIC8vICAgICAvLyB7Ci8vIC8vIC8vICAgICAvLyAgICAgcGVycm9yKCJtbWFwIik7Ci8vIC8vIC8vICAgICAvLyAgICAgZXhpdCgwKTsKLy8gLy8gLy8gICAgIC8vIH0KLy8gLy8gLy8gICAgIC8vIC8vIOWGheWtmOaLt+i0nQovLyAvLyAvLyAgICAgLy8gbWVtY3B5KHB0cjEsIHB0ciwgbGVuKTsKLy8gLy8gLy8gICAgIC8vIG11bm1hcChwdHIxLCBsZW4pOwovLyAvLyAvLyAgICAgLy8gbXVubWFwKHB0ciwgbGVuKTsKLy8gLy8gLy8gICAgIC8vIGNsb3NlKGZkMSk7Ci8vIC8vIC8vICAgICAvLyBjbG9zZShmZCk7Ci8vIC8vIC8vICAgICByZXR1cm4gMDsKLy8gLy8gLy8gfQovLyAvLyAvLyAqLwoKCmBgYA==
c语言实现base64编码可以按照以下步骤进行: 1. 首先,要将输入的字符按照每3个字符一组进行分组。 2. 对每个分组中的字符进行base64编码。 - 获取第一个字符8个bit的前6位,作为base64编码的第一位。 - 获取第一个字符8个bit的后2位和第二个字符8个bit的前4位,作为base64编码的第二位。 - 获取第二个字符8个bit的后4位和第三个字符8个bit的前2位,作为base64编码的第三位。 - 获取第三个字符8个bit的后6位,作为base64编码的第四位。 3. 将编码后的字符输出为base64编码结果。 4. 当输入的字符数不足3的倍数时,需要进行补位。 - 如果剩余一个字符,补两个0; - 如果剩余两个字符,补一个0; - 补位完毕后,将补位的0用“=”代替。 5. 重复以上步骤,直到所有字符都被编码。 在C语言中,可以使用循环和位运算来实现base64编码算法。具体的实现细节可以根据具体的需求与编码规范进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C语言base64实现](https://blog.csdn.net/qq_63792137/article/details/124461549)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值