JmxybTsmbHQ7IURPQ1RZUEUgaHRtbCZndDsKJmxybTsmbHQ7aHRtbCZndDsKJmxybTsmbHQ7aGVhZCZndDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0O3RpdGxlJmd0O0Rlc2kgRHJpdmU6IEluZGlhIEV4cGxvcmVyIPCfmpfwn4eu8J+HsyZsdDsvdGl0bGUmZ3Q7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtzdHlsZSZndDtib2R5e21hcmdpbjowO2JhY2tncm91bmQ6IzAwMDtvdmVyZmxvdzpoaWRkZW47fWNhbnZhc3tib3JkZXI6MnB4IHNvbGlkICNmZmQ3MDA7fSZsdDsvc3R5bGUmZ3Q7CiZscm07Jmx0Oy9oZWFkJmd0OwombHJtOyZsdDtib2R5Jmd0OwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7Y2FudmFzIGlkPSZxdW90O2NhbnZhcyZxdW90OyB3aWR0aD0mcXVvdDs4MDAmcXVvdDsgaGVpZ2h0PSZxdW90OzYwMCZxdW90OyZndDsmbHQ7L2NhbnZhcyZndDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0O3NjcmlwdCZndDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbnZhcycpOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29uc3Qgd29ybGRXID0gMTAwMDA7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNvbnN0IHdvcmxkSCA9IDEwMDAwOwombHJtOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBQbGF5ZXIvQ2FyCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNvbnN0IHBsYXllciA9IHsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgeDogNTAwMCwgeTogNzUwMCwgdng6IDAsIHZ5OiAwLCBhbmdsZTogMCwKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgYWNjZWw6IDAuMywgZnJpY3Rpb246IDAuOTUsIG1heFNwZWVkOiA4LAombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB6b29tOiAxLCBjYXJUeXBlOiAwLCBzY29yZTogMAombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9OwombHJtOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBDYW1lcmEKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgbGV0IGNhbVggPSAwLCBjYW1ZID0gMCwgY2FtT2Zmc2V0WCA9IDAsIGNhbU9mZnNldFkgPSAwOwombHJtOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBJbnB1dAombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjb25zdCBrZXlzID0ge307CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxldCBtb3VzZURvd24gPSBmYWxzZSwgcHJldk1YID0gMCwgcHJldk1ZID0gMDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgbGV0IGpveXN0aWNrID0ge2FjdGl2ZTogZmFsc2UsIHN4OiAwLCBzeTogMCwgZHg6IDAsIGR5OiAwfTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgbGV0IHBhbm5pbmcgPSBmYWxzZSwgcGFuU1ggPSAwLCBwYW5TWSA9IDA7CiZscm07CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIExldmVscyAtIEFkZCBtb3JlIGVhc3khCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNvbnN0IGxldmVscyA9IFsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgewombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBuYW1lOiAnTGV2ZWwgMTogVWRhaXB1ciDwn4+U77iPJywKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgYmdDb2xvcjogJyNlOGQ1YjcnLCAvLyBTYW5keQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBsYW5kbWFya3M6IFsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsge25hbWU6ICdQaWNob2xhIExha2UnLCB4OiA0NTAwLCB5OiA0NTAwLCB3OiAxNTAwLCBoOiAxMDAwLCBjb2xvcjogJyM0YTkwZTInfSwKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsge25hbWU6ICdDaXR5IFBhbGFjZScsIHg6IDQ4MDAsIHk6IDQzMDAsIHc6IDQwMCwgaDogNTAwLCBjb2xvcjogJyNkNGFmMzcnfSwKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsge25hbWU6ICdKYWdkaXNoIFRlbXBsZScsIHg6IDQyMDAsIHk6IDQ2MDAsIHc6IDIwMCwgaDogMjAwLCBjb2xvcjogJyM4YjQ1MTMnfQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBdLAombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyByb2FkczogWwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBCb3JkZXIgJmFtcDsgbWFpbiByb2FkcwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB7eDE6MTUwMCwgeTE6MTUwMCwgeDI6ODUwMCwgeTI6MTUwMH0sIHt4MToxNTAwLCB5MToxNTAwLCB4MjoxNTAwLCB5Mjo4NTAwfSwKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsge3gxOjg1MDAsIHkxOjE1MDAsIHgyOjg1MDAsIHkyOjg1MDB9LCB7eDE6MTUwMCwgeTE6ODUwMCwgeDI6ODUwMCwgeTI6ODUwMH0sCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIENpdHkgZ3JpZCBhcm91bmQgbGFrZQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB7eDE6MzAwMCwgeTE6MzAwMCwgeDI6NjAwMCwgeTI6MzAwMH0sIHt4MTo2MDAwLCB5MTozMDAwLCB4Mjo2MDAwLCB5Mjo2MDAwfSwKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsge3gxOjYwMDAsIHkxOjYwMDAsIHgyOjMwMDAsIHkyOjYwMDB9LCB7eDE6MzAwMCwgeTE6NjAwMCwgeDI6MzAwMCwgeTI6MzAwMH0sCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIFNwb2tlcyB0byBsYW5kbWFya3MKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsge3gxOjQ1MDAsIHkxOjIwMDAsIHgyOjQ1MDAsIHkyOjQwMDB9LCB7eDE6MjAwMCwgeTE6NDUwMCwgeDI6MzUwMCwgeTI6NDUwMH0sCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHt4MTo2NTAwLCB5MTo0NTAwLCB4Mjo4MDAwLCB5Mjo0NTAwfQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBdCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0sCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgbmFtZTogJ0xldmVsIDI6IEpvZGhwdXIg8J+PsCcsCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGJnQ29sb3I6ICcjZDJiNDhjJywgLy8gRGVzZXJ0CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxhbmRtYXJrczogWwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB7bmFtZTogJ01laHJhbmdhcmggRm9ydCcsIHg6IDI1MDAsIHk6IDI1MDAsIHc6IDgwMCwgaDogMTAwMCwgY29sb3I6ICcjYTA1MjJkJ30sCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHtuYW1lOiAnVW1haWQgQmhhd2FuIFBhbGFjZScsIHg6IDQ1MDAsIHk6IDM1MDAsIHc6IDUwMCwgaDogNDAwLCBjb2xvcjogJyNmZmQ3MDAnfSwKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsge25hbWU6ICdDbG9jayBUb3dlcicsIHg6IDU1MDAsIHk6IDQ1MDAsIHc6IDE1MCwgaDogMTUwLCBjb2xvcjogJyNmZjQ1MDAnfQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBdLAombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyByb2FkczogWwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBCb3JkZXIKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsge3gxOjE1MDAsIHkxOjE1MDAsIHgyOjg1MDAsIHkyOjE1MDB9LCB7eDE6MTUwMCwgeTE6MTUwMCwgeDI6MTUwMCwgeTI6ODUwMH0sCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHt4MTo4NTAwLCB5MToxNTAwLCB4Mjo4NTAwLCB5Mjo4NTAwfSwge3gxOjE1MDAsIHkxOjg1MDAsIHgyOjg1MDAsIHkyOjg1MDB9LAombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBGb3J0IHJvYWRzCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHt4MToyMDAwLCB5MToyMDAwLCB4Mjo1MDAwLCB5MjoyMDAwfSwge3gxOjIwMDAsIHkxOjIwMDAsIHgyOjIwMDAsIHkyOjUwMDB9LAombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB7eDE6NTAwMCwgeTE6MjAwMCwgeDI6NTAwMCwgeTI6NTAwMH0sCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIENpdHkKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsge3gxOjMwMDAsIHkxOjQwMDAsIHgyOjcwMDAsIHkyOjQwMDB9LCB7eDE6NTAwMCwgeTE6MzAwMCwgeDI6NTAwMCwgeTI6NzAwMH0KJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgXQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IF07CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGxldCBjdXJyZW50TGV2ZWwgPSAwOwombHJtOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBFdmVudHMKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPSZndDsgeyBrZXlzW2UuY29kZV0gPSB0cnVlOyB9KTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGUpID0mZ3Q7IHsga2V5c1tlLmNvZGVdID0gZmFsc2U7IH0pOwombHJtOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGUpID0mZ3Q7IHsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgbW91c2VEb3duID0gdHJ1ZTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcHJldk1YID0gZS5vZmZzZXRYOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwcmV2TVkgPSBlLm9mZnNldFk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0pOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgKGUpID0mZ3Q7IHsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWYgKG1vdXNlRG93bikgewombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjb25zdCBkeCA9IChlLm9mZnNldFggLSBwcmV2TVgpIC8gcGxheWVyLnpvb207CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNvbnN0IGR5ID0gKGUub2Zmc2V0WSAtIHByZXZNWSkgLyBwbGF5ZXIuem9vbTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2FtT2Zmc2V0WCArPSBkeDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2FtT2Zmc2V0WSArPSBkeTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwcmV2TVggPSBlLm9mZnNldFg7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHByZXZNWSA9IGUub2Zmc2V0WTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfSk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKCkgPSZndDsgeyBtb3VzZURvd24gPSBmYWxzZTsgfSk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIChlKSA9Jmd0OyB7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGUucHJldmVudERlZmF1bHQoKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcGxheWVyLnpvb20gKj0gZS5kZWx0YVkgJmd0OyAwID8gMC45IDogMS4xOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwbGF5ZXIuem9vbSA9IE1hdGgubWF4KDAuMSwgTWF0aC5taW4oNSwgcGxheWVyLnpvb20pKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfSk7CiZscm07CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIFRvdWNoIE1vYmlsZQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIChlKSA9Jmd0OyB7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGUucHJldmVudERlZmF1bHQoKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29uc3QgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29uc3QgdHggPSAoZS50b3VjaGVzWzBdLmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aCAqIGNhbnZhcy53aWR0aDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29uc3QgdHkgPSAoZS50b3VjaGVzWzBdLmNsaWVudFkgLSByZWN0LnRvcCkgLyByZWN0LmhlaWdodCAqIGNhbnZhcy5oZWlnaHQ7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmICh0eCAmbHQ7IGNhbnZhcy53aWR0aCAvIDIpIHsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gTGVmdDogSm95c3RpY2sgZHJpdmUKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgam95c3RpY2suYWN0aXZlID0gdHJ1ZTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgam95c3RpY2suc3ggPSB0eDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgam95c3RpY2suc3kgPSB0eTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfSBlbHNlIHsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gUmlnaHQ6IFBhbgombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwYW5uaW5nID0gdHJ1ZTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcGFuU1ggPSB0eDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcGFuU1kgPSB0eTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9KTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIChlKSA9Jmd0OyB7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGUucHJldmVudERlZmF1bHQoKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29uc3QgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29uc3QgdHggPSAoZS50b3VjaGVzWzBdLmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aCAqIGNhbnZhcy53aWR0aDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29uc3QgdHkgPSAoZS50b3VjaGVzWzBdLmNsaWVudFkgLSByZWN0LnRvcCkgLyByZWN0LmhlaWdodCAqIGNhbnZhcy5oZWlnaHQ7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmIChqb3lzdGljay5hY3RpdmUpIHsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgam95c3RpY2suZHggPSAodHggLSBqb3lzdGljay5zeCkgLyBjYW52YXMud2lkdGggKiAyMDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgam95c3RpY2suZHkgPSAodHkgLSBqb3lzdGljay5zeSkgLyBjYW52YXMuaGVpZ2h0ICogMjA7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0gZWxzZSBpZiAocGFubmluZykgewombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjb25zdCBkeCA9ICh0eCAtIHBhblNYKSAvIHBsYXllci56b29tOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjb25zdCBkeSA9ICh0eSAtIHBhblNZKSAvIHBsYXllci56b29tOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjYW1PZmZzZXRYICs9IGR4OwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjYW1PZmZzZXRZICs9IGR5OwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwYW5TWCA9IHR4OwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwYW5TWSA9IHR5OwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0pOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCAoZSkgPSZndDsgewombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBlLnByZXZlbnREZWZhdWx0KCk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGpveXN0aWNrLmFjdGl2ZSA9IGZhbHNlOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwYW5uaW5nID0gZmFsc2U7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0pOwombHJtOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBmdW5jdGlvbiB1cGRhdGUoKSB7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIERyaXZlIElucHV0CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmIChrZXlzWydBcnJvd0xlZnQnXSB8fCBrZXlzWydLZXlBJ10pIHBsYXllci5hbmdsZSAtPSAwLjA4OwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZiAoa2V5c1snQXJyb3dSaWdodCddIHx8IGtleXNbJ0tleUQnXSkgcGxheWVyLmFuZ2xlICs9IDAuMDg7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmIChrZXlzWydBcnJvd1VwJ10gfHwga2V5c1snS2V5VyddKSB7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBsYXllci52eCArPSBNYXRoLmNvcyhwbGF5ZXIuYW5nbGUpICogcGxheWVyLmFjY2VsOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwbGF5ZXIudnkgKz0gTWF0aC5zaW4ocGxheWVyLmFuZ2xlKSAqIHBsYXllci5hY2NlbDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZiAoa2V5c1snQXJyb3dEb3duJ10gfHwga2V5c1snS2V5UyddKSB7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBsYXllci52eCAtPSBNYXRoLmNvcyhwbGF5ZXIuYW5nbGUpICogcGxheWVyLmFjY2VsICogMC41OwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwbGF5ZXIudnkgLT0gTWF0aC5zaW4ocGxheWVyLmFuZ2xlKSAqIHBsYXllci5hY2NlbCAqIDAuNTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBUb3VjaCBqb3lzdGljawombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZiAoam95c3RpY2suYWN0aXZlKSB7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBsYXllci5hbmdsZSArPSBqb3lzdGljay5keCAqIDAuMTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWYgKGpveXN0aWNrLmR5ICZsdDsgMCkgewombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwbGF5ZXIudnggKz0gTWF0aC5jb3MocGxheWVyLmFuZ2xlKSAqIHBsYXllci5hY2NlbDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcGxheWVyLnZ5ICs9IE1hdGguc2luKHBsYXllci5hbmdsZSkgKiBwbGF5ZXIuYWNjZWw7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0KJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWYgKGpveXN0aWNrLmR5ICZndDsgMCkgewombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwbGF5ZXIudnggLT0gTWF0aC5jb3MocGxheWVyLmFuZ2xlKSAqIHBsYXllci5hY2NlbCAqIDAuMzsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcGxheWVyLnZ5IC09IE1hdGguc2luKHBsYXllci5hbmdsZSkgKiBwbGF5ZXIuYWNjZWwgKiAwLjM7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0KJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBQaHlzaWNzCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNvbnN0IHNwZWVkID0gTWF0aC5zcXJ0KHBsYXllci52eCAqIHBsYXllci52eCArIHBsYXllci52eSAqIHBsYXllci52eSk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmIChzcGVlZCAmZ3Q7IHBsYXllci5tYXhTcGVlZCkgewombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwbGF5ZXIudnggPSAocGxheWVyLnZ4IC8gc3BlZWQpICogcGxheWVyLm1heFNwZWVkOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwbGF5ZXIudnkgPSAocGxheWVyLnZ5IC8gc3BlZWQpICogcGxheWVyLm1heFNwZWVkOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBsYXllci52eCAqPSBwbGF5ZXIuZnJpY3Rpb247CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBsYXllci52eSAqPSBwbGF5ZXIuZnJpY3Rpb247CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBsYXllci54ICs9IHBsYXllci52eDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcGxheWVyLnkgKz0gcGxheWVyLnZ5OwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBCb3VuZHMKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcGxheWVyLnggPSBNYXRoLm1heCg1MCwgTWF0aC5taW4od29ybGRXIC0gNTAsIHBsYXllci54KSk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBsYXllci55ID0gTWF0aC5tYXgoNTAsIE1hdGgubWluKHdvcmxkSCAtIDUwLCBwbGF5ZXIueSkpOwombHJtOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBDb2xsaXNpb24gJmFtcDsgVmlzaXQgTGFuZG1hcmtzCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNvbnN0IGxtID0gbGV2ZWxzW2N1cnJlbnRMZXZlbF0ubGFuZG1hcmtzOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBmb3IgKGxldCBpID0gMDsgaSAmbHQ7IGxtLmxlbmd0aDsgaSsrKSB7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNvbnN0IGwgPSBsbVtpXTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29uc3QgZHggPSBwbGF5ZXIueCAtIGwueDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29uc3QgZHkgPSBwbGF5ZXIueSAtIGwueTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWYgKE1hdGguYWJzKGR4KSAmbHQ7IGwudyAvIDIgKyA1MCAmYW1wOyZhbXA7IE1hdGguYWJzKGR5KSAmbHQ7IGwuaCAvIDIgKyA1MCkgewombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBCb3VuY2UKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29uc3QgYm91bmNlQW5nbGUgPSBNYXRoLmF0YW4yKGR5LCBkeCk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBsYXllci52eCA9IE1hdGguY29zKGJvdW5jZUFuZ2xlKSAqIDM7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBsYXllci52eSA9IE1hdGguc2luKGJvdW5jZUFuZ2xlKSAqIDM7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIFZpc2l0IQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwbGF5ZXIuc2NvcmUgKz0gMTAwOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBhbGVydChg8J+PhiBWaXNpdGVkICR7bC5uYW1lfSEgU2NvcmU6ICR7cGxheWVyLnNjb3JlfSDwn5SlYCk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0KJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfQombHJtOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBMZXZlbCBzd2l0Y2gKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWYgKGtleXNbJ0RpZ2l0MSddKSB7IGN1cnJlbnRMZXZlbCA9IDA7IHBsYXllci54ID0gNTAwMDsgcGxheWVyLnkgPSA3NTAwOyB9CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmIChrZXlzWydEaWdpdDInXSkgeyBjdXJyZW50TGV2ZWwgPSAxOyBwbGF5ZXIueCA9IDUwMDA7IHBsYXllci55ID0gNzUwMDsgfQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZiAoa2V5c1snS2V5QyddKSB7IHBsYXllci5jYXJUeXBlID0gKHBsYXllci5jYXJUeXBlICsgMSkgJSAzOyB9CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIFpvb20KJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWYgKGtleXNbJ0VxdWFsJ10gfHwga2V5c1snTnVtcGFkQWRkJ10pIHBsYXllci56b29tICo9IDEuMTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWYgKGtleXNbJ01pbnVzJ10gfHwga2V5c1snTnVtcGFkU3VidHJhY3QnXSkgcGxheWVyLnpvb20gKj0gMC45OwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBwbGF5ZXIuem9vbSA9IE1hdGgubWF4KDAuMiwgTWF0aC5taW4oNCwgcGxheWVyLnpvb20pKTsKJmxybTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gQ2FtZXJhIGZvbGxvdyArIG9mZnNldAombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjYW1YID0gcGxheWVyLnggLSBjYW52YXMud2lkdGggLyAyIC8gcGxheWVyLnpvb20gKyBjYW1PZmZzZXRYOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjYW1ZID0gcGxheWVyLnkgLSBjYW52YXMuaGVpZ2h0IC8gMiAvIHBsYXllci56b29tICsgY2FtT2Zmc2V0WTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfQombHJtOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBmdW5jdGlvbiBkcmF3KCkgewombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguc2F2ZSgpOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguc2NhbGUocGxheWVyLnpvb20sIHBsYXllci56b29tKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LnRyYW5zbGF0ZSgtY2FtWCwgLWNhbVkpOwombHJtOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBXb3JsZCBCRwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguZmlsbFN0eWxlID0gbGV2ZWxzW2N1cnJlbnRMZXZlbF0uYmdDb2xvcjsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LmZpbGxSZWN0KDAsIDAsIHdvcmxkVywgd29ybGRIKTsKJmxybTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gUm9hZHMgKHRoaWNrIGxpbmVzKQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguc3Ryb2tlU3R5bGUgPSAnIzY2Nic7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5saW5lV2lkdGggPSA4MCAvIHBsYXllci56b29tOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHgubGluZUNhcCA9ICdyb3VuZCc7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNvbnN0IHJvYWRzID0gbGV2ZWxzW2N1cnJlbnRMZXZlbF0ucm9hZHM7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZvciAobGV0IHIgb2Ygcm9hZHMpIHsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LmJlZ2luUGF0aCgpOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHgubW92ZVRvKHIueDEsIHIueTEpOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHgubGluZVRvKHIueDIsIHIueTIpOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguc3Ryb2tlKCk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0KJmxybTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gTGFuZG1hcmtzCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNvbnN0IGxtID0gbGV2ZWxzW2N1cnJlbnRMZXZlbF0ubGFuZG1hcmtzOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBmb3IgKGxldCBsIG9mIGxtKSB7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5maWxsU3R5bGUgPSBsLmNvbG9yOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguc2hhZG93Q29sb3IgPSAncmdiYSgwLDAsMCwwLjMpJzsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LnNoYWRvd0JsdXIgPSAyMCAvIHBsYXllci56b29tOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguZmlsbFJlY3QobC54IC0gbC53IC8gMiwgbC55IC0gbC5oIC8gMiwgbC53LCBsLmgpOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguc2hhZG93Qmx1ciA9IDA7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5zdHJva2VTdHlsZSA9ICcjMDAwJzsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LmxpbmVXaWR0aCA9IDQgLyBwbGF5ZXIuem9vbTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LnN0cm9rZVJlY3QobC54IC0gbC53IC8gMiwgbC55IC0gbC5oIC8gMiwgbC53LCBsLmgpOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBOYW1lCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5maWxsU3R5bGUgPSAnd2hpdGUnOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguZm9udCA9IGBib2xkICR7NDAgLyBwbGF5ZXIuem9vbX1weCBBcmlhbGA7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJzsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguZmlsbFRleHQobC5uYW1lLCBsLngsIGwueSAtIGwuaCAvIDIgLSAzMCAvIHBsYXllci56b29tKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfQombHJtOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBDYXIgKEx1eHVyeSBzaGFwZXMpCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5zYXZlKCk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC50cmFuc2xhdGUocGxheWVyLngsIHBsYXllci55KTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LnJvdGF0ZShwbGF5ZXIuYW5nbGUpOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjb25zdCBjYXJDb2xvcnMgPSBbJyNmZjAwMDAnLCAnIzAwMDBmZicsICcjODAwMDgwJ107IC8vIFJlZCBNZXJjLCBCbHVlIEJNVywgUHVycGxlIEF1ZGkKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LmZpbGxTdHlsZSA9IGNhckNvbG9yc1twbGF5ZXIuY2FyVHlwZV07CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5zaGFkb3dDb2xvciA9ICdyZ2JhKDAsMCwwLDAuNSknOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguc2hhZG93Qmx1ciA9IDE1IC8gcGxheWVyLnpvb207CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIEJvZHkgKGx1eHVyeSBjb3VwZSBzaGFwZSkKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LmJlZ2luUGF0aCgpOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHgubW92ZVRvKC00NSwgLTIwKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LmxpbmVUbyg1MCwgLTIwKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LmxpbmVUbyg1MCwgMTUpOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHgubGluZVRvKDIwLCAyNSk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5saW5lVG8oLTQ1LCAyNSk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5jbG9zZVBhdGgoKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LmZpbGwoKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gV2luZG93cwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguZmlsbFN0eWxlID0gJyNhZGQ4ZTYnOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguZmlsbFJlY3QoLTMwLCAtMTAsIDUwLCAxNSk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5zaGFkb3dCbHVyID0gMDsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gV2hlZWxzCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5maWxsU3R5bGUgPSAnIzMzMyc7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5iZWdpblBhdGgoKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LmFyYygtMzUsIC0xNSwgMTIgLyBwbGF5ZXIuem9vbSAqIHBsYXllci56b29tLCAwLCBNYXRoLlBJICogMik7IGN0eC5maWxsKCk7IC8vIFNjYWxlIGZpeAombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguYXJjKC0zNSwgMjAsIDEyLCAwLCBNYXRoLlBJICogMik7IGN0eC5maWxsKCk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5hcmMoNDAsIC0xNSwgMTIsIDAsIE1hdGguUEkgKiAyKTsgY3R4LmZpbGwoKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LmFyYyg0MCwgMjAsIDEyLCAwLCBNYXRoLlBJICogMik7IGN0eC5maWxsKCk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5yZXN0b3JlKCk7CiZscm07CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5yZXN0b3JlKCk7CiZscm07CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIFVJIE92ZXJsYXkKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDAsMCwwLDAuNSknOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCAxMjApOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguZmlsbFN0eWxlID0gJyNmZmQ3MDAnOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguZm9udCA9ICdib2xkIDI4cHggQXJpYWwnOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHgudGV4dEFsaWduID0gJ2xlZnQnOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguZmlsbFRleHQobGV2ZWxzW2N1cnJlbnRMZXZlbF0ubmFtZSwgMjAsIDQwKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LmZpbGxUZXh0KGBDYXI6ICR7WydNZXJjZWRlcycsICdCTVcnLCAnQXVkaSddW3BsYXllci5jYXJUeXBlXX1gLCAyMCwgNzApOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHguZmlsbFRleHQoYFNjb3JlOiAke3BsYXllci5zY29yZX1gLCAyMCwgMTAwKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LmZvbnQgPSAnMjBweCBBcmlhbCc7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGN0eC5maWxsVGV4dCgnMTpVZGFpcHVyIDI6Sm9kaHB1ciB8IEM6Q2FyIHwgKy8tIFpvb20gfCBEcmFnIFBhbicsIDIwLCBjYW52YXMuaGVpZ2h0IC0gMzApOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjdHgudGV4dEFsaWduID0gJ3JpZ2h0JzsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY3R4LmZpbGxUZXh0KCdUb3VjaCBMZWZ0OkRyaXZlIHwgUmlnaHQ6UGFuJywgY2FudmFzLndpZHRoIC0gMjAsIGNhbnZhcy5oZWlnaHQgLSAzMCk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH0KJmxybTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gR2FtZSBMb29wCiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZ1bmN0aW9uIGxvb3AoKSB7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHVwZGF0ZSgpOwombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBkcmF3KCk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTsKJmxybTsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfQombHJtOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBsb29wKCk7CiZscm07Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDsvc2NyaXB0Jmd0OwombHJtOyZsdDsvYm9keSZndDsKJmxybTsmbHQ7L2h0bWwmZ3Q7CiZscm07
<!DOCTYPE html>
<html>
<head>
<title>Desi Drive: India Explorer 🚗🇮🇳</title>
<style>body{margin:0;background:#000;overflow:hidden;}canvas{border:2px solid #ffd700;}</style>
</head>
<body>
<canvas id="canvas" width="800" height="600"></canvas>
<script>
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const worldW = 10000;
const worldH = 10000;
// Player/Car
const player = {
x: 5000, y: 7500, vx: 0, vy: 0, angle: 0,
accel: 0.3, friction: 0.95, maxSpeed: 8,
zoom: 1, carType: 0, score: 0
};
// Camera
let camX = 0, camY = 0, camOffsetX = 0, camOffsetY = 0;
// Input
const keys = {};
let mouseDown = false, prevMX = 0, prevMY = 0;
let joystick = {active: false, sx: 0, sy: 0, dx: 0, dy: 0};
let panning = false, panSX = 0, panSY = 0;
// Levels - Add more easy!
const levels = [
{
name: 'Level 1: Udaipur 🏔️',
bgColor: '#e8d5b7', // Sandy
landmarks: [
{name: 'Pichola Lake', x: 4500, y: 4500, w: 1500, h: 1000, color: '#4a90e2'},
{name: 'City Palace', x: 4800, y: 4300, w: 400, h: 500, color: '#d4af37'},
{name: 'Jagdish Temple', x: 4200, y: 4600, w: 200, h: 200, color: '#8b4513'}
],
roads: [
// Border & main roads
{x1:1500, y1:1500, x2:8500, y2:1500}, {x1:1500, y1:1500, x2:1500, y2:8500},
{x1:8500, y1:1500, x2:8500, y2:8500}, {x1:1500, y1:8500, x2:8500, y2:8500},
// City grid around lake
{x1:3000, y1:3000, x2:6000, y2:3000}, {x1:6000, y1:3000, x2:6000, y2:6000},
{x1:6000, y1:6000, x2:3000, y2:6000}, {x1:3000, y1:6000, x2:3000, y2:3000},
// Spokes to landmarks
{x1:4500, y1:2000, x2:4500, y2:4000}, {x1:2000, y1:4500, x2:3500, y2:4500},
{x1:6500, y1:4500, x2:8000, y2:4500}
]
},
{
name: 'Level 2: Jodhpur 🏰',
bgColor: '#d2b48c', // Desert
landmarks: [
{name: 'Mehrangarh Fort', x: 2500, y: 2500, w: 800, h: 1000, color: '#a0522d'},
{name: 'Umaid Bhawan Palace', x: 4500, y: 3500, w: 500, h: 400, color: '#ffd700'},
{name: 'Clock Tower', x: 5500, y: 4500, w: 150, h: 150, color: '#ff4500'}
],
roads: [
// Border
{x1:1500, y1:1500, x2:8500, y2:1500}, {x1:1500, y1:1500, x2:1500, y2:8500},
{x1:8500, y1:1500, x2:8500, y2:8500}, {x1:1500, y1:8500, x2:8500, y2:8500},
// Fort roads
{x1:2000, y1:2000, x2:5000, y2:2000}, {x1:2000, y1:2000, x2:2000, y2:5000},
{x1:5000, y1:2000, x2:5000, y2:5000},
// City
{x1:3000, y1:4000, x2:7000, y2:4000}, {x1:5000, y1:3000, x2:5000, y2:7000}
]
}
];
let currentLevel = 0;
// Events
window.addEventListener('keydown', (e) => { keys[e.code] = true; });
window.addEventListener('keyup', (e) => { keys[e.code] = false; });
canvas.addEventListener('mousedown', (e) => {
mouseDown = true;
prevMX = e.offsetX;
prevMY = e.offsetY;
});
canvas.addEventListener('mousemove', (e) => {
if (mouseDown) {
const dx = (e.offsetX - prevMX) / player.zoom;
const dy = (e.offsetY - prevMY) / player.zoom;
camOffsetX += dx;
camOffsetY += dy;
}
prevMX = e.offsetX;
prevMY = e.offsetY;
});
canvas.addEventListener('mouseup', () => { mouseDown = false; });
canvas.addEventListener('wheel', (e) => {
e.preventDefault();
player.zoom *= e.deltaY > 0 ? 0.9 : 1.1;
player.zoom = Math.max(0.1, Math.min(5, player.zoom));
});
// Touch Mobile
canvas.addEventListener('touchstart', (e) => {
e.preventDefault();
const rect = canvas.getBoundingClientRect();
const tx = (e.touches[0].clientX - rect.left) / rect.width * canvas.width;
const ty = (e.touches[0].clientY - rect.top) / rect.height * canvas.height;
if (tx < canvas.width / 2) {
// Left: Joystick drive
joystick.active = true;
joystick.sx = tx;
joystick.sy = ty;
} else {
// Right: Pan
panning = true;
panSX = tx;
panSY = ty;
}
});
canvas.addEventListener('touchmove', (e) => {
e.preventDefault();
const rect = canvas.getBoundingClientRect();
const tx = (e.touches[0].clientX - rect.left) / rect.width * canvas.width;
const ty = (e.touches[0].clientY - rect.top) / rect.height * canvas.height;
if (joystick.active) {
joystick.dx = (tx - joystick.sx) / canvas.width * 20;
joystick.dy = (ty - joystick.sy) / canvas.height * 20;
} else if (panning) {
const dx = (tx - panSX) / player.zoom;
const dy = (ty - panSY) / player.zoom;
camOffsetX += dx;
camOffsetY += dy;
panSX = tx;
panSY = ty;
}
});
canvas.addEventListener('touchend', (e) => {
e.preventDefault();
joystick.active = false;
panning = false;
});
function update() {
// Drive Input
if (keys['ArrowLeft'] || keys['KeyA']) player.angle -= 0.08;
if (keys['ArrowRight'] || keys['KeyD']) player.angle += 0.08;
if (keys['ArrowUp'] || keys['KeyW']) {
player.vx += Math.cos(player.angle) * player.accel;
player.vy += Math.sin(player.angle) * player.accel;
}
if (keys['ArrowDown'] || keys['KeyS']) {
player.vx -= Math.cos(player.angle) * player.accel * 0.5;
player.vy -= Math.sin(player.angle) * player.accel * 0.5;
}
// Touch joystick
if (joystick.active) {
player.angle += joystick.dx * 0.1;
if (joystick.dy < 0) {
player.vx += Math.cos(player.angle) * player.accel;
player.vy += Math.sin(player.angle) * player.accel;
}
if (joystick.dy > 0) {
player.vx -= Math.cos(player.angle) * player.accel * 0.3;
player.vy -= Math.sin(player.angle) * player.accel * 0.3;
}
}
// Physics
const speed = Math.sqrt(player.vx * player.vx + player.vy * player.vy);
if (speed > player.maxSpeed) {
player.vx = (player.vx / speed) * player.maxSpeed;
player.vy = (player.vy / speed) * player.maxSpeed;
}
player.vx *= player.friction;
player.vy *= player.friction;
player.x += player.vx;
player.y += player.vy;
// Bounds
player.x = Math.max(50, Math.min(worldW - 50, player.x));
player.y = Math.max(50, Math.min(worldH - 50, player.y));
// Collision & Visit Landmarks
const lm = levels[currentLevel].landmarks;
for (let i = 0; i < lm.length; i++) {
const l = lm[i];
const dx = player.x - l.x;
const dy = player.y - l.y;
if (Math.abs(dx) < l.w / 2 + 50 && Math.abs(dy) < l.h / 2 + 50) {
// Bounce
const bounceAngle = Math.atan2(dy, dx);
player.vx = Math.cos(bounceAngle) * 3;
player.vy = Math.sin(bounceAngle) * 3;
// Visit!
player.score += 100;
alert(`🏆 Visited ${l.name}! Score: ${player.score} 🔥`);
}
}
// Level switch
if (keys['Digit1']) { currentLevel = 0; player.x = 5000; player.y = 7500; }
if (keys['Digit2']) { currentLevel = 1; player.x = 5000; player.y = 7500; }
if (keys['KeyC']) { player.carType = (player.carType + 1) % 3; }
// Zoom
if (keys['Equal'] || keys['NumpadAdd']) player.zoom *= 1.1;
if (keys['Minus'] || keys['NumpadSubtract']) player.zoom *= 0.9;
player.zoom = Math.max(0.2, Math.min(4, player.zoom));
// Camera follow + offset
camX = player.x - canvas.width / 2 / player.zoom + camOffsetX;
camY = player.y - canvas.height / 2 / player.zoom + camOffsetY;
}
function draw() {
ctx.save();
ctx.scale(player.zoom, player.zoom);
ctx.translate(-camX, -camY);
// World BG
ctx.fillStyle = levels[currentLevel].bgColor;
ctx.fillRect(0, 0, worldW, worldH);
// Roads (thick lines)
ctx.strokeStyle = '#666';
ctx.lineWidth = 80 / player.zoom;
ctx.lineCap = 'round';
const roads = levels[currentLevel].roads;
for (let r of roads) {
ctx.beginPath();
ctx.moveTo(r.x1, r.y1);
ctx.lineTo(r.x2, r.y2);
ctx.stroke();
}
// Landmarks
const lm = levels[currentLevel].landmarks;
for (let l of lm) {
ctx.fillStyle = l.color;
ctx.shadowColor = 'rgba(0,0,0,0.3)';
ctx.shadowBlur = 20 / player.zoom;
ctx.fillRect(l.x - l.w / 2, l.y - l.h / 2, l.w, l.h);
ctx.shadowBlur = 0;
ctx.strokeStyle = '#000';
ctx.lineWidth = 4 / player.zoom;
ctx.strokeRect(l.x - l.w / 2, l.y - l.h / 2, l.w, l.h);
// Name
ctx.fillStyle = 'white';
ctx.font = `bold ${40 / player.zoom}px Arial`;
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(l.name, l.x, l.y - l.h / 2 - 30 / player.zoom);
}
// Car (Luxury shapes)
ctx.save();
ctx.translate(player.x, player.y);
ctx.rotate(player.angle);
const carColors = ['#ff0000', '#0000ff', '#800080']; // Red Merc, Blue BMW, Purple Audi
ctx.fillStyle = carColors[player.carType];
ctx.shadowColor = 'rgba(0,0,0,0.5)';
ctx.shadowBlur = 15 / player.zoom;
// Body (luxury coupe shape)
ctx.beginPath();
ctx.moveTo(-45, -20);
ctx.lineTo(50, -20);
ctx.lineTo(50, 15);
ctx.lineTo(20, 25);
ctx.lineTo(-45, 25);
ctx.closePath();
ctx.fill();
// Windows
ctx.fillStyle = '#add8e6';
ctx.fillRect(-30, -10, 50, 15);
ctx.shadowBlur = 0;
// Wheels
ctx.fillStyle = '#333';
ctx.beginPath();
ctx.arc(-35, -15, 12 / player.zoom * player.zoom, 0, Math.PI * 2); ctx.fill(); // Scale fix
ctx.arc(-35, 20, 12, 0, Math.PI * 2); ctx.fill();
ctx.arc(40, -15, 12, 0, Math.PI * 2); ctx.fill();
ctx.arc(40, 20, 12, 0, Math.PI * 2); ctx.fill();
ctx.restore();
ctx.restore();
// UI Overlay
ctx.fillStyle = 'rgba(0,0,0,0.5)';
ctx.fillRect(0, 0, canvas.width, 120);
ctx.fillStyle = '#ffd700';
ctx.font = 'bold 28px Arial';
ctx.textAlign = 'left';
ctx.fillText(levels[currentLevel].name, 20, 40);
ctx.fillText(`Car: ${['Mercedes', 'BMW', 'Audi'][player.carType]}`, 20, 70);
ctx.fillText(`Score: ${player.score}`, 20, 100);
ctx.font = '20px Arial';
ctx.fillText('1:Udaipur 2:Jodhpur | C:Car | +/- Zoom | Drag Pan', 20, canvas.height - 30);
ctx.textAlign = 'right';
ctx.fillText('Touch Left:Drive | Right:Pan', canvas.width - 20, canvas.height - 30);
}
// Game Loop
function loop() {
update();
draw();
requestAnimationFrame(loop);
}
loop();
</script>
</body>
</html>