IyEvdXNyL2Jpbi9lbnYgcHl0aG9uClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAACwAAAF9faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQDCSg2r1xYAANcWAAALAAAAX19tYWluX18ucHkjIENvcHlyaWdodCAyMDE3IFRoZSBCYXplbCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgojCiMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgojIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAojCiMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiIiIlRoZSB3aGwgbW9kdWxlcyBkZWZpbmVzIGNsYXNzZXMgZm9yIGludGVyYWN0aW5nIHdpdGggUHl0aG9uIHBhY2thZ2VzLiIiIgoKIyBCb2lsZXJwbGF0ZSBhZGRlZCBieSBzdWJwYXIvY29tcGlsZXIvcHl0aG9uX2FyY2hpdmUucHkKZnJvbSBzdWJwYXIucnVudGltZSBpbXBvcnQgc3VwcG9ydCBhcyBfCl8uc2V0dXAoaW1wb3J0X3Jvb3RzPVt1J3B5cGlfX3NldHVwdG9vbHNfMzhfMl80JywgdSdpb19iYXplbF9ydWxlc19weXRob24nLCB1J3B5cGlfX3NldHVwdG9vbHNfMzhfMl80J10sIHppcF9zYWZlPVRydWUpCmRlbCBfCiMgRW5kIGJvaWxlcnBsYXRlCmltcG9ydCBhcmdwYXJzZQppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHJlCmltcG9ydCB6aXBmaWxlCgoKY2xhc3MgV2hlZWwob2JqZWN0KToKCiAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgc2VsZi5fcGF0aCA9IHBhdGgKCiAgZGVmIHBhdGgoc2VsZik6CiAgICByZXR1cm4gc2VsZi5fcGF0aAoKICBkZWYgYmFzZW5hbWUoc2VsZik6CiAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShzZWxmLnBhdGgoKSkKCiAgZGVmIGRpc3RyaWJ1dGlvbihzZWxmKToKICAgICMgU2VlIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvI2ZpbGUtbmFtZS1jb252ZW50aW9uCiAgICBwYXJ0cyA9IHNlbGYuYmFzZW5hbWUoKS5zcGxpdCgnLScpCiAgICByZXR1cm4gcGFydHNbMF0KCiAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAjIFNlZSBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDI3LyNmaWxlLW5hbWUtY29udmVudGlvbgogICAgcGFydHMgPSBzZWxmLmJhc2VuYW1lKCkuc3BsaXQoJy0nKQogICAgcmV0dXJuIHBhcnRzWzFdCgogIGRlZiByZXBvc2l0b3J5X25hbWUoc2VsZik6CiAgICAjIFJldHVybnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBCYXplbCByZXBvc2l0b3J5IGZvciB0aGlzIHBhY2thZ2UuCiAgICBjYW5vbmljYWwgPSAncHlwaV9fe31fe30nLmZvcm1hdChzZWxmLmRpc3RyaWJ1dGlvbigpLCBzZWxmLnZlcnNpb24oKSkKICAgICMgRXNjYXBlIGFueSBpbGxlZ2FsIGNoYXJhY3RlcnMgd2l0aCB1bmRlcnNjb3JlLgogICAgcmV0dXJuIHJlLnN1YignWy0uK10nLCAnXycsIGNhbm9uaWNhbCkKCiAgZGVmIF9kaXN0X2luZm8oc2VsZik6CiAgICAjIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZGlzdC1pbmZvIGRpcmVjdG9yeSB3aXRoaW4gdGhlIC53aGwgZmlsZS4KICAgICMgZS5nLiBnb29nbGVfY2xvdWQtMC4yNy4wLXB5Mi5weTMtbm9uZS1hbnkud2hsIC0+CiAgICAjICAgICAgZ29vZ2xlX2Nsb3VkLTAuMjcuMC5kaXN0LWluZm8KICAgIHJldHVybiAne30te30uZGlzdC1pbmZvJy5mb3JtYXQoc2VsZi5kaXN0cmlidXRpb24oKSwgc2VsZi52ZXJzaW9uKCkpCgogIGRlZiBtZXRhZGF0YShzZWxmKToKICAgICMgRXh0cmFjdCB0aGUgc3RydWN0dXJlZCBkYXRhIGZyb20gbWV0YWRhdGEuanNvbiBpbiB0aGUgV0hMJ3MgZGlzdC1pbmZvCiAgICAjIGRpcmVjdG9yeS4KICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHNlbGYucGF0aCgpLCAncicpIGFzIHdobDoKICAgICAgIyBmaXJzdCBjaGVjayBmb3IgbWV0YWRhdGEuanNvbgogICAgICB0cnk6CiAgICAgICAgd2l0aCB3aGwub3BlbihzZWxmLl9kaXN0X2luZm8oKSArICcvbWV0YWRhdGEuanNvbicpIGFzIGY6CiAgICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhmLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCiAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgIHBhc3MKICAgICAgIyBmYWxsIGJhY2sgdG8gTUVUQURBVEEgZmlsZSAoaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQyNy8pCiAgICAgIHdpdGggd2hsLm9wZW4oc2VsZi5fZGlzdF9pbmZvKCkgKyAnL01FVEFEQVRBJykgYXMgZjoKICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VfbWV0YWRhdGEoZi5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQoKICBkZWYgbmFtZShzZWxmKToKICAgIHJldHVybiBzZWxmLm1ldGFkYXRhKCkuZ2V0KCduYW1lJykKCiAgZGVmIGRlcGVuZGVuY2llcyhzZWxmLCBleHRyYT1Ob25lKToKICAgICIiIkFjY2VzcyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoaXMgV2hlZWwuCgogICAgQXJnczoKICAgICAgZXh0cmE6IGlmIHNwZWNpZmllZCwgaW5jbHVkZSB0aGUgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgb2YgdGhlIG5hbWVkICJleHRyYSIuCgogICAgWWllbGRzOgogICAgICB0aGUgbmFtZXMgb2YgcmVxdWlyZW1lbnRzIGZyb20gdGhlIG1ldGFkYXRhLmpzb24KICAgICIiIgogICAgIyBUT0RPKG1hdHRtb29yKTogSXMgdGhlcmUgYSBzY2hlbWEgdG8gZm9sbG93IGZvciB0aGlzPwogICAgcnVuX3JlcXVpcmVzID0gc2VsZi5tZXRhZGF0YSgpLmdldCgncnVuX3JlcXVpcmVzJywgW10pCiAgICBmb3IgcmVxdWlyZW1lbnQgaW4gcnVuX3JlcXVpcmVzOgogICAgICBpZiByZXF1aXJlbWVudC5nZXQoJ2V4dHJhJykgIT0gZXh0cmE6CiAgICAgICAgIyBNYXRjaCB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZXh0cmEgd2UncmUgbG9va2luZyBmb3IuCiAgICAgICAgY29udGludWUKICAgICAgbWFya2VyID0gcmVxdWlyZW1lbnQuZ2V0KCdlbnZpcm9ubWVudCcpCiAgICAgIGlmIG1hcmtlciBhbmQgbm90IHBrZ19yZXNvdXJjZXMuZXZhbHVhdGVfbWFya2VyKG1hcmtlcik6CiAgICAgICAgIyBUaGUgY3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgUEVQIDUwOCBtYXJrZXIsCiAgICAgICAgIyBzbyBpZ25vcmUgdGhpcyByZXF1aXJlbWVudC4KICAgICAgICBjb250aW51ZQogICAgICByZXF1aXJlcyA9IHJlcXVpcmVtZW50LmdldCgncmVxdWlyZXMnLCBbXSkKICAgICAgZm9yIGVudHJ5IGluIHJlcXVpcmVzOgogICAgICAgICMgU3RyaXAgb2ZmIGFueSB0cmFpbGluZyB2ZXJzaW9uaW5nIGRhdGEuCiAgICAgICAgcGFydHMgPSByZS5zcGxpdCgnWyA+PD0oKV0nLCBlbnRyeSkKICAgICAgICB5aWVsZCBwYXJ0c1swXQoKICBkZWYgZXh0cmFzKHNlbGYpOgogICAgcmV0dXJuIHNlbGYubWV0YWRhdGEoKS5nZXQoJ2V4dHJhcycsIFtdKQoKICBkZWYgZXhwYW5kKHNlbGYsIGRpcmVjdG9yeSk6CiAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShzZWxmLnBhdGgoKSwgJ3InKSBhcyB3aGw6CiAgICAgIHdobC5leHRyYWN0YWxsKGRpcmVjdG9yeSkKCiAgIyBfcGFyc2VfbWV0YWRhdGEgcGFyc2VzIE1FVEFEQVRBIGZpbGVzIGFjY29yZGluZyB0byBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wMzE0LwogIGRlZiBfcGFyc2VfbWV0YWRhdGEoc2VsZiwgY29udGVudCk6CiAgICAjIFRPRE86IGhhbmRsZSBmaWVsZHMgb3RoZXIgdGhhbiBqdXN0IG5hbWUKICAgIG5hbWVfcGF0dGVybiA9IHJlLmNvbXBpbGUoJ05hbWU6ICguKiknKQogICAgcmV0dXJuIHsgJ25hbWUnOiBuYW1lX3BhdHRlcm4uc2VhcmNoKGNvbnRlbnQpLmdyb3VwKDEpIH0KCgpwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKICAgIGRlc2NyaXB0aW9uPSdVbnBhY2sgYSBXSEwgZmlsZSBhcyBhIHB5X2xpYnJhcnkuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0td2hsJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSAud2hsIGZpbGUgd2UgYXJlIGV4cGFuZGluZy4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tcmVxdWlyZW1lbnRzJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIHBpcF9pbXBvcnQgZnJvbSB3aGljaCB0byBkcmF3IGRlcGVuZGVuY2llcy4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kaXJlY3RvcnknLCBhY3Rpb249J3N0b3JlJywgZGVmYXVsdD0nLicsCiAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRvIGV4cGFuZCB0aGluZ3MuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZXh0cmFzJywgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBzZXQgb2YgZXh0cmFzIGZvciB3aGljaCB0byBnZW5lcmF0ZSBsaWJyYXJ5IHRhcmdldHMuJykKCmRlZiBtYWluKCk6CiAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKICB3aGwgPSBXaGVlbChhcmdzLndobCkKCiAgIyBFeHRyYWN0IHRoZSBmaWxlcyBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQogIHdobC5leHBhbmQoYXJncy5kaXJlY3RvcnkpCgogIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oYXJncy5kaXJlY3RvcnksICdCVUlMRCcpLCAndycpIGFzIGY6CiAgICBmLndyaXRlKCIiIgpwYWNrYWdlKGRlZmF1bHRfdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdKQoKbG9hZCgie3JlcXVpcmVtZW50c30iLCAicmVxdWlyZW1lbnQiKQoKcHlfbGlicmFyeSgKICAgIG5hbWUgPSAicGtnIiwKICAgIHNyY3MgPSBnbG9iKFsiKiovKi5weSJdKSwKICAgIGRhdGEgPSBnbG9iKFsiKiovKiJdLCBleGNsdWRlPVsiKiovKi5weSIsICIqKi8qICoiLCAiQlVJTEQiLCAiV09SS1NQQUNFIl0pLAogICAgIyBUaGlzIG1ha2VzIHRoaXMgZGlyZWN0b3J5IGEgdG9wLWxldmVsIGluIHRoZSBweXRob24gaW1wb3J0CiAgICAjIHNlYXJjaCBwYXRoIGZvciBhbnl0aGluZyB0aGF0IGRlcGVuZHMgb24gdGhpcy4KICAgIGltcG9ydHMgPSBbIi4iXSwKICAgIGRlcHMgPSBbe2RlcGVuZGVuY2llc31dLAopCntleHRyYXN9IiIiLmZvcm1hdCgKICByZXF1aXJlbWVudHM9YXJncy5yZXF1aXJlbWVudHMsCiAgZGVwZW5kZW5jaWVzPScsJy5qb2luKFsKICAgICdyZXF1aXJlbWVudCgiJXMiKScgJSBkCiAgICBmb3IgZCBpbiB3aGwuZGVwZW5kZW5jaWVzKCkKICBdKSwKICBleHRyYXM9J1xuXG4nLmpvaW4oWwogICAgIiIicHlfbGlicmFyeSgKICAgIG5hbWUgPSAie2V4dHJhfSIsCiAgICBkZXBzID0gWwogICAgICAgICI6cGtnIix7ZGVwc30KICAgIF0sCikiIiIuZm9ybWF0KGV4dHJhPWV4dHJhLAogICAgICAgICAgICBkZXBzPScsJy5qb2luKFsKICAgICAgICAgICAgICAgICdyZXF1aXJlbWVudCgiJXMiKScgJSBkZXAKICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gd2hsLmRlcGVuZGVuY2llcyhleHRyYSkKICAgICAgICAgICAgXSkpCiAgICBmb3IgZXh0cmEgaW4gYXJncy5leHRyYXMgb3IgW10KICBdKSkpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogIG1haW4oKQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAC4AAABpb19iYXplbF9ydWxlc19weXRob24vcnVsZXNfcHl0aG9uL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQAcadZf5hUAAOYVAAApAAAAaW9fYmF6ZWxfcnVsZXNfcHl0aG9uL3J1bGVzX3B5dGhvbi93aGwucHkjIENvcHlyaWdodCAyMDE3IFRoZSBCYXplbCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgojCiMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgojIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAojCiMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiIiIlRoZSB3aGwgbW9kdWxlcyBkZWZpbmVzIGNsYXNzZXMgZm9yIGludGVyYWN0aW5nIHdpdGggUHl0aG9uIHBhY2thZ2VzLiIiIgoKaW1wb3J0IGFyZ3BhcnNlCmltcG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgcGtnX3Jlc291cmNlcwppbXBvcnQgcmUKaW1wb3J0IHppcGZpbGUKCgpjbGFzcyBXaGVlbChvYmplY3QpOgoKICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CiAgICBzZWxmLl9wYXRoID0gcGF0aAoKICBkZWYgcGF0aChzZWxmKToKICAgIHJldHVybiBzZWxmLl9wYXRoCgogIGRlZiBiYXNlbmFtZShzZWxmKToKICAgIHJldHVybiBvcy5wYXRoLmJhc2VuYW1lKHNlbGYucGF0aCgpKQoKICBkZWYgZGlzdHJpYnV0aW9uKHNlbGYpOgogICAgIyBTZWUgaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQyNy8jZmlsZS1uYW1lLWNvbnZlbnRpb24KICAgIHBhcnRzID0gc2VsZi5iYXNlbmFtZSgpLnNwbGl0KCctJykKICAgIHJldHVybiBwYXJ0c1swXQoKICBkZWYgdmVyc2lvbihzZWxmKToKICAgICMgU2VlIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvI2ZpbGUtbmFtZS1jb252ZW50aW9uCiAgICBwYXJ0cyA9IHNlbGYuYmFzZW5hbWUoKS5zcGxpdCgnLScpCiAgICByZXR1cm4gcGFydHNbMV0KCiAgZGVmIHJlcG9zaXRvcnlfbmFtZShzZWxmKToKICAgICMgUmV0dXJucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIEJhemVsIHJlcG9zaXRvcnkgZm9yIHRoaXMgcGFja2FnZS4KICAgIGNhbm9uaWNhbCA9ICdweXBpX197fV97fScuZm9ybWF0KHNlbGYuZGlzdHJpYnV0aW9uKCksIHNlbGYudmVyc2lvbigpKQogICAgIyBFc2NhcGUgYW55IGlsbGVnYWwgY2hhcmFjdGVycyB3aXRoIHVuZGVyc2NvcmUuCiAgICByZXR1cm4gcmUuc3ViKCdbLS4rXScsICdfJywgY2Fub25pY2FsKQoKICBkZWYgX2Rpc3RfaW5mbyhzZWxmKToKICAgICMgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBkaXN0LWluZm8gZGlyZWN0b3J5IHdpdGhpbiB0aGUgLndobCBmaWxlLgogICAgIyBlLmcuIGdvb2dsZV9jbG91ZC0wLjI3LjAtcHkyLnB5My1ub25lLWFueS53aGwgLT4KICAgICMgICAgICBnb29nbGVfY2xvdWQtMC4yNy4wLmRpc3QtaW5mbwogICAgcmV0dXJuICd7fS17fS5kaXN0LWluZm8nLmZvcm1hdChzZWxmLmRpc3RyaWJ1dGlvbigpLCBzZWxmLnZlcnNpb24oKSkKCiAgZGVmIG1ldGFkYXRhKHNlbGYpOgogICAgIyBFeHRyYWN0IHRoZSBzdHJ1Y3R1cmVkIGRhdGEgZnJvbSBtZXRhZGF0YS5qc29uIGluIHRoZSBXSEwncyBkaXN0LWluZm8KICAgICMgZGlyZWN0b3J5LgogICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoc2VsZi5wYXRoKCksICdyJykgYXMgd2hsOgogICAgICAjIGZpcnN0IGNoZWNrIGZvciBtZXRhZGF0YS5qc29uCiAgICAgIHRyeToKICAgICAgICB3aXRoIHdobC5vcGVuKHNlbGYuX2Rpc3RfaW5mbygpICsgJy9tZXRhZGF0YS5qc29uJykgYXMgZjoKICAgICAgICAgIHJldHVybiBqc29uLmxvYWRzKGYucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgcGFzcwogICAgICAjIGZhbGwgYmFjayB0byBNRVRBREFUQSBmaWxlIChodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDI3LykKICAgICAgd2l0aCB3aGwub3BlbihzZWxmLl9kaXN0X2luZm8oKSArICcvTUVUQURBVEEnKSBhcyBmOgogICAgICAgIHJldHVybiBzZWxmLl9wYXJzZV9tZXRhZGF0YShmLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCgogIGRlZiBuYW1lKHNlbGYpOgogICAgcmV0dXJuIHNlbGYubWV0YWRhdGEoKS5nZXQoJ25hbWUnKQoKICBkZWYgZGVwZW5kZW5jaWVzKHNlbGYsIGV4dHJhPU5vbmUpOgogICAgIiIiQWNjZXNzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyBXaGVlbC4KCiAgICBBcmdzOgogICAgICBleHRyYTogaWYgc3BlY2lmaWVkLCBpbmNsdWRlIHRoZSBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcwogICAgICAgICAgICBvZiB0aGUgbmFtZWQgImV4dHJhIi4KCiAgICBZaWVsZHM6CiAgICAgIHRoZSBuYW1lcyBvZiByZXF1aXJlbWVudHMgZnJvbSB0aGUgbWV0YWRhdGEuanNvbgogICAgIiIiCiAgICAjIFRPRE8obWF0dG1vb3IpOiBJcyB0aGVyZSBhIHNjaGVtYSB0byBmb2xsb3cgZm9yIHRoaXM/CiAgICBydW5fcmVxdWlyZXMgPSBzZWxmLm1ldGFkYXRhKCkuZ2V0KCdydW5fcmVxdWlyZXMnLCBbXSkKICAgIGZvciByZXF1aXJlbWVudCBpbiBydW5fcmVxdWlyZXM6CiAgICAgIGlmIHJlcXVpcmVtZW50LmdldCgnZXh0cmEnKSAhPSBleHRyYToKICAgICAgICAjIE1hdGNoIHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSBleHRyYSB3ZSdyZSBsb29raW5nIGZvci4KICAgICAgICBjb250aW51ZQogICAgICBtYXJrZXIgPSByZXF1aXJlbWVudC5nZXQoJ2Vudmlyb25tZW50JykKICAgICAgaWYgbWFya2VyIGFuZCBub3QgcGtnX3Jlc291cmNlcy5ldmFsdWF0ZV9tYXJrZXIobWFya2VyKToKICAgICAgICAjIFRoZSBjdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBQRVAgNTA4IG1hcmtlciwKICAgICAgICAjIHNvIGlnbm9yZSB0aGlzIHJlcXVpcmVtZW50LgogICAgICAgIGNvbnRpbnVlCiAgICAgIHJlcXVpcmVzID0gcmVxdWlyZW1lbnQuZ2V0KCdyZXF1aXJlcycsIFtdKQogICAgICBmb3IgZW50cnkgaW4gcmVxdWlyZXM6CiAgICAgICAgIyBTdHJpcCBvZmYgYW55IHRyYWlsaW5nIHZlcnNpb25pbmcgZGF0YS4KICAgICAgICBwYXJ0cyA9IHJlLnNwbGl0KCdbID48PSgpXScsIGVudHJ5KQogICAgICAgIHlpZWxkIHBhcnRzWzBdCgogIGRlZiBleHRyYXMoc2VsZik6CiAgICByZXR1cm4gc2VsZi5tZXRhZGF0YSgpLmdldCgnZXh0cmFzJywgW10pCgogIGRlZiBleHBhbmQoc2VsZiwgZGlyZWN0b3J5KToKICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHNlbGYucGF0aCgpLCAncicpIGFzIHdobDoKICAgICAgd2hsLmV4dHJhY3RhbGwoZGlyZWN0b3J5KQoKICAjIF9wYXJzZV9tZXRhZGF0YSBwYXJzZXMgTUVUQURBVEEgZmlsZXMgYWNjb3JkaW5nIHRvIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTAzMTQvCiAgZGVmIF9wYXJzZV9tZXRhZGF0YShzZWxmLCBjb250ZW50KToKICAgICMgVE9ETzogaGFuZGxlIGZpZWxkcyBvdGhlciB0aGFuIGp1c3QgbmFtZQogICAgbmFtZV9wYXR0ZXJuID0gcmUuY29tcGlsZSgnTmFtZTogKC4qKScpCiAgICByZXR1cm4geyAnbmFtZSc6IG5hbWVfcGF0dGVybi5zZWFyY2goY29udGVudCkuZ3JvdXAoMSkgfQoKCnBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAogICAgZGVzY3JpcHRpb249J1VucGFjayBhIFdITCBmaWxlIGFzIGEgcHlfbGlicmFyeS4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS13aGwnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIC53aGwgZmlsZSB3ZSBhcmUgZXhwYW5kaW5nLicpKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1yZXF1aXJlbWVudHMnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgcGlwX2ltcG9ydCBmcm9tIHdoaWNoIHRvIGRyYXcgZGVwZW5kZW5jaWVzLicpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRpcmVjdG9yeScsIGFjdGlvbj0nc3RvcmUnLCBkZWZhdWx0PScuJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdG8gZXhwYW5kIHRoaW5ncy4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1leHRyYXMnLCBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIHNldCBvZiBleHRyYXMgZm9yIHdoaWNoIHRvIGdlbmVyYXRlIGxpYnJhcnkgdGFyZ2V0cy4nKQoKZGVmIG1haW4oKToKICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogIHdobCA9IFdoZWVsKGFyZ3Mud2hsKQoKICAjIEV4dHJhY3QgdGhlIGZpbGVzIGludG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CiAgd2hsLmV4cGFuZChhcmdzLmRpcmVjdG9yeSkKCiAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihhcmdzLmRpcmVjdG9yeSwgJ0JVSUxEJyksICd3JykgYXMgZjoKICAgIGYud3JpdGUoIiIiCnBhY2thZ2UoZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCgpsb2FkKCJ7cmVxdWlyZW1lbnRzfSIsICJyZXF1aXJlbWVudCIpCgpweV9saWJyYXJ5KAogICAgbmFtZSA9ICJwa2ciLAogICAgc3JjcyA9IGdsb2IoWyIqKi8qLnB5Il0pLAogICAgZGF0YSA9IGdsb2IoWyIqKi8qIl0sIGV4Y2x1ZGU9WyIqKi8qLnB5IiwgIioqLyogKiIsICJCVUlMRCIsICJXT1JLU1BBQ0UiXSksCiAgICAjIFRoaXMgbWFrZXMgdGhpcyBkaXJlY3RvcnkgYSB0b3AtbGV2ZWwgaW4gdGhlIHB5dGhvbiBpbXBvcnQKICAgICMgc2VhcmNoIHBhdGggZm9yIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiB0aGlzLgogICAgaW1wb3J0cyA9IFsiLiJdLAogICAgZGVwcyA9IFt7ZGVwZW5kZW5jaWVzfV0sCikKe2V4dHJhc30iIiIuZm9ybWF0KAogIHJlcXVpcmVtZW50cz1hcmdzLnJlcXVpcmVtZW50cywKICBkZXBlbmRlbmNpZXM9JywnLmpvaW4oWwogICAgJ3JlcXVpcmVtZW50KCIlcyIpJyAlIGQKICAgIGZvciBkIGluIHdobC5kZXBlbmRlbmNpZXMoKQogIF0pLAogIGV4dHJhcz0nXG5cbicuam9pbihbCiAgICAiIiJweV9saWJyYXJ5KAogICAgbmFtZSA9ICJ7ZXh0cmF9IiwKICAgIGRlcHMgPSBbCiAgICAgICAgIjpwa2ciLHtkZXBzfQogICAgXSwKKSIiIi5mb3JtYXQoZXh0cmE9ZXh0cmEsCiAgICAgICAgICAgIGRlcHM9JywnLmpvaW4oWwogICAgICAgICAgICAgICAgJ3JlcXVpcmVtZW50KCIlcyIpJyAlIGRlcAogICAgICAgICAgICAgICAgZm9yIGRlcCBpbiB3aGwuZGVwZW5kZW5jaWVzKGV4dHJhKQogICAgICAgICAgICBdKSkKICAgIGZvciBleHRyYSBpbiBhcmdzLmV4dHJhcyBvciBbXQogIF0pKSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgbWFpbigpClBLAwQUAAAAAAAAACEAUONchZYaAACWGgAAKgAAAGlvX2JhemVsX3J1bGVzX3B5dGhvbi9ydWxlc19weXRob24vd2hsdG9vbCMhL3Vzci9iaW4vZW52IHB5dGhvbgoKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCB6aXBmaWxlCgojIFJldHVybiBUcnVlIGlmIHJ1bm5pbmcgb24gV2luZG93cwpkZWYgSXNXaW5kb3dzKCk6CiAgcmV0dXJuIG9zLm5hbWUgPT0gJ250JwoKZGVmIEdldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeChwYXRoKToKICAiIiIKICBBZGRpbmcgVU5DIHByZWZpeCBhZnRlciBnZXR0aW5nIGEgbm9ybWFsaXplZCBhYnNvbHV0ZSBXaW5kb3dzIHBhdGgsCiAgaXQncyBuby1vcCBmb3Igbm9uLVdpbmRvd3MgcGxhdGZvcm1zIG9yIGlmIHJ1bm5pbmcgdW5kZXIgcHl0aG9uMi4KICAiIiIKICBwYXRoID0gcGF0aC5zdHJpcCgpCgogICMgTm8gbmVlZCB0byBhZGQgcHJlZml4IGZvciBub24tV2luZG93cyBwbGF0Zm9ybXMuCiAgIyBBbmQgXFw/XCBkb2Vzbid0IHdvcmsgaW4gcHl0aG9uIDIKICBpZiBub3QgSXNXaW5kb3dzKCkgb3Igc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICByZXR1cm4gcGF0aAoKICAjIExldHMgc3RhcnQgdGhlIHVuaWNvZGUgZnVuCiAgdW5pY29kZV9wcmVmaXggPSAiXFxcXD9cXCIKICBpZiBwYXRoLnN0YXJ0c3dpdGgodW5pY29kZV9wcmVmaXgpOgogICAgcmV0dXJuIHBhdGgKCiAgIyBvcy5wYXRoLmFic3BhdGggcmV0dXJucyBhIG5vcm1hbGl6ZWQgYWJzb2x1dGUgcGF0aAogIHJldHVybiB1bmljb2RlX3ByZWZpeCArIG9zLnBhdGguYWJzcGF0aChwYXRoKQoKUFlUSE9OX0JJTkFSWSA9ICdweXRob24nCmlmIElzV2luZG93cygpIGFuZCBub3QgUFlUSE9OX0JJTkFSWS5lbmRzd2l0aCgnLmV4ZScpOgogIFBZVEhPTl9CSU5BUlkgPSBQWVRIT05fQklOQVJZICsgJy5leGUnCgojIEZpbmQgYSBmaWxlIGluIGEgZ2l2ZW4gc2VhcmNoIHBhdGguCmRlZiBTZWFyY2hQYXRoKG5hbWUpOgogIHNlYXJjaF9wYXRoID0gb3MuZ2V0ZW52KCdQQVRIJywgb3MuZGVmcGF0aCkuc3BsaXQob3MucGF0aHNlcCkKICBmb3IgZGlyZWN0b3J5IGluIHNlYXJjaF9wYXRoOgogICAgaWYgZGlyZWN0b3J5ID09ICcnOiBjb250aW51ZQogICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpCiAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKSBhbmQgb3MuYWNjZXNzKHBhdGgsIG9zLlhfT0spOgogICAgICByZXR1cm4gcGF0aAogIHJldHVybiBOb25lCgpkZWYgSXNSdW5uaW5nRnJvbVppcCgpOgogIHJldHVybiBGYWxzZQoKIyBGaW5kIHRoZSByZWFsIFB5dGhvbiBiaW5hcnkgaWYgaXQncyBub3QgYSBub3JtYWwgYWJzb2x1dGUgcGF0aApkZWYgRmluZFB5dGhvbkJpbmFyeShtb2R1bGVfc3BhY2UpOgogIGlmIFBZVEhPTl9CSU5BUlkuc3RhcnRzd2l0aCgnLy8nKToKICAgICMgQ2FzZSAxOiBQYXRoIGlzIGEgbGFiZWwuIE5vdCBzdXBwb3J0ZWQgeWV0LgogICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICdCYXplbCBkb2VzIG5vdCBzdXBwb3J0IGV4ZWN1dGlvbiBvZiBQeXRob24gaW50ZXJwcmV0ZXJzIHZpYSBsYWJlbHMgeWV0JykKICBlbGlmIFBZVEhPTl9CSU5BUlkuc3RhcnRzd2l0aCgnLycpOgogICAgIyBDYXNlIDI6IEFic29sdXRlIHBhdGguCiAgICByZXR1cm4gUFlUSE9OX0JJTkFSWQogIGVsaWYgJy8nIGluIFBZVEhPTl9CSU5BUlk6CiAgICAjIENhc2UgMzogUGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgcmVwbyByb290LgogICAgcmV0dXJuIG9zLnBhdGguam9pbihtb2R1bGVfc3BhY2UsIFBZVEhPTl9CSU5BUlkpCiAgZWxzZToKICAgICMgQ2FzZSA0OiBQYXRoIGhhcyB0byBiZSBsb29rZWQgdXAgaW4gdGhlIHNlYXJjaCBwYXRoLgogICAgcmV0dXJuIFNlYXJjaFBhdGgoUFlUSE9OX0JJTkFSWSkKCmRlZiBDcmVhdGVQeXRob25QYXRoRW50cmllcyhweXRob25faW1wb3J0cywgbW9kdWxlX3NwYWNlKToKICBwYXJ0cyA9IHB5dGhvbl9pbXBvcnRzLnNwbGl0KCc6Jyk7CiAgcmV0dXJuIFttb2R1bGVfc3BhY2VdICsgWyIlcy8lcyIgJSAobW9kdWxlX3NwYWNlLCBwYXRoKSBmb3IgcGF0aCBpbiBwYXJ0c10KCiMgRmluZCB0aGUgcnVuZmlsZXMgdHJlZQpkZWYgRmluZE1vZHVsZVNwYWNlKCk6CiAgc3R1Yl9maWxlbmFtZSA9IG9zLnBhdGguYWJzcGF0aChzeXMuYXJndlswXSkKICBtb2R1bGVfc3BhY2UgPSBzdHViX2ZpbGVuYW1lICsgJy5ydW5maWxlcycKICBpZiBvcy5wYXRoLmlzZGlyKG1vZHVsZV9zcGFjZSk6CiAgICByZXR1cm4gbW9kdWxlX3NwYWNlCgogIHJ1bmZpbGVzX3BhdHRlcm4gPSAiKC4qXC5ydW5maWxlcykvLioiCiAgaWYgSXNXaW5kb3dzKCk6CiAgICBydW5maWxlc19wYXR0ZXJuID0gIiguKlwucnVuZmlsZXMpXFwuKiIKICBtYXRjaG9iaiA9IHJlLm1hdGNoKHJ1bmZpbGVzX3BhdHRlcm4sIG9zLnBhdGguYWJzcGF0aChzeXMuYXJndlswXSkpCiAgaWYgbWF0Y2hvYmo6CiAgICByZXR1cm4gbWF0Y2hvYmouZ3JvdXAoMSkKCiAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0Nhbm5vdCBmaW5kIC5ydW5maWxlcyBkaXJlY3RvcnkgZm9yICVzJyAlIHN5cy5hcmd2WzBdKQoKIyBDcmVhdGUgdGhlIHJ1bmZpbGVzIHRyZWUgYnkgZXh0cmFjdGluZyB0aGUgemlwIGZpbGUKZGVmIENyZWF0ZU1vZHVsZVNwYWNlKCk6CiAgWklQX1JVTkZJTEVTX0RJUkVDVE9SWV9OQU1FID0gInJ1bmZpbGVzIgogIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgiIiwgIkJhemVsLnJ1bmZpbGVzXyIpCiAgemYgPSB6aXBmaWxlLlppcEZpbGUoR2V0V2luZG93c1BhdGhXaXRoVU5DUHJlZml4KG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpKQogIHpmLmV4dHJhY3RhbGwoR2V0V2luZG93c1BhdGhXaXRoVU5DUHJlZml4KHRlbXBfZGlyKSkKICByZXR1cm4gb3MucGF0aC5qb2luKHRlbXBfZGlyLCBaSVBfUlVORklMRVNfRElSRUNUT1JZX05BTUUpCgojIFJldHVybnMgcmVwb3NpdG9yeSByb290cyB0byBhZGQgdG8gdGhlIGltcG9ydCBwYXRoLgpkZWYgR2V0UmVwb3NpdG9yaWVzSW1wb3J0cyhtb2R1bGVfc3BhY2UsIGltcG9ydF9hbGwpOgogIGlmIGltcG9ydF9hbGw6CiAgICByZXBvX2RpcnMgPSBbb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgZCkgZm9yIGQgaW4gb3MubGlzdGRpcihtb2R1bGVfc3BhY2UpXQogICAgcmV0dXJuIFtkIGZvciBkIGluIHJlcG9fZGlycyBpZiBvcy5wYXRoLmlzZGlyKGQpXQogIHJldHVybiBbb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgImlvX2JhemVsX3J1bGVzX3B5dGhvbiIpXQoKIyBGaW5kcyB0aGUgcnVuZmlsZXMgbWFuaWZlc3Qgb3IgdGhlIHJ1bmZpbGVzIGRpcmVjdG9yeS4KZGVmIFJ1bmZpbGVzRW52dmFyKG1vZHVsZV9zcGFjZSk6CiAgIyBJZiB0aGlzIGJpbmFyeSBpcyB0aGUgZGF0YS1kZXBlbmRlbmN5IG9mIGFub3RoZXIgb25lLCB0aGUgb3RoZXIgc2V0cwogICMgUlVORklMRVNfTUFOSUZFU1RfRklMRSBvciBSVU5GSUxFU19ESVIgZm9yIG91ciBzYWtlLgogIHJ1bmZpbGVzID0gb3MuZW52aXJvbi5nZXQoJ1JVTkZJTEVTX01BTklGRVNUX0ZJTEUnLCBOb25lKQogIGlmIHJ1bmZpbGVzOgogICAgcmV0dXJuICgnUlVORklMRVNfTUFOSUZFU1RfRklMRScsIHJ1bmZpbGVzKQoKICBydW5maWxlcyA9IG9zLmVudmlyb24uZ2V0KCdSVU5GSUxFU19ESVInLCBOb25lKQogIGlmIHJ1bmZpbGVzOgogICAgcmV0dXJuICgnUlVORklMRVNfRElSJywgcnVuZmlsZXMpCgogICMgSWYgcnVubmluZyBmcm9tIGEgemlwLCB0aGVyZSdzIG5vIG1hbmlmZXN0IGZpbGUuCiAgaWYgSXNSdW5uaW5nRnJvbVppcCgpOgogICAgcmV0dXJuICgnUlVORklMRVNfRElSJywgbW9kdWxlX3NwYWNlKQoKICAjIExvb2sgZm9yIHRoZSBydW5maWxlcyAib3V0cHV0IiBtYW5pZmVzdCwgYXJndlswXSArICIucnVuZmlsZXNfbWFuaWZlc3QiCiAgcnVuZmlsZXMgPSBtb2R1bGVfc3BhY2UgKyAnX21hbmlmZXN0JwogIGlmIG9zLnBhdGguZXhpc3RzKHJ1bmZpbGVzKToKICAgIHJldHVybiAoJ1JVTkZJTEVTX01BTklGRVNUX0ZJTEUnLCBydW5maWxlcykKCiAgIyBMb29rIGZvciB0aGUgcnVuZmlsZXMgImlucHV0IiBtYW5pZmVzdCwgYXJndlswXSArICIucnVuZmlsZXMvTUFOSUZFU1QiCiAgcnVuZmlsZXMgPSBvcy5wYXRoLmpvaW4obW9kdWxlX3NwYWNlLCAnTUFOSUZFU1QnKQogIGlmIG9zLnBhdGguZXhpc3RzKHJ1bmZpbGVzKToKICAgIHJldHVybiAoJ1JVTkZJTEVTX0RJUicsIHJ1bmZpbGVzKQoKICByZXR1cm4gKE5vbmUsIE5vbmUpCgpkZWYgTWFpbigpOgogIGFyZ3MgPSBzeXMuYXJndlsxOl0KCiAgbmV3X2VudiA9IHt9CgogIGlmIElzUnVubmluZ0Zyb21aaXAoKToKICAgIG1vZHVsZV9zcGFjZSA9IENyZWF0ZU1vZHVsZVNwYWNlKCkKICBlbHNlOgogICAgbW9kdWxlX3NwYWNlID0gRmluZE1vZHVsZVNwYWNlKCkKCiAgcHl0aG9uX2ltcG9ydHMgPSAncHlwaV9fc2V0dXB0b29sc18zOF8yXzQnCiAgcHl0aG9uX3BhdGhfZW50cmllcyA9IENyZWF0ZVB5dGhvblBhdGhFbnRyaWVzKHB5dGhvbl9pbXBvcnRzLCBtb2R1bGVfc3BhY2UpCiAgcHl0aG9uX3BhdGhfZW50cmllcyArPSBHZXRSZXBvc2l0b3JpZXNJbXBvcnRzKG1vZHVsZV9zcGFjZSwgVHJ1ZSkKCiAgcHl0aG9uX3BhdGhfZW50cmllcyA9IFtHZXRXaW5kb3dzUGF0aFdpdGhVTkNQcmVmaXgoZCkgZm9yIGQgaW4gcHl0aG9uX3BhdGhfZW50cmllc10KCiAgb2xkX3B5dGhvbl9wYXRoID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnKQogIHB5dGhvbl9wYXRoID0gb3MucGF0aHNlcC5qb2luKHB5dGhvbl9wYXRoX2VudHJpZXMpCiAgaWYgb2xkX3B5dGhvbl9wYXRoOgogICAgcHl0aG9uX3BhdGggKz0gb3MucGF0aHNlcCArIG9sZF9weXRob25fcGF0aAoKICBpZiBJc1dpbmRvd3MoKToKICAgIHB5dGhvbl9wYXRoID0gcHl0aG9uX3BhdGgucmVwbGFjZSgiLyIsIG9zLnNlcCkKCiAgbmV3X2VudlsnUFlUSE9OUEFUSCddID0gcHl0aG9uX3BhdGgKICBydW5maWxlc19lbnZrZXksIHJ1bmZpbGVzX2VudnZhbHVlID0gUnVuZmlsZXNFbnZ2YXIobW9kdWxlX3NwYWNlKQogIGlmIHJ1bmZpbGVzX2VudmtleToKICAgIG5ld19lbnZbcnVuZmlsZXNfZW52a2V5XSA9IHJ1bmZpbGVzX2VudnZhbHVlCgogICMgTm93IGxvb2sgZm9yIG15IG1haW4gcHl0aG9uIHNvdXJjZSBmaWxlLgogICMgVGhlIG1hZ2ljIHN0cmluZyBwZXJjZW50LW1haW4tcGVyY2VudCBpcyByZXBsYWNlZCB3aXRoIHRoZSBmaWxlbmFtZSBvZiB0aGUKICAjIG1haW4gZmlsZSBvZiB0aGUgUHl0aG9uIGJpbmFyeSBpbiBCYXplbFB5dGhvblNlbWFudGljcy5qYXZhLgogIHJlbF9wYXRoID0gJ2lvX2JhemVsX3J1bGVzX3B5dGhvbi9ydWxlc19weXRob24vd2hsLnB5JwogIGlmIElzV2luZG93cygpOgogICAgcmVsX3BhdGggPSByZWxfcGF0aC5yZXBsYWNlKCIvIiwgb3Muc2VwKQoKICBtYWluX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgcmVsX3BhdGgpCiAgbWFpbl9maWxlbmFtZSA9IEdldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeChtYWluX2ZpbGVuYW1lKQogIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhtYWluX2ZpbGVuYW1lKSwgXAogICAgICAgICAnQ2Fubm90IGV4ZWMoKSAlcjogZmlsZSBub3QgZm91bmQuJyAlIG1haW5fZmlsZW5hbWUKICBhc3NlcnQgb3MuYWNjZXNzKG1haW5fZmlsZW5hbWUsIG9zLlJfT0spLCBcCiAgICAgICAgICdDYW5ub3QgZXhlYygpICVyOiBmaWxlIG5vdCByZWFkYWJsZS4nICUgbWFpbl9maWxlbmFtZQoKICBwcm9ncmFtID0gcHl0aG9uX3Byb2dyYW0gPSBGaW5kUHl0aG9uQmluYXJ5KG1vZHVsZV9zcGFjZSkKICBpZiBweXRob25fcHJvZ3JhbSBpcyBOb25lOgogICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHB5dGhvbiBiaW5hcnk6ICcgKyBQWVRIT05fQklOQVJZKQogIGFyZ3MgPSBbcHl0aG9uX3Byb2dyYW0sIG1haW5fZmlsZW5hbWVdICsgYXJncwoKICBvcy5lbnZpcm9uLnVwZGF0ZShuZXdfZW52KQoKICB0cnk6CiAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKICAgIGlmIElzUnVubmluZ0Zyb21aaXAoKToKICAgICAgIyBJZiBSVU5fVU5ERVJfUlVORklMRVMgZXF1YWxzIDEsIGl0IG1lYW5zIHdlIG5lZWQgdG8KICAgICAgIyBjaGFuZ2UgZGlyZWN0b3J5IHRvIHRoZSByaWdodCBydW5maWxlcyBkaXJlY3RvcnkuCiAgICAgICMgKFNvIHRoYXQgdGhlIGRhdGEgZmlsZXMgYXJlIGFjY2Vzc2libGUpCiAgICAgIGlmIG9zLmVudmlyb24uZ2V0KCJSVU5fVU5ERVJfUlVORklMRVMiKSA9PSAiMSI6CiAgICAgICAgb3MuY2hkaXIob3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgImlvX2JhemVsX3J1bGVzX3B5dGhvbiIpKQogICAgICByZXRDb2RlID0gc3VicHJvY2Vzcy5jYWxsKGFyZ3MpCiAgICAgIHNodXRpbC5ybXRyZWUob3MucGF0aC5kaXJuYW1lKG1vZHVsZV9zcGFjZSksIFRydWUpCiAgICAgIGV4aXQocmV0Q29kZSkKICAgIGVsc2U6CiAgICAgIG9zLmV4ZWN2KGFyZ3NbMF0sIGFyZ3MpCiAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6CiAgICAjIFRoaXMgd29ya3MgZnJvbSBQeXRob24gMi40IGFsbCB0aGUgd2F5IHRvIDMueC4KICAgIGUgPSBzeXMuZXhjX2luZm8oKVsxXQogICAgIyBUaGlzIGV4Y2VwdGlvbiBvY2N1cnMgd2hlbiBvcy5leGVjdigpIGZhaWxzIGZvciBzb21lIHJlYXNvbi4KICAgIGlmIG5vdCBnZXRhdHRyKGUsICdmaWxlbmFtZScsIE5vbmUpOgogICAgICBlLmZpbGVuYW1lID0gcHJvZ3JhbSAgIyBBZGQgaW5mbyB0byBlcnJvciBtZXNzYWdlCiAgICByYWlzZQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICBNYWluKCkKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAAjAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAFxPukV+AAAAfgAAACcAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9lYXN5X2luc3RhbGwucHkiIiJSdW4gdGhlIEVhc3lJbnN0YWxsIGNvbW1hbmQiIiIKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KICAgIG1haW4oKQpQSwMEFAAAAAAAAAAhABdEnikHngEAB54BADEAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL19faW5pdF9fLnB5IyBjb2Rpbmc6IHV0Zi04CiIiIgpQYWNrYWdlIHJlc291cmNlIEFQSQotLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSByZXNvdXJjZSBpcyBhIGxvZ2ljYWwgZmlsZSBjb250YWluZWQgd2l0aGluIGEgcGFja2FnZSwgb3IgYSBsb2dpY2FsCnN1YmRpcmVjdG9yeSB0aGVyZW9mLiAgVGhlIHBhY2thZ2UgcmVzb3VyY2UgQVBJIGV4cGVjdHMgcmVzb3VyY2UgbmFtZXMKdG8gaGF2ZSB0aGVpciBwYXRoIHBhcnRzIHNlcGFyYXRlZCB3aXRoIGBgL2BgLCAqbm90KiB3aGF0ZXZlciB0aGUgbG9jYWwKcGF0aCBzZXBhcmF0b3IgaXMuICBEbyBub3QgdXNlIG9zLnBhdGggb3BlcmF0aW9ucyB0byBtYW5pcHVsYXRlIHJlc291cmNlCm5hbWVzIGJlaW5nIHBhc3NlZCBpbnRvIHRoZSBBUEkuCgpUaGUgcGFja2FnZSByZXNvdXJjZSBBUEkgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIG5vcm1hbCBmaWxlc3lzdGVtIHBhY2thZ2VzLAouZWdnIGZpbGVzLCBhbmQgdW5wYWNrZWQgLmVnZyBmaWxlcy4gIEl0IGNhbiBhbHNvIHdvcmsgaW4gYSBsaW1pdGVkIHdheSB3aXRoCi56aXAgZmlsZXMgYW5kIHdpdGggY3VzdG9tIFBFUCAzMDIgbG9hZGVycyB0aGF0IHN1cHBvcnQgdGhlIGBgZ2V0X2RhdGEoKWBgCm1ldGhvZC4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IGlvCmltcG9ydCB0aW1lCmltcG9ydCByZQppbXBvcnQgdHlwZXMKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHppcGltcG9ydAppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHN0YXQKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgcGtndXRpbAppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgcGxpc3RsaWIKaW1wb3J0IGVtYWlsLnBhcnNlcgppbXBvcnQgZXJybm8KaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB0ZXh0d3JhcAppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBpbnNwZWN0CmZyb20gcGtndXRpbCBpbXBvcnQgZ2V0X2ltcG9ydGVyCgp0cnk6CiAgICBpbXBvcnQgX2ltcApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAjIFB5dGhvbiAzLjIgY29tcGF0aWJpbGl0eQogICAgaW1wb3J0IGltcCBhcyBfaW1wCgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IHVybGxpYiwgbWFwLCBmaWx0ZXIKCiMgY2FwdHVyZSB0aGVzZSB0byBieXBhc3Mgc2FuZGJveGluZwpmcm9tIG9zIGltcG9ydCB1dGltZQp0cnk6CiAgICBmcm9tIG9zIGltcG9ydCBta2RpciwgcmVuYW1lLCB1bmxpbmsKICAgIFdSSVRFX1NVUFBPUlQgPSBUcnVlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICMgbm8gd3JpdGUgc3VwcG9ydCwgcHJvYmFibHkgdW5kZXIgR0FFCiAgICBXUklURV9TVVBQT1JUID0gRmFsc2UKCmZyb20gb3MgaW1wb3J0IG9wZW4gYXMgb3Nfb3Blbgpmcm9tIG9zLnBhdGggaW1wb3J0IGlzZGlyLCBzcGxpdAoKdHJ5OgogICAgaW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkgYXMgaW1wb3J0bGliX21hY2hpbmVyeQogICAgIyBhY2Nlc3MgYXR0cmlidXRlIHRvIGZvcmNlIGltcG9ydCB1bmRlciBkZWxheWVkIGltcG9ydCBtZWNoYW5pc21zLgogICAgaW1wb3J0bGliX21hY2hpbmVyeS5fX25hbWVfXwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnRsaWJfbWFjaGluZXJ5ID0gTm9uZQoKZnJvbSAuIGltcG9ydCBweTMxY29tcGF0CmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4gaW1wb3J0IGFwcGRpcnMKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybiBpbXBvcnQgcGFja2FnaW5nCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy52ZXJzaW9uJykKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLnNwZWNpZmllcnMnKQpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcucmVxdWlyZW1lbnRzJykKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLm1hcmtlcnMnKQoKCmlmICgzLCAwKSA8IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMyk6CiAgICByYWlzZSBSdW50aW1lRXJyb3IoIlB5dGhvbiAzLjMgb3IgbGF0ZXIgaXMgcmVxdWlyZWQiKQoKaWYgc2l4LlBZMjoKICAgICMgVGhvc2UgYnVpbHRpbiBleGNlcHRpb25zIGFyZSBvbmx5IGRlZmluZWQgaW4gUHl0aG9uIDMKICAgIFBlcm1pc3Npb25FcnJvciA9IE5vbmUKICAgIE5vdEFEaXJlY3RvcnlFcnJvciA9IE5vbmUKCiMgZGVjbGFyZSBzb21lIGdsb2JhbHMgdGhhdCB3aWxsIGJlIGRlZmluZWQgbGF0ZXIgdG8KIyBzYXRpc2Z5IHRoZSBsaW50ZXJzLgpyZXF1aXJlID0gTm9uZQp3b3JraW5nX3NldCA9IE5vbmUKCgpjbGFzcyBQRVA0NDBXYXJuaW5nKFJ1bnRpbWVXYXJuaW5nKToKICAgICIiIgogICAgVXNlZCB3aGVuIHRoZXJlIGlzIGFuIGlzc3VlIHdpdGggYSB2ZXJzaW9uIG9yIHNwZWNpZmllciBub3QgY29tcGx5aW5nIHdpdGgKICAgIFBFUCA0NDAuCiAgICAiIiIKCgpjbGFzcyBfU2V0dXB0b29sc1ZlcnNpb25NaXhpbihvYmplY3QpOgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19oYXNoX18oKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpIDwgb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fbHRfXyhvdGhlcikKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA8PSBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19sZV9fKG90aGVyKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpID09IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2VxX18ob3RoZXIpCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPj0gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fZ2VfXyhvdGhlcikKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA+IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2d0X18ob3RoZXIpCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgIT0gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fbmVfXyhvdGhlcikKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gdHVwbGUoc2VsZilba2V5XQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBjb21wb25lbnRfcmUgPSByZS5jb21waWxlKHInKFxkKyB8IFthLXpdKyB8IFwufCAtKScsIHJlLlZFUkJPU0UpCiAgICAgICAgcmVwbGFjZSA9IHsKICAgICAgICAgICAgJ3ByZSc6ICdjJywKICAgICAgICAgICAgJ3ByZXZpZXcnOiAnYycsCiAgICAgICAgICAgICctJzogJ2ZpbmFsLScsCiAgICAgICAgICAgICdyYyc6ICdjJywKICAgICAgICAgICAgJ2Rldic6ICdAJywKICAgICAgICB9LmdldAoKICAgICAgICBkZWYgX3BhcnNlX3ZlcnNpb25fcGFydHMocyk6CiAgICAgICAgICAgIGZvciBwYXJ0IGluIGNvbXBvbmVudF9yZS5zcGxpdChzKToKICAgICAgICAgICAgICAgIHBhcnQgPSByZXBsYWNlKHBhcnQsIHBhcnQpCiAgICAgICAgICAgICAgICBpZiBub3QgcGFydCBvciBwYXJ0ID09ICcuJzoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgcGFydFs6MV0gaW4gJzAxMjM0NTY3ODknOgogICAgICAgICAgICAgICAgICAgICMgcGFkIGZvciBudW1lcmljIGNvbXBhcmlzb24KICAgICAgICAgICAgICAgICAgICB5aWVsZCBwYXJ0LnpmaWxsKDgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHlpZWxkICcqJyArIHBhcnQKCiAgICAgICAgICAgICMgZW5zdXJlIHRoYXQgYWxwaGEvYmV0YS9jYW5kaWRhdGUgYXJlIGJlZm9yZSBmaW5hbAogICAgICAgICAgICB5aWVsZCAnKmZpbmFsJwoKICAgICAgICBkZWYgb2xkX3BhcnNlX3ZlcnNpb24ocyk6CiAgICAgICAgICAgIHBhcnRzID0gW10KICAgICAgICAgICAgZm9yIHBhcnQgaW4gX3BhcnNlX3ZlcnNpb25fcGFydHMocy5sb3dlcigpKToKICAgICAgICAgICAgICAgIGlmIHBhcnQuc3RhcnRzd2l0aCgnKicpOgogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlICctJyBiZWZvcmUgYSBwcmVyZWxlYXNlIHRhZwogICAgICAgICAgICAgICAgICAgIGlmIHBhcnQgPCAnKmZpbmFsJzoKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAnKmZpbmFsLSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHplcm9zIGZyb20gZWFjaCBzZXJpZXMgb2YgbnVtZXJpYyBwYXJ0cwogICAgICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gJzAwMDAwMDAwJzoKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChwYXJ0KQogICAgICAgICAgICByZXR1cm4gdHVwbGUocGFydHMpCgogICAgICAgICMgV2FybiBmb3IgdXNlIG9mIHRoaXMgZnVuY3Rpb24KICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAiWW91IGhhdmUgaXRlcmF0ZWQgb3ZlciB0aGUgcmVzdWx0IG9mICIKICAgICAgICAgICAgInBrZ19yZXNvdXJjZXMucGFyc2VfdmVyc2lvbi4gVGhpcyBpcyBhIGxlZ2FjeSBiZWhhdmlvciB3aGljaCBpcyAiCiAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgd2l0aCB0aGUgbmV3IHZlcnNpb24gY2xhc3MgaW50cm9kdWNlZCBpbiBzZXR1cHRvb2xzICIKICAgICAgICAgICAgIjguMC4gSW4gbW9zdCBjYXNlcywgY29udmVyc2lvbiB0byBhIHR1cGxlIGlzIHVubmVjZXNzYXJ5LiBGb3IgIgogICAgICAgICAgICAiY29tcGFyaXNvbiBvZiB2ZXJzaW9ucywgc29ydCB0aGUgVmVyc2lvbiBpbnN0YW5jZXMgZGlyZWN0bHkuIElmICIKICAgICAgICAgICAgInlvdSBoYXZlIGFub3RoZXIgdXNlIGNhc2UgcmVxdWlyaW5nIHRoZSB0dXBsZSwgcGxlYXNlIGZpbGUgYSAiCiAgICAgICAgICAgICJidWcgd2l0aCB0aGUgc2V0dXB0b29scyBwcm9qZWN0IGRlc2NyaWJpbmcgdGhhdCBuZWVkLiIsCiAgICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nLAogICAgICAgICAgICBzdGFja2xldmVsPTEsCiAgICAgICAgKQoKICAgICAgICBmb3IgcGFydCBpbiBvbGRfcGFyc2VfdmVyc2lvbihzdHIoc2VsZikpOgogICAgICAgICAgICB5aWVsZCBwYXJ0CgoKY2xhc3MgU2V0dXB0b29sc1ZlcnNpb24oX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24pOgogICAgcGFzcwoKCmNsYXNzIFNldHVwdG9vbHNMZWdhY3lWZXJzaW9uKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdpbmcudmVyc2lvbi5MZWdhY3lWZXJzaW9uKToKICAgIHBhc3MKCgpkZWYgcGFyc2VfdmVyc2lvbih2KToKICAgIHRyeToKICAgICAgICByZXR1cm4gU2V0dXB0b29sc1ZlcnNpb24odikKICAgIGV4Y2VwdCBwYWNrYWdpbmcudmVyc2lvbi5JbnZhbGlkVmVyc2lvbjoKICAgICAgICByZXR1cm4gU2V0dXB0b29sc0xlZ2FjeVZlcnNpb24odikKCgpfc3RhdGVfdmFycyA9IHt9CgoKZGVmIF9kZWNsYXJlX3N0YXRlKHZhcnR5cGUsICoqa3cpOgogICAgZ2xvYmFscygpLnVwZGF0ZShrdykKICAgIF9zdGF0ZV92YXJzLnVwZGF0ZShkaWN0LmZyb21rZXlzKGt3LCB2YXJ0eXBlKSkKCgpkZWYgX19nZXRzdGF0ZV9fKCk6CiAgICBzdGF0ZSA9IHt9CiAgICBnID0gZ2xvYmFscygpCiAgICBmb3IgaywgdiBpbiBfc3RhdGVfdmFycy5pdGVtcygpOgogICAgICAgIHN0YXRlW2tdID0gZ1snX3NnZXRfJyArIHZdKGdba10pCiAgICByZXR1cm4gc3RhdGUKCgpkZWYgX19zZXRzdGF0ZV9fKHN0YXRlKToKICAgIGcgPSBnbG9iYWxzKCkKICAgIGZvciBrLCB2IGluIHN0YXRlLml0ZW1zKCk6CiAgICAgICAgZ1snX3NzZXRfJyArIF9zdGF0ZV92YXJzW2tdXShrLCBnW2tdLCB2KQogICAgcmV0dXJuIHN0YXRlCgoKZGVmIF9zZ2V0X2RpY3QodmFsKToKICAgIHJldHVybiB2YWwuY29weSgpCgoKZGVmIF9zc2V0X2RpY3Qoa2V5LCBvYiwgc3RhdGUpOgogICAgb2IuY2xlYXIoKQogICAgb2IudXBkYXRlKHN0YXRlKQoKCmRlZiBfc2dldF9vYmplY3QodmFsKToKICAgIHJldHVybiB2YWwuX19nZXRzdGF0ZV9fKCkKCgpkZWYgX3NzZXRfb2JqZWN0KGtleSwgb2IsIHN0YXRlKToKICAgIG9iLl9fc2V0c3RhdGVfXyhzdGF0ZSkKCgpfc2dldF9ub25lID0gX3NzZXRfbm9uZSA9IGxhbWJkYSAqYXJnczogTm9uZQoKCmRlZiBnZXRfc3VwcG9ydGVkX3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gdGhpcyBwbGF0Zm9ybSdzIG1heGltdW0gY29tcGF0aWJsZSB2ZXJzaW9uLgoKICAgIGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpIG5vcm1hbGx5IHJlcG9ydHMgdGhlIG1pbmltdW0gdmVyc2lvbgogICAgb2YgTWFjIE9TIFggdGhhdCB3b3VsZCBiZSByZXF1aXJlZCB0byAqdXNlKiBleHRlbnNpb25zIHByb2R1Y2VkIGJ5CiAgICBkaXN0dXRpbHMuICBCdXQgd2hhdCB3ZSB3YW50IHdoZW4gY2hlY2tpbmcgY29tcGF0aWJpbGl0eSBpcyB0byBrbm93IHRoZQogICAgdmVyc2lvbiBvZiBNYWMgT1MgWCB0aGF0IHdlIGFyZSAqcnVubmluZyouICBUbyBhbGxvdyB1c2FnZSBvZiBwYWNrYWdlcyB0aGF0CiAgICBleHBsaWNpdGx5IHJlcXVpcmUgYSBuZXdlciB2ZXJzaW9uIG9mIE1hYyBPUyBYLCB3ZSBtdXN0IGFsc28ga25vdyB0aGUKICAgIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgT1MuCgogICAgSWYgdGhpcyBjb25kaXRpb24gb2NjdXJzIGZvciBhbnkgb3RoZXIgcGxhdGZvcm0gd2l0aCBhIHZlcnNpb24gaW4gaXRzCiAgICBwbGF0Zm9ybSBzdHJpbmdzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBleHRlbmRlZCBhY2NvcmRpbmdseS4KICAgICIiIgogICAgcGxhdCA9IGdldF9idWlsZF9wbGF0Zm9ybSgpCiAgICBtID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHBsYXQpCiAgICBpZiBtIGlzIG5vdCBOb25lIGFuZCBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBwbGF0ID0gJ21hY29zeC0lcy0lcycgJSAoJy4nLmpvaW4oX21hY29zeF92ZXJzKClbOjJdKSwgbS5ncm91cCgzKSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIyBub3QgTWFjIE9TIFgKICAgICAgICAgICAgcGFzcwogICAgcmV0dXJuIHBsYXQKCgpfX2FsbF9fID0gWwogICAgIyBCYXNpYyByZXNvdXJjZSBhY2Nlc3MgYW5kIGRpc3RyaWJ1dGlvbi9lbnRyeSBwb2ludCBkaXNjb3ZlcnkKICAgICdyZXF1aXJlJywgJ3J1bl9zY3JpcHQnLCAnZ2V0X3Byb3ZpZGVyJywgJ2dldF9kaXN0cmlidXRpb24nLAogICAgJ2xvYWRfZW50cnlfcG9pbnQnLCAnZ2V0X2VudHJ5X21hcCcsICdnZXRfZW50cnlfaW5mbycsCiAgICAnaXRlcl9lbnRyeV9wb2ludHMnLAogICAgJ3Jlc291cmNlX3N0cmluZycsICdyZXNvdXJjZV9zdHJlYW0nLCAncmVzb3VyY2VfZmlsZW5hbWUnLAogICAgJ3Jlc291cmNlX2xpc3RkaXInLCAncmVzb3VyY2VfZXhpc3RzJywgJ3Jlc291cmNlX2lzZGlyJywKCiAgICAjIEVudmlyb25tZW50YWwgY29udHJvbAogICAgJ2RlY2xhcmVfbmFtZXNwYWNlJywgJ3dvcmtpbmdfc2V0JywgJ2FkZF9hY3RpdmF0aW9uX2xpc3RlbmVyJywKICAgICdmaW5kX2Rpc3RyaWJ1dGlvbnMnLCAnc2V0X2V4dHJhY3Rpb25fcGF0aCcsICdjbGVhbnVwX3Jlc291cmNlcycsCiAgICAnZ2V0X2RlZmF1bHRfY2FjaGUnLAoKICAgICMgUHJpbWFyeSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzCiAgICAnRW52aXJvbm1lbnQnLCAnV29ya2luZ1NldCcsICdSZXNvdXJjZU1hbmFnZXInLAogICAgJ0Rpc3RyaWJ1dGlvbicsICdSZXF1aXJlbWVudCcsICdFbnRyeVBvaW50JywKCiAgICAjIEV4Y2VwdGlvbnMKICAgICdSZXNvbHV0aW9uRXJyb3InLCAnVmVyc2lvbkNvbmZsaWN0JywgJ0Rpc3RyaWJ1dGlvbk5vdEZvdW5kJywKICAgICdVbmtub3duRXh0cmEnLCAnRXh0cmFjdGlvbkVycm9yJywKCiAgICAjIFdhcm5pbmdzCiAgICAnUEVQNDQwV2FybmluZycsCgogICAgIyBQYXJzaW5nIGZ1bmN0aW9ucyBhbmQgc3RyaW5nIHV0aWxpdGllcwogICAgJ3BhcnNlX3JlcXVpcmVtZW50cycsICdwYXJzZV92ZXJzaW9uJywgJ3NhZmVfbmFtZScsICdzYWZlX3ZlcnNpb24nLAogICAgJ2dldF9wbGF0Zm9ybScsICdjb21wYXRpYmxlX3BsYXRmb3JtcycsICd5aWVsZF9saW5lcycsICdzcGxpdF9zZWN0aW9ucycsCiAgICAnc2FmZV9leHRyYScsICd0b19maWxlbmFtZScsICdpbnZhbGlkX21hcmtlcicsICdldmFsdWF0ZV9tYXJrZXInLAoKICAgICMgZmlsZXN5c3RlbSB1dGlsaXRpZXMKICAgICdlbnN1cmVfZGlyZWN0b3J5JywgJ25vcm1hbGl6ZV9wYXRoJywKCiAgICAjIERpc3RyaWJ1dGlvbiAicHJlY2VkZW5jZSIgY29uc3RhbnRzCiAgICAnRUdHX0RJU1QnLCAnQklOQVJZX0RJU1QnLCAnU09VUkNFX0RJU1QnLCAnQ0hFQ0tPVVRfRElTVCcsICdERVZFTE9QX0RJU1QnLAoKICAgICMgIlByb3ZpZGVyIiBpbnRlcmZhY2VzLCBpbXBsZW1lbnRhdGlvbnMsIGFuZCByZWdpc3RyYXRpb24vbG9va3VwIEFQSXMKICAgICdJTWV0YWRhdGFQcm92aWRlcicsICdJUmVzb3VyY2VQcm92aWRlcicsICdGaWxlTWV0YWRhdGEnLAogICAgJ1BhdGhNZXRhZGF0YScsICdFZ2dNZXRhZGF0YScsICdFbXB0eVByb3ZpZGVyJywgJ2VtcHR5X3Byb3ZpZGVyJywKICAgICdOdWxsUHJvdmlkZXInLCAnRWdnUHJvdmlkZXInLCAnRGVmYXVsdFByb3ZpZGVyJywgJ1ppcFByb3ZpZGVyJywKICAgICdyZWdpc3Rlcl9maW5kZXInLCAncmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXInLCAncmVnaXN0ZXJfbG9hZGVyX3R5cGUnLAogICAgJ2ZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcycsICdnZXRfaW1wb3J0ZXInLAoKICAgICMgRGVwcmVjYXRlZC9iYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkKICAgICdydW5fbWFpbicsICdBdmFpbGFibGVEaXN0cmlidXRpb25zJywKXQoKCmNsYXNzIFJlc29sdXRpb25FcnJvcihFeGNlcHRpb24pOgogICAgIiIiQWJzdHJhY3QgYmFzZSBmb3IgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGVycm9ycyIiIgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyByZXByKHNlbGYuYXJncykKCgpjbGFzcyBWZXJzaW9uQ29uZmxpY3QoUmVzb2x1dGlvbkVycm9yKToKICAgICIiIgogICAgQW4gYWxyZWFkeS1pbnN0YWxsZWQgdmVyc2lvbiBjb25mbGljdHMgd2l0aCB0aGUgcmVxdWVzdGVkIHZlcnNpb24uCgogICAgU2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGluc3RhbGxlZCBEaXN0cmlidXRpb24gYW5kIHRoZSByZXF1ZXN0ZWQKICAgIFJlcXVpcmVtZW50LgogICAgIiIiCgogICAgX3RlbXBsYXRlID0gIntzZWxmLmRpc3R9IGlzIGluc3RhbGxlZCBidXQge3NlbGYucmVxfSBpcyByZXF1aXJlZCIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkaXN0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXEoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1sxXQoKICAgIGRlZiByZXBvcnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3RlbXBsYXRlLmZvcm1hdCgqKmxvY2FscygpKQoKICAgIGRlZiB3aXRoX2NvbnRleHQoc2VsZiwgcmVxdWlyZWRfYnkpOgogICAgICAgICIiIgogICAgICAgIElmIHJlcXVpcmVkX2J5IGlzIG5vbi1lbXB0eSwgcmV0dXJuIGEgdmVyc2lvbiBvZiBzZWxmIHRoYXQgaXMgYQogICAgICAgIENvbnRleHR1YWxWZXJzaW9uQ29uZmxpY3QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHJlcXVpcmVkX2J5OgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIGFyZ3MgPSBzZWxmLmFyZ3MgKyAocmVxdWlyZWRfYnksKQogICAgICAgIHJldHVybiBDb250ZXh0dWFsVmVyc2lvbkNvbmZsaWN0KCphcmdzKQoKCmNsYXNzIENvbnRleHR1YWxWZXJzaW9uQ29uZmxpY3QoVmVyc2lvbkNvbmZsaWN0KToKICAgICIiIgogICAgQSBWZXJzaW9uQ29uZmxpY3QgdGhhdCBhY2NlcHRzIGEgdGhpcmQgcGFyYW1ldGVyLCB0aGUgc2V0IG9mIHRoZQogICAgcmVxdWlyZW1lbnRzIHRoYXQgcmVxdWlyZWQgdGhlIGluc3RhbGxlZCBEaXN0cmlidXRpb24uCiAgICAiIiIKCiAgICBfdGVtcGxhdGUgPSBWZXJzaW9uQ29uZmxpY3QuX3RlbXBsYXRlICsgJyBieSB7c2VsZi5yZXF1aXJlZF9ieX0nCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxdWlyZWRfYnkoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1syXQoKCmNsYXNzIERpc3RyaWJ1dGlvbk5vdEZvdW5kKFJlc29sdXRpb25FcnJvcik6CiAgICAiIiJBIHJlcXVlc3RlZCBkaXN0cmlidXRpb24gd2FzIG5vdCBmb3VuZCIiIgoKICAgIF90ZW1wbGF0ZSA9ICgiVGhlICd7c2VsZi5yZXF9JyBkaXN0cmlidXRpb24gd2FzIG5vdCBmb3VuZCAiCiAgICAgICAgICAgICAgICAgImFuZCBpcyByZXF1aXJlZCBieSB7c2VsZi5yZXF1aXJlcnNfc3RyfSIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1aXJlcnMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1sxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVpcmVyc19zdHIoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYucmVxdWlyZXJzOgogICAgICAgICAgICByZXR1cm4gJ3RoZSBhcHBsaWNhdGlvbicKICAgICAgICByZXR1cm4gJywgJy5qb2luKHNlbGYucmVxdWlyZXJzKQoKICAgIGRlZiByZXBvcnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3RlbXBsYXRlLmZvcm1hdCgqKmxvY2FscygpKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnJlcG9ydCgpCgoKY2xhc3MgVW5rbm93bkV4dHJhKFJlc29sdXRpb25FcnJvcik6CiAgICAiIiJEaXN0cmlidXRpb24gZG9lc24ndCBoYXZlIGFuICJleHRyYSBmZWF0dXJlIiBvZiB0aGUgZ2l2ZW4gbmFtZSIiIgoKCl9wcm92aWRlcl9mYWN0b3JpZXMgPSB7fQoKUFlfTUFKT1IgPSBzeXMudmVyc2lvbls6M10KRUdHX0RJU1QgPSAzCkJJTkFSWV9ESVNUID0gMgpTT1VSQ0VfRElTVCA9IDEKQ0hFQ0tPVVRfRElTVCA9IDAKREVWRUxPUF9ESVNUID0gLTEKCgpkZWYgcmVnaXN0ZXJfbG9hZGVyX3R5cGUobG9hZGVyX3R5cGUsIHByb3ZpZGVyX2ZhY3RvcnkpOgogICAgIiIiUmVnaXN0ZXIgYHByb3ZpZGVyX2ZhY3RvcnlgIHRvIG1ha2UgcHJvdmlkZXJzIGZvciBgbG9hZGVyX3R5cGVgCgogICAgYGxvYWRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgYGBtb2R1bGUuX19sb2FkZXJfX2BgLAogICAgYW5kIGBwcm92aWRlcl9mYWN0b3J5YCBpcyBhIGZ1bmN0aW9uIHRoYXQsIHBhc3NlZCBhICptb2R1bGUqIG9iamVjdCwKICAgIHJldHVybnMgYW4gYGBJUmVzb3VyY2VQcm92aWRlcmBgIGZvciB0aGF0IG1vZHVsZS4KICAgICIiIgogICAgX3Byb3ZpZGVyX2ZhY3Rvcmllc1tsb2FkZXJfdHlwZV0gPSBwcm92aWRlcl9mYWN0b3J5CgoKZGVmIGdldF9wcm92aWRlcihtb2R1bGVPclJlcSk6CiAgICAiIiJSZXR1cm4gYW4gSVJlc291cmNlUHJvdmlkZXIgZm9yIHRoZSBuYW1lZCBtb2R1bGUgb3IgcmVxdWlyZW1lbnQiIiIKICAgIGlmIGlzaW5zdGFuY2UobW9kdWxlT3JSZXEsIFJlcXVpcmVtZW50KToKICAgICAgICByZXR1cm4gd29ya2luZ19zZXQuZmluZChtb2R1bGVPclJlcSkgb3IgcmVxdWlyZShzdHIobW9kdWxlT3JSZXEpKVswXQogICAgdHJ5OgogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZU9yUmVxXQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIF9faW1wb3J0X18obW9kdWxlT3JSZXEpCiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlT3JSZXFdCiAgICBsb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQogICAgcmV0dXJuIF9maW5kX2FkYXB0ZXIoX3Byb3ZpZGVyX2ZhY3RvcmllcywgbG9hZGVyKShtb2R1bGUpCgoKZGVmIF9tYWNvc3hfdmVycyhfY2FjaGU9W10pOgogICAgaWYgbm90IF9jYWNoZToKICAgICAgICB2ZXJzaW9uID0gcGxhdGZvcm0ubWFjX3ZlcigpWzBdCiAgICAgICAgIyBmYWxsYmFjayBmb3IgTWFjUG9ydHMKICAgICAgICBpZiB2ZXJzaW9uID09ICcnOgogICAgICAgICAgICBwbGlzdCA9ICcvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbVZlcnNpb24ucGxpc3QnCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBsaXN0KToKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIocGxpc3RsaWIsICdyZWFkUGxpc3QnKToKICAgICAgICAgICAgICAgICAgICBwbGlzdF9jb250ZW50ID0gcGxpc3RsaWIucmVhZFBsaXN0KHBsaXN0KQogICAgICAgICAgICAgICAgICAgIGlmICdQcm9kdWN0VmVyc2lvbicgaW4gcGxpc3RfY29udGVudDoKICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHBsaXN0X2NvbnRlbnRbJ1Byb2R1Y3RWZXJzaW9uJ10KCiAgICAgICAgX2NhY2hlLmFwcGVuZCh2ZXJzaW9uLnNwbGl0KCcuJykpCiAgICByZXR1cm4gX2NhY2hlWzBdCgoKZGVmIF9tYWNvc3hfYXJjaChtYWNoaW5lKToKICAgIHJldHVybiB7J1Bvd2VyUEMnOiAncHBjJywgJ1Bvd2VyX01hY2ludG9zaCc6ICdwcGMnfS5nZXQobWFjaGluZSwgbWFjaGluZSkKCgpkZWYgZ2V0X2J1aWxkX3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gdGhpcyBwbGF0Zm9ybSdzIHN0cmluZyBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgZGlzdHJpYnV0aW9ucwoKICAgIFhYWCBDdXJyZW50bHkgdGhpcyBpcyB0aGUgc2FtZSBhcyBgYGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpYGAsIGJ1dCBpdAogICAgbmVlZHMgc29tZSBoYWNrcyBmb3IgTGludXggYW5kIE1hYyBPUyBYLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgIyBQeXRob24gMi43IG9yID49My4yCiAgICAgICAgZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9wbGF0Zm9ybQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQoKICAgIHBsYXQgPSBnZXRfcGxhdGZvcm0oKQogICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iIGFuZCBub3QgcGxhdC5zdGFydHN3aXRoKCdtYWNvc3gtJyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB2ZXJzaW9uID0gX21hY29zeF92ZXJzKCkKICAgICAgICAgICAgbWFjaGluZSA9IG9zLnVuYW1lKClbNF0ucmVwbGFjZSgiICIsICJfIikKICAgICAgICAgICAgcmV0dXJuICJtYWNvc3gtJWQuJWQtJXMiICUgKAogICAgICAgICAgICAgICAgaW50KHZlcnNpb25bMF0pLCBpbnQodmVyc2lvblsxXSksCiAgICAgICAgICAgICAgICBfbWFjb3N4X2FyY2gobWFjaGluZSksCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIyBpZiBzb21lb25lIGlzIHJ1bm5pbmcgYSBub24tTWFjIGRhcndpbiBzeXN0ZW0sIHRoaXMgd2lsbCBmYWxsCiAgICAgICAgICAgICMgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBwYXNzCiAgICByZXR1cm4gcGxhdAoKCm1hY29zVmVyc2lvblN0cmluZyA9IHJlLmNvbXBpbGUociJtYWNvc3gtKFxkKylcLihcZCspLSguKikiKQpkYXJ3aW5WZXJzaW9uU3RyaW5nID0gcmUuY29tcGlsZShyImRhcndpbi0oXGQrKVwuKFxkKylcLihcZCspLSguKikiKQojIFhYWCBiYWNrd2FyZCBjb21wYXQKZ2V0X3BsYXRmb3JtID0gZ2V0X2J1aWxkX3BsYXRmb3JtCgoKZGVmIGNvbXBhdGlibGVfcGxhdGZvcm1zKHByb3ZpZGVkLCByZXF1aXJlZCk6CiAgICAiIiJDYW4gY29kZSBmb3IgdGhlIGBwcm92aWRlZGAgcGxhdGZvcm0gcnVuIG9uIHRoZSBgcmVxdWlyZWRgIHBsYXRmb3JtPwoKICAgIFJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgcGxhdGZvcm0gaXMgYGBOb25lYGAsIG9yIHRoZSBwbGF0Zm9ybXMgYXJlIGVxdWFsLgoKICAgIFhYWCBOZWVkcyBjb21wYXRpYmlsaXR5IGNoZWNrcyBmb3IgTGludXggYW5kIG90aGVyIHVuaXh5IE9TZXMuCiAgICAiIiIKICAgIGlmIHByb3ZpZGVkIGlzIE5vbmUgb3IgcmVxdWlyZWQgaXMgTm9uZSBvciBwcm92aWRlZCA9PSByZXF1aXJlZDoKICAgICAgICAjIGVhc3kgY2FzZQogICAgICAgIHJldHVybiBUcnVlCgogICAgIyBNYWMgT1MgWCBzcGVjaWFsIGNhc2VzCiAgICByZXFNYWMgPSBtYWNvc1ZlcnNpb25TdHJpbmcubWF0Y2gocmVxdWlyZWQpCiAgICBpZiByZXFNYWM6CiAgICAgICAgcHJvdk1hYyA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChwcm92aWRlZCkKCiAgICAgICAgIyBpcyB0aGlzIGEgTWFjIHBhY2thZ2U/CiAgICAgICAgaWYgbm90IHByb3ZNYWM6CiAgICAgICAgICAgICMgdGhpcyBpcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgcGFja2FnZXMgYnVpbHQgYmVmb3JlCiAgICAgICAgICAgICMgc2V0dXB0b29scyAwLjYuIEFsbCBwYWNrYWdlcyBidWlsdCBhZnRlciB0aGlzIHBvaW50IHdpbGwKICAgICAgICAgICAgIyB1c2UgdGhlIG5ldyBtYWNvc3ggZGVzaWduYXRpb24uCiAgICAgICAgICAgIHByb3ZEYXJ3aW4gPSBkYXJ3aW5WZXJzaW9uU3RyaW5nLm1hdGNoKHByb3ZpZGVkKQogICAgICAgICAgICBpZiBwcm92RGFyd2luOgogICAgICAgICAgICAgICAgZHZlcnNpb24gPSBpbnQocHJvdkRhcndpbi5ncm91cCgxKSkKICAgICAgICAgICAgICAgIG1hY29zdmVyc2lvbiA9ICIlcy4lcyIgJSAocmVxTWFjLmdyb3VwKDEpLCByZXFNYWMuZ3JvdXAoMikpCiAgICAgICAgICAgICAgICBpZiBkdmVyc2lvbiA9PSA3IGFuZCBtYWNvc3ZlcnNpb24gPj0gIjEwLjMiIG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgZHZlcnNpb24gPT0gOCBhbmQgbWFjb3N2ZXJzaW9uID49ICIxMC40IjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICAjIGVnZyBpc24ndCBtYWNvc3ggb3IgbGVnYWN5IGRhcndpbgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBhcmUgdGhleSB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uIGFuZCBtYWNoaW5lIHR5cGU/CiAgICAgICAgaWYgcHJvdk1hYy5ncm91cCgxKSAhPSByZXFNYWMuZ3JvdXAoMSkgb3IgXAogICAgICAgICAgICAgICAgcHJvdk1hYy5ncm91cCgzKSAhPSByZXFNYWMuZ3JvdXAoMyk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIGlzIHRoZSByZXF1aXJlZCBPUyBtYWpvciB1cGRhdGUgPj0gdGhlIHByb3ZpZGVkIG9uZT8KICAgICAgICBpZiBpbnQocHJvdk1hYy5ncm91cCgyKSkgPiBpbnQocmVxTWFjLmdyb3VwKDIpKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBUcnVlCgogICAgIyBYWFggTGludXggYW5kIG90aGVyIHBsYXRmb3Jtcycgc3BlY2lhbCBjYXNlcyBzaG91bGQgZ28gaGVyZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIHJ1bl9zY3JpcHQoZGlzdF9zcGVjLCBzY3JpcHRfbmFtZSk6CiAgICAiIiJMb2NhdGUgZGlzdHJpYnV0aW9uIGBkaXN0X3NwZWNgIGFuZCBydW4gaXRzIGBzY3JpcHRfbmFtZWAgc2NyaXB0IiIiCiAgICBucyA9IHN5cy5fZ2V0ZnJhbWUoMSkuZl9nbG9iYWxzCiAgICBuYW1lID0gbnNbJ19fbmFtZV9fJ10KICAgIG5zLmNsZWFyKCkKICAgIG5zWydfX25hbWVfXyddID0gbmFtZQogICAgcmVxdWlyZShkaXN0X3NwZWMpWzBdLnJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5zKQoKCiMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQpydW5fbWFpbiA9IHJ1bl9zY3JpcHQKCgpkZWYgZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KToKICAgICIiIlJldHVybiBhIGN1cnJlbnQgZGlzdHJpYnV0aW9uIG9iamVjdCBmb3IgYSBSZXF1aXJlbWVudCBvciBzdHJpbmciIiIKICAgIGlmIGlzaW5zdGFuY2UoZGlzdCwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgZGlzdCA9IFJlcXVpcmVtZW50LnBhcnNlKGRpc3QpCiAgICBpZiBpc2luc3RhbmNlKGRpc3QsIFJlcXVpcmVtZW50KToKICAgICAgICBkaXN0ID0gZ2V0X3Byb3ZpZGVyKGRpc3QpCiAgICBpZiBub3QgaXNpbnN0YW5jZShkaXN0LCBEaXN0cmlidXRpb24pOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigiRXhwZWN0ZWQgc3RyaW5nLCBSZXF1aXJlbWVudCwgb3IgRGlzdHJpYnV0aW9uIiwgZGlzdCkKICAgIHJldHVybiBkaXN0CgoKZGVmIGxvYWRfZW50cnlfcG9pbnQoZGlzdCwgZ3JvdXAsIG5hbWUpOgogICAgIiIiUmV0dXJuIGBuYW1lYCBlbnRyeSBwb2ludCBvZiBgZ3JvdXBgIGZvciBgZGlzdGAgb3IgcmFpc2UgSW1wb3J0RXJyb3IiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmxvYWRfZW50cnlfcG9pbnQoZ3JvdXAsIG5hbWUpCgoKZGVmIGdldF9lbnRyeV9tYXAoZGlzdCwgZ3JvdXA9Tm9uZSk6CiAgICAiIiJSZXR1cm4gdGhlIGVudHJ5IHBvaW50IG1hcCBmb3IgYGdyb3VwYCwgb3IgdGhlIGZ1bGwgZW50cnkgbWFwIiIiCiAgICByZXR1cm4gZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KS5nZXRfZW50cnlfbWFwKGdyb3VwKQoKCmRlZiBnZXRfZW50cnlfaW5mbyhkaXN0LCBncm91cCwgbmFtZSk6CiAgICAiIiJSZXR1cm4gdGhlIEVudHJ5UG9pbnQgb2JqZWN0IGZvciBgZ3JvdXBgK2BuYW1lYCwgb3IgYGBOb25lYGAiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmdldF9lbnRyeV9pbmZvKGdyb3VwLCBuYW1lKQoKCmNsYXNzIElNZXRhZGF0YVByb3ZpZGVyOgogICAgZGVmIGhhc19tZXRhZGF0YShuYW1lKToKICAgICAgICAiIiJEb2VzIHRoZSBwYWNrYWdlJ3MgZGlzdHJpYnV0aW9uIGNvbnRhaW4gdGhlIG5hbWVkIG1ldGFkYXRhPyIiIgoKICAgIGRlZiBnZXRfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgIiIiVGhlIG5hbWVkIG1ldGFkYXRhIHJlc291cmNlIGFzIGEgc3RyaW5nIiIiCgogICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhuYW1lKToKICAgICAgICAiIiJZaWVsZCBuYW1lZCBtZXRhZGF0YSByZXNvdXJjZSBhcyBsaXN0IG9mIG5vbi1ibGFuayBub24tY29tbWVudCBsaW5lcwoKICAgICAgIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgc3RyaXBwZWQgZnJvbSBlYWNoIGxpbmUsIGFuZCBsaW5lcwogICAgICAgd2l0aCBgYCNgYCBhcyB0aGUgZmlyc3Qgbm9uLWJsYW5rIGNoYXJhY3RlciBhcmUgb21pdHRlZC4iIiIKCiAgICBkZWYgbWV0YWRhdGFfaXNkaXIobmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIG1ldGFkYXRhIGEgZGlyZWN0b3J5PyAgKGxpa2UgYGBvcy5wYXRoLmlzZGlyKClgYCkiIiIKCiAgICBkZWYgbWV0YWRhdGFfbGlzdGRpcihuYW1lKToKICAgICAgICAiIiJMaXN0IG9mIG1ldGFkYXRhIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkgKGxpa2UgYGBvcy5saXN0ZGlyKClgYCkiIiIKCiAgICBkZWYgcnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbmFtZXNwYWNlKToKICAgICAgICAiIiJFeGVjdXRlIHRoZSBuYW1lZCBzY3JpcHQgaW4gdGhlIHN1cHBsaWVkIG5hbWVzcGFjZSBkaWN0aW9uYXJ5IiIiCgoKY2xhc3MgSVJlc291cmNlUHJvdmlkZXIoSU1ldGFkYXRhUHJvdmlkZXIpOgogICAgIiIiQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHBhY2thZ2UgcmVzb3VyY2VzIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSB0cnVlIGZpbGVzeXN0ZW0gcGF0aCBmb3IgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0obWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgcmVhZGFibGUgZmlsZS1saWtlIG9iamVjdCBmb3IgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJpbmcobWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIGByZXNvdXJjZV9uYW1lYAoKICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgoKICAgIGRlZiBoYXNfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiRG9lcyB0aGUgcGFja2FnZSBjb250YWluIHRoZSBuYW1lZCByZXNvdXJjZT8iIiIKCiAgICBkZWYgcmVzb3VyY2VfaXNkaXIocmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIHJlc291cmNlIGEgZGlyZWN0b3J5PyAgKGxpa2UgYGBvcy5wYXRoLmlzZGlyKClgYCkiIiIKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJMaXN0IG9mIHJlc291cmNlIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkgKGxpa2UgYGBvcy5saXN0ZGlyKClgYCkiIiIKCgpjbGFzcyBXb3JraW5nU2V0KG9iamVjdCk6CiAgICAiIiJBIGNvbGxlY3Rpb24gb2YgYWN0aXZlIGRpc3RyaWJ1dGlvbnMgb24gc3lzLnBhdGggKG9yIGEgc2ltaWxhciBsaXN0KSIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbnRyaWVzPU5vbmUpOgogICAgICAgICIiIkNyZWF0ZSB3b3JraW5nIHNldCBmcm9tIGxpc3Qgb2YgcGF0aCBlbnRyaWVzIChkZWZhdWx0PXN5cy5wYXRoKSIiIgogICAgICAgIHNlbGYuZW50cmllcyA9IFtdCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzID0ge30KICAgICAgICBzZWxmLmJ5X2tleSA9IHt9CiAgICAgICAgc2VsZi5jYWxsYmFja3MgPSBbXQoKICAgICAgICBpZiBlbnRyaWVzIGlzIE5vbmU6CiAgICAgICAgICAgIGVudHJpZXMgPSBzeXMucGF0aAoKICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllczoKICAgICAgICAgICAgc2VsZi5hZGRfZW50cnkoZW50cnkpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2J1aWxkX21hc3RlcihjbHMpOgogICAgICAgICIiIgogICAgICAgIFByZXBhcmUgdGhlIG1hc3RlciB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICB3cyA9IGNscygpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIF9fbWFpbl9fIGltcG9ydCBfX3JlcXVpcmVzX18KICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICMgVGhlIG1haW4gcHJvZ3JhbSBkb2VzIG5vdCBsaXN0IGFueSByZXF1aXJlbWVudHMKICAgICAgICAgICAgcmV0dXJuIHdzCgogICAgICAgICMgZW5zdXJlIHRoZSByZXF1aXJlbWVudHMgYXJlIG1ldAogICAgICAgIHRyeToKICAgICAgICAgICAgd3MucmVxdWlyZShfX3JlcXVpcmVzX18pCiAgICAgICAgZXhjZXB0IFZlcnNpb25Db25mbGljdDoKICAgICAgICAgICAgcmV0dXJuIGNscy5fYnVpbGRfZnJvbV9yZXF1aXJlbWVudHMoX19yZXF1aXJlc19fKQoKICAgICAgICByZXR1cm4gd3MKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYnVpbGRfZnJvbV9yZXF1aXJlbWVudHMoY2xzLCByZXFfc3BlYyk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYSB3b3JraW5nIHNldCBmcm9tIGEgcmVxdWlyZW1lbnQgc3BlYy4gUmV3cml0ZXMgc3lzLnBhdGguCiAgICAgICAgIiIiCiAgICAgICAgIyB0cnkgaXQgd2l0aG91dCBkZWZhdWx0cyBhbHJlYWR5IG9uIHN5cy5wYXRoCiAgICAgICAgIyBieSBzdGFydGluZyB3aXRoIGFuIGVtcHR5IHBhdGgKICAgICAgICB3cyA9IGNscyhbXSkKICAgICAgICByZXFzID0gcGFyc2VfcmVxdWlyZW1lbnRzKHJlcV9zcGVjKQogICAgICAgIGRpc3RzID0gd3MucmVzb2x2ZShyZXFzLCBFbnZpcm9ubWVudCgpKQogICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICB3cy5hZGQoZGlzdCkKCiAgICAgICAgIyBhZGQgYW55IG1pc3NpbmcgZW50cmllcyBmcm9tIHN5cy5wYXRoCiAgICAgICAgZm9yIGVudHJ5IGluIHN5cy5wYXRoOgogICAgICAgICAgICBpZiBlbnRyeSBub3QgaW4gd3MuZW50cmllczoKICAgICAgICAgICAgICAgIHdzLmFkZF9lbnRyeShlbnRyeSkKCiAgICAgICAgIyB0aGVuIGNvcHkgYmFjayB0byBzeXMucGF0aAogICAgICAgIHN5cy5wYXRoWzpdID0gd3MuZW50cmllcwogICAgICAgIHJldHVybiB3cwoKICAgIGRlZiBhZGRfZW50cnkoc2VsZiwgZW50cnkpOgogICAgICAgICIiIkFkZCBhIHBhdGggaXRlbSB0byBgYC5lbnRyaWVzYGAsIGZpbmRpbmcgYW55IGRpc3RyaWJ1dGlvbnMgb24gaXQKCiAgICAgICAgYGBmaW5kX2Rpc3RyaWJ1dGlvbnMoZW50cnksIFRydWUpYGAgaXMgdXNlZCB0byBmaW5kIGRpc3RyaWJ1dGlvbnMKICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXRoIGVudHJ5LCBhbmQgdGhleSBhcmUgYWRkZWQuICBgZW50cnlgIGlzCiAgICAgICAgYWx3YXlzIGFwcGVuZGVkIHRvIGBgLmVudHJpZXNgYCwgZXZlbiBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQuCiAgICAgICAgKFRoaXMgaXMgYmVjYXVzZSBgYHN5cy5wYXRoYGAgY2FuIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUgbW9yZSB0aGFuCiAgICAgICAgb25jZSwgYW5kIHRoZSBgYC5lbnRyaWVzYGAgb2YgdGhlIGBgc3lzLnBhdGhgYCBXb3JraW5nU2V0IHNob3VsZCBhbHdheXMKICAgICAgICBlcXVhbCBgYHN5cy5wYXRoYGAuKQogICAgICAgICIiIgogICAgICAgIHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGVudHJ5LCBbXSkKICAgICAgICBzZWxmLmVudHJpZXMuYXBwZW5kKGVudHJ5KQogICAgICAgIGZvciBkaXN0IGluIGZpbmRfZGlzdHJpYnV0aW9ucyhlbnRyeSwgVHJ1ZSk6CiAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QsIGVudHJ5LCBGYWxzZSkKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlRydWUgaWYgYGRpc3RgIGlzIHRoZSBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciBpdHMgcHJvamVjdCIiIgogICAgICAgIHJldHVybiBzZWxmLmJ5X2tleS5nZXQoZGlzdC5rZXkpID09IGRpc3QKCiAgICBkZWYgZmluZChzZWxmLCByZXEpOgogICAgICAgICIiIkZpbmQgYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgcmVxdWlyZW1lbnQgYHJlcWAKCiAgICAgICAgSWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBwcm9qZWN0LCB0aGlzCiAgICAgICAgcmV0dXJucyBpdCBhcyBsb25nIGFzIGl0IG1lZXRzIHRoZSB2ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWNpZmllZCBieQogICAgICAgIGByZXFgLiAgQnV0LCBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcHJvamVjdCBhbmQgaXQKICAgICAgICBkb2VzICpub3QqIG1lZXQgdGhlIGByZXFgIHJlcXVpcmVtZW50LCBgYFZlcnNpb25Db25mbGljdGBgIGlzIHJhaXNlZC4KICAgICAgICBJZiB0aGVyZSBpcyBubyBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHByb2plY3QsIGBgTm9uZWBgCiAgICAgICAgaXMgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgZGlzdCA9IHNlbGYuYnlfa2V5LmdldChyZXEua2V5KQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmUgYW5kIGRpc3Qgbm90IGluIHJlcToKICAgICAgICAgICAgIyBYWFggYWRkIG1vcmUgaW5mbwogICAgICAgICAgICByYWlzZSBWZXJzaW9uQ29uZmxpY3QoZGlzdCwgcmVxKQogICAgICAgIHJldHVybiBkaXN0CgogICAgZGVmIGl0ZXJfZW50cnlfcG9pbnRzKHNlbGYsIGdyb3VwLCBuYW1lPU5vbmUpOgogICAgICAgICIiIllpZWxkIGVudHJ5IHBvaW50IG9iamVjdHMgZnJvbSBgZ3JvdXBgIG1hdGNoaW5nIGBuYW1lYAoKICAgICAgICBJZiBgbmFtZWAgaXMgTm9uZSwgeWllbGRzIGFsbCBlbnRyeSBwb2ludHMgaW4gYGdyb3VwYCBmcm9tIGFsbAogICAgICAgIGRpc3RyaWJ1dGlvbnMgaW4gdGhlIHdvcmtpbmcgc2V0LCBvdGhlcndpc2Ugb25seSBvbmVzIG1hdGNoaW5nCiAgICAgICAgYm90aCBgZ3JvdXBgIGFuZCBgbmFtZWAgYXJlIHlpZWxkZWQgKGluIGRpc3RyaWJ1dGlvbiBvcmRlcikuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZjoKICAgICAgICAgICAgZW50cmllcyA9IGRpc3QuZ2V0X2VudHJ5X21hcChncm91cCkKICAgICAgICAgICAgaWYgbmFtZSBpcyBOb25lOgogICAgICAgICAgICAgICAgZm9yIGVwIGluIGVudHJpZXMudmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZXAKICAgICAgICAgICAgZWxpZiBuYW1lIGluIGVudHJpZXM6CiAgICAgICAgICAgICAgICB5aWVsZCBlbnRyaWVzW25hbWVdCgogICAgZGVmIHJ1bl9zY3JpcHQoc2VsZiwgcmVxdWlyZXMsIHNjcmlwdF9uYW1lKToKICAgICAgICAiIiJMb2NhdGUgZGlzdHJpYnV0aW9uIGZvciBgcmVxdWlyZXNgIGFuZCBydW4gYHNjcmlwdF9uYW1lYCBzY3JpcHQiIiIKICAgICAgICBucyA9IHN5cy5fZ2V0ZnJhbWUoMSkuZl9nbG9iYWxzCiAgICAgICAgbmFtZSA9IG5zWydfX25hbWVfXyddCiAgICAgICAgbnMuY2xlYXIoKQogICAgICAgIG5zWydfX25hbWVfXyddID0gbmFtZQogICAgICAgIHNlbGYucmVxdWlyZShyZXF1aXJlcylbMF0ucnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbnMpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgZm9yIG5vbi1kdXBsaWNhdGUgcHJvamVjdHMgaW4gdGhlIHdvcmtpbmcgc2V0CgogICAgICAgIFRoZSB5aWVsZCBvcmRlciBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGl0ZW1zJyBwYXRoIGVudHJpZXMgd2VyZQogICAgICAgIGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICBzZWVuID0ge30KICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmVudHJpZXM6CiAgICAgICAgICAgIGlmIGl0ZW0gbm90IGluIHNlbGYuZW50cnlfa2V5czoKICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBhIGNhY2hlIGlzc3VlCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLmVudHJ5X2tleXNbaXRlbV06CiAgICAgICAgICAgICAgICBpZiBrZXkgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgc2VlbltrZXldID0gMQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuYnlfa2V5W2tleV0KCiAgICBkZWYgYWRkKHNlbGYsIGRpc3QsIGVudHJ5PU5vbmUsIGluc2VydD1UcnVlLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAiIiJBZGQgYGRpc3RgIHRvIHdvcmtpbmcgc2V0LCBhc3NvY2lhdGVkIHdpdGggYGVudHJ5YAoKICAgICAgICBJZiBgZW50cnlgIGlzIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB0aGUgYGAubG9jYXRpb25gYCBvZiBgZGlzdGAuCiAgICAgICAgT24gZXhpdCBmcm9tIHRoaXMgcm91dGluZSwgYGVudHJ5YCBpcyBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSB3b3JraW5nCiAgICAgICAgc2V0J3MgYGAuZW50cmllc2BgIChpZiBpdCB3YXNuJ3QgYWxyZWFkeSBwcmVzZW50KS4KCiAgICAgICAgYGRpc3RgIGlzIG9ubHkgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0IGlmIGl0J3MgZm9yIGEgcHJvamVjdCB0aGF0CiAgICAgICAgZG9lc24ndCBhbHJlYWR5IGhhdmUgYSBkaXN0cmlidXRpb24gaW4gdGhlIHNldCwgdW5sZXNzIGByZXBsYWNlPVRydWVgLgogICAgICAgIElmIGl0J3MgYWRkZWQsIGFueSBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIHRoZSBgYHN1YnNjcmliZSgpYGAgbWV0aG9kCiAgICAgICAgd2lsbCBiZSBjYWxsZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaW5zZXJ0OgogICAgICAgICAgICBkaXN0Lmluc2VydF9vbihzZWxmLmVudHJpZXMsIGVudHJ5LCByZXBsYWNlPXJlcGxhY2UpCgogICAgICAgIGlmIGVudHJ5IGlzIE5vbmU6CiAgICAgICAgICAgIGVudHJ5ID0gZGlzdC5sb2NhdGlvbgogICAgICAgIGtleXMgPSBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChlbnRyeSwgW10pCiAgICAgICAga2V5czIgPSBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChkaXN0LmxvY2F0aW9uLCBbXSkKICAgICAgICBpZiBub3QgcmVwbGFjZSBhbmQgZGlzdC5rZXkgaW4gc2VsZi5ieV9rZXk6CiAgICAgICAgICAgICMgaWdub3JlIGhpZGRlbiBkaXN0cm9zCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLmJ5X2tleVtkaXN0LmtleV0gPSBkaXN0CiAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIGtleXM6CiAgICAgICAgICAgIGtleXMuYXBwZW5kKGRpc3Qua2V5KQogICAgICAgIGlmIGRpc3Qua2V5IG5vdCBpbiBrZXlzMjoKICAgICAgICAgICAga2V5czIuYXBwZW5kKGRpc3Qua2V5KQogICAgICAgIHNlbGYuX2FkZGVkX25ldyhkaXN0KQoKICAgIGRlZiByZXNvbHZlKHNlbGYsIHJlcXVpcmVtZW50cywgZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lLAogICAgICAgICAgICAgICAgcmVwbGFjZV9jb25mbGljdGluZz1GYWxzZSwgZXh0cmFzPU5vbmUpOgogICAgICAgICIiIkxpc3QgYWxsIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHRvIChyZWN1cnNpdmVseSkgbWVldCBgcmVxdWlyZW1lbnRzYAoKICAgICAgICBgcmVxdWlyZW1lbnRzYCBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgYGBSZXF1aXJlbWVudGBgIG9iamVjdHMuICBgZW52YCwKICAgICAgICBpZiBzdXBwbGllZCwgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYCBpbnN0YW5jZS4gIElmCiAgICAgICAgbm90IHN1cHBsaWVkLCBpdCBkZWZhdWx0cyB0byBhbGwgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgd2l0aGluIGFueQogICAgICAgIGVudHJ5IG9yIGRpc3RyaWJ1dGlvbiBpbiB0aGUgd29ya2luZyBzZXQuICBgaW5zdGFsbGVyYCwgaWYgc3VwcGxpZWQsCiAgICAgICAgd2lsbCBiZSBpbnZva2VkIHdpdGggZWFjaCByZXF1aXJlbWVudCB0aGF0IGNhbm5vdCBiZSBtZXQgYnkgYW4KICAgICAgICBhbHJlYWR5LWluc3RhbGxlZCBkaXN0cmlidXRpb247IGl0IHNob3VsZCByZXR1cm4gYSBgYERpc3RyaWJ1dGlvbmBgIG9yCiAgICAgICAgYGBOb25lYGAuCgogICAgICAgIFVubGVzcyBgcmVwbGFjZV9jb25mbGljdGluZz1UcnVlYCwgcmFpc2VzIGEgVmVyc2lvbkNvbmZsaWN0IGV4Y2VwdGlvbgogICAgICAgIGlmCiAgICAgICAgYW55IHJlcXVpcmVtZW50cyBhcmUgZm91bmQgb24gdGhlIHBhdGggdGhhdCBoYXZlIHRoZSBjb3JyZWN0IG5hbWUgYnV0CiAgICAgICAgdGhlIHdyb25nIHZlcnNpb24uICBPdGhlcndpc2UsIGlmIGFuIGBpbnN0YWxsZXJgIGlzIHN1cHBsaWVkIGl0IHdpbGwgYmUKICAgICAgICBpbnZva2VkIHRvIG9idGFpbiB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIHRoZSByZXF1aXJlbWVudCBhbmQgYWN0aXZhdGUKICAgICAgICBpdC4KCiAgICAgICAgYGV4dHJhc2AgaXMgYSBsaXN0IG9mIHRoZSBleHRyYXMgdG8gYmUgdXNlZCB3aXRoIHRoZXNlIHJlcXVpcmVtZW50cy4KICAgICAgICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGV4dHJhIHJlcXVpcmVtZW50cyBtYXkgbG9vayBsaWtlIGBteV9yZXE7CiAgICAgICAgZXh0cmEgPSAibXlfZXh0cmEiYCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlIGludGVycHJldGVkIGFzIGEgcHVyZWx5CiAgICAgICAgb3B0aW9uYWwgcmVxdWlyZW1lbnQuICBJbnN0ZWFkLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gYXNzZXJ0IHRoYXQgdGhlc2UKICAgICAgICByZXF1aXJlbWVudHMgYXJlIHRydWx5IHJlcXVpcmVkLgogICAgICAgICIiIgoKICAgICAgICAjIHNldCB1cCB0aGUgc3RhY2sKICAgICAgICByZXF1aXJlbWVudHMgPSBsaXN0KHJlcXVpcmVtZW50cylbOjotMV0KICAgICAgICAjIHNldCBvZiBwcm9jZXNzZWQgcmVxdWlyZW1lbnRzCiAgICAgICAgcHJvY2Vzc2VkID0ge30KICAgICAgICAjIGtleSAtPiBkaXN0CiAgICAgICAgYmVzdCA9IHt9CiAgICAgICAgdG9fYWN0aXZhdGUgPSBbXQoKICAgICAgICByZXFfZXh0cmFzID0gX1JlcUV4dHJhcygpCgogICAgICAgICMgTWFwcGluZyBvZiByZXF1aXJlbWVudCB0byBzZXQgb2YgZGlzdHJpYnV0aW9ucyB0aGF0IHJlcXVpcmVkIGl0OwogICAgICAgICMgdXNlZnVsIGZvciByZXBvcnRpbmcgaW5mbyBhYm91dCBjb25mbGljdHMuCiAgICAgICAgcmVxdWlyZWRfYnkgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChzZXQpCgogICAgICAgIHdoaWxlIHJlcXVpcmVtZW50czoKICAgICAgICAgICAgIyBwcm9jZXNzIGRlcGVuZGVuY2llcyBicmVhZHRoLWZpcnN0CiAgICAgICAgICAgIHJlcSA9IHJlcXVpcmVtZW50cy5wb3AoMCkKICAgICAgICAgICAgaWYgcmVxIGluIHByb2Nlc3NlZDoKICAgICAgICAgICAgICAgICMgSWdub3JlIGN5Y2xpYyBvciByZWR1bmRhbnQgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYgbm90IHJlcV9leHRyYXMubWFya2Vyc19wYXNzKHJlcSwgZXh0cmFzKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBkaXN0ID0gYmVzdC5nZXQocmVxLmtleSkKICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgIyBGaW5kIHRoZSBiZXN0IGRpc3RyaWJ1dGlvbiBhbmQgYWRkIGl0IHRvIHRoZSBtYXAKICAgICAgICAgICAgICAgIGRpc3QgPSBzZWxmLmJ5X2tleS5nZXQocmVxLmtleSkKICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZSBvciAoZGlzdCBub3QgaW4gcmVxIGFuZCByZXBsYWNlX2NvbmZsaWN0aW5nKToKICAgICAgICAgICAgICAgICAgICB3cyA9IHNlbGYKICAgICAgICAgICAgICAgICAgICBpZiBlbnYgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoc2VsZi5lbnRyaWVzKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgYW4gZW1wdHkgZW52aXJvbm1lbnQgYW5kIHdvcmtpbmdzZXQgdG8gYXZvaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55IGZ1cnRoZXIgY29uZmxpY3RzIHdpdGggdGhlIGNvbmZsaWN0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRpc3RyaWJ1dGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoW10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cyA9IFdvcmtpbmdTZXQoW10pCiAgICAgICAgICAgICAgICAgICAgZGlzdCA9IGJlc3RbcmVxLmtleV0gPSBlbnYuYmVzdF9tYXRjaCgKICAgICAgICAgICAgICAgICAgICAgICAgcmVxLCB3cywgaW5zdGFsbGVyLAogICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlX2NvbmZsaWN0aW5nPXJlcGxhY2VfY29uZmxpY3RpbmcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlcnMgPSByZXF1aXJlZF9ieS5nZXQocmVxLCBOb25lKQogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0cmlidXRpb25Ob3RGb3VuZChyZXEsIHJlcXVpcmVycykKICAgICAgICAgICAgICAgIHRvX2FjdGl2YXRlLmFwcGVuZChkaXN0KQogICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiByZXE6CiAgICAgICAgICAgICAgICAjIE9vcHMsIHRoZSAiYmVzdCIgc28gZmFyIGNvbmZsaWN0cyB3aXRoIGEgZGVwZW5kZW5jeQogICAgICAgICAgICAgICAgZGVwZW5kZW50X3JlcSA9IHJlcXVpcmVkX2J5W3JlcV0KICAgICAgICAgICAgICAgIHJhaXNlIFZlcnNpb25Db25mbGljdChkaXN0LCByZXEpLndpdGhfY29udGV4dChkZXBlbmRlbnRfcmVxKQoKICAgICAgICAgICAgIyBwdXNoIHRoZSBuZXcgcmVxdWlyZW1lbnRzIG9udG8gdGhlIHN0YWNrCiAgICAgICAgICAgIG5ld19yZXF1aXJlbWVudHMgPSBkaXN0LnJlcXVpcmVzKHJlcS5leHRyYXMpWzo6LTFdCiAgICAgICAgICAgIHJlcXVpcmVtZW50cy5leHRlbmQobmV3X3JlcXVpcmVtZW50cykKCiAgICAgICAgICAgICMgUmVnaXN0ZXIgdGhlIG5ldyByZXF1aXJlbWVudHMgbmVlZGVkIGJ5IHJlcQogICAgICAgICAgICBmb3IgbmV3X3JlcXVpcmVtZW50IGluIG5ld19yZXF1aXJlbWVudHM6CiAgICAgICAgICAgICAgICByZXF1aXJlZF9ieVtuZXdfcmVxdWlyZW1lbnRdLmFkZChyZXEucHJvamVjdF9uYW1lKQogICAgICAgICAgICAgICAgcmVxX2V4dHJhc1tuZXdfcmVxdWlyZW1lbnRdID0gcmVxLmV4dHJhcwoKICAgICAgICAgICAgcHJvY2Vzc2VkW3JlcV0gPSBUcnVlCgogICAgICAgICMgcmV0dXJuIGxpc3Qgb2YgZGlzdHJvcyB0byBhY3RpdmF0ZQogICAgICAgIHJldHVybiB0b19hY3RpdmF0ZQoKICAgIGRlZiBmaW5kX3BsdWdpbnMoCiAgICAgICAgICAgIHNlbGYsIHBsdWdpbl9lbnYsIGZ1bGxfZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lLCBmYWxsYmFjaz1UcnVlKToKICAgICAgICAiIiJGaW5kIGFsbCBhY3RpdmF0YWJsZSBkaXN0cmlidXRpb25zIGluIGBwbHVnaW5fZW52YAoKICAgICAgICBFeGFtcGxlIHVzYWdlOjoKCiAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMsIGVycm9ycyA9IHdvcmtpbmdfc2V0LmZpbmRfcGx1Z2lucygKICAgICAgICAgICAgICAgIEVudmlyb25tZW50KHBsdWdpbl9kaXJsaXN0KQogICAgICAgICAgICApCiAgICAgICAgICAgICMgYWRkIHBsdWdpbnMrbGlicyB0byBzeXMucGF0aAogICAgICAgICAgICBtYXAod29ya2luZ19zZXQuYWRkLCBkaXN0cmlidXRpb25zKQogICAgICAgICAgICAjIGRpc3BsYXkgZXJyb3JzCiAgICAgICAgICAgIHByaW50KCdDb3VsZCBub3QgbG9hZCcsIGVycm9ycykKCiAgICAgICAgVGhlIGBwbHVnaW5fZW52YCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgIGluc3RhbmNlIHRoYXQgY29udGFpbnMKICAgICAgICBvbmx5IGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUgaW4gdGhlIHByb2plY3QncyAicGx1Z2luIGRpcmVjdG9yeSIgb3IKICAgICAgICBkaXJlY3Rvcmllcy4gVGhlIGBmdWxsX2VudmAsIGlmIHN1cHBsaWVkLCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgCiAgICAgICAgY29udGFpbnMgYWxsIGN1cnJlbnRseS1hdmFpbGFibGUgZGlzdHJpYnV0aW9ucy4gIElmIGBmdWxsX2VudmAgaXMgbm90CiAgICAgICAgc3VwcGxpZWQsIG9uZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgYGBXb3JraW5nU2V0YGAgdGhpcwogICAgICAgIG1ldGhvZCBpcyBjYWxsZWQgb24sIHdoaWNoIHdpbGwgdHlwaWNhbGx5IG1lYW4gdGhhdCBldmVyeSBkaXJlY3Rvcnkgb24KICAgICAgICBgYHN5cy5wYXRoYGAgd2lsbCBiZSBzY2FubmVkIGZvciBkaXN0cmlidXRpb25zLgoKICAgICAgICBgaW5zdGFsbGVyYCBpcyBhIHN0YW5kYXJkIGluc3RhbGxlciBjYWxsYmFjayBhcyB1c2VkIGJ5IHRoZQogICAgICAgIGBgcmVzb2x2ZSgpYGAgbWV0aG9kLiBUaGUgYGZhbGxiYWNrYCBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZAogICAgICAgIGF0dGVtcHQgdG8gcmVzb2x2ZSBvbGRlciB2ZXJzaW9ucyBvZiBhIHBsdWdpbiBpZiB0aGUgbmV3ZXN0IHZlcnNpb24KICAgICAgICBjYW5ub3QgYmUgcmVzb2x2ZWQuCgogICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSAyLXR1cGxlOiAoYGRpc3RyaWJ1dGlvbnNgLCBgZXJyb3JfaW5mb2ApLCB3aGVyZQogICAgICAgIGBkaXN0cmlidXRpb25zYCBpcyBhIGxpc3Qgb2YgdGhlIGRpc3RyaWJ1dGlvbnMgZm91bmQgaW4gYHBsdWdpbl9lbnZgCiAgICAgICAgdGhhdCB3ZXJlIGxvYWRhYmxlLCBhbG9uZyB3aXRoIGFueSBvdGhlciBkaXN0cmlidXRpb25zIHRoYXQgYXJlIG5lZWRlZAogICAgICAgIHRvIHJlc29sdmUgdGhlaXIgZGVwZW5kZW5jaWVzLiAgYGVycm9yX2luZm9gIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nCiAgICAgICAgdW5sb2FkYWJsZSBwbHVnaW4gZGlzdHJpYnV0aW9ucyB0byBhbiBleGNlcHRpb24gaW5zdGFuY2UgZGVzY3JpYmluZyB0aGUKICAgICAgICBlcnJvciB0aGF0IG9jY3VycmVkLiBVc3VhbGx5IHRoaXMgd2lsbCBiZSBhIGBgRGlzdHJpYnV0aW9uTm90Rm91bmRgYCBvcgogICAgICAgIGBgVmVyc2lvbkNvbmZsaWN0YGAgaW5zdGFuY2UuCiAgICAgICAgIiIiCgogICAgICAgIHBsdWdpbl9wcm9qZWN0cyA9IGxpc3QocGx1Z2luX2VudikKICAgICAgICAjIHNjYW4gcHJvamVjdCBuYW1lcyBpbiBhbHBoYWJldGljIG9yZGVyCiAgICAgICAgcGx1Z2luX3Byb2plY3RzLnNvcnQoKQoKICAgICAgICBlcnJvcl9pbmZvID0ge30KICAgICAgICBkaXN0cmlidXRpb25zID0ge30KCiAgICAgICAgaWYgZnVsbF9lbnYgaXMgTm9uZToKICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoc2VsZi5lbnRyaWVzKQogICAgICAgICAgICBlbnYgKz0gcGx1Z2luX2VudgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGVudiA9IGZ1bGxfZW52ICsgcGx1Z2luX2VudgoKICAgICAgICBzaGFkb3dfc2V0ID0gc2VsZi5fX2NsYXNzX18oW10pCiAgICAgICAgIyBwdXQgYWxsIG91ciBlbnRyaWVzIGluIHNoYWRvd19zZXQKICAgICAgICBsaXN0KG1hcChzaGFkb3dfc2V0LmFkZCwgc2VsZikpCgogICAgICAgIGZvciBwcm9qZWN0X25hbWUgaW4gcGx1Z2luX3Byb2plY3RzOgoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gcGx1Z2luX2Vudltwcm9qZWN0X25hbWVdOgoKICAgICAgICAgICAgICAgIHJlcSA9IFtkaXN0LmFzX3JlcXVpcmVtZW50KCldCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJlc29sdmVlcyA9IHNoYWRvd19zZXQucmVzb2x2ZShyZXEsIGVudiwgaW5zdGFsbGVyKQoKICAgICAgICAgICAgICAgIGV4Y2VwdCBSZXNvbHV0aW9uRXJyb3IgYXMgdjoKICAgICAgICAgICAgICAgICAgICAjIHNhdmUgZXJyb3IgaW5mbwogICAgICAgICAgICAgICAgICAgIGVycm9yX2luZm9bZGlzdF0gPSB2CiAgICAgICAgICAgICAgICAgICAgaWYgZmFsbGJhY2s6CiAgICAgICAgICAgICAgICAgICAgICAgICMgdHJ5IHRoZSBuZXh0IG9sZGVyIHZlcnNpb24gb2YgcHJvamVjdAogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2l2ZSB1cCBvbiB0aGlzIHByb2plY3QsIGtlZXAgZ29pbmcKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxpc3QobWFwKHNoYWRvd19zZXQuYWRkLCByZXNvbHZlZXMpKQogICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMudXBkYXRlKGRpY3QuZnJvbWtleXMocmVzb2x2ZWVzKSkKCiAgICAgICAgICAgICAgICAgICAgIyBzdWNjZXNzLCBubyBuZWVkIHRvIHRyeSBhbnkgbW9yZSB2ZXJzaW9ucyBvZiB0aGlzIHByb2plY3QKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBkaXN0cmlidXRpb25zID0gbGlzdChkaXN0cmlidXRpb25zKQogICAgICAgIGRpc3RyaWJ1dGlvbnMuc29ydCgpCgogICAgICAgIHJldHVybiBkaXN0cmlidXRpb25zLCBlcnJvcl9pbmZvCgogICAgZGVmIHJlcXVpcmUoc2VsZiwgKnJlcXVpcmVtZW50cyk6CiAgICAgICAgIiIiRW5zdXJlIHRoYXQgZGlzdHJpYnV0aW9ucyBtYXRjaGluZyBgcmVxdWlyZW1lbnRzYCBhcmUgYWN0aXZhdGVkCgogICAgICAgIGByZXF1aXJlbWVudHNgIG11c3QgYmUgYSBzdHJpbmcgb3IgYSAocG9zc2libHktbmVzdGVkKSBzZXF1ZW5jZQogICAgICAgIHRoZXJlb2YsIHNwZWNpZnlpbmcgdGhlIGRpc3RyaWJ1dGlvbnMgYW5kIHZlcnNpb25zIHJlcXVpcmVkLiAgVGhlCiAgICAgICAgcmV0dXJuIHZhbHVlIGlzIGEgc2VxdWVuY2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbnMgdGhhdCBuZWVkZWQgdG8gYmUKICAgICAgICBhY3RpdmF0ZWQgdG8gZnVsZmlsbCB0aGUgcmVxdWlyZW1lbnRzOyBhbGwgcmVsZXZhbnQgZGlzdHJpYnV0aW9ucyBhcmUKICAgICAgICBpbmNsdWRlZCwgZXZlbiBpZiB0aGV5IHdlcmUgYWxyZWFkeSBhY3RpdmF0ZWQgaW4gdGhpcyB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICBuZWVkZWQgPSBzZWxmLnJlc29sdmUocGFyc2VfcmVxdWlyZW1lbnRzKHJlcXVpcmVtZW50cykpCgogICAgICAgIGZvciBkaXN0IGluIG5lZWRlZDoKICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKCiAgICAgICAgcmV0dXJuIG5lZWRlZAoKICAgIGRlZiBzdWJzY3JpYmUoc2VsZiwgY2FsbGJhY2ssIGV4aXN0aW5nPVRydWUpOgogICAgICAgICIiIkludm9rZSBgY2FsbGJhY2tgIGZvciBhbGwgZGlzdHJpYnV0aW9ucwoKICAgICAgICBJZiBgZXhpc3Rpbmc9VHJ1ZWAgKGRlZmF1bHQpLAogICAgICAgIGNhbGwgb24gYWxsIGV4aXN0aW5nIG9uZXMsIGFzIHdlbGwuCiAgICAgICAgIiIiCiAgICAgICAgaWYgY2FsbGJhY2sgaW4gc2VsZi5jYWxsYmFja3M6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuY2FsbGJhY2tzLmFwcGVuZChjYWxsYmFjaykKICAgICAgICBpZiBub3QgZXhpc3Rpbmc6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGZvciBkaXN0IGluIHNlbGY6CiAgICAgICAgICAgIGNhbGxiYWNrKGRpc3QpCgogICAgZGVmIF9hZGRlZF9uZXcoc2VsZiwgZGlzdCk6CiAgICAgICAgZm9yIGNhbGxiYWNrIGluIHNlbGYuY2FsbGJhY2tzOgogICAgICAgICAgICBjYWxsYmFjayhkaXN0KQoKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5lbnRyaWVzWzpdLCBzZWxmLmVudHJ5X2tleXMuY29weSgpLCBzZWxmLmJ5X2tleS5jb3B5KCksCiAgICAgICAgICAgIHNlbGYuY2FsbGJhY2tzWzpdCiAgICAgICAgKQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgZV9rX2JfYyk6CiAgICAgICAgZW50cmllcywga2V5cywgYnlfa2V5LCBjYWxsYmFja3MgPSBlX2tfYl9jCiAgICAgICAgc2VsZi5lbnRyaWVzID0gZW50cmllc1s6XQogICAgICAgIHNlbGYuZW50cnlfa2V5cyA9IGtleXMuY29weSgpCiAgICAgICAgc2VsZi5ieV9rZXkgPSBieV9rZXkuY29weSgpCiAgICAgICAgc2VsZi5jYWxsYmFja3MgPSBjYWxsYmFja3NbOl0KCgpjbGFzcyBfUmVxRXh0cmFzKGRpY3QpOgogICAgIiIiCiAgICBNYXAgZWFjaCByZXF1aXJlbWVudCB0byB0aGUgZXh0cmFzIHRoYXQgZGVtYW5kZWQgaXQuCiAgICAiIiIKCiAgICBkZWYgbWFya2Vyc19wYXNzKHNlbGYsIHJlcSwgZXh0cmFzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEV2YWx1YXRlIG1hcmtlcnMgZm9yIHJlcSBhZ2FpbnN0IGVhY2ggZXh0cmEgdGhhdAogICAgICAgIGRlbWFuZGVkIGl0LgoKICAgICAgICBSZXR1cm4gRmFsc2UgaWYgdGhlIHJlcSBoYXMgYSBtYXJrZXIgYW5kIGZhaWxzCiAgICAgICAgZXZhbHVhdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm4gVHJ1ZS4KICAgICAgICAiIiIKICAgICAgICBleHRyYV9ldmFscyA9ICgKICAgICAgICAgICAgcmVxLm1hcmtlci5ldmFsdWF0ZSh7J2V4dHJhJzogZXh0cmF9KQogICAgICAgICAgICBmb3IgZXh0cmEgaW4gc2VsZi5nZXQocmVxLCAoKSkgKyAoZXh0cmFzIG9yIChOb25lLCkpCiAgICAgICAgKQogICAgICAgIHJldHVybiBub3QgcmVxLm1hcmtlciBvciBhbnkoZXh0cmFfZXZhbHMpCgoKY2xhc3MgRW52aXJvbm1lbnQob2JqZWN0KToKICAgICIiIlNlYXJjaGFibGUgc25hcHNob3Qgb2YgZGlzdHJpYnV0aW9ucyBvbiBhIHNlYXJjaCBwYXRoIiIiCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLCBzZWFyY2hfcGF0aD1Ob25lLCBwbGF0Zm9ybT1nZXRfc3VwcG9ydGVkX3BsYXRmb3JtKCksCiAgICAgICAgICAgIHB5dGhvbj1QWV9NQUpPUik6CiAgICAgICAgIiIiU25hcHNob3QgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgb24gYSBzZWFyY2ggcGF0aAoKICAgICAgICBBbnkgZGlzdHJpYnV0aW9ucyBmb3VuZCBvbiBgc2VhcmNoX3BhdGhgIGFyZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQuCiAgICAgICAgYHNlYXJjaF9wYXRoYCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvZiBgYHN5cy5wYXRoYGAgaXRlbXMuICBJZiBub3QKICAgICAgICBzdXBwbGllZCwgYGBzeXMucGF0aGBgIGlzIHVzZWQuCgogICAgICAgIGBwbGF0Zm9ybWAgaXMgYW4gb3B0aW9uYWwgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIHBsYXRmb3JtCiAgICAgICAgdGhhdCBwbGF0Zm9ybS1zcGVjaWZpYyBkaXN0cmlidXRpb25zIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoLiAgSWYKICAgICAgICB1bnNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBgcHl0aG9uYCBpcyBhbgogICAgICAgIG9wdGlvbmFsIHN0cmluZyBuYW1pbmcgdGhlIGRlc2lyZWQgdmVyc2lvbiBvZiBQeXRob24gKGUuZy4gYGAnMy4zJ2BgKTsKICAgICAgICBpdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB2ZXJzaW9uLgoKICAgICAgICBZb3UgbWF5IGV4cGxpY2l0bHkgc2V0IGBwbGF0Zm9ybWAgKGFuZC9vciBgcHl0aG9uYCkgdG8gYGBOb25lYGAgaWYgeW91CiAgICAgICAgd2lzaCB0byBtYXAgKmFsbCogZGlzdHJpYnV0aW9ucywgbm90IGp1c3QgdGhvc2UgY29tcGF0aWJsZSB3aXRoIHRoZQogICAgICAgIHJ1bm5pbmcgcGxhdGZvcm0gb3IgUHl0aG9uIHZlcnNpb24uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fZGlzdG1hcCA9IHt9CiAgICAgICAgc2VsZi5wbGF0Zm9ybSA9IHBsYXRmb3JtCiAgICAgICAgc2VsZi5weXRob24gPSBweXRob24KICAgICAgICBzZWxmLnNjYW4oc2VhcmNoX3BhdGgpCgogICAgZGVmIGNhbl9hZGQoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiSXMgZGlzdHJpYnV0aW9uIGBkaXN0YCBhY2NlcHRhYmxlIGZvciB0aGlzIGVudmlyb25tZW50PwoKICAgICAgICBUaGUgZGlzdHJpYnV0aW9uIG11c3QgbWF0Y2ggdGhlIHBsYXRmb3JtIGFuZCBweXRob24gdmVyc2lvbgogICAgICAgIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgd2hlbiB0aGlzIGVudmlyb25tZW50IHdhcyBjcmVhdGVkLCBvciBGYWxzZQogICAgICAgIGlzIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5weXRob24gaXMgTm9uZSBvciBkaXN0LnB5X3ZlcnNpb24gaXMgTm9uZQogICAgICAgICAgICBvciBkaXN0LnB5X3ZlcnNpb24gPT0gc2VsZi5weXRob24pIFwKICAgICAgICAgICAgYW5kIGNvbXBhdGlibGVfcGxhdGZvcm1zKGRpc3QucGxhdGZvcm0sIHNlbGYucGxhdGZvcm0pCgogICAgZGVmIHJlbW92ZShzZWxmLCBkaXN0KToKICAgICAgICAiIiJSZW1vdmUgYGRpc3RgIGZyb20gdGhlIGVudmlyb25tZW50IiIiCiAgICAgICAgc2VsZi5fZGlzdG1hcFtkaXN0LmtleV0ucmVtb3ZlKGRpc3QpCgogICAgZGVmIHNjYW4oc2VsZiwgc2VhcmNoX3BhdGg9Tm9uZSk6CiAgICAgICAgIiIiU2NhbiBgc2VhcmNoX3BhdGhgIGZvciBkaXN0cmlidXRpb25zIHVzYWJsZSBpbiB0aGlzIGVudmlyb25tZW50CgogICAgICAgIEFueSBkaXN0cmlidXRpb25zIGZvdW5kIGFyZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQuCiAgICAgICAgYHNlYXJjaF9wYXRoYCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvZiBgYHN5cy5wYXRoYGAgaXRlbXMuICBJZiBub3QKICAgICAgICBzdXBwbGllZCwgYGBzeXMucGF0aGBgIGlzIHVzZWQuICBPbmx5IGRpc3RyaWJ1dGlvbnMgY29uZm9ybWluZyB0bwogICAgICAgIHRoZSBwbGF0Zm9ybS9weXRob24gdmVyc2lvbiBkZWZpbmVkIGF0IGluaXRpYWxpemF0aW9uIGFyZSBhZGRlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWFyY2hfcGF0aCBpcyBOb25lOgogICAgICAgICAgICBzZWFyY2hfcGF0aCA9IHN5cy5wYXRoCgogICAgICAgIGZvciBpdGVtIGluIHNlYXJjaF9wYXRoOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMoaXRlbSk6CiAgICAgICAgICAgICAgICBzZWxmLmFkZChkaXN0KQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBwcm9qZWN0X25hbWUpOgogICAgICAgICIiIlJldHVybiBhIG5ld2VzdC10by1vbGRlc3QgbGlzdCBvZiBkaXN0cmlidXRpb25zIGZvciBgcHJvamVjdF9uYW1lYAoKICAgICAgICBVc2VzIGNhc2UtaW5zZW5zaXRpdmUgYHByb2plY3RfbmFtZWAgY29tcGFyaXNvbiwgYXNzdW1pbmcgYWxsIHRoZQogICAgICAgIHByb2plY3QncyBkaXN0cmlidXRpb25zIHVzZSB0aGVpciBwcm9qZWN0J3MgbmFtZSBjb252ZXJ0ZWQgdG8gYWxsCiAgICAgICAgbG93ZXJjYXNlIGFzIHRoZWlyIGtleS4KCiAgICAgICAgIiIiCiAgICAgICAgZGlzdHJpYnV0aW9uX2tleSA9IHByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgcmV0dXJuIHNlbGYuX2Rpc3RtYXAuZ2V0KGRpc3RyaWJ1dGlvbl9rZXksIFtdKQoKICAgIGRlZiBhZGQoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiQWRkIGBkaXN0YCBpZiB3ZSBgYGNhbl9hZGQoKWBgIGl0IGFuZCBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhZGRlZAogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2FuX2FkZChkaXN0KSBhbmQgZGlzdC5oYXNfdmVyc2lvbigpOgogICAgICAgICAgICBkaXN0cyA9IHNlbGYuX2Rpc3RtYXAuc2V0ZGVmYXVsdChkaXN0LmtleSwgW10pCiAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIGRpc3RzOgogICAgICAgICAgICAgICAgZGlzdHMuYXBwZW5kKGRpc3QpCiAgICAgICAgICAgICAgICBkaXN0cy5zb3J0KGtleT1vcGVyYXRvci5hdHRyZ2V0dGVyKCdoYXNoY21wJyksIHJldmVyc2U9VHJ1ZSkKCiAgICBkZWYgYmVzdF9tYXRjaCgKICAgICAgICAgICAgc2VsZiwgcmVxLCB3b3JraW5nX3NldCwgaW5zdGFsbGVyPU5vbmUsIHJlcGxhY2VfY29uZmxpY3Rpbmc9RmFsc2UpOgogICAgICAgICIiIkZpbmQgZGlzdHJpYnV0aW9uIGJlc3QgbWF0Y2hpbmcgYHJlcWAgYW5kIHVzYWJsZSBvbiBgd29ya2luZ19zZXRgCgogICAgICAgIFRoaXMgY2FsbHMgdGhlIGBgZmluZChyZXEpYGAgbWV0aG9kIG9mIHRoZSBgd29ya2luZ19zZXRgIHRvIHNlZSBpZiBhCiAgICAgICAgc3VpdGFibGUgZGlzdHJpYnV0aW9uIGlzIGFscmVhZHkgYWN0aXZlLiAgKFRoaXMgbWF5IHJhaXNlCiAgICAgICAgYGBWZXJzaW9uQ29uZmxpY3RgYCBpZiBhbiB1bnN1aXRhYmxlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgaXMgYWxyZWFkeQogICAgICAgIGFjdGl2ZSBpbiB0aGUgc3BlY2lmaWVkIGB3b3JraW5nX3NldGAuKSAgSWYgYSBzdWl0YWJsZSBkaXN0cmlidXRpb24KICAgICAgICBpc24ndCBhY3RpdmUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5ld2VzdCBkaXN0cmlidXRpb24gaW4gdGhlCiAgICAgICAgZW52aXJvbm1lbnQgdGhhdCBtZWV0cyB0aGUgYGBSZXF1aXJlbWVudGBgIGluIGByZXFgLiAgSWYgbm8gc3VpdGFibGUKICAgICAgICBkaXN0cmlidXRpb24gaXMgZm91bmQsIGFuZCBgaW5zdGFsbGVyYCBpcyBzdXBwbGllZCwgdGhlbiB0aGUgcmVzdWx0IG9mCiAgICAgICAgY2FsbGluZyB0aGUgZW52aXJvbm1lbnQncyBgYG9idGFpbihyZXEsIGluc3RhbGxlcilgYCBtZXRob2Qgd2lsbCBiZQogICAgICAgIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgZGlzdCA9IHdvcmtpbmdfc2V0LmZpbmQocmVxKQogICAgICAgIGV4Y2VwdCBWZXJzaW9uQ29uZmxpY3Q6CiAgICAgICAgICAgIGlmIG5vdCByZXBsYWNlX2NvbmZsaWN0aW5nOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZGlzdCA9IE5vbmUKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxLmtleV06CiAgICAgICAgICAgIGlmIGRpc3QgaW4gcmVxOgogICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICAjIHRyeSB0byBkb3dubG9hZC9pbnN0YWxsCiAgICAgICAgcmV0dXJuIHNlbGYub2J0YWluKHJlcSwgaW5zdGFsbGVyKQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgcmVxdWlyZW1lbnQsIGluc3RhbGxlcj1Ob25lKToKICAgICAgICAiIiJPYnRhaW4gYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgYHJlcXVpcmVtZW50YCAoZS5nLiB2aWEgZG93bmxvYWQpCgogICAgICAgIE9idGFpbiBhIGRpc3RybyB0aGF0IG1hdGNoZXMgcmVxdWlyZW1lbnQgKGUuZy4gdmlhIGRvd25sb2FkKS4gIEluIHRoZQogICAgICAgIGJhc2UgYGBFbnZpcm9ubWVudGBgIGNsYXNzLCB0aGlzIHJvdXRpbmUganVzdCByZXR1cm5zCiAgICAgICAgYGBpbnN0YWxsZXIocmVxdWlyZW1lbnQpYGAsIHVubGVzcyBgaW5zdGFsbGVyYCBpcyBOb25lLCBpbiB3aGljaCBjYXNlCiAgICAgICAgTm9uZSBpcyByZXR1cm5lZCBpbnN0ZWFkLiAgVGhpcyBtZXRob2QgaXMgYSBob29rIHRoYXQgYWxsb3dzIHN1YmNsYXNzZXMKICAgICAgICB0byBhdHRlbXB0IG90aGVyIHdheXMgb2Ygb2J0YWluaW5nIGEgZGlzdHJpYnV0aW9uIGJlZm9yZSBmYWxsaW5nIGJhY2sKICAgICAgICB0byB0aGUgYGluc3RhbGxlcmAgYXJndW1lbnQuIiIiCiAgICAgICAgaWYgaW5zdGFsbGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gaW5zdGFsbGVyKHJlcXVpcmVtZW50KQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJZaWVsZCB0aGUgdW5pcXVlIHByb2plY3QgbmFtZXMgb2YgdGhlIGF2YWlsYWJsZSBkaXN0cmlidXRpb25zIiIiCiAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9kaXN0bWFwLmtleXMoKToKICAgICAgICAgICAgaWYgc2VsZltrZXldOgogICAgICAgICAgICAgICAgeWllbGQga2V5CgogICAgZGVmIF9faWFkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJJbi1wbGFjZSBhZGRpdGlvbiBvZiBhIGRpc3RyaWJ1dGlvbiBvciBlbnZpcm9ubWVudCIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIERpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgIHNlbGYuYWRkKG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgRW52aXJvbm1lbnQpOgogICAgICAgICAgICBmb3IgcHJvamVjdCBpbiBvdGhlcjoKICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIG90aGVyW3Byb2plY3RdOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBhZGQgJXIgdG8gZW52aXJvbm1lbnQiICUgKG90aGVyLCkpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiQWRkIGFuIGVudmlyb25tZW50IG9yIGRpc3RyaWJ1dGlvbiB0byBhbiBlbnZpcm9ubWVudCIiIgogICAgICAgIG5ldyA9IHNlbGYuX19jbGFzc19fKFtdLCBwbGF0Zm9ybT1Ob25lLCBweXRob249Tm9uZSkKICAgICAgICBmb3IgZW52IGluIHNlbGYsIG90aGVyOgogICAgICAgICAgICBuZXcgKz0gZW52CiAgICAgICAgcmV0dXJuIG5ldwoKCiMgWFhYIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKQXZhaWxhYmxlRGlzdHJpYnV0aW9ucyA9IEVudmlyb25tZW50CgoKY2xhc3MgRXh0cmFjdGlvbkVycm9yKFJ1bnRpbWVFcnJvcik6CiAgICAiIiJBbiBlcnJvciBvY2N1cnJlZCBleHRyYWN0aW5nIGEgcmVzb3VyY2UKCiAgICBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSBmcm9tIGluc3RhbmNlcyBvZiB0aGlzIGV4Y2VwdGlvbjoKCiAgICBtYW5hZ2VyCiAgICAgICAgVGhlIHJlc291cmNlIG1hbmFnZXIgdGhhdCByYWlzZWQgdGhpcyBleGNlcHRpb24KCiAgICBjYWNoZV9wYXRoCiAgICAgICAgVGhlIGJhc2UgZGlyZWN0b3J5IGZvciByZXNvdXJjZSBleHRyYWN0aW9uCgogICAgb3JpZ2luYWxfZXJyb3IKICAgICAgICBUaGUgZXhjZXB0aW9uIGluc3RhbmNlIHRoYXQgY2F1c2VkIGV4dHJhY3Rpb24gdG8gZmFpbAogICAgIiIiCgoKY2xhc3MgUmVzb3VyY2VNYW5hZ2VyOgogICAgIiIiTWFuYWdlIHJlc291cmNlIGV4dHJhY3Rpb24gYW5kIHBhY2thZ2VzIiIiCiAgICBleHRyYWN0aW9uX3BhdGggPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuY2FjaGVkX2ZpbGVzID0ge30KCiAgICBkZWYgcmVzb3VyY2VfZXhpc3RzKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkRvZXMgdGhlIG5hbWVkIHJlc291cmNlIGV4aXN0PyIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuaGFzX3Jlc291cmNlKHJlc291cmNlX25hbWUpCgogICAgZGVmIHJlc291cmNlX2lzZGlyKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIklzIHRoZSBuYW1lZCByZXNvdXJjZSBhbiBleGlzdGluZyBkaXJlY3Rvcnk/IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5yZXNvdXJjZV9pc2RpcigKICAgICAgICAgICAgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgdHJ1ZSBmaWxlc3lzdGVtIHBhdGggZm9yIHNwZWNpZmllZCByZXNvdXJjZSIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9zdHJlYW0oc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgcmVhZGFibGUgZmlsZS1saWtlIG9iamVjdCBmb3Igc3BlY2lmaWVkIHJlc291cmNlIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2Vfc3RyZWFtKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9zdHJpbmcoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHNwZWNpZmllZCByZXNvdXJjZSBhcyBhIHN0cmluZyIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX3N0cmluZygKICAgICAgICAgICAgc2VsZiwgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJMaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgcmVzb3VyY2UgZGlyZWN0b3J5IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5yZXNvdXJjZV9saXN0ZGlyKAogICAgICAgICAgICByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiBleHRyYWN0aW9uX2Vycm9yKHNlbGYpOgogICAgICAgICIiIkdpdmUgYW4gZXJyb3IgbWVzc2FnZSBmb3IgcHJvYmxlbXMgZXh0cmFjdGluZyBmaWxlKHMpIiIiCgogICAgICAgIG9sZF9leGMgPSBzeXMuZXhjX2luZm8oKVsxXQogICAgICAgIGNhY2hlX3BhdGggPSBzZWxmLmV4dHJhY3Rpb25fcGF0aCBvciBnZXRfZGVmYXVsdF9jYWNoZSgpCgogICAgICAgIHRtcGwgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgICAgIENhbid0IGV4dHJhY3QgZmlsZShzKSB0byBlZ2cgY2FjaGUKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGV4dHJhY3QgZmlsZShzKQogICAgICAgICAgICB0byB0aGUgUHl0aG9uIGVnZyBjYWNoZToKCiAgICAgICAgICAgICAge29sZF9leGN9CgogICAgICAgICAgICBUaGUgUHl0aG9uIGVnZyBjYWNoZSBkaXJlY3RvcnkgaXMgY3VycmVudGx5IHNldCB0bzoKCiAgICAgICAgICAgICAge2NhY2hlX3BhdGh9CgogICAgICAgICAgICBQZXJoYXBzIHlvdXIgYWNjb3VudCBkb2VzIG5vdCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGRpcmVjdG9yeT8KICAgICAgICAgICAgWW91IGNhbiBjaGFuZ2UgdGhlIGNhY2hlIGRpcmVjdG9yeSBieSBzZXR0aW5nIHRoZSBQWVRIT05fRUdHX0NBQ0hFCiAgICAgICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHBvaW50IHRvIGFuIGFjY2Vzc2libGUgZGlyZWN0b3J5LgogICAgICAgICAgICAiIiIpLmxzdHJpcCgpCiAgICAgICAgZXJyID0gRXh0cmFjdGlvbkVycm9yKHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpKQogICAgICAgIGVyci5tYW5hZ2VyID0gc2VsZgogICAgICAgIGVyci5jYWNoZV9wYXRoID0gY2FjaGVfcGF0aAogICAgICAgIGVyci5vcmlnaW5hbF9lcnJvciA9IG9sZF9leGMKICAgICAgICByYWlzZSBlcnIKCiAgICBkZWYgZ2V0X2NhY2hlX3BhdGgoc2VsZiwgYXJjaGl2ZV9uYW1lLCBuYW1lcz0oKSk6CiAgICAgICAgIiIiUmV0dXJuIGFic29sdXRlIGxvY2F0aW9uIGluIGNhY2hlIGZvciBgYXJjaGl2ZV9uYW1lYCBhbmQgYG5hbWVzYAoKICAgICAgICBUaGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgcmVzdWx0aW5nIHBhdGggd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXMKICAgICAgICBub3QgYWxyZWFkeSBleGlzdC4gIGBhcmNoaXZlX25hbWVgIHNob3VsZCBiZSB0aGUgYmFzZSBmaWxlbmFtZSBvZiB0aGUKICAgICAgICBlbmNsb3NpbmcgZWdnICh3aGljaCBtYXkgbm90IGJlIHRoZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgemlwZmlsZSEpLAogICAgICAgIGluY2x1ZGluZyBpdHMgIi5lZ2ciIGV4dGVuc2lvbi4gIGBuYW1lc2AsIGlmIHByb3ZpZGVkLCBzaG91bGQgYmUgYQogICAgICAgIHNlcXVlbmNlIG9mIHBhdGggbmFtZSBwYXJ0cyAidW5kZXIiIHRoZSBlZ2cncyBleHRyYWN0aW9uIGxvY2F0aW9uLgoKICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgcmVzb3VyY2UgcHJvdmlkZXJzIHRoYXQgbmVlZCB0bwogICAgICAgIG9idGFpbiBhbiBleHRyYWN0aW9uIGxvY2F0aW9uLCBhbmQgb25seSBmb3IgbmFtZXMgdGhleSBpbnRlbmQgdG8KICAgICAgICBleHRyYWN0LCBhcyBpdCB0cmFja3MgdGhlIGdlbmVyYXRlZCBuYW1lcyBmb3IgcG9zc2libGUgY2xlYW51cCBsYXRlci4KICAgICAgICAiIiIKICAgICAgICBleHRyYWN0X3BhdGggPSBzZWxmLmV4dHJhY3Rpb25fcGF0aCBvciBnZXRfZGVmYXVsdF9jYWNoZSgpCiAgICAgICAgdGFyZ2V0X3BhdGggPSBvcy5wYXRoLmpvaW4oZXh0cmFjdF9wYXRoLCBhcmNoaXZlX25hbWUgKyAnLXRtcCcsICpuYW1lcykKICAgICAgICB0cnk6CiAgICAgICAgICAgIF9ieXBhc3NfZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXRfcGF0aCkKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHNlbGYuZXh0cmFjdGlvbl9lcnJvcigpCgogICAgICAgIHNlbGYuX3dhcm5fdW5zYWZlX2V4dHJhY3Rpb25fcGF0aChleHRyYWN0X3BhdGgpCgogICAgICAgIHNlbGYuY2FjaGVkX2ZpbGVzW3RhcmdldF9wYXRoXSA9IDEKICAgICAgICByZXR1cm4gdGFyZ2V0X3BhdGgKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3dhcm5fdW5zYWZlX2V4dHJhY3Rpb25fcGF0aChwYXRoKToKICAgICAgICAiIiIKICAgICAgICBJZiB0aGUgZGVmYXVsdCBleHRyYWN0aW9uIHBhdGggaXMgb3ZlcnJpZGRlbiBhbmQgc2V0IHRvIGFuIGluc2VjdXJlCiAgICAgICAgbG9jYXRpb24sIHN1Y2ggYXMgL3RtcCwgaXQgb3BlbnMgdXAgYW4gb3Bwb3J0dW5pdHkgZm9yIGFuIGF0dGFja2VyIHRvCiAgICAgICAgcmVwbGFjZSBhbiBleHRyYWN0ZWQgZmlsZSB3aXRoIGFuIHVuYXV0aG9yaXplZCBwYXlsb2FkLiBXYXJuIHRoZSB1c2VyCiAgICAgICAgaWYgYSBrbm93biBpbnNlY3VyZSBsb2NhdGlvbiBpcyB1c2VkLgoKICAgICAgICBTZWUgRGlzdHJpYnV0ZSAjMzc1IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnIGFuZCBub3QgcGF0aC5zdGFydHN3aXRoKG9zLmVudmlyb25bJ3dpbmRpciddKToKICAgICAgICAgICAgIyBPbiBXaW5kb3dzLCBwZXJtaXNzaW9ucyBhcmUgZ2VuZXJhbGx5IHJlc3RyaWN0aXZlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgIyAgYW5kIHRlbXAgZGlyZWN0b3JpZXMgYXJlIG5vdCB3cml0YWJsZSBieSBvdGhlciB1c2Vycywgc28KICAgICAgICAgICAgIyAgYnlwYXNzIHRoZSB3YXJuaW5nLgogICAgICAgICAgICByZXR1cm4KICAgICAgICBtb2RlID0gb3Muc3RhdChwYXRoKS5zdF9tb2RlCiAgICAgICAgaWYgbW9kZSAmIHN0YXQuU19JV09USCBvciBtb2RlICYgc3RhdC5TX0lXR1JQOgogICAgICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICAgICAiJXMgaXMgd3JpdGFibGUgYnkgZ3JvdXAvb3RoZXJzIGFuZCB2dWxuZXJhYmxlIHRvIGF0dGFjayAiCiAgICAgICAgICAgICAgICAid2hlbiAiCiAgICAgICAgICAgICAgICAidXNlZCB3aXRoIGdldF9yZXNvdXJjZV9maWxlbmFtZS4gQ29uc2lkZXIgYSBtb3JlIHNlY3VyZSAiCiAgICAgICAgICAgICAgICAibG9jYXRpb24gKHNldCB3aXRoIC5zZXRfZXh0cmFjdGlvbl9wYXRoIG9yIHRoZSAiCiAgICAgICAgICAgICAgICAiUFlUSE9OX0VHR19DQUNIRSBlbnZpcm9ubWVudCB2YXJpYWJsZSkuIiAlIHBhdGgKICAgICAgICAgICAgKQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZywgVXNlcldhcm5pbmcpCgogICAgZGVmIHBvc3Rwcm9jZXNzKHNlbGYsIHRlbXBuYW1lLCBmaWxlbmFtZSk6CiAgICAgICAgIiIiUGVyZm9ybSBhbnkgcGxhdGZvcm0tc3BlY2lmaWMgcG9zdHByb2Nlc3Npbmcgb2YgYHRlbXBuYW1lYAoKICAgICAgICBUaGlzIGlzIHdoZXJlIE1hYyBoZWFkZXIgcmV3cml0ZXMgc2hvdWxkIGJlIGRvbmU7IG90aGVyIHBsYXRmb3JtcyBkb24ndAogICAgICAgIGhhdmUgYW55dGhpbmcgc3BlY2lhbCB0aGV5IHNob3VsZCBkby4KCiAgICAgICAgUmVzb3VyY2UgcHJvdmlkZXJzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIE9OTFkgYWZ0ZXIgc3VjY2Vzc2Z1bGx5CiAgICAgICAgZXh0cmFjdGluZyBhIGNvbXByZXNzZWQgcmVzb3VyY2UuICBUaGV5IG11c3QgTk9UIGNhbGwgaXQgb24gcmVzb3VyY2VzCiAgICAgICAgdGhhdCBhcmUgYWxyZWFkeSBpbiB0aGUgZmlsZXN5c3RlbS4KCiAgICAgICAgYHRlbXBuYW1lYCBpcyB0aGUgY3VycmVudCAodGVtcG9yYXJ5KSBuYW1lIG9mIHRoZSBmaWxlLCBhbmQgYGZpbGVuYW1lYAogICAgICAgIGlzIHRoZSBuYW1lIGl0IHdpbGwgYmUgcmVuYW1lZCB0byBieSB0aGUgY2FsbGVyIGFmdGVyIHRoaXMgcm91dGluZQogICAgICAgIHJldHVybnMuCiAgICAgICAgIiIiCgogICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKICAgICAgICAgICAgIyBNYWtlIHRoZSByZXNvdXJjZSBleGVjdXRhYmxlCiAgICAgICAgICAgIG1vZGUgPSAoKG9zLnN0YXQodGVtcG5hbWUpLnN0X21vZGUpIHwgMG81NTUpICYgMG83Nzc3CiAgICAgICAgICAgIG9zLmNobW9kKHRlbXBuYW1lLCBtb2RlKQoKICAgIGRlZiBzZXRfZXh0cmFjdGlvbl9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgICIiIlNldCB0aGUgYmFzZSBwYXRoIHdoZXJlIHJlc291cmNlcyB3aWxsIGJlIGV4dHJhY3RlZCB0bywgaWYgbmVlZGVkLgoKICAgICAgICBJZiB5b3UgZG8gbm90IGNhbGwgdGhpcyByb3V0aW5lIGJlZm9yZSBhbnkgZXh0cmFjdGlvbnMgdGFrZSBwbGFjZSwgdGhlCiAgICAgICAgcGF0aCBkZWZhdWx0cyB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIGBgZ2V0X2RlZmF1bHRfY2FjaGUoKWBgLiAgKFdoaWNoCiAgICAgICAgaXMgYmFzZWQgb24gdGhlIGBgUFlUSE9OX0VHR19DQUNIRWBgIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aXRoIHZhcmlvdXMKICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBmYWxsYmFja3MuICBTZWUgdGhhdCByb3V0aW5lJ3MgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQogICAgICAgIGRldGFpbHMuKQoKICAgICAgICBSZXNvdXJjZXMgYXJlIGV4dHJhY3RlZCB0byBzdWJkaXJlY3RvcmllcyBvZiB0aGlzIHBhdGggYmFzZWQgdXBvbgogICAgICAgIGluZm9ybWF0aW9uIGdpdmVuIGJ5IHRoZSBgYElSZXNvdXJjZVByb3ZpZGVyYGAuICBZb3UgbWF5IHNldCB0aGlzIHRvIGEKICAgICAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBidXQgdGhlbiB5b3UgbXVzdCBjYWxsIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgIHRvCiAgICAgICAgZGVsZXRlIHRoZSBleHRyYWN0ZWQgZmlsZXMgd2hlbiBkb25lLiAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQKICAgICAgICBgYGNsZWFudXBfcmVzb3VyY2VzKClgYCB3aWxsIGJlIGFibGUgdG8gcmVtb3ZlIGFsbCBleHRyYWN0ZWQgZmlsZXMuCgogICAgICAgIChOb3RlOiB5b3UgbWF5IG5vdCBjaGFuZ2UgdGhlIGV4dHJhY3Rpb24gcGF0aCBmb3IgYSBnaXZlbiByZXNvdXJjZQogICAgICAgIG1hbmFnZXIgb25jZSByZXNvdXJjZXMgaGF2ZSBiZWVuIGV4dHJhY3RlZCwgdW5sZXNzIHlvdSBmaXJzdCBjYWxsCiAgICAgICAgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAuKQogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2FjaGVkX2ZpbGVzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IGNoYW5nZSBleHRyYWN0aW9uIHBhdGgsIGZpbGVzIGFscmVhZHkgZXh0cmFjdGVkIgogICAgICAgICAgICApCgogICAgICAgIHNlbGYuZXh0cmFjdGlvbl9wYXRoID0gcGF0aAoKICAgIGRlZiBjbGVhbnVwX3Jlc291cmNlcyhzZWxmLCBmb3JjZT1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgRGVsZXRlIGFsbCBleHRyYWN0ZWQgcmVzb3VyY2UgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLCByZXR1cm5pbmcgYSBsaXN0CiAgICAgICAgb2YgdGhlIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyB0aGF0IGNvdWxkIG5vdCBiZSBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4KICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGNvbmN1cnJlbmN5IHByb3RlY3Rpb24sIHNvIGl0IHNob3VsZAogICAgICAgIGdlbmVyYWxseSBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBleHRyYWN0aW9uIHBhdGggaXMgYSB0ZW1wb3JhcnkKICAgICAgICBkaXJlY3RvcnkgZXhjbHVzaXZlIHRvIGEgc2luZ2xlIHByb2Nlc3MuICBUaGlzIG1ldGhvZCBpcyBub3QKICAgICAgICBhdXRvbWF0aWNhbGx5IGNhbGxlZDsgeW91IG11c3QgY2FsbCBpdCBleHBsaWNpdGx5IG9yIHJlZ2lzdGVyIGl0IGFzIGFuCiAgICAgICAgYGBhdGV4aXRgYCBmdW5jdGlvbiBpZiB5b3Ugd2lzaCB0byBlbnN1cmUgY2xlYW51cCBvZiBhIHRlbXBvcmFyeQogICAgICAgIGRpcmVjdG9yeSB1c2VkIGZvciBleHRyYWN0aW9ucy4KICAgICAgICAiIiIKICAgICAgICAjIFhYWAoKCmRlZiBnZXRfZGVmYXVsdF9jYWNoZSgpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIGBgUFlUSE9OX0VHR19DQUNIRWBgIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICBvciBhIHBsYXRmb3JtLXJlbGV2YW50IHVzZXIgY2FjaGUgZGlyIGZvciBhbiBhcHAKICAgIG5hbWVkICJQeXRob24tRWdncyIuCiAgICAiIiIKICAgIHJldHVybiAoCiAgICAgICAgb3MuZW52aXJvbi5nZXQoJ1BZVEhPTl9FR0dfQ0FDSEUnKQogICAgICAgIG9yIGFwcGRpcnMudXNlcl9jYWNoZV9kaXIoYXBwbmFtZT0nUHl0aG9uLUVnZ3MnKQogICAgKQoKCmRlZiBzYWZlX25hbWUobmFtZSk6CiAgICAiIiJDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCBkaXN0cmlidXRpb24gbmFtZQoKICAgIEFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMvLiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICctJy4KICAgICIiIgogICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIG5hbWUpCgoKZGVmIHNhZmVfdmVyc2lvbih2ZXJzaW9uKToKICAgICIiIgogICAgQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgdmVyc2lvbiBzdHJpbmcKICAgICIiIgogICAgdHJ5OgogICAgICAgICMgbm9ybWFsaXplIHRoZSB2ZXJzaW9uCiAgICAgICAgcmV0dXJuIHN0cihwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKHZlcnNpb24pKQogICAgZXhjZXB0IHBhY2thZ2luZy52ZXJzaW9uLkludmFsaWRWZXJzaW9uOgogICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJyAnLCAnLicpCiAgICAgICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIHZlcnNpb24pCgoKZGVmIHNhZmVfZXh0cmEoZXh0cmEpOgogICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgJ2V4dHJhJyBuYW1lCgogICAgQW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICdfJywKICAgIGFuZCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBsb3dlcmNhc2VkLgogICAgIiIiCiAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS4tXSsnLCAnXycsIGV4dHJhKS5sb3dlcigpCgoKZGVmIHRvX2ZpbGVuYW1lKG5hbWUpOgogICAgIiIiQ29udmVydCBhIHByb2plY3Qgb3IgdmVyc2lvbiBuYW1lIHRvIGl0cyBmaWxlbmFtZS1lc2NhcGVkIGZvcm0KCiAgICBBbnkgJy0nIGNoYXJhY3RlcnMgYXJlIGN1cnJlbnRseSByZXBsYWNlZCB3aXRoICdfJy4KICAgICIiIgogICAgcmV0dXJuIG5hbWUucmVwbGFjZSgnLScsICdfJykKCgpkZWYgaW52YWxpZF9tYXJrZXIodGV4dCk6CiAgICAiIiIKICAgIFZhbGlkYXRlIHRleHQgYXMgYSBQRVAgNTA4IGVudmlyb25tZW50IG1hcmtlcjsgcmV0dXJuIGFuIGV4Y2VwdGlvbgogICAgaWYgaW52YWxpZCBvciBGYWxzZSBvdGhlcndpc2UuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBldmFsdWF0ZV9tYXJrZXIodGV4dCkKICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlOgogICAgICAgIGUuZmlsZW5hbWUgPSBOb25lCiAgICAgICAgZS5saW5lbm8gPSBOb25lCiAgICAgICAgcmV0dXJuIGUKICAgIHJldHVybiBGYWxzZQoKCmRlZiBldmFsdWF0ZV9tYXJrZXIodGV4dCwgZXh0cmE9Tm9uZSk6CiAgICAiIiIKICAgIEV2YWx1YXRlIGEgUEVQIDUwOCBlbnZpcm9ubWVudCBtYXJrZXIuCiAgICBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgdGhlIG1hcmtlciByZXN1bHQgaW4gdGhpcyBlbnZpcm9ubWVudC4KICAgIFJhaXNlIFN5bnRheEVycm9yIGlmIG1hcmtlciBpcyBpbnZhbGlkLgoKICAgIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgJ3B5cGFyc2luZycgbW9kdWxlLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgbWFya2VyID0gcGFja2FnaW5nLm1hcmtlcnMuTWFya2VyKHRleHQpCiAgICAgICAgcmV0dXJuIG1hcmtlci5ldmFsdWF0ZSgpCiAgICBleGNlcHQgcGFja2FnaW5nLm1hcmtlcnMuSW52YWxpZE1hcmtlciBhcyBlOgogICAgICAgIHJhaXNlIFN5bnRheEVycm9yKGUpCgoKY2xhc3MgTnVsbFByb3ZpZGVyOgogICAgIiIiVHJ5IHRvIGltcGxlbWVudCByZXNvdXJjZXMgYW5kIG1ldGFkYXRhIGZvciBhcmJpdHJhcnkgUEVQIDMwMiBsb2FkZXJzIiIiCgogICAgZWdnX25hbWUgPSBOb25lCiAgICBlZ2dfaW5mbyA9IE5vbmUKICAgIGxvYWRlciA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBzZWxmLmxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCiAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IG9zLnBhdGguZGlybmFtZShnZXRhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJywgJycpKQoKICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0oc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIGlvLkJ5dGVzSU8oc2VsZi5nZXRfcmVzb3VyY2Vfc3RyaW5nKG1hbmFnZXIsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyaW5nKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9nZXQoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIGhhc19yZXNvdXJjZShzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5faGFzKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBoYXNfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2luZm8gYW5kIHNlbGYuX2hhcyhzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKCiAgICBkZWYgZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5vdCBzZWxmLmVnZ19pbmZvOgogICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICB2YWx1ZSA9IHNlbGYuX2dldChzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKICAgICAgICByZXR1cm4gdmFsdWUuZGVjb2RlKCd1dGYtOCcpIGlmIHNpeC5QWTMgZWxzZSB2YWx1ZQoKICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHlpZWxkX2xpbmVzKHNlbGYuZ2V0X21ldGFkYXRhKG5hbWUpKQoKICAgIGRlZiByZXNvdXJjZV9pc2RpcihzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5faXNkaXIoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIG1ldGFkYXRhX2lzZGlyKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmVnZ19pbmZvIGFuZCBzZWxmLl9pc2RpcihzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5fbGlzdGRpcihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgbWV0YWRhdGFfbGlzdGRpcihzZWxmLCBuYW1lKToKICAgICAgICBpZiBzZWxmLmVnZ19pbmZvOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbGlzdGRpcihzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKICAgICAgICByZXR1cm4gW10KCiAgICBkZWYgcnVuX3NjcmlwdChzZWxmLCBzY3JpcHRfbmFtZSwgbmFtZXNwYWNlKToKICAgICAgICBzY3JpcHQgPSAnc2NyaXB0cy8nICsgc2NyaXB0X25hbWUKICAgICAgICBpZiBub3Qgc2VsZi5oYXNfbWV0YWRhdGEoc2NyaXB0KToKICAgICAgICAgICAgcmFpc2UgUmVzb2x1dGlvbkVycm9yKAogICAgICAgICAgICAgICAgIlNjcmlwdCB7c2NyaXB0IXJ9IG5vdCBmb3VuZCBpbiBtZXRhZGF0YSBhdCB7c2VsZi5lZ2dfaW5mbyFyfSIKICAgICAgICAgICAgICAgIC5mb3JtYXQoKipsb2NhbHMoKSksCiAgICAgICAgICAgICkKICAgICAgICBzY3JpcHRfdGV4dCA9IHNlbGYuZ2V0X21ldGFkYXRhKHNjcmlwdCkucmVwbGFjZSgnXHJcbicsICdcbicpCiAgICAgICAgc2NyaXB0X3RleHQgPSBzY3JpcHRfdGV4dC5yZXBsYWNlKCdccicsICdcbicpCiAgICAgICAgc2NyaXB0X2ZpbGVuYW1lID0gc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgc2NyaXB0KQogICAgICAgIG5hbWVzcGFjZVsnX19maWxlX18nXSA9IHNjcmlwdF9maWxlbmFtZQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNjcmlwdF9maWxlbmFtZSk6CiAgICAgICAgICAgIHNvdXJjZSA9IG9wZW4oc2NyaXB0X2ZpbGVuYW1lKS5yZWFkKCkKICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoc291cmNlLCBzY3JpcHRfZmlsZW5hbWUsICdleGVjJykKICAgICAgICAgICAgZXhlYyhjb2RlLCBuYW1lc3BhY2UsIG5hbWVzcGFjZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmcm9tIGxpbmVjYWNoZSBpbXBvcnQgY2FjaGUKICAgICAgICAgICAgY2FjaGVbc2NyaXB0X2ZpbGVuYW1lXSA9ICgKICAgICAgICAgICAgICAgIGxlbihzY3JpcHRfdGV4dCksIDAsIHNjcmlwdF90ZXh0LnNwbGl0KCdcbicpLCBzY3JpcHRfZmlsZW5hbWUKICAgICAgICAgICAgKQogICAgICAgICAgICBzY3JpcHRfY29kZSA9IGNvbXBpbGUoc2NyaXB0X3RleHQsIHNjcmlwdF9maWxlbmFtZSwgJ2V4ZWMnKQogICAgICAgICAgICBleGVjKHNjcmlwdF9jb2RlLCBuYW1lc3BhY2UsIG5hbWVzcGFjZSkKCiAgICBkZWYgX2hhcyhzZWxmLCBwYXRoKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdW5yZWdpc3RlcmVkIGxvYWRlciB0eXBlIgogICAgICAgICkKCiAgICBkZWYgX2lzZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCiAgICAgICAgKQoKICAgIGRlZiBfbGlzdGRpcihzZWxmLCBwYXRoKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdW5yZWdpc3RlcmVkIGxvYWRlciB0eXBlIgogICAgICAgICkKCiAgICBkZWYgX2ZuKHNlbGYsIGJhc2UsIHJlc291cmNlX25hbWUpOgogICAgICAgIGlmIHJlc291cmNlX25hbWU6CiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oYmFzZSwgKnJlc291cmNlX25hbWUuc3BsaXQoJy8nKSkKICAgICAgICByZXR1cm4gYmFzZQoKICAgIGRlZiBfZ2V0KHNlbGYsIHBhdGgpOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZi5sb2FkZXIsICdnZXRfZGF0YScpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkZXIuZ2V0X2RhdGEocGF0aCkKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgbG9hZGVycyB3aXRob3V0ICdnZXRfZGF0YSgpJyIKICAgICAgICApCgoKcmVnaXN0ZXJfbG9hZGVyX3R5cGUob2JqZWN0LCBOdWxsUHJvdmlkZXIpCgoKY2xhc3MgRWdnUHJvdmlkZXIoTnVsbFByb3ZpZGVyKToKICAgICIiIlByb3ZpZGVyIGJhc2VkIG9uIGEgdmlydHVhbCBmaWxlc3lzdGVtIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgTnVsbFByb3ZpZGVyLl9faW5pdF9fKHNlbGYsIG1vZHVsZSkKICAgICAgICBzZWxmLl9zZXR1cF9wcmVmaXgoKQoKICAgIGRlZiBfc2V0dXBfcHJlZml4KHNlbGYpOgogICAgICAgICMgd2UgYXNzdW1lIGhlcmUgdGhhdCBvdXIgbWV0YWRhdGEgbWF5IGJlIG5lc3RlZCBpbnNpZGUgYSAiYmFza2V0IgogICAgICAgICMgb2YgbXVsdGlwbGUgZWdnczsgdGhhdCdzIHdoeSB3ZSB1c2UgbW9kdWxlX3BhdGggaW5zdGVhZCBvZiAuYXJjaGl2ZQogICAgICAgIHBhdGggPSBzZWxmLm1vZHVsZV9wYXRoCiAgICAgICAgb2xkID0gTm9uZQogICAgICAgIHdoaWxlIHBhdGggIT0gb2xkOgogICAgICAgICAgICBpZiBfaXNfZWdnX3BhdGgocGF0aCk6CiAgICAgICAgICAgICAgICBzZWxmLmVnZ19uYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQogICAgICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IG9zLnBhdGguam9pbihwYXRoLCAnRUdHLUlORk8nKQogICAgICAgICAgICAgICAgc2VsZi5lZ2dfcm9vdCA9IHBhdGgKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIG9sZCA9IHBhdGgKICAgICAgICAgICAgcGF0aCwgYmFzZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKCgpjbGFzcyBEZWZhdWx0UHJvdmlkZXIoRWdnUHJvdmlkZXIpOgogICAgIiIiUHJvdmlkZXMgYWNjZXNzIHRvIHBhY2thZ2UgcmVzb3VyY2VzIGluIHRoZSBmaWxlc3lzdGVtIiIiCgogICAgZGVmIF9oYXMoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKHBhdGgpCgogICAgZGVmIF9pc2RpcihzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5pc2RpcihwYXRoKQoKICAgIGRlZiBfbGlzdGRpcihzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MubGlzdGRpcihwYXRoKQoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBvcGVuKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpLCAncmInKQoKICAgIGRlZiBfZ2V0KHNlbGYsIHBhdGgpOgogICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBzdHJlYW06CiAgICAgICAgICAgIHJldHVybiBzdHJlYW0ucmVhZCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3JlZ2lzdGVyKGNscyk6CiAgICAgICAgbG9hZGVyX2NscyA9IGdldGF0dHIoCiAgICAgICAgICAgIGltcG9ydGxpYl9tYWNoaW5lcnksCiAgICAgICAgICAgICdTb3VyY2VGaWxlTG9hZGVyJywKICAgICAgICAgICAgdHlwZShOb25lKSwKICAgICAgICApCiAgICAgICAgcmVnaXN0ZXJfbG9hZGVyX3R5cGUobG9hZGVyX2NscywgY2xzKQoKCkRlZmF1bHRQcm92aWRlci5fcmVnaXN0ZXIoKQoKCmNsYXNzIEVtcHR5UHJvdmlkZXIoTnVsbFByb3ZpZGVyKToKICAgICIiIlByb3ZpZGVyIHRoYXQgcmV0dXJucyBub3RoaW5nIGZvciBhbGwgcmVxdWVzdHMiIiIKCiAgICBfaXNkaXIgPSBfaGFzID0gbGFtYmRhIHNlbGYsIHBhdGg6IEZhbHNlCiAgICBfZ2V0ID0gbGFtYmRhIHNlbGYsIHBhdGg6ICcnCiAgICBfbGlzdGRpciA9IGxhbWJkYSBzZWxmLCBwYXRoOiBbXQogICAgbW9kdWxlX3BhdGggPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHBhc3MKCgplbXB0eV9wcm92aWRlciA9IEVtcHR5UHJvdmlkZXIoKQoKCmNsYXNzIFppcE1hbmlmZXN0cyhkaWN0KToKICAgICIiIgogICAgemlwIG1hbmlmZXN0IGJ1aWxkZXIKICAgICIiIgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGJ1aWxkKGNscywgcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYSBkaWN0aW9uYXJ5IHNpbWlsYXIgdG8gdGhlIHppcGltcG9ydCBkaXJlY3RvcnkKICAgICAgICBjYWNoZXMsIGV4Y2VwdCBpbnN0ZWFkIG9mIHR1cGxlcywgc3RvcmUgWmlwSW5mbyBvYmplY3RzLgoKICAgICAgICBVc2UgYSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoIHNlcGFyYXRvciAob3Muc2VwKSBmb3IgdGhlIHBhdGgga2V5cwogICAgICAgIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHlweSBvbiBXaW5kb3dzLgogICAgICAgICIiIgogICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHBhdGgpIGFzIHpmaWxlOgogICAgICAgICAgICBpdGVtcyA9ICgKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBuYW1lLnJlcGxhY2UoJy8nLCBvcy5zZXApLAogICAgICAgICAgICAgICAgICAgIHpmaWxlLmdldGluZm8obmFtZSksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiB6ZmlsZS5uYW1lbGlzdCgpCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIGRpY3QoaXRlbXMpCgogICAgbG9hZCA9IGJ1aWxkCgoKY2xhc3MgTWVtb2l6ZWRaaXBNYW5pZmVzdHMoWmlwTWFuaWZlc3RzKToKICAgICIiIgogICAgTWVtb2l6ZWQgemlwZmlsZSBtYW5pZmVzdHMuCiAgICAiIiIKICAgIG1hbmlmZXN0X21vZCA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ21hbmlmZXN0X21vZCcsICdtYW5pZmVzdCBtdGltZScpCgogICAgZGVmIGxvYWQoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgTG9hZCBhIG1hbmlmZXN0IGF0IHBhdGggb3IgcmV0dXJuIGEgc3VpdGFibGUgbWFuaWZlc3QgYWxyZWFkeSBsb2FkZWQuCiAgICAgICAgIiIiCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgocGF0aCkKICAgICAgICBtdGltZSA9IG9zLnN0YXQocGF0aCkuc3RfbXRpbWUKCiAgICAgICAgaWYgcGF0aCBub3QgaW4gc2VsZiBvciBzZWxmW3BhdGhdLm10aW1lICE9IG10aW1lOgogICAgICAgICAgICBtYW5pZmVzdCA9IHNlbGYuYnVpbGQocGF0aCkKICAgICAgICAgICAgc2VsZltwYXRoXSA9IHNlbGYubWFuaWZlc3RfbW9kKG1hbmlmZXN0LCBtdGltZSkKCiAgICAgICAgcmV0dXJuIHNlbGZbcGF0aF0ubWFuaWZlc3QKCgpjbGFzcyBaaXBQcm92aWRlcihFZ2dQcm92aWRlcik6CiAgICAiIiJSZXNvdXJjZSBzdXBwb3J0IGZvciB6aXBzIGFuZCBlZ2dzIiIiCgogICAgZWFnZXJzID0gTm9uZQogICAgX3ppcF9tYW5pZmVzdHMgPSBNZW1vaXplZFppcE1hbmlmZXN0cygpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgRWdnUHJvdmlkZXIuX19pbml0X18oc2VsZiwgbW9kdWxlKQogICAgICAgIHNlbGYuemlwX3ByZSA9IHNlbGYubG9hZGVyLmFyY2hpdmUgKyBvcy5zZXAKCiAgICBkZWYgX3ppcGluZm9fbmFtZShzZWxmLCBmc3BhdGgpOgogICAgICAgICMgQ29udmVydCBhIHZpcnR1YWwgZmlsZW5hbWUgKGZ1bGwgcGF0aCB0byBmaWxlKSBpbnRvIGEgemlwZmlsZSBzdWJwYXRoCiAgICAgICAgIyB1c2FibGUgd2l0aCB0aGUgemlwaW1wb3J0IGRpcmVjdG9yeSBjYWNoZSBmb3Igb3VyIHRhcmdldCBhcmNoaXZlCiAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi56aXBfcHJlKToKICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi56aXBfcHJlKTpdCiAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuemlwX3ByZSkKICAgICAgICApCgogICAgZGVmIF9wYXJ0cyhzZWxmLCB6aXBfcGF0aCk6CiAgICAgICAgIyBDb252ZXJ0IGEgemlwZmlsZSBzdWJwYXRoIGludG8gYW4gZWdnLXJlbGF0aXZlIHBhdGggcGFydCBsaXN0LgogICAgICAgICMgcHNldWRvLWZzIHBhdGgKICAgICAgICBmc3BhdGggPSBzZWxmLnppcF9wcmUgKyB6aXBfcGF0aAogICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuZWdnX3Jvb3QgKyBvcy5zZXApOgogICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLmVnZ19yb290KSArIDE6XS5zcGxpdChvcy5zZXApCiAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuZWdnX3Jvb3QpCiAgICAgICAgKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHppcGluZm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcF9tYW5pZmVzdHMubG9hZChzZWxmLmxvYWRlci5hcmNoaXZlKQoKICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgaWYgbm90IHNlbGYuZWdnX25hbWU6CiAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfZmlsZW5hbWUoKSBvbmx5IHN1cHBvcnRlZCBmb3IgLmVnZywgbm90IC56aXAiCiAgICAgICAgICAgICkKICAgICAgICAjIG5vIG5lZWQgdG8gbG9jayBmb3IgZXh0cmFjdGlvbiwgc2luY2Ugd2UgdXNlIHRlbXAgbmFtZXMKICAgICAgICB6aXBfcGF0aCA9IHNlbGYuX3Jlc291cmNlX3RvX3ppcChyZXNvdXJjZV9uYW1lKQogICAgICAgIGVhZ2VycyA9IHNlbGYuX2dldF9lYWdlcl9yZXNvdXJjZXMoKQogICAgICAgIGlmICcvJy5qb2luKHNlbGYuX3BhcnRzKHppcF9wYXRoKSkgaW4gZWFnZXJzOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBlYWdlcnM6CiAgICAgICAgICAgICAgICBzZWxmLl9leHRyYWN0X3Jlc291cmNlKG1hbmFnZXIsIHNlbGYuX2VhZ2VyX3RvX3ppcChuYW1lKSkKICAgICAgICByZXR1cm4gc2VsZi5fZXh0cmFjdF9yZXNvdXJjZShtYW5hZ2VyLCB6aXBfcGF0aCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dldF9kYXRlX2FuZF9zaXplKHppcF9zdGF0KToKICAgICAgICBzaXplID0gemlwX3N0YXQuZmlsZV9zaXplCiAgICAgICAgIyB5bWRobXMrd2RheSwgeWRheSwgZHN0CiAgICAgICAgZGF0ZV90aW1lID0gemlwX3N0YXQuZGF0ZV90aW1lICsgKDAsIDAsIC0xKQogICAgICAgICMgMTk4MCBvZmZzZXQgYWxyZWFkeSBkb25lCiAgICAgICAgdGltZXN0YW1wID0gdGltZS5ta3RpbWUoZGF0ZV90aW1lKQogICAgICAgIHJldHVybiB0aW1lc3RhbXAsIHNpemUKCiAgICBkZWYgX2V4dHJhY3RfcmVzb3VyY2Uoc2VsZiwgbWFuYWdlciwgemlwX3BhdGgpOgoKICAgICAgICBpZiB6aXBfcGF0aCBpbiBzZWxmLl9pbmRleCgpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLl9pbmRleCgpW3ppcF9wYXRoXToKICAgICAgICAgICAgICAgIGxhc3QgPSBzZWxmLl9leHRyYWN0X3Jlc291cmNlKAogICAgICAgICAgICAgICAgICAgIG1hbmFnZXIsIG9zLnBhdGguam9pbih6aXBfcGF0aCwgbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgIyByZXR1cm4gdGhlIGV4dHJhY3RlZCBkaXJlY3RvcnkgbmFtZQogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5kaXJuYW1lKGxhc3QpCgogICAgICAgIHRpbWVzdGFtcCwgc2l6ZSA9IHNlbGYuX2dldF9kYXRlX2FuZF9zaXplKHNlbGYuemlwaW5mb1t6aXBfcGF0aF0pCgogICAgICAgIGlmIG5vdCBXUklURV9TVVBQT1JUOgogICAgICAgICAgICByYWlzZSBJT0Vycm9yKCcib3MucmVuYW1lIiBhbmQgIm9zLnVubGluayIgYXJlIG5vdCBzdXBwb3J0ZWQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICdvbiB0aGlzIHBsYXRmb3JtJykKICAgICAgICB0cnk6CgogICAgICAgICAgICByZWFsX3BhdGggPSBtYW5hZ2VyLmdldF9jYWNoZV9wYXRoKAogICAgICAgICAgICAgICAgc2VsZi5lZ2dfbmFtZSwgc2VsZi5fcGFydHMoemlwX3BhdGgpCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIHNlbGYuX2lzX2N1cnJlbnQocmVhbF9wYXRoLCB6aXBfcGF0aCk6CiAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCgogICAgICAgICAgICBvdXRmLCB0bXBuYW0gPSBfbWtzdGVtcCgKICAgICAgICAgICAgICAgICIuJGV4dHJhY3QiLAogICAgICAgICAgICAgICAgZGlyPW9zLnBhdGguZGlybmFtZShyZWFsX3BhdGgpLAogICAgICAgICAgICApCiAgICAgICAgICAgIG9zLndyaXRlKG91dGYsIHNlbGYubG9hZGVyLmdldF9kYXRhKHppcF9wYXRoKSkKICAgICAgICAgICAgb3MuY2xvc2Uob3V0ZikKICAgICAgICAgICAgdXRpbWUodG1wbmFtLCAodGltZXN0YW1wLCB0aW1lc3RhbXApKQogICAgICAgICAgICBtYW5hZ2VyLnBvc3Rwcm9jZXNzKHRtcG5hbSwgcmVhbF9wYXRoKQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVuYW1lKHRtcG5hbSwgcmVhbF9wYXRoKQoKICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocmVhbF9wYXRoKToKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9pc19jdXJyZW50KHJlYWxfcGF0aCwgemlwX3BhdGgpOgogICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBmaWxlIGJlY2FtZSBjdXJyZW50IHNpbmNlIGl0IHdhcyBjaGVja2VkIGFib3ZlLAogICAgICAgICAgICAgICAgICAgICAgICAjICBzbyBwcm9jZWVkLgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCiAgICAgICAgICAgICAgICAgICAgIyBXaW5kb3dzLCBkZWwgb2xkIGZpbGUgYW5kIHJldHJ5CiAgICAgICAgICAgICAgICAgICAgZWxpZiBvcy5uYW1lID09ICdudCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHVubGluayhyZWFsX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZSh0bXBuYW0sIHJlYWxfcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgICAgICAjIHJlcG9ydCBhIHVzZXItZnJpZW5kbHkgZXJyb3IKICAgICAgICAgICAgbWFuYWdlci5leHRyYWN0aW9uX2Vycm9yKCkKCiAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAoKICAgIGRlZiBfaXNfY3VycmVudChzZWxmLCBmaWxlX3BhdGgsIHppcF9wYXRoKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZV9wYXRoIGlzIGN1cnJlbnQgZm9yIHRoaXMgemlwX3BhdGgKICAgICAgICAiIiIKICAgICAgICB0aW1lc3RhbXAsIHNpemUgPSBzZWxmLl9nZXRfZGF0ZV9hbmRfc2l6ZShzZWxmLnppcGluZm9bemlwX3BhdGhdKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShmaWxlX3BhdGgpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBzdGF0ID0gb3Muc3RhdChmaWxlX3BhdGgpCiAgICAgICAgaWYgc3RhdC5zdF9zaXplICE9IHNpemUgb3Igc3RhdC5zdF9tdGltZSAhPSB0aW1lc3RhbXA6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICMgY2hlY2sgdGhhdCB0aGUgY29udGVudHMgbWF0Y2gKICAgICAgICB6aXBfY29udGVudHMgPSBzZWxmLmxvYWRlci5nZXRfZGF0YSh6aXBfcGF0aCkKICAgICAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAncmInKSBhcyBmOgogICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZi5yZWFkKCkKICAgICAgICByZXR1cm4gemlwX2NvbnRlbnRzID09IGZpbGVfY29udGVudHMKCiAgICBkZWYgX2dldF9lYWdlcl9yZXNvdXJjZXMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5lYWdlcnMgaXMgTm9uZToKICAgICAgICAgICAgZWFnZXJzID0gW10KICAgICAgICAgICAgZm9yIG5hbWUgaW4gKCduYXRpdmVfbGlicy50eHQnLCAnZWFnZXJfcmVzb3VyY2VzLnR4dCcpOgogICAgICAgICAgICAgICAgaWYgc2VsZi5oYXNfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgICAgICAgICAgICAgZWFnZXJzLmV4dGVuZChzZWxmLmdldF9tZXRhZGF0YV9saW5lcyhuYW1lKSkKICAgICAgICAgICAgc2VsZi5lYWdlcnMgPSBlYWdlcnMKICAgICAgICByZXR1cm4gc2VsZi5lYWdlcnMKCiAgICBkZWYgX2luZGV4KHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RpcmluZGV4CiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBpbmQgPSB7fQogICAgICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLnppcGluZm86CiAgICAgICAgICAgICAgICBwYXJ0cyA9IHBhdGguc3BsaXQob3Muc2VwKQogICAgICAgICAgICAgICAgd2hpbGUgcGFydHM6CiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gb3Muc2VwLmpvaW4ocGFydHNbOi0xXSkKICAgICAgICAgICAgICAgICAgICBpZiBwYXJlbnQgaW4gaW5kOgogICAgICAgICAgICAgICAgICAgICAgICBpbmRbcGFyZW50XS5hcHBlbmQocGFydHNbLTFdKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGluZFtwYXJlbnRdID0gW3BhcnRzLnBvcCgpXQogICAgICAgICAgICBzZWxmLl9kaXJpbmRleCA9IGluZAogICAgICAgICAgICByZXR1cm4gaW5kCgogICAgZGVmIF9oYXMoc2VsZiwgZnNwYXRoKToKICAgICAgICB6aXBfcGF0aCA9IHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpCiAgICAgICAgcmV0dXJuIHppcF9wYXRoIGluIHNlbGYuemlwaW5mbyBvciB6aXBfcGF0aCBpbiBzZWxmLl9pbmRleCgpCgogICAgZGVmIF9pc2RpcihzZWxmLCBmc3BhdGgpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKSBpbiBzZWxmLl9pbmRleCgpCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5faW5kZXgoKS5nZXQoc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCksICgpKSkKCiAgICBkZWYgX2VhZ2VyX3RvX3ppcChzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKHNlbGYuX2ZuKHNlbGYuZWdnX3Jvb3QsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBfcmVzb3VyY2VfdG9femlwKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgoKcmVnaXN0ZXJfbG9hZGVyX3R5cGUoemlwaW1wb3J0LnppcGltcG9ydGVyLCBaaXBQcm92aWRlcikKCgpjbGFzcyBGaWxlTWV0YWRhdGEoRW1wdHlQcm92aWRlcik6CiAgICAiIiJNZXRhZGF0YSBoYW5kbGVyIGZvciBzdGFuZGFsb25lIFBLRy1JTkZPIGZpbGVzCgogICAgVXNhZ2U6OgoKICAgICAgICBtZXRhZGF0YSA9IEZpbGVNZXRhZGF0YSgiL3BhdGgvdG8vUEtHLUlORk8iKQoKICAgIFRoaXMgcHJvdmlkZXIgcmVqZWN0cyBhbGwgZGF0YSBhbmQgbWV0YWRhdGEgcmVxdWVzdHMgZXhjZXB0IGZvciBQS0ctSU5GTywKICAgIHdoaWNoIGlzIHRyZWF0ZWQgYXMgZXhpc3RpbmcsIGFuZCB3aWxsIGJlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhdAogICAgdGhlIHByb3ZpZGVkIGxvY2F0aW9uLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgICAgIHNlbGYucGF0aCA9IHBhdGgKCiAgICBkZWYgaGFzX21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBuYW1lID09ICdQS0ctSU5GTycgYW5kIG9zLnBhdGguaXNmaWxlKHNlbGYucGF0aCkKCiAgICBkZWYgZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5hbWUgIT0gJ1BLRy1JTkZPJzoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoIk5vIG1ldGFkYXRhIGV4Y2VwdCBQS0ctSU5GTyBpcyBhdmFpbGFibGUiKQoKICAgICAgICB3aXRoIGlvLm9wZW4oc2VsZi5wYXRoLCBlbmNvZGluZz0ndXRmLTgnLCBlcnJvcnM9InJlcGxhY2UiKSBhcyBmOgogICAgICAgICAgICBtZXRhZGF0YSA9IGYucmVhZCgpCiAgICAgICAgc2VsZi5fd2Fybl9vbl9yZXBsYWNlbWVudChtZXRhZGF0YSkKICAgICAgICByZXR1cm4gbWV0YWRhdGEKCiAgICBkZWYgX3dhcm5fb25fcmVwbGFjZW1lbnQoc2VsZiwgbWV0YWRhdGEpOgogICAgICAgICMgUHl0aG9uIDIuNyBjb21wYXQgZm9yOiByZXBsYWNlbWVudF9jaGFyID0gJ++/vScKICAgICAgICByZXBsYWNlbWVudF9jaGFyID0gYidceGVmXHhiZlx4YmQnLmRlY29kZSgndXRmLTgnKQogICAgICAgIGlmIHJlcGxhY2VtZW50X2NoYXIgaW4gbWV0YWRhdGE6CiAgICAgICAgICAgIHRtcGwgPSAie3NlbGYucGF0aH0gY291bGQgbm90IGJlIHByb3Blcmx5IGRlY29kZWQgaW4gVVRGLTgiCiAgICAgICAgICAgIG1zZyA9IHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnKQoKICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHlpZWxkX2xpbmVzKHNlbGYuZ2V0X21ldGFkYXRhKG5hbWUpKQoKCmNsYXNzIFBhdGhNZXRhZGF0YShEZWZhdWx0UHJvdmlkZXIpOgogICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIGVnZyBkaXJlY3RvcmllcwoKICAgIFVzYWdlOjoKCiAgICAgICAgIyBEZXZlbG9wbWVudCBlZ2dzOgoKICAgICAgICBlZ2dfaW5mbyA9ICIvcGF0aC90by9QYWNrYWdlTmFtZS5lZ2ctaW5mbyIKICAgICAgICBiYXNlX2RpciA9IG9zLnBhdGguZGlybmFtZShlZ2dfaW5mbykKICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShiYXNlX2RpciwgZWdnX2luZm8pCiAgICAgICAgZGlzdF9uYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGVnZ19pbmZvKSlbMF0KICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKGJhc2VkaXIsIHByb2plY3RfbmFtZT1kaXN0X25hbWUsIG1ldGFkYXRhPW1ldGFkYXRhKQoKICAgICAgICAjIFVucGFja2VkIGVnZyBkaXJlY3RvcmllczoKCiAgICAgICAgZWdnX3BhdGggPSAiL3BhdGgvdG8vUGFja2FnZU5hbWUtdmVyLXB5dmVyLWV0Yy5lZ2ciCiAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEoZWdnX3BhdGgsIG9zLnBhdGguam9pbihlZ2dfcGF0aCwnRUdHLUlORk8nKSkKICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoZWdnX3BhdGgsIG1ldGFkYXRhPW1ldGFkYXRhKQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGVnZ19pbmZvKToKICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gcGF0aAogICAgICAgIHNlbGYuZWdnX2luZm8gPSBlZ2dfaW5mbwoKCmNsYXNzIEVnZ01ldGFkYXRhKFppcFByb3ZpZGVyKToKICAgICIiIk1ldGFkYXRhIHByb3ZpZGVyIGZvciAuZWdnIGZpbGVzIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGltcG9ydGVyKToKICAgICAgICAiIiJDcmVhdGUgYSBtZXRhZGF0YSBwcm92aWRlciBmcm9tIGEgemlwaW1wb3J0ZXIiIiIKCiAgICAgICAgc2VsZi56aXBfcHJlID0gaW1wb3J0ZXIuYXJjaGl2ZSArIG9zLnNlcAogICAgICAgIHNlbGYubG9hZGVyID0gaW1wb3J0ZXIKICAgICAgICBpZiBpbXBvcnRlci5wcmVmaXg6CiAgICAgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBvcy5wYXRoLmpvaW4oaW1wb3J0ZXIuYXJjaGl2ZSwgaW1wb3J0ZXIucHJlZml4KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBpbXBvcnRlci5hcmNoaXZlCiAgICAgICAgc2VsZi5fc2V0dXBfcHJlZml4KCkKCgpfZGVjbGFyZV9zdGF0ZSgnZGljdCcsIF9kaXN0cmlidXRpb25fZmluZGVycz17fSkKCgpkZWYgcmVnaXN0ZXJfZmluZGVyKGltcG9ydGVyX3R5cGUsIGRpc3RyaWJ1dGlvbl9maW5kZXIpOgogICAgIiIiUmVnaXN0ZXIgYGRpc3RyaWJ1dGlvbl9maW5kZXJgIHRvIGZpbmQgZGlzdHJpYnV0aW9ucyBpbiBzeXMucGF0aCBpdGVtcwoKICAgIGBpbXBvcnRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgIkltcG9ydGVyIiAoc3lzLnBhdGggaXRlbQogICAgaGFuZGxlciksIGFuZCBgZGlzdHJpYnV0aW9uX2ZpbmRlcmAgaXMgYSBjYWxsYWJsZSB0aGF0LCBwYXNzZWQgYSBwYXRoCiAgICBpdGVtIGFuZCB0aGUgaW1wb3J0ZXIgaW5zdGFuY2UsIHlpZWxkcyBgYERpc3RyaWJ1dGlvbmBgIGluc3RhbmNlcyBmb3VuZCBvbgogICAgdGhhdCBwYXRoIGl0ZW0uICBTZWUgYGBwa2dfcmVzb3VyY2VzLmZpbmRfb25fcGF0aGBgIGZvciBhbiBleGFtcGxlLiIiIgogICAgX2Rpc3RyaWJ1dGlvbl9maW5kZXJzW2ltcG9ydGVyX3R5cGVdID0gZGlzdHJpYnV0aW9uX2ZpbmRlcgoKCmRlZiBmaW5kX2Rpc3RyaWJ1dGlvbnMocGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgYWNjZXNzaWJsZSB2aWEgYHBhdGhfaXRlbWAiIiIKICAgIGltcG9ydGVyID0gZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSkKICAgIGZpbmRlciA9IF9maW5kX2FkYXB0ZXIoX2Rpc3RyaWJ1dGlvbl9maW5kZXJzLCBpbXBvcnRlcikKICAgIHJldHVybiBmaW5kZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seSkKCgpkZWYgZmluZF9lZ2dzX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICIiIgogICAgRmluZCBlZ2dzIGluIHppcCBmaWxlczsgcG9zc2libHkgbXVsdGlwbGUgbmVzdGVkIGVnZ3MuCiAgICAiIiIKICAgIGlmIGltcG9ydGVyLmFyY2hpdmUuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAjIHdoZWVscyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgZmluZGVyCiAgICAgICAgIyB0aGV5IGRvbid0IGhhdmUgUEtHLUlORk8gbWV0YWRhdGEsIGFuZCB3b24ndCBldmVyIGNvbnRhaW4gZWdncwogICAgICAgIHJldHVybgogICAgbWV0YWRhdGEgPSBFZ2dNZXRhZGF0YShpbXBvcnRlcikKICAgIGlmIG1ldGFkYXRhLmhhc19tZXRhZGF0YSgnUEtHLUlORk8nKToKICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShwYXRoX2l0ZW0sIG1ldGFkYXRhPW1ldGFkYXRhKQogICAgaWYgb25seToKICAgICAgICAjIGRvbid0IHlpZWxkIG5lc3RlZCBkaXN0cm9zCiAgICAgICAgcmV0dXJuCiAgICBmb3Igc3ViaXRlbSBpbiBtZXRhZGF0YS5yZXNvdXJjZV9saXN0ZGlyKCcvJyk6CiAgICAgICAgaWYgX2lzX2VnZ19wYXRoKHN1Yml0ZW0pOgogICAgICAgICAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgc3ViaXRlbSkKICAgICAgICAgICAgZGlzdHMgPSBmaW5kX2VnZ3NfaW5femlwKHppcGltcG9ydC56aXBpbXBvcnRlcihzdWJwYXRoKSwgc3VicGF0aCkKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CiAgICAgICAgZWxpZiBzdWJpdGVtLmxvd2VyKCkuZW5kc3dpdGgoJy5kaXN0LWluZm8nKToKICAgICAgICAgICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHN1Yml0ZW0pCiAgICAgICAgICAgIHN1Ym1ldGEgPSBFZ2dNZXRhZGF0YSh6aXBpbXBvcnQuemlwaW1wb3J0ZXIoc3VicGF0aCkpCiAgICAgICAgICAgIHN1Ym1ldGEuZWdnX2luZm8gPSBzdWJwYXRoCiAgICAgICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKHBhdGhfaXRlbSwgc3ViaXRlbSwgc3VibWV0YSkKCgpyZWdpc3Rlcl9maW5kZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLCBmaW5kX2VnZ3NfaW5femlwKQoKCmRlZiBmaW5kX25vdGhpbmcoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICByZXR1cm4gKCkKCgpyZWdpc3Rlcl9maW5kZXIob2JqZWN0LCBmaW5kX25vdGhpbmcpCgoKZGVmIF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpOgogICAgIiIiCiAgICBHaXZlbiBhIGxpc3Qgb2YgZmlsZW5hbWVzLCByZXR1cm4gdGhlbSBpbiBkZXNjZW5kaW5nIG9yZGVyCiAgICBieSB2ZXJzaW9uIG51bWJlci4KCiAgICA+Pj4gbmFtZXMgPSAnYmFyJywgJ2ZvbycsICdQeXRob24tMi43LjEwLmVnZycsICdQeXRob24tMi43LjIuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1B5dGhvbi0yLjcuMTAuZWdnJywgJ1B5dGhvbi0yLjcuMi5lZ2cnLCAnZm9vJywgJ2JhciddCiAgICA+Pj4gbmFtZXMgPSAnU2V0dXB0b29scy0xLjIuM2IxLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zLmVnZycKICAgID4+PiBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG5hbWVzKQogICAgWydTZXR1cHRvb2xzLTEuMi4zLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJ10KICAgID4+PiBuYW1lcyA9ICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjMucG9zdDEuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1NldHVwdG9vbHMtMS4yLjMucG9zdDEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnXQogICAgIiIiCiAgICBkZWYgX2J5X3ZlcnNpb24obmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgZWFjaCBjb21wb25lbnQgb2YgdGhlIGZpbGVuYW1lCiAgICAgICAgIiIiCiAgICAgICAgbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQogICAgICAgIHBhcnRzID0gaXRlcnRvb2xzLmNoYWluKG5hbWUuc3BsaXQoJy0nKSwgW2V4dF0pCiAgICAgICAgcmV0dXJuIFtwYWNrYWdpbmcudmVyc2lvbi5wYXJzZShwYXJ0KSBmb3IgcGFydCBpbiBwYXJ0c10KCiAgICByZXR1cm4gc29ydGVkKG5hbWVzLCBrZXk9X2J5X3ZlcnNpb24sIHJldmVyc2U9VHJ1ZSkKCgpkZWYgZmluZF9vbl9wYXRoKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBhY2Nlc3NpYmxlIG9uIGEgc3lzLnBhdGggZGlyZWN0b3J5IiIiCiAgICBwYXRoX2l0ZW0gPSBfbm9ybWFsaXplX2NhY2hlZChwYXRoX2l0ZW0pCgogICAgaWYgX2lzX3VucGFja2VkX2VnZyhwYXRoX2l0ZW0pOgogICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKAogICAgICAgICAgICBwYXRoX2l0ZW0sIG1ldGFkYXRhPVBhdGhNZXRhZGF0YSgKICAgICAgICAgICAgICAgIHBhdGhfaXRlbSwgb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgJ0VHRy1JTkZPJykKICAgICAgICAgICAgKQogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBlbnRyaWVzID0gc2FmZV9saXN0ZGlyKHBhdGhfaXRlbSkKCiAgICAjIGZvciBwZXJmb3JtYW5jZSwgYmVmb3JlIHNvcnRpbmcgYnkgdmVyc2lvbiwKICAgICMgc2NyZWVuIGVudHJpZXMgZm9yIG9ubHkgdGhvc2UgdGhhdCB3aWxsIHlpZWxkCiAgICAjIGRpc3RyaWJ1dGlvbnMKICAgIGZpbHRlcmVkID0gKAogICAgICAgIGVudHJ5CiAgICAgICAgZm9yIGVudHJ5IGluIGVudHJpZXMKICAgICAgICBpZiBkaXN0X2ZhY3RvcnkocGF0aF9pdGVtLCBlbnRyeSwgb25seSkKICAgICkKCiAgICAjIHNjYW4gZm9yIC5lZ2cgYW5kIC5lZ2ctaW5mbyBpbiBkaXJlY3RvcnkKICAgIHBhdGhfaXRlbV9lbnRyaWVzID0gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhmaWx0ZXJlZCkKICAgIGZvciBlbnRyeSBpbiBwYXRoX2l0ZW1fZW50cmllczoKICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGVudHJ5KQogICAgICAgIGZhY3RvcnkgPSBkaXN0X2ZhY3RvcnkocGF0aF9pdGVtLCBlbnRyeSwgb25seSkKICAgICAgICBmb3IgZGlzdCBpbiBmYWN0b3J5KGZ1bGxwYXRoKToKICAgICAgICAgICAgeWllbGQgZGlzdAoKCmRlZiBkaXN0X2ZhY3RvcnkocGF0aF9pdGVtLCBlbnRyeSwgb25seSk6CiAgICAiIiIKICAgIFJldHVybiBhIGRpc3RfZmFjdG9yeSBmb3IgYSBwYXRoX2l0ZW0gYW5kIGVudHJ5CiAgICAiIiIKICAgIGxvd2VyID0gZW50cnkubG93ZXIoKQogICAgaXNfbWV0YSA9IGFueShtYXAobG93ZXIuZW5kc3dpdGgsICgnLmVnZy1pbmZvJywgJy5kaXN0LWluZm8nKSkpCiAgICByZXR1cm4gKAogICAgICAgIGRpc3RyaWJ1dGlvbnNfZnJvbV9tZXRhZGF0YQogICAgICAgIGlmIGlzX21ldGEgZWxzZQogICAgICAgIGZpbmRfZGlzdHJpYnV0aW9ucwogICAgICAgIGlmIG5vdCBvbmx5IGFuZCBfaXNfZWdnX3BhdGgoZW50cnkpIGVsc2UKICAgICAgICByZXNvbHZlX2VnZ19saW5rCiAgICAgICAgaWYgbm90IG9ubHkgYW5kIGxvd2VyLmVuZHN3aXRoKCcuZWdnLWxpbmsnKSBlbHNlCiAgICAgICAgTm9EaXN0cygpCiAgICApCgoKY2xhc3MgTm9EaXN0czoKICAgICIiIgogICAgPj4+IGJvb2woTm9EaXN0cygpKQogICAgRmFsc2UKCiAgICA+Pj4gbGlzdChOb0Rpc3RzKCkoJ2FueXRoaW5nJykpCiAgICBbXQogICAgIiIiCiAgICBkZWYgX19ib29sX18oc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBpZiBzaXguUFkyOgogICAgICAgIF9fbm9uemVyb19fID0gX19ib29sX18KCiAgICBkZWYgX19jYWxsX18oc2VsZiwgZnVsbHBhdGgpOgogICAgICAgIHJldHVybiBpdGVyKCgpKQoKCmRlZiBzYWZlX2xpc3RkaXIocGF0aCk6CiAgICAiIiIKICAgIEF0dGVtcHQgdG8gbGlzdCBjb250ZW50cyBvZiBwYXRoLCBidXQgc3VwcHJlc3Mgc29tZSBleGNlcHRpb25zLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIG9zLmxpc3RkaXIocGF0aCkKICAgIGV4Y2VwdCAoUGVybWlzc2lvbkVycm9yLCBOb3RBRGlyZWN0b3J5RXJyb3IpOgogICAgICAgIHBhc3MKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgIyBJZ25vcmUgdGhlIGRpcmVjdG9yeSBpZiBkb2VzIG5vdCBleGlzdCwgbm90IGEgZGlyZWN0b3J5IG9yCiAgICAgICAgIyBwZXJtaXNzaW9uIGRlbmllZAogICAgICAgIGlnbm9yYWJsZSA9ICgKICAgICAgICAgICAgZS5lcnJubyBpbiAoZXJybm8uRU5PVERJUiwgZXJybm8uRUFDQ0VTLCBlcnJuby5FTk9FTlQpCiAgICAgICAgICAgICMgUHl0aG9uIDIgb24gV2luZG93cyBuZWVkcyB0byBiZSBoYW5kbGVkIHRoaXMgd2F5IDooCiAgICAgICAgICAgIG9yIGdldGF0dHIoZSwgIndpbmVycm9yIiwgTm9uZSkgPT0gMjY3CiAgICAgICAgKQogICAgICAgIGlmIG5vdCBpZ25vcmFibGU6CiAgICAgICAgICAgIHJhaXNlCiAgICByZXR1cm4gKCkKCgpkZWYgZGlzdHJpYnV0aW9uc19mcm9tX21ldGFkYXRhKHBhdGgpOgogICAgcm9vdCA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICBpZiBsZW4ob3MubGlzdGRpcihwYXRoKSkgPT0gMDoKICAgICAgICAgICAgIyBlbXB0eSBtZXRhZGF0YSBkaXI7IHNraXAKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEocm9vdCwgcGF0aCkKICAgIGVsc2U6CiAgICAgICAgbWV0YWRhdGEgPSBGaWxlTWV0YWRhdGEocGF0aCkKICAgIGVudHJ5ID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQogICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24oCiAgICAgICAgcm9vdCwgZW50cnksIG1ldGFkYXRhLCBwcmVjZWRlbmNlPURFVkVMT1BfRElTVCwKICAgICkKCgpkZWYgbm9uX2VtcHR5X2xpbmVzKHBhdGgpOgogICAgIiIiCiAgICBZaWVsZCBub24tZW1wdHkgbGluZXMgZnJvbSBmaWxlIGF0IHBhdGgKICAgICIiIgogICAgd2l0aCBvcGVuKHBhdGgpIGFzIGY6CiAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICBpZiBsaW5lOgogICAgICAgICAgICAgICAgeWllbGQgbGluZQoKCmRlZiByZXNvbHZlX2VnZ19saW5rKHBhdGgpOgogICAgIiIiCiAgICBHaXZlbiBhIHBhdGggdG8gYW4gLmVnZy1saW5rLCByZXNvbHZlIGRpc3RyaWJ1dGlvbnMKICAgIHByZXNlbnQgaW4gdGhlIHJlZmVyZW5jZWQgcGF0aC4KICAgICIiIgogICAgcmVmZXJlbmNlZF9wYXRocyA9IG5vbl9lbXB0eV9saW5lcyhwYXRoKQogICAgcmVzb2x2ZWRfcGF0aHMgPSAoCiAgICAgICAgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShwYXRoKSwgcmVmKQogICAgICAgIGZvciByZWYgaW4gcmVmZXJlbmNlZF9wYXRocwogICAgKQogICAgZGlzdF9ncm91cHMgPSBtYXAoZmluZF9kaXN0cmlidXRpb25zLCByZXNvbHZlZF9wYXRocykKICAgIHJldHVybiBuZXh0KGRpc3RfZ3JvdXBzLCAoKSkKCgpyZWdpc3Rlcl9maW5kZXIocGtndXRpbC5JbXBJbXBvcnRlciwgZmluZF9vbl9wYXRoKQoKaWYgaGFzYXR0cihpbXBvcnRsaWJfbWFjaGluZXJ5LCAnRmlsZUZpbmRlcicpOgogICAgcmVnaXN0ZXJfZmluZGVyKGltcG9ydGxpYl9tYWNoaW5lcnkuRmlsZUZpbmRlciwgZmluZF9vbl9wYXRoKQoKX2RlY2xhcmVfc3RhdGUoJ2RpY3QnLCBfbmFtZXNwYWNlX2hhbmRsZXJzPXt9KQpfZGVjbGFyZV9zdGF0ZSgnZGljdCcsIF9uYW1lc3BhY2VfcGFja2FnZXM9e30pCgoKZGVmIHJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGVyX3R5cGUsIG5hbWVzcGFjZV9oYW5kbGVyKToKICAgICIiIlJlZ2lzdGVyIGBuYW1lc3BhY2VfaGFuZGxlcmAgdG8gZGVjbGFyZSBuYW1lc3BhY2UgcGFja2FnZXMKCiAgICBgaW1wb3J0ZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyICJJbXBvcnRlciIgKHN5cy5wYXRoIGl0ZW0KICAgIGhhbmRsZXIpLCBhbmQgYG5hbWVzcGFjZV9oYW5kbGVyYCBpcyBhIGNhbGxhYmxlIGxpa2UgdGhpczo6CgogICAgICAgIGRlZiBuYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9lbnRyeSwgbW9kdWxlTmFtZSwgbW9kdWxlKToKICAgICAgICAgICAgIyByZXR1cm4gYSBwYXRoX2VudHJ5IHRvIHVzZSBmb3IgY2hpbGQgcGFja2FnZXMKCiAgICBOYW1lc3BhY2UgaGFuZGxlcnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBpbXBvcnRlciBvYmplY3QgaGFzIGFscmVhZHkKICAgIGFncmVlZCB0aGF0IGl0IGNhbiBoYW5kbGUgdGhlIHJlbGV2YW50IHBhdGggaXRlbSwgYW5kIHRoZXkgc2hvdWxkIG9ubHkKICAgIHJldHVybiBhIHN1YnBhdGggaWYgdGhlIG1vZHVsZSBfX3BhdGhfXyBkb2VzIG5vdCBhbHJlYWR5IGNvbnRhaW4gYW4KICAgIGVxdWl2YWxlbnQgc3VicGF0aC4gIEZvciBhbiBleGFtcGxlIG5hbWVzcGFjZSBoYW5kbGVyLCBzZWUKICAgIGBgcGtnX3Jlc291cmNlcy5maWxlX25zX2hhbmRsZXJgYC4KICAgICIiIgogICAgX25hbWVzcGFjZV9oYW5kbGVyc1tpbXBvcnRlcl90eXBlXSA9IG5hbWVzcGFjZV9oYW5kbGVyCgoKZGVmIF9oYW5kbGVfbnMocGFja2FnZU5hbWUsIHBhdGhfaXRlbSk6CiAgICAiIiJFbnN1cmUgdGhhdCBuYW1lZCBwYWNrYWdlIGluY2x1ZGVzIGEgc3VicGF0aCBvZiBwYXRoX2l0ZW0gKGlmIG5lZWRlZCkiIiIKCiAgICBpbXBvcnRlciA9IGdldF9pbXBvcnRlcihwYXRoX2l0ZW0pCiAgICBpZiBpbXBvcnRlciBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZShwYWNrYWdlTmFtZSkKICAgIGlmIGxvYWRlciBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICBtb2R1bGUgPSBzeXMubW9kdWxlcy5nZXQocGFja2FnZU5hbWUpCiAgICBpZiBtb2R1bGUgaXMgTm9uZToKICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1twYWNrYWdlTmFtZV0gPSB0eXBlcy5Nb2R1bGVUeXBlKHBhY2thZ2VOYW1lKQogICAgICAgIG1vZHVsZS5fX3BhdGhfXyA9IFtdCiAgICAgICAgX3NldF9wYXJlbnRfbnMocGFja2FnZU5hbWUpCiAgICBlbGlmIG5vdCBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJOb3QgYSBwYWNrYWdlOiIsIHBhY2thZ2VOYW1lKQogICAgaGFuZGxlciA9IF9maW5kX2FkYXB0ZXIoX25hbWVzcGFjZV9oYW5kbGVycywgaW1wb3J0ZXIpCiAgICBzdWJwYXRoID0gaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKQogICAgaWYgc3VicGF0aCBpcyBub3QgTm9uZToKICAgICAgICBwYXRoID0gbW9kdWxlLl9fcGF0aF9fCiAgICAgICAgcGF0aC5hcHBlbmQoc3VicGF0aCkKICAgICAgICBsb2FkZXIubG9hZF9tb2R1bGUocGFja2FnZU5hbWUpCiAgICAgICAgX3JlYnVpbGRfbW9kX3BhdGgocGF0aCwgcGFja2FnZU5hbWUsIG1vZHVsZSkKICAgIHJldHVybiBzdWJwYXRoCgoKZGVmIF9yZWJ1aWxkX21vZF9wYXRoKG9yaWdfcGF0aCwgcGFja2FnZV9uYW1lLCBtb2R1bGUpOgogICAgIiIiCiAgICBSZWJ1aWxkIG1vZHVsZS5fX3BhdGhfXyBlbnN1cmluZyB0aGF0IGFsbCBlbnRyaWVzIGFyZSBvcmRlcmVkCiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZWlyIHN5cy5wYXRoIG9yZGVyCiAgICAiIiIKICAgIHN5c19wYXRoID0gW19ub3JtYWxpemVfY2FjaGVkKHApIGZvciBwIGluIHN5cy5wYXRoXQoKICAgIGRlZiBzYWZlX3N5c19wYXRoX2luZGV4KGVudHJ5KToKICAgICAgICAiIiIKICAgICAgICBXb3JrYXJvdW5kIGZvciAjNTIwIGFuZCAjNTEzLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN5c19wYXRoLmluZGV4KGVudHJ5KQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gZmxvYXQoJ2luZicpCgogICAgZGVmIHBvc2l0aW9uX2luX3N5c19wYXRoKHBhdGgpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgb3JkaW5hbCBvZiB0aGUgcGF0aCBiYXNlZCBvbiBpdHMgcG9zaXRpb24gaW4gc3lzLnBhdGgKICAgICAgICAiIiIKICAgICAgICBwYXRoX3BhcnRzID0gcGF0aC5zcGxpdChvcy5zZXApCiAgICAgICAgbW9kdWxlX3BhcnRzID0gcGFja2FnZV9uYW1lLmNvdW50KCcuJykgKyAxCiAgICAgICAgcGFydHMgPSBwYXRoX3BhcnRzWzotbW9kdWxlX3BhcnRzXQogICAgICAgIHJldHVybiBzYWZlX3N5c19wYXRoX2luZGV4KF9ub3JtYWxpemVfY2FjaGVkKG9zLnNlcC5qb2luKHBhcnRzKSkpCgogICAgaWYgbm90IGlzaW5zdGFuY2Uob3JpZ19wYXRoLCBsaXN0KToKICAgICAgICAjIElzIHRoaXMgYmVoYXZpb3IgdXNlZnVsIHdoZW4gbW9kdWxlLl9fcGF0aF9fIGlzIG5vdCBhIGxpc3Q/CiAgICAgICAgcmV0dXJuCgogICAgb3JpZ19wYXRoLnNvcnQoa2V5PXBvc2l0aW9uX2luX3N5c19wYXRoKQogICAgbW9kdWxlLl9fcGF0aF9fWzpdID0gW19ub3JtYWxpemVfY2FjaGVkKHApIGZvciBwIGluIG9yaWdfcGF0aF0KCgpkZWYgZGVjbGFyZV9uYW1lc3BhY2UocGFja2FnZU5hbWUpOgogICAgIiIiRGVjbGFyZSB0aGF0IHBhY2thZ2UgJ3BhY2thZ2VOYW1lJyBpcyBhIG5hbWVzcGFjZSBwYWNrYWdlIiIiCgogICAgX2ltcC5hY3F1aXJlX2xvY2soKQogICAgdHJ5OgogICAgICAgIGlmIHBhY2thZ2VOYW1lIGluIF9uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBwYXRoLCBwYXJlbnQgPSBzeXMucGF0aCwgTm9uZQogICAgICAgIGlmICcuJyBpbiBwYWNrYWdlTmFtZToKICAgICAgICAgICAgcGFyZW50ID0gJy4nLmpvaW4ocGFja2FnZU5hbWUuc3BsaXQoJy4nKVs6LTFdKQogICAgICAgICAgICBkZWNsYXJlX25hbWVzcGFjZShwYXJlbnQpCiAgICAgICAgICAgIGlmIHBhcmVudCBub3QgaW4gX25hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgICAgIF9faW1wb3J0X18ocGFyZW50KQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBwYXRoID0gc3lzLm1vZHVsZXNbcGFyZW50XS5fX3BhdGhfXwogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5vdCBhIHBhY2thZ2U6IiwgcGFyZW50KQoKICAgICAgICAjIFRyYWNrIHdoYXQgcGFja2FnZXMgYXJlIG5hbWVzcGFjZXMsIHNvIHdoZW4gbmV3IHBhdGggaXRlbXMgYXJlIGFkZGVkLAogICAgICAgICMgdGhleSBjYW4gYmUgdXBkYXRlZAogICAgICAgIF9uYW1lc3BhY2VfcGFja2FnZXMuc2V0ZGVmYXVsdChwYXJlbnQsIFtdKS5hcHBlbmQocGFja2FnZU5hbWUpCiAgICAgICAgX25hbWVzcGFjZV9wYWNrYWdlcy5zZXRkZWZhdWx0KHBhY2thZ2VOYW1lLCBbXSkKCiAgICAgICAgZm9yIHBhdGhfaXRlbSBpbiBwYXRoOgogICAgICAgICAgICAjIEVuc3VyZSBhbGwgdGhlIHBhcmVudCdzIHBhdGggaXRlbXMgYXJlIHJlZmxlY3RlZCBpbiB0aGUgY2hpbGQsCiAgICAgICAgICAgICMgaWYgdGhleSBhcHBseQogICAgICAgICAgICBfaGFuZGxlX25zKHBhY2thZ2VOYW1lLCBwYXRoX2l0ZW0pCgogICAgZmluYWxseToKICAgICAgICBfaW1wLnJlbGVhc2VfbG9jaygpCgoKZGVmIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhwYXRoX2l0ZW0sIHBhcmVudD1Ob25lKToKICAgICIiIkVuc3VyZSB0aGF0IHByZXZpb3VzbHktZGVjbGFyZWQgbmFtZXNwYWNlIHBhY2thZ2VzIGluY2x1ZGUgcGF0aF9pdGVtIiIiCiAgICBfaW1wLmFjcXVpcmVfbG9jaygpCiAgICB0cnk6CiAgICAgICAgZm9yIHBhY2thZ2UgaW4gX25hbWVzcGFjZV9wYWNrYWdlcy5nZXQocGFyZW50LCAoKSk6CiAgICAgICAgICAgIHN1YnBhdGggPSBfaGFuZGxlX25zKHBhY2thZ2UsIHBhdGhfaXRlbSkKICAgICAgICAgICAgaWYgc3VicGF0aDoKICAgICAgICAgICAgICAgIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhzdWJwYXRoLCBwYWNrYWdlKQogICAgZmluYWxseToKICAgICAgICBfaW1wLnJlbGVhc2VfbG9jaygpCgoKZGVmIGZpbGVfbnNfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKToKICAgICIiIkNvbXB1dGUgYW4gbnMtcGFja2FnZSBzdWJwYXRoIGZvciBhIGZpbGVzeXN0ZW0gb3IgemlwZmlsZSBpbXBvcnRlciIiIgoKICAgIHN1YnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBwYWNrYWdlTmFtZS5zcGxpdCgnLicpWy0xXSkKICAgIG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplX2NhY2hlZChzdWJwYXRoKQogICAgZm9yIGl0ZW0gaW4gbW9kdWxlLl9fcGF0aF9fOgogICAgICAgIGlmIF9ub3JtYWxpemVfY2FjaGVkKGl0ZW0pID09IG5vcm1hbGl6ZWQ6CiAgICAgICAgICAgIGJyZWFrCiAgICBlbHNlOgogICAgICAgICMgT25seSByZXR1cm4gdGhlIHBhdGggaWYgaXQncyBub3QgYWxyZWFkeSB0aGVyZQogICAgICAgIHJldHVybiBzdWJwYXRoCgoKcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIocGtndXRpbC5JbXBJbXBvcnRlciwgZmlsZV9uc19oYW5kbGVyKQpyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcih6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIGZpbGVfbnNfaGFuZGxlcikKCmlmIGhhc2F0dHIoaW1wb3J0bGliX21hY2hpbmVyeSwgJ0ZpbGVGaW5kZXInKToKICAgIHJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGxpYl9tYWNoaW5lcnkuRmlsZUZpbmRlciwgZmlsZV9uc19oYW5kbGVyKQoKCmRlZiBudWxsX25zX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSk6CiAgICByZXR1cm4gTm9uZQoKCnJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKG9iamVjdCwgbnVsbF9uc19oYW5kbGVyKQoKCmRlZiBub3JtYWxpemVfcGF0aChmaWxlbmFtZSk6CiAgICAiIiJOb3JtYWxpemUgYSBmaWxlL2RpciBuYW1lIGZvciBjb21wYXJpc29uIHB1cnBvc2VzIiIiCiAgICByZXR1cm4gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKGZpbGVuYW1lKSkKCgpkZWYgX25vcm1hbGl6ZV9jYWNoZWQoZmlsZW5hbWUsIF9jYWNoZT17fSk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIF9jYWNoZVtmaWxlbmFtZV0KICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBfY2FjaGVbZmlsZW5hbWVdID0gcmVzdWx0ID0gbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfaXNfZWdnX3BhdGgocGF0aCk6CiAgICAiIiIKICAgIERldGVybWluZSBpZiBnaXZlbiBwYXRoIGFwcGVhcnMgdG8gYmUgYW4gZWdnLgogICAgIiIiCiAgICByZXR1cm4gcGF0aC5sb3dlcigpLmVuZHN3aXRoKCcuZWdnJykKCgpkZWYgX2lzX3VucGFja2VkX2VnZyhwYXRoKToKICAgICIiIgogICAgRGV0ZXJtaW5lIGlmIGdpdmVuIHBhdGggYXBwZWFycyB0byBiZSBhbiB1bnBhY2tlZCBlZ2cuCiAgICAiIiIKICAgIHJldHVybiAoCiAgICAgICAgX2lzX2VnZ19wYXRoKHBhdGgpIGFuZAogICAgICAgIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihwYXRoLCAnRUdHLUlORk8nLCAnUEtHLUlORk8nKSkKICAgICkKCgpkZWYgX3NldF9wYXJlbnRfbnMocGFja2FnZU5hbWUpOgogICAgcGFydHMgPSBwYWNrYWdlTmFtZS5zcGxpdCgnLicpCiAgICBuYW1lID0gcGFydHMucG9wKCkKICAgIGlmIHBhcnRzOgogICAgICAgIHBhcmVudCA9ICcuJy5qb2luKHBhcnRzKQogICAgICAgIHNldGF0dHIoc3lzLm1vZHVsZXNbcGFyZW50XSwgbmFtZSwgc3lzLm1vZHVsZXNbcGFja2FnZU5hbWVdKQoKCmRlZiB5aWVsZF9saW5lcyhzdHJzKToKICAgICIiIllpZWxkIG5vbi1lbXB0eS9ub24tY29tbWVudCBsaW5lcyBvZiBhIHN0cmluZyBvciBzZXF1ZW5jZSIiIgogICAgaWYgaXNpbnN0YW5jZShzdHJzLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICBmb3IgcyBpbiBzdHJzLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgcyA9IHMuc3RyaXAoKQogICAgICAgICAgICAjIHNraXAgYmxhbmsgbGluZXMvY29tbWVudHMKICAgICAgICAgICAgaWYgcyBhbmQgbm90IHMuc3RhcnRzd2l0aCgnIycpOgogICAgICAgICAgICAgICAgeWllbGQgcwogICAgZWxzZToKICAgICAgICBmb3Igc3MgaW4gc3RyczoKICAgICAgICAgICAgZm9yIHMgaW4geWllbGRfbGluZXMoc3MpOgogICAgICAgICAgICAgICAgeWllbGQgcwoKCk1PRFVMRSA9IHJlLmNvbXBpbGUociJcdysoXC5cdyspKiQiKS5tYXRjaApFR0dfTkFNRSA9IHJlLmNvbXBpbGUoCiAgICByIiIiCiAgICAoP1A8bmFtZT5bXi1dKykgKAogICAgICAgIC0oP1A8dmVyPlteLV0rKSAoCiAgICAgICAgICAgIC1weSg/UDxweXZlcj5bXi1dKykgKAogICAgICAgICAgICAgICAgLSg/UDxwbGF0Pi4rKQogICAgICAgICAgICApPwogICAgICAgICk/CiAgICApPwogICAgIiIiLAogICAgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UsCikubWF0Y2gKCgpjbGFzcyBFbnRyeVBvaW50KG9iamVjdCk6CiAgICAiIiJPYmplY3QgcmVwcmVzZW50aW5nIGFuIGFkdmVydGlzZWQgaW1wb3J0YWJsZSBvYmplY3QiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kdWxlX25hbWUsIGF0dHJzPSgpLCBleHRyYXM9KCksIGRpc3Q9Tm9uZSk6CiAgICAgICAgaWYgbm90IE1PRFVMRShtb2R1bGVfbmFtZSk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgbW9kdWxlIG5hbWUiLCBtb2R1bGVfbmFtZSkKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5tb2R1bGVfbmFtZSA9IG1vZHVsZV9uYW1lCiAgICAgICAgc2VsZi5hdHRycyA9IHR1cGxlKGF0dHJzKQogICAgICAgIHNlbGYuZXh0cmFzID0gdHVwbGUoZXh0cmFzKQogICAgICAgIHNlbGYuZGlzdCA9IGRpc3QKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBzID0gIiVzID0gJXMiICUgKHNlbGYubmFtZSwgc2VsZi5tb2R1bGVfbmFtZSkKICAgICAgICBpZiBzZWxmLmF0dHJzOgogICAgICAgICAgICBzICs9ICc6JyArICcuJy5qb2luKHNlbGYuYXR0cnMpCiAgICAgICAgaWYgc2VsZi5leHRyYXM6CiAgICAgICAgICAgIHMgKz0gJyBbJXNdJyAlICcsJy5qb2luKHNlbGYuZXh0cmFzKQogICAgICAgIHJldHVybiBzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiRW50cnlQb2ludC5wYXJzZSglcikiICUgc3RyKHNlbGYpCgogICAgZGVmIGxvYWQoc2VsZiwgcmVxdWlyZT1UcnVlLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIFJlcXVpcmUgcGFja2FnZXMgZm9yIHRoaXMgRW50cnlQb2ludCwgdGhlbiByZXNvbHZlIGl0LgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCByZXF1aXJlIG9yIGFyZ3Mgb3Iga3dhcmdzOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIlBhcmFtZXRlcnMgdG8gbG9hZCBhcmUgZGVwcmVjYXRlZC4gIENhbGwgLnJlc29sdmUgYW5kICIKICAgICAgICAgICAgICAgICIucmVxdWlyZSBzZXBhcmF0ZWx5LiIsCiAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCiAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIsCiAgICAgICAgICAgICkKICAgICAgICBpZiByZXF1aXJlOgogICAgICAgICAgICBzZWxmLnJlcXVpcmUoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHJldHVybiBzZWxmLnJlc29sdmUoKQoKICAgIGRlZiByZXNvbHZlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlc29sdmUgdGhlIGVudHJ5IHBvaW50IGZyb20gaXRzIG1vZHVsZSBhbmQgYXR0cnMuCiAgICAgICAgIiIiCiAgICAgICAgbW9kdWxlID0gX19pbXBvcnRfXyhzZWxmLm1vZHVsZV9uYW1lLCBmcm9tbGlzdD1bJ19fbmFtZV9fJ10sIGxldmVsPTApCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gZnVuY3Rvb2xzLnJlZHVjZShnZXRhdHRyLCBzZWxmLmF0dHJzLCBtb2R1bGUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3Ioc3RyKGV4YykpCgogICAgZGVmIHJlcXVpcmUoc2VsZiwgZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lKToKICAgICAgICBpZiBzZWxmLmV4dHJhcyBhbmQgbm90IHNlbGYuZGlzdDoKICAgICAgICAgICAgcmFpc2UgVW5rbm93bkV4dHJhKCJDYW4ndCByZXF1aXJlKCkgd2l0aG91dCBhIGRpc3RyaWJ1dGlvbiIsIHNlbGYpCgogICAgICAgICMgR2V0IHRoZSByZXF1aXJlbWVudHMgZm9yIHRoaXMgZW50cnkgcG9pbnQgd2l0aCBhbGwgaXRzIGV4dHJhcyBhbmQKICAgICAgICAjIHRoZW4gcmVzb2x2ZSB0aGVtLiBXZSBoYXZlIHRvIHBhc3MgYGV4dHJhc2AgYWxvbmcgd2hlbiByZXNvbHZpbmcgc28KICAgICAgICAjIHRoYXQgdGhlIHdvcmtpbmcgc2V0IGtub3dzIHdoYXQgZXh0cmFzIHdlIHdhbnQuIE90aGVyd2lzZSwgZm9yCiAgICAgICAgIyBkaXN0LWluZm8gZGlzdHJpYnV0aW9ucywgdGhlIHdvcmtpbmcgc2V0IHdpbGwgYXNzdW1lIHRoYXQgdGhlCiAgICAgICAgIyByZXF1aXJlbWVudHMgZm9yIHRoYXQgZXh0cmEgYXJlIHB1cmVseSBvcHRpb25hbCBhbmQgc2tpcCBvdmVyIHRoZW0uCiAgICAgICAgcmVxcyA9IHNlbGYuZGlzdC5yZXF1aXJlcyhzZWxmLmV4dHJhcykKICAgICAgICBpdGVtcyA9IHdvcmtpbmdfc2V0LnJlc29sdmUocmVxcywgZW52LCBpbnN0YWxsZXIsIGV4dHJhcz1zZWxmLmV4dHJhcykKICAgICAgICBsaXN0KG1hcCh3b3JraW5nX3NldC5hZGQsIGl0ZW1zKSkKCiAgICBwYXR0ZXJuID0gcmUuY29tcGlsZSgKICAgICAgICByJ1xzKicKICAgICAgICByJyg/UDxuYW1lPi4rPylccyonCiAgICAgICAgcic9XHMqJwogICAgICAgIHInKD9QPG1vZHVsZT5bXHcuXSspXHMqJwogICAgICAgIHInKDpccyooP1A8YXR0cj5bXHcuXSspKT9ccyonCiAgICAgICAgcicoP1A8ZXh0cmFzPlxbLipcXSk/XHMqJCcKICAgICkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBwYXJzZShjbHMsIHNyYywgZGlzdD1Ob25lKToKICAgICAgICAiIiJQYXJzZSBhIHNpbmdsZSBlbnRyeSBwb2ludCBmcm9tIHN0cmluZyBgc3JjYAoKICAgICAgICBFbnRyeSBwb2ludCBzeW50YXggZm9sbG93cyB0aGUgZm9ybTo6CgogICAgICAgICAgICBuYW1lID0gc29tZS5tb2R1bGU6c29tZS5hdHRyIFtleHRyYTEsIGV4dHJhMl0KCiAgICAgICAgVGhlIGVudHJ5IG5hbWUgYW5kIG1vZHVsZSBuYW1lIGFyZSByZXF1aXJlZCwgYnV0IHRoZSBgYDphdHRyc2BgIGFuZAogICAgICAgIGBgW2V4dHJhc11gYCBwYXJ0cyBhcmUgb3B0aW9uYWwKICAgICAgICAiIiIKICAgICAgICBtID0gY2xzLnBhdHRlcm4ubWF0Y2goc3JjKQogICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICBtc2cgPSAiRW50cnlQb2ludCBtdXN0IGJlIGluICduYW1lPW1vZHVsZTphdHRycyBbZXh0cmFzXScgZm9ybWF0IgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZywgc3JjKQogICAgICAgIHJlcyA9IG0uZ3JvdXBkaWN0KCkKICAgICAgICBleHRyYXMgPSBjbHMuX3BhcnNlX2V4dHJhcyhyZXNbJ2V4dHJhcyddKQogICAgICAgIGF0dHJzID0gcmVzWydhdHRyJ10uc3BsaXQoJy4nKSBpZiByZXNbJ2F0dHInXSBlbHNlICgpCiAgICAgICAgcmV0dXJuIGNscyhyZXNbJ25hbWUnXSwgcmVzWydtb2R1bGUnXSwgYXR0cnMsIGV4dHJhcywgZGlzdCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfZXh0cmFzKGNscywgZXh0cmFzX3NwZWMpOgogICAgICAgIGlmIG5vdCBleHRyYXNfc3BlYzoKICAgICAgICAgICAgcmV0dXJuICgpCiAgICAgICAgcmVxID0gUmVxdWlyZW1lbnQucGFyc2UoJ3gnICsgZXh0cmFzX3NwZWMpCiAgICAgICAgaWYgcmVxLnNwZWNzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCkKICAgICAgICByZXR1cm4gcmVxLmV4dHJhcwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHBhcnNlX2dyb3VwKGNscywgZ3JvdXAsIGxpbmVzLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGFuIGVudHJ5IHBvaW50IGdyb3VwIiIiCiAgICAgICAgaWYgbm90IE1PRFVMRShncm91cCk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZ3JvdXAgbmFtZSIsIGdyb3VwKQogICAgICAgIHRoaXMgPSB7fQogICAgICAgIGZvciBsaW5lIGluIHlpZWxkX2xpbmVzKGxpbmVzKToKICAgICAgICAgICAgZXAgPSBjbHMucGFyc2UobGluZSwgZGlzdCkKICAgICAgICAgICAgaWYgZXAubmFtZSBpbiB0aGlzOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRHVwbGljYXRlIGVudHJ5IHBvaW50IiwgZ3JvdXAsIGVwLm5hbWUpCiAgICAgICAgICAgIHRoaXNbZXAubmFtZV0gPSBlcAogICAgICAgIHJldHVybiB0aGlzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgcGFyc2VfbWFwKGNscywgZGF0YSwgZGlzdD1Ob25lKToKICAgICAgICAiIiJQYXJzZSBhIG1hcCBvZiBlbnRyeSBwb2ludCBncm91cHMiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIGRpY3QpOgogICAgICAgICAgICBkYXRhID0gZGF0YS5pdGVtcygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGF0YSA9IHNwbGl0X3NlY3Rpb25zKGRhdGEpCiAgICAgICAgbWFwcyA9IHt9CiAgICAgICAgZm9yIGdyb3VwLCBsaW5lcyBpbiBkYXRhOgogICAgICAgICAgICBpZiBncm91cCBpcyBOb25lOgogICAgICAgICAgICAgICAgaWYgbm90IGxpbmVzOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFbnRyeSBwb2ludHMgbXVzdCBiZSBsaXN0ZWQgaW4gZ3JvdXBzIikKICAgICAgICAgICAgZ3JvdXAgPSBncm91cC5zdHJpcCgpCiAgICAgICAgICAgIGlmIGdyb3VwIGluIG1hcHM6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEdXBsaWNhdGUgZ3JvdXAgbmFtZSIsIGdyb3VwKQogICAgICAgICAgICBtYXBzW2dyb3VwXSA9IGNscy5wYXJzZV9ncm91cChncm91cCwgbGluZXMsIGRpc3QpCiAgICAgICAgcmV0dXJuIG1hcHMKCgpkZWYgX3JlbW92ZV9tZDVfZnJhZ21lbnQobG9jYXRpb24pOgogICAgaWYgbm90IGxvY2F0aW9uOgogICAgICAgIHJldHVybiAnJwogICAgcGFyc2VkID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKGxvY2F0aW9uKQogICAgaWYgcGFyc2VkWy0xXS5zdGFydHN3aXRoKCdtZDU9Jyk6CiAgICAgICAgcmV0dXJuIHVybGxpYi5wYXJzZS51cmx1bnBhcnNlKHBhcnNlZFs6LTFdICsgKCcnLCkpCiAgICByZXR1cm4gbG9jYXRpb24KCgpkZWYgX3ZlcnNpb25fZnJvbV9maWxlKGxpbmVzKToKICAgICIiIgogICAgR2l2ZW4gYW4gaXRlcmFibGUgb2YgbGluZXMgZnJvbSBhIE1ldGFkYXRhIGZpbGUsIHJldHVybgogICAgdGhlIHZhbHVlIG9mIHRoZSBWZXJzaW9uIGZpZWxkLCBpZiBwcmVzZW50LCBvciBOb25lIG90aGVyd2lzZS4KICAgICIiIgogICAgaXNfdmVyc2lvbl9saW5lID0gbGFtYmRhIGxpbmU6IGxpbmUubG93ZXIoKS5zdGFydHN3aXRoKCd2ZXJzaW9uOicpCiAgICB2ZXJzaW9uX2xpbmVzID0gZmlsdGVyKGlzX3ZlcnNpb25fbGluZSwgbGluZXMpCiAgICBsaW5lID0gbmV4dChpdGVyKHZlcnNpb25fbGluZXMpLCAnJykKICAgIF8sIF8sIHZhbHVlID0gbGluZS5wYXJ0aXRpb24oJzonKQogICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2YWx1ZS5zdHJpcCgpKSBvciBOb25lCgoKY2xhc3MgRGlzdHJpYnV0aW9uKG9iamVjdCk6CiAgICAiIiJXcmFwIGFuIGFjdHVhbCBvciBwb3RlbnRpYWwgc3lzLnBhdGggZW50cnkgdy9tZXRhZGF0YSIiIgogICAgUEtHX0lORk8gPSAnUEtHLUlORk8nCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLCBsb2NhdGlvbj1Ob25lLCBtZXRhZGF0YT1Ob25lLCBwcm9qZWN0X25hbWU9Tm9uZSwKICAgICAgICAgICAgdmVyc2lvbj1Ob25lLCBweV92ZXJzaW9uPVBZX01BSk9SLCBwbGF0Zm9ybT1Ob25lLAogICAgICAgICAgICBwcmVjZWRlbmNlPUVHR19ESVNUKToKICAgICAgICBzZWxmLnByb2plY3RfbmFtZSA9IHNhZmVfbmFtZShwcm9qZWN0X25hbWUgb3IgJ1Vua25vd24nKQogICAgICAgIGlmIHZlcnNpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24gPSBzYWZlX3ZlcnNpb24odmVyc2lvbikKICAgICAgICBzZWxmLnB5X3ZlcnNpb24gPSBweV92ZXJzaW9uCiAgICAgICAgc2VsZi5wbGF0Zm9ybSA9IHBsYXRmb3JtCiAgICAgICAgc2VsZi5sb2NhdGlvbiA9IGxvY2F0aW9uCiAgICAgICAgc2VsZi5wcmVjZWRlbmNlID0gcHJlY2VkZW5jZQogICAgICAgIHNlbGYuX3Byb3ZpZGVyID0gbWV0YWRhdGEgb3IgZW1wdHlfcHJvdmlkZXIKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2xvY2F0aW9uKGNscywgbG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YT1Ob25lLCAqKmt3KToKICAgICAgICBwcm9qZWN0X25hbWUsIHZlcnNpb24sIHB5X3ZlcnNpb24sIHBsYXRmb3JtID0gW05vbmVdICogNAogICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKQogICAgICAgIGlmIGV4dC5sb3dlcigpIGluIF9kaXN0cmlidXRpb25JbXBsOgogICAgICAgICAgICBjbHMgPSBfZGlzdHJpYnV0aW9uSW1wbFtleHQubG93ZXIoKV0KCiAgICAgICAgICAgIG1hdGNoID0gRUdHX05BTUUoYmFzZW5hbWUpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lLCB2ZXJzaW9uLCBweV92ZXJzaW9uLCBwbGF0Zm9ybSA9IG1hdGNoLmdyb3VwKAogICAgICAgICAgICAgICAgICAgICduYW1lJywgJ3ZlcicsICdweXZlcicsICdwbGF0JwogICAgICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBjbHMoCiAgICAgICAgICAgIGxvY2F0aW9uLCBtZXRhZGF0YSwgcHJvamVjdF9uYW1lPXByb2plY3RfbmFtZSwgdmVyc2lvbj12ZXJzaW9uLAogICAgICAgICAgICBweV92ZXJzaW9uPXB5X3ZlcnNpb24sIHBsYXRmb3JtPXBsYXRmb3JtLCAqKmt3CiAgICAgICAgKS5fcmVsb2FkX3ZlcnNpb24oKQoKICAgIGRlZiBfcmVsb2FkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBAcHJvcGVydHkKICAgIGRlZiBoYXNoY21wKHNlbGYpOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIHNlbGYucGFyc2VkX3ZlcnNpb24sCiAgICAgICAgICAgIHNlbGYucHJlY2VkZW5jZSwKICAgICAgICAgICAgc2VsZi5rZXksCiAgICAgICAgICAgIF9yZW1vdmVfbWQ1X2ZyYWdtZW50KHNlbGYubG9jYXRpb24pLAogICAgICAgICAgICBzZWxmLnB5X3ZlcnNpb24gb3IgJycsCiAgICAgICAgICAgIHNlbGYucGxhdGZvcm0gb3IgJycsCiAgICAgICAgKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLmhhc2hjbXApCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA8IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wIDw9IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wID4gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPj0gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CiAgICAgICAgICAgICMgSXQncyBub3QgYSBEaXN0cmlidXRpb24sIHNvIHRoZXkgYXJlIG5vdCBlcXVhbAogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wID09IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKCiAgICAjIFRoZXNlIHByb3BlcnRpZXMgaGF2ZSB0byBiZSBsYXp5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBsb2FkIGFueQogICAgIyBtZXRhZGF0YSB1bnRpbC91bmxlc3MgaXQncyBhY3R1YWxseSBuZWVkZWQuICAoaS5lLiwgc29tZSBkaXN0cmlidXRpb25zCiAgICAjIG1heSBub3Qga25vdyB0aGVpciBuYW1lIG9yIHZlcnNpb24gd2l0aG91dCBsb2FkaW5nIFBLRy1JTkZPKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGtleShzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9rZXkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuX2tleSA9IGtleSA9IHNlbGYucHJvamVjdF9uYW1lLmxvd2VyKCkKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhcnNlZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICJfcGFyc2VkX3ZlcnNpb24iKToKICAgICAgICAgICAgc2VsZi5fcGFyc2VkX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHNlbGYudmVyc2lvbikKCiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlZF92ZXJzaW9uCgogICAgZGVmIF93YXJuX2xlZ2FjeV92ZXJzaW9uKHNlbGYpOgogICAgICAgIExWID0gcGFja2FnaW5nLnZlcnNpb24uTGVnYWN5VmVyc2lvbgogICAgICAgIGlzX2xlZ2FjeSA9IGlzaW5zdGFuY2Uoc2VsZi5fcGFyc2VkX3ZlcnNpb24sIExWKQogICAgICAgIGlmIG5vdCBpc19sZWdhY3k6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFdoaWxlIGFuIGVtcHR5IHZlcnNpb24gaXMgdGVjaG5pY2FsbHkgYSBsZWdhY3kgdmVyc2lvbiBhbmQKICAgICAgICAjIGlzIG5vdCBhIHZhbGlkIFBFUCA0NDAgdmVyc2lvbiwgaXQncyBhbHNvIHVubGlrZWx5IHRvCiAgICAgICAgIyBhY3R1YWxseSBjb21lIGZyb20gc29tZW9uZSBhbmQgaW5zdGVhZCBpdCBpcyBtb3JlIGxpa2VseSB0aGF0CiAgICAgICAgIyBpdCBjb21lcyBmcm9tIHNldHVwdG9vbHMgYXR0ZW1wdGluZyB0byBwYXJzZSBhIGZpbGVuYW1lIGFuZAogICAgICAgICMgaW5jbHVkaW5nIGl0IGluIHRoZSBsaXN0LiBTbyBmb3IgdGhhdCB3ZSdsbCBnYXRlIHRoaXMgd2FybmluZwogICAgICAgICMgb24gaWYgdGhlIHZlcnNpb24gaXMgYW55dGhpbmcgYXQgYWxsIG9yIG5vdC4KICAgICAgICBpZiBub3Qgc2VsZi52ZXJzaW9uOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgdG1wbCA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICAgICAgJ3twcm9qZWN0X25hbWV9ICh7dmVyc2lvbn0pJyBpcyBiZWluZyBwYXJzZWQgYXMgYSBsZWdhY3ksCiAgICAgICAgICAgIG5vbiBQRVAgNDQwLAogICAgICAgICAgICB2ZXJzaW9uLiBZb3UgbWF5IGZpbmQgb2RkIGJlaGF2aW9yIGFuZCBzb3J0IG9yZGVyLgogICAgICAgICAgICBJbiBwYXJ0aWN1bGFyIGl0IHdpbGwgYmUgc29ydGVkIGFzIGxlc3MgdGhhbiAwLjAuIEl0CiAgICAgICAgICAgIGlzIHJlY29tbWVuZGVkIHRvIG1pZ3JhdGUgdG8gUEVQIDQ0MCBjb21wYXRpYmxlCiAgICAgICAgICAgIHZlcnNpb25zLgogICAgICAgICAgICAiIiIpLnN0cmlwKCkucmVwbGFjZSgnXG4nLCAnICcpCgogICAgICAgIHdhcm5pbmdzLndhcm4odG1wbC5mb3JtYXQoKip2YXJzKHNlbGYpKSwgUEVQNDQwV2FybmluZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHZlcnNpb24gPSBfdmVyc2lvbl9mcm9tX2ZpbGUoc2VsZi5fZ2V0X21ldGFkYXRhKHNlbGYuUEtHX0lORk8pKQogICAgICAgICAgICBpZiB2ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAgICB0bXBsID0gIk1pc3NpbmcgJ1ZlcnNpb246JyBoZWFkZXIgYW5kL29yICVzIGZpbGUiCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKHRtcGwgJSBzZWxmLlBLR19JTkZPLCBzZWxmKQogICAgICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9kZXBfbWFwKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZXBfbWFwCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBkbSA9IHNlbGYuX19kZXBfbWFwID0ge05vbmU6IFtdfQogICAgICAgICAgICBmb3IgbmFtZSBpbiAncmVxdWlyZXMudHh0JywgJ2RlcGVuZHMudHh0JzoKICAgICAgICAgICAgICAgIGZvciBleHRyYSwgcmVxcyBpbiBzcGxpdF9zZWN0aW9ucyhzZWxmLl9nZXRfbWV0YWRhdGEobmFtZSkpOgogICAgICAgICAgICAgICAgICAgIGlmIGV4dHJhOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAnOicgaW4gZXh0cmE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYSwgbWFya2VyID0gZXh0cmEuc3BsaXQoJzonLCAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaW52YWxpZF9tYXJrZXIobWFya2VyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFhYWCB3YXJuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxcyA9IFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG5vdCBldmFsdWF0ZV9tYXJrZXIobWFya2VyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFzID0gW10KICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEgPSBzYWZlX2V4dHJhKGV4dHJhKSBvciBOb25lCiAgICAgICAgICAgICAgICAgICAgZG0uc2V0ZGVmYXVsdChleHRyYSwgW10pLmV4dGVuZChwYXJzZV9yZXF1aXJlbWVudHMocmVxcykpCiAgICAgICAgICAgIHJldHVybiBkbQoKICAgIGRlZiByZXF1aXJlcyhzZWxmLCBleHRyYXM9KCkpOgogICAgICAgICIiIkxpc3Qgb2YgUmVxdWlyZW1lbnRzIG5lZWRlZCBmb3IgdGhpcyBkaXN0cm8gaWYgYGV4dHJhc2AgYXJlIHVzZWQiIiIKICAgICAgICBkbSA9IHNlbGYuX2RlcF9tYXAKICAgICAgICBkZXBzID0gW10KICAgICAgICBkZXBzLmV4dGVuZChkbS5nZXQoTm9uZSwgKCkpKQogICAgICAgIGZvciBleHQgaW4gZXh0cmFzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBkZXBzLmV4dGVuZChkbVtzYWZlX2V4dHJhKGV4dCldKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBVbmtub3duRXh0cmEoCiAgICAgICAgICAgICAgICAgICAgIiVzIGhhcyBubyBzdWNoIGV4dHJhIGZlYXR1cmUgJXIiICUgKHNlbGYsIGV4dCkKICAgICAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gZGVwcwoKICAgIGRlZiBfZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIHNlbGYuaGFzX21ldGFkYXRhKG5hbWUpOgogICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmdldF9tZXRhZGF0YV9saW5lcyhuYW1lKToKICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKCiAgICBkZWYgYWN0aXZhdGUoc2VsZiwgcGF0aD1Ob25lLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAiIiJFbnN1cmUgZGlzdHJpYnV0aW9uIGlzIGltcG9ydGFibGUgb24gYHBhdGhgIChkZWZhdWx0PXN5cy5wYXRoKSIiIgogICAgICAgIGlmIHBhdGggaXMgTm9uZToKICAgICAgICAgICAgcGF0aCA9IHN5cy5wYXRoCiAgICAgICAgc2VsZi5pbnNlcnRfb24ocGF0aCwgcmVwbGFjZT1yZXBsYWNlKQogICAgICAgIGlmIHBhdGggaXMgc3lzLnBhdGg6CiAgICAgICAgICAgIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhzZWxmLmxvY2F0aW9uKQogICAgICAgICAgICBmb3IgcGtnIGluIHNlbGYuX2dldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpOgogICAgICAgICAgICAgICAgaWYgcGtnIGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICAgICAgICAgIGRlY2xhcmVfbmFtZXNwYWNlKHBrZykKCiAgICBkZWYgZWdnX25hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHdoYXQgdGhpcyBkaXN0cmlidXRpb24ncyBzdGFuZGFyZCAuZWdnIGZpbGVuYW1lIHNob3VsZCBiZSIiIgogICAgICAgIGZpbGVuYW1lID0gIiVzLSVzLXB5JXMiICUgKAogICAgICAgICAgICB0b19maWxlbmFtZShzZWxmLnByb2plY3RfbmFtZSksIHRvX2ZpbGVuYW1lKHNlbGYudmVyc2lvbiksCiAgICAgICAgICAgIHNlbGYucHlfdmVyc2lvbiBvciBQWV9NQUpPUgogICAgICAgICkKCiAgICAgICAgaWYgc2VsZi5wbGF0Zm9ybToKICAgICAgICAgICAgZmlsZW5hbWUgKz0gJy0nICsgc2VsZi5wbGF0Zm9ybQogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBpZiBzZWxmLmxvY2F0aW9uOgogICAgICAgICAgICByZXR1cm4gIiVzICglcykiICUgKHNlbGYsIHNlbGYubG9jYXRpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgdmVyc2lvbiA9IGdldGF0dHIoc2VsZiwgJ3ZlcnNpb24nLCBOb25lKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICB2ZXJzaW9uID0gTm9uZQogICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uIG9yICJbdW5rbm93biB2ZXJzaW9uXSIKICAgICAgICByZXR1cm4gIiVzICVzIiAlIChzZWxmLnByb2plY3RfbmFtZSwgdmVyc2lvbikKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CiAgICAgICAgIiIiRGVsZWdhdGUgYWxsIHVucmVjb2duaXplZCBwdWJsaWMgYXR0cmlidXRlcyB0byAubWV0YWRhdGEgcHJvdmlkZXIiIiIKICAgICAgICBpZiBhdHRyLnN0YXJ0c3dpdGgoJ18nKToKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoYXR0cikKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9wcm92aWRlciwgYXR0cikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2ZpbGVuYW1lKGNscywgZmlsZW5hbWUsIG1ldGFkYXRhPU5vbmUsICoqa3cpOgogICAgICAgIHJldHVybiBjbHMuZnJvbV9sb2NhdGlvbigKICAgICAgICAgICAgX25vcm1hbGl6ZV9jYWNoZWQoZmlsZW5hbWUpLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgbWV0YWRhdGEsCiAgICAgICAgICAgICoqa3cKICAgICAgICApCgogICAgZGVmIGFzX3JlcXVpcmVtZW50KHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIGBgUmVxdWlyZW1lbnRgYCB0aGF0IG1hdGNoZXMgdGhpcyBkaXN0cmlidXRpb24gZXhhY3RseSIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5wYXJzZWRfdmVyc2lvbiwgcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbik6CiAgICAgICAgICAgIHNwZWMgPSAiJXM9PSVzIiAlIChzZWxmLnByb2plY3RfbmFtZSwgc2VsZi5wYXJzZWRfdmVyc2lvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzcGVjID0gIiVzPT09JXMiICUgKHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLnBhcnNlZF92ZXJzaW9uKQoKICAgICAgICByZXR1cm4gUmVxdWlyZW1lbnQucGFyc2Uoc3BlYykKCiAgICBkZWYgbG9hZF9lbnRyeV9wb2ludChzZWxmLCBncm91cCwgbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBgbmFtZWAgZW50cnkgcG9pbnQgb2YgYGdyb3VwYCBvciByYWlzZSBJbXBvcnRFcnJvciIiIgogICAgICAgIGVwID0gc2VsZi5nZXRfZW50cnlfaW5mbyhncm91cCwgbmFtZSkKICAgICAgICBpZiBlcCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiRW50cnkgcG9pbnQgJXIgbm90IGZvdW5kIiAlICgoZ3JvdXAsIG5hbWUpLCkpCiAgICAgICAgcmV0dXJuIGVwLmxvYWQoKQoKICAgIGRlZiBnZXRfZW50cnlfbWFwKHNlbGYsIGdyb3VwPU5vbmUpOgogICAgICAgICIiIlJldHVybiB0aGUgZW50cnkgcG9pbnQgbWFwIGZvciBgZ3JvdXBgLCBvciB0aGUgZnVsbCBlbnRyeSBtYXAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGVwX21hcCA9IHNlbGYuX2VwX21hcAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgZXBfbWFwID0gc2VsZi5fZXBfbWFwID0gRW50cnlQb2ludC5wYXJzZV9tYXAoCiAgICAgICAgICAgICAgICBzZWxmLl9nZXRfbWV0YWRhdGEoJ2VudHJ5X3BvaW50cy50eHQnKSwgc2VsZgogICAgICAgICAgICApCiAgICAgICAgaWYgZ3JvdXAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBlcF9tYXAuZ2V0KGdyb3VwLCB7fSkKICAgICAgICByZXR1cm4gZXBfbWFwCgogICAgZGVmIGdldF9lbnRyeV9pbmZvKHNlbGYsIGdyb3VwLCBuYW1lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIEVudHJ5UG9pbnQgb2JqZWN0IGZvciBgZ3JvdXBgK2BuYW1lYCwgb3IgYGBOb25lYGAiIiIKICAgICAgICByZXR1cm4gc2VsZi5nZXRfZW50cnlfbWFwKGdyb3VwKS5nZXQobmFtZSkKCiAgICBkZWYgaW5zZXJ0X29uKHNlbGYsIHBhdGgsIGxvYz1Ob25lLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAiIiJFbnN1cmUgc2VsZi5sb2NhdGlvbiBpcyBvbiBwYXRoCgogICAgICAgIElmIHJlcGxhY2U9RmFsc2UgKGRlZmF1bHQpOgogICAgICAgICAgICAtIElmIGxvY2F0aW9uIGlzIGFscmVhZHkgaW4gcGF0aCBhbnl3aGVyZSwgZG8gbm90aGluZy4KICAgICAgICAgICAgLSBFbHNlOgogICAgICAgICAgICAgIC0gSWYgaXQncyBhbiBlZ2cgYW5kIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIG9uIHBhdGgsCiAgICAgICAgICAgICAgICBpbnNlcnQganVzdCBhaGVhZCBvZiB0aGUgcGFyZW50LgogICAgICAgICAgICAgIC0gRWxzZTogYWRkIHRvIHRoZSBlbmQgb2YgcGF0aC4KICAgICAgICBJZiByZXBsYWNlPVRydWU6CiAgICAgICAgICAgIC0gSWYgbG9jYXRpb24gaXMgYWxyZWFkeSBvbiBwYXRoIGFueXdoZXJlIChub3QgZWdncykKICAgICAgICAgICAgICBvciBoaWdoZXIgcHJpb3JpdHkgdGhhbiBpdHMgcGFyZW50IChlZ2dzKQogICAgICAgICAgICAgIGRvIG5vdGhpbmcuCiAgICAgICAgICAgIC0gRWxzZToKICAgICAgICAgICAgICAtIElmIGl0J3MgYW4gZWdnIGFuZCBpdHMgcGFyZW50IGRpcmVjdG9yeSBpcyBvbiBwYXRoLAogICAgICAgICAgICAgICAgaW5zZXJ0IGp1c3QgYWhlYWQgb2YgdGhlIHBhcmVudCwKICAgICAgICAgICAgICAgIHJlbW92aW5nIGFueSBsb3dlci1wcmlvcml0eSBlbnRyaWVzLgogICAgICAgICAgICAgIC0gRWxzZTogYWRkIGl0IHRvIHRoZSBmcm9udCBvZiBwYXRoLgogICAgICAgICIiIgoKICAgICAgICBsb2MgPSBsb2Mgb3Igc2VsZi5sb2NhdGlvbgogICAgICAgIGlmIG5vdCBsb2M6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBubG9jID0gX25vcm1hbGl6ZV9jYWNoZWQobG9jKQogICAgICAgIGJkaXIgPSBvcy5wYXRoLmRpcm5hbWUobmxvYykKICAgICAgICBucGF0aCA9IFsocCBhbmQgX25vcm1hbGl6ZV9jYWNoZWQocCkgb3IgcCkgZm9yIHAgaW4gcGF0aF0KCiAgICAgICAgZm9yIHAsIGl0ZW0gaW4gZW51bWVyYXRlKG5wYXRoKToKICAgICAgICAgICAgaWYgaXRlbSA9PSBubG9jOgogICAgICAgICAgICAgICAgaWYgcmVwbGFjZToKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIGRvbid0IG1vZGlmeSBwYXRoIChldmVuIHJlbW92aW5nIGR1cGxpY2F0ZXMpIGlmCiAgICAgICAgICAgICAgICAgICAgIyBmb3VuZCBhbmQgbm90IHJlcGxhY2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxpZiBpdGVtID09IGJkaXIgYW5kIHNlbGYucHJlY2VkZW5jZSA9PSBFR0dfRElTVDoKICAgICAgICAgICAgICAgICMgaWYgaXQncyBhbiAuZWdnLCBnaXZlIGl0IHByZWNlZGVuY2Ugb3ZlciBpdHMgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAjIFVOTEVTUyBpdCdzIGFscmVhZHkgYmVlbiBhZGRlZCB0byBzeXMucGF0aCBhbmQgcmVwbGFjZT1GYWxzZQogICAgICAgICAgICAgICAgaWYgKG5vdCByZXBsYWNlKSBhbmQgbmxvYyBpbiBucGF0aFtwOl06CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jb25mbGljdCgpCiAgICAgICAgICAgICAgICBwYXRoLmluc2VydChwLCBsb2MpCiAgICAgICAgICAgICAgICBucGF0aC5pbnNlcnQocCwgbmxvYykKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jb25mbGljdCgpCiAgICAgICAgICAgIGlmIHJlcGxhY2U6CiAgICAgICAgICAgICAgICBwYXRoLmluc2VydCgwLCBsb2MpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZChsb2MpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIHAgaXMgdGhlIHNwb3Qgd2hlcmUgd2UgZm91bmQgb3IgaW5zZXJ0ZWQgbG9jOyBub3cgcmVtb3ZlIGR1cGxpY2F0ZXMKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBucCA9IG5wYXRoLmluZGV4KG5sb2MsIHAgKyAxKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkZWwgbnBhdGhbbnBdLCBwYXRoW25wXQogICAgICAgICAgICAgICAgIyBoYSEKICAgICAgICAgICAgICAgIHAgPSBucAoKICAgICAgICByZXR1cm4KCiAgICBkZWYgY2hlY2tfdmVyc2lvbl9jb25mbGljdChzZWxmKToKICAgICAgICBpZiBzZWxmLmtleSA9PSAnc2V0dXB0b29scyc6CiAgICAgICAgICAgICMgaWdub3JlIHRoZSBpbmV2aXRhYmxlIHNldHVwdG9vbHMgc2VsZi1jb25mbGljdHMgIDooCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBuc3AgPSBkaWN0LmZyb21rZXlzKHNlbGYuX2dldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpKQogICAgICAgIGxvYyA9IG5vcm1hbGl6ZV9wYXRoKHNlbGYubG9jYXRpb24pCiAgICAgICAgZm9yIG1vZG5hbWUgaW4gc2VsZi5fZ2V0X21ldGFkYXRhKCd0b3BfbGV2ZWwudHh0Jyk6CiAgICAgICAgICAgIGlmIChtb2RuYW1lIG5vdCBpbiBzeXMubW9kdWxlcyBvciBtb2RuYW1lIGluIG5zcAogICAgICAgICAgICAgICAgICAgIG9yIG1vZG5hbWUgaW4gX25hbWVzcGFjZV9wYWNrYWdlcyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBtb2RuYW1lIGluICgncGtnX3Jlc291cmNlcycsICdzZXR1cHRvb2xzJywgJ3NpdGUnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGZuID0gZ2V0YXR0cihzeXMubW9kdWxlc1ttb2RuYW1lXSwgJ19fZmlsZV9fJywgTm9uZSkKICAgICAgICAgICAgaWYgZm4gYW5kIChub3JtYWxpemVfcGF0aChmbikuc3RhcnRzd2l0aChsb2MpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgZm4uc3RhcnRzd2l0aChzZWxmLmxvY2F0aW9uKSk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpc3N1ZV93YXJuaW5nKAogICAgICAgICAgICAgICAgIk1vZHVsZSAlcyB3YXMgYWxyZWFkeSBpbXBvcnRlZCBmcm9tICVzLCBidXQgJXMgaXMgYmVpbmcgYWRkZWQiCiAgICAgICAgICAgICAgICAiIHRvIHN5cy5wYXRoIiAlIChtb2RuYW1lLCBmbiwgc2VsZi5sb2NhdGlvbiksCiAgICAgICAgICAgICkKCiAgICBkZWYgaGFzX3ZlcnNpb24oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnZlcnNpb24KICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgaXNzdWVfd2FybmluZygiVW5idWlsdCBlZ2cgZm9yICIgKyByZXByKHNlbGYpKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjbG9uZShzZWxmLCAqKmt3KToKICAgICAgICAiIiJDb3B5IHRoaXMgZGlzdHJpYnV0aW9uLCBzdWJzdGl0dXRpbmcgaW4gYW55IGNoYW5nZWQga2V5d29yZCBhcmdzIiIiCiAgICAgICAgbmFtZXMgPSAncHJvamVjdF9uYW1lIHZlcnNpb24gcHlfdmVyc2lvbiBwbGF0Zm9ybSBsb2NhdGlvbiBwcmVjZWRlbmNlJwogICAgICAgIGZvciBhdHRyIGluIG5hbWVzLnNwbGl0KCk6CiAgICAgICAgICAgIGt3LnNldGRlZmF1bHQoYXR0ciwgZ2V0YXR0cihzZWxmLCBhdHRyLCBOb25lKSkKICAgICAgICBrdy5zZXRkZWZhdWx0KCdtZXRhZGF0YScsIHNlbGYuX3Byb3ZpZGVyKQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXygqKmt3KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGV4dHJhcyhzZWxmKToKICAgICAgICByZXR1cm4gW2RlcCBmb3IgZGVwIGluIHNlbGYuX2RlcF9tYXAgaWYgZGVwXQoKCmNsYXNzIEVnZ0luZm9EaXN0cmlidXRpb24oRGlzdHJpYnV0aW9uKToKICAgIGRlZiBfcmVsb2FkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUGFja2FnZXMgaW5zdGFsbGVkIGJ5IGRpc3R1dGlscyAoZS5nLiBudW1weSBvciBzY2lweSksCiAgICAgICAgd2hpY2ggdXNlcyBhbiBvbGQgc2FmZV92ZXJzaW9uLCBhbmQgc28KICAgICAgICB0aGVpciB2ZXJzaW9uIG51bWJlcnMgY2FuIGdldCBtYW5nbGVkIHdoZW4KICAgICAgICBjb252ZXJ0ZWQgdG8gZmlsZW5hbWVzIChlLmcuLCAxLjExLjAuZGV2MCsyMzI5ZWFlIHRvCiAgICAgICAgMS4xMS4wLmRldjBfMjMyOWVhZSkuIFRoZXNlIGRpc3RyaWJ1dGlvbnMgd2lsbCBub3QgYmUKICAgICAgICBwYXJzZWQgcHJvcGVybHkKICAgICAgICBkb3duc3RyZWFtIGJ5IERpc3RyaWJ1dGlvbiBhbmQgc2FmZV92ZXJzaW9uLCBzbwogICAgICAgIHRha2UgYW4gZXh0cmEgc3RlcCBhbmQgdHJ5IHRvIGdldCB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbQogICAgICAgIHRoZSBtZXRhZGF0YSBmaWxlIGl0c2VsZiBpbnN0ZWFkIG9mIHRoZSBmaWxlbmFtZS4KICAgICAgICAiIiIKICAgICAgICBtZF92ZXJzaW9uID0gX3ZlcnNpb25fZnJvbV9maWxlKHNlbGYuX2dldF9tZXRhZGF0YShzZWxmLlBLR19JTkZPKSkKICAgICAgICBpZiBtZF92ZXJzaW9uOgogICAgICAgICAgICBzZWxmLl92ZXJzaW9uID0gbWRfdmVyc2lvbgogICAgICAgIHJldHVybiBzZWxmCgoKY2xhc3MgRGlzdEluZm9EaXN0cmlidXRpb24oRGlzdHJpYnV0aW9uKToKICAgICIiIgogICAgV3JhcCBhbiBhY3R1YWwgb3IgcG90ZW50aWFsIHN5cy5wYXRoIGVudHJ5CiAgICB3L21ldGFkYXRhLCAuZGlzdC1pbmZvIHN0eWxlLgogICAgIiIiCiAgICBQS0dfSU5GTyA9ICdNRVRBREFUQScKICAgIEVRRVEgPSByZS5jb21waWxlKHIiKFtcKCxdKVxzKihcZC4qPylccyooWyxcKV0pIikKCiAgICBAcHJvcGVydHkKICAgIGRlZiBfcGFyc2VkX3BrZ19pbmZvKHNlbGYpOgogICAgICAgICIiIlBhcnNlIGFuZCBjYWNoZSBtZXRhZGF0YSIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BrZ19pbmZvCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBtZXRhZGF0YSA9IHNlbGYuZ2V0X21ldGFkYXRhKHNlbGYuUEtHX0lORk8pCiAgICAgICAgICAgIHNlbGYuX3BrZ19pbmZvID0gZW1haWwucGFyc2VyLlBhcnNlcigpLnBhcnNlc3RyKG1ldGFkYXRhKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGtnX2luZm8KCiAgICBAcHJvcGVydHkKICAgIGRlZiBfZGVwX21hcChzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5fX2RlcF9tYXAgPSBzZWxmLl9jb21wdXRlX2RlcGVuZGVuY2llcygpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAoKICAgIGRlZiBfY29tcHV0ZV9kZXBlbmRlbmNpZXMoc2VsZik6CiAgICAgICAgIiIiUmVjb21wdXRlIHRoaXMgZGlzdHJpYnV0aW9uJ3MgZGVwZW5kZW5jaWVzLiIiIgogICAgICAgIGRtID0gc2VsZi5fX2RlcF9tYXAgPSB7Tm9uZTogW119CgogICAgICAgIHJlcXMgPSBbXQogICAgICAgICMgSW5jbHVkaW5nIGFueSBjb25kaXRpb24gZXhwcmVzc2lvbnMKICAgICAgICBmb3IgcmVxIGluIHNlbGYuX3BhcnNlZF9wa2dfaW5mby5nZXRfYWxsKCdSZXF1aXJlcy1EaXN0Jykgb3IgW106CiAgICAgICAgICAgIHJlcXMuZXh0ZW5kKHBhcnNlX3JlcXVpcmVtZW50cyhyZXEpKQoKICAgICAgICBkZWYgcmVxc19mb3JfZXh0cmEoZXh0cmEpOgogICAgICAgICAgICBmb3IgcmVxIGluIHJlcXM6CiAgICAgICAgICAgICAgICBpZiBub3QgcmVxLm1hcmtlciBvciByZXEubWFya2VyLmV2YWx1YXRlKHsnZXh0cmEnOiBleHRyYX0pOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHJlcQoKICAgICAgICBjb21tb24gPSBmcm96ZW5zZXQocmVxc19mb3JfZXh0cmEoTm9uZSkpCiAgICAgICAgZG1bTm9uZV0uZXh0ZW5kKGNvbW1vbikKCiAgICAgICAgZm9yIGV4dHJhIGluIHNlbGYuX3BhcnNlZF9wa2dfaW5mby5nZXRfYWxsKCdQcm92aWRlcy1FeHRyYScpIG9yIFtdOgogICAgICAgICAgICBzX2V4dHJhID0gc2FmZV9leHRyYShleHRyYS5zdHJpcCgpKQogICAgICAgICAgICBkbVtzX2V4dHJhXSA9IGxpc3QoZnJvemVuc2V0KHJlcXNfZm9yX2V4dHJhKGV4dHJhKSkgLSBjb21tb24pCgogICAgICAgIHJldHVybiBkbQoKCl9kaXN0cmlidXRpb25JbXBsID0gewogICAgJy5lZ2cnOiBEaXN0cmlidXRpb24sCiAgICAnLmVnZy1pbmZvJzogRWdnSW5mb0Rpc3RyaWJ1dGlvbiwKICAgICcuZGlzdC1pbmZvJzogRGlzdEluZm9EaXN0cmlidXRpb24sCn0KCgpkZWYgaXNzdWVfd2FybmluZygqYXJncywgKiprdyk6CiAgICBsZXZlbCA9IDEKICAgIGcgPSBnbG9iYWxzKCkKICAgIHRyeToKICAgICAgICAjIGZpbmQgdGhlIGZpcnN0IHN0YWNrIGZyYW1lIHRoYXQgaXMgKm5vdCogY29kZSBpbgogICAgICAgICMgdGhlIHBrZ19yZXNvdXJjZXMgbW9kdWxlLCB0byB1c2UgZm9yIHRoZSB3YXJuaW5nCiAgICAgICAgd2hpbGUgc3lzLl9nZXRmcmFtZShsZXZlbCkuZl9nbG9iYWxzIGlzIGc6CiAgICAgICAgICAgIGxldmVsICs9IDEKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHBhc3MKICAgIHdhcm5pbmdzLndhcm4oc3RhY2tsZXZlbD1sZXZlbCArIDEsICphcmdzLCAqKmt3KQoKCmNsYXNzIFJlcXVpcmVtZW50UGFyc2VFcnJvcihWYWx1ZUVycm9yKToKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnICcuam9pbihzZWxmLmFyZ3MpCgoKZGVmIHBhcnNlX3JlcXVpcmVtZW50cyhzdHJzKToKICAgICIiIllpZWxkIGBgUmVxdWlyZW1lbnRgYCBvYmplY3RzIGZvciBlYWNoIHNwZWNpZmljYXRpb24gaW4gYHN0cnNgCgogICAgYHN0cnNgIG11c3QgYmUgYSBzdHJpbmcsIG9yIGEgKHBvc3NpYmx5LW5lc3RlZCkgaXRlcmFibGUgdGhlcmVvZi4KICAgICIiIgogICAgIyBjcmVhdGUgYSBzdGVwcGFibGUgaXRlcmF0b3IsIHNvIHdlIGNhbiBoYW5kbGUgXC1jb250aW51YXRpb25zCiAgICBsaW5lcyA9IGl0ZXIoeWllbGRfbGluZXMoc3RycykpCgogICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgIyBEcm9wIGNvbW1lbnRzIC0tIGEgaGFzaCB3aXRob3V0IGEgc3BhY2UgbWF5IGJlIGluIGEgVVJMLgogICAgICAgIGlmICcgIycgaW4gbGluZToKICAgICAgICAgICAgbGluZSA9IGxpbmVbOmxpbmUuZmluZCgnICMnKV0KICAgICAgICAjIElmIHRoZXJlIGlzIGEgbGluZSBjb250aW51YXRpb24sIGRyb3AgaXQsIGFuZCBhcHBlbmQgdGhlIG5leHQgbGluZS4KICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCdcXCcpOgogICAgICAgICAgICBsaW5lID0gbGluZVs6LTJdLnN0cmlwKCkKICAgICAgICAgICAgbGluZSArPSBuZXh0KGxpbmVzKQogICAgICAgIHlpZWxkIFJlcXVpcmVtZW50KGxpbmUpCgoKY2xhc3MgUmVxdWlyZW1lbnQocGFja2FnaW5nLnJlcXVpcmVtZW50cy5SZXF1aXJlbWVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxdWlyZW1lbnRfc3RyaW5nKToKICAgICAgICAiIiJETyBOT1QgQ0FMTCBUSElTIFVORE9DVU1FTlRFRCBNRVRIT0Q7IHVzZSBSZXF1aXJlbWVudC5wYXJzZSgpISIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgc3VwZXIoUmVxdWlyZW1lbnQsIHNlbGYpLl9faW5pdF9fKHJlcXVpcmVtZW50X3N0cmluZykKICAgICAgICBleGNlcHQgcGFja2FnaW5nLnJlcXVpcmVtZW50cy5JbnZhbGlkUmVxdWlyZW1lbnQgYXMgZToKICAgICAgICAgICAgcmFpc2UgUmVxdWlyZW1lbnRQYXJzZUVycm9yKHN0cihlKSkKICAgICAgICBzZWxmLnVuc2FmZV9uYW1lID0gc2VsZi5uYW1lCiAgICAgICAgcHJvamVjdF9uYW1lID0gc2FmZV9uYW1lKHNlbGYubmFtZSkKICAgICAgICBzZWxmLnByb2plY3RfbmFtZSwgc2VsZi5rZXkgPSBwcm9qZWN0X25hbWUsIHByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgc2VsZi5zcGVjcyA9IFsKICAgICAgICAgICAgKHNwZWMub3BlcmF0b3IsIHNwZWMudmVyc2lvbikgZm9yIHNwZWMgaW4gc2VsZi5zcGVjaWZpZXJdCiAgICAgICAgc2VsZi5leHRyYXMgPSB0dXBsZShtYXAoc2FmZV9leHRyYSwgc2VsZi5leHRyYXMpKQogICAgICAgIHNlbGYuaGFzaENtcCA9ICgKICAgICAgICAgICAgc2VsZi5rZXksCiAgICAgICAgICAgIHNlbGYuc3BlY2lmaWVyLAogICAgICAgICAgICBmcm96ZW5zZXQoc2VsZi5leHRyYXMpLAogICAgICAgICAgICBzdHIoc2VsZi5tYXJrZXIpIGlmIHNlbGYubWFya2VyIGVsc2UgTm9uZSwKICAgICAgICApCiAgICAgICAgc2VsZi5fX2hhc2ggPSBoYXNoKHNlbGYuaGFzaENtcCkKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBpc2luc3RhbmNlKG90aGVyLCBSZXF1aXJlbWVudCkgYW5kCiAgICAgICAgICAgIHNlbGYuaGFzaENtcCA9PSBvdGhlci5oYXNoQ21wCiAgICAgICAgKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCBEaXN0cmlidXRpb24pOgogICAgICAgICAgICBpZiBpdGVtLmtleSAhPSBzZWxmLmtleToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAgICAgaXRlbSA9IGl0ZW0udmVyc2lvbgoKICAgICAgICAjIEFsbG93IHByZXJlbGVhc2VzIGFsd2F5cyBpbiBvcmRlciB0byBtYXRjaCB0aGUgcHJldmlvdXMgYmVoYXZpb3Igb2YKICAgICAgICAjIHRoaXMgbWV0aG9kLiBJbiB0aGUgZnV0dXJlIHRoaXMgc2hvdWxkIGJlIHNtYXJ0ZXIgYW5kIGZvbGxvdyBQRVAgNDQwCiAgICAgICAgIyBtb3JlIGFjY3VyYXRlbHkuCiAgICAgICAgcmV0dXJuIHNlbGYuc3BlY2lmaWVyLmNvbnRhaW5zKGl0ZW0sIHByZXJlbGVhc2VzPVRydWUpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9faGFzaAoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIlJlcXVpcmVtZW50LnBhcnNlKCVyKSIgJSBzdHIoc2VsZikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgcGFyc2Uocyk6CiAgICAgICAgcmVxLCA9IHBhcnNlX3JlcXVpcmVtZW50cyhzKQogICAgICAgIHJldHVybiByZXEKCgpkZWYgX2Fsd2F5c19vYmplY3QoY2xhc3Nlcyk6CiAgICAiIiIKICAgIEVuc3VyZSBvYmplY3QgYXBwZWFycyBpbiB0aGUgbXJvIGV2ZW4KICAgIGZvciBvbGQtc3R5bGUgY2xhc3Nlcy4KICAgICIiIgogICAgaWYgb2JqZWN0IG5vdCBpbiBjbGFzc2VzOgogICAgICAgIHJldHVybiBjbGFzc2VzICsgKG9iamVjdCwpCiAgICByZXR1cm4gY2xhc3NlcwoKCmRlZiBfZmluZF9hZGFwdGVyKHJlZ2lzdHJ5LCBvYik6CiAgICAiIiJSZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciBgb2JgIGZyb20gYHJlZ2lzdHJ5YCIiIgogICAgdHlwZXMgPSBfYWx3YXlzX29iamVjdChpbnNwZWN0LmdldG1ybyhnZXRhdHRyKG9iLCAnX19jbGFzc19fJywgdHlwZShvYikpKSkKICAgIGZvciB0IGluIHR5cGVzOgogICAgICAgIGlmIHQgaW4gcmVnaXN0cnk6CiAgICAgICAgICAgIHJldHVybiByZWdpc3RyeVt0XQoKCmRlZiBlbnN1cmVfZGlyZWN0b3J5KHBhdGgpOgogICAgIiIiRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgYHBhdGhgIGV4aXN0cyIiIgogICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgcHkzMWNvbXBhdC5tYWtlZGlycyhkaXJuYW1lLCBleGlzdF9vaz1UcnVlKQoKCmRlZiBfYnlwYXNzX2Vuc3VyZV9kaXJlY3RvcnkocGF0aCk6CiAgICAiIiJTYW5kYm94LWJ5cGFzc2luZyB2ZXJzaW9uIG9mIGVuc3VyZV9kaXJlY3RvcnkoKSIiIgogICAgaWYgbm90IFdSSVRFX1NVUFBPUlQ6CiAgICAgICAgcmFpc2UgSU9FcnJvcignIm9zLm1rZGlyIiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uJykKICAgIGRpcm5hbWUsIGZpbGVuYW1lID0gc3BsaXQocGF0aCkKICAgIGlmIGRpcm5hbWUgYW5kIGZpbGVuYW1lIGFuZCBub3QgaXNkaXIoZGlybmFtZSk6CiAgICAgICAgX2J5cGFzc19lbnN1cmVfZGlyZWN0b3J5KGRpcm5hbWUpCiAgICAgICAgbWtkaXIoZGlybmFtZSwgMG83NTUpCgoKZGVmIHNwbGl0X3NlY3Rpb25zKHMpOgogICAgIiIiU3BsaXQgYSBzdHJpbmcgb3IgaXRlcmFibGUgdGhlcmVvZiBpbnRvIChzZWN0aW9uLCBjb250ZW50KSBwYWlycwoKICAgIEVhY2ggYGBzZWN0aW9uYGAgaXMgYSBzdHJpcHBlZCB2ZXJzaW9uIG9mIHRoZSBzZWN0aW9uIGhlYWRlciAoIltzZWN0aW9uXSIpCiAgICBhbmQgZWFjaCBgYGNvbnRlbnRgYCBpcyBhIGxpc3Qgb2Ygc3RyaXBwZWQgbGluZXMgZXhjbHVkaW5nIGJsYW5rIGxpbmVzIGFuZAogICAgY29tbWVudC1vbmx5IGxpbmVzLiAgSWYgdGhlcmUgYXJlIGFueSBzdWNoIGxpbmVzIGJlZm9yZSB0aGUgZmlyc3Qgc2VjdGlvbgogICAgaGVhZGVyLCB0aGV5J3JlIHJldHVybmVkIGluIGEgZmlyc3QgYGBzZWN0aW9uYGAgb2YgYGBOb25lYGAuCiAgICAiIiIKICAgIHNlY3Rpb24gPSBOb25lCiAgICBjb250ZW50ID0gW10KICAgIGZvciBsaW5lIGluIHlpZWxkX2xpbmVzKHMpOgogICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiWyIpOgogICAgICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCJdIik6CiAgICAgICAgICAgICAgICBpZiBzZWN0aW9uIG9yIGNvbnRlbnQ6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VjdGlvbiwgY29udGVudAogICAgICAgICAgICAgICAgc2VjdGlvbiA9IGxpbmVbMTotMV0uc3RyaXAoKQogICAgICAgICAgICAgICAgY29udGVudCA9IFtdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIHNlY3Rpb24gaGVhZGluZyIsIGxpbmUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29udGVudC5hcHBlbmQobGluZSkKCiAgICAjIHdyYXAgdXAgbGFzdCBzZWdtZW50CiAgICB5aWVsZCBzZWN0aW9uLCBjb250ZW50CgoKZGVmIF9ta3N0ZW1wKCphcmdzLCAqKmt3KToKICAgIG9sZF9vcGVuID0gb3Mub3BlbgogICAgdHJ5OgogICAgICAgICMgdGVtcG9yYXJpbHkgYnlwYXNzIHNhbmRib3hpbmcKICAgICAgICBvcy5vcGVuID0gb3Nfb3BlbgogICAgICAgIHJldHVybiB0ZW1wZmlsZS5ta3N0ZW1wKCphcmdzLCAqKmt3KQogICAgZmluYWxseToKICAgICAgICAjIGFuZCB0aGVuIHB1dCBpdCBiYWNrCiAgICAgICAgb3Mub3BlbiA9IG9sZF9vcGVuCgoKIyBTaWxlbmNlIHRoZSBQRVA0NDBXYXJuaW5nIGJ5IGRlZmF1bHQsIHNvIHRoYXQgZW5kIHVzZXJzIGRvbid0IGdldCBoaXQgYnkgaXQKIyByYW5kb21seSBqdXN0IGJlY2F1c2UgdGhleSB1c2UgcGtnX3Jlc291cmNlcy4gV2Ugd2FudCB0byBhcHBlbmQgdGhlIHJ1bGUKIyBiZWNhdXNlIHdlIHdhbnQgZWFybGllciB1c2VzIG9mIGZpbHRlcndhcm5pbmdzIHRvIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoaXMKIyBvbmUuCndhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCBjYXRlZ29yeT1QRVA0NDBXYXJuaW5nLCBhcHBlbmQ9VHJ1ZSkKCgojIGZyb20gamFyYWNvLmZ1bmN0b29scyAxLjMKZGVmIF9jYWxsX2FzaWRlKGYsICphcmdzLCAqKmt3YXJncyk6CiAgICBmKCphcmdzLCAqKmt3YXJncykKICAgIHJldHVybiBmCgoKQF9jYWxsX2FzaWRlCmRlZiBfaW5pdGlhbGl6ZShnPWdsb2JhbHMoKSk6CiAgICAiU2V0IHVwIGdsb2JhbCByZXNvdXJjZSBtYW5hZ2VyIChkZWxpYmVyYXRlbHkgbm90IHN0YXRlLXNhdmVkKSIKICAgIG1hbmFnZXIgPSBSZXNvdXJjZU1hbmFnZXIoKQogICAgZ1snX21hbmFnZXInXSA9IG1hbmFnZXIKICAgIGcudXBkYXRlKAogICAgICAgIChuYW1lLCBnZXRhdHRyKG1hbmFnZXIsIG5hbWUpKQogICAgICAgIGZvciBuYW1lIGluIGRpcihtYW5hZ2VyKQogICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKQogICAgKQoKCkBfY2FsbF9hc2lkZQpkZWYgX2luaXRpYWxpemVfbWFzdGVyX3dvcmtpbmdfc2V0KCk6CiAgICAiIiIKICAgIFByZXBhcmUgdGhlIG1hc3RlciB3b3JraW5nIHNldCBhbmQgbWFrZSB0aGUgYGByZXF1aXJlKClgYAogICAgQVBJIGF2YWlsYWJsZS4KCiAgICBUaGlzIGZ1bmN0aW9uIGhhcyBleHBsaWNpdCBlZmZlY3RzIG9uIHRoZSBnbG9iYWwgc3RhdGUKICAgIG9mIHBrZ19yZXNvdXJjZXMuIEl0IGlzIGludGVuZGVkIHRvIGJlIGludm9rZWQgb25jZSBhdAogICAgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoaXMgbW9kdWxlLgoKICAgIEludm9jYXRpb24gYnkgb3RoZXIgcGFja2FnZXMgaXMgdW5zdXBwb3J0ZWQgYW5kIGRvbmUKICAgIGF0IHRoZWlyIG93biByaXNrLgogICAgIiIiCiAgICB3b3JraW5nX3NldCA9IFdvcmtpbmdTZXQuX2J1aWxkX21hc3RlcigpCiAgICBfZGVjbGFyZV9zdGF0ZSgnb2JqZWN0Jywgd29ya2luZ19zZXQ9d29ya2luZ19zZXQpCgogICAgcmVxdWlyZSA9IHdvcmtpbmdfc2V0LnJlcXVpcmUKICAgIGl0ZXJfZW50cnlfcG9pbnRzID0gd29ya2luZ19zZXQuaXRlcl9lbnRyeV9wb2ludHMKICAgIGFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyID0gd29ya2luZ19zZXQuc3Vic2NyaWJlCiAgICBydW5fc2NyaXB0ID0gd29ya2luZ19zZXQucnVuX3NjcmlwdAogICAgIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICBydW5fbWFpbiA9IHJ1bl9zY3JpcHQKICAgICMgQWN0aXZhdGUgYWxsIGRpc3RyaWJ1dGlvbnMgYWxyZWFkeSBvbiBzeXMucGF0aCB3aXRoIHJlcGxhY2U9RmFsc2UgYW5kCiAgICAjIGVuc3VyZSB0aGF0IGFsbCBkaXN0cmlidXRpb25zIGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldCBpbiB0aGUgZnV0dXJlCiAgICAjIChlLmcuIGJ5IGNhbGxpbmcgYGByZXF1aXJlKClgYCkgd2lsbCBnZXQgYWN0aXZhdGVkIGFzIHdlbGwsCiAgICAjIHdpdGggaGlnaGVyIHByaW9yaXR5IChyZXBsYWNlPVRydWUpLgogICAgdHVwbGUoCiAgICAgICAgZGlzdC5hY3RpdmF0ZShyZXBsYWNlPUZhbHNlKQogICAgICAgIGZvciBkaXN0IGluIHdvcmtpbmdfc2V0CiAgICApCiAgICBhZGRfYWN0aXZhdGlvbl9saXN0ZW5lcigKICAgICAgICBsYW1iZGEgZGlzdDogZGlzdC5hY3RpdmF0ZShyZXBsYWNlPVRydWUpLAogICAgICAgIGV4aXN0aW5nPUZhbHNlLAogICAgKQogICAgd29ya2luZ19zZXQuZW50cmllcyA9IFtdCiAgICAjIG1hdGNoIG9yZGVyCiAgICBsaXN0KG1hcCh3b3JraW5nX3NldC5hZGRfZW50cnksIHN5cy5wYXRoKSkKICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAOQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAQ6uwJmZXAABmVwAAOAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9hcHBkaXJzLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogdXRmLTggLSotCiMgQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgQWN0aXZlU3RhdGUgU29mdHdhcmUgSW5jLgojIENvcHlyaWdodCAoYykgMjAxMyBFZGR5IFBldHJpyJlvcgoKIiIiVXRpbGl0aWVzIGZvciBkZXRlcm1pbmluZyBhcHBsaWNhdGlvbi1zcGVjaWZpYyBkaXJzLgoKU2VlIDxodHRwOi8vZ2l0aHViLmNvbS9BY3RpdmVTdGF0ZS9hcHBkaXJzPiBmb3IgZGV0YWlscyBhbmQgdXNhZ2UuCiIiIgojIERldiBOb3RlczoKIyAtIE1TRE4gb24gd2hlcmUgdG8gc3RvcmUgYXBwIGRhdGEgZmlsZXM6CiMgICBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2RlZmF1bHQuYXNweD9zY2lkPWtiO2VuLXVzOzMxMDI5NCNYU0xUSDMxOTQxMjExMjMxMjAxMjExMjAxMjAKIyAtIE1hYyBPUyBYOiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL01hY09TWC9Db25jZXB0dWFsL0JQRmlsZVN5c3RlbS9pbmRleC5odG1sCiMgLSBYREcgc3BlYyBmb3IgVW4qeDogaHR0cDovL3N0YW5kYXJkcy5mcmVlZGVza3RvcC5vcmcvYmFzZWRpci1zcGVjL2Jhc2VkaXItc3BlYy1sYXRlc3QuaHRtbAoKX192ZXJzaW9uX2luZm9fXyA9ICgxLCA0LCAwKQpfX3ZlcnNpb25fXyA9ICcuJy5qb2luKG1hcChzdHIsIF9fdmVyc2lvbl9pbmZvX18pKQoKCmltcG9ydCBzeXMKaW1wb3J0IG9zCgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKCmlmIFBZMzoKICAgIHVuaWNvZGUgPSBzdHIKCmlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICBpbXBvcnQgcGxhdGZvcm0KICAgIG9zX25hbWUgPSBwbGF0Zm9ybS5qYXZhX3ZlcigpWzNdWzBdCiAgICBpZiBvc19uYW1lLnN0YXJ0c3dpdGgoJ1dpbmRvd3MnKTogIyAiV2luZG93cyBYUCIsICJXaW5kb3dzIDciLCBldGMuCiAgICAgICAgc3lzdGVtID0gJ3dpbjMyJwogICAgZWxpZiBvc19uYW1lLnN0YXJ0c3dpdGgoJ01hYycpOiAjICJNYWMgT1MgWCIsIGV0Yy4KICAgICAgICBzeXN0ZW0gPSAnZGFyd2luJwogICAgZWxzZTogIyAiTGludXgiLCAiU3VuT1MiLCAiRnJlZUJTRCIsIGV0Yy4KICAgICAgICAjIFNldHRpbmcgdGhpcyB0byAibGludXgyIiBpcyBub3QgaWRlYWwsIGJ1dCBvbmx5IFdpbmRvd3Mgb3IgTWFjCiAgICAgICAgIyBhcmUgYWN0dWFsbHkgY2hlY2tlZCBmb3IgYW5kIHRoZSByZXN0IG9mIHRoZSBtb2R1bGUgZXhwZWN0cwogICAgICAgICMgKnN5cy5wbGF0Zm9ybSogc3R5bGUgc3RyaW5ncy4KICAgICAgICBzeXN0ZW0gPSAnbGludXgyJwplbHNlOgogICAgc3lzdGVtID0gc3lzLnBsYXRmb3JtCgoKCmRlZiB1c2VyX2RhdGFfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgcm9hbWluZz1GYWxzZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBkYXRhIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAicm9hbWluZyIgKGJvb2xlYW4sIGRlZmF1bHQgRmFsc2UpIGNhbiBiZSBzZXQgVHJ1ZSB0byB1c2UgdGhlIFdpbmRvd3MKICAgICAgICAgICAgcm9hbWluZyBhcHBkYXRhIGRpcmVjdG9yeS4gVGhhdCBtZWFucyB0aGF0IGZvciB1c2VycyBvbiBhIFdpbmRvd3MKICAgICAgICAgICAgbmV0d29yayBzZXR1cCBmb3Igcm9hbWluZyBwcm9maWxlcywgdGhpcyB1c2VyIGRhdGEgd2lsbCBiZQogICAgICAgICAgICBzeW5jJ2Qgb24gbG9naW4uIFNlZQogICAgICAgICAgICA8aHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjNzY2NDg5KFdTLjEwKS5hc3B4PgogICAgICAgICAgICBmb3IgYSBkaXNjdXNzaW9uIG9mIGlzc3Vlcy4KCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgICAgICAgICAgICAgfi9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgICAgICAgICAgICAgfi8ubG9jYWwvc2hhcmUvPEFwcE5hbWU+ICAgICMgb3IgaW4gJFhER19EQVRBX0hPTUUsIGlmIGRlZmluZWQKICAgICAgICBXaW4gWFAgKG5vdCByb2FtaW5nKTogICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBXaW4gWFAgKHJvYW1pbmcpOiAgICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cTG9jYWwgU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBXaW4gNyAgKG5vdCByb2FtaW5nKTogICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgV2luIDcgIChyb2FtaW5nKTogICAgICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXFJvYW1pbmdcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CgogICAgRm9yIFVuaXgsIHdlIGZvbGxvdyB0aGUgWERHIHNwZWMgYW5kIHN1cHBvcnQgJFhER19EQVRBX0hPTUUuCiAgICBUaGF0IG1lYW5zLCBieSBkZWZhdWx0ICJ+Ly5sb2NhbC9zaGFyZS88QXBwTmFtZT4iLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBpZiBhcHBhdXRob3IgaXMgTm9uZToKICAgICAgICAgICAgYXBwYXV0aG9yID0gYXBwbmFtZQogICAgICAgIGNvbnN0ID0gcm9hbWluZyBhbmQgIkNTSURMX0FQUERBVEEiIG9yICJDU0lETF9MT0NBTF9BUFBEQVRBIgogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcihjb25zdCkpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgYXBwYXV0aG9yIGlzIG5vdCBGYWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwYXV0aG9yLCBhcHBuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxpZiBzeXN0ZW0gPT0gJ2Rhcndpbic6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcignfi9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvJykKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19EQVRBX0hPTUUnLCBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmxvY2FsL3NoYXJlIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiBzaXRlX2RhdGFfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgbXVsdGlwYXRoPUZhbHNlKToKICAgICIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc2hhcmVkIGRhdGEgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJtdWx0aXBhdGgiIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBvbmx5IGFwcGxpY2FibGUgdG8gKm5peAogICAgICAgICAgICB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXJlIGxpc3Qgb2YgZGF0YSBkaXJzIHNob3VsZCBiZQogICAgICAgICAgICByZXR1cm5lZC4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGl0ZW0gZnJvbSBYREdfREFUQV9ESVJTIGlzCiAgICAgICAgICAgIHJldHVybmVkLCBvciAnL3Vzci9sb2NhbC9zaGFyZS88QXBwTmFtZT4nLAogICAgICAgICAgICBpZiBYREdfREFUQV9ESVJTIGlzIG5vdCBzZXQKCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICAvdXNyL2xvY2FsL3NoYXJlLzxBcHBOYW1lPiBvciAvdXNyL3NoYXJlLzxBcHBOYW1lPgogICAgICAgIFdpbiBYUDogICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcQWxsIFVzZXJzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgVmlzdGE6ICAgICAgKEZhaWwhICJDOlxQcm9ncmFtRGF0YSIgaXMgYSBoaWRkZW4gKnN5c3RlbSogZGlyZWN0b3J5IG9uIFZpc3RhLikKICAgICAgICBXaW4gNzogICAgICBDOlxQcm9ncmFtRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4gICAjIEhpZGRlbiwgYnV0IHdyaXRlYWJsZSBvbiBXaW4gNy4KCiAgICBGb3IgVW5peCwgdGhpcyBpcyB1c2luZyB0aGUgJFhER19EQVRBX0RJUlNbMF0gZGVmYXVsdC4KCiAgICBXQVJOSU5HOiBEbyBub3QgdXNlIHRoaXMgb24gV2luZG93cy4gU2VlIHRoZSBWaXN0YS1GYWlsIG5vdGUgYWJvdmUgZm9yIHdoeS4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgaWYgYXBwYXV0aG9yIGlzIE5vbmU6CiAgICAgICAgICAgIGFwcGF1dGhvciA9IGFwcG5hbWUKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoIkNTSURMX0NPTU1PTl9BUFBEQVRBIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgYXBwYXV0aG9yIGlzIG5vdCBGYWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwYXV0aG9yLCBhcHBuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxpZiBzeXN0ZW0gPT0gJ2Rhcndpbic6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcignL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydCcpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxzZToKICAgICAgICAjIFhERyBkZWZhdWx0IGZvciAkWERHX0RBVEFfRElSUwogICAgICAgICMgb25seSBmaXJzdCwgaWYgbXVsdGlwYXRoIGlzIEZhbHNlCiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0RBVEFfRElSUycsCiAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoc2VwLmpvaW4oWycvdXNyL2xvY2FsL3NoYXJlJywgJy91c3Ivc2hhcmUnXSkpCiAgICAgICAgcGF0aGxpc3QgPSBbb3MucGF0aC5leHBhbmR1c2VyKHgucnN0cmlwKG9zLnNlcCkpIGZvciB4IGluIHBhdGguc3BsaXQob3MucGF0aHNlcCldCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgdmVyc2lvbjoKICAgICAgICAgICAgICAgIGFwcG5hbWUgPSBvcy5wYXRoLmpvaW4oYXBwbmFtZSwgdmVyc2lvbikKICAgICAgICAgICAgcGF0aGxpc3QgPSBbb3Muc2VwLmpvaW4oW3gsIGFwcG5hbWVdKSBmb3IgeCBpbiBwYXRobGlzdF0KCiAgICAgICAgaWYgbXVsdGlwYXRoOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aHNlcC5qb2luKHBhdGhsaXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhdGggPSBwYXRobGlzdFswXQogICAgICAgIHJldHVybiBwYXRoCgogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2NvbmZpZ19kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCByb2FtaW5nPUZhbHNlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGNvbmZpZyBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgInJvYW1pbmciIChib29sZWFuLCBkZWZhdWx0IEZhbHNlKSBjYW4gYmUgc2V0IFRydWUgdG8gdXNlIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIHJvYW1pbmcgYXBwZGF0YSBkaXJlY3RvcnkuIFRoYXQgbWVhbnMgdGhhdCBmb3IgdXNlcnMgb24gYSBXaW5kb3dzCiAgICAgICAgICAgIG5ldHdvcmsgc2V0dXAgZm9yIHJvYW1pbmcgcHJvZmlsZXMsIHRoaXMgdXNlciBkYXRhIHdpbGwgYmUKICAgICAgICAgICAgc3luYydkIG9uIGxvZ2luLiBTZWUKICAgICAgICAgICAgPGh0dHA6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9jYzc2NjQ4OShXUy4xMCkuYXNweD4KICAgICAgICAgICAgZm9yIGEgZGlzY3Vzc2lvbiBvZiBpc3N1ZXMuCgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgICAgICAgICAgICAgIHNhbWUgYXMgdXNlcl9kYXRhX2RpcgogICAgICAgIFVuaXg6ICAgICAgICAgICAgICAgICAgIH4vLmNvbmZpZy88QXBwTmFtZT4gICAgICMgb3IgaW4gJFhER19DT05GSUdfSE9NRSwgaWYgZGVmaW5lZAogICAgICAgIFdpbiAqOiAgICAgICAgICAgICAgICAgIHNhbWUgYXMgdXNlcl9kYXRhX2RpcgoKICAgIEZvciBVbml4LCB3ZSBmb2xsb3cgdGhlIFhERyBzcGVjIGFuZCBzdXBwb3J0ICRYREdfQ09ORklHX0hPTUUuCiAgICBUaGF0IG1lYW5zLCBieSBkZWFmdWx0ICJ+Ly5jb25maWcvPEFwcE5hbWU+Ii4KICAgICIiIgogICAgaWYgc3lzdGVtIGluIFsid2luMzIiLCAiZGFyd2luIl06CiAgICAgICAgcGF0aCA9IHVzZXJfZGF0YV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yLCBOb25lLCByb2FtaW5nKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfQ09ORklHX0hPTUUnLCBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmNvbmZpZyIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgc2l0ZV9jb25maWdfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgbXVsdGlwYXRoPUZhbHNlKToKICAgICIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc2hhcmVkIGRhdGEgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJtdWx0aXBhdGgiIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBvbmx5IGFwcGxpY2FibGUgdG8gKm5peAogICAgICAgICAgICB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXJlIGxpc3Qgb2YgY29uZmlnIGRpcnMgc2hvdWxkIGJlCiAgICAgICAgICAgIHJldHVybmVkLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgaXRlbSBmcm9tIFhER19DT05GSUdfRElSUyBpcwogICAgICAgICAgICByZXR1cm5lZCwgb3IgJy9ldGMveGRnLzxBcHBOYW1lPicsIGlmIFhER19DT05GSUdfRElSUyBpcyBub3Qgc2V0CgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgIHNhbWUgYXMgc2l0ZV9kYXRhX2RpcgogICAgICAgIFVuaXg6ICAgICAgIC9ldGMveGRnLzxBcHBOYW1lPiBvciAkWERHX0NPTkZJR19ESVJTW2ldLzxBcHBOYW1lPiBmb3IgZWFjaCB2YWx1ZSBpbgogICAgICAgICAgICAgICAgICAgICRYREdfQ09ORklHX0RJUlMKICAgICAgICBXaW4gKjogICAgICBzYW1lIGFzIHNpdGVfZGF0YV9kaXIKICAgICAgICBWaXN0YTogICAgICAoRmFpbCEgIkM6XFByb2dyYW1EYXRhIiBpcyBhIGhpZGRlbiAqc3lzdGVtKiBkaXJlY3Rvcnkgb24gVmlzdGEuKQoKICAgIEZvciBVbml4LCB0aGlzIGlzIHVzaW5nIHRoZSAkWERHX0NPTkZJR19ESVJTWzBdIGRlZmF1bHQsIGlmIG11bHRpcGF0aD1GYWxzZQoKICAgIFdBUk5JTkc6IERvIG5vdCB1c2UgdGhpcyBvbiBXaW5kb3dzLiBTZWUgdGhlIFZpc3RhLUZhaWwgbm90ZSBhYm92ZSBmb3Igd2h5LgogICAgIiIiCiAgICBpZiBzeXN0ZW0gaW4gWyJ3aW4zMiIsICJkYXJ3aW4iXToKICAgICAgICBwYXRoID0gc2l0ZV9kYXRhX2RpcihhcHBuYW1lLCBhcHBhdXRob3IpCiAgICAgICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgZWxzZToKICAgICAgICAjIFhERyBkZWZhdWx0IGZvciAkWERHX0NPTkZJR19ESVJTCiAgICAgICAgIyBvbmx5IGZpcnN0LCBpZiBtdWx0aXBhdGggaXMgRmFsc2UKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfQ09ORklHX0RJUlMnLCAnL2V0Yy94ZGcnKQogICAgICAgIHBhdGhsaXN0ID0gW29zLnBhdGguZXhwYW5kdXNlcih4LnJzdHJpcChvcy5zZXApKSBmb3IgeCBpbiBwYXRoLnNwbGl0KG9zLnBhdGhzZXApXQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIHZlcnNpb246CiAgICAgICAgICAgICAgICBhcHBuYW1lID0gb3MucGF0aC5qb2luKGFwcG5hbWUsIHZlcnNpb24pCiAgICAgICAgICAgIHBhdGhsaXN0ID0gW29zLnNlcC5qb2luKFt4LCBhcHBuYW1lXSkgZm9yIHggaW4gcGF0aGxpc3RdCgogICAgICAgIGlmIG11bHRpcGF0aDoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGhzZXAuam9pbihwYXRobGlzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXRoID0gcGF0aGxpc3RbMF0KICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfY2FjaGVfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgb3Bpbmlvbj1UcnVlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGNhY2hlIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAib3BpbmlvbiIgKGJvb2xlYW4pIGNhbiBiZSBGYWxzZSB0byBkaXNhYmxlIHRoZSBhcHBlbmRpbmcgb2YKICAgICAgICAgICAgIkNhY2hlIiB0byB0aGUgYmFzZSBhcHAgZGF0YSBkaXIgZm9yIFdpbmRvd3MuIFNlZQogICAgICAgICAgICBkaXNjdXNzaW9uIGJlbG93LgoKICAgIFR5cGljYWwgdXNlciBjYWNoZSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgfi9MaWJyYXJ5L0NhY2hlcy88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICB+Ly5jYWNoZS88QXBwTmFtZT4gKFhERyBkZWZhdWx0KQogICAgICAgIFdpbiBYUDogICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxMb2NhbCBTZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxDYWNoZQogICAgICAgIFZpc3RhOiAgICAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cQ2FjaGUKCiAgICBPbiBXaW5kb3dzIHRoZSBvbmx5IHN1Z2dlc3Rpb24gaW4gdGhlIE1TRE4gZG9jcyBpcyB0aGF0IGxvY2FsIHNldHRpbmdzIGdvIGluCiAgICB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIGRpcmVjdG9yeS4gVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIG5vbi1yb2FtaW5nCiAgICBhcHAgZGF0YSBkaXIgKHRoZSBkZWZhdWx0IHJldHVybmVkIGJ5IGB1c2VyX2RhdGFfZGlyYCBhYm92ZSkuIEFwcHMgdHlwaWNhbGx5CiAgICBwdXQgY2FjaGUgZGF0YSBzb21ld2hlcmUgKnVuZGVyKiB0aGUgZ2l2ZW4gZGlyIGhlcmUuIFNvbWUgZXhhbXBsZXM6CiAgICAgICAgLi4uXE1vemlsbGFcRmlyZWZveFxQcm9maWxlc1w8UHJvZmlsZU5hbWU+XENhY2hlCiAgICAgICAgLi4uXEFjbWVcU3VwZXJBcHBcQ2FjaGVcMS4wCiAgICBPUElOSU9OOiBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgIkNhY2hlIiB0byB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIHZhbHVlLgogICAgVGhpcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgYG9waW5pb249RmFsc2VgIG9wdGlvbi4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgaWYgYXBwYXV0aG9yIGlzIE5vbmU6CiAgICAgICAgICAgIGFwcGF1dGhvciA9IGFwcG5hbWUKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoIkNTSURMX0xPQ0FMX0FQUERBVEEiKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiBhcHBhdXRob3IgaXMgbm90IEZhbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBhdXRob3IsIGFwcG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICAgICAgICAgIGlmIG9waW5pb246CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJDYWNoZSIpCiAgICBlbGlmIHN5c3RlbSA9PSAnZGFyd2luJzoKICAgICAgICBwYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKCd+L0xpYnJhcnkvQ2FjaGVzJykKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19DQUNIRV9IT01FJywgb3MucGF0aC5leHBhbmR1c2VyKCd+Ly5jYWNoZScpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9sb2dfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgb3Bpbmlvbj1UcnVlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGxvZyBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm9waW5pb24iIChib29sZWFuKSBjYW4gYmUgRmFsc2UgdG8gZGlzYWJsZSB0aGUgYXBwZW5kaW5nIG9mCiAgICAgICAgICAgICJMb2dzIiB0byB0aGUgYmFzZSBhcHAgZGF0YSBkaXIgZm9yIFdpbmRvd3MsIGFuZCAibG9nIiB0byB0aGUKICAgICAgICAgICAgYmFzZSBjYWNoZSBkaXIgZm9yIFVuaXguIFNlZSBkaXNjdXNzaW9uIGJlbG93LgoKICAgIFR5cGljYWwgdXNlciBjYWNoZSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgfi9MaWJyYXJ5L0xvZ3MvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgfi8uY2FjaGUvPEFwcE5hbWU+L2xvZyAgIyBvciB1bmRlciAkWERHX0NBQ0hFX0hPTUUgaWYgZGVmaW5lZAogICAgICAgIFdpbiBYUDogICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxMb2NhbCBTZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxMb2dzCiAgICAgICAgVmlzdGE6ICAgICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxMb2dzCgogICAgT24gV2luZG93cyB0aGUgb25seSBzdWdnZXN0aW9uIGluIHRoZSBNU0ROIGRvY3MgaXMgdGhhdCBsb2NhbCBzZXR0aW5ncwogICAgZ28gaW4gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCBkaXJlY3RvcnkuIChOb3RlOiBJJ20gaW50ZXJlc3RlZCBpbgogICAgZXhhbXBsZXMgb2Ygd2hhdCBzb21lIHdpbmRvd3MgYXBwcyB1c2UgZm9yIGEgbG9ncyBkaXIuKQoKICAgIE9QSU5JT046IFRoaXMgZnVuY3Rpb24gYXBwZW5kcyAiTG9ncyIgdG8gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYAogICAgdmFsdWUgZm9yIFdpbmRvd3MgYW5kIGFwcGVuZHMgImxvZyIgdG8gdGhlIHVzZXIgY2FjaGUgZGlyIGZvciBVbml4LgogICAgVGhpcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgYG9waW5pb249RmFsc2VgIG9wdGlvbi4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJkYXJ3aW4iOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIG9zLnBhdGguZXhwYW5kdXNlcignfi9MaWJyYXJ5L0xvZ3MnKSwKICAgICAgICAgICAgYXBwbmFtZSkKICAgIGVsaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgcGF0aCA9IHVzZXJfZGF0YV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yLCB2ZXJzaW9uKQogICAgICAgIHZlcnNpb24gPSBGYWxzZQogICAgICAgIGlmIG9waW5pb246CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgIkxvZ3MiKQogICAgZWxzZToKICAgICAgICBwYXRoID0gdXNlcl9jYWNoZV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yLCB2ZXJzaW9uKQogICAgICAgIHZlcnNpb24gPSBGYWxzZQogICAgICAgIGlmIG9waW5pb246CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgImxvZyIpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKY2xhc3MgQXBwRGlycyhvYmplY3QpOgogICAgIiIiQ29udmVuaWVuY2Ugd3JhcHBlciBmb3IgZ2V0dGluZyBhcHBsaWNhdGlvbiBkaXJzLiIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFwcG5hbWUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIHJvYW1pbmc9RmFsc2UsCiAgICAgICAgICAgICAgICAgbXVsdGlwYXRoPUZhbHNlKToKICAgICAgICBzZWxmLmFwcG5hbWUgPSBhcHBuYW1lCiAgICAgICAgc2VsZi5hcHBhdXRob3IgPSBhcHBhdXRob3IKICAgICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uCiAgICAgICAgc2VsZi5yb2FtaW5nID0gcm9hbWluZwogICAgICAgIHNlbGYubXVsdGlwYXRoID0gbXVsdGlwYXRoCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9kYXRhX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9kYXRhX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCByb2FtaW5nPXNlbGYucm9hbWluZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzaXRlX2RhdGFfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiBzaXRlX2RhdGFfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIG11bHRpcGF0aD1zZWxmLm11bHRpcGF0aCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2NvbmZpZ19kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfY29uZmlnX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIHJvYW1pbmc9c2VsZi5yb2FtaW5nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNpdGVfY29uZmlnX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gc2l0ZV9jb25maWdfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIG11bHRpcGF0aD1zZWxmLm11bHRpcGF0aCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2NhY2hlX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9jYWNoZV9kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24pCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9sb2dfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2xvZ19kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uKQoKCiMtLS0tIGludGVybmFsIHN1cHBvcnQgc3R1ZmYKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfZnJvbV9yZWdpc3RyeShjc2lkbF9uYW1lKToKICAgICIiIlRoaXMgaXMgYSBmYWxsYmFjayB0ZWNobmlxdWUgYXQgYmVzdC4gSSdtIG5vdCBzdXJlIGlmIHVzaW5nIHRoZQogICAgcmVnaXN0cnkgZm9yIHRoaXMgZ3VhcmFudGVlcyB1cyB0aGUgY29ycmVjdCBhbnN3ZXIgZm9yIGFsbCBDU0lETF8qCiAgICBuYW1lcy4KICAgICIiIgogICAgaW1wb3J0IF93aW5yZWcKCiAgICBzaGVsbF9mb2xkZXJfbmFtZSA9IHsKICAgICAgICAiQ1NJRExfQVBQREFUQSI6ICJBcHBEYXRhIiwKICAgICAgICAiQ1NJRExfQ09NTU9OX0FQUERBVEEiOiAiQ29tbW9uIEFwcERhdGEiLAogICAgICAgICJDU0lETF9MT0NBTF9BUFBEQVRBIjogIkxvY2FsIEFwcERhdGEiLAogICAgfVtjc2lkbF9uYW1lXQoKICAgIGtleSA9IF93aW5yZWcuT3BlbktleSgKICAgICAgICBfd2lucmVnLkhLRVlfQ1VSUkVOVF9VU0VSLAogICAgICAgIHIiU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cRXhwbG9yZXJcU2hlbGwgRm9sZGVycyIKICAgICkKICAgIGRpciwgdHlwZSA9IF93aW5yZWcuUXVlcnlWYWx1ZUV4KGtleSwgc2hlbGxfZm9sZGVyX25hbWUpCiAgICByZXR1cm4gZGlyCgoKZGVmIF9nZXRfd2luX2ZvbGRlcl93aXRoX3B5d2luMzIoY3NpZGxfbmFtZSk6CiAgICBmcm9tIHdpbjMyY29tLnNoZWxsIGltcG9ydCBzaGVsbGNvbiwgc2hlbGwKICAgIGRpciA9IHNoZWxsLlNIR2V0Rm9sZGVyUGF0aCgwLCBnZXRhdHRyKHNoZWxsY29uLCBjc2lkbF9uYW1lKSwgMCwgMCkKICAgICMgVHJ5IHRvIG1ha2UgdGhpcyBhIHVuaWNvZGUgcGF0aCBiZWNhdXNlIFNIR2V0Rm9sZGVyUGF0aCBkb2VzCiAgICAjIG5vdCByZXR1cm4gdW5pY29kZSBzdHJpbmdzIHdoZW4gdGhlcmUgaXMgdW5pY29kZSBkYXRhIGluIHRoZQogICAgIyBwYXRoLgogICAgdHJ5OgogICAgICAgIGRpciA9IHVuaWNvZGUoZGlyKQoKICAgICAgICAjIERvd25ncmFkZSB0byBzaG9ydCBwYXRoIG5hbWUgaWYgaGF2ZSBoaWdoYml0IGNoYXJzLiBTZWUKICAgICAgICAjIDxodHRwOi8vYnVncy5hY3RpdmVzdGF0ZS5jb20vc2hvd19idWcuY2dpP2lkPTg1MDk5Pi4KICAgICAgICBoYXNfaGlnaF9jaGFyID0gRmFsc2UKICAgICAgICBmb3IgYyBpbiBkaXI6CiAgICAgICAgICAgIGlmIG9yZChjKSA+IDI1NToKICAgICAgICAgICAgICAgIGhhc19oaWdoX2NoYXIgPSBUcnVlCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIGhhc19oaWdoX2NoYXI6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCB3aW4zMmFwaQogICAgICAgICAgICAgICAgZGlyID0gd2luMzJhcGkuR2V0U2hvcnRQYXRoTmFtZShkaXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgcGFzcwogICAgcmV0dXJuIGRpcgoKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9jdHlwZXMoY3NpZGxfbmFtZSk6CiAgICBpbXBvcnQgY3R5cGVzCgogICAgY3NpZGxfY29uc3QgPSB7CiAgICAgICAgIkNTSURMX0FQUERBVEEiOiAyNiwKICAgICAgICAiQ1NJRExfQ09NTU9OX0FQUERBVEEiOiAzNSwKICAgICAgICAiQ1NJRExfTE9DQUxfQVBQREFUQSI6IDI4LAogICAgfVtjc2lkbF9uYW1lXQoKICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoMTAyNCkKICAgIGN0eXBlcy53aW5kbGwuc2hlbGwzMi5TSEdldEZvbGRlclBhdGhXKE5vbmUsIGNzaWRsX2NvbnN0LCBOb25lLCAwLCBidWYpCgogICAgIyBEb3duZ3JhZGUgdG8gc2hvcnQgcGF0aCBuYW1lIGlmIGhhdmUgaGlnaGJpdCBjaGFycy4gU2VlCiAgICAjIDxodHRwOi8vYnVncy5hY3RpdmVzdGF0ZS5jb20vc2hvd19idWcuY2dpP2lkPTg1MDk5Pi4KICAgIGhhc19oaWdoX2NoYXIgPSBGYWxzZQogICAgZm9yIGMgaW4gYnVmOgogICAgICAgIGlmIG9yZChjKSA+IDI1NToKICAgICAgICAgICAgaGFzX2hpZ2hfY2hhciA9IFRydWUKICAgICAgICAgICAgYnJlYWsKICAgIGlmIGhhc19oaWdoX2NoYXI6CiAgICAgICAgYnVmMiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoMTAyNCkKICAgICAgICBpZiBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkdldFNob3J0UGF0aE5hbWVXKGJ1Zi52YWx1ZSwgYnVmMiwgMTAyNCk6CiAgICAgICAgICAgIGJ1ZiA9IGJ1ZjIKCiAgICByZXR1cm4gYnVmLnZhbHVlCgpkZWYgX2dldF93aW5fZm9sZGVyX3dpdGhfam5hKGNzaWRsX25hbWUpOgogICAgaW1wb3J0IGFycmF5CiAgICBmcm9tIGNvbS5zdW4gaW1wb3J0IGpuYQogICAgZnJvbSBjb20uc3VuLmpuYS5wbGF0Zm9ybSBpbXBvcnQgd2luMzIKCiAgICBidWZfc2l6ZSA9IHdpbjMyLldpbkRlZi5NQVhfUEFUSCAqIDIKICAgIGJ1ZiA9IGFycmF5Lnplcm9zKCdjJywgYnVmX3NpemUpCiAgICBzaGVsbCA9IHdpbjMyLlNoZWxsMzIuSU5TVEFOQ0UKICAgIHNoZWxsLlNIR2V0Rm9sZGVyUGF0aChOb25lLCBnZXRhdHRyKHdpbjMyLlNobE9iaiwgY3NpZGxfbmFtZSksIE5vbmUsIHdpbjMyLlNobE9iai5TSEdGUF9UWVBFX0NVUlJFTlQsIGJ1ZikKICAgIGRpciA9IGpuYS5OYXRpdmUudG9TdHJpbmcoYnVmLnRvc3RyaW5nKCkpLnJzdHJpcCgiXDAiKQoKICAgICMgRG93bmdyYWRlIHRvIHNob3J0IHBhdGggbmFtZSBpZiBoYXZlIGhpZ2hiaXQgY2hhcnMuIFNlZQogICAgIyA8aHR0cDovL2J1Z3MuYWN0aXZlc3RhdGUuY29tL3Nob3dfYnVnLmNnaT9pZD04NTA5OT4uCiAgICBoYXNfaGlnaF9jaGFyID0gRmFsc2UKICAgIGZvciBjIGluIGRpcjoKICAgICAgICBpZiBvcmQoYykgPiAyNTU6CiAgICAgICAgICAgIGhhc19oaWdoX2NoYXIgPSBUcnVlCiAgICAgICAgICAgIGJyZWFrCiAgICBpZiBoYXNfaGlnaF9jaGFyOgogICAgICAgIGJ1ZiA9IGFycmF5Lnplcm9zKCdjJywgYnVmX3NpemUpCiAgICAgICAga2VybmVsID0gd2luMzIuS2VybmVsMzIuSU5TVEFOQ0UKICAgICAgICBpZiBrZXJuYWwuR2V0U2hvcnRQYXRoTmFtZShkaXIsIGJ1ZiwgYnVmX3NpemUpOgogICAgICAgICAgICBkaXIgPSBqbmEuTmF0aXZlLnRvU3RyaW5nKGJ1Zi50b3N0cmluZygpKS5yc3RyaXAoIlwwIikKCiAgICByZXR1cm4gZGlyCgppZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgIHRyeToKICAgICAgICBpbXBvcnQgd2luMzJjb20uc2hlbGwKICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9weXdpbjMyCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2luZGxsCiAgICAgICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl93aXRoX2N0eXBlcwogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW1wb3J0IGNvbS5zdW4uam5hCiAgICAgICAgICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9qbmEKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX2Zyb21fcmVnaXN0cnkKCgojLS0tLSBzZWxmIHRlc3QgY29kZQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGFwcG5hbWUgPSAiTXlBcHAiCiAgICBhcHBhdXRob3IgPSAiTXlDb21wYW55IgoKICAgIHByb3BzID0gKCJ1c2VyX2RhdGFfZGlyIiwgInNpdGVfZGF0YV9kaXIiLAogICAgICAgICAgICAgInVzZXJfY29uZmlnX2RpciIsICJzaXRlX2NvbmZpZ19kaXIiLAogICAgICAgICAgICAgInVzZXJfY2FjaGVfZGlyIiwgInVzZXJfbG9nX2RpciIpCgogICAgcHJpbnQoIi0tIGFwcCBkaXJzICh3aXRoIG9wdGlvbmFsICd2ZXJzaW9uJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSwgYXBwYXV0aG9yLCB2ZXJzaW9uPSIxLjAiKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpCgogICAgcHJpbnQoIlxuLS0gYXBwIGRpcnMgKHdpdGhvdXQgb3B0aW9uYWwgJ3ZlcnNpb24nKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lLCBhcHBhdXRob3IpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKCiAgICBwcmludCgiXG4tLSBhcHAgZGlycyAod2l0aG91dCBvcHRpb25hbCAnYXBwYXV0aG9yJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSkKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQoKICAgIHByaW50KCJcbi0tIGFwcCBkaXJzICh3aXRoIGRpc2FibGVkICdhcHBhdXRob3InKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lLCBhcHBhdXRob3I9RmFsc2UpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKUEsDBBQAAAAAAAAAIQA8KVjG0AIAANACAABEAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgpfX2FsbF9fID0gWwogICAgIl9fdGl0bGVfXyIsICJfX3N1bW1hcnlfXyIsICJfX3VyaV9fIiwgIl9fdmVyc2lvbl9fIiwgIl9fYXV0aG9yX18iLAogICAgIl9fZW1haWxfXyIsICJfX2xpY2Vuc2VfXyIsICJfX2NvcHlyaWdodF9fIiwKXQoKX190aXRsZV9fID0gInBhY2thZ2luZyIKX19zdW1tYXJ5X18gPSAiQ29yZSB1dGlsaXRpZXMgZm9yIFB5dGhvbiBwYWNrYWdlcyIKX191cmlfXyA9ICJodHRwczovL2dpdGh1Yi5jb20vcHlwYS9wYWNrYWdpbmciCgpfX3ZlcnNpb25fXyA9ICIxNi44IgoKX19hdXRob3JfXyA9ICJEb25hbGQgU3R1ZmZ0IGFuZCBpbmRpdmlkdWFsIGNvbnRyaWJ1dG9ycyIKX19lbWFpbF9fID0gImRvbmFsZEBzdHVmZnQuaW8iCgpfX2xpY2Vuc2VfXyA9ICJCU0Qgb3IgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIgpfX2NvcHlyaWdodF9fID0gIkNvcHlyaWdodCAyMDE0LTIwMTYgJXMiICUgX19hdXRob3JfXwpQSwMEFAAAAAAAAAAhAIF2lsoBAgAAAQIAAEMAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKZnJvbSAuX19hYm91dF9fIGltcG9ydCAoCiAgICBfX2F1dGhvcl9fLCBfX2NvcHlyaWdodF9fLCBfX2VtYWlsX18sIF9fbGljZW5zZV9fLCBfX3N1bW1hcnlfXywgX190aXRsZV9fLAogICAgX191cmlfXywgX192ZXJzaW9uX18KKQoKX19hbGxfXyA9IFsKICAgICJfX3RpdGxlX18iLCAiX19zdW1tYXJ5X18iLCAiX191cmlfXyIsICJfX3ZlcnNpb25fXyIsICJfX2F1dGhvcl9fIiwKICAgICJfX2VtYWlsX18iLCAiX19saWNlbnNlX18iLCAiX19jb3B5cmlnaHRfXyIsCl0KUEsDBBQAAAAAAAAAIQDmaUrjXAMAAFwDAABCAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fY29tcGF0LnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IHN5cwoKClBZMiA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKCiMgZmxha2U4OiBub3FhCgppZiBQWTM6CiAgICBzdHJpbmdfdHlwZXMgPSBzdHIsCmVsc2U6CiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAoKCmRlZiB3aXRoX21ldGFjbGFzcyhtZXRhLCAqYmFzZXMpOgogICAgIiIiCiAgICBDcmVhdGUgYSBiYXNlIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuCiAgICAiIiIKICAgICMgVGhpcyByZXF1aXJlcyBhIGJpdCBvZiBleHBsYW5hdGlvbjogdGhlIGJhc2ljIGlkZWEgaXMgdG8gbWFrZSBhIGR1bW15CiAgICAjIG1ldGFjbGFzcyBmb3Igb25lIGxldmVsIG9mIGNsYXNzIGluc3RhbnRpYXRpb24gdGhhdCByZXBsYWNlcyBpdHNlbGYgd2l0aAogICAgIyB0aGUgYWN0dWFsIG1ldGFjbGFzcy4KICAgIGNsYXNzIG1ldGFjbGFzcyhtZXRhKToKICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHRoaXNfYmFzZXMsIGQpOgogICAgICAgICAgICByZXR1cm4gbWV0YShuYW1lLCBiYXNlcywgZCkKICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YWNsYXNzLCAndGVtcG9yYXJ5X2NsYXNzJywgKCksIHt9KQpQSwMEFAAAAAAAAAAhAPr9pBKIBQAAiAUAAEYAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKCmNsYXNzIEluZmluaXR5KG9iamVjdCk6CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiSW5maW5pdHkiCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHJlcHIoc2VsZikpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX25lZ19fKHNlbGYpOgogICAgICAgIHJldHVybiBOZWdhdGl2ZUluZmluaXR5CgpJbmZpbml0eSA9IEluZmluaXR5KCkKCgpjbGFzcyBOZWdhdGl2ZUluZmluaXR5KG9iamVjdCk6CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiLUluZmluaXR5IgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChyZXByKHNlbGYpKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19uZWdfXyhzZWxmKToKICAgICAgICByZXR1cm4gSW5maW5pdHkKCk5lZ2F0aXZlSW5maW5pdHkgPSBOZWdhdGl2ZUluZmluaXR5KCkKUEsDBBQAAAAAAAAAIQAw+BPcOCAAADggAABCAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBvcwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHN5cwoKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IFBhcnNlRXhjZXB0aW9uLCBQYXJzZVJlc3VsdHMsIHN0cmluZ1N0YXJ0LCBzdHJpbmdFbmQKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IFplcm9Pck1vcmUsIEdyb3VwLCBGb3J3YXJkLCBRdW90ZWRTdHJpbmcKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IExpdGVyYWwgYXMgTCAgIyBub3FhCgpmcm9tIC5fY29tcGF0IGltcG9ydCBzdHJpbmdfdHlwZXMKZnJvbSAuc3BlY2lmaWVycyBpbXBvcnQgU3BlY2lmaWVyLCBJbnZhbGlkU3BlY2lmaWVyCgoKX19hbGxfXyA9IFsKICAgICJJbnZhbGlkTWFya2VyIiwgIlVuZGVmaW5lZENvbXBhcmlzb24iLCAiVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lIiwKICAgICJNYXJrZXIiLCAiZGVmYXVsdF9lbnZpcm9ubWVudCIsCl0KCgpjbGFzcyBJbnZhbGlkTWFya2VyKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIG1hcmtlciB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNTA4LgogICAgIiIiCgoKY2xhc3MgVW5kZWZpbmVkQ29tcGFyaXNvbihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIHZhbHVlIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0LgogICAgIiIiCgoKY2xhc3MgVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBIG5hbWUgd2FzIGF0dGVtcHRlZCB0byBiZSB1c2VkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW5zaWRlIG9mIHRoZQogICAgZW52aXJvbm1lbnQuCiAgICAiIiIKCgpjbGFzcyBOb2RlKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYudmFsdWUpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPHswfSh7MSFyfSk+Ii5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHN0cihzZWxmKSkKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCgpjbGFzcyBWYXJpYWJsZShOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikKCgpjbGFzcyBWYWx1ZShOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiAnInswfSInLmZvcm1hdChzZWxmKQoKCmNsYXNzIE9wKE5vZGUpOgoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKClZBUklBQkxFID0gKAogICAgTCgiaW1wbGVtZW50YXRpb25fdmVyc2lvbiIpIHwKICAgIEwoInBsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwKICAgIEwoImltcGxlbWVudGF0aW9uX25hbWUiKSB8CiAgICBMKCJweXRob25fZnVsbF92ZXJzaW9uIikgfAogICAgTCgicGxhdGZvcm1fcmVsZWFzZSIpIHwKICAgIEwoInBsYXRmb3JtX3ZlcnNpb24iKSB8CiAgICBMKCJwbGF0Zm9ybV9tYWNoaW5lIikgfAogICAgTCgicGxhdGZvcm1fc3lzdGVtIikgfAogICAgTCgicHl0aG9uX3ZlcnNpb24iKSB8CiAgICBMKCJzeXNfcGxhdGZvcm0iKSB8CiAgICBMKCJvc19uYW1lIikgfAogICAgTCgib3MubmFtZSIpIHwgICMgUEVQLTM0NQogICAgTCgic3lzLnBsYXRmb3JtIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS52ZXJzaW9uIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS5tYWNoaW5lIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24iKSB8ICAjIFBFUC0zNDUKICAgIEwoInB5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwgICMgdW5kb2N1bWVudGVkIHNldHVwdG9vbHMgbGVnYWN5CiAgICBMKCJleHRyYSIpCikKQUxJQVNFUyA9IHsKICAgICdvcy5uYW1lJzogJ29zX25hbWUnLAogICAgJ3N5cy5wbGF0Zm9ybSc6ICdzeXNfcGxhdGZvcm0nLAogICAgJ3BsYXRmb3JtLnZlcnNpb24nOiAncGxhdGZvcm1fdmVyc2lvbicsCiAgICAncGxhdGZvcm0ubWFjaGluZSc6ICdwbGF0Zm9ybV9tYWNoaW5lJywKICAgICdwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24nOiAncGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uJywKICAgICdweXRob25faW1wbGVtZW50YXRpb24nOiAncGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uJwp9ClZBUklBQkxFLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBWYXJpYWJsZShBTElBU0VTLmdldCh0WzBdLCB0WzBdKSkpCgpWRVJTSU9OX0NNUCA9ICgKICAgIEwoIj09PSIpIHwKICAgIEwoIj09IikgfAogICAgTCgiPj0iKSB8CiAgICBMKCI8PSIpIHwKICAgIEwoIiE9IikgfAogICAgTCgifj0iKSB8CiAgICBMKCI+IikgfAogICAgTCgiPCIpCikKCk1BUktFUl9PUCA9IFZFUlNJT05fQ01QIHwgTCgibm90IGluIikgfCBMKCJpbiIpCk1BUktFUl9PUC5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogT3AodFswXSkpCgpNQVJLRVJfVkFMVUUgPSBRdW90ZWRTdHJpbmcoIiciKSB8IFF1b3RlZFN0cmluZygnIicpCk1BUktFUl9WQUxVRS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogVmFsdWUodFswXSkpCgpCT09MT1AgPSBMKCJhbmQiKSB8IEwoIm9yIikKCk1BUktFUl9WQVIgPSBWQVJJQUJMRSB8IE1BUktFUl9WQUxVRQoKTUFSS0VSX0lURU0gPSBHcm91cChNQVJLRVJfVkFSICsgTUFSS0VSX09QICsgTUFSS0VSX1ZBUikKTUFSS0VSX0lURU0uc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHR1cGxlKHRbMF0pKQoKTFBBUkVOID0gTCgiKCIpLnN1cHByZXNzKCkKUlBBUkVOID0gTCgiKSIpLnN1cHByZXNzKCkKCk1BUktFUl9FWFBSID0gRm9yd2FyZCgpCk1BUktFUl9BVE9NID0gTUFSS0VSX0lURU0gfCBHcm91cChMUEFSRU4gKyBNQVJLRVJfRVhQUiArIFJQQVJFTikKTUFSS0VSX0VYUFIgPDwgTUFSS0VSX0FUT00gKyBaZXJvT3JNb3JlKEJPT0xPUCArIE1BUktFUl9FWFBSKQoKTUFSS0VSID0gc3RyaW5nU3RhcnQgKyBNQVJLRVJfRVhQUiArIHN0cmluZ0VuZAoKCmRlZiBfY29lcmNlX3BhcnNlX3Jlc3VsdChyZXN1bHRzKToKICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0cywgUGFyc2VSZXN1bHRzKToKICAgICAgICByZXR1cm4gW19jb2VyY2VfcGFyc2VfcmVzdWx0KGkpIGZvciBpIGluIHJlc3VsdHNdCiAgICBlbHNlOgogICAgICAgIHJldHVybiByZXN1bHRzCgoKZGVmIF9mb3JtYXRfbWFya2VyKG1hcmtlciwgZmlyc3Q9VHJ1ZSk6CiAgICBhc3NlcnQgaXNpbnN0YW5jZShtYXJrZXIsIChsaXN0LCB0dXBsZSwgc3RyaW5nX3R5cGVzKSkKCiAgICAjIFNvbWV0aW1lcyB3ZSBoYXZlIGEgc3RydWN0dXJlIGxpa2UgW1suLi5dXSB3aGljaCBpcyBhIHNpbmdsZSBpdGVtIGxpc3QKICAgICMgd2hlcmUgdGhlIHNpbmdsZSBpdGVtIGlzIGl0c2VsZiBpdCdzIG93biBsaXN0LiBJbiB0aGF0IGNhc2Ugd2Ugd2FudCBza2lwCiAgICAjIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gc28gdGhhdCB3ZSBkb24ndCBnZXQgZXh0cmFuZW91cyAoKSBvbiB0aGUKICAgICMgb3V0c2lkZS4KICAgIGlmIChpc2luc3RhbmNlKG1hcmtlciwgbGlzdCkgYW5kIGxlbihtYXJrZXIpID09IDEgYW5kCiAgICAgICAgICAgIGlzaW5zdGFuY2UobWFya2VyWzBdLCAobGlzdCwgdHVwbGUpKSk6CiAgICAgICAgcmV0dXJuIF9mb3JtYXRfbWFya2VyKG1hcmtlclswXSkKCiAgICBpZiBpc2luc3RhbmNlKG1hcmtlciwgbGlzdCk6CiAgICAgICAgaW5uZXIgPSAoX2Zvcm1hdF9tYXJrZXIobSwgZmlyc3Q9RmFsc2UpIGZvciBtIGluIG1hcmtlcikKICAgICAgICBpZiBmaXJzdDoKICAgICAgICAgICAgcmV0dXJuICIgIi5qb2luKGlubmVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAiKCIgKyAiICIuam9pbihpbm5lcikgKyAiKSIKICAgIGVsaWYgaXNpbnN0YW5jZShtYXJrZXIsIHR1cGxlKToKICAgICAgICByZXR1cm4gIiAiLmpvaW4oW20uc2VyaWFsaXplKCkgZm9yIG0gaW4gbWFya2VyXSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1hcmtlcgoKCl9vcGVyYXRvcnMgPSB7CiAgICAiaW4iOiBsYW1iZGEgbGhzLCByaHM6IGxocyBpbiByaHMsCiAgICAibm90IGluIjogbGFtYmRhIGxocywgcmhzOiBsaHMgbm90IGluIHJocywKICAgICI8Ijogb3BlcmF0b3IubHQsCiAgICAiPD0iOiBvcGVyYXRvci5sZSwKICAgICI9PSI6IG9wZXJhdG9yLmVxLAogICAgIiE9Ijogb3BlcmF0b3IubmUsCiAgICAiPj0iOiBvcGVyYXRvci5nZSwKICAgICI+Ijogb3BlcmF0b3IuZ3QsCn0KCgpkZWYgX2V2YWxfb3AobGhzLCBvcCwgcmhzKToKICAgIHRyeToKICAgICAgICBzcGVjID0gU3BlY2lmaWVyKCIiLmpvaW4oW29wLnNlcmlhbGl6ZSgpLCByaHNdKSkKICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHNwZWMuY29udGFpbnMobGhzKQoKICAgIG9wZXIgPSBfb3BlcmF0b3JzLmdldChvcC5zZXJpYWxpemUoKSkKICAgIGlmIG9wZXIgaXMgTm9uZToKICAgICAgICByYWlzZSBVbmRlZmluZWRDb21wYXJpc29uKAogICAgICAgICAgICAiVW5kZWZpbmVkIHswIXJ9IG9uIHsxIXJ9IGFuZCB7MiFyfS4iLmZvcm1hdChvcCwgbGhzLCByaHMpCiAgICAgICAgKQoKICAgIHJldHVybiBvcGVyKGxocywgcmhzKQoKCl91bmRlZmluZWQgPSBvYmplY3QoKQoKCmRlZiBfZ2V0X2VudihlbnZpcm9ubWVudCwgbmFtZSk6CiAgICB2YWx1ZSA9IGVudmlyb25tZW50LmdldChuYW1lLCBfdW5kZWZpbmVkKQoKICAgIGlmIHZhbHVlIGlzIF91bmRlZmluZWQ6CiAgICAgICAgcmFpc2UgVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lKAogICAgICAgICAgICAiezAhcn0gZG9lcyBub3QgZXhpc3QgaW4gZXZhbHVhdGlvbiBlbnZpcm9ubWVudC4iLmZvcm1hdChuYW1lKQogICAgICAgICkKCiAgICByZXR1cm4gdmFsdWUKCgpkZWYgX2V2YWx1YXRlX21hcmtlcnMobWFya2VycywgZW52aXJvbm1lbnQpOgogICAgZ3JvdXBzID0gW1tdXQoKICAgIGZvciBtYXJrZXIgaW4gbWFya2VyczoKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShtYXJrZXIsIChsaXN0LCB0dXBsZSwgc3RyaW5nX3R5cGVzKSkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpOgogICAgICAgICAgICBncm91cHNbLTFdLmFwcGVuZChfZXZhbHVhdGVfbWFya2VycyhtYXJrZXIsIGVudmlyb25tZW50KSkKICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWFya2VyLCB0dXBsZSk6CiAgICAgICAgICAgIGxocywgb3AsIHJocyA9IG1hcmtlcgoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsaHMsIFZhcmlhYmxlKToKICAgICAgICAgICAgICAgIGxoc192YWx1ZSA9IF9nZXRfZW52KGVudmlyb25tZW50LCBsaHMudmFsdWUpCiAgICAgICAgICAgICAgICByaHNfdmFsdWUgPSByaHMudmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxoc192YWx1ZSA9IGxocy52YWx1ZQogICAgICAgICAgICAgICAgcmhzX3ZhbHVlID0gX2dldF9lbnYoZW52aXJvbm1lbnQsIHJocy52YWx1ZSkKCiAgICAgICAgICAgIGdyb3Vwc1stMV0uYXBwZW5kKF9ldmFsX29wKGxoc192YWx1ZSwgb3AsIHJoc192YWx1ZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXNzZXJ0IG1hcmtlciBpbiBbImFuZCIsICJvciJdCiAgICAgICAgICAgIGlmIG1hcmtlciA9PSAib3IiOgogICAgICAgICAgICAgICAgZ3JvdXBzLmFwcGVuZChbXSkKCiAgICByZXR1cm4gYW55KGFsbChpdGVtKSBmb3IgaXRlbSBpbiBncm91cHMpCgoKZGVmIGZvcm1hdF9mdWxsX3ZlcnNpb24oaW5mbyk6CiAgICB2ZXJzaW9uID0gJ3swLm1ham9yfS57MC5taW5vcn0uezAubWljcm99Jy5mb3JtYXQoaW5mbykKICAgIGtpbmQgPSBpbmZvLnJlbGVhc2VsZXZlbAogICAgaWYga2luZCAhPSAnZmluYWwnOgogICAgICAgIHZlcnNpb24gKz0ga2luZFswXSArIHN0cihpbmZvLnNlcmlhbCkKICAgIHJldHVybiB2ZXJzaW9uCgoKZGVmIGRlZmF1bHRfZW52aXJvbm1lbnQoKToKICAgIGlmIGhhc2F0dHIoc3lzLCAnaW1wbGVtZW50YXRpb24nKToKICAgICAgICBpdmVyID0gZm9ybWF0X2Z1bGxfdmVyc2lvbihzeXMuaW1wbGVtZW50YXRpb24udmVyc2lvbikKICAgICAgICBpbXBsZW1lbnRhdGlvbl9uYW1lID0gc3lzLmltcGxlbWVudGF0aW9uLm5hbWUKICAgIGVsc2U6CiAgICAgICAgaXZlciA9ICcwJwogICAgICAgIGltcGxlbWVudGF0aW9uX25hbWUgPSAnJwoKICAgIHJldHVybiB7CiAgICAgICAgImltcGxlbWVudGF0aW9uX25hbWUiOiBpbXBsZW1lbnRhdGlvbl9uYW1lLAogICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjogaXZlciwKICAgICAgICAib3NfbmFtZSI6IG9zLm5hbWUsCiAgICAgICAgInBsYXRmb3JtX21hY2hpbmUiOiBwbGF0Zm9ybS5tYWNoaW5lKCksCiAgICAgICAgInBsYXRmb3JtX3JlbGVhc2UiOiBwbGF0Zm9ybS5yZWxlYXNlKCksCiAgICAgICAgInBsYXRmb3JtX3N5c3RlbSI6IHBsYXRmb3JtLnN5c3RlbSgpLAogICAgICAgICJwbGF0Zm9ybV92ZXJzaW9uIjogcGxhdGZvcm0udmVyc2lvbigpLAogICAgICAgICJweXRob25fZnVsbF92ZXJzaW9uIjogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSwKICAgICAgICAicGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uIjogcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCksCiAgICAgICAgInB5dGhvbl92ZXJzaW9uIjogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKVs6M10sCiAgICAgICAgInN5c19wbGF0Zm9ybSI6IHN5cy5wbGF0Zm9ybSwKICAgIH0KCgpjbGFzcyBNYXJrZXIob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWFya2VyKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX21hcmtlcnMgPSBfY29lcmNlX3BhcnNlX3Jlc3VsdChNQVJLRVIucGFyc2VTdHJpbmcobWFya2VyKSkKICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgZXJyX3N0ciA9ICJJbnZhbGlkIG1hcmtlcjogezAhcn0sIHBhcnNlIGVycm9yIGF0IHsxIXJ9Ii5mb3JtYXQoCiAgICAgICAgICAgICAgICBtYXJrZXIsIG1hcmtlcltlLmxvYzplLmxvYyArIDhdKQogICAgICAgICAgICByYWlzZSBJbnZhbGlkTWFya2VyKGVycl9zdHIpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIF9mb3JtYXRfbWFya2VyKHNlbGYuX21hcmtlcnMpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPE1hcmtlcih7MCFyfSk+Ii5mb3JtYXQoc3RyKHNlbGYpKQoKICAgIGRlZiBldmFsdWF0ZShzZWxmLCBlbnZpcm9ubWVudD1Ob25lKToKICAgICAgICAiIiJFdmFsdWF0ZSBhIG1hcmtlci4KCiAgICAgICAgUmV0dXJuIHRoZSBib29sZWFuIGZyb20gZXZhbHVhdGluZyB0aGUgZ2l2ZW4gbWFya2VyIGFnYWluc3QgdGhlCiAgICAgICAgZW52aXJvbm1lbnQuIGVudmlyb25tZW50IGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIG92ZXJyaWRlIGFsbCBvcgogICAgICAgIHBhcnQgb2YgdGhlIGRldGVybWluZWQgZW52aXJvbm1lbnQuCgogICAgICAgIFRoZSBlbnZpcm9ubWVudCBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGN1cnJlbnQgUHl0aG9uIHByb2Nlc3MuCiAgICAgICAgIiIiCiAgICAgICAgY3VycmVudF9lbnZpcm9ubWVudCA9IGRlZmF1bHRfZW52aXJvbm1lbnQoKQogICAgICAgIGlmIGVudmlyb25tZW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICBjdXJyZW50X2Vudmlyb25tZW50LnVwZGF0ZShlbnZpcm9ubWVudCkKCiAgICAgICAgcmV0dXJuIF9ldmFsdWF0ZV9tYXJrZXJzKHNlbGYuX21hcmtlcnMsIGN1cnJlbnRfZW52aXJvbm1lbnQpClBLAwQUAAAAAAAAACEApYYd2wMRAAADEQAARwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IHN0cmluZwppbXBvcnQgcmUKCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBzdHJpbmdTdGFydCwgc3RyaW5nRW5kLCBvcmlnaW5hbFRleHRGb3IsIFBhcnNlRXhjZXB0aW9uCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBaZXJvT3JNb3JlLCBXb3JkLCBPcHRpb25hbCwgUmVnZXgsIENvbWJpbmUKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IExpdGVyYWwgYXMgTCAgIyBub3FhCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4uc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJscGFyc2UKCmZyb20gLm1hcmtlcnMgaW1wb3J0IE1BUktFUl9FWFBSLCBNYXJrZXIKZnJvbSAuc3BlY2lmaWVycyBpbXBvcnQgTGVnYWN5U3BlY2lmaWVyLCBTcGVjaWZpZXIsIFNwZWNpZmllclNldAoKCmNsYXNzIEludmFsaWRSZXF1aXJlbWVudChWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCByZXF1aXJlbWVudCB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNTA4LgogICAgIiIiCgoKQUxQSEFOVU0gPSBXb3JkKHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cykKCkxCUkFDS0VUID0gTCgiWyIpLnN1cHByZXNzKCkKUkJSQUNLRVQgPSBMKCJdIikuc3VwcHJlc3MoKQpMUEFSRU4gPSBMKCIoIikuc3VwcHJlc3MoKQpSUEFSRU4gPSBMKCIpIikuc3VwcHJlc3MoKQpDT01NQSA9IEwoIiwiKS5zdXBwcmVzcygpClNFTUlDT0xPTiA9IEwoIjsiKS5zdXBwcmVzcygpCkFUID0gTCgiQCIpLnN1cHByZXNzKCkKClBVTkNUVUFUSU9OID0gV29yZCgiLV8uIikKSURFTlRJRklFUl9FTkQgPSBBTFBIQU5VTSB8IChaZXJvT3JNb3JlKFBVTkNUVUFUSU9OKSArIEFMUEhBTlVNKQpJREVOVElGSUVSID0gQ29tYmluZShBTFBIQU5VTSArIFplcm9Pck1vcmUoSURFTlRJRklFUl9FTkQpKQoKTkFNRSA9IElERU5USUZJRVIoIm5hbWUiKQpFWFRSQSA9IElERU5USUZJRVIKClVSSSA9IFJlZ2V4KHInW14gXSsnKSgidXJsIikKVVJMID0gKEFUICsgVVJJKQoKRVhUUkFTX0xJU1QgPSBFWFRSQSArIFplcm9Pck1vcmUoQ09NTUEgKyBFWFRSQSkKRVhUUkFTID0gKExCUkFDS0VUICsgT3B0aW9uYWwoRVhUUkFTX0xJU1QpICsgUkJSQUNLRVQpKCJleHRyYXMiKQoKVkVSU0lPTl9QRVA0NDAgPSBSZWdleChTcGVjaWZpZXIuX3JlZ2V4X3N0ciwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpClZFUlNJT05fTEVHQUNZID0gUmVnZXgoTGVnYWN5U3BlY2lmaWVyLl9yZWdleF9zdHIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKVkVSU0lPTl9PTkUgPSBWRVJTSU9OX1BFUDQ0MCBeIFZFUlNJT05fTEVHQUNZClZFUlNJT05fTUFOWSA9IENvbWJpbmUoVkVSU0lPTl9PTkUgKyBaZXJvT3JNb3JlKENPTU1BICsgVkVSU0lPTl9PTkUpLAogICAgICAgICAgICAgICAgICAgICAgIGpvaW5TdHJpbmc9IiwiLCBhZGphY2VudD1GYWxzZSkoIl9yYXdfc3BlYyIpCl9WRVJTSU9OX1NQRUMgPSBPcHRpb25hbCgoKExQQVJFTiArIFZFUlNJT05fTUFOWSArIFJQQVJFTikgfCBWRVJTSU9OX01BTlkpKQpfVkVSU0lPTl9TUEVDLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0Ll9yYXdfc3BlYyBvciAnJykKClZFUlNJT05fU1BFQyA9IG9yaWdpbmFsVGV4dEZvcihfVkVSU0lPTl9TUEVDKSgic3BlY2lmaWVyIikKVkVSU0lPTl9TUEVDLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0WzFdKQoKTUFSS0VSX0VYUFIgPSBvcmlnaW5hbFRleHRGb3IoTUFSS0VSX0VYUFIoKSkoIm1hcmtlciIpCk1BUktFUl9FWFBSLnNldFBhcnNlQWN0aW9uKAogICAgbGFtYmRhIHMsIGwsIHQ6IE1hcmtlcihzW3QuX29yaWdpbmFsX3N0YXJ0OnQuX29yaWdpbmFsX2VuZF0pCikKTUFSS0VSX1NFUEVSQVRPUiA9IFNFTUlDT0xPTgpNQVJLRVIgPSBNQVJLRVJfU0VQRVJBVE9SICsgTUFSS0VSX0VYUFIKClZFUlNJT05fQU5EX01BUktFUiA9IFZFUlNJT05fU1BFQyArIE9wdGlvbmFsKE1BUktFUikKVVJMX0FORF9NQVJLRVIgPSBVUkwgKyBPcHRpb25hbChNQVJLRVIpCgpOQU1FRF9SRVFVSVJFTUVOVCA9IFwKICAgIE5BTUUgKyBPcHRpb25hbChFWFRSQVMpICsgKFVSTF9BTkRfTUFSS0VSIHwgVkVSU0lPTl9BTkRfTUFSS0VSKQoKUkVRVUlSRU1FTlQgPSBzdHJpbmdTdGFydCArIE5BTUVEX1JFUVVJUkVNRU5UICsgc3RyaW5nRW5kCgoKY2xhc3MgUmVxdWlyZW1lbnQob2JqZWN0KToKICAgICIiIlBhcnNlIGEgcmVxdWlyZW1lbnQuCgogICAgUGFyc2UgYSBnaXZlbiByZXF1aXJlbWVudCBzdHJpbmcgaW50byBpdHMgcGFydHMsIHN1Y2ggYXMgbmFtZSwgc3BlY2lmaWVyLAogICAgVVJMLCBhbmQgZXh0cmFzLiBSYWlzZXMgSW52YWxpZFJlcXVpcmVtZW50IG9uIGEgYmFkbHktZm9ybWVkIHJlcXVpcmVtZW50CiAgICBzdHJpbmcuCiAgICAiIiIKCiAgICAjIFRPRE86IENhbiB3ZSB0ZXN0IHdoZXRoZXIgc29tZXRoaW5nIGlzIGNvbnRhaW5lZCB3aXRoaW4gYSByZXF1aXJlbWVudD8KICAgICMgICAgICAgSWYgc28gaG93IGRvIHdlIGRvIHRoYXQ/IERvIHdlIG5lZWQgdG8gdGVzdCBhZ2FpbnN0IHRoZSBfbmFtZV8gb2YKICAgICMgICAgICAgdGhlIHRoaW5nIGFzIHdlbGwgYXMgdGhlIHZlcnNpb24/IFdoYXQgYWJvdXQgdGhlIG1hcmtlcnM/CiAgICAjIFRPRE86IENhbiB3ZSBub3JtYWxpemUgdGhlIG5hbWUgYW5kIGV4dHJhIG5hbWU/CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVpcmVtZW50X3N0cmluZyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXEgPSBSRVFVSVJFTUVOVC5wYXJzZVN0cmluZyhyZXF1aXJlbWVudF9zdHJpbmcpCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRSZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgICJJbnZhbGlkIHJlcXVpcmVtZW50LCBwYXJzZSBlcnJvciBhdCBcInswIXJ9XCIiLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zdHJpbmdbZS5sb2M6ZS5sb2MgKyA4XSkpCgogICAgICAgIHNlbGYubmFtZSA9IHJlcS5uYW1lCiAgICAgICAgaWYgcmVxLnVybDoKICAgICAgICAgICAgcGFyc2VkX3VybCA9IHVybHBhcnNlLnVybHBhcnNlKHJlcS51cmwpCiAgICAgICAgICAgIGlmIG5vdCAocGFyc2VkX3VybC5zY2hlbWUgYW5kIHBhcnNlZF91cmwubmV0bG9jKSBvciAoCiAgICAgICAgICAgICAgICAgICAgbm90IHBhcnNlZF91cmwuc2NoZW1lIGFuZCBub3QgcGFyc2VkX3VybC5uZXRsb2MpOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZFJlcXVpcmVtZW50KCJJbnZhbGlkIFVSTCBnaXZlbiIpCiAgICAgICAgICAgIHNlbGYudXJsID0gcmVxLnVybAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudXJsID0gTm9uZQogICAgICAgIHNlbGYuZXh0cmFzID0gc2V0KHJlcS5leHRyYXMuYXNMaXN0KCkgaWYgcmVxLmV4dHJhcyBlbHNlIFtdKQogICAgICAgIHNlbGYuc3BlY2lmaWVyID0gU3BlY2lmaWVyU2V0KHJlcS5zcGVjaWZpZXIpCiAgICAgICAgc2VsZi5tYXJrZXIgPSByZXEubWFya2VyIGlmIHJlcS5tYXJrZXIgZWxzZSBOb25lCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcGFydHMgPSBbc2VsZi5uYW1lXQoKICAgICAgICBpZiBzZWxmLmV4dHJhczoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJbezB9XSIuZm9ybWF0KCIsIi5qb2luKHNvcnRlZChzZWxmLmV4dHJhcykpKSkKCiAgICAgICAgaWYgc2VsZi5zcGVjaWZpZXI6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZChzdHIoc2VsZi5zcGVjaWZpZXIpKQoKICAgICAgICBpZiBzZWxmLnVybDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJAIHswfSIuZm9ybWF0KHNlbGYudXJsKSkKCiAgICAgICAgaWYgc2VsZi5tYXJrZXI6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiOyB7MH0iLmZvcm1hdChzZWxmLm1hcmtlcikpCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxSZXF1aXJlbWVudCh7MCFyfSk+Ii5mb3JtYXQoc3RyKHNlbGYpKQpQSwMEFAAAAAAAAAAhAHxFg4x5bQAAeW0AAEUAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgYWJjCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgcmUKCmZyb20gLl9jb21wYXQgaW1wb3J0IHN0cmluZ190eXBlcywgd2l0aF9tZXRhY2xhc3MKZnJvbSAudmVyc2lvbiBpbXBvcnQgVmVyc2lvbiwgTGVnYWN5VmVyc2lvbiwgcGFyc2UKCgpjbGFzcyBJbnZhbGlkU3BlY2lmaWVyKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHNwZWNpZmllciB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNDQwLgogICAgIiIiCgoKY2xhc3MgQmFzZVNwZWNpZmllcih3aXRoX21ldGFjbGFzcyhhYmMuQUJDTWV0YSwgb2JqZWN0KSk6CgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0aGUgc3RyIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgU3BlY2lmaWVyIGxpa2Ugb2JqZWN0LiBUaGlzCiAgICAgICAgc2hvdWxkIGJlIHJlcHJlc2VudGF0aXZlIG9mIHRoZSBTcGVjaWZpZXIgaXRzZWxmLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgaGFzaCB2YWx1ZSBmb3IgdGhpcyBTcGVjaWZpZXIgbGlrZSBvYmplY3QuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdoZXRoZXIgb3Igbm90IHRoZSB0d28gU3BlY2lmaWVyIGxpa2UKICAgICAgICBvYmplY3RzIGFyZSBlcXVhbC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdGhlIHR3byBTcGVjaWZpZXIgbGlrZQogICAgICAgIG9iamVjdHMgYXJlIG5vdCBlcXVhbC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0cHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHByZS1yZWxlYXNlcyBhcyBhIHdob2xlIGFyZSBhbGxvd2VkIGJ5IHRoaXMKICAgICAgICBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiIKICAgICAgICBTZXRzIHdoZXRoZXIgb3Igbm90IHByZS1yZWxlYXNlcyBhcyBhIHdob2xlIGFyZSBhbGxvd2VkIGJ5IHRoaXMKICAgICAgICBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGl0ZW0gaXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBUYWtlcyBhbiBpdGVyYWJsZSBvZiBpdGVtcyBhbmQgZmlsdGVycyB0aGVtIHNvIHRoYXQgb25seSBpdGVtcyB3aGljaAogICAgICAgIGFyZSBjb250YWluZWQgd2l0aGluIHRoaXMgc3BlY2lmaWVyIGFyZSBhbGxvd2VkIGluIGl0LgogICAgICAgICIiIgoKCmNsYXNzIF9JbmRpdmlkdWFsU3BlY2lmaWVyKEJhc2VTcGVjaWZpZXIpOgoKICAgIF9vcGVyYXRvcnMgPSB7fQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcGVjPSIiLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICBtYXRjaCA9IHNlbGYuX3JlZ2V4LnNlYXJjaChzcGVjKQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFNwZWNpZmllcigiSW52YWxpZCBzcGVjaWZpZXI6ICd7MH0nIi5mb3JtYXQoc3BlYykpCgogICAgICAgIHNlbGYuX3NwZWMgPSAoCiAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJvcGVyYXRvciIpLnN0cmlwKCksCiAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJ2ZXJzaW9uIikuc3RyaXAoKSwKICAgICAgICApCgogICAgICAgICMgU3RvcmUgd2hldGhlciBvciBub3QgdGhpcyBTcGVjaWZpZXIgc2hvdWxkIGFjY2VwdCBwcmVyZWxlYXNlcwogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gcHJlcmVsZWFzZXMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcHJlID0gKAogICAgICAgICAgICAiLCBwcmVyZWxlYXNlcz17MCFyfSIuZm9ybWF0KHNlbGYucHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGVsc2UgIiIKICAgICAgICApCgogICAgICAgIHJldHVybiAiPHswfSh7MSFyfXsyfSk+Ii5mb3JtYXQoCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLAogICAgICAgICAgICBzdHIoc2VsZiksCiAgICAgICAgICAgIHByZSwKICAgICAgICApCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJ7MH17MX0iLmZvcm1hdCgqc2VsZi5fc3BlYykKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fc3BlYykKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvdGhlciA9IHNlbGYuX19jbGFzc19fKG90aGVyKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjID09IG90aGVyLl9zcGVjCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3RoZXIgPSBzZWxmLl9fY2xhc3NfXyhvdGhlcikKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlYyAhPSBvdGhlci5fc3BlYwoKICAgIGRlZiBfZ2V0X29wZXJhdG9yKHNlbGYsIG9wKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCAiX2NvbXBhcmVfezB9Ii5mb3JtYXQoc2VsZi5fb3BlcmF0b3JzW29wXSkpCgogICAgZGVmIF9jb2VyY2VfdmVyc2lvbihzZWxmLCB2ZXJzaW9uKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uLCAoTGVnYWN5VmVyc2lvbiwgVmVyc2lvbikpOgogICAgICAgICAgICB2ZXJzaW9uID0gcGFyc2UodmVyc2lvbikKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG9wZXJhdG9yKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY1sxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9wcmVyZWxlYXNlcwoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSB2YWx1ZQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CiAgICAgICAgcmV0dXJuIHNlbGYuY29udGFpbnMoaXRlbSkKCiAgICBkZWYgY29udGFpbnMoc2VsZiwgaXRlbSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBEZXRlcm1pbmUgaWYgcHJlcmVsZWFzZXMgYXJlIHRvIGJlIGFsbG93ZWQgb3Igbm90LgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIE5vcm1hbGl6ZSBpdGVtIHRvIGEgVmVyc2lvbiBvciBMZWdhY3lWZXJzaW9uLCB0aGlzIGFsbG93cyB1cyB0byBoYXZlCiAgICAgICAgIyBhIHNob3J0Y3V0IGZvciBgYCIyLjAiIGluIFNwZWNpZmllcigiPj0yIikKICAgICAgICBpdGVtID0gc2VsZi5fY29lcmNlX3ZlcnNpb24oaXRlbSkKCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGJlIHN1cHBvcnRpbmcgcHJlcmVsZWFzZXMgaW4gdGhpcyBzcGVjaWZpZXIKICAgICAgICAjIG9yIG5vdCwgaWYgd2UgZG8gbm90IHN1cHBvcnQgcHJlcmVsZWFzZXMgdGhhbiB3ZSBjYW4gc2hvcnQgY2lyY3VpdAogICAgICAgICMgbG9naWMgaWYgdGhpcyB2ZXJzaW9uIGlzIGEgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgaXRlbS5pc19wcmVyZWxlYXNlIGFuZCBub3QgcHJlcmVsZWFzZXM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIEFjdHVhbGx5IGRvIHRoZSBjb21wYXJpc29uIHRvIGRldGVybWluZSBpZiB0aGlzIGl0ZW0gaXMgY29udGFpbmVkCiAgICAgICAgIyB3aXRoaW4gdGhpcyBTcGVjaWZpZXIgb3Igbm90LgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfb3BlcmF0b3Ioc2VsZi5vcGVyYXRvcikoaXRlbSwgc2VsZi52ZXJzaW9uKQoKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgIHlpZWxkZWQgPSBGYWxzZQogICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzID0gW10KCiAgICAgICAga3cgPSB7InByZXJlbGVhc2VzIjogcHJlcmVsZWFzZXMgaWYgcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUgZWxzZSBUcnVlfQoKICAgICAgICAjIEF0dGVtcHQgdG8gaXRlcmF0ZSBvdmVyIGFsbCB0aGUgdmFsdWVzIGluIHRoZSBpdGVyYWJsZSBhbmQgaWYgYW55IG9mCiAgICAgICAgIyB0aGVtIG1hdGNoLCB5aWVsZCB0aGVtLgogICAgICAgIGZvciB2ZXJzaW9uIGluIGl0ZXJhYmxlOgogICAgICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHZlcnNpb24pCgogICAgICAgICAgICBpZiBzZWxmLmNvbnRhaW5zKHBhcnNlZF92ZXJzaW9uLCAqKmt3KToKICAgICAgICAgICAgICAgICMgSWYgb3VyIHZlcnNpb24gaXMgYSBwcmVyZWxlYXNlLCBhbmQgd2Ugd2VyZSBub3Qgc2V0IHRvIGFsbG93CiAgICAgICAgICAgICAgICAjIHByZXJlbGVhc2VzLCB0aGVuIHdlJ2xsIHN0b3JlIGl0IGZvciBsYXRlciBpbmNhc2Ugbm90aGluZwogICAgICAgICAgICAgICAgIyBlbHNlIG1hdGNoZXMgdGhpcyBzcGVjaWZpZXIuCiAgICAgICAgICAgICAgICBpZiAocGFyc2VkX3ZlcnNpb24uaXNfcHJlcmVsZWFzZSBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgICAgIChwcmVyZWxlYXNlcyBvciBzZWxmLnByZXJlbGVhc2VzKSk6CiAgICAgICAgICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMuYXBwZW5kKHZlcnNpb24pCiAgICAgICAgICAgICAgICAjIEVpdGhlciB0aGlzIGlzIG5vdCBhIHByZXJlbGVhc2UsIG9yIHdlIHNob3VsZCBoYXZlIGJlZW4KICAgICAgICAgICAgICAgICMgYWNjZXB0aW5nIHByZXJlbGVhc2VzIGZyb20gdGhlIGJlZ2luaW5nLgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB5aWVsZGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHZlcnNpb24KCiAgICAgICAgIyBOb3cgdGhhdCB3ZSd2ZSBpdGVyYXRlZCBvdmVyIGV2ZXJ5dGhpbmcsIGRldGVybWluZSBpZiB3ZSd2ZSB5aWVsZGVkCiAgICAgICAgIyBhbnkgdmFsdWVzLCBhbmQgaWYgd2UgaGF2ZSBub3QgYW5kIHdlIGhhdmUgYW55IHByZXJlbGVhc2VzIHN0b3JlZCB1cAogICAgICAgICMgdGhlbiB3ZSB3aWxsIGdvIGFoZWFkIGFuZCB5aWVsZCB0aGUgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgbm90IHlpZWxkZWQgYW5kIGZvdW5kX3ByZXJlbGVhc2VzOgogICAgICAgICAgICBmb3IgdmVyc2lvbiBpbiBmb3VuZF9wcmVyZWxlYXNlczoKICAgICAgICAgICAgICAgIHlpZWxkIHZlcnNpb24KCgpjbGFzcyBMZWdhY3lTcGVjaWZpZXIoX0luZGl2aWR1YWxTcGVjaWZpZXIpOgoKICAgIF9yZWdleF9zdHIgPSAoCiAgICAgICAgciIiIgogICAgICAgICg/UDxvcGVyYXRvcj4oPT18IT18PD18Pj18PHw+KSkKICAgICAgICBccyoKICAgICAgICAoP1A8dmVyc2lvbj4KICAgICAgICAgICAgW14sO1xzKV0qICMgU2luY2UgdGhpcyBpcyBhICJsZWdhY3kiIHNwZWNpZmllciwgYW5kIHRoZSB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAjIHN0cmluZyBjYW4gYmUganVzdCBhYm91dCBhbnl0aGluZywgd2UgbWF0Y2ggZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgIyBleGNlcHQgZm9yIHdoaXRlc3BhY2UsIGEgc2VtaS1jb2xvbiBmb3IgbWFya2VyIHN1cHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAjIGEgY2xvc2luZyBwYXJlbiBzaW5jZSB2ZXJzaW9ucyBjYW4gYmUgZW5jbG9zZWQgaW4KICAgICAgICAgICAgICAgICAgICAgICMgdGhlbSwgYW5kIGEgY29tbWEgc2luY2UgaXQncyBhIHZlcnNpb24gc2VwYXJhdG9yLgogICAgICAgICkKICAgICAgICAiIiIKICAgICkKCiAgICBfcmVnZXggPSByZS5jb21waWxlKAogICAgICAgIHIiXlxzKiIgKyBfcmVnZXhfc3RyICsgciJccyokIiwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCgogICAgX29wZXJhdG9ycyA9IHsKICAgICAgICAiPT0iOiAiZXF1YWwiLAogICAgICAgICIhPSI6ICJub3RfZXF1YWwiLAogICAgICAgICI8PSI6ICJsZXNzX3RoYW5fZXF1YWwiLAogICAgICAgICI+PSI6ICJncmVhdGVyX3RoYW5fZXF1YWwiLAogICAgICAgICI8IjogImxlc3NfdGhhbiIsCiAgICAgICAgIj4iOiAiZ3JlYXRlcl90aGFuIiwKICAgIH0KCiAgICBkZWYgX2NvZXJjZV92ZXJzaW9uKHNlbGYsIHZlcnNpb24pOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb24sIExlZ2FjeVZlcnNpb24pOgogICAgICAgICAgICB2ZXJzaW9uID0gTGVnYWN5VmVyc2lvbihzdHIodmVyc2lvbikpCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBkZWYgX2NvbXBhcmVfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA9PSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9ub3RfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSAhPSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA8PSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA+PSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA8IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID4gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCgpkZWYgX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlKGZuKToKICAgIEBmdW5jdG9vbHMud3JhcHMoZm4pCiAgICBkZWYgd3JhcHBlZChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocHJvc3BlY3RpdmUsIFZlcnNpb24pOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gZm4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpCiAgICByZXR1cm4gd3JhcHBlZAoKCmNsYXNzIFNwZWNpZmllcihfSW5kaXZpZHVhbFNwZWNpZmllcik6CgogICAgX3JlZ2V4X3N0ciA9ICgKICAgICAgICByIiIiCiAgICAgICAgKD9QPG9wZXJhdG9yPih+PXw9PXwhPXw8PXw+PXw8fD58PT09KSkKICAgICAgICAoP1A8dmVyc2lvbj4KICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIFRoZSBpZGVudGl0eSBvcGVyYXRvcnMgYWxsb3cgZm9yIGFuIGVzY2FwZSBoYXRjaCB0aGF0IHdpbGwKICAgICAgICAgICAgICAgICMgZG8gYW4gZXhhY3Qgc3RyaW5nIG1hdGNoIG9mIHRoZSB2ZXJzaW9uIHlvdSB3aXNoIHRvIGluc3RhbGwuCiAgICAgICAgICAgICAgICAjIFRoaXMgd2lsbCBub3QgYmUgcGFyc2VkIGJ5IFBFUCA0NDAgYW5kIHdlIGNhbm5vdCBkZXRlcm1pbmUKICAgICAgICAgICAgICAgICMgYW55IHNlbWFudGljIG1lYW5pbmcgZnJvbSBpdC4gVGhpcyBvcGVyYXRvciBpcyBkaXNjb3VyYWdlZAogICAgICAgICAgICAgICAgIyBidXQgaW5jbHVkZWQgZW50aXJlbHkgYXMgYW4gZXNjYXBlIGhhdGNoLgogICAgICAgICAgICAgICAgKD88PT09PSkgICMgT25seSBtYXRjaCBmb3IgdGhlIGlkZW50aXR5IG9wZXJhdG9yCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIFteXHNdKiAgICAjIFdlIGp1c3QgbWF0Y2ggZXZlcnl0aGluZywgZXhjZXB0IGZvciB3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzaW5jZSB3ZSBhcmUgb25seSB0ZXN0aW5nIGZvciBzdHJpY3QgaWRlbnRpdHkuCiAgICAgICAgICAgICkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIChub24pZXF1YWxpdHkgb3BlcmF0b3JzIGFsbG93IGZvciB3aWxkIGNhcmQgYW5kIGxvY2FsCiAgICAgICAgICAgICAgICAjIHZlcnNpb25zIHRvIGJlIHNwZWNpZmllZCBzbyB3ZSBoYXZlIHRvIGRlZmluZSB0aGVzZSB0d28KICAgICAgICAgICAgICAgICMgb3BlcmF0b3JzIHNlcGFyYXRlbHkgdG8gZW5hYmxlIHRoYXQuCiAgICAgICAgICAgICAgICAoPzw9PT18IT0pICAgICAgICAgICAgIyBPbmx5IG1hdGNoIGZvciBlcXVhbHMgYW5kIG5vdCBlcXVhbHMKCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIHY/CiAgICAgICAgICAgICAgICAoPzpbMC05XSshKT8gICAgICAgICAgIyBlcG9jaAogICAgICAgICAgICAgICAgWzAtOV0rKD86XC5bMC05XSspKiAgICMgcmVsZWFzZQogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcHJlIHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgKGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIFswLTldKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/Oi1bMC05XSspfCg/OlstX1wuXT8ocG9zdHxyZXZ8cilbLV9cLl0/WzAtOV0qKQogICAgICAgICAgICAgICAgKT8KCiAgICAgICAgICAgICAgICAjIFlvdSBjYW5ub3QgdXNlIGEgd2lsZCBjYXJkIGFuZCBhIGRldiBvciBsb2NhbCB2ZXJzaW9uCiAgICAgICAgICAgICAgICAjIHRvZ2V0aGVyIHNvIGdyb3VwIHRoZW0gd2l0aCBhIHwgYW5kIG1ha2UgdGhlbSBvcHRpb25hbC4KICAgICAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgICAgICg/OlstX1wuXT9kZXZbLV9cLl0/WzAtOV0qKT8gICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86XCtbYS16MC05XSsoPzpbLV9cLl1bYS16MC05XSspKik/ICMgbG9jYWwKICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgXC5cKiAgIyBXaWxkIGNhcmQgc3ludGF4IG9mIC4qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICApCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIFRoZSBjb21wYXRpYmxlIG9wZXJhdG9yIHJlcXVpcmVzIGF0IGxlYXN0IHR3byBkaWdpdHMgaW4gdGhlCiAgICAgICAgICAgICAgICAjIHJlbGVhc2Ugc2VnbWVudC4KICAgICAgICAgICAgICAgICg/PD1+PSkgICAgICAgICAgICAgICAjIE9ubHkgbWF0Y2ggZm9yIHRoZSBjb21wYXRpYmxlIG9wZXJhdG9yCgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICB2PwogICAgICAgICAgICAgICAgKD86WzAtOV0rISk/ICAgICAgICAgICMgZXBvY2gKICAgICAgICAgICAgICAgIFswLTldKyg/OlwuWzAtOV0rKSsgICAjIHJlbGVhc2UgIChXZSBoYXZlIGEgKyBpbnN0ZWFkIG9mIGEgKikKICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHByZSByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIChhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICBbMC05XSoKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86LVswLTldKyl8KD86Wy1fXC5dPyhwb3N0fHJldnxyKVstX1wuXT9bMC05XSopCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86Wy1fXC5dP2RldlstX1wuXT9bMC05XSopPyAgICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgICkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgQWxsIG90aGVyIG9wZXJhdG9ycyBvbmx5IGFsbG93IGEgc3ViIHNldCBvZiB3aGF0IHRoZQogICAgICAgICAgICAgICAgIyAobm9uKWVxdWFsaXR5IG9wZXJhdG9ycyBkby4gU3BlY2lmaWNhbGx5IHRoZXkgZG8gbm90IGFsbG93CiAgICAgICAgICAgICAgICAjIGxvY2FsIHZlcnNpb25zIHRvIGJlIHNwZWNpZmllZCBub3IgZG8gdGhleSBhbGxvdyB0aGUgcHJlZml4CiAgICAgICAgICAgICAgICAjIG1hdGNoaW5nIHdpbGQgY2FyZHMuCiAgICAgICAgICAgICAgICAoPzwhPT18IT18fj0pICAgICAgICAgIyBXZSBoYXZlIHNwZWNpYWwgY2FzZXMgZm9yIHRoZXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcGVyYXRvcnMgc28gd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgbWF0Y2ggaGVyZS4KCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIHY/CiAgICAgICAgICAgICAgICAoPzpbMC05XSshKT8gICAgICAgICAgIyBlcG9jaAogICAgICAgICAgICAgICAgWzAtOV0rKD86XC5bMC05XSspKiAgICMgcmVsZWFzZQogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcHJlIHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgKGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIFswLTldKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzotWzAtOV0rKXwoPzpbLV9cLl0/KHBvc3R8cmV2fHIpWy1fXC5dP1swLTldKikKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzpbLV9cLl0/ZGV2Wy1fXC5dP1swLTldKik/ICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgKQogICAgICAgICkKICAgICAgICAiIiIKICAgICkKCiAgICBfcmVnZXggPSByZS5jb21waWxlKAogICAgICAgIHIiXlxzKiIgKyBfcmVnZXhfc3RyICsgciJccyokIiwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCgogICAgX29wZXJhdG9ycyA9IHsKICAgICAgICAifj0iOiAiY29tcGF0aWJsZSIsCiAgICAgICAgIj09IjogImVxdWFsIiwKICAgICAgICAiIT0iOiAibm90X2VxdWFsIiwKICAgICAgICAiPD0iOiAibGVzc190aGFuX2VxdWFsIiwKICAgICAgICAiPj0iOiAiZ3JlYXRlcl90aGFuX2VxdWFsIiwKICAgICAgICAiPCI6ICJsZXNzX3RoYW4iLAogICAgICAgICI+IjogImdyZWF0ZXJfdGhhbiIsCiAgICAgICAgIj09PSI6ICJhcmJpdHJhcnkiLAogICAgfQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9jb21wYXRpYmxlKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIENvbXBhdGlibGUgcmVsZWFzZXMgaGF2ZSBhbiBlcXVpdmFsZW50IGNvbWJpbmF0aW9uIG9mID49IGFuZCA9PS4gVGhhdAogICAgICAgICMgaXMgdGhhdCB+PTIuMiBpcyBlcXVpdmFsZW50IHRvID49Mi4yLD09Mi4qLiBUaGlzIGFsbG93cyB1cyB0bwogICAgICAgICMgaW1wbGVtZW50IHRoaXMgaW4gdGVybXMgb2YgdGhlIG90aGVyIHNwZWNpZmllcnMgaW5zdGVhZCBvZgogICAgICAgICMgaW1wbGVtZW50aW5nIGl0IG91cnNlbHZlcy4gVGhlIG9ubHkgdGhpbmcgd2UgbmVlZCB0byBkbyBpcyBjb25zdHJ1Y3QKICAgICAgICAjIHRoZSBvdGhlciBzcGVjaWZpZXJzLgoKICAgICAgICAjIFdlIHdhbnQgZXZlcnl0aGluZyBidXQgdGhlIGxhc3QgaXRlbSBpbiB0aGUgdmVyc2lvbiwgYnV0IHdlIHdhbnQgdG8KICAgICAgICAjIGlnbm9yZSBwb3N0IGFuZCBkZXYgcmVsZWFzZXMgYW5kIHdlIHdhbnQgdG8gdHJlYXQgdGhlIHByZS1yZWxlYXNlIGFzCiAgICAgICAgIyBpdCdzIG93biBzZXBhcmF0ZSBzZWdtZW50LgogICAgICAgIHByZWZpeCA9ICIuIi5qb2luKAogICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgaXRlcnRvb2xzLnRha2V3aGlsZSgKICAgICAgICAgICAgICAgICAgICBsYW1iZGEgeDogKG5vdCB4LnN0YXJ0c3dpdGgoInBvc3QiKSBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LnN0YXJ0c3dpdGgoImRldiIpKSwKICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbl9zcGxpdChzcGVjKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKVs6LTFdCiAgICAgICAgKQoKICAgICAgICAjIEFkZCB0aGUgcHJlZml4IG5vdGF0aW9uIHRvIHRoZSBlbmQgb2Ygb3VyIHN0cmluZwogICAgICAgIHByZWZpeCArPSAiLioiCgogICAgICAgIHJldHVybiAoc2VsZi5fZ2V0X29wZXJhdG9yKCI+PSIpKHByb3NwZWN0aXZlLCBzcGVjKSBhbmQKICAgICAgICAgICAgICAgIHNlbGYuX2dldF9vcGVyYXRvcigiPT0iKShwcm9zcGVjdGl2ZSwgcHJlZml4KSkKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgV2UgbmVlZCBzcGVjaWFsIGxvZ2ljIHRvIGhhbmRsZSBwcmVmaXggbWF0Y2hpbmcKICAgICAgICBpZiBzcGVjLmVuZHN3aXRoKCIuKiIpOgogICAgICAgICAgICAjIEluIHRoZSBjYXNlIG9mIHByZWZpeCBtYXRjaGluZyB3ZSB3YW50IHRvIGlnbm9yZSBsb2NhbCBzZWdtZW50LgogICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IFZlcnNpb24ocHJvc3BlY3RpdmUucHVibGljKQogICAgICAgICAgICAjIFNwbGl0IHRoZSBzcGVjIG91dCBieSBkb3RzLCBhbmQgcHJldGVuZCB0aGF0IHRoZXJlIGlzIGFuIGltcGxpY2l0CiAgICAgICAgICAgICMgZG90IGluIGJldHdlZW4gYSByZWxlYXNlIHNlZ21lbnQgYW5kIGEgcHJlLXJlbGVhc2Ugc2VnbWVudC4KICAgICAgICAgICAgc3BlYyA9IF92ZXJzaW9uX3NwbGl0KHNwZWNbOi0yXSkgICMgUmVtb3ZlIHRoZSB0cmFpbGluZyAuKgoKICAgICAgICAgICAgIyBTcGxpdCB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBvdXQgYnkgZG90cywgYW5kIHByZXRlbmQgdGhhdCB0aGVyZQogICAgICAgICAgICAjIGlzIGFuIGltcGxpY2l0IGRvdCBpbiBiZXR3ZWVuIGEgcmVsZWFzZSBzZWdtZW50IGFuZCBhIHByZS1yZWxlYXNlCiAgICAgICAgICAgICMgc2VnbWVudC4KICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBfdmVyc2lvbl9zcGxpdChzdHIocHJvc3BlY3RpdmUpKQoKICAgICAgICAgICAgIyBTaG9ydGVuIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIHRvIGJlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc3BlYwogICAgICAgICAgICAjIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSBpZiB0aGUgc3BlY2lmaWVyIGlzIGEgcHJlZml4IG9mIHRoZQogICAgICAgICAgICAjIHByb3NwZWN0aXZlIHZlcnNpb24gb3Igbm90LgogICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IHByb3NwZWN0aXZlWzpsZW4oc3BlYyldCgogICAgICAgICAgICAjIFBhZCBvdXQgb3VyIHR3byBzaWRlcyB3aXRoIHplcm9zIHNvIHRoYXQgdGhleSBib3RoIGVxdWFsIHRoZSBzYW1lCiAgICAgICAgICAgICMgbGVuZ3RoLgogICAgICAgICAgICBzcGVjLCBwcm9zcGVjdGl2ZSA9IF9wYWRfdmVyc2lvbihzcGVjLCBwcm9zcGVjdGl2ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIENvbnZlcnQgb3VyIHNwZWMgc3RyaW5nIGludG8gYSBWZXJzaW9uCiAgICAgICAgICAgIHNwZWMgPSBWZXJzaW9uKHNwZWMpCgogICAgICAgICAgICAjIElmIHRoZSBzcGVjaWZpZXIgZG9lcyBub3QgaGF2ZSBhIGxvY2FsIHNlZ21lbnQsIHRoZW4gd2Ugd2FudCB0bwogICAgICAgICAgICAjIGFjdCBhcyBpZiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBhbHNvIGRvZXMgbm90IGhhdmUgYSBsb2NhbAogICAgICAgICAgICAjIHNlZ21lbnQuCiAgICAgICAgICAgIGlmIG5vdCBzcGVjLmxvY2FsOgogICAgICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBWZXJzaW9uKHByb3NwZWN0aXZlLnB1YmxpYykKCiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID09IHNwZWMKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfbm90X2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gbm90IHNlbGYuX2NvbXBhcmVfZXF1YWwocHJvc3BlY3RpdmUsIHNwZWMpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDw9IFZlcnNpb24oc3BlYykKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPj0gVmVyc2lvbihzcGVjKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgQ29udmVydCBvdXIgc3BlYyB0byBhIFZlcnNpb24gaW5zdGFuY2UsIHNpbmNlIHdlJ2xsIHdhbnQgdG8gd29yayB3aXRoCiAgICAgICAgIyBpdCBhcyBhIHZlcnNpb24uCiAgICAgICAgc3BlYyA9IFZlcnNpb24oc3BlYykKCiAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gaXMgbGVzcyB0aGFuIHRoZSBzcGVjCiAgICAgICAgIyB2ZXJzaW9uLiBJZiBpdCdzIG5vdCB3ZSBjYW4gc2hvcnQgY2lyY3VpdCBhbmQganVzdCByZXR1cm4gRmFsc2Ugbm93CiAgICAgICAgIyBpbnN0ZWFkIG9mIGRvaW5nIGV4dHJhIHVubmVlZGVkIHdvcmsuCiAgICAgICAgaWYgbm90IHByb3NwZWN0aXZlIDwgc3BlYzoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgVGhpcyBzcGVjaWFsIGNhc2UgaXMgaGVyZSBzbyB0aGF0LCB1bmxlc3MgdGhlIHNwZWNpZmllciBpdHNlbGYKICAgICAgICAjIGluY2x1ZGVzIGlzIGEgcHJlLXJlbGVhc2UgdmVyc2lvbiwgdGhhdCB3ZSBkbyBub3QgYWNjZXB0IHByZS1yZWxlYXNlCiAgICAgICAgIyB2ZXJzaW9ucyBmb3IgdGhlIHZlcnNpb24gbWVudGlvbmVkIGluIHRoZSBzcGVjaWZpZXIgKGUuZy4gPDMuMSBzaG91bGQKICAgICAgICAjIG5vdCBtYXRjaCAzLjEuZGV2MCwgYnV0IHNob3VsZCBtYXRjaCAzLjAuZGV2MCkuCiAgICAgICAgaWYgbm90IHNwZWMuaXNfcHJlcmVsZWFzZSBhbmQgcHJvc3BlY3RpdmUuaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgaWYgVmVyc2lvbihwcm9zcGVjdGl2ZS5iYXNlX3ZlcnNpb24pID09IFZlcnNpb24oc3BlYy5iYXNlX3ZlcnNpb24pOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgSWYgd2UndmUgZ290dGVuIHRvIGhlcmUsIGl0IG1lYW5zIHRoYXQgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBib3RoCiAgICAgICAgIyBsZXNzIHRoYW4gdGhlIHNwZWMgdmVyc2lvbiAqYW5kKiBpdCdzIG5vdCBhIHByZS1yZWxlYXNlIG9mIHRoZSBzYW1lCiAgICAgICAgIyB2ZXJzaW9uIGluIHRoZSBzcGVjLgogICAgICAgIHJldHVybiBUcnVlCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBDb252ZXJ0IG91ciBzcGVjIHRvIGEgVmVyc2lvbiBpbnN0YW5jZSwgc2luY2Ugd2UnbGwgd2FudCB0byB3b3JrIHdpdGgKICAgICAgICAjIGl0IGFzIGEgdmVyc2lvbi4KICAgICAgICBzcGVjID0gVmVyc2lvbihzcGVjKQoKICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWMKICAgICAgICAjIHZlcnNpb24uIElmIGl0J3Mgbm90IHdlIGNhbiBzaG9ydCBjaXJjdWl0IGFuZCBqdXN0IHJldHVybiBGYWxzZSBub3cKICAgICAgICAjIGluc3RlYWQgb2YgZG9pbmcgZXh0cmEgdW5uZWVkZWQgd29yay4KICAgICAgICBpZiBub3QgcHJvc3BlY3RpdmUgPiBzcGVjOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBUaGlzIHNwZWNpYWwgY2FzZSBpcyBoZXJlIHNvIHRoYXQsIHVubGVzcyB0aGUgc3BlY2lmaWVyIGl0c2VsZgogICAgICAgICMgaW5jbHVkZXMgaXMgYSBwb3N0LXJlbGVhc2UgdmVyc2lvbiwgdGhhdCB3ZSBkbyBub3QgYWNjZXB0CiAgICAgICAgIyBwb3N0LXJlbGVhc2UgdmVyc2lvbnMgZm9yIHRoZSB2ZXJzaW9uIG1lbnRpb25lZCBpbiB0aGUgc3BlY2lmaWVyCiAgICAgICAgIyAoZS5nLiA+My4xIHNob3VsZCBub3QgbWF0Y2ggMy4wLnBvc3QwLCBidXQgc2hvdWxkIG1hdGNoIDMuMi5wb3N0MCkuCiAgICAgICAgaWYgbm90IHNwZWMuaXNfcG9zdHJlbGVhc2UgYW5kIHByb3NwZWN0aXZlLmlzX3Bvc3RyZWxlYXNlOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBFbnN1cmUgdGhhdCB3ZSBkbyBub3QgYWxsb3cgYSBsb2NhbCB2ZXJzaW9uIG9mIHRoZSB2ZXJzaW9uIG1lbnRpb25lZAogICAgICAgICMgaW4gdGhlIHNwZWNpZmllciwgd2hpY2ggaXMgdGVjaGluY2FsbHkgZ3JlYXRlciB0aGFuLCB0byBtYXRjaC4KICAgICAgICBpZiBwcm9zcGVjdGl2ZS5sb2NhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgVmVyc2lvbihwcm9zcGVjdGl2ZS5iYXNlX3ZlcnNpb24pID09IFZlcnNpb24oc3BlYy5iYXNlX3ZlcnNpb24pOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgSWYgd2UndmUgZ290dGVuIHRvIGhlcmUsIGl0IG1lYW5zIHRoYXQgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBib3RoCiAgICAgICAgIyBncmVhdGVyIHRoYW4gdGhlIHNwZWMgdmVyc2lvbiAqYW5kKiBpdCdzIG5vdCBhIHByZS1yZWxlYXNlIG9mIHRoZQogICAgICAgICMgc2FtZSB2ZXJzaW9uIGluIHRoZSBzcGVjLgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9jb21wYXJlX2FyYml0cmFyeShzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHN0cihwcm9zcGVjdGl2ZSkubG93ZXIoKSA9PSBzdHIoc3BlYykubG93ZXIoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgICMgSWYgdGhlcmUgaXMgYW4gZXhwbGljaXQgcHJlcmVsZWFzZXMgc2V0IGZvciB0aGlzLCB0aGVuIHdlJ2xsIGp1c3QKICAgICAgICAjIGJsaW5kbHkgdXNlIHRoYXQuCiAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcmVyZWxlYXNlcwoKICAgICAgICAjIExvb2sgYXQgYWxsIG9mIG91ciBzcGVjaWZpZXJzIGFuZCBkZXRlcm1pbmUgaWYgdGhleSBhcmUgaW5jbHVzaXZlCiAgICAgICAgIyBvcGVyYXRvcnMsIGFuZCBpZiB0aGV5IGFyZSBpZiB0aGV5IGFyZSBpbmNsdWRpbmcgYW4gZXhwbGljaXQKICAgICAgICAjIHByZXJlbGVhc2UuCiAgICAgICAgb3BlcmF0b3IsIHZlcnNpb24gPSBzZWxmLl9zcGVjCiAgICAgICAgaWYgb3BlcmF0b3IgaW4gWyI9PSIsICI+PSIsICI8PSIsICJ+PSIsICI9PT0iXToKICAgICAgICAgICAgIyBUaGUgPT0gc3BlY2lmaWVyIGNhbiBpbmNsdWRlIGEgdHJhaWxpbmcgLiosIGlmIGl0IGRvZXMgd2UKICAgICAgICAgICAgIyB3YW50IHRvIHJlbW92ZSBiZWZvcmUgcGFyc2luZy4KICAgICAgICAgICAgaWYgb3BlcmF0b3IgPT0gIj09IiBhbmQgdmVyc2lvbi5lbmRzd2l0aCgiLioiKToKICAgICAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uWzotMl0KCiAgICAgICAgICAgICMgUGFyc2UgdGhlIHZlcnNpb24sIGFuZCBpZiBpdCBpcyBhIHByZS1yZWxlYXNlIHRoYW4gdGhpcwogICAgICAgICAgICAjIHNwZWNpZmllciBhbGxvd3MgcHJlLXJlbGVhc2VzLgogICAgICAgICAgICBpZiBwYXJzZSh2ZXJzaW9uKS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHZhbHVlCgoKX3ByZWZpeF9yZWdleCA9IHJlLmNvbXBpbGUociJeKFswLTldKykoKD86YXxifGN8cmMpWzAtOV0rKSQiKQoKCmRlZiBfdmVyc2lvbl9zcGxpdCh2ZXJzaW9uKToKICAgIHJlc3VsdCA9IFtdCiAgICBmb3IgaXRlbSBpbiB2ZXJzaW9uLnNwbGl0KCIuIik6CiAgICAgICAgbWF0Y2ggPSBfcHJlZml4X3JlZ2V4LnNlYXJjaChpdGVtKQogICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICByZXN1bHQuZXh0ZW5kKG1hdGNoLmdyb3VwcygpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaXRlbSkKICAgIHJldHVybiByZXN1bHQKCgpkZWYgX3BhZF92ZXJzaW9uKGxlZnQsIHJpZ2h0KToKICAgIGxlZnRfc3BsaXQsIHJpZ2h0X3NwbGl0ID0gW10sIFtdCgogICAgIyBHZXQgdGhlIHJlbGVhc2Ugc2VnbWVudCBvZiBvdXIgdmVyc2lvbnMKICAgIGxlZnRfc3BsaXQuYXBwZW5kKGxpc3QoaXRlcnRvb2xzLnRha2V3aGlsZShsYW1iZGEgeDogeC5pc2RpZ2l0KCksIGxlZnQpKSkKICAgIHJpZ2h0X3NwbGl0LmFwcGVuZChsaXN0KGl0ZXJ0b29scy50YWtld2hpbGUobGFtYmRhIHg6IHguaXNkaWdpdCgpLCByaWdodCkpKQoKICAgICMgR2V0IHRoZSByZXN0IG9mIG91ciB2ZXJzaW9ucwogICAgbGVmdF9zcGxpdC5hcHBlbmQobGVmdFtsZW4obGVmdF9zcGxpdFswXSk6XSkKICAgIHJpZ2h0X3NwbGl0LmFwcGVuZChyaWdodFtsZW4ocmlnaHRfc3BsaXRbMF0pOl0pCgogICAgIyBJbnNlcnQgb3VyIHBhZGRpbmcKICAgIGxlZnRfc3BsaXQuaW5zZXJ0KAogICAgICAgIDEsCiAgICAgICAgWyIwIl0gKiBtYXgoMCwgbGVuKHJpZ2h0X3NwbGl0WzBdKSAtIGxlbihsZWZ0X3NwbGl0WzBdKSksCiAgICApCiAgICByaWdodF9zcGxpdC5pbnNlcnQoCiAgICAgICAgMSwKICAgICAgICBbIjAiXSAqIG1heCgwLCBsZW4obGVmdF9zcGxpdFswXSkgLSBsZW4ocmlnaHRfc3BsaXRbMF0pKSwKICAgICkKCiAgICByZXR1cm4gKAogICAgICAgIGxpc3QoaXRlcnRvb2xzLmNoYWluKCpsZWZ0X3NwbGl0KSksCiAgICAgICAgbGlzdChpdGVydG9vbHMuY2hhaW4oKnJpZ2h0X3NwbGl0KSksCiAgICApCgoKY2xhc3MgU3BlY2lmaWVyU2V0KEJhc2VTcGVjaWZpZXIpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcGVjaWZpZXJzPSIiLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIFNwbGl0IG9uICwgdG8gYnJlYWsgZWFjaCBpbmRpZGl2dWFsIHNwZWNpZmllciBpbnRvIGl0J3Mgb3duIGl0ZW0sIGFuZAogICAgICAgICMgc3RyaXAgZWFjaCBpdGVtIHRvIHJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICAgICAgc3BlY2lmaWVycyA9IFtzLnN0cmlwKCkgZm9yIHMgaW4gc3BlY2lmaWVycy5zcGxpdCgiLCIpIGlmIHMuc3RyaXAoKV0KCiAgICAgICAgIyBQYXJzZWQgZWFjaCBpbmRpdmlkdWFsIHNwZWNpZmllciwgYXR0ZW1wdGluZyBmaXJzdCB0byBtYWtlIGl0IGEKICAgICAgICAjIFNwZWNpZmllciBhbmQgZmFsbGluZyBiYWNrIHRvIGEgTGVnYWN5U3BlY2lmaWVyLgogICAgICAgIHBhcnNlZCA9IHNldCgpCiAgICAgICAgZm9yIHNwZWNpZmllciBpbiBzcGVjaWZpZXJzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBwYXJzZWQuYWRkKFNwZWNpZmllcihzcGVjaWZpZXIpKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgICAgIHBhcnNlZC5hZGQoTGVnYWN5U3BlY2lmaWVyKHNwZWNpZmllcikpCgogICAgICAgICMgVHVybiBvdXIgcGFyc2VkIHNwZWNpZmllcnMgaW50byBhIGZyb3plbiBzZXQgYW5kIHNhdmUgdGhlbSBmb3IgbGF0ZXIuCiAgICAgICAgc2VsZi5fc3BlY3MgPSBmcm96ZW5zZXQocGFyc2VkKQoKICAgICAgICAjIFN0b3JlIG91ciBwcmVyZWxlYXNlcyB2YWx1ZSBzbyB3ZSBjYW4gdXNlIGl0IGxhdGVyIHRvIGRldGVybWluZSBpZgogICAgICAgICMgd2UgYWNjZXB0IHByZXJlbGVhc2VzIG9yIG5vdC4KICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHByZXJlbGVhc2VzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHByZSA9ICgKICAgICAgICAgICAgIiwgcHJlcmVsZWFzZXM9ezAhcn0iLmZvcm1hdChzZWxmLnByZXJlbGVhc2VzKQogICAgICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZQogICAgICAgICAgICBlbHNlICIiCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gIjxTcGVjaWZpZXJTZXQoezAhcn17MX0pPiIuZm9ybWF0KHN0cihzZWxmKSwgcHJlKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiLCIuam9pbihzb3J0ZWQoc3RyKHMpIGZvciBzIGluIHNlbGYuX3NwZWNzKSkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fc3BlY3MpCgogICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KG90aGVyKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNwZWNpZmllclNldCk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICBzcGVjaWZpZXIgPSBTcGVjaWZpZXJTZXQoKQogICAgICAgIHNwZWNpZmllci5fc3BlY3MgPSBmcm96ZW5zZXQoc2VsZi5fc3BlY3MgfCBvdGhlci5fc3BlY3MpCgogICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIE5vbmUgYW5kIG90aGVyLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc3BlY2lmaWVyLl9wcmVyZWxlYXNlcyA9IG90aGVyLl9wcmVyZWxlYXNlcwogICAgICAgIGVsaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUgYW5kIG90aGVyLl9wcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gc2VsZi5fcHJlcmVsZWFzZXMKICAgICAgICBlbGlmIHNlbGYuX3ByZXJlbGVhc2VzID09IG90aGVyLl9wcmVyZWxlYXNlczoKICAgICAgICAgICAgc3BlY2lmaWVyLl9wcmVyZWxlYXNlcyA9IHNlbGYuX3ByZXJlbGVhc2VzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJDYW5ub3QgY29tYmluZSBTcGVjaWZpZXJTZXRzIHdpdGggVHJ1ZSBhbmQgRmFsc2UgcHJlcmVsZWFzZSAiCiAgICAgICAgICAgICAgICAib3ZlcnJpZGVzLiIKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gc3BlY2lmaWVyCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBfSW5kaXZpZHVhbFNwZWNpZmllcik6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KHN0cihvdGhlcikpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU3BlY2lmaWVyU2V0KToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjcyA9PSBvdGhlci5fc3BlY3MKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQoc3RyKG90aGVyKSkKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTcGVjaWZpZXJTZXQpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNzICE9IG90aGVyLl9zcGVjcwoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5fc3BlY3MpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3NwZWNzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgICMgSWYgd2UgaGF2ZSBiZWVuIGdpdmVuIGFuIGV4cGxpY2l0IHByZXJlbGVhc2UgbW9kaWZpZXIsIHRoZW4gd2UnbGwKICAgICAgICAjIHBhc3MgdGhhdCB0aHJvdWdoIGhlcmUuCiAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcmVyZWxlYXNlcwoKICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgYW55IHNwZWNpZmllcnMsIGFuZCB3ZSBkb24ndCBoYXZlIGEgZm9yY2VkIHZhbHVlLAogICAgICAgICMgdGhlbiB3ZSdsbCBqdXN0IHJldHVybiBOb25lIHNpbmNlIHdlIGRvbid0IGtub3cgaWYgdGhpcyBzaG91bGQgaGF2ZQogICAgICAgICMgcHJlLXJlbGVhc2VzIG9yIG5vdC4KICAgICAgICBpZiBub3Qgc2VsZi5fc3BlY3M6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICMgT3RoZXJ3aXNlIHdlJ2xsIHNlZSBpZiBhbnkgb2YgdGhlIGdpdmVuIHNwZWNpZmllcnMgYWNjZXB0CiAgICAgICAgIyBwcmVyZWxlYXNlcywgaWYgYW55IG9mIHRoZW0gZG8gd2UnbGwgcmV0dXJuIFRydWUsIG90aGVyd2lzZSBGYWxzZS4KICAgICAgICByZXR1cm4gYW55KHMucHJlcmVsZWFzZXMgZm9yIHMgaW4gc2VsZi5fc3BlY3MpCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHZhbHVlCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICByZXR1cm4gc2VsZi5jb250YWlucyhpdGVtKQoKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIEVuc3VyZSB0aGF0IG91ciBpdGVtIGlzIGEgVmVyc2lvbiBvciBMZWdhY3lWZXJzaW9uIGluc3RhbmNlLgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZW0sIChMZWdhY3lWZXJzaW9uLCBWZXJzaW9uKSk6CiAgICAgICAgICAgIGl0ZW0gPSBwYXJzZShpdGVtKQoKICAgICAgICAjIERldGVybWluZSBpZiB3ZSdyZSBmb3JjaW5nIGEgcHJlcmVsZWFzZSBvciBub3QsIGlmIHdlJ3JlIG5vdCBmb3JjaW5nCiAgICAgICAgIyBvbmUgZm9yIHRoaXMgcGFydGljdWxhciBmaWx0ZXIgY2FsbCwgdGhlbiB3ZSdsbCB1c2Ugd2hhdGV2ZXIgdGhlCiAgICAgICAgIyBTcGVjaWZpZXJTZXQgdGhpbmtzIGZvciB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgc3VwcG9ydCBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBwcmVyZWxlYXNlcyA9IHNlbGYucHJlcmVsZWFzZXMKCiAgICAgICAgIyBXZSBjYW4gZGV0ZXJtaW5lIGlmIHdlJ3JlIGdvaW5nIHRvIGFsbG93IHByZS1yZWxlYXNlcyBieSBsb29raW5nIHRvCiAgICAgICAgIyBzZWUgaWYgYW55IG9mIHRoZSB1bmRlcmx5aW5nIGl0ZW1zIHN1cHBvcnRzIHRoZW0uIElmIG5vbmUgb2YgdGhlbSBkbwogICAgICAgICMgYW5kIHRoaXMgaXRlbSBpcyBhIHByZS1yZWxlYXNlIHRoZW4gd2UgZG8gbm90IGFsbG93IGl0IGFuZCB3ZSBjYW4KICAgICAgICAjIHNob3J0IGNpcmN1aXQgdGhhdCBoZXJlLgogICAgICAgICMgTm90ZTogVGhpcyBtZWFucyB0aGF0IDEuMC5kZXYxIHdvdWxkIG5vdCBiZSBjb250YWluZWQgaW4gc29tZXRoaW5nCiAgICAgICAgIyAgICAgICBsaWtlID49MS4wLmRldmFiYyBob3dldmVyIGl0IHdvdWxkIGJlIGluID49MS4wLmRlYmFiYyw+MC4wLmRldjAKICAgICAgICBpZiBub3QgcHJlcmVsZWFzZXMgYW5kIGl0ZW0uaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgV2Ugc2ltcGx5IGRpc3BhdGNoIHRvIHRoZSB1bmRlcmx5aW5nIHNwZWNzIGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCiAgICAgICAgIyBnaXZlbiB2ZXJzaW9uIGlzIGNvbnRhaW5lZCB3aXRoaW4gYWxsIG9mIHRoZW0uCiAgICAgICAgIyBOb3RlOiBUaGlzIHVzZSBvZiBhbGwoKSBoZXJlIG1lYW5zIHRoYXQgYW4gZW1wdHkgc2V0IG9mIHNwZWNpZmllcnMKICAgICAgICAjICAgICAgIHdpbGwgYWx3YXlzIHJldHVybiBUcnVlLCB0aGlzIGlzIGFuIGV4cGxpY2l0IGRlc2lnbiBkZWNpc2lvbi4KICAgICAgICByZXR1cm4gYWxsKAogICAgICAgICAgICBzLmNvbnRhaW5zKGl0ZW0sIHByZXJlbGVhc2VzPXByZXJlbGVhc2VzKQogICAgICAgICAgICBmb3IgcyBpbiBzZWxmLl9zcGVjcwogICAgICAgICkKCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIERldGVybWluZSBpZiB3ZSdyZSBmb3JjaW5nIGEgcHJlcmVsZWFzZSBvciBub3QsIGlmIHdlJ3JlIG5vdCBmb3JjaW5nCiAgICAgICAgIyBvbmUgZm9yIHRoaXMgcGFydGljdWxhciBmaWx0ZXIgY2FsbCwgdGhlbiB3ZSdsbCB1c2Ugd2hhdGV2ZXIgdGhlCiAgICAgICAgIyBTcGVjaWZpZXJTZXQgdGhpbmtzIGZvciB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgc3VwcG9ydCBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBwcmVyZWxlYXNlcyA9IHNlbGYucHJlcmVsZWFzZXMKCiAgICAgICAgIyBJZiB3ZSBoYXZlIGFueSBzcGVjaWZpZXJzLCB0aGVuIHdlIHdhbnQgdG8gd3JhcCBvdXIgaXRlcmFibGUgaW4gdGhlCiAgICAgICAgIyBmaWx0ZXIgbWV0aG9kIGZvciBlYWNoIG9uZSwgdGhpcyB3aWxsIGFjdCBhcyBhIGxvZ2ljYWwgQU5EIGFtb25nc3QKICAgICAgICAjIGVhY2ggc3BlY2lmaWVyLgogICAgICAgIGlmIHNlbGYuX3NwZWNzOgogICAgICAgICAgICBmb3Igc3BlYyBpbiBzZWxmLl9zcGVjczoKICAgICAgICAgICAgICAgIGl0ZXJhYmxlID0gc3BlYy5maWx0ZXIoaXRlcmFibGUsIHByZXJlbGVhc2VzPWJvb2wocHJlcmVsZWFzZXMpKQogICAgICAgICAgICByZXR1cm4gaXRlcmFibGUKICAgICAgICAjIElmIHdlIGRvIG5vdCBoYXZlIGFueSBzcGVjaWZpZXJzLCB0aGVuIHdlIG5lZWQgdG8gaGF2ZSBhIHJvdWdoIGZpbHRlcgogICAgICAgICMgd2hpY2ggd2lsbCBmaWx0ZXIgb3V0IGFueSBwcmUtcmVsZWFzZXMsIHVubGVzcyB0aGVyZSBhcmUgbm8gZmluYWwKICAgICAgICAjIHJlbGVhc2VzLCBhbmQgd2hpY2ggd2lsbCBmaWx0ZXIgb3V0IExlZ2FjeVZlcnNpb24gaW4gZ2VuZXJhbC4KICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWx0ZXJlZCA9IFtdCiAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzID0gW10KCiAgICAgICAgICAgIGZvciBpdGVtIGluIGl0ZXJhYmxlOgogICAgICAgICAgICAgICAgIyBFbnN1cmUgdGhhdCB3ZSBzb21lIGtpbmQgb2YgVmVyc2lvbiBjbGFzcyBmb3IgdGhpcyBpdGVtLgogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IHBhcnNlKGl0ZW0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gaXRlbQoKICAgICAgICAgICAgICAgICMgRmlsdGVyIG91dCBhbnkgaXRlbSB3aGljaCBpcyBwYXJzZWQgYXMgYSBMZWdhY3lWZXJzaW9uCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhcnNlZF92ZXJzaW9uLCBMZWdhY3lWZXJzaW9uKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICMgU3RvcmUgYW55IGl0ZW0gd2hpY2ggaXMgYSBwcmUtcmVsZWFzZSBmb3IgbGF0ZXIgdW5sZXNzIHdlJ3ZlCiAgICAgICAgICAgICAgICAjIGFscmVhZHkgZm91bmQgYSBmaW5hbCB2ZXJzaW9uIG9yIHdlIGFyZSBhY2NlcHRpbmcgcHJlcmVsZWFzZXMKICAgICAgICAgICAgICAgIGlmIHBhcnNlZF92ZXJzaW9uLmlzX3ByZXJlbGVhc2UgYW5kIG5vdCBwcmVyZWxlYXNlczoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgZmlsdGVyZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzLmFwcGVuZChpdGVtKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC5hcHBlbmQoaXRlbSkKCiAgICAgICAgICAgICMgSWYgd2UndmUgZm91bmQgbm8gaXRlbXMgZXhjZXB0IGZvciBwcmUtcmVsZWFzZXMsIHRoZW4gd2UnbGwgZ28KICAgICAgICAgICAgIyBhaGVhZCBhbmQgdXNlIHRoZSBwcmUtcmVsZWFzZXMKICAgICAgICAgICAgaWYgbm90IGZpbHRlcmVkIGFuZCBmb3VuZF9wcmVyZWxlYXNlcyBhbmQgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZF9wcmVyZWxlYXNlcwoKICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkClBLAwQUAAAAAAAAACEAxeonD6UBAAClAQAAQAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgcmUKCgpfY2Fub25pY2FsaXplX3JlZ2V4ID0gcmUuY29tcGlsZShyIlstXy5dKyIpCgoKZGVmIGNhbm9uaWNhbGl6ZV9uYW1lKG5hbWUpOgogICAgIyBUaGlzIGlzIHRha2VuIGZyb20gUEVQIDUwMy4KICAgIHJldHVybiBfY2Fub25pY2FsaXplX3JlZ2V4LnN1YigiLSIsIG5hbWUpLmxvd2VyKCkKUEsDBBQAAAAAAAAAIQAO78ahJC0AACQtAABCAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCgpmcm9tIC5fc3RydWN0dXJlcyBpbXBvcnQgSW5maW5pdHkKCgpfX2FsbF9fID0gWwogICAgInBhcnNlIiwgIlZlcnNpb24iLCAiTGVnYWN5VmVyc2lvbiIsICJJbnZhbGlkVmVyc2lvbiIsICJWRVJTSU9OX1BBVFRFUk4iCl0KCgpfVmVyc2lvbiA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoCiAgICAiX1ZlcnNpb24iLAogICAgWyJlcG9jaCIsICJyZWxlYXNlIiwgImRldiIsICJwcmUiLCAicG9zdCIsICJsb2NhbCJdLAopCgoKZGVmIHBhcnNlKHZlcnNpb24pOgogICAgIiIiCiAgICBQYXJzZSB0aGUgZ2l2ZW4gdmVyc2lvbiBzdHJpbmcgYW5kIHJldHVybiBlaXRoZXIgYSA6Y2xhc3M6YFZlcnNpb25gIG9iamVjdAogICAgb3IgYSA6Y2xhc3M6YExlZ2FjeVZlcnNpb25gIG9iamVjdCBkZXBlbmRpbmcgb24gaWYgdGhlIGdpdmVuIHZlcnNpb24gaXMKICAgIGEgdmFsaWQgUEVQIDQ0MCB2ZXJzaW9uIG9yIGEgbGVnYWN5IHZlcnNpb24uCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gVmVyc2lvbih2ZXJzaW9uKQogICAgZXhjZXB0IEludmFsaWRWZXJzaW9uOgogICAgICAgIHJldHVybiBMZWdhY3lWZXJzaW9uKHZlcnNpb24pCgoKY2xhc3MgSW52YWxpZFZlcnNpb24oVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgdmVyc2lvbiB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNDQwLgogICAgIiIiCgoKY2xhc3MgX0Jhc2VWZXJzaW9uKG9iamVjdCk6CgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX2tleSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPCBvKQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA8PSBvKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA9PSBvKQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA+PSBvKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA+IG8pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzICE9IG8pCgogICAgZGVmIF9jb21wYXJlKHNlbGYsIG90aGVyLCBtZXRob2QpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfQmFzZVZlcnNpb24pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIG1ldGhvZChzZWxmLl9rZXksIG90aGVyLl9rZXkpCgoKY2xhc3MgTGVnYWN5VmVyc2lvbihfQmFzZVZlcnNpb24pOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uKToKICAgICAgICBzZWxmLl92ZXJzaW9uID0gc3RyKHZlcnNpb24pCiAgICAgICAgc2VsZi5fa2V5ID0gX2xlZ2FjeV9jbXBrZXkoc2VsZi5fdmVyc2lvbikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxMZWdhY3lWZXJzaW9uKHswfSk+Ii5mb3JtYXQocmVwcihzdHIoc2VsZikpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHB1YmxpYyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJhc2VfdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxvY2FsKHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wb3N0cmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKCgpfbGVnYWN5X3ZlcnNpb25fY29tcG9uZW50X3JlID0gcmUuY29tcGlsZSgKICAgIHIiKFxkKyB8IFthLXpdKyB8IFwufCAtKSIsIHJlLlZFUkJPU0UsCikKCl9sZWdhY3lfdmVyc2lvbl9yZXBsYWNlbWVudF9tYXAgPSB7CiAgICAicHJlIjogImMiLCAicHJldmlldyI6ICJjIiwgIi0iOiAiZmluYWwtIiwgInJjIjogImMiLCAiZGV2IjogIkAiLAp9CgoKZGVmIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHMpOgogICAgZm9yIHBhcnQgaW4gX2xlZ2FjeV92ZXJzaW9uX2NvbXBvbmVudF9yZS5zcGxpdChzKToKICAgICAgICBwYXJ0ID0gX2xlZ2FjeV92ZXJzaW9uX3JlcGxhY2VtZW50X21hcC5nZXQocGFydCwgcGFydCkKCiAgICAgICAgaWYgbm90IHBhcnQgb3IgcGFydCA9PSAiLiI6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIHBhcnRbOjFdIGluICIwMTIzNDU2Nzg5IjoKICAgICAgICAgICAgIyBwYWQgZm9yIG51bWVyaWMgY29tcGFyaXNvbgogICAgICAgICAgICB5aWVsZCBwYXJ0LnpmaWxsKDgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgeWllbGQgIioiICsgcGFydAoKICAgICMgZW5zdXJlIHRoYXQgYWxwaGEvYmV0YS9jYW5kaWRhdGUgYXJlIGJlZm9yZSBmaW5hbAogICAgeWllbGQgIipmaW5hbCIKCgpkZWYgX2xlZ2FjeV9jbXBrZXkodmVyc2lvbik6CiAgICAjIFdlIGhhcmRjb2RlIGFuIGVwb2NoIG9mIC0xIGhlcmUuIEEgUEVQIDQ0MCB2ZXJzaW9uIGNhbiBvbmx5IGhhdmUgYSBlcG9jaAogICAgIyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4gVGhpcyB3aWxsIGVmZmVjdGl2ZWx5IHB1dCB0aGUgTGVnYWN5VmVyc2lvbiwKICAgICMgd2hpY2ggdXNlcyB0aGUgZGVmYWN0byBzdGFuZGFyZCBvcmlnaW5hbGx5IGltcGxlbWVudGVkIGJ5IHNldHVwdG9vbHMsCiAgICAjIGFzIGJlZm9yZSBhbGwgUEVQIDQ0MCB2ZXJzaW9ucy4KICAgIGVwb2NoID0gLTEKCiAgICAjIFRoaXMgc2NoZW1lIGlzIHRha2VuIGZyb20gcGtnX3Jlc291cmNlcy5wYXJzZV92ZXJzaW9uIHNldHVwdG9vbHMgcHJpb3IgdG8KICAgICMgaXQncyBhZG9wdGlvbiBvZiB0aGUgcGFja2FnaW5nIGxpYnJhcnkuCiAgICBwYXJ0cyA9IFtdCiAgICBmb3IgcGFydCBpbiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyh2ZXJzaW9uLmxvd2VyKCkpOgogICAgICAgIGlmIHBhcnQuc3RhcnRzd2l0aCgiKiIpOgogICAgICAgICAgICAjIHJlbW92ZSAiLSIgYmVmb3JlIGEgcHJlcmVsZWFzZSB0YWcKICAgICAgICAgICAgaWYgcGFydCA8ICIqZmluYWwiOgogICAgICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAiKmZpbmFsLSI6CiAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKCiAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHplcm9zIGZyb20gZWFjaCBzZXJpZXMgb2YgbnVtZXJpYyBwYXJ0cwogICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICIwMDAwMDAwMCI6CiAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQoKICAgICAgICBwYXJ0cy5hcHBlbmQocGFydCkKICAgIHBhcnRzID0gdHVwbGUocGFydHMpCgogICAgcmV0dXJuIGVwb2NoLCBwYXJ0cwoKIyBEZWxpYmVyYXRlbHkgbm90IGFuY2hvcmVkIHRvIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzdHJpbmcsIHRvIG1ha2UgaXQKIyBlYXNpZXIgZm9yIDNyZCBwYXJ0eSBjb2RlIHRvIHJldXNlClZFUlNJT05fUEFUVEVSTiA9IHIiIiIKICAgIHY/CiAgICAoPzoKICAgICAgICAoPzooP1A8ZXBvY2g+WzAtOV0rKSEpPyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXBvY2gKICAgICAgICAoP1A8cmVsZWFzZT5bMC05XSsoPzpcLlswLTldKykqKSAgICAgICAgICAgICAgICAgICMgcmVsZWFzZSBzZWdtZW50CiAgICAgICAgKD9QPHByZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByZS1yZWxlYXNlCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPHByZV9sPihhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KSkKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8cHJlX24+WzAtOV0rKT8KICAgICAgICApPwogICAgICAgICg/UDxwb3N0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgKD86LSg/UDxwb3N0X24xPlswLTldKykpCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAoP1A8cG9zdF9sPnBvc3R8cmV2fHIpCiAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAoP1A8cG9zdF9uMj5bMC05XSspPwogICAgICAgICAgICApCiAgICAgICAgKT8KICAgICAgICAoP1A8ZGV2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8ZGV2X2w+ZGV2KQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxkZXZfbj5bMC05XSspPwogICAgICAgICk/CiAgICApCiAgICAoPzpcKyg/UDxsb2NhbD5bYS16MC05XSsoPzpbLV9cLl1bYS16MC05XSspKikpPyAgICAgICAjIGxvY2FsIHZlcnNpb24KIiIiCgoKY2xhc3MgVmVyc2lvbihfQmFzZVZlcnNpb24pOgoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIFZFUlNJT05fUEFUVEVSTiArIHIiXHMqJCIsCiAgICAgICAgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UsCiAgICApCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24pOgogICAgICAgICMgVmFsaWRhdGUgdGhlIHZlcnNpb24gYW5kIHBhcnNlIGl0IGludG8gcGllY2VzCiAgICAgICAgbWF0Y2ggPSBzZWxmLl9yZWdleC5zZWFyY2godmVyc2lvbikKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRWZXJzaW9uKCJJbnZhbGlkIHZlcnNpb246ICd7MH0nIi5mb3JtYXQodmVyc2lvbikpCgogICAgICAgICMgU3RvcmUgdGhlIHBhcnNlZCBvdXQgcGllY2VzIG9mIHRoZSB2ZXJzaW9uCiAgICAgICAgc2VsZi5fdmVyc2lvbiA9IF9WZXJzaW9uKAogICAgICAgICAgICBlcG9jaD1pbnQobWF0Y2guZ3JvdXAoImVwb2NoIikpIGlmIG1hdGNoLmdyb3VwKCJlcG9jaCIpIGVsc2UgMCwKICAgICAgICAgICAgcmVsZWFzZT10dXBsZShpbnQoaSkgZm9yIGkgaW4gbWF0Y2guZ3JvdXAoInJlbGVhc2UiKS5zcGxpdCgiLiIpKSwKICAgICAgICAgICAgcHJlPV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwcmVfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInByZV9uIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHBvc3Q9X3BhcnNlX2xldHRlcl92ZXJzaW9uKAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInBvc3RfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInBvc3RfbjEiKSBvciBtYXRjaC5ncm91cCgicG9zdF9uMiIpLAogICAgICAgICAgICApLAogICAgICAgICAgICBkZXY9X3BhcnNlX2xldHRlcl92ZXJzaW9uKAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoImRldl9sIiksCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgiZGV2X24iKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgbG9jYWw9X3BhcnNlX2xvY2FsX3ZlcnNpb24obWF0Y2guZ3JvdXAoImxvY2FsIikpLAogICAgICAgICkKCiAgICAgICAgIyBHZW5lcmF0ZSBhIGtleSB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHNvcnRpbmcKICAgICAgICBzZWxmLl9rZXkgPSBfY21wa2V5KAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmVwb2NoLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnJlbGVhc2UsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ucHJlLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnBvc3QsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24uZGV2LAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmxvY2FsLAogICAgICAgICkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8VmVyc2lvbih7MH0pPiIuZm9ybWF0KHJlcHIoc3RyKHNlbGYpKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBwYXJ0cyA9IFtdCgogICAgICAgICMgRXBvY2gKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmVwb2NoICE9IDA6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiezB9ISIuZm9ybWF0KHNlbGYuX3ZlcnNpb24uZXBvY2gpKQoKICAgICAgICAjIFJlbGVhc2Ugc2VnbWVudAogICAgICAgIHBhcnRzLmFwcGVuZCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5yZWxlYXNlKSkKCiAgICAgICAgIyBQcmUtcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ucHJlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5wcmUpKQoKICAgICAgICAjIFBvc3QtcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ucG9zdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIucG9zdHswfSIuZm9ybWF0KHNlbGYuX3ZlcnNpb24ucG9zdFsxXSkpCgogICAgICAgICMgRGV2ZWxvcG1lbnQgcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24uZGV2IGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIi5kZXZ7MH0iLmZvcm1hdChzZWxmLl92ZXJzaW9uLmRldlsxXSkpCgogICAgICAgICMgTG9jYWwgdmVyc2lvbiBzZWdtZW50CiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5sb2NhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKAogICAgICAgICAgICAgICAgIit7MH0iLmZvcm1hdCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5sb2NhbCkpCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHVibGljKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikuc3BsaXQoIisiLCAxKVswXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJhc2VfdmVyc2lvbihzZWxmKToKICAgICAgICBwYXJ0cyA9IFtdCgogICAgICAgICMgRXBvY2gKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmVwb2NoICE9IDA6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiezB9ISIuZm9ybWF0KHNlbGYuX3ZlcnNpb24uZXBvY2gpKQoKICAgICAgICAjIFJlbGVhc2Ugc2VnbWVudAogICAgICAgIHBhcnRzLmFwcGVuZCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5yZWxlYXNlKSkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbG9jYWwoc2VsZik6CiAgICAgICAgdmVyc2lvbl9zdHJpbmcgPSBzdHIoc2VsZikKICAgICAgICBpZiAiKyIgaW4gdmVyc2lvbl9zdHJpbmc6CiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uX3N0cmluZy5zcGxpdCgiKyIsIDEpWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gYm9vbChzZWxmLl92ZXJzaW9uLmRldiBvciBzZWxmLl92ZXJzaW9uLnByZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wb3N0cmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gYm9vbChzZWxmLl92ZXJzaW9uLnBvc3QpCgoKZGVmIF9wYXJzZV9sZXR0ZXJfdmVyc2lvbihsZXR0ZXIsIG51bWJlcik6CiAgICBpZiBsZXR0ZXI6CiAgICAgICAgIyBXZSBjb25zaWRlciB0aGVyZSB0byBiZSBhbiBpbXBsaWNpdCAwIGluIGEgcHJlLXJlbGVhc2UgaWYgdGhlcmUgaXMKICAgICAgICAjIG5vdCBhIG51bWVyYWwgYXNzb2NpYXRlZCB3aXRoIGl0LgogICAgICAgIGlmIG51bWJlciBpcyBOb25lOgogICAgICAgICAgICBudW1iZXIgPSAwCgogICAgICAgICMgV2Ugbm9ybWFsaXplIGFueSBsZXR0ZXJzIHRvIHRoZWlyIGxvd2VyIGNhc2UgZm9ybQogICAgICAgIGxldHRlciA9IGxldHRlci5sb3dlcigpCgogICAgICAgICMgV2UgY29uc2lkZXIgc29tZSB3b3JkcyB0byBiZSBhbHRlcm5hdGUgc3BlbGxpbmdzIG9mIG90aGVyIHdvcmRzIGFuZAogICAgICAgICMgaW4gdGhvc2UgY2FzZXMgd2Ugd2FudCB0byBub3JtYWxpemUgdGhlIHNwZWxsaW5ncyB0byBvdXIgcHJlZmVycmVkCiAgICAgICAgIyBzcGVsbGluZy4KICAgICAgICBpZiBsZXR0ZXIgPT0gImFscGhhIjoKICAgICAgICAgICAgbGV0dGVyID0gImEiCiAgICAgICAgZWxpZiBsZXR0ZXIgPT0gImJldGEiOgogICAgICAgICAgICBsZXR0ZXIgPSAiYiIKICAgICAgICBlbGlmIGxldHRlciBpbiBbImMiLCAicHJlIiwgInByZXZpZXciXToKICAgICAgICAgICAgbGV0dGVyID0gInJjIgogICAgICAgIGVsaWYgbGV0dGVyIGluIFsicmV2IiwgInIiXToKICAgICAgICAgICAgbGV0dGVyID0gInBvc3QiCgogICAgICAgIHJldHVybiBsZXR0ZXIsIGludChudW1iZXIpCiAgICBpZiBub3QgbGV0dGVyIGFuZCBudW1iZXI6CiAgICAgICAgIyBXZSBhc3N1bWUgaWYgd2UgYXJlIGdpdmVuIGEgbnVtYmVyLCBidXQgd2UgYXJlIG5vdCBnaXZlbiBhIGxldHRlcgogICAgICAgICMgdGhlbiB0aGlzIGlzIHVzaW5nIHRoZSBpbXBsaWNpdCBwb3N0IHJlbGVhc2Ugc3ludGF4IChlLmcuIDEuMC0xKQogICAgICAgIGxldHRlciA9ICJwb3N0IgoKICAgICAgICByZXR1cm4gbGV0dGVyLCBpbnQobnVtYmVyKQoKCl9sb2NhbF92ZXJzaW9uX3NlcGVyYXRvcnMgPSByZS5jb21waWxlKHIiW1wuXy1dIikKCgpkZWYgX3BhcnNlX2xvY2FsX3ZlcnNpb24obG9jYWwpOgogICAgIiIiCiAgICBUYWtlcyBhIHN0cmluZyBsaWtlIGFiYy4xLnR3ZWx2ZSBhbmQgdHVybnMgaXQgaW50byAoImFiYyIsIDEsICJ0d2VsdmUiKS4KICAgICIiIgogICAgaWYgbG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgcmV0dXJuIHR1cGxlKAogICAgICAgICAgICBwYXJ0Lmxvd2VyKCkgaWYgbm90IHBhcnQuaXNkaWdpdCgpIGVsc2UgaW50KHBhcnQpCiAgICAgICAgICAgIGZvciBwYXJ0IGluIF9sb2NhbF92ZXJzaW9uX3NlcGVyYXRvcnMuc3BsaXQobG9jYWwpCiAgICAgICAgKQoKCmRlZiBfY21wa2V5KGVwb2NoLCByZWxlYXNlLCBwcmUsIHBvc3QsIGRldiwgbG9jYWwpOgogICAgIyBXaGVuIHdlIGNvbXBhcmUgYSByZWxlYXNlIHZlcnNpb24sIHdlIHdhbnQgdG8gY29tcGFyZSBpdCB3aXRoIGFsbCBvZiB0aGUKICAgICMgdHJhaWxpbmcgemVyb3MgcmVtb3ZlZC4gU28gd2UnbGwgdXNlIGEgcmV2ZXJzZSB0aGUgbGlzdCwgZHJvcCBhbGwgdGhlIG5vdwogICAgIyBsZWFkaW5nIHplcm9zIHVudGlsIHdlIGNvbWUgdG8gc29tZXRoaW5nIG5vbiB6ZXJvLCB0aGVuIHRha2UgdGhlIHJlc3QKICAgICMgcmUtcmV2ZXJzZSBpdCBiYWNrIGludG8gdGhlIGNvcnJlY3Qgb3JkZXIgYW5kIG1ha2UgaXQgYSB0dXBsZSBhbmQgdXNlCiAgICAjIHRoYXQgZm9yIG91ciBzb3J0aW5nIGtleS4KICAgIHJlbGVhc2UgPSB0dXBsZSgKICAgICAgICByZXZlcnNlZChsaXN0KAogICAgICAgICAgICBpdGVydG9vbHMuZHJvcHdoaWxlKAogICAgICAgICAgICAgICAgbGFtYmRhIHg6IHggPT0gMCwKICAgICAgICAgICAgICAgIHJldmVyc2VkKHJlbGVhc2UpLAogICAgICAgICAgICApCiAgICAgICAgKSkKICAgICkKCiAgICAjIFdlIG5lZWQgdG8gInRyaWNrIiB0aGUgc29ydGluZyBhbGdvcml0aG0gdG8gcHV0IDEuMC5kZXYwIGJlZm9yZSAxLjBhMC4KICAgICMgV2UnbGwgZG8gdGhpcyBieSBhYnVzaW5nIHRoZSBwcmUgc2VnbWVudCwgYnV0IHdlIF9vbmx5XyB3YW50IHRvIGRvIHRoaXMKICAgICMgaWYgdGhlcmUgaXMgbm90IGEgcHJlIG9yIGEgcG9zdCBzZWdtZW50LiBJZiB3ZSBoYXZlIG9uZSBvZiB0aG9zZSB0aGVuCiAgICAjIHRoZSBub3JtYWwgc29ydGluZyBydWxlcyB3aWxsIGhhbmRsZSB0aGlzIGNhc2UgY29ycmVjdGx5LgogICAgaWYgcHJlIGlzIE5vbmUgYW5kIHBvc3QgaXMgTm9uZSBhbmQgZGV2IGlzIG5vdCBOb25lOgogICAgICAgIHByZSA9IC1JbmZpbml0eQogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgcHJlLXJlbGVhc2UgKGV4Y2VwdCBhcyBub3RlZCBhYm92ZSkgc2hvdWxkIHNvcnQgYWZ0ZXIKICAgICMgdGhvc2Ugd2l0aCBvbmUuCiAgICBlbGlmIHByZSBpcyBOb25lOgogICAgICAgIHByZSA9IEluZmluaXR5CgogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgcG9zdCBzZWdtZW50IHNob3VsZCBzb3J0IGJlZm9yZSB0aG9zZSB3aXRoIG9uZS4KICAgIGlmIHBvc3QgaXMgTm9uZToKICAgICAgICBwb3N0ID0gLUluZmluaXR5CgogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgZGV2ZWxvcG1lbnQgc2VnbWVudCBzaG91bGQgc29ydCBhZnRlciB0aG9zZSB3aXRoIG9uZS4KICAgIGlmIGRldiBpcyBOb25lOgogICAgICAgIGRldiA9IEluZmluaXR5CgogICAgaWYgbG9jYWwgaXMgTm9uZToKICAgICAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBsb2NhbCBzZWdtZW50IHNob3VsZCBzb3J0IGJlZm9yZSB0aG9zZSB3aXRoIG9uZS4KICAgICAgICBsb2NhbCA9IC1JbmZpbml0eQogICAgZWxzZToKICAgICAgICAjIFZlcnNpb25zIHdpdGggYSBsb2NhbCBzZWdtZW50IG5lZWQgdGhhdCBzZWdtZW50IHBhcnNlZCB0byBpbXBsZW1lbnQKICAgICAgICAjIHRoZSBzb3J0aW5nIHJ1bGVzIGluIFBFUDQ0MC4KICAgICAgICAjIC0gQWxwaGEgbnVtZXJpYyBzZWdtZW50cyBzb3J0IGJlZm9yZSBudW1lcmljIHNlZ21lbnRzCiAgICAgICAgIyAtIEFscGhhIG51bWVyaWMgc2VnbWVudHMgc29ydCBsZXhpY29ncmFwaGljYWxseQogICAgICAgICMgLSBOdW1lcmljIHNlZ21lbnRzIHNvcnQgbnVtZXJpY2FsbHkKICAgICAgICAjIC0gU2hvcnRlciB2ZXJzaW9ucyBzb3J0IGJlZm9yZSBsb25nZXIgdmVyc2lvbnMgd2hlbiB0aGUgcHJlZml4ZXMKICAgICAgICAjICAgbWF0Y2ggZXhhY3RseQogICAgICAgIGxvY2FsID0gdHVwbGUoCiAgICAgICAgICAgIChpLCAiIikgaWYgaXNpbnN0YW5jZShpLCBpbnQpIGVsc2UgKC1JbmZpbml0eSwgaSkKICAgICAgICAgICAgZm9yIGkgaW4gbG9jYWwKICAgICAgICApCgogICAgcmV0dXJuIGVwb2NoLCByZWxlYXNlLCBwcmUsIHBvc3QsIGRldiwgbG9jYWwKUEsDBBQAAAAAAAAAIQB4KBTD64EDAOuBAwA6AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3B5cGFyc2luZy5weSMgbW9kdWxlIHB5cGFyc2luZy5weQ0KIw0KIyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNiAgUGF1bCBULiBNY0d1aXJlDQojDQojIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZw0KIyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUNCiMgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZw0KIyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsDQojIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bw0KIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8NCiMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KIw0KIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCiMNCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsDQojIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRg0KIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuDQojIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZDQojIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsDQojIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFDQojIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLg0KIw0KDQpfX2RvY19fID0gXA0KIiIiDQpweXBhcnNpbmcgbW9kdWxlIC0gQ2xhc3NlcyBhbmQgbWV0aG9kcyB0byBkZWZpbmUgYW5kIGV4ZWN1dGUgcGFyc2luZyBncmFtbWFycw0KDQpUaGUgcHlwYXJzaW5nIG1vZHVsZSBpcyBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byBjcmVhdGluZyBhbmQgZXhlY3V0aW5nIHNpbXBsZSBncmFtbWFycywNCnZzLiB0aGUgdHJhZGl0aW9uYWwgbGV4L3lhY2MgYXBwcm9hY2gsIG9yIHRoZSB1c2Ugb2YgcmVndWxhciBleHByZXNzaW9ucy4gIFdpdGggcHlwYXJzaW5nLCB5b3UNCmRvbid0IG5lZWQgdG8gbGVhcm4gYSBuZXcgc3ludGF4IGZvciBkZWZpbmluZyBncmFtbWFycyBvciBtYXRjaGluZyBleHByZXNzaW9ucyAtIHRoZSBwYXJzaW5nIG1vZHVsZQ0KcHJvdmlkZXMgYSBsaWJyYXJ5IG9mIGNsYXNzZXMgdGhhdCB5b3UgdXNlIHRvIGNvbnN0cnVjdCB0aGUgZ3JhbW1hciBkaXJlY3RseSBpbiBQeXRob24uDQoNCkhlcmUgaXMgYSBwcm9ncmFtIHRvIHBhcnNlICJIZWxsbywgV29ybGQhIiAob3IgYW55IGdyZWV0aW5nIG9mIHRoZSBmb3JtIA0KQ3siPHNhbHV0YXRpb24+LCA8YWRkcmVzc2VlPiEifSksIGJ1aWx0IHVwIHVzaW5nIEx7V29yZH0sIEx7TGl0ZXJhbH0sIGFuZCBMe0FuZH0gZWxlbWVudHMgDQooTHsnKyc8UGFyc2VyRWxlbWVudC5fX2FkZF9fPn0gb3BlcmF0b3IgZ2l2ZXMgTHtBbmR9IGV4cHJlc3Npb25zLCBzdHJpbmdzIGFyZSBhdXRvLWNvbnZlcnRlZCB0bw0KTHtMaXRlcmFsfSBleHByZXNzaW9ucyk6Og0KDQogICAgZnJvbSBweXBhcnNpbmcgaW1wb3J0IFdvcmQsIGFscGhhcw0KDQogICAgIyBkZWZpbmUgZ3JhbW1hciBvZiBhIGdyZWV0aW5nDQogICAgZ3JlZXQgPSBXb3JkKGFscGhhcykgKyAiLCIgKyBXb3JkKGFscGhhcykgKyAiISINCg0KICAgIGhlbGxvID0gIkhlbGxvLCBXb3JsZCEiDQogICAgcHJpbnQgKGhlbGxvLCAiLT4iLCBncmVldC5wYXJzZVN0cmluZyhoZWxsbykpDQoNClRoZSBwcm9ncmFtIG91dHB1dHMgdGhlIGZvbGxvd2luZzo6DQoNCiAgICBIZWxsbywgV29ybGQhIC0+IFsnSGVsbG8nLCAnLCcsICdXb3JsZCcsICchJ10NCg0KVGhlIFB5dGhvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ3JhbW1hciBpcyBxdWl0ZSByZWFkYWJsZSwgb3dpbmcgdG8gdGhlIHNlbGYtZXhwbGFuYXRvcnkNCmNsYXNzIG5hbWVzLCBhbmQgdGhlIHVzZSBvZiAnKycsICd8JyBhbmQgJ14nIG9wZXJhdG9ycy4NCg0KVGhlIEx7UGFyc2VSZXN1bHRzfSBvYmplY3QgcmV0dXJuZWQgZnJvbSBMe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc8UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGNhbiBiZSBhY2Nlc3NlZCBhcyBhIG5lc3RlZCBsaXN0LCBhIGRpY3Rpb25hcnksIG9yIGFuDQpvYmplY3Qgd2l0aCBuYW1lZCBhdHRyaWJ1dGVzLg0KDQpUaGUgcHlwYXJzaW5nIG1vZHVsZSBoYW5kbGVzIHNvbWUgb2YgdGhlIHByb2JsZW1zIHRoYXQgYXJlIHR5cGljYWxseSB2ZXhpbmcgd2hlbiB3cml0aW5nIHRleHQgcGFyc2VyczoNCiAtIGV4dHJhIG9yIG1pc3Npbmcgd2hpdGVzcGFjZSAodGhlIGFib3ZlIHByb2dyYW0gd2lsbCBhbHNvIGhhbmRsZSAiSGVsbG8sV29ybGQhIiwgIkhlbGxvICAsICBXb3JsZCAgISIsIGV0Yy4pDQogLSBxdW90ZWQgc3RyaW5ncw0KIC0gZW1iZWRkZWQgY29tbWVudHMNCiIiIg0KDQpfX3ZlcnNpb25fXyA9ICIyLjEuMTAiDQpfX3ZlcnNpb25UaW1lX18gPSAiMDcgT2N0IDIwMTYgMDE6MzEgVVRDIg0KX19hdXRob3JfXyA9ICJQYXVsIE1jR3VpcmUgPHB0bWNnQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iDQoNCmltcG9ydCBzdHJpbmcNCmZyb20gd2Vha3JlZiBpbXBvcnQgcmVmIGFzIHdrcmVmDQppbXBvcnQgY29weQ0KaW1wb3J0IHN5cw0KaW1wb3J0IHdhcm5pbmdzDQppbXBvcnQgcmUNCmltcG9ydCBzcmVfY29uc3RhbnRzDQppbXBvcnQgY29sbGVjdGlvbnMNCmltcG9ydCBwcHJpbnQNCmltcG9ydCB0cmFjZWJhY2sNCmltcG9ydCB0eXBlcw0KZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUNCg0KdHJ5Og0KICAgIGZyb20gX3RocmVhZCBpbXBvcnQgUkxvY2sNCmV4Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgUkxvY2sNCg0KdHJ5Og0KICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0IGFzIF9PcmRlcmVkRGljdA0KZXhjZXB0IEltcG9ydEVycm9yOg0KICAgIHRyeToNCiAgICAgICAgZnJvbSBvcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QgYXMgX09yZGVyZWREaWN0DQogICAgZXhjZXB0IEltcG9ydEVycm9yOg0KICAgICAgICBfT3JkZXJlZERpY3QgPSBOb25lDQoNCiN+IHN5cy5zdGRlcnIud3JpdGUoICJ0ZXN0aW5nIHB5cGFyc2luZyBtb2R1bGUsIHZlcnNpb24gJXMsICVzXG4iICUgKF9fdmVyc2lvbl9fLF9fdmVyc2lvblRpbWVfXyApICkNCg0KX19hbGxfXyA9IFsNCidBbmQnLCAnQ2FzZWxlc3NLZXl3b3JkJywgJ0Nhc2VsZXNzTGl0ZXJhbCcsICdDaGFyc05vdEluJywgJ0NvbWJpbmUnLCAnRGljdCcsICdFYWNoJywgJ0VtcHR5JywNCidGb2xsb3dlZEJ5JywgJ0ZvcndhcmQnLCAnR29Ub0NvbHVtbicsICdHcm91cCcsICdLZXl3b3JkJywgJ0xpbmVFbmQnLCAnTGluZVN0YXJ0JywgJ0xpdGVyYWwnLA0KJ01hdGNoRmlyc3QnLCAnTm9NYXRjaCcsICdOb3RBbnknLCAnT25lT3JNb3JlJywgJ09ubHlPbmNlJywgJ09wdGlvbmFsJywgJ09yJywNCidQYXJzZUJhc2VFeGNlcHRpb24nLCAnUGFyc2VFbGVtZW50RW5oYW5jZScsICdQYXJzZUV4Y2VwdGlvbicsICdQYXJzZUV4cHJlc3Npb24nLCAnUGFyc2VGYXRhbEV4Y2VwdGlvbicsDQonUGFyc2VSZXN1bHRzJywgJ1BhcnNlU3ludGF4RXhjZXB0aW9uJywgJ1BhcnNlckVsZW1lbnQnLCAnUXVvdGVkU3RyaW5nJywgJ1JlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24nLA0KJ1JlZ2V4JywgJ1NraXBUbycsICdTdHJpbmdFbmQnLCAnU3RyaW5nU3RhcnQnLCAnU3VwcHJlc3MnLCAnVG9rZW4nLCAnVG9rZW5Db252ZXJ0ZXInLCANCidXaGl0ZScsICdXb3JkJywgJ1dvcmRFbmQnLCAnV29yZFN0YXJ0JywgJ1plcm9Pck1vcmUnLA0KJ2FscGhhbnVtcycsICdhbHBoYXMnLCAnYWxwaGFzOGJpdCcsICdhbnlDbG9zZVRhZycsICdhbnlPcGVuVGFnJywgJ2NTdHlsZUNvbW1lbnQnLCAnY29sJywNCidjb21tYVNlcGFyYXRlZExpc3QnLCAnY29tbW9uSFRNTEVudGl0eScsICdjb3VudGVkQXJyYXknLCAnY3BwU3R5bGVDb21tZW50JywgJ2RibFF1b3RlZFN0cmluZycsDQonZGJsU2xhc2hDb21tZW50JywgJ2RlbGltaXRlZExpc3QnLCAnZGljdE9mJywgJ2Rvd25jYXNlVG9rZW5zJywgJ2VtcHR5JywgJ2hleG51bXMnLA0KJ2h0bWxDb21tZW50JywgJ2phdmFTdHlsZUNvbW1lbnQnLCAnbGluZScsICdsaW5lRW5kJywgJ2xpbmVTdGFydCcsICdsaW5lbm8nLA0KJ21ha2VIVE1MVGFncycsICdtYWtlWE1MVGFncycsICdtYXRjaE9ubHlBdENvbCcsICdtYXRjaFByZXZpb3VzRXhwcicsICdtYXRjaFByZXZpb3VzTGl0ZXJhbCcsDQonbmVzdGVkRXhwcicsICdudWxsRGVidWdBY3Rpb24nLCAnbnVtcycsICdvbmVPZicsICdvcEFzc29jJywgJ29wZXJhdG9yUHJlY2VkZW5jZScsICdwcmludGFibGVzJywNCidwdW5jOGJpdCcsICdweXRob25TdHlsZUNvbW1lbnQnLCAncXVvdGVkU3RyaW5nJywgJ3JlbW92ZVF1b3RlcycsICdyZXBsYWNlSFRNTEVudGl0eScsIA0KJ3JlcGxhY2VXaXRoJywgJ3Jlc3RPZkxpbmUnLCAnc2dsUXVvdGVkU3RyaW5nJywgJ3NyYW5nZScsICdzdHJpbmdFbmQnLA0KJ3N0cmluZ1N0YXJ0JywgJ3RyYWNlUGFyc2VBY3Rpb24nLCAndW5pY29kZVN0cmluZycsICd1cGNhc2VUb2tlbnMnLCAnd2l0aEF0dHJpYnV0ZScsDQonaW5kZW50ZWRCbG9jaycsICdvcmlnaW5hbFRleHRGb3InLCAndW5ncm91cCcsICdpbmZpeE5vdGF0aW9uJywnbG9jYXRlZEV4cHInLCAnd2l0aENsYXNzJywNCidDbG9zZU1hdGNoJywgJ3Rva2VuTWFwJywgJ3B5cGFyc2luZ19jb21tb24nLA0KXQ0KDQpzeXN0ZW1fdmVyc2lvbiA9IHR1cGxlKHN5cy52ZXJzaW9uX2luZm8pWzozXQ0KUFlfMyA9IHN5c3RlbV92ZXJzaW9uWzBdID09IDMNCmlmIFBZXzM6DQogICAgX01BWF9JTlQgPSBzeXMubWF4c2l6ZQ0KICAgIGJhc2VzdHJpbmcgPSBzdHINCiAgICB1bmljaHIgPSBjaHINCiAgICBfdXN0ciA9IHN0cg0KDQogICAgIyBidWlsZCBsaXN0IG9mIHNpbmdsZSBhcmcgYnVpbHRpbnMsIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFyc2UgYWN0aW9ucw0KICAgIHNpbmdsZUFyZ0J1aWx0aW5zID0gW3N1bSwgbGVuLCBzb3J0ZWQsIHJldmVyc2VkLCBsaXN0LCB0dXBsZSwgc2V0LCBhbnksIGFsbCwgbWluLCBtYXhdDQoNCmVsc2U6DQogICAgX01BWF9JTlQgPSBzeXMubWF4aW50DQogICAgcmFuZ2UgPSB4cmFuZ2UNCg0KICAgIGRlZiBfdXN0cihvYmopOg0KICAgICAgICAiIiJEcm9wLWluIHJlcGxhY2VtZW50IGZvciBzdHIob2JqKSB0aGF0IHRyaWVzIHRvIGJlIFVuaWNvZGUgZnJpZW5kbHkuIEl0IGZpcnN0IHRyaWVzDQogICAgICAgICAgIHN0cihvYmopLiBJZiB0aGF0IGZhaWxzIHdpdGggYSBVbmljb2RlRW5jb2RlRXJyb3IsIHRoZW4gaXQgdHJpZXMgdW5pY29kZShvYmopLiBJdA0KICAgICAgICAgICB0aGVuIDwgcmV0dXJucyB0aGUgdW5pY29kZSBvYmplY3QgfCBlbmNvZGVzIGl0IHdpdGggdGhlIGRlZmF1bHQgZW5jb2RpbmcgfCAuLi4gPi4NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLHVuaWNvZGUpOg0KICAgICAgICAgICAgcmV0dXJuIG9iag0KDQogICAgICAgIHRyeToNCiAgICAgICAgICAgICMgSWYgdGhpcyB3b3JrcywgdGhlbiBfdXN0cihvYmopIGhhcyB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgc3RyKG9iaiksIHNvDQogICAgICAgICAgICAjIGl0IHdvbid0IGJyZWFrIGFueSBleGlzdGluZyBjb2RlLg0KICAgICAgICAgICAgcmV0dXJuIHN0cihvYmopDQoNCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoNCiAgICAgICAgICAgICMgRWxzZSBlbmNvZGUgaXQNCiAgICAgICAgICAgIHJldCA9IHVuaWNvZGUob2JqKS5lbmNvZGUoc3lzLmdldGRlZmF1bHRlbmNvZGluZygpLCAneG1sY2hhcnJlZnJlcGxhY2UnKQ0KICAgICAgICAgICAgeG1sY2hhcnJlZiA9IFJlZ2V4KCcmI1xkKzsnKQ0KICAgICAgICAgICAgeG1sY2hhcnJlZi5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDogJ1xcdScgKyBoZXgoaW50KHRbMF1bMjotMV0pKVsyOl0pDQogICAgICAgICAgICByZXR1cm4geG1sY2hhcnJlZi50cmFuc2Zvcm1TdHJpbmcocmV0KQ0KDQogICAgIyBidWlsZCBsaXN0IG9mIHNpbmdsZSBhcmcgYnVpbHRpbnMsIHRvbGVyYW50IG9mIFB5dGhvbiB2ZXJzaW9uLCB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhcnNlIGFjdGlvbnMNCiAgICBzaW5nbGVBcmdCdWlsdGlucyA9IFtdDQogICAgaW1wb3J0IF9fYnVpbHRpbl9fDQogICAgZm9yIGZuYW1lIGluICJzdW0gbGVuIHNvcnRlZCByZXZlcnNlZCBsaXN0IHR1cGxlIHNldCBhbnkgYWxsIG1pbiBtYXgiLnNwbGl0KCk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNpbmdsZUFyZ0J1aWx0aW5zLmFwcGVuZChnZXRhdHRyKF9fYnVpbHRpbl9fLGZuYW1lKSkNCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIA0KX2dlbmVyYXRvclR5cGUgPSB0eXBlKCh5IGZvciB5IGluIHJhbmdlKDEpKSkNCiANCmRlZiBfeG1sX2VzY2FwZShkYXRhKToNCiAgICAiIiJFc2NhcGUgJiwgPCwgPiwgIiwgJywgZXRjLiBpbiBhIHN0cmluZyBvZiBkYXRhLiIiIg0KDQogICAgIyBhbXBlcnNhbmQgbXVzdCBiZSByZXBsYWNlZCBmaXJzdA0KICAgIGZyb21fc3ltYm9scyA9ICcmPjwiXCcnDQogICAgdG9fc3ltYm9scyA9ICgnJicrcysnOycgZm9yIHMgaW4gImFtcCBndCBsdCBxdW90IGFwb3MiLnNwbGl0KCkpDQogICAgZm9yIGZyb21fLHRvXyBpbiB6aXAoZnJvbV9zeW1ib2xzLCB0b19zeW1ib2xzKToNCiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZShmcm9tXywgdG9fKQ0KICAgIHJldHVybiBkYXRhDQoNCmNsYXNzIF9Db25zdGFudHMob2JqZWN0KToNCiAgICBwYXNzDQoNCmFscGhhcyAgICAgPSBzdHJpbmcuYXNjaWlfdXBwZXJjYXNlICsgc3RyaW5nLmFzY2lpX2xvd2VyY2FzZQ0KbnVtcyAgICAgICA9ICIwMTIzNDU2Nzg5Ig0KaGV4bnVtcyAgICA9IG51bXMgKyAiQUJDREVGYWJjZGVmIg0KYWxwaGFudW1zICA9IGFscGhhcyArIG51bXMNCl9ic2xhc2ggICAgPSBjaHIoOTIpDQpwcmludGFibGVzID0gIiIuam9pbihjIGZvciBjIGluIHN0cmluZy5wcmludGFibGUgaWYgYyBub3QgaW4gc3RyaW5nLndoaXRlc3BhY2UpDQoNCmNsYXNzIFBhcnNlQmFzZUV4Y2VwdGlvbihFeGNlcHRpb24pOg0KICAgICIiImJhc2UgZXhjZXB0aW9uIGNsYXNzIGZvciBhbGwgcGFyc2luZyBydW50aW1lIGV4Y2VwdGlvbnMiIiINCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogd2UgY29uc3RydWN0IGEgKmxvdCogb2YgdGhlc2UsIHNvIGtlZXAgdGhpcw0KICAgICMgY29uc3RydWN0b3IgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBzdHIsIGxvYz0wLCBtc2c9Tm9uZSwgZWxlbT1Ob25lICk6DQogICAgICAgIHNlbGYubG9jID0gbG9jDQogICAgICAgIGlmIG1zZyBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5tc2cgPSBwc3RyDQogICAgICAgICAgICBzZWxmLnBzdHIgPSAiIg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tc2cgPSBtc2cNCiAgICAgICAgICAgIHNlbGYucHN0ciA9IHBzdHINCiAgICAgICAgc2VsZi5wYXJzZXJFbGVtZW50ID0gZWxlbQ0KICAgICAgICBzZWxmLmFyZ3MgPSAocHN0ciwgbG9jLCBtc2cpDQoNCiAgICBAY2xhc3NtZXRob2QNCiAgICBkZWYgX2Zyb21fZXhjZXB0aW9uKGNscywgcGUpOg0KICAgICAgICAiIiINCiAgICAgICAgaW50ZXJuYWwgZmFjdG9yeSBtZXRob2QgdG8gc2ltcGxpZnkgY3JlYXRpbmcgb25lIHR5cGUgb2YgUGFyc2VFeGNlcHRpb24gDQogICAgICAgIGZyb20gYW5vdGhlciAtIGF2b2lkcyBoYXZpbmcgX19pbml0X18gc2lnbmF0dXJlIGNvbmZsaWN0cyBhbW9uZyBzdWJjbGFzc2VzDQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gY2xzKHBlLnBzdHIsIHBlLmxvYywgcGUubXNnLCBwZS5wYXJzZXJFbGVtZW50KQ0KDQogICAgZGVmIF9fZ2V0YXR0cl9fKCBzZWxmLCBhbmFtZSApOg0KICAgICAgICAiIiJzdXBwb3J0ZWQgYXR0cmlidXRlcyBieSBuYW1lIGFyZToNCiAgICAgICAgICAgIC0gbGluZW5vIC0gcmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgICAgICAtIGNvbCAtIHJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgICAgICAtIGxpbmUgLSByZXR1cm5zIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgICIiIg0KICAgICAgICBpZiggYW5hbWUgPT0gImxpbmVubyIgKToNCiAgICAgICAgICAgIHJldHVybiBsaW5lbm8oIHNlbGYubG9jLCBzZWxmLnBzdHIgKQ0KICAgICAgICBlbGlmKCBhbmFtZSBpbiAoImNvbCIsICJjb2x1bW4iKSApOg0KICAgICAgICAgICAgcmV0dXJuIGNvbCggc2VsZi5sb2MsIHNlbGYucHN0ciApDQogICAgICAgIGVsaWYoIGFuYW1lID09ICJsaW5lIiApOg0KICAgICAgICAgICAgcmV0dXJuIGxpbmUoIHNlbGYubG9jLCBzZWxmLnBzdHIgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoYW5hbWUpDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIiVzIChhdCBjaGFyICVkKSwgKGxpbmU6JWQsIGNvbDolZCkiICUgXA0KICAgICAgICAgICAgICAgICggc2VsZi5tc2csIHNlbGYubG9jLCBzZWxmLmxpbmVubywgc2VsZi5jb2x1bW4gKQ0KICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gX3VzdHIoc2VsZikNCiAgICBkZWYgbWFya0lucHV0bGluZSggc2VsZiwgbWFya2VyU3RyaW5nID0gIj4hPCIgKToNCiAgICAgICAgIiIiRXh0cmFjdHMgdGhlIGV4Y2VwdGlvbiBsaW5lIGZyb20gdGhlIGlucHV0IHN0cmluZywgYW5kIG1hcmtzDQogICAgICAgICAgIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXhjZXB0aW9uIHdpdGggYSBzcGVjaWFsIHN5bWJvbC4NCiAgICAgICAgIiIiDQogICAgICAgIGxpbmVfc3RyID0gc2VsZi5saW5lDQogICAgICAgIGxpbmVfY29sdW1uID0gc2VsZi5jb2x1bW4gLSAxDQogICAgICAgIGlmIG1hcmtlclN0cmluZzoNCiAgICAgICAgICAgIGxpbmVfc3RyID0gIiIuam9pbigobGluZV9zdHJbOmxpbmVfY29sdW1uXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyU3RyaW5nLCBsaW5lX3N0cltsaW5lX2NvbHVtbjpdKSkNCiAgICAgICAgcmV0dXJuIGxpbmVfc3RyLnN0cmlwKCkNCiAgICBkZWYgX19kaXJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuICJsaW5lbm8gY29sIGxpbmUiLnNwbGl0KCkgKyBkaXIodHlwZShzZWxmKSkNCg0KY2xhc3MgUGFyc2VFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToNCiAgICAiIiINCiAgICBFeGNlcHRpb24gdGhyb3duIHdoZW4gcGFyc2UgZXhwcmVzc2lvbnMgZG9uJ3QgbWF0Y2ggY2xhc3M7DQogICAgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgYnkgbmFtZSBhcmU6DQogICAgIC0gbGluZW5vIC0gcmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgIC0gY29sIC0gcmV0dXJucyB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgLSBsaW5lIC0gcmV0dXJucyB0aGUgbGluZSBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikucGFyc2VTdHJpbmcoIkFCQyIpDQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgIHByaW50KHBlKQ0KICAgICAgICAgICAgcHJpbnQoImNvbHVtbjoge30iLmZvcm1hdChwZS5jb2wpKQ0KICAgICAgICAgICAgDQogICAgcHJpbnRzOjoNCiAgICAgICBFeHBlY3RlZCBpbnRlZ2VyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgY29sdW1uOiAxDQogICAgIiIiDQogICAgcGFzcw0KDQpjbGFzcyBQYXJzZUZhdGFsRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6DQogICAgIiIidXNlci10aHJvd2FibGUgZXhjZXB0aW9uIHRocm93biB3aGVuIGluY29uc2lzdGVudCBwYXJzZSBjb250ZW50DQogICAgICAgaXMgZm91bmQ7IHN0b3BzIGFsbCBwYXJzaW5nIGltbWVkaWF0ZWx5IiIiDQogICAgcGFzcw0KDQpjbGFzcyBQYXJzZVN5bnRheEV4Y2VwdGlvbihQYXJzZUZhdGFsRXhjZXB0aW9uKToNCiAgICAiIiJqdXN0IGxpa2UgTHtQYXJzZUZhdGFsRXhjZXB0aW9ufSwgYnV0IHRocm93biBpbnRlcm5hbGx5IHdoZW4gYW4NCiAgICAgICBMe0Vycm9yU3RvcDxBbmQuX0Vycm9yU3RvcD59ICgnLScgb3BlcmF0b3IpIGluZGljYXRlcyB0aGF0IHBhcnNpbmcgaXMgdG8gc3RvcCANCiAgICAgICBpbW1lZGlhdGVseSBiZWNhdXNlIGFuIHVuYmFja3RyYWNrYWJsZSBzeW50YXggZXJyb3IgaGFzIGJlZW4gZm91bmQiIiINCiAgICBwYXNzDQoNCiN+IGNsYXNzIFJlcGFyc2VFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToNCiAgICAjfiAiIiJFeHBlcmltZW50YWwgY2xhc3MgLSBwYXJzZSBhY3Rpb25zIGNhbiByYWlzZSB0aGlzIGV4Y2VwdGlvbiB0byBjYXVzZQ0KICAgICAgICN+IHB5cGFyc2luZyB0byByZXBhcnNlIHRoZSBpbnB1dCBzdHJpbmc6DQogICAgICAgICN+IC0gd2l0aCBhIG1vZGlmaWVkIGlucHV0IHN0cmluZywgYW5kL29yDQogICAgICAgICN+IC0gd2l0aCBhIG1vZGlmaWVkIHN0YXJ0IGxvY2F0aW9uDQogICAgICAgI34gU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIFJlcGFyc2VFeGNlcHRpb24gaW4gdGhlIGNvbnN0cnVjdG9yLCBhbmQgcmFpc2UgdGhlDQogICAgICAgI34gZXhjZXB0aW9uIGluIGEgcGFyc2UgYWN0aW9uIHRvIGNhdXNlIHB5cGFyc2luZyB0byB1c2UgdGhlIG5ldyBzdHJpbmcvbG9jYXRpb24uDQogICAgICAgI34gU2V0dGluZyB0aGUgdmFsdWVzIGFzIE5vbmUgY2F1c2VzIG5vIGNoYW5nZSB0byBiZSBtYWRlLg0KICAgICAgICN+ICIiIg0KICAgICN+IGRlZiBfX2luaXRfKCBzZWxmLCBuZXdzdHJpbmcsIHJlc3RhcnRMb2MgKToNCiAgICAgICAgI34gc2VsZi5uZXdQYXJzZVRleHQgPSBuZXdzdHJpbmcNCiAgICAgICAgI34gc2VsZi5yZXBhcnNlTG9jID0gcmVzdGFydExvYw0KDQpjbGFzcyBSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uKEV4Y2VwdGlvbik6DQogICAgIiIiZXhjZXB0aW9uIHRocm93biBieSBMe1BhcnNlckVsZW1lbnQudmFsaWRhdGV9IGlmIHRoZSBncmFtbWFyIGNvdWxkIGJlIGltcHJvcGVybHkgcmVjdXJzaXZlIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHNlbGYucGFyc2VFbGVtZW50VHJhY2UgPSBwYXJzZUVsZW1lbnRMaXN0DQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIlJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb246ICVzIiAlIHNlbGYucGFyc2VFbGVtZW50VHJhY2UNCg0KY2xhc3MgX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQob2JqZWN0KToNCiAgICBkZWYgX19pbml0X18oc2VsZixwMSxwMik6DQogICAgICAgIHNlbGYudHVwID0gKHAxLHAyKQ0KICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLGkpOg0KICAgICAgICByZXR1cm4gc2VsZi50dXBbaV0NCiAgICBkZWYgX19yZXByX18oc2VsZik6DQogICAgICAgIHJldHVybiByZXByKHNlbGYudHVwWzBdKQ0KICAgIGRlZiBzZXRPZmZzZXQoc2VsZixpKToNCiAgICAgICAgc2VsZi50dXAgPSAoc2VsZi50dXBbMF0saSkNCg0KY2xhc3MgUGFyc2VSZXN1bHRzKG9iamVjdCk6DQogICAgIiIiDQogICAgU3RydWN0dXJlZCBwYXJzZSByZXN1bHRzLCB0byBwcm92aWRlIG11bHRpcGxlIG1lYW5zIG9mIGFjY2VzcyB0byB0aGUgcGFyc2VkIGRhdGE6DQogICAgICAgLSBhcyBhIGxpc3QgKEN7bGVuKHJlc3VsdHMpfSkNCiAgICAgICAtIGJ5IGxpc3QgaW5kZXggKEN7cmVzdWx0c1swXSwgcmVzdWx0c1sxXX0sIGV0Yy4pDQogICAgICAgLSBieSBhdHRyaWJ1dGUgKEN7cmVzdWx0cy48cmVzdWx0c05hbWU+fSAtIHNlZSBMe1BhcnNlckVsZW1lbnQuc2V0UmVzdWx0c05hbWV9KQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIGRhdGVfc3RyID0gKGludGVnZXIuc2V0UmVzdWx0c05hbWUoInllYXIiKSArICcvJyANCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgibW9udGgiKSArICcvJyANCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgiZGF5IikpDQogICAgICAgICMgZXF1aXZhbGVudCBmb3JtOg0KICAgICAgICAjIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQoNCiAgICAgICAgIyBwYXJzZVN0cmluZyByZXR1cm5zIGEgUGFyc2VSZXN1bHRzIG9iamVjdA0KICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpDQoNCiAgICAgICAgZGVmIHRlc3QocywgZm49cmVwcik6DQogICAgICAgICAgICBwcmludCgiJXMgLT4gJXMiICUgKHMsIGZuKGV2YWwocykpKSkNCiAgICAgICAgdGVzdCgibGlzdChyZXN1bHQpIikNCiAgICAgICAgdGVzdCgicmVzdWx0WzBdIikNCiAgICAgICAgdGVzdCgicmVzdWx0Wydtb250aCddIikNCiAgICAgICAgdGVzdCgicmVzdWx0LmRheSIpDQogICAgICAgIHRlc3QoIidtb250aCcgaW4gcmVzdWx0IikNCiAgICAgICAgdGVzdCgiJ21pbnV0ZXMnIGluIHJlc3VsdCIpDQogICAgICAgIHRlc3QoInJlc3VsdC5kdW1wKCkiLCBzdHIpDQogICAgcHJpbnRzOjoNCiAgICAgICAgbGlzdChyZXN1bHQpIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQ0KICAgICAgICByZXN1bHRbMF0gLT4gJzE5OTknDQogICAgICAgIHJlc3VsdFsnbW9udGgnXSAtPiAnMTInDQogICAgICAgIHJlc3VsdC5kYXkgLT4gJzMxJw0KICAgICAgICAnbW9udGgnIGluIHJlc3VsdCAtPiBUcnVlDQogICAgICAgICdtaW51dGVzJyBpbiByZXN1bHQgLT4gRmFsc2UNCiAgICAgICAgcmVzdWx0LmR1bXAoKSAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCiAgICAgICAgLSBkYXk6IDMxDQogICAgICAgIC0gbW9udGg6IDEyDQogICAgICAgIC0geWVhcjogMTk5OQ0KICAgICIiIg0KICAgIGRlZiBfX25ld19fKGNscywgdG9rbGlzdD1Ob25lLCBuYW1lPU5vbmUsIGFzTGlzdD1UcnVlLCBtb2RhbD1UcnVlICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgY2xzKToNCiAgICAgICAgICAgIHJldHVybiB0b2tsaXN0DQogICAgICAgIHJldG9iaiA9IG9iamVjdC5fX25ld19fKGNscykNCiAgICAgICAgcmV0b2JqLl9fZG9pbml0ID0gVHJ1ZQ0KICAgICAgICByZXR1cm4gcmV0b2JqDQoNCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogd2UgY29uc3RydWN0IGEgKmxvdCogb2YgdGhlc2UsIHNvIGtlZXAgdGhpcw0KICAgICMgY29uc3RydWN0b3IgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHRva2xpc3Q9Tm9uZSwgbmFtZT1Ob25lLCBhc0xpc3Q9VHJ1ZSwgbW9kYWw9VHJ1ZSwgaXNpbnN0YW5jZT1pc2luc3RhbmNlICk6DQogICAgICAgIGlmIHNlbGYuX19kb2luaXQ6DQogICAgICAgICAgICBzZWxmLl9fZG9pbml0ID0gRmFsc2UNCiAgICAgICAgICAgIHNlbGYuX19uYW1lID0gTm9uZQ0KICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IE5vbmUNCiAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzID0ge30NCiAgICAgICAgICAgIHNlbGYuX19hc0xpc3QgPSBhc0xpc3QNCiAgICAgICAgICAgIHNlbGYuX19tb2RhbCA9IG1vZGFsDQogICAgICAgICAgICBpZiB0b2tsaXN0IGlzIE5vbmU6DQogICAgICAgICAgICAgICAgdG9rbGlzdCA9IFtdDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsIGxpc3QpOg0KICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gdG9rbGlzdFs6XQ0KICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHRva2xpc3QsIF9nZW5lcmF0b3JUeXBlKToNCiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IGxpc3QodG9rbGlzdCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBbdG9rbGlzdF0NCiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0ID0gZGljdCgpDQoNCiAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZSBhbmQgbmFtZToNCiAgICAgICAgICAgIGlmIG5vdCBtb2RhbDoNCiAgICAgICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lc1tuYW1lXSA9IDANCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSxpbnQpOg0KICAgICAgICAgICAgICAgIG5hbWUgPSBfdXN0cihuYW1lKSAjIHdpbGwgYWx3YXlzIHJldHVybiBhIHN0ciwgYnV0IHVzZSBfdXN0ciBmb3IgY29uc2lzdGVuY3kNCiAgICAgICAgICAgIHNlbGYuX19uYW1lID0gbmFtZQ0KICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKHRva2xpc3QsICh0eXBlKE5vbmUpLCBiYXNlc3RyaW5nLCBsaXN0KSkgYW5kIHRva2xpc3QgaW4gKE5vbmUsJycsW10pKToNCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsYmFzZXN0cmluZyk6DQogICAgICAgICAgICAgICAgICAgIHRva2xpc3QgPSBbIHRva2xpc3QgXQ0KICAgICAgICAgICAgICAgIGlmIGFzTGlzdDoNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodG9rbGlzdC5jb3B5KCksMCkNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChQYXJzZVJlc3VsdHModG9rbGlzdFswXSksMCkNCiAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXS5fX25hbWUgPSBuYW1lDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IHRva2xpc3RbMF0NCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChLZXlFcnJvcixUeXBlRXJyb3IsSW5kZXhFcnJvcik6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gdG9rbGlzdA0KDQogICAgZGVmIF9fZ2V0aXRlbV9fKCBzZWxmLCBpICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGksIChpbnQsc2xpY2UpICk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2xpc3RbaV0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIGkgbm90IGluIHNlbGYuX19hY2N1bU5hbWVzOg0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdFtpXVstMV1bMF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHZbMF0gZm9yIHYgaW4gc2VsZi5fX3Rva2RpY3RbaV0gXSkNCg0KICAgIGRlZiBfX3NldGl0ZW1fXyggc2VsZiwgaywgdiwgaXNpbnN0YW5jZT1pc2luc3RhbmNlICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UodixfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCk6DQogICAgICAgICAgICBzZWxmLl9fdG9rZGljdFtrXSA9IHNlbGYuX190b2tkaWN0LmdldChrLGxpc3QoKSkgKyBbdl0NCiAgICAgICAgICAgIHN1YiA9IHZbMF0NCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGssKGludCxzbGljZSkpOg0KICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3Rba10gPSB2DQogICAgICAgICAgICBzdWIgPSB2DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLl9fdG9rZGljdFtrXSA9IHNlbGYuX190b2tkaWN0LmdldChrLGxpc3QoKSkgKyBbX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodiwwKV0NCiAgICAgICAgICAgIHN1YiA9IHYNCiAgICAgICAgaWYgaXNpbnN0YW5jZShzdWIsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgIHN1Yi5fX3BhcmVudCA9IHdrcmVmKHNlbGYpDQoNCiAgICBkZWYgX19kZWxpdGVtX18oIHNlbGYsIGkgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShpLChpbnQsc2xpY2UpKToNCiAgICAgICAgICAgIG15bGVuID0gbGVuKCBzZWxmLl9fdG9rbGlzdCApDQogICAgICAgICAgICBkZWwgc2VsZi5fX3Rva2xpc3RbaV0NCg0KICAgICAgICAgICAgIyBjb252ZXJ0IGludCB0byBzbGljZQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpLCBpbnQpOg0KICAgICAgICAgICAgICAgIGlmIGkgPCAwOg0KICAgICAgICAgICAgICAgICAgICBpICs9IG15bGVuDQogICAgICAgICAgICAgICAgaSA9IHNsaWNlKGksIGkrMSkNCiAgICAgICAgICAgICMgZ2V0IHJlbW92ZWQgaW5kaWNlcw0KICAgICAgICAgICAgcmVtb3ZlZCA9IGxpc3QocmFuZ2UoKmkuaW5kaWNlcyhteWxlbikpKQ0KICAgICAgICAgICAgcmVtb3ZlZC5yZXZlcnNlKCkNCiAgICAgICAgICAgICMgZml4dXAgaW5kaWNlcyBpbiB0b2tlbiBkaWN0aW9uYXJ5DQogICAgICAgICAgICBmb3IgbmFtZSxvY2N1cnJlbmNlcyBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOg0KICAgICAgICAgICAgICAgIGZvciBqIGluIHJlbW92ZWQ6DQogICAgICAgICAgICAgICAgICAgIGZvciBrLCAodmFsdWUsIHBvc2l0aW9uKSBpbiBlbnVtZXJhdGUob2NjdXJyZW5jZXMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZW5jZXNba10gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2YWx1ZSwgcG9zaXRpb24gLSAocG9zaXRpb24gPiBqKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGRlbCBzZWxmLl9fdG9rZGljdFtpXQ0KDQogICAgZGVmIF9fY29udGFpbnNfXyggc2VsZiwgayApOg0KICAgICAgICByZXR1cm4gayBpbiBzZWxmLl9fdG9rZGljdA0KDQogICAgZGVmIF9fbGVuX18oIHNlbGYgKTogcmV0dXJuIGxlbiggc2VsZi5fX3Rva2xpc3QgKQ0KICAgIGRlZiBfX2Jvb2xfXyhzZWxmKTogcmV0dXJuICggbm90IG5vdCBzZWxmLl9fdG9rbGlzdCApDQogICAgX19ub256ZXJvX18gPSBfX2Jvb2xfXw0KICAgIGRlZiBfX2l0ZXJfXyggc2VsZiApOiByZXR1cm4gaXRlciggc2VsZi5fX3Rva2xpc3QgKQ0KICAgIGRlZiBfX3JldmVyc2VkX18oIHNlbGYgKTogcmV0dXJuIGl0ZXIoIHNlbGYuX190b2tsaXN0Wzo6LTFdICkNCiAgICBkZWYgX2l0ZXJrZXlzKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fX3Rva2RpY3QsICJpdGVya2V5cyIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0Lml0ZXJrZXlzKCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYuX190b2tkaWN0KQ0KDQogICAgZGVmIF9pdGVydmFsdWVzKCBzZWxmICk6DQogICAgICAgIHJldHVybiAoc2VsZltrXSBmb3IgayBpbiBzZWxmLl9pdGVya2V5cygpKQ0KICAgICAgICAgICAgDQogICAgZGVmIF9pdGVyaXRlbXMoIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICgoaywgc2VsZltrXSkgZm9yIGsgaW4gc2VsZi5faXRlcmtleXMoKSkNCg0KICAgIGlmIFBZXzM6DQogICAgICAgIGtleXMgPSBfaXRlcmtleXMgICAgICAgDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChQeXRob24gMy54IG9ubHkpLiIiIg0KDQogICAgICAgIHZhbHVlcyA9IF9pdGVydmFsdWVzDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKFB5dGhvbiAzLnggb25seSkuIiIiDQoNCiAgICAgICAgaXRlbXMgPSBfaXRlcml0ZW1zDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWUgdHVwbGVzIChQeXRob24gMy54IG9ubHkpLiIiIg0KDQogICAgZWxzZToNCiAgICAgICAgaXRlcmtleXMgPSBfaXRlcmtleXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKFB5dGhvbiAyLnggb25seSkuIiIiDQoNCiAgICAgICAgaXRlcnZhbHVlcyA9IF9pdGVydmFsdWVzDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKFB5dGhvbiAyLnggb25seSkuIiIiDQoNCiAgICAgICAgaXRlcml0ZW1zID0gX2l0ZXJpdGVtcw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlIHR1cGxlcyAoUHl0aG9uIDIueCBvbmx5KS4iIiINCg0KICAgICAgICBkZWYga2V5cyggc2VsZiApOg0KICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKGFzIGEgbGlzdCBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiINCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcmtleXMoKSkNCg0KICAgICAgICBkZWYgdmFsdWVzKCBzZWxmICk6DQogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChhcyBhIGxpc3QgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiDQogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJ2YWx1ZXMoKSkNCiAgICAgICAgICAgICAgICANCiAgICAgICAgZGVmIGl0ZW1zKCBzZWxmICk6DQogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlcyAoYXMgYSBsaXN0IG9mIHR1cGxlcyBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiINCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcml0ZW1zKCkpDQoNCiAgICBkZWYgaGFza2V5cyggc2VsZiApOg0KICAgICAgICAiIiJTaW5jZSBrZXlzKCkgcmV0dXJucyBhbiBpdGVyYXRvciwgdGhpcyBtZXRob2QgaXMgaGVscGZ1bCBpbiBieXBhc3NpbmcNCiAgICAgICAgICAgY29kZSB0aGF0IGxvb2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFueSBkZWZpbmVkIHJlc3VsdHMgbmFtZXMuIiIiDQogICAgICAgIHJldHVybiBib29sKHNlbGYuX190b2tkaWN0KQ0KICAgICAgICANCiAgICBkZWYgcG9wKCBzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KICAgICAgICAiIiINCiAgICAgICAgUmVtb3ZlcyBhbmQgcmV0dXJucyBpdGVtIGF0IHNwZWNpZmllZCBpbmRleCAoZGVmYXVsdD1De2xhc3R9KS4NCiAgICAgICAgU3VwcG9ydHMgYm90aCBDe2xpc3R9IGFuZCBDe2RpY3R9IHNlbWFudGljcyBmb3IgQ3twb3AoKX0uIElmIHBhc3NlZCBubw0KICAgICAgICBhcmd1bWVudCBvciBhbiBpbnRlZ2VyIGFyZ3VtZW50LCBpdCB3aWxsIHVzZSBDe2xpc3R9IHNlbWFudGljcw0KICAgICAgICBhbmQgcG9wIHRva2VucyBmcm9tIHRoZSBsaXN0IG9mIHBhcnNlZCB0b2tlbnMuIElmIHBhc3NlZCBhIA0KICAgICAgICBub24taW50ZWdlciBhcmd1bWVudCAobW9zdCBsaWtlbHkgYSBzdHJpbmcpLCBpdCB3aWxsIHVzZSBDe2RpY3R9DQogICAgICAgIHNlbWFudGljcyBhbmQgcG9wIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gYW55IGRlZmluZWQgDQogICAgICAgIHJlc3VsdHMgbmFtZXMuIEEgc2Vjb25kIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGFyZ3VtZW50IGlzIA0KICAgICAgICBzdXBwb3J0ZWQsIGp1c3QgYXMgaW4gQ3tkaWN0LnBvcCgpfS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGRlZiByZW1vdmVfZmlyc3QodG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMucG9wKDApDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihyZW1vdmVfZmlyc3QpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzEyMycsICczMjEnXQ0KDQogICAgICAgICAgICBsYWJlbCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICAgICAgcGF0dCA9IGxhYmVsKCJMQUJFTCIpICsgT25lT3JNb3JlKFdvcmQobnVtcykpDQogICAgICAgICAgICBwcmludChwYXR0LnBhcnNlU3RyaW5nKCJBQUIgMTIzIDMyMSIpLmR1bXAoKSkNCg0KICAgICAgICAgICAgIyBVc2UgcG9wKCkgaW4gYSBwYXJzZSBhY3Rpb24gdG8gcmVtb3ZlIG5hbWVkIHJlc3VsdCAobm90ZSB0aGF0IGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgbm90DQogICAgICAgICAgICAjIHJlbW92ZWQgZnJvbSBsaXN0IGZvcm0gb2YgcmVzdWx0cykNCiAgICAgICAgICAgIGRlZiByZW1vdmVfTEFCRUwodG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMucG9wKCJMQUJFTCIpDQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2Vucw0KICAgICAgICAgICAgcGF0dC5hZGRQYXJzZUFjdGlvbihyZW1vdmVfTEFCRUwpDQogICAgICAgICAgICBwcmludChwYXR0LnBhcnNlU3RyaW5nKCJBQUIgMTIzIDMyMSIpLmR1bXAoKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnQUFCJywgJzEyMycsICczMjEnXQ0KICAgICAgICAgICAgLSBMQUJFTDogQUFCDQoNCiAgICAgICAgICAgIFsnQUFCJywgJzEyMycsICczMjEnXQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgbm90IGFyZ3M6DQogICAgICAgICAgICBhcmdzID0gWy0xXQ0KICAgICAgICBmb3Igayx2IGluIGt3YXJncy5pdGVtcygpOg0KICAgICAgICAgICAgaWYgayA9PSAnZGVmYXVsdCc6DQogICAgICAgICAgICAgICAgYXJncyA9IChhcmdzWzBdLCB2KQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInBvcCgpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJyVzJyIgJSBrKQ0KICAgICAgICBpZiAoaXNpbnN0YW5jZShhcmdzWzBdLCBpbnQpIG9yIA0KICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGFyZ3MpID09IDEgb3IgDQogICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzBdIGluIHNlbGYpOg0KICAgICAgICAgICAgaW5kZXggPSBhcmdzWzBdDQogICAgICAgICAgICByZXQgPSBzZWxmW2luZGV4XQ0KICAgICAgICAgICAgZGVsIHNlbGZbaW5kZXhdDQogICAgICAgICAgICByZXR1cm4gcmV0DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBkZWZhdWx0dmFsdWUgPSBhcmdzWzFdDQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdHZhbHVlDQoNCiAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdFZhbHVlPU5vbmUpOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyBuYW1lZCByZXN1bHQgbWF0Y2hpbmcgdGhlIGdpdmVuIGtleSwgb3IgaWYgdGhlcmUgaXMgbm8NCiAgICAgICAgc3VjaCBuYW1lLCB0aGVuIHJldHVybnMgdGhlIGdpdmVuIEN7ZGVmYXVsdFZhbHVlfSBvciBDe05vbmV9IGlmIG5vDQogICAgICAgIEN7ZGVmYXVsdFZhbHVlfSBpcyBzcGVjaWZpZWQuDQoNCiAgICAgICAgU2ltaWxhciB0byBDe2RpY3QuZ2V0KCl9Lg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIA0KDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpDQogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJ5ZWFyIikpICMgLT4gJzE5OTknDQogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJob3VyIiwgIm5vdCBzcGVjaWZpZWQiKSkgIyAtPiAnbm90IHNwZWNpZmllZCcNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoImhvdXIiKSkgIyAtPiBOb25lDQogICAgICAgICIiIg0KICAgICAgICBpZiBrZXkgaW4gc2VsZjoNCiAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUNCg0KICAgIGRlZiBpbnNlcnQoIHNlbGYsIGluZGV4LCBpbnNTdHIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEluc2VydHMgbmV3IGVsZW1lbnQgYXQgbG9jYXRpb24gaW5kZXggaW4gdGhlIGxpc3Qgb2YgcGFyc2VkIHRva2Vucy4NCiAgICAgICAgDQogICAgICAgIFNpbWlsYXIgdG8gQ3tsaXN0Lmluc2VydCgpfS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQ0KDQogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBpbnNlcnQgdGhlIHBhcnNlIGxvY2F0aW9uIGluIHRoZSBmcm9udCBvZiB0aGUgcGFyc2VkIHJlc3VsdHMNCiAgICAgICAgICAgIGRlZiBpbnNlcnRfbG9jbihsb2NuLCB0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5pbnNlcnQoMCwgbG9jbikNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihpbnNlcnRfbG9jbikucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFswLCAnMCcsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuX190b2tsaXN0Lmluc2VydChpbmRleCwgaW5zU3RyKQ0KICAgICAgICAjIGZpeHVwIGluZGljZXMgaW4gdG9rZW4gZGljdGlvbmFyeQ0KICAgICAgICBmb3IgbmFtZSxvY2N1cnJlbmNlcyBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOg0KICAgICAgICAgICAgZm9yIGssICh2YWx1ZSwgcG9zaXRpb24pIGluIGVudW1lcmF0ZShvY2N1cnJlbmNlcyk6DQogICAgICAgICAgICAgICAgb2NjdXJyZW5jZXNba10gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2YWx1ZSwgcG9zaXRpb24gKyAocG9zaXRpb24gPiBpbmRleCkpDQoNCiAgICBkZWYgYXBwZW5kKCBzZWxmLCBpdGVtICk6DQogICAgICAgICIiIg0KICAgICAgICBBZGQgc2luZ2xlIGVsZW1lbnQgdG8gZW5kIG9mIFBhcnNlUmVzdWx0cyBsaXN0IG9mIGVsZW1lbnRzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGNvbXB1dGUgdGhlIHN1bSBvZiB0aGUgcGFyc2VkIGludGVnZXJzLCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQNCiAgICAgICAgICAgIGRlZiBhcHBlbmRfc3VtKHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChzdW0obWFwKGludCwgdG9rZW5zKSkpDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24oYXBwZW5kX3N1bSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJywgNDQ0XQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5fX3Rva2xpc3QuYXBwZW5kKGl0ZW0pDQoNCiAgICBkZWYgZXh0ZW5kKCBzZWxmLCBpdGVtc2VxICk6DQogICAgICAgICIiIg0KICAgICAgICBBZGQgc2VxdWVuY2Ugb2YgZWxlbWVudHMgdG8gZW5kIG9mIFBhcnNlUmVzdWx0cyBsaXN0IG9mIGVsZW1lbnRzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGFwcGVuZCB0aGUgcmV2ZXJzZSBvZiB0aGUgbWF0Y2hlZCBzdHJpbmdzLCB0byBtYWtlIGEgcGFsaW5kcm9tZQ0KICAgICAgICAgICAgZGVmIG1ha2VfcGFsaW5kcm9tZSh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5leHRlbmQocmV2ZXJzZWQoW3RbOjotMV0gZm9yIHQgaW4gdG9rZW5zXSkpDQogICAgICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4odG9rZW5zKQ0KICAgICAgICAgICAgcHJpbnQocGF0dC5hZGRQYXJzZUFjdGlvbihtYWtlX3BhbGluZHJvbWUpLnBhcnNlU3RyaW5nKCJsc2tkaiBzZGxramYgbGtzZCIpKSAjIC0+ICdsc2tkanNkbGtqZmxrc2Rkc2tsZmprbGRzamRrc2wnDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW1zZXEsIFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICBzZWxmICs9IGl0ZW1zZXENCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuX190b2tsaXN0LmV4dGVuZChpdGVtc2VxKQ0KDQogICAgZGVmIGNsZWFyKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBDbGVhciBhbGwgZWxlbWVudHMgYW5kIHJlc3VsdHMgbmFtZXMuDQogICAgICAgICIiIg0KICAgICAgICBkZWwgc2VsZi5fX3Rva2xpc3RbOl0NCiAgICAgICAgc2VsZi5fX3Rva2RpY3QuY2xlYXIoKQ0KDQogICAgZGVmIF9fZ2V0YXR0cl9fKCBzZWxmLCBuYW1lICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzZWxmW25hbWVdDQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoNCiAgICAgICAgICAgIHJldHVybiAiIg0KICAgICAgICAgICAgDQogICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fX3Rva2RpY3Q6DQogICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLl9fYWNjdW1OYW1lczoNCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3RbbmFtZV1bLTFdWzBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB2WzBdIGZvciB2IGluIHNlbGYuX190b2tkaWN0W25hbWVdIF0pDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gIiINCg0KICAgIGRlZiBfX2FkZF9fKCBzZWxmLCBvdGhlciApOg0KICAgICAgICByZXQgPSBzZWxmLmNvcHkoKQ0KICAgICAgICByZXQgKz0gb3RoZXINCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIF9faWFkZF9fKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBvdGhlci5fX3Rva2RpY3Q6DQogICAgICAgICAgICBvZmZzZXQgPSBsZW4oc2VsZi5fX3Rva2xpc3QpDQogICAgICAgICAgICBhZGRvZmZzZXQgPSBsYW1iZGEgYTogb2Zmc2V0IGlmIGE8MCBlbHNlIGErb2Zmc2V0DQogICAgICAgICAgICBvdGhlcml0ZW1zID0gb3RoZXIuX190b2tkaWN0Lml0ZW1zKCkNCiAgICAgICAgICAgIG90aGVyZGljdGl0ZW1zID0gWyhrLCBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2WzBdLGFkZG9mZnNldCh2WzFdKSkgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGssdmxpc3QpIGluIG90aGVyaXRlbXMgZm9yIHYgaW4gdmxpc3RdDQogICAgICAgICAgICBmb3Igayx2IGluIG90aGVyZGljdGl0ZW1zOg0KICAgICAgICAgICAgICAgIHNlbGZba10gPSB2DQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2WzBdLFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgIHZbMF0uX19wYXJlbnQgPSB3a3JlZihzZWxmKQ0KICAgICAgICAgICAgDQogICAgICAgIHNlbGYuX190b2tsaXN0ICs9IG90aGVyLl9fdG9rbGlzdA0KICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcy51cGRhdGUoIG90aGVyLl9fYWNjdW1OYW1lcyApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLGludCkgYW5kIG90aGVyID09IDA6DQogICAgICAgICAgICAjIHVzZWZ1bCBmb3IgbWVyZ2luZyBtYW55IFBhcnNlUmVzdWx0cyB1c2luZyBzdW0oKSBidWlsdGluDQogICAgICAgICAgICByZXR1cm4gc2VsZi5jb3B5KCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgICMgdGhpcyBtYXkgcmFpc2UgYSBUeXBlRXJyb3IgLSBzbyBiZSBpdA0KICAgICAgICAgICAgcmV0dXJuIG90aGVyICsgc2VsZg0KICAgICAgICANCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICIoJXMsICVzKSIgJSAoIHJlcHIoIHNlbGYuX190b2tsaXN0ICksIHJlcHIoIHNlbGYuX190b2tkaWN0ICkgKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICdbJyArICcsICcuam9pbihfdXN0cihpKSBpZiBpc2luc3RhbmNlKGksIFBhcnNlUmVzdWx0cykgZWxzZSByZXByKGkpIGZvciBpIGluIHNlbGYuX190b2tsaXN0KSArICddJw0KDQogICAgZGVmIF9hc1N0cmluZ0xpc3QoIHNlbGYsIHNlcD0nJyApOg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLl9fdG9rbGlzdDoNCiAgICAgICAgICAgIGlmIG91dCBhbmQgc2VwOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoc2VwKQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSggaXRlbSwgUGFyc2VSZXN1bHRzICk6DQogICAgICAgICAgICAgICAgb3V0ICs9IGl0ZW0uX2FzU3RyaW5nTGlzdCgpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIF91c3RyKGl0ZW0pICkNCiAgICAgICAgcmV0dXJuIG91dA0KDQogICAgZGVmIGFzTGlzdCggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyB0aGUgcGFyc2UgcmVzdWx0cyBhcyBhIG5lc3RlZCBsaXN0IG9mIG1hdGNoaW5nIHRva2VucywgYWxsIGNvbnZlcnRlZCB0byBzdHJpbmdzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQogICAgICAgICAgICByZXN1bHQgPSBwYXR0LnBhcnNlU3RyaW5nKCJzbGRraiBsc2RraiBzbGRraiIpDQogICAgICAgICAgICAjIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgcHJpbnRzIGluIHN0cmluZy1saWtlIGZvcm0sIGl0IGlzIGFjdHVhbGx5IGEgcHlwYXJzaW5nIFBhcnNlUmVzdWx0cw0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHQpLCByZXN1bHQpICMgLT4gPGNsYXNzICdweXBhcnNpbmcuUGFyc2VSZXN1bHRzJz4gWydzbGRraicsICdsc2RraicsICdzbGRraiddDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgVXNlIGFzTGlzdCgpIHRvIGNyZWF0ZSBhbiBhY3R1YWwgbGlzdA0KICAgICAgICAgICAgcmVzdWx0X2xpc3QgPSByZXN1bHQuYXNMaXN0KCkNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0X2xpc3QpLCByZXN1bHRfbGlzdCkgIyAtPiA8Y2xhc3MgJ2xpc3QnPiBbJ3NsZGtqJywgJ2xzZGtqJywgJ3NsZGtqJ10NCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBbcmVzLmFzTGlzdCgpIGlmIGlzaW5zdGFuY2UocmVzLFBhcnNlUmVzdWx0cykgZWxzZSByZXMgZm9yIHJlcyBpbiBzZWxmLl9fdG9rbGlzdF0NCg0KICAgIGRlZiBhc0RpY3QoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgdGhlIG5hbWVkIHBhcnNlIHJlc3VsdHMgYXMgYSBuZXN0ZWQgZGljdGlvbmFyeS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygnMTIvMzEvMTk5OScpDQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdCksIHJlcHIocmVzdWx0KSkgIyAtPiA8Y2xhc3MgJ3B5cGFyc2luZy5QYXJzZVJlc3VsdHMnPiAoWycxMicsICcvJywgJzMxJywgJy8nLCAnMTk5OSddLCB7J2RheSc6IFsoJzE5OTknLCA0KV0sICd5ZWFyJzogWygnMTInLCAwKV0sICdtb250aCc6IFsoJzMxJywgMildfSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0X2RpY3QgPSByZXN1bHQuYXNEaWN0KCkNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0X2RpY3QpLCByZXByKHJlc3VsdF9kaWN0KSkgIyAtPiA8Y2xhc3MgJ2RpY3QnPiB7J2RheSc6ICcxOTk5JywgJ3llYXInOiAnMTInLCAnbW9udGgnOiAnMzEnfQ0KDQogICAgICAgICAgICAjIGV2ZW4gdGhvdWdoIGEgUGFyc2VSZXN1bHRzIHN1cHBvcnRzIGRpY3QtbGlrZSBhY2Nlc3MsIHNvbWV0aW1lIHlvdSBqdXN0IG5lZWQgdG8gaGF2ZSBhIGRpY3QNCiAgICAgICAgICAgIGltcG9ydCBqc29uDQogICAgICAgICAgICBwcmludChqc29uLmR1bXBzKHJlc3VsdCkpICMgLT4gRXhjZXB0aW9uOiBUeXBlRXJyb3I6IC4uLiBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUNCiAgICAgICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0LmFzRGljdCgpKSkgIyAtPiB7Im1vbnRoIjogIjMxIiwgImRheSI6ICIxOTk5IiwgInllYXIiOiAiMTIifQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgUFlfMzoNCiAgICAgICAgICAgIGl0ZW1fZm4gPSBzZWxmLml0ZW1zDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpdGVtX2ZuID0gc2VsZi5pdGVyaXRlbXMNCiAgICAgICAgICAgIA0KICAgICAgICBkZWYgdG9JdGVtKG9iaik6DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICBpZiBvYmouaGFza2V5cygpOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqLmFzRGljdCgpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt0b0l0ZW0odikgZm9yIHYgaW4gb2JqXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gb2JqDQogICAgICAgICAgICAgICAgDQogICAgICAgIHJldHVybiBkaWN0KChrLHRvSXRlbSh2KSkgZm9yIGssdiBpbiBpdGVtX2ZuKCkpDQoNCiAgICBkZWYgY29weSggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyBhIG5ldyBjb3B5IG9mIGEgQ3tQYXJzZVJlc3VsdHN9IG9iamVjdC4NCiAgICAgICAgIiIiDQogICAgICAgIHJldCA9IFBhcnNlUmVzdWx0cyggc2VsZi5fX3Rva2xpc3QgKQ0KICAgICAgICByZXQuX190b2tkaWN0ID0gc2VsZi5fX3Rva2RpY3QuY29weSgpDQogICAgICAgIHJldC5fX3BhcmVudCA9IHNlbGYuX19wYXJlbnQNCiAgICAgICAgcmV0Ll9fYWNjdW1OYW1lcy51cGRhdGUoIHNlbGYuX19hY2N1bU5hbWVzICkNCiAgICAgICAgcmV0Ll9fbmFtZSA9IHNlbGYuX19uYW1lDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiBhc1hNTCggc2VsZiwgZG9jdGFnPU5vbmUsIG5hbWVkSXRlbXNPbmx5PUZhbHNlLCBpbmRlbnQ9IiIsIGZvcm1hdHRlZD1UcnVlICk6DQogICAgICAgICIiIg0KICAgICAgICAoRGVwcmVjYXRlZCkgUmV0dXJucyB0aGUgcGFyc2UgcmVzdWx0cyBhcyBYTUwuIFRhZ3MgYXJlIGNyZWF0ZWQgZm9yIHRva2VucyBhbmQgbGlzdHMgdGhhdCBoYXZlIGRlZmluZWQgcmVzdWx0cyBuYW1lcy4NCiAgICAgICAgIiIiDQogICAgICAgIG5sID0gIlxuIg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBuYW1lZEl0ZW1zID0gZGljdCgodlsxXSxrKSBmb3IgKGssdmxpc3QpIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB2IGluIHZsaXN0KQ0KICAgICAgICBuZXh0TGV2ZWxJbmRlbnQgPSBpbmRlbnQgKyAiICAiDQoNCiAgICAgICAgIyBjb2xsYXBzZSBvdXQgaW5kZW50cyBpZiBmb3JtYXR0aW5nIGlzIG5vdCBkZXNpcmVkDQogICAgICAgIGlmIG5vdCBmb3JtYXR0ZWQ6DQogICAgICAgICAgICBpbmRlbnQgPSAiIg0KICAgICAgICAgICAgbmV4dExldmVsSW5kZW50ID0gIiINCiAgICAgICAgICAgIG5sID0gIiINCg0KICAgICAgICBzZWxmVGFnID0gTm9uZQ0KICAgICAgICBpZiBkb2N0YWcgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmVGFnID0gZG9jdGFnDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBzZWxmLl9fbmFtZToNCiAgICAgICAgICAgICAgICBzZWxmVGFnID0gc2VsZi5fX25hbWUNCg0KICAgICAgICBpZiBub3Qgc2VsZlRhZzoNCiAgICAgICAgICAgIGlmIG5hbWVkSXRlbXNPbmx5Og0KICAgICAgICAgICAgICAgIHJldHVybiAiIg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmVGFnID0gIklURU0iDQoNCiAgICAgICAgb3V0ICs9IFsgbmwsIGluZGVudCwgIjwiLCBzZWxmVGFnLCAiPiIgXQ0KDQogICAgICAgIGZvciBpLHJlcyBpbiBlbnVtZXJhdGUoc2VsZi5fX3Rva2xpc3QpOg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXMsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICBpZiBpIGluIG5hbWVkSXRlbXM6DQogICAgICAgICAgICAgICAgICAgIG91dCArPSBbIHJlcy5hc1hNTChuYW1lZEl0ZW1zW2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSXRlbXNPbmx5IGFuZCBkb2N0YWcgaXMgTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkKV0NCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBvdXQgKz0gWyByZXMuYXNYTUwoTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZEl0ZW1zT25seSBhbmQgZG9jdGFnIGlzIE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExldmVsSW5kZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCldDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgaW5kaXZpZHVhbCB0b2tlbiwgc2VlIGlmIHRoZXJlIGlzIGEgbmFtZSBmb3IgaXQNCiAgICAgICAgICAgICAgICByZXNUYWcgPSBOb25lDQogICAgICAgICAgICAgICAgaWYgaSBpbiBuYW1lZEl0ZW1zOg0KICAgICAgICAgICAgICAgICAgICByZXNUYWcgPSBuYW1lZEl0ZW1zW2ldDQogICAgICAgICAgICAgICAgaWYgbm90IHJlc1RhZzoNCiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZWRJdGVtc09ubHk6DQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzVGFnID0gIklURU0iDQogICAgICAgICAgICAgICAgeG1sQm9keVRleHQgPSBfeG1sX2VzY2FwZShfdXN0cihyZXMpKQ0KICAgICAgICAgICAgICAgIG91dCArPSBbIG5sLCBuZXh0TGV2ZWxJbmRlbnQsICI8IiwgcmVzVGFnLCAiPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxCb2R5VGV4dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LyIsIHJlc1RhZywgIj4iIF0NCg0KICAgICAgICBvdXQgKz0gWyBubCwgaW5kZW50LCAiPC8iLCBzZWxmVGFnLCAiPiIgXQ0KICAgICAgICByZXR1cm4gIiIuam9pbihvdXQpDQoNCiAgICBkZWYgX19sb29rdXAoc2VsZixzdWIpOg0KICAgICAgICBmb3Igayx2bGlzdCBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOg0KICAgICAgICAgICAgZm9yIHYsbG9jIGluIHZsaXN0Og0KICAgICAgICAgICAgICAgIGlmIHN1YiBpcyB2Og0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gaw0KICAgICAgICByZXR1cm4gTm9uZQ0KDQogICAgZGVmIGdldE5hbWUoc2VsZik6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIHRoZSByZXN1bHRzIG5hbWUgZm9yIHRoaXMgdG9rZW4gZXhwcmVzc2lvbi4gVXNlZnVsIHdoZW4gc2V2ZXJhbCANCiAgICAgICAgZGlmZmVyZW50IGV4cHJlc3Npb25zIG1pZ2h0IG1hdGNoIGF0IGEgcGFydGljdWxhciBsb2NhdGlvbi4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBzc25fZXhwciA9IFJlZ2V4KHIiXGRcZFxkLVxkXGQtXGRcZFxkXGQiKQ0KICAgICAgICAgICAgaG91c2VfbnVtYmVyX2V4cHIgPSBTdXBwcmVzcygnIycpICsgV29yZChudW1zLCBhbHBoYW51bXMpDQogICAgICAgICAgICB1c2VyX2RhdGEgPSAoR3JvdXAoaG91c2VfbnVtYmVyX2V4cHIpKCJob3VzZV9udW1iZXIiKSANCiAgICAgICAgICAgICAgICAgICAgICAgIHwgR3JvdXAoc3NuX2V4cHIpKCJzc24iKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfCBHcm91cChpbnRlZ2VyKSgiYWdlIikpDQogICAgICAgICAgICB1c2VyX2luZm8gPSBPbmVPck1vcmUodXNlcl9kYXRhKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHQgPSB1c2VyX2luZm8ucGFyc2VTdHJpbmcoIjIyIDExMS0yMi0zMzMzICMyMjFCIikNCiAgICAgICAgICAgIGZvciBpdGVtIGluIHJlc3VsdDoNCiAgICAgICAgICAgICAgICBwcmludChpdGVtLmdldE5hbWUoKSwgJzonLCBpdGVtWzBdKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgYWdlIDogMjINCiAgICAgICAgICAgIHNzbiA6IDExMS0yMi0zMzMzDQogICAgICAgICAgICBob3VzZV9udW1iZXIgOiAyMjFCDQogICAgICAgICIiIg0KICAgICAgICBpZiBzZWxmLl9fbmFtZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fbmFtZQ0KICAgICAgICBlbGlmIHNlbGYuX19wYXJlbnQ6DQogICAgICAgICAgICBwYXIgPSBzZWxmLl9fcGFyZW50KCkNCiAgICAgICAgICAgIGlmIHBhcjoNCiAgICAgICAgICAgICAgICByZXR1cm4gcGFyLl9fbG9va3VwKHNlbGYpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIGVsaWYgKGxlbihzZWxmKSA9PSAxIGFuZA0KICAgICAgICAgICAgICAgbGVuKHNlbGYuX190b2tkaWN0KSA9PSAxIGFuZA0KICAgICAgICAgICAgICAgbmV4dChpdGVyKHNlbGYuX190b2tkaWN0LnZhbHVlcygpKSlbMF1bMV0gaW4gKDAsLTEpKToNCiAgICAgICAgICAgIHJldHVybiBuZXh0KGl0ZXIoc2VsZi5fX3Rva2RpY3Qua2V5cygpKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBOb25lDQoNCiAgICBkZWYgZHVtcChzZWxmLCBpbmRlbnQ9JycsIGRlcHRoPTAsIGZ1bGw9VHJ1ZSk6DQogICAgICAgICIiIg0KICAgICAgICBEaWFnbm9zdGljIG1ldGhvZCBmb3IgbGlzdGluZyBvdXQgdGhlIGNvbnRlbnRzIG9mIGEgQ3tQYXJzZVJlc3VsdHN9Lg0KICAgICAgICBBY2NlcHRzIGFuIG9wdGlvbmFsIEN7aW5kZW50fSBhcmd1bWVudCBzbyB0aGF0IHRoaXMgc3RyaW5nIGNhbiBiZSBlbWJlZGRlZA0KICAgICAgICBpbiBhIG5lc3RlZCBkaXNwbGF5IG9mIG90aGVyIGRhdGEuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoJzEyLzMxLzE5OTknKQ0KICAgICAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnMTInLCAnLycsICczMScsICcvJywgJzE5OTknXQ0KICAgICAgICAgICAgLSBkYXk6IDE5OTkNCiAgICAgICAgICAgIC0gbW9udGg6IDMxDQogICAgICAgICAgICAtIHllYXI6IDEyDQogICAgICAgICIiIg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBOTCA9ICdcbicNCiAgICAgICAgb3V0LmFwcGVuZCggaW5kZW50K191c3RyKHNlbGYuYXNMaXN0KCkpICkNCiAgICAgICAgaWYgZnVsbDoNCiAgICAgICAgICAgIGlmIHNlbGYuaGFza2V5cygpOg0KICAgICAgICAgICAgICAgIGl0ZW1zID0gc29ydGVkKChzdHIoayksIHYpIGZvciBrLHYgaW4gc2VsZi5pdGVtcygpKQ0KICAgICAgICAgICAgICAgIGZvciBrLHYgaW4gaXRlbXM6DQogICAgICAgICAgICAgICAgICAgIGlmIG91dDoNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoTkwpDQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoICIlcyVzLSAlczogIiAlIChpbmRlbnQsKCcgICcqZGVwdGgpLCBrKSApDQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodixQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgdjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCB2LmR1bXAoaW5kZW50LGRlcHRoKzEpICkNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChfdXN0cih2KSkNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQocmVwcih2KSkNCiAgICAgICAgICAgIGVsaWYgYW55KGlzaW5zdGFuY2UodnYsUGFyc2VSZXN1bHRzKSBmb3IgdnYgaW4gc2VsZik6DQogICAgICAgICAgICAgICAgdiA9IHNlbGYNCiAgICAgICAgICAgICAgICBmb3IgaSx2diBpbiBlbnVtZXJhdGUodik6DQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodnYsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuJXMlc1slZF06XG4lcyVzJXMiICUgKGluZGVudCwoJyAgJyooZGVwdGgpKSxpLGluZGVudCwoJyAgJyooZGVwdGgrMSkpLHZ2LmR1bXAoaW5kZW50LGRlcHRoKzEpICkpDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiVzJXNbJWRdOlxuJXMlcyVzIiAlIChpbmRlbnQsKCcgICcqKGRlcHRoKSksaSxpbmRlbnQsKCcgICcqKGRlcHRoKzEpKSxfdXN0cih2dikpKQ0KICAgICAgICAgICAgDQogICAgICAgIHJldHVybiAiIi5qb2luKG91dCkNCg0KICAgIGRlZiBwcHJpbnQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCiAgICAgICAgIiIiDQogICAgICAgIFByZXR0eS1wcmludGVyIGZvciBwYXJzZWQgcmVzdWx0cyBhcyBhIGxpc3QsIHVzaW5nIHRoZSBDe3BwcmludH0gbW9kdWxlLg0KICAgICAgICBBY2NlcHRzIGFkZGl0aW9uYWwgcG9zaXRpb25hbCBvciBrZXl3b3JkIGFyZ3MgYXMgZGVmaW5lZCBmb3IgdGhlIA0KICAgICAgICBDe3BwcmludC5wcHJpbnR9IG1ldGhvZC4gKFV7aHR0cDovL2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvcHByaW50Lmh0bWwjcHByaW50LnBwcmludH0pDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMpDQogICAgICAgICAgICBudW0gPSBXb3JkKG51bXMpDQogICAgICAgICAgICBmdW5jID0gRm9yd2FyZCgpDQogICAgICAgICAgICB0ZXJtID0gaWRlbnQgfCBudW0gfCBHcm91cCgnKCcgKyBmdW5jICsgJyknKQ0KICAgICAgICAgICAgZnVuYyA8PD0gaWRlbnQgKyBHcm91cChPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKSkNCiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMucGFyc2VTdHJpbmcoImZuYSBhLGIsKGZuYiBjLGQsMjAwKSwxMDAiKQ0KICAgICAgICAgICAgcmVzdWx0LnBwcmludCh3aWR0aD00MCkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnZm5hJywNCiAgICAgICAgICAgICBbJ2EnLA0KICAgICAgICAgICAgICAnYicsDQogICAgICAgICAgICAgIFsnKCcsICdmbmInLCBbJ2MnLCAnZCcsICcyMDAnXSwgJyknXSwNCiAgICAgICAgICAgICAgJzEwMCddXQ0KICAgICAgICAiIiINCiAgICAgICAgcHByaW50LnBwcmludChzZWxmLmFzTGlzdCgpLCAqYXJncywgKiprd2FyZ3MpDQoNCiAgICAjIGFkZCBzdXBwb3J0IGZvciBwaWNrbGUgcHJvdG9jb2wNCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gKCBzZWxmLl9fdG9rbGlzdCwNCiAgICAgICAgICAgICAgICAgKCBzZWxmLl9fdG9rZGljdC5jb3B5KCksDQogICAgICAgICAgICAgICAgICAgc2VsZi5fX3BhcmVudCBpcyBub3QgTm9uZSBhbmQgc2VsZi5fX3BhcmVudCgpIG9yIE5vbmUsDQogICAgICAgICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMsDQogICAgICAgICAgICAgICAgICAgc2VsZi5fX25hbWUgKSApDQoNCiAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsc3RhdGUpOg0KICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IHN0YXRlWzBdDQogICAgICAgIChzZWxmLl9fdG9rZGljdCwNCiAgICAgICAgIHBhciwNCiAgICAgICAgIGluQWNjdW1OYW1lcywNCiAgICAgICAgIHNlbGYuX19uYW1lKSA9IHN0YXRlWzFdDQogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzID0ge30NCiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMudXBkYXRlKGluQWNjdW1OYW1lcykNCiAgICAgICAgaWYgcGFyIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IHdrcmVmKHBhcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSBOb25lDQoNCiAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6DQogICAgICAgIHJldHVybiBzZWxmLl9fdG9rbGlzdCwgc2VsZi5fX25hbWUsIHNlbGYuX19hc0xpc3QsIHNlbGYuX19tb2RhbA0KDQogICAgZGVmIF9fZGlyX18oc2VsZik6DQogICAgICAgIHJldHVybiAoZGlyKHR5cGUoc2VsZikpICsgbGlzdChzZWxmLmtleXMoKSkpDQoNCmNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nLnJlZ2lzdGVyKFBhcnNlUmVzdWx0cykNCg0KZGVmIGNvbCAobG9jLHN0cmcpOg0KICAgICIiIlJldHVybnMgY3VycmVudCBjb2x1bW4gd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuDQogICBUaGUgZmlyc3QgY29sdW1uIGlzIG51bWJlciAxLg0KDQogICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcNCiAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nfTxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24NCiAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGENCiAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uDQogICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLg0KICAgIiIiDQogICAgcyA9IHN0cmcNCiAgICByZXR1cm4gMSBpZiAwPGxvYzxsZW4ocykgYW5kIHNbbG9jLTFdID09ICdcbicgZWxzZSBsb2MgLSBzLnJmaW5kKCJcbiIsIDAsIGxvYykNCg0KZGVmIGxpbmVubyhsb2Msc3RyZyk6DQogICAgIiIiUmV0dXJucyBjdXJyZW50IGxpbmUgbnVtYmVyIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLg0KICAgVGhlIGZpcnN0IGxpbmUgaXMgbnVtYmVyIDEuDQoNCiAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZw0KICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmd9PFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbg0KICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQ0KICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4NCiAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuDQogICAiIiINCiAgICByZXR1cm4gc3RyZy5jb3VudCgiXG4iLDAsbG9jKSArIDENCg0KZGVmIGxpbmUoIGxvYywgc3RyZyApOg0KICAgICIiIlJldHVybnMgdGhlIGxpbmUgb2YgdGV4dCBjb250YWluaW5nIGxvYyB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4NCiAgICAgICAiIiINCiAgICBsYXN0Q1IgPSBzdHJnLnJmaW5kKCJcbiIsIDAsIGxvYykNCiAgICBuZXh0Q1IgPSBzdHJnLmZpbmQoIlxuIiwgbG9jKQ0KICAgIGlmIG5leHRDUiA+PSAwOg0KICAgICAgICByZXR1cm4gc3RyZ1tsYXN0Q1IrMTpuZXh0Q1JdDQogICAgZWxzZToNCiAgICAgICAgcmV0dXJuIHN0cmdbbGFzdENSKzE6XQ0KDQpkZWYgX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uKCBpbnN0cmluZywgbG9jLCBleHByICk6DQogICAgcHJpbnQgKCgiTWF0Y2ggIiArIF91c3RyKGV4cHIpICsgIiBhdCBsb2MgIiArIF91c3RyKGxvYykgKyAiKCVkLCVkKSIgJSAoIGxpbmVubyhsb2MsaW5zdHJpbmcpLCBjb2wobG9jLGluc3RyaW5nKSApKSkNCg0KZGVmIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uKCBpbnN0cmluZywgc3RhcnRsb2MsIGVuZGxvYywgZXhwciwgdG9rcyApOg0KICAgIHByaW50ICgiTWF0Y2hlZCAiICsgX3VzdHIoZXhwcikgKyAiIC0+ICIgKyBzdHIodG9rcy5hc0xpc3QoKSkpDQoNCmRlZiBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uKCBpbnN0cmluZywgbG9jLCBleHByLCBleGMgKToNCiAgICBwcmludCAoIkV4Y2VwdGlvbiByYWlzZWQ6IiArIF91c3RyKGV4YykpDQoNCmRlZiBudWxsRGVidWdBY3Rpb24oKmFyZ3MpOg0KICAgICIiIidEby1ub3RoaW5nJyBkZWJ1ZyBhY3Rpb24sIHRvIHN1cHByZXNzIGRlYnVnZ2luZyBvdXRwdXQgZHVyaW5nIHBhcnNpbmcuIiIiDQogICAgcGFzcw0KDQojIE9ubHkgd29ya3Mgb24gUHl0aG9uIDMueCAtIG5vbmxvY2FsIGlzIHRveGljIHRvIFB5dGhvbiAyIGluc3RhbGxzDQojfiAnZGVjb3JhdG9yIHRvIHRyaW0gZnVuY3Rpb24gY2FsbHMgdG8gbWF0Y2ggdGhlIGFyaXR5IG9mIHRoZSB0YXJnZXQnDQojfiBkZWYgX3RyaW1fYXJpdHkoZnVuYywgbWF4YXJncz0zKToNCiAgICAjfiBpZiBmdW5jIGluIHNpbmdsZUFyZ0J1aWx0aW5zOg0KICAgICAgICAjfiByZXR1cm4gbGFtYmRhIHMsbCx0OiBmdW5jKHQpDQogICAgI34gbGltaXQgPSAwDQogICAgI34gZm91bmRBcml0eSA9IEZhbHNlDQogICAgI34gZGVmIHdyYXBwZXIoKmFyZ3MpOg0KICAgICAgICAjfiBub25sb2NhbCBsaW1pdCxmb3VuZEFyaXR5DQogICAgICAgICN+IHdoaWxlIDE6DQogICAgICAgICAgICAjfiB0cnk6DQogICAgICAgICAgICAgICAgI34gcmV0ID0gZnVuYygqYXJnc1tsaW1pdDpdKQ0KICAgICAgICAgICAgICAgICN+IGZvdW5kQXJpdHkgPSBUcnVlDQogICAgICAgICAgICAgICAgI34gcmV0dXJuIHJldA0KICAgICAgICAgICAgI34gZXhjZXB0IFR5cGVFcnJvcjoNCiAgICAgICAgICAgICAgICAjfiBpZiBsaW1pdCA9PSBtYXhhcmdzIG9yIGZvdW5kQXJpdHk6DQogICAgICAgICAgICAgICAgICAgICN+IHJhaXNlDQogICAgICAgICAgICAgICAgI34gbGltaXQgKz0gMQ0KICAgICAgICAgICAgICAgICN+IGNvbnRpbnVlDQogICAgI34gcmV0dXJuIHdyYXBwZXINCg0KIyB0aGlzIHZlcnNpb24gaXMgUHl0aG9uIDIueC0zLnggY3Jvc3MtY29tcGF0aWJsZQ0KJ2RlY29yYXRvciB0byB0cmltIGZ1bmN0aW9uIGNhbGxzIHRvIG1hdGNoIHRoZSBhcml0eSBvZiB0aGUgdGFyZ2V0Jw0KZGVmIF90cmltX2FyaXR5KGZ1bmMsIG1heGFyZ3M9Mik6DQogICAgaWYgZnVuYyBpbiBzaW5nbGVBcmdCdWlsdGluczoNCiAgICAgICAgcmV0dXJuIGxhbWJkYSBzLGwsdDogZnVuYyh0KQ0KICAgIGxpbWl0ID0gWzBdDQogICAgZm91bmRBcml0eSA9IFtGYWxzZV0NCiAgICANCiAgICAjIHRyYWNlYmFjayByZXR1cm4gZGF0YSBzdHJ1Y3R1cmUgY2hhbmdlZCBpbiBQeTMuNSAtIG5vcm1hbGl6ZSBiYWNrIHRvIHBsYWluIHR1cGxlcw0KICAgIGlmIHN5c3RlbV92ZXJzaW9uWzoyXSA+PSAoMyw1KToNCiAgICAgICAgZGVmIGV4dHJhY3Rfc3RhY2sobGltaXQ9MCk6DQogICAgICAgICAgICAjIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFB5dGhvbiAzLjUuMCAtIGV4dHJhIGRlZXAgY2FsbCBzdGFjayBieSAxDQogICAgICAgICAgICBvZmZzZXQgPSAtMyBpZiBzeXN0ZW1fdmVyc2lvbiA9PSAoMyw1LDApIGVsc2UgLTINCiAgICAgICAgICAgIGZyYW1lX3N1bW1hcnkgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayhsaW1pdD0tb2Zmc2V0K2xpbWl0LTEpW29mZnNldF0NCiAgICAgICAgICAgIHJldHVybiBbKGZyYW1lX3N1bW1hcnkuZmlsZW5hbWUsIGZyYW1lX3N1bW1hcnkubGluZW5vKV0NCiAgICAgICAgZGVmIGV4dHJhY3RfdGIodGIsIGxpbWl0PTApOg0KICAgICAgICAgICAgZnJhbWVzID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIodGIsIGxpbWl0PWxpbWl0KQ0KICAgICAgICAgICAgZnJhbWVfc3VtbWFyeSA9IGZyYW1lc1stMV0NCiAgICAgICAgICAgIHJldHVybiBbKGZyYW1lX3N1bW1hcnkuZmlsZW5hbWUsIGZyYW1lX3N1bW1hcnkubGluZW5vKV0NCiAgICBlbHNlOg0KICAgICAgICBleHRyYWN0X3N0YWNrID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sNCiAgICAgICAgZXh0cmFjdF90YiA9IHRyYWNlYmFjay5leHRyYWN0X3RiDQogICAgDQogICAgIyBzeW50aGVzaXplIHdoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sgYXQgdGhlIGNhbGwgdG8gDQogICAgIyB1c2VyJ3MgcGFyc2UgYWN0aW9uICdmdW5jJywgc28gdGhhdCB3ZSBkb24ndCBpbmN1ciBjYWxsIHBlbmFsdHkgYXQgcGFyc2UgdGltZQ0KICAgIA0KICAgIExJTkVfRElGRiA9IDYNCiAgICAjIElGIEFOWSBDT0RFIENIQU5HRVMsIEVWRU4gSlVTVCBDT01NRU5UUyBPUiBCTEFOSyBMSU5FUywgQkVUV0VFTiBUSEUgTkVYVCBMSU5FIEFORCANCiAgICAjIFRIRSBDQUxMIFRPIEZVTkMgSU5TSURFIFdSQVBQRVIsIExJTkVfRElGRiBNVVNUIEJFIE1PRElGSUVEISEhIQ0KICAgIHRoaXNfbGluZSA9IGV4dHJhY3Rfc3RhY2sobGltaXQ9MilbLTFdDQogICAgcGFfY2FsbF9saW5lX3N5bnRoID0gKHRoaXNfbGluZVswXSwgdGhpc19saW5lWzFdK0xJTkVfRElGRikNCg0KICAgIGRlZiB3cmFwcGVyKCphcmdzKToNCiAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXQgPSBmdW5jKCphcmdzW2xpbWl0WzBdOl0pDQogICAgICAgICAgICAgICAgZm91bmRBcml0eVswXSA9IFRydWUNCiAgICAgICAgICAgICAgICByZXR1cm4gcmV0DQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOg0KICAgICAgICAgICAgICAgICMgcmUtcmFpc2UgVHlwZUVycm9ycyBpZiB0aGV5IGRpZCBub3QgY29tZSBmcm9tIG91ciBhcml0eSB0ZXN0aW5nDQogICAgICAgICAgICAgICAgaWYgZm91bmRBcml0eVswXToNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICB0YiA9IHN5cy5leGNfaW5mbygpWy0xXQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGV4dHJhY3RfdGIodGIsIGxpbWl0PTIpWy0xXVs6Ml0gPT0gcGFfY2FsbF9saW5lX3N5bnRoOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICAgICAgICAgICAgICBkZWwgdGINCg0KICAgICAgICAgICAgICAgIGlmIGxpbWl0WzBdIDw9IG1heGFyZ3M6DQogICAgICAgICAgICAgICAgICAgIGxpbWl0WzBdICs9IDENCiAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICByYWlzZQ0KDQogICAgIyBjb3B5IGZ1bmMgbmFtZSB0byB3cmFwcGVyIGZvciBzZW5zaWJsZSBkZWJ1ZyBvdXRwdXQNCiAgICBmdW5jX25hbWUgPSAiPHBhcnNlIGFjdGlvbj4iDQogICAgdHJ5Og0KICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICdfX25hbWVfXycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoZnVuYywgJ19fY2xhc3NfXycpLl9fbmFtZV9fKQ0KICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgIGZ1bmNfbmFtZSA9IHN0cihmdW5jKQ0KICAgIHdyYXBwZXIuX19uYW1lX18gPSBmdW5jX25hbWUNCg0KICAgIHJldHVybiB3cmFwcGVyDQoNCmNsYXNzIFBhcnNlckVsZW1lbnQob2JqZWN0KToNCiAgICAiIiJBYnN0cmFjdCBiYXNlIGxldmVsIHBhcnNlciBlbGVtZW50IGNsYXNzLiIiIg0KICAgIERFRkFVTFRfV0hJVEVfQ0hBUlMgPSAiIFxuXHRcciINCiAgICB2ZXJib3NlX3N0YWNrdHJhY2UgPSBGYWxzZQ0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBzZXREZWZhdWx0V2hpdGVzcGFjZUNoYXJzKCBjaGFycyApOg0KICAgICAgICByIiIiDQogICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycyBhcmUgc3BhY2UsIDxUQUI+IGFuZCBuZXdsaW5lDQogICAgICAgICAgICBPbmVPck1vcmUoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWJjIGRlZlxuZ2hpIGprbCIpICAjIC0+IFsnYWJjJywgJ2RlZicsICdnaGknLCAnamtsJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBjaGFuZ2UgdG8ganVzdCB0cmVhdCBuZXdsaW5lIGFzIHNpZ25pZmljYW50DQogICAgICAgICAgICBQYXJzZXJFbGVtZW50LnNldERlZmF1bHRXaGl0ZXNwYWNlQ2hhcnMoIiBcdCIpDQogICAgICAgICAgICBPbmVPck1vcmUoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWJjIGRlZlxuZ2hpIGprbCIpICAjIC0+IFsnYWJjJywgJ2RlZiddDQogICAgICAgICIiIg0KICAgICAgICBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMgPSBjaGFycw0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBpbmxpbmVMaXRlcmFsc1VzaW5nKGNscyk6DQogICAgICAgICIiIg0KICAgICAgICBTZXQgY2xhc3MgdG8gYmUgdXNlZCBmb3IgaW5jbHVzaW9uIG9mIHN0cmluZyBsaXRlcmFscyBpbnRvIGEgcGFyc2VyLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIGRlZmF1bHQgbGl0ZXJhbCBjbGFzcyB1c2VkIGlzIExpdGVyYWwNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgDQoNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQoNCg0KICAgICAgICAgICAgIyBjaGFuZ2UgdG8gU3VwcHJlc3MNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuaW5saW5lTGl0ZXJhbHNVc2luZyhTdXBwcmVzcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICANCg0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnMTInLCAnMzEnXQ0KICAgICAgICAiIiINCiAgICAgICAgUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzID0gY2xzDQoNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHNhdmVsaXN0PUZhbHNlICk6DQogICAgICAgIHNlbGYucGFyc2VBY3Rpb24gPSBsaXN0KCkNCiAgICAgICAgc2VsZi5mYWlsQWN0aW9uID0gTm9uZQ0KICAgICAgICAjfiBzZWxmLm5hbWUgPSAiPHVua25vd24+IiAgIyBkb24ndCBkZWZpbmUgc2VsZi5uYW1lLCBsZXQgc3ViY2xhc3NlcyB0cnkvZXhjZXB0IHVwY2FsbA0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHNlbGYucmVzdWx0c05hbWUgPSBOb25lDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNhdmVsaXN0DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYud2hpdGVDaGFycyA9IFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUw0KICAgICAgICBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFycyA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlICMgdXNlZCB3aGVuIGNoZWNraW5nIGZvciBsZWZ0LXJlY3Vyc2lvbg0KICAgICAgICBzZWxmLmtlZXBUYWJzID0gRmFsc2UNCiAgICAgICAgc2VsZi5pZ25vcmVFeHBycyA9IGxpc3QoKQ0KICAgICAgICBzZWxmLmRlYnVnID0gRmFsc2UNCiAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IFRydWUgIyB1c2VkIHRvIG9wdGltaXplIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3Igc3ViY2xhc3NlcyB0aGF0IGRvbid0IGFkdmFuY2UgcGFyc2UgaW5kZXgNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiIg0KICAgICAgICBzZWxmLm1vZGFsUmVzdWx0cyA9IFRydWUgIyB1c2VkIHRvIG1hcmsgcmVzdWx0cyBuYW1lcyBhcyBtb2RhbCAocmVwb3J0IG9ubHkgbGFzdCkgb3IgY3VtdWxhdGl2ZSAobGlzdCBhbGwpDQogICAgICAgIHNlbGYuZGVidWdBY3Rpb25zID0gKCBOb25lLCBOb25lLCBOb25lICkgI2N1c3RvbSBkZWJ1ZyBhY3Rpb25zDQogICAgICAgIHNlbGYucmUgPSBOb25lDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZSAjIHVzZWQgdG8gYXZvaWQgcmVkdW5kYW50IGNhbGxzIHRvIHByZVBhcnNlDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IEZhbHNlDQoNCiAgICBkZWYgY29weSggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgTWFrZSBhIGNvcHkgb2YgdGhpcyBDe1BhcnNlckVsZW1lbnR9LiAgVXNlZnVsIGZvciBkZWZpbmluZyBkaWZmZXJlbnQgcGFyc2UgYWN0aW9ucw0KICAgICAgICBmb3IgdGhlIHNhbWUgcGFyc2luZyBwYXR0ZXJuLCB1c2luZyBjb3BpZXMgb2YgdGhlIG9yaWdpbmFsIHBhcnNlIGVsZW1lbnQuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgICAgICBpbnRlZ2VySyA9IGludGVnZXIuY29weSgpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQpICsgU3VwcHJlc3MoIksiKQ0KICAgICAgICAgICAgaW50ZWdlck0gPSBpbnRlZ2VyLmNvcHkoKS5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSoxMDI0KjEwMjQpICsgU3VwcHJlc3MoIk0iKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoaW50ZWdlcksgfCBpbnRlZ2VyTSB8IGludGVnZXIpLnBhcnNlU3RyaW5nKCI1SyAxMDAgNjQwSyAyNTZNIikpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbNTEyMCwgMTAwLCA2NTUzNjAsIDI2ODQzNTQ1Nl0NCiAgICAgICAgRXF1aXZhbGVudCBmb3JtIG9mIEN7ZXhwci5jb3B5KCl9IGlzIGp1c3QgQ3tleHByKCl9OjoNCiAgICAgICAgICAgIGludGVnZXJNID0gaW50ZWdlcigpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQqMTAyNCkgKyBTdXBwcmVzcygiTSIpDQogICAgICAgICIiIg0KICAgICAgICBjcHkgPSBjb3B5LmNvcHkoIHNlbGYgKQ0KICAgICAgICBjcHkucGFyc2VBY3Rpb24gPSBzZWxmLnBhcnNlQWN0aW9uWzpdDQogICAgICAgIGNweS5pZ25vcmVFeHBycyA9IHNlbGYuaWdub3JlRXhwcnNbOl0NCiAgICAgICAgaWYgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnM6DQogICAgICAgICAgICBjcHkud2hpdGVDaGFycyA9IFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUw0KICAgICAgICByZXR1cm4gY3B5DQoNCiAgICBkZWYgc2V0TmFtZSggc2VsZiwgbmFtZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIG5hbWUgZm9yIHRoaXMgZXhwcmVzc2lvbiwgbWFrZXMgZGVidWdnaW5nIGFuZCBleGNlcHRpb24gbWVzc2FnZXMgY2xlYXJlci4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgV29yZChudW1zKS5wYXJzZVN0cmluZygiQUJDIikgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBXOigwMTIzLi4uKSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQogICAgICAgICAgICBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5wYXJzZVN0cmluZygiQUJDIikgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBpbnRlZ2VyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYubmFtZSA9IG5hbWUNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsImV4Y2VwdGlvbiIpOg0KICAgICAgICAgICAgc2VsZi5leGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRSZXN1bHRzTmFtZSggc2VsZiwgbmFtZSwgbGlzdEFsbE1hdGNoZXM9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIERlZmluZSBuYW1lIGZvciByZWZlcmVuY2luZyBtYXRjaGluZyB0b2tlbnMgYXMgYSBuZXN0ZWQgYXR0cmlidXRlDQogICAgICAgIG9mIHRoZSByZXR1cm5lZCBwYXJzZSByZXN1bHRzLg0KICAgICAgICBOT1RFOiB0aGlzIHJldHVybnMgYSAqY29weSogb2YgdGhlIG9yaWdpbmFsIEN7UGFyc2VyRWxlbWVudH0gb2JqZWN0Ow0KICAgICAgICB0aGlzIGlzIHNvIHRoYXQgdGhlIGNsaWVudCBjYW4gZGVmaW5lIGEgYmFzaWMgZWxlbWVudCwgc3VjaCBhcyBhbg0KICAgICAgICBpbnRlZ2VyLCBhbmQgcmVmZXJlbmNlIGl0IGluIG11bHRpcGxlIHBsYWNlcyB3aXRoIGRpZmZlcmVudCBuYW1lcy4NCg0KICAgICAgICBZb3UgY2FuIGFsc28gc2V0IHJlc3VsdHMgbmFtZXMgdXNpbmcgdGhlIGFiYnJldmlhdGVkIHN5bnRheCwNCiAgICAgICAgQ3tleHByKCJuYW1lIil9IGluIHBsYWNlIG9mIEN7ZXhwci5zZXRSZXN1bHRzTmFtZSgibmFtZSIpfSAtIA0KICAgICAgICBzZWUgTHtJe19fY2FsbF9ffTxfX2NhbGxfXz59Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZGF0ZV9zdHIgPSAoaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgieWVhciIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJtb250aCIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJkYXkiKSkNCg0KICAgICAgICAgICAgIyBlcXVpdmFsZW50IGZvcm06DQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KICAgICAgICAiIiINCiAgICAgICAgbmV3c2VsZiA9IHNlbGYuY29weSgpDQogICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoIioiKToNCiAgICAgICAgICAgIG5hbWUgPSBuYW1lWzotMV0NCiAgICAgICAgICAgIGxpc3RBbGxNYXRjaGVzPVRydWUNCiAgICAgICAgbmV3c2VsZi5yZXN1bHRzTmFtZSA9IG5hbWUNCiAgICAgICAgbmV3c2VsZi5tb2RhbFJlc3VsdHMgPSBub3QgbGlzdEFsbE1hdGNoZXMNCiAgICAgICAgcmV0dXJuIG5ld3NlbGYNCg0KICAgIGRlZiBzZXRCcmVhayhzZWxmLGJyZWFrRmxhZyA9IFRydWUpOg0KICAgICAgICAiIiJNZXRob2QgdG8gaW52b2tlIHRoZSBQeXRob24gcGRiIGRlYnVnZ2VyIHdoZW4gdGhpcyBlbGVtZW50IGlzDQogICAgICAgICAgIGFib3V0IHRvIGJlIHBhcnNlZC4gU2V0IEN7YnJlYWtGbGFnfSB0byBUcnVlIHRvIGVuYWJsZSwgRmFsc2UgdG8NCiAgICAgICAgICAgZGlzYWJsZS4NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGJyZWFrRmxhZzoNCiAgICAgICAgICAgIF9wYXJzZU1ldGhvZCA9IHNlbGYuX3BhcnNlDQogICAgICAgICAgICBkZWYgYnJlYWtlcihpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUpOg0KICAgICAgICAgICAgICAgIGltcG9ydCBwZGINCiAgICAgICAgICAgICAgICBwZGIuc2V0X3RyYWNlKCkNCiAgICAgICAgICAgICAgICByZXR1cm4gX3BhcnNlTWV0aG9kKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZSApDQogICAgICAgICAgICBicmVha2VyLl9vcmlnaW5hbFBhcnNlTWV0aG9kID0gX3BhcnNlTWV0aG9kDQogICAgICAgICAgICBzZWxmLl9wYXJzZSA9IGJyZWFrZXINCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fcGFyc2UsIl9vcmlnaW5hbFBhcnNlTWV0aG9kIik6DQogICAgICAgICAgICAgICAgc2VsZi5fcGFyc2UgPSBzZWxmLl9wYXJzZS5fb3JpZ2luYWxQYXJzZU1ldGhvZA0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFBhcnNlQWN0aW9uKCBzZWxmLCAqZm5zLCAqKmt3YXJncyApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIGFjdGlvbiB0byBwZXJmb3JtIHdoZW4gc3VjY2Vzc2Z1bGx5IG1hdGNoaW5nIHBhcnNlIGVsZW1lbnQgZGVmaW5pdGlvbi4NCiAgICAgICAgUGFyc2UgYWN0aW9uIGZuIGlzIGEgY2FsbGFibGUgbWV0aG9kIHdpdGggMC0zIGFyZ3VtZW50cywgY2FsbGVkIGFzIEN7Zm4ocyxsb2MsdG9rcyl9LA0KICAgICAgICBDe2ZuKGxvYyx0b2tzKX0sIEN7Zm4odG9rcyl9LCBvciBqdXN0IEN7Zm4oKX0sIHdoZXJlOg0KICAgICAgICAgLSBzICAgPSB0aGUgb3JpZ2luYWwgc3RyaW5nIGJlaW5nIHBhcnNlZCAoc2VlIG5vdGUgYmVsb3cpDQogICAgICAgICAtIGxvYyA9IHRoZSBsb2NhdGlvbiBvZiB0aGUgbWF0Y2hpbmcgc3Vic3RyaW5nDQogICAgICAgICAtIHRva3MgPSBhIGxpc3Qgb2YgdGhlIG1hdGNoZWQgdG9rZW5zLCBwYWNrYWdlZCBhcyBhIEN7THtQYXJzZVJlc3VsdHN9fSBvYmplY3QNCiAgICAgICAgSWYgdGhlIGZ1bmN0aW9ucyBpbiBmbnMgbW9kaWZ5IHRoZSB0b2tlbnMsIHRoZXkgY2FuIHJldHVybiB0aGVtIGFzIHRoZSByZXR1cm4NCiAgICAgICAgdmFsdWUgZnJvbSBmbiwgYW5kIHRoZSBtb2RpZmllZCBsaXN0IG9mIHRva2VucyB3aWxsIHJlcGxhY2UgdGhlIG9yaWdpbmFsLg0KICAgICAgICBPdGhlcndpc2UsIGZuIGRvZXMgbm90IG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZS4NCg0KICAgICAgICBPcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50czoNCiAgICAgICAgIC0gY2FsbER1cmluZ1RyeSA9IChkZWZhdWx0PUN7RmFsc2V9KSBpbmRpY2F0ZSBpZiBwYXJzZSBhY3Rpb24gc2hvdWxkIGJlIHJ1biBkdXJpbmcgbG9va2FoZWFkcyBhbmQgYWx0ZXJuYXRlIHRlc3RpbmcNCg0KICAgICAgICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcNCiAgICAgICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe3BhcnNlU3RyaW5nfTxwYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uDQogICAgICAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGENCiAgICAgICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4NCiAgICAgICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlciArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyDQoNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQoNCiAgICAgICAgICAgICMgdXNlIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRvIGludHMgYXQgcGFyc2UgdGltZQ0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlciArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyDQoNCiAgICAgICAgICAgICMgbm90ZSB0aGF0IGludGVnZXIgZmllbGRzIGFyZSBub3cgaW50cywgbm90IHN0cmluZ3MNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWzE5OTksICcvJywgMTIsICcvJywgMzFdDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnBhcnNlQWN0aW9uID0gbGlzdChtYXAoX3RyaW1fYXJpdHksIGxpc3QoZm5zKSkpDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBhZGRQYXJzZUFjdGlvbiggc2VsZiwgKmZucywgKiprd2FyZ3MgKToNCiAgICAgICAgIiIiDQogICAgICAgIEFkZCBwYXJzZSBhY3Rpb24gdG8gZXhwcmVzc2lvbidzIGxpc3Qgb2YgcGFyc2UgYWN0aW9ucy4gU2VlIEx7SXtzZXRQYXJzZUFjdGlvbn08c2V0UGFyc2VBY3Rpb24+fS4NCiAgICAgICAgDQogICAgICAgIFNlZSBleGFtcGxlcyBpbiBMe0l7Y29weX08Y29weT59Lg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiArPSBsaXN0KG1hcChfdHJpbV9hcml0eSwgbGlzdChmbnMpKSkNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gc2VsZi5jYWxsRHVyaW5nVHJ5IG9yIGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBhZGRDb25kaXRpb24oc2VsZiwgKmZucywgKiprd2FyZ3MpOg0KICAgICAgICAiIiJBZGQgYSBib29sZWFuIHByZWRpY2F0ZSBmdW5jdGlvbiB0byBleHByZXNzaW9uJ3MgbGlzdCBvZiBwYXJzZSBhY3Rpb25zLiBTZWUgDQogICAgICAgIEx7SXtzZXRQYXJzZUFjdGlvbn08c2V0UGFyc2VBY3Rpb24+fSBmb3IgZnVuY3Rpb24gY2FsbCBzaWduYXR1cmVzLiBVbmxpa2UgQ3tzZXRQYXJzZUFjdGlvbn0sIA0KICAgICAgICBmdW5jdGlvbnMgcGFzc2VkIHRvIEN7YWRkQ29uZGl0aW9ufSBuZWVkIHRvIHJldHVybiBib29sZWFuIHN1Y2Nlc3MvZmFpbCBvZiB0aGUgY29uZGl0aW9uLg0KDQogICAgICAgIE9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOg0KICAgICAgICAgLSBtZXNzYWdlID0gZGVmaW5lIGEgY3VzdG9tIG1lc3NhZ2UgdG8gYmUgdXNlZCBpbiB0aGUgcmFpc2VkIGV4Y2VwdGlvbg0KICAgICAgICAgLSBmYXRhbCAgID0gaWYgVHJ1ZSwgd2lsbCByYWlzZSBQYXJzZUZhdGFsRXhjZXB0aW9uIHRvIHN0b3AgcGFyc2luZyBpbW1lZGlhdGVseTsgb3RoZXJ3aXNlIHdpbGwgcmFpc2UgUGFyc2VFeGNlcHRpb24NCiAgICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgICAgICB5ZWFyX2ludCA9IGludGVnZXIuY29weSgpDQogICAgICAgICAgICB5ZWFyX2ludC5hZGRDb25kaXRpb24obGFtYmRhIHRva3M6IHRva3NbMF0gPj0gMjAwMCwgbWVzc2FnZT0iT25seSBzdXBwb3J0IHllYXJzIDIwMDAgYW5kIGxhdGVyIikNCiAgICAgICAgICAgIGRhdGVfc3RyID0geWVhcl9pbnQgKyAnLycgKyBpbnRlZ2VyICsgJy8nICsgaW50ZWdlcg0KDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IEV4Y2VwdGlvbjogT25seSBzdXBwb3J0IHllYXJzIDIwMDAgYW5kIGxhdGVyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgIiIiDQogICAgICAgIG1zZyA9IGt3YXJncy5nZXQoIm1lc3NhZ2UiLCAiZmFpbGVkIHVzZXItZGVmaW5lZCBjb25kaXRpb24iKQ0KICAgICAgICBleGNfdHlwZSA9IFBhcnNlRmF0YWxFeGNlcHRpb24gaWYga3dhcmdzLmdldCgiZmF0YWwiLCBGYWxzZSkgZWxzZSBQYXJzZUV4Y2VwdGlvbg0KICAgICAgICBmb3IgZm4gaW4gZm5zOg0KICAgICAgICAgICAgZGVmIHBhKHMsbCx0KToNCiAgICAgICAgICAgICAgICBpZiBub3QgYm9vbChfdHJpbV9hcml0eShmbikocyxsLHQpKToNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXhjX3R5cGUocyxsLG1zZykNCiAgICAgICAgICAgIHNlbGYucGFyc2VBY3Rpb24uYXBwZW5kKHBhKQ0KICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBzZWxmLmNhbGxEdXJpbmdUcnkgb3Iga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldEZhaWxBY3Rpb24oIHNlbGYsIGZuICk6DQogICAgICAgICIiIkRlZmluZSBhY3Rpb24gdG8gcGVyZm9ybSBpZiBwYXJzaW5nIGZhaWxzIGF0IHRoaXMgZXhwcmVzc2lvbi4NCiAgICAgICAgICAgRmFpbCBhY3RvbiBmbiBpcyBhIGNhbGxhYmxlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIGFyZ3VtZW50cw0KICAgICAgICAgICBDe2ZuKHMsbG9jLGV4cHIsZXJyKX0gd2hlcmU6DQogICAgICAgICAgICAtIHMgPSBzdHJpbmcgYmVpbmcgcGFyc2VkDQogICAgICAgICAgICAtIGxvYyA9IGxvY2F0aW9uIHdoZXJlIGV4cHJlc3Npb24gbWF0Y2ggd2FzIGF0dGVtcHRlZCBhbmQgZmFpbGVkDQogICAgICAgICAgICAtIGV4cHIgPSB0aGUgcGFyc2UgZXhwcmVzc2lvbiB0aGF0IGZhaWxlZA0KICAgICAgICAgICAgLSBlcnIgPSB0aGUgZXhjZXB0aW9uIHRocm93bg0KICAgICAgICAgICBUaGUgZnVuY3Rpb24gcmV0dXJucyBubyB2YWx1ZS4gIEl0IG1heSB0aHJvdyBDe0x7UGFyc2VGYXRhbEV4Y2VwdGlvbn19DQogICAgICAgICAgIGlmIGl0IGlzIGRlc2lyZWQgdG8gc3RvcCBwYXJzaW5nIGltbWVkaWF0ZWx5LiIiIg0KICAgICAgICBzZWxmLmZhaWxBY3Rpb24gPSBmbg0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIF9za2lwSWdub3JhYmxlcyggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICBleHByc0ZvdW5kID0gVHJ1ZQ0KICAgICAgICB3aGlsZSBleHByc0ZvdW5kOg0KICAgICAgICAgICAgZXhwcnNGb3VuZCA9IEZhbHNlDQogICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYyxkdW1teSA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJzRm91bmQgPSBUcnVlDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICBwYXNzDQogICAgICAgIHJldHVybiBsb2MNCg0KICAgIGRlZiBwcmVQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICBpZiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgbG9jID0gc2VsZi5fc2tpcElnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQ0KDQogICAgICAgIGlmIHNlbGYuc2tpcFdoaXRlc3BhY2U6DQogICAgICAgICAgICB3dCA9IHNlbGYud2hpdGVDaGFycw0KICAgICAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgICAgICB3aGlsZSBsb2MgPCBpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiB3dDoNCiAgICAgICAgICAgICAgICBsb2MgKz0gMQ0KDQogICAgICAgIHJldHVybiBsb2MNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0dXJuIHRva2VubGlzdA0KDQogICAgI34gQHByb2ZpbGUNCiAgICBkZWYgX3BhcnNlTm9DYWNoZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUsIGNhbGxQcmVQYXJzZT1UcnVlICk6DQogICAgICAgIGRlYnVnZ2luZyA9ICggc2VsZi5kZWJ1ZyApICNhbmQgZG9BY3Rpb25zICkNCg0KICAgICAgICBpZiBkZWJ1Z2dpbmcgb3Igc2VsZi5mYWlsQWN0aW9uOg0KICAgICAgICAgICAgI34gcHJpbnQgKCJNYXRjaCIsc2VsZiwiYXQgbG9jIixsb2MsIiglZCwlZCkiICUgKCBsaW5lbm8obG9jLGluc3RyaW5nKSwgY29sKGxvYyxpbnN0cmluZykgKSkNCiAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1swXSApOg0KICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzBdKCBpbnN0cmluZywgbG9jLCBzZWxmICkNCiAgICAgICAgICAgIGlmIGNhbGxQcmVQYXJzZSBhbmQgc2VsZi5jYWxsUHJlcGFyc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYw0KICAgICAgICAgICAgdG9rZW5zU3RhcnQgPSBwcmVsb2MNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZiApDQogICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICAjfiBwcmludCAoIkV4Y2VwdGlvbiByYWlzZWQ6IiwgZXJyKQ0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdBY3Rpb25zWzJdOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1syXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQ0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZmFpbEFjdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsQWN0aW9uKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApDQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIGNhbGxQcmVQYXJzZSBhbmQgc2VsZi5jYWxsUHJlcGFyc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYw0KICAgICAgICAgICAgdG9rZW5zU3RhcnQgPSBwcmVsb2MNCiAgICAgICAgICAgIGlmIHNlbGYubWF5SW5kZXhFcnJvciBvciBsb2MgPj0gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZiApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCg0KICAgICAgICB0b2tlbnMgPSBzZWxmLnBvc3RQYXJzZSggaW5zdHJpbmcsIGxvYywgdG9rZW5zICkNCg0KICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2Vucywgc2VsZi5yZXN1bHRzTmFtZSwgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCwgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQ0KICAgICAgICBpZiBzZWxmLnBhcnNlQWN0aW9uIGFuZCAoZG9BY3Rpb25zIG9yIHNlbGYuY2FsbER1cmluZ1RyeSk6DQogICAgICAgICAgICBpZiBkZWJ1Z2dpbmc6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5wYXJzZUFjdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGZuKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHJldFRva2VucyApDQogICAgICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbnMgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdHNOYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCBhbmQgaXNpbnN0YW5jZSh0b2tlbnMsKFBhcnNlUmVzdWx0cyxsaXN0KSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgICAgICN+IHByaW50ICJFeGNlcHRpb24gcmFpc2VkIGluIHVzZXIgcGFyc2UgYWN0aW9uOiIsIGVycg0KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMl0gKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzJdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApDQogICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGZvciBmbiBpbiBzZWxmLnBhcnNlQWN0aW9uOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBmbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCByZXRUb2tlbnMgKQ0KICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbnMgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2VucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCBhbmQgaXNpbnN0YW5jZSh0b2tlbnMsKFBhcnNlUmVzdWx0cyxsaXN0KSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkNCg0KICAgICAgICBpZiBkZWJ1Z2dpbmc6DQogICAgICAgICAgICAjfiBwcmludCAoIk1hdGNoZWQiLHNlbGYsIi0+IixyZXRUb2tlbnMuYXNMaXN0KCkpDQogICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMV0gKToNCiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1sxXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBsb2MsIHNlbGYsIHJldFRva2VucyApDQoNCiAgICAgICAgcmV0dXJuIGxvYywgcmV0VG9rZW5zDQoNCiAgICBkZWYgdHJ5UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9RmFsc2UgKVswXQ0KICAgICAgICBleGNlcHQgUGFyc2VGYXRhbEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICANCiAgICBkZWYgY2FuUGFyc2VOZXh0KHNlbGYsIGluc3RyaW5nLCBsb2MpOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLnRyeVBhcnNlKGluc3RyaW5nLCBsb2MpDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sIEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KDQogICAgY2xhc3MgX1VuYm91bmRlZENhY2hlKG9iamVjdCk6DQogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToNCiAgICAgICAgICAgIGNhY2hlID0ge30NCiAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkNCg0KICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOg0KICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpDQoNCiAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6DQogICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlDQoNCiAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToNCiAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpDQoNCiAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpDQogICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQ0KICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpDQoNCiAgICBpZiBfT3JkZXJlZERpY3QgaXMgbm90IE5vbmU6DQogICAgICAgIGNsYXNzIF9GaWZvQ2FjaGUob2JqZWN0KToNCiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplKToNCiAgICAgICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpDQoNCiAgICAgICAgICAgICAgICBjYWNoZSA9IF9PcmRlcmVkRGljdCgpDQoNCiAgICAgICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpDQoNCiAgICAgICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUNCiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGNhY2hlKSA+IHNpemU6DQogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wb3BpdGVtKEZhbHNlKQ0KDQogICAgICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpDQoNCiAgICAgICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpDQoNCiAgICBlbHNlOg0KICAgICAgICBjbGFzcyBfRmlmb0NhY2hlKG9iamVjdCk6DQogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSk6DQogICAgICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQ0KDQogICAgICAgICAgICAgICAgY2FjaGUgPSB7fQ0KICAgICAgICAgICAgICAgIGtleV9maWZvID0gY29sbGVjdGlvbnMuZGVxdWUoW10sIHNpemUpDQoNCiAgICAgICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpDQoNCiAgICAgICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUNCiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGNhY2hlKSA+IHNpemU6DQogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wb3Aoa2V5X2ZpZm8ucG9wbGVmdCgpLCBOb25lKQ0KICAgICAgICAgICAgICAgICAgICBrZXlfZmlmby5hcHBlbmQoa2V5KQ0KDQogICAgICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpDQogICAgICAgICAgICAgICAgICAgIGtleV9maWZvLmNsZWFyKCkNCg0KICAgICAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikNCg0KICAgICMgYXJndW1lbnQgY2FjaGUgZm9yIG9wdGltaXppbmcgcmVwZWF0ZWQgY2FsbHMgd2hlbiBiYWNrdHJhY2tpbmcgdGhyb3VnaCByZWN1cnNpdmUgZXhwcmVzc2lvbnMNCiAgICBwYWNrcmF0X2NhY2hlID0ge30gIyB0aGlzIGlzIHNldCBsYXRlciBieSBlbmFibGVkUGFja3JhdCgpOyB0aGlzIGlzIGhlcmUgc28gdGhhdCByZXNldENhY2hlKCkgZG9lc24ndCBmYWlsDQogICAgcGFja3JhdF9jYWNoZV9sb2NrID0gUkxvY2soKQ0KICAgIHBhY2tyYXRfY2FjaGVfc3RhdHMgPSBbMCwgMF0NCg0KICAgICMgdGhpcyBtZXRob2QgZ2V0cyByZXBlYXRlZGx5IGNhbGxlZCBkdXJpbmcgYmFja3RyYWNraW5nIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzIC0NCiAgICAjIHdlIGNhbiBjYWNoZSB0aGVzZSBhcmd1bWVudHMgYW5kIHNhdmUgb3Vyc2VsdmVzIHRoZSB0cm91YmxlIG9mIHJlLXBhcnNpbmcgdGhlIGNvbnRhaW5lZCBleHByZXNzaW9uDQogICAgZGVmIF9wYXJzZUNhY2hlKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUgKToNCiAgICAgICAgSElULCBNSVNTID0gMCwgMQ0KICAgICAgICBsb29rdXAgPSAoc2VsZiwgaW5zdHJpbmcsIGxvYywgY2FsbFByZVBhcnNlLCBkb0FjdGlvbnMpDQogICAgICAgIHdpdGggUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX2xvY2s6DQogICAgICAgICAgICBjYWNoZSA9IFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZQ0KICAgICAgICAgICAgdmFsdWUgPSBjYWNoZS5nZXQobG9va3VwKQ0KICAgICAgICAgICAgaWYgdmFsdWUgaXMgY2FjaGUubm90X2luX2NhY2hlOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1tNSVNTXSArPSAxDQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX3BhcnNlTm9DYWNoZShpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZSkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgICAgICAgICAjIGNhY2hlIGEgY29weSBvZiB0aGUgZXhjZXB0aW9uLCB3aXRob3V0IHRoZSB0cmFjZWJhY2sNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuc2V0KGxvb2t1cCwgcGUuX19jbGFzc19fKCpwZS5hcmdzKSkNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5zZXQobG9va3VwLCAodmFsdWVbMF0sIHZhbHVlWzFdLmNvcHkoKSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbSElUXSArPSAxDQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgRXhjZXB0aW9uKToNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgdmFsdWUNCiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlWzBdLCB2YWx1ZVsxXS5jb3B5KCkpDQoNCiAgICBfcGFyc2UgPSBfcGFyc2VOb0NhY2hlDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHJlc2V0Q2FjaGUoKToNCiAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlLmNsZWFyKCkNCiAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzWzpdID0gWzBdICogbGVuKFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0cykNCg0KICAgIF9wYWNrcmF0RW5hYmxlZCA9IEZhbHNlDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBlbmFibGVQYWNrcmF0KGNhY2hlX3NpemVfbGltaXQ9MTI4KToNCiAgICAgICAgIiIiRW5hYmxlcyAicGFja3JhdCIgcGFyc2luZywgd2hpY2ggYWRkcyBtZW1vaXppbmcgdG8gdGhlIHBhcnNpbmcgbG9naWMuDQogICAgICAgICAgIFJlcGVhdGVkIHBhcnNlIGF0dGVtcHRzIGF0IHRoZSBzYW1lIHN0cmluZyBsb2NhdGlvbiAod2hpY2ggaGFwcGVucw0KICAgICAgICAgICBvZnRlbiBpbiBtYW55IGNvbXBsZXggZ3JhbW1hcnMpIGNhbiBpbW1lZGlhdGVseSByZXR1cm4gYSBjYWNoZWQgdmFsdWUsDQogICAgICAgICAgIGluc3RlYWQgb2YgcmUtZXhlY3V0aW5nIHBhcnNpbmcvdmFsaWRhdGluZyBjb2RlLiAgTWVtb2l6aW5nIGlzIGRvbmUgb2YNCiAgICAgICAgICAgYm90aCB2YWxpZCByZXN1bHRzIGFuZCBwYXJzaW5nIGV4Y2VwdGlvbnMuDQogICAgICAgICAgIA0KICAgICAgICAgICBQYXJhbWV0ZXJzOg0KICAgICAgICAgICAgLSBjYWNoZV9zaXplX2xpbWl0IC0gKGRlZmF1bHQ9Q3sxMjh9KSAtIGlmIGFuIGludGVnZXIgdmFsdWUgaXMgcHJvdmlkZWQNCiAgICAgICAgICAgICAgd2lsbCBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgcGFja3JhdCBjYWNoZTsgaWYgTm9uZSBpcyBwYXNzZWQsIHRoZW4NCiAgICAgICAgICAgICAgdGhlIGNhY2hlIHNpemUgd2lsbCBiZSB1bmJvdW5kZWQ7IGlmIDAgaXMgcGFzc2VkLCB0aGUgY2FjaGUgd2lsbA0KICAgICAgICAgICAgICBiZSBlZmZlY3RpdmVseSBkaXNhYmxlZC4NCiAgICAgICAgICAgIA0KICAgICAgICAgICBUaGlzIHNwZWVkdXAgbWF5IGJyZWFrIGV4aXN0aW5nIHByb2dyYW1zIHRoYXQgdXNlIHBhcnNlIGFjdGlvbnMgdGhhdA0KICAgICAgICAgICBoYXZlIHNpZGUtZWZmZWN0cy4gIEZvciB0aGlzIHJlYXNvbiwgcGFja3JhdCBwYXJzaW5nIGlzIGRpc2FibGVkIHdoZW4NCiAgICAgICAgICAgeW91IGZpcnN0IGltcG9ydCBweXBhcnNpbmcuICBUbyBhY3RpdmF0ZSB0aGUgcGFja3JhdCBmZWF0dXJlLCB5b3VyDQogICAgICAgICAgIHByb2dyYW0gbXVzdCBjYWxsIHRoZSBjbGFzcyBtZXRob2QgQ3tQYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXQoKX0uICBJZg0KICAgICAgICAgICB5b3VyIHByb2dyYW0gdXNlcyBDe3BzeWNvfSB0byAiY29tcGlsZSBhcyB5b3UgZ28iLCB5b3UgbXVzdCBjYWxsDQogICAgICAgICAgIEN7ZW5hYmxlUGFja3JhdH0gYmVmb3JlIGNhbGxpbmcgQ3twc3ljby5mdWxsKCl9LiAgSWYgeW91IGRvIG5vdCBkbyB0aGlzLA0KICAgICAgICAgICBQeXRob24gd2lsbCBjcmFzaC4gIEZvciBiZXN0IHJlc3VsdHMsIGNhbGwgQ3tlbmFibGVQYWNrcmF0KCl9IGltbWVkaWF0ZWx5DQogICAgICAgICAgIGFmdGVyIGltcG9ydGluZyBweXBhcnNpbmcuDQogICAgICAgICAgIA0KICAgICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICAgIGltcG9ydCBweXBhcnNpbmcNCiAgICAgICAgICAgICAgIHB5cGFyc2luZy5QYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXQoKQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgbm90IFBhcnNlckVsZW1lbnQuX3BhY2tyYXRFbmFibGVkOg0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5fcGFja3JhdEVuYWJsZWQgPSBUcnVlDQogICAgICAgICAgICBpZiBjYWNoZV9zaXplX2xpbWl0IGlzIE5vbmU6DQogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlID0gUGFyc2VyRWxlbWVudC5fVW5ib3VuZGVkQ2FjaGUoKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUgPSBQYXJzZXJFbGVtZW50Ll9GaWZvQ2FjaGUoY2FjaGVfc2l6ZV9saW1pdCkNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuX3BhcnNlID0gUGFyc2VyRWxlbWVudC5fcGFyc2VDYWNoZQ0KDQogICAgZGVmIHBhcnNlU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgcGFyc2VBbGw9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLg0KICAgICAgICBUaGlzIGlzIHRoZSBtYWluIGludGVyZmFjZSB0byB0aGUgY2xpZW50IGNvZGUsIG9uY2UgdGhlIGNvbXBsZXRlDQogICAgICAgIGV4cHJlc3Npb24gaGFzIGJlZW4gYnVpbHQuDQoNCiAgICAgICAgSWYgeW91IHdhbnQgdGhlIGdyYW1tYXIgdG8gcmVxdWlyZSB0aGF0IHRoZSBlbnRpcmUgaW5wdXQgc3RyaW5nIGJlDQogICAgICAgIHN1Y2Nlc3NmdWxseSBwYXJzZWQsIHRoZW4gc2V0IEN7cGFyc2VBbGx9IHRvIFRydWUgKGVxdWl2YWxlbnQgdG8gZW5kaW5nDQogICAgICAgIHRoZSBncmFtbWFyIHdpdGggQ3tMe1N0cmluZ0VuZCgpfX0pLg0KDQogICAgICAgIE5vdGU6IEN7cGFyc2VTdHJpbmd9IGltcGxpY2l0bHkgY2FsbHMgQ3tleHBhbmR0YWJzKCl9IG9uIHRoZSBpbnB1dCBzdHJpbmcsDQogICAgICAgIGluIG9yZGVyIHRvIHJlcG9ydCBwcm9wZXIgY29sdW1uIG51bWJlcnMgaW4gcGFyc2UgYWN0aW9ucy4NCiAgICAgICAgSWYgdGhlIGlucHV0IHN0cmluZyBjb250YWlucyB0YWJzIGFuZA0KICAgICAgICB0aGUgZ3JhbW1hciB1c2VzIHBhcnNlIGFjdGlvbnMgdGhhdCB1c2UgdGhlIEN7bG9jfSBhcmd1bWVudCB0byBpbmRleCBpbnRvIHRoZQ0KICAgICAgICBzdHJpbmcgYmVpbmcgcGFyc2VkLCB5b3UgY2FuIGVuc3VyZSB5b3UgaGF2ZSBhIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgaW5wdXQNCiAgICAgICAgc3RyaW5nIGJ5Og0KICAgICAgICAgLSBjYWxsaW5nIEN7cGFyc2VXaXRoVGFic30gb24geW91ciBncmFtbWFyIGJlZm9yZSBjYWxsaW5nIEN7cGFyc2VTdHJpbmd9DQogICAgICAgICAgIChzZWUgTHtJe3BhcnNlV2l0aFRhYnN9PHBhcnNlV2l0aFRhYnM+fSkNCiAgICAgICAgIC0gZGVmaW5lIHlvdXIgcGFyc2UgYWN0aW9uIHVzaW5nIHRoZSBmdWxsIEN7KHMsbG9jLHRva3MpfSBzaWduYXR1cmUsIGFuZA0KICAgICAgICAgICByZWZlcmVuY2UgdGhlIGlucHV0IHN0cmluZyB1c2luZyB0aGUgcGFyc2UgYWN0aW9uJ3MgQ3tzfSBhcmd1bWVudA0KICAgICAgICAgLSBleHBsaWN0bHkgZXhwYW5kIHRoZSB0YWJzIGluIHlvdXIgaW5wdXQgc3RyaW5nIGJlZm9yZSBjYWxsaW5nDQogICAgICAgICAgIEN7cGFyc2VTdHJpbmd9DQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIFdvcmQoJ2EnKS5wYXJzZVN0cmluZygnYWFhYWFiYWFhJykgICMgLT4gWydhYWFhYSddDQogICAgICAgICAgICBXb3JkKCdhJykucGFyc2VTdHJpbmcoJ2FhYWFhYmFhYScsIHBhcnNlQWxsPVRydWUpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgZW5kIG9mIHRleHQNCiAgICAgICAgIiIiDQogICAgICAgIFBhcnNlckVsZW1lbnQucmVzZXRDYWNoZSgpDQogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOg0KICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lKCkNCiAgICAgICAgICAgICN+IHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpDQogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBUYWJzOg0KICAgICAgICAgICAgaW5zdHJpbmcgPSBpbnN0cmluZy5leHBhbmR0YWJzKCkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmLl9wYXJzZSggaW5zdHJpbmcsIDAgKQ0KICAgICAgICAgICAgaWYgcGFyc2VBbGw6DQogICAgICAgICAgICAgICAgbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgc2UgPSBFbXB0eSgpICsgU3RyaW5nRW5kKCkNCiAgICAgICAgICAgICAgICBzZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gdG9rZW5zDQoNCiAgICBkZWYgc2NhblN0cmluZyggc2VsZiwgaW5zdHJpbmcsIG1heE1hdGNoZXM9X01BWF9JTlQsIG92ZXJsYXA9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIFNjYW4gdGhlIGlucHV0IHN0cmluZyBmb3IgZXhwcmVzc2lvbiBtYXRjaGVzLiAgRWFjaCBtYXRjaCB3aWxsIHJldHVybiB0aGUNCiAgICAgICAgbWF0Y2hpbmcgdG9rZW5zLCBzdGFydCBsb2NhdGlvbiwgYW5kIGVuZCBsb2NhdGlvbi4gIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbA0KICAgICAgICBDe21heE1hdGNoZXN9IGFyZ3VtZW50LCB0byBjbGlwIHNjYW5uaW5nIGFmdGVyICduJyBtYXRjaGVzIGFyZSBmb3VuZC4gIElmDQogICAgICAgIEN7b3ZlcmxhcH0gaXMgc3BlY2lmaWVkLCB0aGVuIG92ZXJsYXBwaW5nIG1hdGNoZXMgd2lsbCBiZSByZXBvcnRlZC4NCg0KICAgICAgICBOb3RlIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb25zIGFyZSByZXBvcnRlZCByZWxhdGl2ZSB0byB0aGUgc3RyaW5nDQogICAgICAgIGJlaW5nIHBhcnNlZC4gIFNlZSBMe0l7cGFyc2VTdHJpbmd9PHBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGFyc2luZw0KICAgICAgICBzdHJpbmdzIHdpdGggZW1iZWRkZWQgdGFicy4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHNvdXJjZSA9ICJzbGRqZjEyM2xzZGpqa2YzNDVzbGRramY4Nzlsa2pzZmQ5ODciDQogICAgICAgICAgICBwcmludChzb3VyY2UpDQogICAgICAgICAgICBmb3IgdG9rZW5zLHN0YXJ0LGVuZCBpbiBXb3JkKGFscGhhcykuc2NhblN0cmluZyhzb3VyY2UpOg0KICAgICAgICAgICAgICAgIHByaW50KCcgJypzdGFydCArICdeJyooZW5kLXN0YXJ0KSkNCiAgICAgICAgICAgICAgICBwcmludCgnICcqc3RhcnQgKyB0b2tlbnNbMF0pDQogICAgICAgIA0KICAgICAgICBwcmludHM6Og0KICAgICAgICANCiAgICAgICAgICAgIHNsZGpmMTIzbHNkamprZjM0NXNsZGtqZjg3OWxranNmZDk4Nw0KICAgICAgICAgICAgXl5eXl4NCiAgICAgICAgICAgIHNsZGpmDQogICAgICAgICAgICAgICAgICAgIF5eXl5eXl4NCiAgICAgICAgICAgICAgICAgICAgbHNkamprZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGRramYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGtqc2ZkDQogICAgICAgICIiIg0KICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoNCiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZSgpDQogICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQ0KDQogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBUYWJzOg0KICAgICAgICAgICAgaW5zdHJpbmcgPSBfdXN0cihpbnN0cmluZykuZXhwYW5kdGFicygpDQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBsb2MgPSAwDQogICAgICAgIHByZXBhcnNlRm4gPSBzZWxmLnByZVBhcnNlDQogICAgICAgIHBhcnNlRm4gPSBzZWxmLl9wYXJzZQ0KICAgICAgICBQYXJzZXJFbGVtZW50LnJlc2V0Q2FjaGUoKQ0KICAgICAgICBtYXRjaGVzID0gMA0KICAgICAgICB0cnk6DQogICAgICAgICAgICB3aGlsZSBsb2MgPD0gaW5zdHJsZW4gYW5kIG1hdGNoZXMgPCBtYXhNYXRjaGVzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gcHJlcGFyc2VGbiggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgICAgIG5leHRMb2MsdG9rZW5zID0gcGFyc2VGbiggaW5zdHJpbmcsIHByZWxvYywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIGxvYyA9IHByZWxvYysxDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgaWYgbmV4dExvYyA+IGxvYzoNCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgKz0gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW5zLCBwcmVsb2MsIG5leHRMb2MNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG92ZXJsYXA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGxvYyA9IHByZXBhcnNlRm4oIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5leHRsb2MgPiBsb2M6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IG5leHRMb2MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgKz0gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBuZXh0TG9jDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBwcmVsb2MrMQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQoNCiAgICBkZWYgdHJhbnNmb3JtU3RyaW5nKCBzZWxmLCBpbnN0cmluZyApOg0KICAgICAgICAiIiINCiAgICAgICAgRXh0ZW5zaW9uIHRvIEN7THtzY2FuU3RyaW5nfX0sIHRvIG1vZGlmeSBtYXRjaGluZyB0ZXh0IHdpdGggbW9kaWZpZWQgdG9rZW5zIHRoYXQgbWF5DQogICAgICAgIGJlIHJldHVybmVkIGZyb20gYSBwYXJzZSBhY3Rpb24uICBUbyB1c2UgQ3t0cmFuc2Zvcm1TdHJpbmd9LCBkZWZpbmUgYSBncmFtbWFyIGFuZA0KICAgICAgICBhdHRhY2ggYSBwYXJzZSBhY3Rpb24gdG8gaXQgdGhhdCBtb2RpZmllcyB0aGUgcmV0dXJuZWQgdG9rZW4gbGlzdC4NCiAgICAgICAgSW52b2tpbmcgQ3t0cmFuc2Zvcm1TdHJpbmcoKX0gb24gYSB0YXJnZXQgc3RyaW5nIHdpbGwgdGhlbiBzY2FuIGZvciBtYXRjaGVzLA0KICAgICAgICBhbmQgcmVwbGFjZSB0aGUgbWF0Y2hlZCB0ZXh0IHBhdHRlcm5zIGFjY29yZGluZyB0byB0aGUgbG9naWMgaW4gdGhlIHBhcnNlDQogICAgICAgIGFjdGlvbi4gIEN7dHJhbnNmb3JtU3RyaW5nKCl9IHJldHVybnMgdGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBzdHJpbmcuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHdkID0gV29yZChhbHBoYXMpDQogICAgICAgICAgICB3ZC5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXS50aXRsZSgpKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmludCh3ZC50cmFuc2Zvcm1TdHJpbmcoIm5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsuIikpDQogICAgICAgIFByaW50czo6DQogICAgICAgICAgICBOb3cgSXMgVGhlIFdpbnRlciBPZiBPdXIgRGlzY29udGVudCBNYWRlIEdsb3Jpb3VzIFN1bW1lciBCeSBUaGlzIFN1biBPZiBZb3JrLg0KICAgICAgICAiIiINCiAgICAgICAgb3V0ID0gW10NCiAgICAgICAgbGFzdEUgPSAwDQogICAgICAgICMgZm9yY2UgcHJlc2VydmF0aW9uIG9mIDxUQUI+cywgdG8gbWluaW1pemUgdW53YW50ZWQgdHJhbnNmb3JtYXRpb24gb2Ygc3RyaW5nLCBhbmQgdG8NCiAgICAgICAgIyBrZWVwIHN0cmluZyBsb2NzIHN0cmFpZ2h0IGJldHdlZW4gdHJhbnNmb3JtU3RyaW5nIGFuZCBzY2FuU3RyaW5nDQogICAgICAgIHNlbGYua2VlcFRhYnMgPSBUcnVlDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoIGluc3RyaW5nICk6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggaW5zdHJpbmdbbGFzdEU6c10gKQ0KICAgICAgICAgICAgICAgIGlmIHQ6DQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodCxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHQuYXNMaXN0KCkNCiAgICAgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHQsbGlzdCk6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdA0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCh0KQ0KICAgICAgICAgICAgICAgIGxhc3RFID0gZQ0KICAgICAgICAgICAgb3V0LmFwcGVuZChpbnN0cmluZ1tsYXN0RTpdKQ0KICAgICAgICAgICAgb3V0ID0gW28gZm9yIG8gaW4gb3V0IGlmIG9dDQogICAgICAgICAgICByZXR1cm4gIiIuam9pbihtYXAoX3VzdHIsX2ZsYXR0ZW4ob3V0KSkpDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiBzZWFyY2hTdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBtYXhNYXRjaGVzPV9NQVhfSU5UICk6DQogICAgICAgICIiIg0KICAgICAgICBBbm90aGVyIGV4dGVuc2lvbiB0byBDe0x7c2NhblN0cmluZ319LCBzaW1wbGlmeWluZyB0aGUgYWNjZXNzIHRvIHRoZSB0b2tlbnMgZm91bmQNCiAgICAgICAgdG8gbWF0Y2ggdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwNCiAgICAgICAgQ3ttYXhNYXRjaGVzfSBhcmd1bWVudCwgdG8gY2xpcCBzZWFyY2hpbmcgYWZ0ZXIgJ24nIG1hdGNoZXMgYXJlIGZvdW5kLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIGEgY2FwaXRhbGl6ZWQgd29yZCBzdGFydHMgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyLCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgbG93ZXJjYXNlIGxldHRlcnMNCiAgICAgICAgICAgIGNhcF93b3JkID0gV29yZChhbHBoYXMudXBwZXIoKSwgYWxwaGFzLmxvd2VyKCkpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KGNhcF93b3JkLnNlYXJjaFN0cmluZygiTW9yZSB0aGFuIElyb24sIG1vcmUgdGhhbiBMZWFkLCBtb3JlIHRoYW4gR29sZCBJIG5lZWQgRWxlY3RyaWNpdHkiKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnTW9yZScsICdJcm9uJywgJ0xlYWQnLCAnR29sZCcsICdJJ10NCiAgICAgICAgIiIiDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB0IGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoIGluc3RyaW5nLCBtYXhNYXRjaGVzICkgXSkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIHNwbGl0KHNlbGYsIGluc3RyaW5nLCBtYXhzcGxpdD1fTUFYX0lOVCwgaW5jbHVkZVNlcGFyYXRvcnM9RmFsc2UpOg0KICAgICAgICAiIiINCiAgICAgICAgR2VuZXJhdG9yIG1ldGhvZCB0byBzcGxpdCBhIHN0cmluZyB1c2luZyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhcyBhIHNlcGFyYXRvci4NCiAgICAgICAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsIEN7bWF4c3BsaXR9IGFyZ3VtZW50LCB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIHNwbGl0czsNCiAgICAgICAgYW5kIHRoZSBvcHRpb25hbCBDe2luY2x1ZGVTZXBhcmF0b3JzfSBhcmd1bWVudCAoZGVmYXVsdD1De0ZhbHNlfSksIGlmIHRoZSBzZXBhcmF0aW5nDQogICAgICAgIG1hdGNoaW5nIHRleHQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBzcGxpdCByZXN1bHRzLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6ICAgICAgICANCiAgICAgICAgICAgIHB1bmMgPSBvbmVPZihsaXN0KCIuLDs6Ly0hPyIpKQ0KICAgICAgICAgICAgcHJpbnQobGlzdChwdW5jLnNwbGl0KCJUaGlzLCB0aGlzPywgdGhpcyBzZW50ZW5jZSwgaXMgYmFkbHkgcHVuY3R1YXRlZCEiKSkpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbJ1RoaXMnLCAnIHRoaXMnLCAnJywgJyB0aGlzIHNlbnRlbmNlJywgJyBpcyBiYWRseSBwdW5jdHVhdGVkJywgJyddDQogICAgICAgICIiIg0KICAgICAgICBzcGxpdHMgPSAwDQogICAgICAgIGxhc3QgPSAwDQogICAgICAgIGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoaW5zdHJpbmcsIG1heE1hdGNoZXM9bWF4c3BsaXQpOg0KICAgICAgICAgICAgeWllbGQgaW5zdHJpbmdbbGFzdDpzXQ0KICAgICAgICAgICAgaWYgaW5jbHVkZVNlcGFyYXRvcnM6DQogICAgICAgICAgICAgICAgeWllbGQgdFswXQ0KICAgICAgICAgICAgbGFzdCA9IGUNCiAgICAgICAgeWllbGQgaW5zdHJpbmdbbGFzdDpdDQoNCiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKyBvcGVyYXRvciAtIHJldHVybnMgQ3tMe0FuZH19LiBBZGRpbmcgc3RyaW5ncyB0byBhIFBhcnNlckVsZW1lbnQNCiAgICAgICAgY29udmVydHMgdGhlbSB0byBMe0xpdGVyYWx9cyBieSBkZWZhdWx0Lg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBncmVldCA9IFdvcmQoYWxwaGFzKSArICIsIiArIFdvcmQoYWxwaGFzKSArICIhIg0KICAgICAgICAgICAgaGVsbG8gPSAiSGVsbG8sIFdvcmxkISINCiAgICAgICAgICAgIHByaW50IChoZWxsbywgIi0+IiwgZ3JlZXQucGFyc2VTdHJpbmcoaGVsbG8pKQ0KICAgICAgICBQcmludHM6Og0KICAgICAgICAgICAgSGVsbG8sIFdvcmxkISAtPiBbJ0hlbGxvJywgJywnLCAnV29ybGQnLCAnISddDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gQW5kKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiArIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciArIHNlbGYNCg0KICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIC0gb3BlcmF0b3IsIHJldHVybnMgQ3tMe0FuZH19IHdpdGggZXJyb3Igc3RvcA0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIEFuZCggWyBzZWxmLCBBbmQuX0Vycm9yU3RvcCgpLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3JzdWJfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgLSBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgLSBzZWxmDQoNCiAgICBkZWYgX19tdWxfXyhzZWxmLG90aGVyKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICogb3BlcmF0b3IsIGFsbG93cyB1c2Ugb2YgQ3tleHByICogM30gaW4gcGxhY2Ugb2YNCiAgICAgICAgQ3tleHByICsgZXhwciArIGV4cHJ9LiAgRXhwcmVzc2lvbnMgbWF5IGFsc28gbWUgbXVsdGlwbGllZCBieSBhIDItaW50ZWdlcg0KICAgICAgICB0dXBsZSwgc2ltaWxhciB0byBDe3ttaW4sbWF4fX0gbXVsdGlwbGllcnMgaW4gcmVndWxhciBleHByZXNzaW9ucy4gIFR1cGxlcw0KICAgICAgICBtYXkgYWxzbyBpbmNsdWRlIEN7Tm9uZX0gYXMgaW46DQogICAgICAgICAtIEN7ZXhwcioobixOb25lKX0gb3IgQ3tleHByKihuLCl9IGlzIGVxdWl2YWxlbnQNCiAgICAgICAgICAgICAgdG8gQ3tleHByKm4gKyBMe1plcm9Pck1vcmV9KGV4cHIpfQ0KICAgICAgICAgICAgICAocmVhZCBhcyAiYXQgbGVhc3QgbiBpbnN0YW5jZXMgb2YgQ3tleHByfSIpDQogICAgICAgICAtIEN7ZXhwciooTm9uZSxuKX0gaXMgZXF1aXZhbGVudCB0byBDe2V4cHIqKDAsbil9DQogICAgICAgICAgICAgIChyZWFkIGFzICIwIHRvIG4gaW5zdGFuY2VzIG9mIEN7ZXhwcn0iKQ0KICAgICAgICAgLSBDe2V4cHIqKE5vbmUsTm9uZSl9IGlzIGVxdWl2YWxlbnQgdG8gQ3tMe1plcm9Pck1vcmV9KGV4cHIpfQ0KICAgICAgICAgLSBDe2V4cHIqKDEsTm9uZSl9IGlzIGVxdWl2YWxlbnQgdG8gQ3tMe09uZU9yTW9yZX0oZXhwcil9DQoNCiAgICAgICAgTm90ZSB0aGF0IEN7ZXhwciooTm9uZSxuKX0gZG9lcyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uIGlmDQogICAgICAgIG1vcmUgdGhhbiBuIGV4cHJzIGV4aXN0IGluIHRoZSBpbnB1dCBzdHJlYW07IHRoYXQgaXMsDQogICAgICAgIEN7ZXhwciooTm9uZSxuKX0gZG9lcyBub3QgZW5mb3JjZSBhIG1heGltdW0gbnVtYmVyIG9mIGV4cHINCiAgICAgICAgb2NjdXJyZW5jZXMuICBJZiB0aGlzIGJlaGF2aW9yIGlzIGRlc2lyZWQsIHRoZW4gd3JpdGUNCiAgICAgICAgQ3tleHByKihOb25lLG4pICsgfmV4cHJ9DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLGludCk6DQogICAgICAgICAgICBtaW5FbGVtZW50cywgb3B0RWxlbWVudHMgPSBvdGhlciwwDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlcix0dXBsZSk6DQogICAgICAgICAgICBvdGhlciA9IChvdGhlciArIChOb25lLCBOb25lKSlbOjJdDQogICAgICAgICAgICBpZiBvdGhlclswXSBpcyBOb25lOg0KICAgICAgICAgICAgICAgIG90aGVyID0gKDAsIG90aGVyWzFdKQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlclswXSxpbnQpIGFuZCBvdGhlclsxXSBpcyBOb25lOg0KICAgICAgICAgICAgICAgIGlmIG90aGVyWzBdID09IDA6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBaZXJvT3JNb3JlKHNlbGYpDQogICAgICAgICAgICAgICAgaWYgb3RoZXJbMF0gPT0gMToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9uZU9yTW9yZShzZWxmKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmKm90aGVyWzBdICsgWmVyb09yTW9yZShzZWxmKQ0KICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyWzBdLGludCkgYW5kIGlzaW5zdGFuY2Uob3RoZXJbMV0saW50KToNCiAgICAgICAgICAgICAgICBtaW5FbGVtZW50cywgb3B0RWxlbWVudHMgPSBvdGhlcg0KICAgICAgICAgICAgICAgIG9wdEVsZW1lbnRzIC09IG1pbkVsZW1lbnRzDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2Fubm90IG11bHRpcGx5ICdQYXJzZXJFbGVtZW50JyBhbmQgKCclcycsJyVzJykgb2JqZWN0cyIsIHR5cGUob3RoZXJbMF0pLHR5cGUob3RoZXJbMV0pKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgJ1BhcnNlckVsZW1lbnQnIGFuZCAnJXMnIG9iamVjdHMiLCB0eXBlKG90aGVyKSkNCg0KICAgICAgICBpZiBtaW5FbGVtZW50cyA8IDA6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgUGFyc2VyRWxlbWVudCBieSBuZWdhdGl2ZSB2YWx1ZSIpDQogICAgICAgIGlmIG9wdEVsZW1lbnRzIDwgMDoNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInNlY29uZCB0dXBsZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gZmlyc3QgdHVwbGUgdmFsdWUiKQ0KICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSBvcHRFbGVtZW50cyA9PSAwOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IG11bHRpcGx5IFBhcnNlckVsZW1lbnQgYnkgMCBvciAoMCwwKSIpDQoNCiAgICAgICAgaWYgKG9wdEVsZW1lbnRzKToNCiAgICAgICAgICAgIGRlZiBtYWtlT3B0aW9uYWxMaXN0KG4pOg0KICAgICAgICAgICAgICAgIGlmIG4+MToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsKHNlbGYgKyBtYWtlT3B0aW9uYWxMaXN0KG4tMSkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsKHNlbGYpDQogICAgICAgICAgICBpZiBtaW5FbGVtZW50czoNCiAgICAgICAgICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSAxOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSBzZWxmICsgbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSBBbmQoW3NlbGZdKm1pbkVsZW1lbnRzKSArIG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldCA9IG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSAxOg0KICAgICAgICAgICAgICAgIHJldCA9IHNlbGYNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0ID0gQW5kKFtzZWxmXSptaW5FbGVtZW50cykNCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIF9fcm11bF9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgcmV0dXJuIHNlbGYuX19tdWxfXyhvdGhlcikNCg0KICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHwgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtNYXRjaEZpcnN0fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBNYXRjaEZpcnN0KCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcm9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHwgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyIHwgc2VsZg0KDQogICAgZGVmIF9feG9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIF4gb3BlcmF0b3IgLSByZXR1cm5zIEN7THtPcn19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gT3IoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yeG9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIF4gb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyIF4gc2VsZg0KDQogICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICYgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtFYWNofX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBFYWNoKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcmFuZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAmIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciAmIHNlbGYNCg0KICAgIGRlZiBfX2ludmVydF9fKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB+IG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7Tm90QW55fX0NCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBOb3RBbnkoIHNlbGYgKQ0KDQogICAgZGVmIF9fY2FsbF9fKHNlbGYsIG5hbWU9Tm9uZSk6DQogICAgICAgICIiIg0KICAgICAgICBTaG9ydGN1dCBmb3IgQ3tMe3NldFJlc3VsdHNOYW1lfX0sIHdpdGggQ3tsaXN0QWxsTWF0Y2hlcz1GYWxzZX0uDQogICAgICAgIA0KICAgICAgICBJZiBDe25hbWV9IGlzIGdpdmVuIHdpdGggYSB0cmFpbGluZyBDeycqJ30gY2hhcmFjdGVyLCB0aGVuIEN7bGlzdEFsbE1hdGNoZXN9IHdpbGwgYmUNCiAgICAgICAgcGFzc2VkIGFzIEN7VHJ1ZX0uDQogICAgICAgICAgIA0KICAgICAgICBJZiBDe25hbWV9IGlzIG9taXR0ZWQsIHNhbWUgYXMgY2FsbGluZyBDe0x7Y29weX19Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyB0aGVzZSBhcmUgZXF1aXZhbGVudA0KICAgICAgICAgICAgdXNlcmRhdGEgPSBXb3JkKGFscGhhcykuc2V0UmVzdWx0c05hbWUoIm5hbWUiKSArIFdvcmQobnVtcysiLSIpLnNldFJlc3VsdHNOYW1lKCJzb2NzZWNubyIpDQogICAgICAgICAgICB1c2VyZGF0YSA9IFdvcmQoYWxwaGFzKSgibmFtZSIpICsgV29yZChudW1zKyItIikoInNvY3NlY25vIikgICAgICAgICAgICAgDQogICAgICAgICIiIg0KICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2V0UmVzdWx0c05hbWUobmFtZSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvcHkoKQ0KDQogICAgZGVmIHN1cHByZXNzKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBTdXBwcmVzc2VzIHRoZSBvdXRwdXQgb2YgdGhpcyBDe1BhcnNlckVsZW1lbnR9OyB1c2VmdWwgdG8ga2VlcCBwdW5jdHVhdGlvbiBmcm9tDQogICAgICAgIGNsdXR0ZXJpbmcgdXAgcmV0dXJuZWQgb3V0cHV0Lg0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIFN1cHByZXNzKCBzZWxmICkNCg0KICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIERpc2FibGVzIHRoZSBza2lwcGluZyBvZiB3aGl0ZXNwYWNlIGJlZm9yZSBtYXRjaGluZyB0aGUgY2hhcmFjdGVycyBpbiB0aGUNCiAgICAgICAgQ3tQYXJzZXJFbGVtZW50fSdzIGRlZmluZWQgcGF0dGVybi4gIFRoaXMgaXMgbm9ybWFsbHkgb25seSB1c2VkIGludGVybmFsbHkgYnkNCiAgICAgICAgdGhlIHB5cGFyc2luZyBtb2R1bGUsIGJ1dCBtYXkgYmUgbmVlZGVkIGluIHNvbWUgd2hpdGVzcGFjZS1zZW5zaXRpdmUgZ3JhbW1hcnMuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYsIGNoYXJzICk6DQogICAgICAgICIiIg0KICAgICAgICBPdmVycmlkZXMgdGhlIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycw0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUNCiAgICAgICAgc2VsZi53aGl0ZUNoYXJzID0gY2hhcnMNCiAgICAgICAgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnMgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHBhcnNlV2l0aFRhYnMoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIE92ZXJyaWRlcyBkZWZhdWx0IGJlaGF2aW9yIHRvIGV4cGFuZCBDezxUQUI+fXMgdG8gc3BhY2VzIGJlZm9yZSBwYXJzaW5nIHRoZSBpbnB1dCBzdHJpbmcuDQogICAgICAgIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBDe3BhcnNlU3RyaW5nfSB3aGVuIHRoZSBpbnB1dCBncmFtbWFyIGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQNCiAgICAgICAgbWF0Y2ggQ3s8VEFCPn0gY2hhcmFjdGVycy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYua2VlcFRhYnMgPSBUcnVlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIGV4cHJlc3Npb24gdG8gYmUgaWdub3JlZCAoZS5nLiwgY29tbWVudHMpIHdoaWxlIGRvaW5nIHBhdHRlcm4NCiAgICAgICAgbWF0Y2hpbmc7IG1heSBiZSBjYWxsZWQgcmVwZWF0ZWRseSwgdG8gZGVmaW5lIG11bHRpcGxlIGNvbW1lbnQgb3Igb3RoZXINCiAgICAgICAgaWdub3JhYmxlIHBhdHRlcm5zLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCiAgICAgICAgICAgIHBhdHQucGFyc2VTdHJpbmcoJ2FibGFqIC8qIGNvbW1lbnQgKi8gbHNramQnKSAjIC0+IFsnYWJsYWonXQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwYXR0Lmlnbm9yZShjU3R5bGVDb21tZW50KQ0KICAgICAgICAgICAgcGF0dC5wYXJzZVN0cmluZygnYWJsYWogLyogY29tbWVudCAqLyBsc2tqZCcpICMgLT4gWydhYmxhaicsICdsc2tqZCddDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIG90aGVyID0gU3VwcHJlc3Mob3RoZXIpDQoNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6DQogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmFwcGVuZChvdGhlcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuYXBwZW5kKCBTdXBwcmVzcyggb3RoZXIuY29weSgpICkgKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldERlYnVnQWN0aW9ucyggc2VsZiwgc3RhcnRBY3Rpb24sIHN1Y2Nlc3NBY3Rpb24sIGV4Y2VwdGlvbkFjdGlvbiApOg0KICAgICAgICAiIiINCiAgICAgICAgRW5hYmxlIGRpc3BsYXkgb2YgZGVidWdnaW5nIG1lc3NhZ2VzIHdoaWxlIGRvaW5nIHBhdHRlcm4gbWF0Y2hpbmcuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLmRlYnVnQWN0aW9ucyA9IChzdGFydEFjdGlvbiBvciBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NBY3Rpb24gb3IgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkFjdGlvbiBvciBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uKQ0KICAgICAgICBzZWxmLmRlYnVnID0gVHJ1ZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldERlYnVnKCBzZWxmLCBmbGFnPVRydWUgKToNCiAgICAgICAgIiIiDQogICAgICAgIEVuYWJsZSBkaXNwbGF5IG9mIGRlYnVnZ2luZyBtZXNzYWdlcyB3aGlsZSBkb2luZyBwYXR0ZXJuIG1hdGNoaW5nLg0KICAgICAgICBTZXQgQ3tmbGFnfSB0byBUcnVlIHRvIGVuYWJsZSwgRmFsc2UgdG8gZGlzYWJsZS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHdkID0gV29yZChhbHBoYXMpLnNldE5hbWUoImFscGhhd29yZCIpDQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXROYW1lKCJudW13b3JkIikNCiAgICAgICAgICAgIHRlcm0gPSB3ZCB8IGludGVnZXINCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyB0dXJuIG9uIGRlYnVnZ2luZyBmb3Igd2QNCiAgICAgICAgICAgIHdkLnNldERlYnVnKCkNCg0KICAgICAgICAgICAgT25lT3JNb3JlKHRlcm0pLnBhcnNlU3RyaW5nKCJhYmMgMTIzIHh5eiA4OTAiKQ0KICAgICAgICANCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMCgxLDEpDQogICAgICAgICAgICBNYXRjaGVkIGFscGhhd29yZCAtPiBbJ2FiYyddDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDMoMSw0KQ0KICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgNCksIChsaW5lOjEsIGNvbDo1KQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyA3KDEsOCkNCiAgICAgICAgICAgIE1hdGNoZWQgYWxwaGF3b3JkIC0+IFsneHl6J10NCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMTEoMSwxMikNCiAgICAgICAgICAgIEV4Y2VwdGlvbiByYWlzZWQ6RXhwZWN0ZWQgYWxwaGF3b3JkIChhdCBjaGFyIDEyKSwgKGxpbmU6MSwgY29sOjEzKQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAxNSgxLDE2KQ0KICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgMTUpLCAobGluZToxLCBjb2w6MTYpDQoNCiAgICAgICAgVGhlIG91dHB1dCBzaG93biBpcyB0aGF0IHByb2R1Y2VkIGJ5IHRoZSBkZWZhdWx0IGRlYnVnIGFjdGlvbnMgLSBjdXN0b20gZGVidWcgYWN0aW9ucyBjYW4gYmUNCiAgICAgICAgc3BlY2lmaWVkIHVzaW5nIEx7c2V0RGVidWdBY3Rpb25zfS4gUHJpb3IgdG8gYXR0ZW1wdGluZw0KICAgICAgICB0byBtYXRjaCB0aGUgQ3t3ZH0gZXhwcmVzc2lvbiwgdGhlIGRlYnVnZ2luZyBtZXNzYWdlIEN7Ik1hdGNoIDxleHBybmFtZT4gYXQgbG9jIDxuPig8bGluZT4sPGNvbD4pIn0NCiAgICAgICAgaXMgc2hvd24uIFRoZW4gaWYgdGhlIHBhcnNlIHN1Y2NlZWRzLCBhIEN7Ik1hdGNoZWQifSBtZXNzYWdlIGlzIHNob3duLCBvciBhbiBDeyJFeGNlcHRpb24gcmFpc2VkIn0NCiAgICAgICAgbWVzc2FnZSBpcyBzaG93bi4gQWxzbyBub3RlIHRoZSB1c2Ugb2YgTHtzZXROYW1lfSB0byBhc3NpZ24gYSBodW1hbi1yZWFkYWJsZSBuYW1lIHRvIHRoZSBleHByZXNzaW9uLA0KICAgICAgICB3aGljaCBtYWtlcyBkZWJ1Z2dpbmcgYW5kIGV4Y2VwdGlvbiBtZXNzYWdlcyBlYXNpZXIgdG8gdW5kZXJzdGFuZCAtIGZvciBpbnN0YW5jZSwgdGhlIGRlZmF1bHQNCiAgICAgICAgbmFtZSBjcmVhdGVkIGZvciB0aGUgQ3tXb3JkfSBleHByZXNzaW9uIHdpdGhvdXQgY2FsbGluZyBDe3NldE5hbWV9IGlzIEN7Ilc6KEFCQ0QuLi4pIn0uDQogICAgICAgICIiIg0KICAgICAgICBpZiBmbGFnOg0KICAgICAgICAgICAgc2VsZi5zZXREZWJ1Z0FjdGlvbnMoIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiwgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24sIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24gKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5kZWJ1ZyA9IEZhbHNlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIF91c3RyKHNlbGYpDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gVHJ1ZQ0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgcGFzcw0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgICIiIg0KICAgICAgICBDaGVjayBkZWZpbmVkIGV4cHJlc3Npb25zIGZvciB2YWxpZCBzdHJ1Y3R1cmUsIGNoZWNrIGZvciBpbmZpbml0ZSByZWN1cnNpdmUgZGVmaW5pdGlvbnMuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKCBbXSApDQoNCiAgICBkZWYgcGFyc2VGaWxlKCBzZWxmLCBmaWxlX29yX2ZpbGVuYW1lLCBwYXJzZUFsbD1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiBvbiB0aGUgZ2l2ZW4gZmlsZSBvciBmaWxlbmFtZS4NCiAgICAgICAgSWYgYSBmaWxlbmFtZSBpcyBzcGVjaWZpZWQgKGluc3RlYWQgb2YgYSBmaWxlIG9iamVjdCksDQogICAgICAgIHRoZSBlbnRpcmUgZmlsZSBpcyBvcGVuZWQsIHJlYWQsIGFuZCBjbG9zZWQgYmVmb3JlIHBhcnNpbmcuDQogICAgICAgICIiIg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZmlsZV9vcl9maWxlbmFtZS5yZWFkKCkNCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVfb3JfZmlsZW5hbWUsICJyIikgYXMgZjoNCiAgICAgICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZi5yZWFkKCkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VTdHJpbmcoZmlsZV9jb250ZW50cywgcGFyc2VBbGwpDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiBfX2VxX18oc2VsZixvdGhlcik6DQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFBhcnNlckVsZW1lbnQpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYgaXMgb3RoZXIgb3IgdmFycyhzZWxmKSA9PSB2YXJzKG90aGVyKQ0KICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubWF0Y2hlcyhvdGhlcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZXJFbGVtZW50LHNlbGYpPT1vdGhlcg0KDQogICAgZGVmIF9fbmVfXyhzZWxmLG90aGVyKToNCiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikNCg0KICAgIGRlZiBfX2hhc2hfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIGhhc2goaWQoc2VsZikpDQoNCiAgICBkZWYgX19yZXFfXyhzZWxmLG90aGVyKToNCiAgICAgICAgcmV0dXJuIHNlbGYgPT0gb3RoZXINCg0KICAgIGRlZiBfX3JuZV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQ0KDQogICAgZGVmIG1hdGNoZXMoc2VsZiwgdGVzdFN0cmluZywgcGFyc2VBbGw9VHJ1ZSk6DQogICAgICAgICIiIg0KICAgICAgICBNZXRob2QgZm9yIHF1aWNrIHRlc3Rpbmcgb2YgYSBwYXJzZXIgYWdhaW5zdCBhIHRlc3Qgc3RyaW5nLiBHb29kIGZvciBzaW1wbGUgDQogICAgICAgIGlubGluZSBtaWNyb3Rlc3RzIG9mIHN1YiBleHByZXNzaW9ucyB3aGlsZSBidWlsZGluZyB1cCBsYXJnZXIgcGFyc2VyLg0KICAgICAgICAgICANCiAgICAgICAgUGFyYW1ldGVyczoNCiAgICAgICAgIC0gdGVzdFN0cmluZyAtIHRvIHRlc3QgYWdhaW5zdCB0aGlzIGV4cHJlc3Npb24gZm9yIGEgbWF0Y2gNCiAgICAgICAgIC0gcGFyc2VBbGwgLSAoZGVmYXVsdD1De1RydWV9KSAtIGZsYWcgdG8gcGFzcyB0byBDe0x7cGFyc2VTdHJpbmd9fSB3aGVuIHJ1bm5pbmcgdGVzdHMNCiAgICAgICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGV4cHIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBhc3NlcnQgZXhwci5tYXRjaGVzKCIxMDAiKQ0KICAgICAgICAiIiINCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5wYXJzZVN0cmluZyhfdXN0cih0ZXN0U3RyaW5nKSwgcGFyc2VBbGw9cGFyc2VBbGwpDQogICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQogICAgICAgICAgICAgICAgDQogICAgZGVmIHJ1blRlc3RzKHNlbGYsIHRlc3RzLCBwYXJzZUFsbD1UcnVlLCBjb21tZW50PScjJywgZnVsbER1bXA9VHJ1ZSwgcHJpbnRSZXN1bHRzPVRydWUsIGZhaWx1cmVUZXN0cz1GYWxzZSk6DQogICAgICAgICIiIg0KICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIG9uIGEgc2VyaWVzIG9mIHRlc3Qgc3RyaW5ncywgc2hvd2luZyBlYWNoDQogICAgICAgIHRlc3QsIHRoZSBwYXJzZWQgcmVzdWx0cyBvciB3aGVyZSB0aGUgcGFyc2UgZmFpbGVkLiBRdWljayBhbmQgZWFzeSB3YXkgdG8NCiAgICAgICAgcnVuIGEgcGFyc2UgZXhwcmVzc2lvbiBhZ2FpbnN0IGEgbGlzdCBvZiBzYW1wbGUgc3RyaW5ncy4NCiAgICAgICAgICAgDQogICAgICAgIFBhcmFtZXRlcnM6DQogICAgICAgICAtIHRlc3RzIC0gYSBsaXN0IG9mIHNlcGFyYXRlIHRlc3Qgc3RyaW5ncywgb3IgYSBtdWx0aWxpbmUgc3RyaW5nIG9mIHRlc3Qgc3RyaW5ncw0KICAgICAgICAgLSBwYXJzZUFsbCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZmxhZyB0byBwYXNzIHRvIEN7THtwYXJzZVN0cmluZ319IHdoZW4gcnVubmluZyB0ZXN0cyAgICAgICAgICAgDQogICAgICAgICAtIGNvbW1lbnQgLSAoZGVmYXVsdD1DeycjJ30pIC0gZXhwcmVzc2lvbiBmb3IgaW5kaWNhdGluZyBlbWJlZGRlZCBjb21tZW50cyBpbiB0aGUgdGVzdCANCiAgICAgICAgICAgICAgc3RyaW5nOyBwYXNzIE5vbmUgdG8gZGlzYWJsZSBjb21tZW50IGZpbHRlcmluZw0KICAgICAgICAgLSBmdWxsRHVtcCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZHVtcCByZXN1bHRzIGFzIGxpc3QgZm9sbG93ZWQgYnkgcmVzdWx0cyBuYW1lcyBpbiBuZXN0ZWQgb3V0bGluZTsNCiAgICAgICAgICAgICAgaWYgRmFsc2UsIG9ubHkgZHVtcCBuZXN0ZWQgbGlzdA0KICAgICAgICAgLSBwcmludFJlc3VsdHMgLSAoZGVmYXVsdD1De1RydWV9KSBwcmludHMgdGVzdCBvdXRwdXQgdG8gc3Rkb3V0DQogICAgICAgICAtIGZhaWx1cmVUZXN0cyAtIChkZWZhdWx0PUN7RmFsc2V9KSBpbmRpY2F0ZXMgaWYgdGhlc2UgdGVzdHMgYXJlIGV4cGVjdGVkIHRvIGZhaWwgcGFyc2luZw0KDQogICAgICAgIFJldHVybnM6IGEgKHN1Y2Nlc3MsIHJlc3VsdHMpIHR1cGxlLCB3aGVyZSBzdWNjZXNzIGluZGljYXRlcyB0aGF0IGFsbCB0ZXN0cyBzdWNjZWVkZWQNCiAgICAgICAgKG9yIGZhaWxlZCBpZiBDe2ZhaWx1cmVUZXN0c30gaXMgVHJ1ZSksIGFuZCB0aGUgcmVzdWx0cyBjb250YWluIGEgbGlzdCBvZiBsaW5lcyBvZiBlYWNoIA0KICAgICAgICB0ZXN0J3Mgb3V0cHV0DQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIG51bWJlcl9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIuY29weSgpDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IG51bWJlcl9leHByLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgICAgICMgdW5zaWduZWQgaW50ZWdlcg0KICAgICAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgICAgICMgbmVnYXRpdmUgaW50ZWdlcg0KICAgICAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgICAgICAjIGZsb2F0IHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgICAgICAjIGludGVnZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgICAgICAnJycpDQogICAgICAgICAgICBwcmludCgiU3VjY2VzcyIgaWYgcmVzdWx0WzBdIGVsc2UgIkZhaWxlZCEiKQ0KDQogICAgICAgICAgICByZXN1bHQgPSBudW1iZXJfZXhwci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICAgICAjIHN0cmF5IGNoYXJhY3Rlcg0KICAgICAgICAgICAgICAgIDEwMFoNCiAgICAgICAgICAgICAgICAjIG1pc3NpbmcgbGVhZGluZyBkaWdpdCBiZWZvcmUgJy4nDQogICAgICAgICAgICAgICAgLS4xMDANCiAgICAgICAgICAgICAgICAjIHRvbyBtYW55ICcuJw0KICAgICAgICAgICAgICAgIDMuMTQuMTU5DQogICAgICAgICAgICAgICAgJycnLCBmYWlsdXJlVGVzdHM9VHJ1ZSkNCiAgICAgICAgICAgIHByaW50KCJTdWNjZXNzIiBpZiByZXN1bHRbMF0gZWxzZSAiRmFpbGVkISIpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICAjIHVuc2lnbmVkIGludGVnZXINCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgWzEwMF0NCg0KICAgICAgICAgICAgIyBuZWdhdGl2ZSBpbnRlZ2VyDQogICAgICAgICAgICAtMTAwDQogICAgICAgICAgICBbLTEwMF0NCg0KICAgICAgICAgICAgIyBmbG9hdCB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24NCiAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgIFs2LjAyZSsyM10NCg0KICAgICAgICAgICAgIyBpbnRlZ2VyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgIFsxZS0xMl0NCg0KICAgICAgICAgICAgU3VjY2Vzcw0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIHN0cmF5IGNoYXJhY3Rlcg0KICAgICAgICAgICAgMTAwWg0KICAgICAgICAgICAgICAgXg0KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgMyksIChsaW5lOjEsIGNvbDo0KQ0KDQogICAgICAgICAgICAjIG1pc3NpbmcgbGVhZGluZyBkaWdpdCBiZWZvcmUgJy4nDQogICAgICAgICAgICAtLjEwMA0KICAgICAgICAgICAgXg0KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQge3JlYWwgbnVtYmVyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbiB8IHJlYWwgbnVtYmVyIHwgc2lnbmVkIGludGVnZXJ9IChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCg0KICAgICAgICAgICAgIyB0b28gbWFueSAnLicNCiAgICAgICAgICAgIDMuMTQuMTU5DQogICAgICAgICAgICAgICAgXg0KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgNCksIChsaW5lOjEsIGNvbDo1KQ0KDQogICAgICAgICAgICBTdWNjZXNzDQoNCiAgICAgICAgRWFjaCB0ZXN0IHN0cmluZyBtdXN0IGJlIG9uIGEgc2luZ2xlIGxpbmUuIElmIHlvdSB3YW50IHRvIHRlc3QgYSBzdHJpbmcgdGhhdCBzcGFucyBtdWx0aXBsZQ0KICAgICAgICBsaW5lcywgY3JlYXRlIGEgdGVzdCBsaWtlIHRoaXM6Og0KDQogICAgICAgICAgICBleHByLnJ1blRlc3QociJ0aGlzIGlzIGEgdGVzdFxcbiBvZiBzdHJpbmdzIHRoYXQgc3BhbnMgXFxuIDMgbGluZXMiKQ0KICAgICAgICANCiAgICAgICAgKE5vdGUgdGhhdCB0aGlzIGlzIGEgcmF3IHN0cmluZyBsaXRlcmFsLCB5b3UgbXVzdCBpbmNsdWRlIHRoZSBsZWFkaW5nICdyJy4pDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKHRlc3RzLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIHRlc3RzID0gbGlzdChtYXAoc3RyLnN0cmlwLCB0ZXN0cy5yc3RyaXAoKS5zcGxpdGxpbmVzKCkpKQ0KICAgICAgICBpZiBpc2luc3RhbmNlKGNvbW1lbnQsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgY29tbWVudCA9IExpdGVyYWwoY29tbWVudCkNCiAgICAgICAgYWxsUmVzdWx0cyA9IFtdDQogICAgICAgIGNvbW1lbnRzID0gW10NCiAgICAgICAgc3VjY2VzcyA9IFRydWUNCiAgICAgICAgZm9yIHQgaW4gdGVzdHM6DQogICAgICAgICAgICBpZiBjb21tZW50IGlzIG5vdCBOb25lIGFuZCBjb21tZW50Lm1hdGNoZXModCwgRmFsc2UpIG9yIGNvbW1lbnRzIGFuZCBub3QgdDoNCiAgICAgICAgICAgICAgICBjb21tZW50cy5hcHBlbmQodCkNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgaWYgbm90IHQ6DQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIG91dCA9IFsnXG4nLmpvaW4oY29tbWVudHMpLCB0XQ0KICAgICAgICAgICAgY29tbWVudHMgPSBbXQ0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHQgPSB0LnJlcGxhY2UocidcbicsJ1xuJykNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLnBhcnNlU3RyaW5nKHQsIHBhcnNlQWxsPXBhcnNlQWxsKQ0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQocmVzdWx0LmR1bXAoZnVsbD1mdWxsRHVtcCkpDQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIG5vdCBmYWlsdXJlVGVzdHMNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6DQogICAgICAgICAgICAgICAgZmF0YWwgPSAiKEZBVEFMKSIgaWYgaXNpbnN0YW5jZShwZSwgUGFyc2VGYXRhbEV4Y2VwdGlvbikgZWxzZSAiIg0KICAgICAgICAgICAgICAgIGlmICdcbicgaW4gdDoNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChsaW5lKHBlLmxvYywgdCkpDQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJyAnKihjb2wocGUubG9jLHQpLTEpICsgJ14nICsgZmF0YWwpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnICcqcGUubG9jICsgJ14nICsgZmF0YWwpDQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiRkFJTDogIiArIHN0cihwZSkpDQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIGZhaWx1cmVUZXN0cw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBlDQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJGQUlMLUVYQ0VQVElPTjogIiArIHN0cihleGMpKQ0KICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBmYWlsdXJlVGVzdHMNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBleGMNCg0KICAgICAgICAgICAgaWYgcHJpbnRSZXN1bHRzOg0KICAgICAgICAgICAgICAgIGlmIGZ1bGxEdW1wOg0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcnKQ0KICAgICAgICAgICAgICAgIHByaW50KCdcbicuam9pbihvdXQpKQ0KDQogICAgICAgICAgICBhbGxSZXN1bHRzLmFwcGVuZCgodCwgcmVzdWx0KSkNCiAgICAgICAgDQogICAgICAgIHJldHVybiBzdWNjZXNzLCBhbGxSZXN1bHRzDQoNCiAgICAgICAgDQpjbGFzcyBUb2tlbihQYXJzZXJFbGVtZW50KToNCiAgICAiIiINCiAgICBBYnN0cmFjdCBDe1BhcnNlckVsZW1lbnR9IHN1YmNsYXNzLCBmb3IgZGVmaW5pbmcgYXRvbWljIG1hdGNoaW5nIHBhdHRlcm5zLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihUb2tlbixzZWxmKS5fX2luaXRfXyggc2F2ZWxpc3Q9RmFsc2UgKQ0KDQoNCmNsYXNzIEVtcHR5KFRva2VuKToNCiAgICAiIiINCiAgICBBbiBlbXB0eSB0b2tlbiwgd2lsbCBhbHdheXMgbWF0Y2guDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKEVtcHR5LHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lID0gIkVtcHR5Ig0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQoNCmNsYXNzIE5vTWF0Y2goVG9rZW4pOg0KICAgICIiIg0KICAgIEEgdG9rZW4gdGhhdCB3aWxsIG5ldmVyIG1hdGNoLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihOb01hdGNoLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lID0gIk5vTWF0Y2giDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYuZXJybXNnID0gIlVubWF0Y2hhYmxlIHRva2VuIg0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCg0KY2xhc3MgTGl0ZXJhbChUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gdG8gZXhhY3RseSBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcuDQogICAgDQogICAgRXhhbXBsZTo6DQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhaCcpICAjIC0+IFsnYmxhaCddDQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhaGZvb2JsYWgnKSAgIyAtPiBbJ2JsYWgnXQ0KICAgICAgICBMaXRlcmFsKCdibGFoJykucGFyc2VTdHJpbmcoJ2JsYScpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgImJsYWgiDQogICAgDQogICAgRm9yIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIHVzZSBMe0Nhc2VsZXNzTGl0ZXJhbH0uDQogICAgDQogICAgRm9yIGtleXdvcmQgbWF0Y2hpbmcgKGZvcmNlIHdvcmQgYnJlYWsgYmVmb3JlIGFuZCBhZnRlciB0aGUgbWF0Y2hlZCBzdHJpbmcpLA0KICAgIHVzZSBMe0tleXdvcmR9IG9yIEx7Q2FzZWxlc3NLZXl3b3JkfS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nICk6DQogICAgICAgIHN1cGVyKExpdGVyYWwsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm1hdGNoID0gbWF0Y2hTdHJpbmcNCiAgICAgICAgc2VsZi5tYXRjaExlbiA9IGxlbihtYXRjaFN0cmluZykNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5maXJzdE1hdGNoQ2hhciA9IG1hdGNoU3RyaW5nWzBdDQogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIExpdGVyYWw7IHVzZSBFbXB0eSgpIGluc3RlYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fID0gRW1wdHkNCiAgICAgICAgc2VsZi5uYW1lID0gJyIlcyInICUgX3VzdHIoc2VsZi5tYXRjaCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCg0KICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB0aGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgYSAqbG90Kg0KICAgICMgaWYgdGhpcyBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgbWF0Y2ggc3RyaW5nICBhbmQgdGhlIGZpcnN0IGNoYXJhY3RlciBtYXRjaGVzLA0KICAgICMgc2hvcnQtY2lyY3VpdCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLCBhbmQgYXZvaWQgY2FsbGluZyBzdGFydHN3aXRoDQogICAgI34gQHByb2ZpbGUNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0TWF0Y2hDaGFyIGFuZA0KICAgICAgICAgICAgKHNlbGYubWF0Y2hMZW49PTEgb3IgaW5zdHJpbmcuc3RhcnRzd2l0aChzZWxmLm1hdGNoLGxvYykpICk6DQogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQpfTCA9IExpdGVyYWwNClBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyA9IExpdGVyYWwNCg0KY2xhc3MgS2V5d29yZChUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gdG8gZXhhY3RseSBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcgYXMgYSBrZXl3b3JkLCB0aGF0IGlzLCBpdCBtdXN0IGJlDQogICAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBub24ta2V5d29yZCBjaGFyYWN0ZXIuICBDb21wYXJlIHdpdGggQ3tMe0xpdGVyYWx9fToNCiAgICAgLSBDe0xpdGVyYWwoImlmIil9IHdpbGwgbWF0Y2ggdGhlIGxlYWRpbmcgQ3snaWYnfSBpbiBDeydpZkFuZE9ubHlJZid9Lg0KICAgICAtIEN7S2V5d29yZCgiaWYiKX0gd2lsbCBub3Q7IGl0IHdpbGwgb25seSBtYXRjaCB0aGUgbGVhZGluZyBDeydpZid9IGluIEN7J2lmIHg9MSd9LCBvciBDeydpZih5PT0yKSd9DQogICAgQWNjZXB0cyB0d28gb3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIGluIGFkZGl0aW9uIHRvIHRoZSBrZXl3b3JkIHN0cmluZzoNCiAgICAgLSBDe2lkZW50Q2hhcnN9IGlzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBiZSB2YWxpZCBpZGVudGlmaWVyIGNoYXJhY3RlcnMsDQogICAgICAgICAgZGVmYXVsdGluZyB0byBhbGwgYWxwaGFudW1lcmljcyArICJfIiBhbmQgIiQiDQogICAgIC0gQ3tjYXNlbGVzc30gYWxsb3dzIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIGRlZmF1bHQgaXMgQ3tGYWxzZX0uDQogICAgICAgDQogICAgRXhhbXBsZTo6DQogICAgICAgIEtleXdvcmQoInN0YXJ0IikucGFyc2VTdHJpbmcoInN0YXJ0IikgICMgLT4gWydzdGFydCddDQogICAgICAgIEtleXdvcmQoInN0YXJ0IikucGFyc2VTdHJpbmcoInN0YXJ0aW5nIikgICMgLT4gRXhjZXB0aW9uDQoNCiAgICBGb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgdXNlIEx7Q2FzZWxlc3NLZXl3b3JkfS4NCiAgICAiIiINCiAgICBERUZBVUxUX0tFWVdPUkRfQ0hBUlMgPSBhbHBoYW51bXMrIl8kIg0KDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZywgaWRlbnRDaGFycz1Ob25lLCBjYXNlbGVzcz1GYWxzZSApOg0KICAgICAgICBzdXBlcihLZXl3b3JkLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgaWYgaWRlbnRDaGFycyBpcyBOb25lOg0KICAgICAgICAgICAgaWRlbnRDaGFycyA9IEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTDQogICAgICAgIHNlbGYubWF0Y2ggPSBtYXRjaFN0cmluZw0KICAgICAgICBzZWxmLm1hdGNoTGVuID0gbGVuKG1hdGNoU3RyaW5nKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLmZpcnN0TWF0Y2hDaGFyID0gbWF0Y2hTdHJpbmdbMF0NCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gS2V5d29yZDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICBzZWxmLm5hbWUgPSAnIiVzIicgJSBzZWxmLm1hdGNoDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYuY2FzZWxlc3MgPSBjYXNlbGVzcw0KICAgICAgICBpZiBjYXNlbGVzczoNCiAgICAgICAgICAgIHNlbGYuY2FzZWxlc3NtYXRjaCA9IG1hdGNoU3RyaW5nLnVwcGVyKCkNCiAgICAgICAgICAgIGlkZW50Q2hhcnMgPSBpZGVudENoYXJzLnVwcGVyKCkNCiAgICAgICAgc2VsZi5pZGVudENoYXJzID0gc2V0KGlkZW50Q2hhcnMpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmNhc2VsZXNzOg0KICAgICAgICAgICAgaWYgKCAoaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5jYXNlbGVzc21hdGNoKSBhbmQNCiAgICAgICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgYW5kDQogICAgICAgICAgICAgICAgIChsb2MgPT0gMCBvciBpbnN0cmluZ1tsb2MtMV0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOg0KICAgICAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdE1hdGNoQ2hhciBhbmQNCiAgICAgICAgICAgICAgICAoc2VsZi5tYXRjaExlbj09MSBvciBpbnN0cmluZy5zdGFydHN3aXRoKHNlbGYubWF0Y2gsbG9jKSkgYW5kDQogICAgICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpIGFuZA0KICAgICAgICAgICAgICAgIChsb2MgPT0gMCBvciBpbnN0cmluZ1tsb2MtMV0gbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICBkZWYgY29weShzZWxmKToNCiAgICAgICAgYyA9IHN1cGVyKEtleXdvcmQsc2VsZikuY29weSgpDQogICAgICAgIGMuaWRlbnRDaGFycyA9IEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTDQogICAgICAgIHJldHVybiBjDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHNldERlZmF1bHRLZXl3b3JkQ2hhcnMoIGNoYXJzICk6DQogICAgICAgICIiIk92ZXJyaWRlcyB0aGUgZGVmYXVsdCBLZXl3b3JkIGNoYXJzDQogICAgICAgICIiIg0KICAgICAgICBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUyA9IGNoYXJzDQoNCmNsYXNzIENhc2VsZXNzTGl0ZXJhbChMaXRlcmFsKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcsIGlnbm9yaW5nIGNhc2Ugb2YgbGV0dGVycy4NCiAgICBOb3RlOiB0aGUgbWF0Y2hlZCByZXN1bHRzIHdpbGwgYWx3YXlzIGJlIGluIHRoZSBjYXNlIG9mIHRoZSBnaXZlbg0KICAgIG1hdGNoIHN0cmluZywgTk9UIHRoZSBjYXNlIG9mIHRoZSBpbnB1dCB0ZXh0Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIE9uZU9yTW9yZShDYXNlbGVzc0xpdGVyYWwoIkNNRCIpKS5wYXJzZVN0cmluZygiY21kIENNRCBDbWQxMCIpICMgLT4gWydDTUQnLCAnQ01EJywgJ0NNRCddDQogICAgICAgIA0KICAgIChDb250cmFzdCB3aXRoIGV4YW1wbGUgZm9yIEx7Q2FzZWxlc3NLZXl3b3JkfS4pDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZyApOg0KICAgICAgICBzdXBlcihDYXNlbGVzc0xpdGVyYWwsc2VsZikuX19pbml0X18oIG1hdGNoU3RyaW5nLnVwcGVyKCkgKQ0KICAgICAgICAjIFByZXNlcnZlIHRoZSBkZWZpbmluZyBsaXRlcmFsLg0KICAgICAgICBzZWxmLnJldHVyblN0cmluZyA9IG1hdGNoU3RyaW5nDQogICAgICAgIHNlbGYubmFtZSA9ICInJXMnIiAlIHNlbGYucmV0dXJuU3RyaW5nDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYubWF0Y2g6DQogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYucmV0dXJuU3RyaW5nDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBDYXNlbGVzc0tleXdvcmQoS2V5d29yZCk6DQogICAgIiIiDQogICAgQ2FzZWxlc3MgdmVyc2lvbiBvZiBMe0tleXdvcmR9Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIE9uZU9yTW9yZShDYXNlbGVzc0tleXdvcmQoIkNNRCIpKS5wYXJzZVN0cmluZygiY21kIENNRCBDbWQxMCIpICMgLT4gWydDTUQnLCAnQ01EJ10NCiAgICAgICAgDQogICAgKENvbnRyYXN0IHdpdGggZXhhbXBsZSBmb3IgTHtDYXNlbGVzc0xpdGVyYWx9LikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzPU5vbmUgKToNCiAgICAgICAgc3VwZXIoQ2FzZWxlc3NLZXl3b3JkLHNlbGYpLl9faW5pdF9fKCBtYXRjaFN0cmluZywgaWRlbnRDaGFycywgY2FzZWxlc3M9VHJ1ZSApDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiAoIChpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLmNhc2VsZXNzbWF0Y2gpIGFuZA0KICAgICAgICAgICAgIChsb2MgPj0gbGVuKGluc3RyaW5nKS1zZWxmLm1hdGNoTGVuIG9yIGluc3RyaW5nW2xvYytzZWxmLm1hdGNoTGVuXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6DQogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIENsb3NlTWF0Y2goVG9rZW4pOg0KICAgICIiIg0KICAgIEEgdmFyaWF0aW9uIG9uIEx7TGl0ZXJhbH0gd2hpY2ggbWF0Y2hlcyAiY2xvc2UiIG1hdGNoZXMsIHRoYXQgaXMsIA0KICAgIHN0cmluZ3Mgd2l0aCBhdCBtb3N0ICduJyBtaXNtYXRjaGluZyBjaGFyYWN0ZXJzLiBDe0Nsb3NlTWF0Y2h9IHRha2VzIHBhcmFtZXRlcnM6DQogICAgIC0gQ3ttYXRjaF9zdHJpbmd9IC0gc3RyaW5nIHRvIGJlIG1hdGNoZWQNCiAgICAgLSBDe21heE1pc21hdGNoZXN9IC0gKEN7ZGVmYXVsdD0xfSkgbWF4aW11bSBudW1iZXIgb2YgbWlzbWF0Y2hlcyBhbGxvd2VkIHRvIGNvdW50IGFzIGEgbWF0Y2gNCiAgICANCiAgICBUaGUgcmVzdWx0cyBmcm9tIGEgc3VjY2Vzc2Z1bCBwYXJzZSB3aWxsIGNvbnRhaW4gdGhlIG1hdGNoZWQgdGV4dCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcgYW5kIHRoZSBmb2xsb3dpbmcgbmFtZWQgcmVzdWx0czoNCiAgICAgLSBDe21pc21hdGNoZXN9IC0gYSBsaXN0IG9mIHRoZSBwb3NpdGlvbnMgd2l0aGluIHRoZSBtYXRjaF9zdHJpbmcgd2hlcmUgbWlzbWF0Y2hlcyB3ZXJlIGZvdW5kDQogICAgIC0gQ3tvcmlnaW5hbH0gLSB0aGUgb3JpZ2luYWwgbWF0Y2hfc3RyaW5nIHVzZWQgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBpbnB1dCBzdHJpbmcNCiAgICANCiAgICBJZiBDe21pc21hdGNoZXN9IGlzIGFuIGVtcHR5IGxpc3QsIHRoZW4gdGhlIG1hdGNoIHdhcyBhbiBleGFjdCBtYXRjaC4NCiAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcGF0dCA9IENsb3NlTWF0Y2goIkFUQ0FUQ0dBQVRHR0EiKQ0KICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBVENHQUFYR0dBIikgIyAtPiAoWydBVENBVENHQUFYR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbOV1dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FYQ0dBQVhHR0EiKSAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgJ0FUQ0FUQ0dBQVRHR0EnICh3aXRoIHVwIHRvIDEgbWlzbWF0Y2hlcykgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KDQogICAgICAgICMgZXhhY3QgbWF0Y2gNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVRDR0FBVEdHQSIpICMgLT4gKFsnQVRDQVRDR0FBVEdHQSddLCB7J21pc21hdGNoZXMnOiBbW11dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pDQoNCiAgICAgICAgIyBjbG9zZSBtYXRjaCBhbGxvd2luZyB1cCB0byAyIG1pc21hdGNoZXMNCiAgICAgICAgcGF0dCA9IENsb3NlTWF0Y2goIkFUQ0FUQ0dBQVRHR0EiLCBtYXhNaXNtYXRjaGVzPTIpDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FYQ0dBQVhHR0EiKSAjIC0+IChbJ0FUQ0FYQ0dBQVhHR0EnXSwgeydtaXNtYXRjaGVzJzogW1s0LCA5XV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWF0Y2hfc3RyaW5nLCBtYXhNaXNtYXRjaGVzPTEpOg0KICAgICAgICBzdXBlcihDbG9zZU1hdGNoLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lID0gbWF0Y2hfc3RyaW5nDQogICAgICAgIHNlbGYubWF0Y2hfc3RyaW5nID0gbWF0Y2hfc3RyaW5nDQogICAgICAgIHNlbGYubWF4TWlzbWF0Y2hlcyA9IG1heE1pc21hdGNoZXMNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgJXIgKHdpdGggdXAgdG8gJWQgbWlzbWF0Y2hlcykiICUgKHNlbGYubWF0Y2hfc3RyaW5nLCBzZWxmLm1heE1pc21hdGNoZXMpDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc3RhcnQgPSBsb2MNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgbGVuKHNlbGYubWF0Y2hfc3RyaW5nKQ0KDQogICAgICAgIGlmIG1heGxvYyA8PSBpbnN0cmxlbjoNCiAgICAgICAgICAgIG1hdGNoX3N0cmluZyA9IHNlbGYubWF0Y2hfc3RyaW5nDQogICAgICAgICAgICBtYXRjaF9zdHJpbmdsb2MgPSAwDQogICAgICAgICAgICBtaXNtYXRjaGVzID0gW10NCiAgICAgICAgICAgIG1heE1pc21hdGNoZXMgPSBzZWxmLm1heE1pc21hdGNoZXMNCg0KICAgICAgICAgICAgZm9yIG1hdGNoX3N0cmluZ2xvYyxzX20gaW4gZW51bWVyYXRlKHppcChpbnN0cmluZ1tsb2M6bWF4bG9jXSwgc2VsZi5tYXRjaF9zdHJpbmcpKToNCiAgICAgICAgICAgICAgICBzcmMsbWF0ID0gc19tDQogICAgICAgICAgICAgICAgaWYgc3JjICE9IG1hdDoNCiAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2hlcy5hcHBlbmQobWF0Y2hfc3RyaW5nbG9jKQ0KICAgICAgICAgICAgICAgICAgICBpZiBsZW4obWlzbWF0Y2hlcykgPiBtYXhNaXNtYXRjaGVzOg0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbG9jID0gbWF0Y2hfc3RyaW5nbG9jICsgMQ0KICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBQYXJzZVJlc3VsdHMoW2luc3RyaW5nW3N0YXJ0OmxvY11dKQ0KICAgICAgICAgICAgICAgIHJlc3VsdHNbJ29yaWdpbmFsJ10gPSBzZWxmLm1hdGNoX3N0cmluZw0KICAgICAgICAgICAgICAgIHJlc3VsdHNbJ21pc21hdGNoZXMnXSA9IG1pc21hdGNoZXMNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jLCByZXN1bHRzDQoNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCg0KY2xhc3MgV29yZChUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHdvcmRzIGNvbXBvc2VkIG9mIGFsbG93ZWQgY2hhcmFjdGVyIHNldHMuDQogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBjb250YWluaW5nIGFsbCBhbGxvd2VkIGluaXRpYWwgY2hhcmFjdGVycywNCiAgICBhbiBvcHRpb25hbCBzdHJpbmcgY29udGFpbmluZyBhbGxvd2VkIGJvZHkgY2hhcmFjdGVycyAoaWYgb21pdHRlZCwNCiAgICBkZWZhdWx0cyB0byB0aGUgaW5pdGlhbCBjaGFyYWN0ZXIgc2V0KSwgYW5kIGFuIG9wdGlvbmFsIG1pbmltdW0sDQogICAgbWF4aW11bSwgYW5kL29yIGV4YWN0IGxlbmd0aC4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBDe21pbn0gaXMgMSAoYQ0KICAgIG1pbmltdW0gdmFsdWUgPCAxIGlzIG5vdCB2YWxpZCk7IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQ3ttYXh9IGFuZCBDe2V4YWN0fQ0KICAgIGFyZSAwLCBtZWFuaW5nIG5vIG1heGltdW0gb3IgZXhhY3QgbGVuZ3RoIHJlc3RyaWN0aW9uLiBBbiBvcHRpb25hbA0KICAgIEN7ZXhjbHVkZUNoYXJzfSBwYXJhbWV0ZXIgY2FuIGxpc3QgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGJlIGZvdW5kIGluIA0KICAgIHRoZSBpbnB1dCBDe2JvZHlDaGFyc30gc3RyaW5nOyB1c2VmdWwgdG8gZGVmaW5lIGEgd29yZCBvZiBhbGwgcHJpbnRhYmxlcw0KICAgIGV4Y2VwdCBmb3Igb25lIG9yIHR3byBjaGFyYWN0ZXJzLCBmb3IgaW5zdGFuY2UuDQogICAgDQogICAgTHtzcmFuZ2V9IGlzIHVzZWZ1bCBmb3IgZGVmaW5pbmcgY3VzdG9tIGNoYXJhY3RlciBzZXQgc3RyaW5ncyBmb3IgZGVmaW5pbmcgDQogICAgQ3tXb3JkfSBleHByZXNzaW9ucywgdXNpbmcgcmFuZ2Ugbm90YXRpb24gZnJvbSByZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVyIHNldHMuDQogICAgDQogICAgQSBjb21tb24gbWlzdGFrZSBpcyB0byB1c2UgQ3tXb3JkfSB0byBtYXRjaCBhIHNwZWNpZmljIGxpdGVyYWwgc3RyaW5nLCBhcyBpbiANCiAgICBDe1dvcmQoIkFkZHJlc3MiKX0uIFJlbWVtYmVyIHRoYXQgQ3tXb3JkfSB1c2VzIHRoZSBzdHJpbmcgYXJndW1lbnQgdG8gZGVmaW5lDQogICAgSXtzZXRzfSBvZiBtYXRjaGFibGUgY2hhcmFjdGVycy4gVGhpcyBleHByZXNzaW9uIHdvdWxkIG1hdGNoICJBZGQiLCAiQUFBIiwNCiAgICAiZEFyZWQiLCBvciBhbnkgb3RoZXIgd29yZCBtYWRlIHVwIG9mIHRoZSBjaGFyYWN0ZXJzICdBJywgJ2QnLCAncicsICdlJywgYW5kICdzJy4NCiAgICBUbyBtYXRjaCBhbiBleGFjdCBsaXRlcmFsIHN0cmluZywgdXNlIEx7TGl0ZXJhbH0gb3IgTHtLZXl3b3JkfS4NCg0KICAgIHB5cGFyc2luZyBpbmNsdWRlcyBoZWxwZXIgc3RyaW5ncyBmb3IgYnVpbGRpbmcgV29yZHM6DQogICAgIC0gTHthbHBoYXN9DQogICAgIC0gTHtudW1zfQ0KICAgICAtIEx7YWxwaGFudW1zfQ0KICAgICAtIEx7aGV4bnVtc30NCiAgICAgLSBMe2FscGhhczhiaXR9IChhbHBoYWJldGljIGNoYXJhY3RlcnMgaW4gQVNDSUkgcmFuZ2UgMTI4LTI1NSAtIGFjY2VudGVkLCB0aWxkZWQsIHVtbGF1dGVkLCBldGMuKQ0KICAgICAtIEx7cHVuYzhiaXR9IChub24tYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGluIEFTQ0lJIHJhbmdlIDEyOC0yNTUgLSBjdXJyZW5jeSwgc3ltYm9scywgc3VwZXJzY3JpcHRzLCBkaWFjcml0aWNhbHMsIGV0Yy4pDQogICAgIC0gTHtwcmludGFibGVzfSAoYW55IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcikNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGEgd29yZCBjb21wb3NlZCBvZiBkaWdpdHMNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykgIyBlcXVpdmFsZW50IHRvIFdvcmQoIjAxMjM0NTY3ODkiKSBvciBXb3JkKHNyYW5nZSgiMC05IikpDQogICAgICAgIA0KICAgICAgICAjIGEgd29yZCB3aXRoIGEgbGVhZGluZyBjYXBpdGFsLCBhbmQgemVybyBvciBtb3JlIGxvd2VyY2FzZQ0KICAgICAgICBjYXBpdGFsX3dvcmQgPSBXb3JkKGFscGhhcy51cHBlcigpLCBhbHBoYXMubG93ZXIoKSkNCg0KICAgICAgICAjIGhvc3RuYW1lcyBhcmUgYWxwaGFudW1lcmljLCB3aXRoIGxlYWRpbmcgYWxwaGEsIGFuZCAnLScNCiAgICAgICAgaG9zdG5hbWUgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKyctJykNCiAgICAgICAgDQogICAgICAgICMgcm9tYW4gbnVtZXJhbCAobm90IGEgc3RyaWN0IHBhcnNlciwgYWNjZXB0cyBpbnZhbGlkIG1peCBvZiBjaGFyYWN0ZXJzKQ0KICAgICAgICByb21hbiA9IFdvcmQoIklWWExDRE0iKQ0KICAgICAgICANCiAgICAgICAgIyBhbnkgc3RyaW5nIG9mIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMsIGV4Y2VwdCBmb3IgJywnDQogICAgICAgIGNzdl92YWx1ZSA9IFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPSIsIikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGluaXRDaGFycywgYm9keUNoYXJzPU5vbmUsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCwgYXNLZXl3b3JkPUZhbHNlLCBleGNsdWRlQ2hhcnM9Tm9uZSApOg0KICAgICAgICBzdXBlcihXb3JkLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgaWYgZXhjbHVkZUNoYXJzOg0KICAgICAgICAgICAgaW5pdENoYXJzID0gJycuam9pbihjIGZvciBjIGluIGluaXRDaGFycyBpZiBjIG5vdCBpbiBleGNsdWRlQ2hhcnMpDQogICAgICAgICAgICBpZiBib2R5Q2hhcnM6DQogICAgICAgICAgICAgICAgYm9keUNoYXJzID0gJycuam9pbihjIGZvciBjIGluIGJvZHlDaGFycyBpZiBjIG5vdCBpbiBleGNsdWRlQ2hhcnMpDQogICAgICAgIHNlbGYuaW5pdENoYXJzT3JpZyA9IGluaXRDaGFycw0KICAgICAgICBzZWxmLmluaXRDaGFycyA9IHNldChpbml0Q2hhcnMpDQogICAgICAgIGlmIGJvZHlDaGFycyA6DQogICAgICAgICAgICBzZWxmLmJvZHlDaGFyc09yaWcgPSBib2R5Q2hhcnMNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzID0gc2V0KGJvZHlDaGFycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzT3JpZyA9IGluaXRDaGFycw0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnMgPSBzZXQoaW5pdENoYXJzKQ0KDQogICAgICAgIHNlbGYubWF4U3BlY2lmaWVkID0gbWF4ID4gMA0KDQogICAgICAgIGlmIG1pbiA8IDE6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3Qgc3BlY2lmeSBhIG1pbmltdW0gbGVuZ3RoIDwgMTsgdXNlIE9wdGlvbmFsKFdvcmQoKSkgaWYgemVyby1sZW5ndGggd29yZCBpcyBwZXJtaXR0ZWQiKQ0KDQogICAgICAgIHNlbGYubWluTGVuID0gbWluDQoNCiAgICAgICAgaWYgbWF4ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UDQoNCiAgICAgICAgaWYgZXhhY3QgPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdA0KICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdA0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5hc0tleXdvcmQgPSBhc0tleXdvcmQNCg0KICAgICAgICBpZiAnICcgbm90IGluIHNlbGYuaW5pdENoYXJzT3JpZytzZWxmLmJvZHlDaGFyc09yaWcgYW5kIChtaW49PTEgYW5kIG1heD09MCBhbmQgZXhhY3Q9PTApOg0KICAgICAgICAgICAgaWYgc2VsZi5ib2R5Q2hhcnNPcmlnID09IHNlbGYuaW5pdENoYXJzT3JpZzoNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIlslc10rIiAlIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5pbml0Q2hhcnNPcmlnKQ0KICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5pbml0Q2hhcnNPcmlnKSA9PSAxOg0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiJXNbJXNdKiIgJSBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZS5lc2NhcGUoc2VsZi5pbml0Q2hhcnNPcmlnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmJvZHlDaGFyc09yaWcpLCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICJbJXNdWyVzXSoiICUgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmluaXRDaGFyc09yaWcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuYm9keUNoYXJzT3JpZyksKQ0KICAgICAgICAgICAgaWYgc2VsZi5hc0tleXdvcmQ6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHIiXGIiK3NlbGYucmVTdHJpbmcrciJcYiINCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZSggc2VsZi5yZVN0cmluZyApDQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgIHNlbGYucmUgPSBOb25lDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLnJlOg0KICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpDQogICAgICAgICAgICBpZiBub3QgcmVzdWx0Og0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkNCiAgICAgICAgICAgIHJldHVybiBsb2MsIHJlc3VsdC5ncm91cCgpDQoNCiAgICAgICAgaWYgbm90KGluc3RyaW5nWyBsb2MgXSBpbiBzZWxmLmluaXRDaGFycyk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBsb2MgKz0gMQ0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgYm9keWNoYXJzID0gc2VsZi5ib2R5Q2hhcnMNCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBzZWxmLm1heExlbg0KICAgICAgICBtYXhsb2MgPSBtaW4oIG1heGxvYywgaW5zdHJsZW4gKQ0KICAgICAgICB3aGlsZSBsb2MgPCBtYXhsb2MgYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzOg0KICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IEZhbHNlDQogICAgICAgIGlmIGxvYyAtIHN0YXJ0IDwgc2VsZi5taW5MZW46DQogICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUNCiAgICAgICAgaWYgc2VsZi5tYXhTcGVjaWZpZWQgYW5kIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIGJvZHljaGFyczoNCiAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQ0KICAgICAgICBpZiBzZWxmLmFzS2V5d29yZDoNCiAgICAgICAgICAgIGlmIChzdGFydD4wIGFuZCBpbnN0cmluZ1tzdGFydC0xXSBpbiBib2R5Y2hhcnMpIG9yIChsb2M8aW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzKToNCiAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUNCg0KICAgICAgICBpZiB0aHJvd0V4Y2VwdGlvbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihXb3JkLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQoNCiAgICAgICAgICAgIGRlZiBjaGFyc0FzU3RyKHMpOg0KICAgICAgICAgICAgICAgIGlmIGxlbihzKT40Og0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc1s6NF0rIi4uLiINCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcw0KDQogICAgICAgICAgICBpZiAoIHNlbGYuaW5pdENoYXJzT3JpZyAhPSBzZWxmLmJvZHlDaGFyc09yaWcgKToNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiVzooJXMsJXMpIiAlICggY2hhcnNBc1N0cihzZWxmLmluaXRDaGFyc09yaWcpLCBjaGFyc0FzU3RyKHNlbGYuYm9keUNoYXJzT3JpZykgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiVzooJXMpIiAlIGNoYXJzQXNTdHIoc2VsZi5pbml0Q2hhcnNPcmlnKQ0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBSZWdleChUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHN0cmluZ3MgdGhhdCBtYXRjaCBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4NCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbiBhIGZvcm0gcmVjb2duaXplZCBieSB0aGUgaW5idWlsdCBQeXRob24gcmUgbW9kdWxlLg0KICAgIElmIHRoZSBnaXZlbiByZWdleCBjb250YWlucyBuYW1lZCBncm91cHMgKGRlZmluZWQgdXNpbmcgQ3soP1A8bmFtZT4uLi4pfSksIHRoZXNlIHdpbGwgYmUgcHJlc2VydmVkIGFzIA0KICAgIG5hbWVkIHBhcnNlIHJlc3VsdHMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcmVhbG51bSA9IFJlZ2V4KHIiWystXT9cZCtcLlxkKiIpDQogICAgICAgIGRhdGUgPSBSZWdleChyJyg/UDx5ZWFyPlxkezR9KS0oP1A8bW9udGg+XGRcZD8pLSg/UDxkYXk+XGRcZD8pJykNCiAgICAgICAgIyByZWY6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjY3Mzk5L2hvdy1kby15b3UtbWF0Y2gtb25seS12YWxpZC1yb21hbi1udW1lcmFscy13aXRoLWEtcmVndWxhci1leHByZXNzaW9uDQogICAgICAgIHJvbWFuID0gUmVnZXgociJNezAsNH0oQ018Q0R8RD9DezAsM30pKFhDfFhMfEw/WHswLDN9KShJWHxJVnxWP0l7MCwzfSkiKQ0KICAgICIiIg0KICAgIGNvbXBpbGVkUkV0eXBlID0gdHlwZShyZS5jb21waWxlKCJbQS1aXSIpKQ0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcGF0dGVybiwgZmxhZ3M9MCk6DQogICAgICAgICIiIlRoZSBwYXJhbWV0ZXJzIEN7cGF0dGVybn0gYW5kIEN7ZmxhZ3N9IGFyZSBwYXNzZWQgdG8gdGhlIEN7cmUuY29tcGlsZSgpfSBmdW5jdGlvbiBhcy1pcy4gU2VlIHRoZSBQeXRob24gQ3tyZX0gbW9kdWxlIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgYWNjZXB0YWJsZSBwYXR0ZXJucyBhbmQgZmxhZ3MuIiIiDQogICAgICAgIHN1cGVyKFJlZ2V4LHNlbGYpLl9faW5pdF9fKCkNCg0KICAgICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgaWYgbm90IHBhdHRlcm46DQogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIFJlZ2V4OyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gcGF0dGVybg0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzDQoNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZShzZWxmLnBhdHRlcm4sIHNlbGYuZmxhZ3MpDQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHNlbGYucGF0dGVybg0KICAgICAgICAgICAgZXhjZXB0IHNyZV9jb25zdGFudHMuZXJyb3I6DQogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiaW52YWxpZCBwYXR0ZXJuICglcykgcGFzc2VkIHRvIFJlZ2V4IiAlIHBhdHRlcm4sDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgICAgICByYWlzZQ0KDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBSZWdleC5jb21waWxlZFJFdHlwZSk6DQogICAgICAgICAgICBzZWxmLnJlID0gcGF0dGVybg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gXA0KICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHN0cihwYXR0ZXJuKQ0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzDQogICAgICAgICAgICANCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlJlZ2V4IG1heSBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBzdHJpbmcgb3IgYSBjb21waWxlZCBSRSBvYmplY3QiKQ0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJlc3VsdCA9IHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKQ0KICAgICAgICBpZiBub3QgcmVzdWx0Og0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpDQogICAgICAgIGQgPSByZXN1bHQuZ3JvdXBkaWN0KCkNCiAgICAgICAgcmV0ID0gUGFyc2VSZXN1bHRzKHJlc3VsdC5ncm91cCgpKQ0KICAgICAgICBpZiBkOg0KICAgICAgICAgICAgZm9yIGsgaW4gZDoNCiAgICAgICAgICAgICAgICByZXRba10gPSBkW2tdDQogICAgICAgIHJldHVybiBsb2MscmV0DQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUmVnZXgsc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiUmU6KCVzKSIgJSByZXByKHNlbGYucGF0dGVybikNCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgUXVvdGVkU3RyaW5nKFRva2VuKToNCiAgICByIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHN0cmluZ3MgdGhhdCBhcmUgZGVsaW1pdGVkIGJ5IHF1b3RpbmcgY2hhcmFjdGVycy4NCiAgICANCiAgICBEZWZpbmVkIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOg0KICAgICAgICAtIHF1b3RlQ2hhciAtIHN0cmluZyBvZiBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGRlZmluaW5nIHRoZSBxdW90ZSBkZWxpbWl0aW5nIHN0cmluZw0KICAgICAgICAtIGVzY0NoYXIgLSBjaGFyYWN0ZXIgdG8gZXNjYXBlIHF1b3RlcywgdHlwaWNhbGx5IGJhY2tzbGFzaCAoZGVmYXVsdD1De05vbmV9KQ0KICAgICAgICAtIGVzY1F1b3RlIC0gc3BlY2lhbCBxdW90ZSBzZXF1ZW5jZSB0byBlc2NhcGUgYW4gZW1iZWRkZWQgcXVvdGUgc3RyaW5nIChzdWNoIGFzIFNRTCdzICIiIHRvIGVzY2FwZSBhbiBlbWJlZGRlZCAiKSAoZGVmYXVsdD1De05vbmV9KQ0KICAgICAgICAtIG11bHRpbGluZSAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHF1b3RlcyBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcyAoZGVmYXVsdD1De0ZhbHNlfSkNCiAgICAgICAgLSB1bnF1b3RlUmVzdWx0cyAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXRjaGVkIHRleHQgc2hvdWxkIGJlIHVucXVvdGVkIChkZWZhdWx0PUN7VHJ1ZX0pDQogICAgICAgIC0gZW5kUXVvdGVDaGFyIC0gc3RyaW5nIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgZGVmaW5pbmcgdGhlIGVuZCBvZiB0aGUgcXVvdGUgZGVsaW1pdGVkIHN0cmluZyAoZGVmYXVsdD1De05vbmV9ID0+IHNhbWUgYXMgcXVvdGVDaGFyKQ0KICAgICAgICAtIGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcyAtIGNvbnZlcnQgZXNjYXBlZCB3aGl0ZXNwYWNlIChDeydcdCd9LCBDeydcbid9LCBldGMuKSB0byBhY3R1YWwgd2hpdGVzcGFjZSAoZGVmYXVsdD1De1RydWV9KQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHFzID0gUXVvdGVkU3RyaW5nKCciJykNCiAgICAgICAgcHJpbnQocXMuc2VhcmNoU3RyaW5nKCdsc2pkZiAiVGhpcyBpcyB0aGUgcXVvdGUiIHNsZGpmJykpDQogICAgICAgIGNvbXBsZXhfcXMgPSBRdW90ZWRTdHJpbmcoJ3t7JywgZW5kUXVvdGVDaGFyPSd9fScpDQogICAgICAgIHByaW50KGNvbXBsZXhfcXMuc2VhcmNoU3RyaW5nKCdsc2pkZiB7e1RoaXMgaXMgdGhlICJxdW90ZSJ9fSBzbGRqZicpKQ0KICAgICAgICBzcWxfcXMgPSBRdW90ZWRTdHJpbmcoJyInLCBlc2NRdW90ZT0nIiInKQ0KICAgICAgICBwcmludChzcWxfcXMuc2VhcmNoU3RyaW5nKCdsc2pkZiAiVGhpcyBpcyB0aGUgcXVvdGUgd2l0aCAiImVtYmVkZGVkIiIgcXVvdGVzIiBzbGRqZicpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ1RoaXMgaXMgdGhlIHF1b3RlJ11dDQogICAgICAgIFtbJ1RoaXMgaXMgdGhlICJxdW90ZSInXV0NCiAgICAgICAgW1snVGhpcyBpcyB0aGUgcXVvdGUgd2l0aCAiZW1iZWRkZWQiIHF1b3RlcyddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcXVvdGVDaGFyLCBlc2NDaGFyPU5vbmUsIGVzY1F1b3RlPU5vbmUsIG11bHRpbGluZT1GYWxzZSwgdW5xdW90ZVJlc3VsdHM9VHJ1ZSwgZW5kUXVvdGVDaGFyPU5vbmUsIGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcz1UcnVlKToNCiAgICAgICAgc3VwZXIoUXVvdGVkU3RyaW5nLHNlbGYpLl9faW5pdF9fKCkNCg0KICAgICAgICAjIHJlbW92ZSB3aGl0ZSBzcGFjZSBmcm9tIHF1b3RlIGNoYXJzIC0gd29udCB3b3JrIGFueXdheQ0KICAgICAgICBxdW90ZUNoYXIgPSBxdW90ZUNoYXIuc3RyaXAoKQ0KICAgICAgICBpZiBub3QgcXVvdGVDaGFyOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigicXVvdGVDaGFyIGNhbm5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nIixTeW50YXhXYXJuaW5nLHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCkNCg0KICAgICAgICBpZiBlbmRRdW90ZUNoYXIgaXMgTm9uZToNCiAgICAgICAgICAgIGVuZFF1b3RlQ2hhciA9IHF1b3RlQ2hhcg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgZW5kUXVvdGVDaGFyID0gZW5kUXVvdGVDaGFyLnN0cmlwKCkNCiAgICAgICAgICAgIGlmIG5vdCBlbmRRdW90ZUNoYXI6DQogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiZW5kUXVvdGVDaGFyIGNhbm5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nIixTeW50YXhXYXJuaW5nLHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigpDQoNCiAgICAgICAgc2VsZi5xdW90ZUNoYXIgPSBxdW90ZUNoYXINCiAgICAgICAgc2VsZi5xdW90ZUNoYXJMZW4gPSBsZW4ocXVvdGVDaGFyKQ0KICAgICAgICBzZWxmLmZpcnN0UXVvdGVDaGFyID0gcXVvdGVDaGFyWzBdDQogICAgICAgIHNlbGYuZW5kUXVvdGVDaGFyID0gZW5kUXVvdGVDaGFyDQogICAgICAgIHNlbGYuZW5kUXVvdGVDaGFyTGVuID0gbGVuKGVuZFF1b3RlQ2hhcikNCiAgICAgICAgc2VsZi5lc2NDaGFyID0gZXNjQ2hhcg0KICAgICAgICBzZWxmLmVzY1F1b3RlID0gZXNjUXVvdGUNCiAgICAgICAgc2VsZi51bnF1b3RlUmVzdWx0cyA9IHVucXVvdGVSZXN1bHRzDQogICAgICAgIHNlbGYuY29udmVydFdoaXRlc3BhY2VFc2NhcGVzID0gY29udmVydFdoaXRlc3BhY2VFc2NhcGVzDQoNCiAgICAgICAgaWYgbXVsdGlsaW5lOg0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IHJlLk1VTFRJTElORSB8IHJlLkRPVEFMTA0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gciclcyg/OlteJXMlc10nICUgXA0KICAgICAgICAgICAgICAgICggcmUuZXNjYXBlKHNlbGYucXVvdGVDaGFyKSwNCiAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbMF0pLA0KICAgICAgICAgICAgICAgICAgKGVzY0NoYXIgaXMgbm90IE5vbmUgYW5kIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoZXNjQ2hhcikgb3IgJycpICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSAwDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSByJyVzKD86W14lc1xuXHIlc10nICUgXA0KICAgICAgICAgICAgICAgICggcmUuZXNjYXBlKHNlbGYucXVvdGVDaGFyKSwNCiAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbMF0pLA0KICAgICAgICAgICAgICAgICAgKGVzY0NoYXIgaXMgbm90IE5vbmUgYW5kIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoZXNjQ2hhcikgb3IgJycpICkNCiAgICAgICAgaWYgbGVuKHNlbGYuZW5kUXVvdGVDaGFyKSA+IDE6DQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKA0KICAgICAgICAgICAgICAgICd8KD86JyArICcpfCg/Oicuam9pbigiJXNbXiVzXSIgJSAocmUuZXNjYXBlKHNlbGYuZW5kUXVvdGVDaGFyWzppXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbaV0pKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuZW5kUXVvdGVDaGFyKS0xLDAsLTEpKSArICcpJw0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgaWYgZXNjUXVvdGU6DQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInfCg/OiVzKScgJSByZS5lc2NhcGUoZXNjUXVvdGUpKQ0KICAgICAgICBpZiBlc2NDaGFyOg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJ3woPzolcy4pJyAlIHJlLmVzY2FwZShlc2NDaGFyKSkNCiAgICAgICAgICAgIHNlbGYuZXNjQ2hhclJlcGxhY2VQYXR0ZXJuID0gcmUuZXNjYXBlKHNlbGYuZXNjQ2hhcikrIiguKSINCiAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJykqJXMnICUgcmUuZXNjYXBlKHNlbGYuZW5kUXVvdGVDaGFyKSkNCg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZShzZWxmLnBhdHRlcm4sIHNlbGYuZmxhZ3MpDQogICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc2VsZi5wYXR0ZXJuDQogICAgICAgIGV4Y2VwdCBzcmVfY29uc3RhbnRzLmVycm9yOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiaW52YWxpZCBwYXR0ZXJuICglcykgcGFzc2VkIHRvIFJlZ2V4IiAlIHNlbGYucGF0dGVybiwNCiAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByYWlzZQ0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJlc3VsdCA9IGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdFF1b3RlQ2hhciBhbmQgc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpIG9yIE5vbmUNCiAgICAgICAgaWYgbm90IHJlc3VsdDoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQ0KICAgICAgICByZXQgPSByZXN1bHQuZ3JvdXAoKQ0KDQogICAgICAgIGlmIHNlbGYudW5xdW90ZVJlc3VsdHM6DQoNCiAgICAgICAgICAgICMgc3RyaXAgb2ZmIHF1b3Rlcw0KICAgICAgICAgICAgcmV0ID0gcmV0W3NlbGYucXVvdGVDaGFyTGVuOi1zZWxmLmVuZFF1b3RlQ2hhckxlbl0NCg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXQsYmFzZXN0cmluZyk6DQogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgd2hpdGVzcGFjZQ0KICAgICAgICAgICAgICAgIGlmICdcXCcgaW4gcmV0IGFuZCBzZWxmLmNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlczoNCiAgICAgICAgICAgICAgICAgICAgd3NfbWFwID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgcidcdCcgOiAnXHQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgcidcbicgOiAnXG4nLA0KICAgICAgICAgICAgICAgICAgICAgICAgcidcZicgOiAnXGYnLA0KICAgICAgICAgICAgICAgICAgICAgICAgcidccicgOiAnXHInLA0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGZvciB3c2xpdCx3c2NoYXIgaW4gd3NfbWFwLml0ZW1zKCk6DQogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQucmVwbGFjZSh3c2xpdCwgd3NjaGFyKQ0KDQogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgY2hhcmFjdGVycw0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNjQ2hhcjoNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmUuc3ViKHNlbGYuZXNjQ2hhclJlcGxhY2VQYXR0ZXJuLCJcZzwxPiIscmV0KQ0KDQogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgcXVvdGVzDQogICAgICAgICAgICAgICAgaWYgc2VsZi5lc2NRdW90ZToNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LnJlcGxhY2Uoc2VsZi5lc2NRdW90ZSwgc2VsZi5lbmRRdW90ZUNoYXIpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgcmV0DQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUXVvdGVkU3RyaW5nLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInF1b3RlZCBzdHJpbmcsIHN0YXJ0aW5nIHdpdGggJXMgZW5kaW5nIHdpdGggJXMiICUgKHNlbGYucXVvdGVDaGFyLCBzZWxmLmVuZFF1b3RlQ2hhcikNCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgQ2hhcnNOb3RJbihUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHdvcmRzIGNvbXBvc2VkIG9mIGNoYXJhY3RlcnMgSXtub3R9IGluIGEgZ2l2ZW4gc2V0ICh3aWxsDQogICAgaW5jbHVkZSB3aGl0ZXNwYWNlIGluIG1hdGNoZWQgY2hhcmFjdGVycyBpZiBub3QgbGlzdGVkIGluIHRoZSBwcm92aWRlZCBleGNsdXNpb24gc2V0IC0gc2VlIGV4YW1wbGUpLg0KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgY29udGFpbmluZyBhbGwgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzLCBhbmQgYW4gb3B0aW9uYWwNCiAgICBtaW5pbXVtLCBtYXhpbXVtLCBhbmQvb3IgZXhhY3QgbGVuZ3RoLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEN7bWlufSBpcyAxIChhDQogICAgbWluaW11bSB2YWx1ZSA8IDEgaXMgbm90IHZhbGlkKTsgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBDe21heH0gYW5kIEN7ZXhhY3R9DQogICAgYXJlIDAsIG1lYW5pbmcgbm8gbWF4aW11bSBvciBleGFjdCBsZW5ndGggcmVzdHJpY3Rpb24uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBkZWZpbmUgYSBjb21tYS1zZXBhcmF0ZWQtdmFsdWUgYXMgYW55dGhpbmcgdGhhdCBpcyBub3QgYSAnLCcNCiAgICAgICAgY3N2X3ZhbHVlID0gQ2hhcnNOb3RJbignLCcpDQogICAgICAgIHByaW50KGRlbGltaXRlZExpc3QoY3N2X3ZhbHVlKS5wYXJzZVN0cmluZygiZGtscyxsc2RramYsczEyIDM0LEAhIywyMTMiKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJ2RrbHMnLCAnbHNka2pmJywgJ3MxMiAzNCcsICdAISMnLCAnMjEzJ10NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG5vdENoYXJzLCBtaW49MSwgbWF4PTAsIGV4YWN0PTAgKToNCiAgICAgICAgc3VwZXIoQ2hhcnNOb3RJbixzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLm5vdENoYXJzID0gbm90Q2hhcnMNCg0KICAgICAgICBpZiBtaW4gPCAxOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IHNwZWNpZnkgYSBtaW5pbXVtIGxlbmd0aCA8IDE7IHVzZSBPcHRpb25hbChDaGFyc05vdEluKCkpIGlmIHplcm8tbGVuZ3RoIGNoYXIgZ3JvdXAgaXMgcGVybWl0dGVkIikNCg0KICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbg0KDQogICAgICAgIGlmIG1heCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVA0KDQogICAgICAgIGlmIGV4YWN0ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QNCiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QNCg0KICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSAoIHNlbGYubWluTGVuID09IDAgKQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgaW5zdHJpbmdbbG9jXSBpbiBzZWxmLm5vdENoYXJzOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgc3RhcnQgPSBsb2MNCiAgICAgICAgbG9jICs9IDENCiAgICAgICAgbm90Y2hhcnMgPSBzZWxmLm5vdENoYXJzDQogICAgICAgIG1heGxlbiA9IG1pbiggc3RhcnQrc2VsZi5tYXhMZW4sIGxlbihpbnN0cmluZykgKQ0KICAgICAgICB3aGlsZSBsb2MgPCBtYXhsZW4gYW5kIFwNCiAgICAgICAgICAgICAgKGluc3RyaW5nW2xvY10gbm90IGluIG5vdGNoYXJzKToNCiAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihDaGFyc05vdEluLCBzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIGlmIGxlbihzZWxmLm5vdENoYXJzKSA+IDQ6DQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiFXOiglcy4uLikiICUgc2VsZi5ub3RDaGFyc1s6NF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiFXOiglcykiICUgc2VsZi5ub3RDaGFycw0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgV2hpdGUoVG9rZW4pOg0KICAgICIiIg0KICAgIFNwZWNpYWwgbWF0Y2hpbmcgY2xhc3MgZm9yIG1hdGNoaW5nIHdoaXRlc3BhY2UuICBOb3JtYWxseSwgd2hpdGVzcGFjZSBpcyBpZ25vcmVkDQogICAgYnkgcHlwYXJzaW5nIGdyYW1tYXJzLiAgVGhpcyBjbGFzcyBpcyBpbmNsdWRlZCB3aGVuIHNvbWUgd2hpdGVzcGFjZSBzdHJ1Y3R1cmVzDQogICAgYXJlIHNpZ25pZmljYW50LiAgRGVmaW5lIHdpdGggYSBzdHJpbmcgY29udGFpbmluZyB0aGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIGJlDQogICAgbWF0Y2hlZDsgZGVmYXVsdCBpcyBDeyIgXFx0XFxyXFxuIn0uICBBbHNvIHRha2VzIG9wdGlvbmFsIEN7bWlufSwgQ3ttYXh9LCBhbmQgQ3tleGFjdH0gYXJndW1lbnRzLA0KICAgIGFzIGRlZmluZWQgZm9yIHRoZSBDe0x7V29yZH19IGNsYXNzLg0KICAgICIiIg0KICAgIHdoaXRlU3RycyA9IHsNCiAgICAgICAgIiAiIDogIjxTUEM+IiwNCiAgICAgICAgIlx0IjogIjxUQUI+IiwNCiAgICAgICAgIlxuIjogIjxMRj4iLA0KICAgICAgICAiXHIiOiAiPENSPiIsDQogICAgICAgICJcZiI6ICI8RkY+IiwNCiAgICAgICAgfQ0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3cz0iIFx0XHJcbiIsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCk6DQogICAgICAgIHN1cGVyKFdoaXRlLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5tYXRjaFdoaXRlID0gd3MNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoICIiLmpvaW4oYyBmb3IgYyBpbiBzZWxmLndoaXRlQ2hhcnMgaWYgYyBub3QgaW4gc2VsZi5tYXRjaFdoaXRlKSApDQogICAgICAgICN+IHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgc2VsZi5uYW1lID0gKCIiLmpvaW4oV2hpdGUud2hpdGVTdHJzW2NdIGZvciBjIGluIHNlbGYubWF0Y2hXaGl0ZSkpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCg0KICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbg0KDQogICAgICAgIGlmIG1heCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVA0KDQogICAgICAgIGlmIGV4YWN0ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QNCiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIG5vdChpbnN0cmluZ1sgbG9jIF0gaW4gc2VsZi5tYXRjaFdoaXRlKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBsb2MgKz0gMQ0KICAgICAgICBtYXhsb2MgPSBzdGFydCArIHNlbGYubWF4TGVuDQogICAgICAgIG1heGxvYyA9IG1pbiggbWF4bG9jLCBsZW4oaW5zdHJpbmcpICkNCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bG9jIGFuZCBpbnN0cmluZ1tsb2NdIGluIHNlbGYubWF0Y2hXaGl0ZToNCiAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10NCg0KDQpjbGFzcyBfUG9zaXRpb25Ub2tlbihUb2tlbik6DQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKF9Qb3NpdGlvblRva2VuLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lPXNlbGYuX19jbGFzc19fLl9fbmFtZV9fDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCmNsYXNzIEdvVG9Db2x1bW4oX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIHRvIGFkdmFuY2UgdG8gYSBzcGVjaWZpYyBjb2x1bW4gb2YgaW5wdXQgdGV4dDsgdXNlZnVsIGZvciB0YWJ1bGFyIHJlcG9ydCBzY3JhcGluZy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGNvbG5vICk6DQogICAgICAgIHN1cGVyKEdvVG9Db2x1bW4sc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLmNvbCA9IGNvbG5vDQoNCiAgICBkZWYgcHJlUGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToNCiAgICAgICAgaWYgY29sKGxvYyxpbnN0cmluZykgIT0gc2VsZi5jb2w6DQogICAgICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgICAgIGlmIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgbG9jID0gc2VsZi5fc2tpcElnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgd2hpbGUgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10uaXNzcGFjZSgpIGFuZCBjb2woIGxvYywgaW5zdHJpbmcgKSAhPSBzZWxmLmNvbCA6DQogICAgICAgICAgICAgICAgbG9jICs9IDENCiAgICAgICAgcmV0dXJuIGxvYw0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgdGhpc2NvbCA9IGNvbCggbG9jLCBpbnN0cmluZyApDQogICAgICAgIGlmIHRoaXNjb2wgPiBzZWxmLmNvbDoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbG9jLCAiVGV4dCBub3QgaW4gZXhwZWN0ZWQgY29sdW1uIiwgc2VsZiApDQogICAgICAgIG5ld2xvYyA9IGxvYyArIHNlbGYuY29sIC0gdGhpc2NvbA0KICAgICAgICByZXQgPSBpbnN0cmluZ1sgbG9jOiBuZXdsb2MgXQ0KICAgICAgICByZXR1cm4gbmV3bG9jLCByZXQNCg0KDQpjbGFzcyBMaW5lU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSB3aXRoaW4gdGhlIHBhcnNlIHN0cmluZw0KICAgIA0KICAgIEV4YW1wbGU6Og0KICAgIA0KICAgICAgICB0ZXN0ID0gJycnXA0KICAgICAgICBBQUEgdGhpcyBsaW5lDQogICAgICAgIEFBQSBhbmQgdGhpcyBsaW5lDQogICAgICAgICAgQUFBIGJ1dCBub3QgdGhpcyBvbmUNCiAgICAgICAgQiBBQUEgYW5kIGRlZmluaXRlbHkgbm90IHRoaXMgb25lDQogICAgICAgICcnJw0KDQogICAgICAgIGZvciB0IGluIChMaW5lU3RhcnQoKSArICdBQUEnICsgcmVzdE9mTGluZSkuc2VhcmNoU3RyaW5nKHRlc3QpOg0KICAgICAgICAgICAgcHJpbnQodCkNCiAgICANCiAgICBQcmludHM6Og0KICAgICAgICBbJ0FBQScsICcgdGhpcyBsaW5lJ10NCiAgICAgICAgWydBQUEnLCAnIGFuZCB0aGlzIGxpbmUnXSAgICANCg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihMaW5lU3RhcnQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBzdGFydCBvZiBsaW5lIg0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgY29sKGxvYywgaW5zdHJpbmcpID09IDE6DQogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQ0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgTGluZUVuZChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSBsaW5lIHdpdGhpbiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKExpbmVFbmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLnJlcGxhY2UoIlxuIiwiIikgKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBlbmQgb2YgbGluZSINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYzxsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgaWYgaW5zdHJpbmdbbG9jXSA9PSAiXG4iOg0KICAgICAgICAgICAgICAgIHJldHVybiBsb2MrMSwgIlxuIg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgZWxpZiBsb2MgPT0gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJldHVybiBsb2MrMSwgW10NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBTdHJpbmdTdGFydChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnNlIHN0cmluZw0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihTdHJpbmdTdGFydCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIHN0YXJ0IG9mIHRleHQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2MgIT0gMDoNCiAgICAgICAgICAgICMgc2VlIGlmIGVudGlyZSBzdHJpbmcgdXAgdG8gaGVyZSBpcyBqdXN0IHdoaXRlc3BhY2UgYW5kIGlnbm9yZWFibGVzDQogICAgICAgICAgICBpZiBsb2MgIT0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIDAgKToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KY2xhc3MgU3RyaW5nRW5kKF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFN0cmluZ0VuZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIGVuZCBvZiB0ZXh0Ig0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbG9jIDwgbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICBlbGlmIGxvYyA9PSBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIGxvYysxLCBbXQ0KICAgICAgICBlbGlmIGxvYyA+IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIFdvcmRTdGFydChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgV29yZCwgYW5kDQogICAgaXMgbm90IHByZWNlZGVkIGJ5IGFueSBjaGFyYWN0ZXIgaW4gYSBnaXZlbiBzZXQgb2YgQ3t3b3JkQ2hhcnN9DQogICAgKGRlZmF1bHQ9Q3twcmludGFibGVzfSkuIFRvIGVtdWxhdGUgdGhlIEN7XGJ9IGJlaGF2aW9yIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsDQogICAgdXNlIEN7V29yZFN0YXJ0KGFscGhhbnVtcyl9LiBDe1dvcmRTdGFydH0gd2lsbCBhbHNvIG1hdGNoIGF0IHRoZSBiZWdpbm5pbmcgb2YNCiAgICB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZCwgb3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmRDaGFycyA9IHByaW50YWJsZXMpOg0KICAgICAgICBzdXBlcihXb3JkU3RhcnQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLndvcmRDaGFycyA9IHNldCh3b3JkQ2hhcnMpDQogICAgICAgIHNlbGYuZXJybXNnID0gIk5vdCBhdCB0aGUgc3RhcnQgb2YgYSB3b3JkIg0KDQogICAgZGVmIHBhcnNlSW1wbChzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2MgIT0gMDoNCiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2MtMV0gaW4gc2VsZi53b3JkQ2hhcnMgb3INCiAgICAgICAgICAgICAgICBpbnN0cmluZ1tsb2NdIG5vdCBpbiBzZWxmLndvcmRDaGFycyk6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCmNsYXNzIFdvcmRFbmQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiBhIFdvcmQsIGFuZA0KICAgIGlzIG5vdCBmb2xsb3dlZCBieSBhbnkgY2hhcmFjdGVyIGluIGEgZ2l2ZW4gc2V0IG9mIEN7d29yZENoYXJzfQ0KICAgIChkZWZhdWx0PUN7cHJpbnRhYmxlc30pLiBUbyBlbXVsYXRlIHRoZSBDe1xifSBiZWhhdmlvciBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICAgIHVzZSBDe1dvcmRFbmQoYWxwaGFudW1zKX0uIEN7V29yZEVuZH0gd2lsbCBhbHNvIG1hdGNoIGF0IHRoZSBlbmQgb2YNCiAgICB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZCwgb3IgYXQgdGhlIGVuZCBvZiBhIGxpbmUuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmRDaGFycyA9IHByaW50YWJsZXMpOg0KICAgICAgICBzdXBlcihXb3JkRW5kLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi53b3JkQ2hhcnMgPSBzZXQod29yZENoYXJzKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm90IGF0IHRoZSBlbmQgb2YgYSB3b3JkIg0KDQogICAgZGVmIHBhcnNlSW1wbChzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgaWYgaW5zdHJsZW4+MCBhbmQgbG9jPGluc3RybGVuOg0KICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gaW4gc2VsZi53b3JkQ2hhcnMgb3INCiAgICAgICAgICAgICAgICBpbnN0cmluZ1tsb2MtMV0gbm90IGluIHNlbGYud29yZENoYXJzKToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KDQpjbGFzcyBQYXJzZUV4cHJlc3Npb24oUGFyc2VyRWxlbWVudCk6DQogICAgIiIiDQogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgUGFyc2VyRWxlbWVudCwgZm9yIGNvbWJpbmluZyBhbmQgcG9zdC1wcm9jZXNzaW5nIHBhcnNlZCB0b2tlbnMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOg0KICAgICAgICBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuX19pbml0X18oc2F2ZWxpc3QpDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBfZ2VuZXJhdG9yVHlwZSApOg0KICAgICAgICAgICAgZXhwcnMgPSBsaXN0KGV4cHJzKQ0KDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBzZWxmLmV4cHJzID0gWyBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIGV4cHJzICkgXQ0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBjb2xsZWN0aW9ucy5JdGVyYWJsZSApOg0KICAgICAgICAgICAgZXhwcnMgPSBsaXN0KGV4cHJzKQ0KICAgICAgICAgICAgIyBpZiBzZXF1ZW5jZSBvZiBzdHJpbmdzIHByb3ZpZGVkLCB3cmFwIHdpdGggTGl0ZXJhbA0KICAgICAgICAgICAgaWYgYWxsKGlzaW5zdGFuY2UoZXhwciwgYmFzZXN0cmluZykgZm9yIGV4cHIgaW4gZXhwcnMpOg0KICAgICAgICAgICAgICAgIGV4cHJzID0gbWFwKFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcywgZXhwcnMpDQogICAgICAgICAgICBzZWxmLmV4cHJzID0gbGlzdChleHBycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gbGlzdCggZXhwcnMgKQ0KICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gWyBleHBycyBdDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gRmFsc2UNCg0KICAgIGRlZiBfX2dldGl0ZW1fXyggc2VsZiwgaSApOg0KICAgICAgICByZXR1cm4gc2VsZi5leHByc1tpXQ0KDQogICAgZGVmIGFwcGVuZCggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgc2VsZi5leHBycy5hcHBlbmQoIG90aGVyICkNCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICAiIiJFeHRlbmRzIEN7bGVhdmVXaGl0ZXNwYWNlfSBkZWZpbmVkIGluIGJhc2UgY2xhc3MsIGFuZCBhbHNvIGludm9rZXMgQ3tsZWF2ZVdoaXRlc3BhY2V9IG9uDQogICAgICAgICAgIGFsbCBjb250YWluZWQgZXhwcmVzc2lvbnMuIiIiDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLmV4cHJzID0gWyBlLmNvcHkoKSBmb3IgZSBpbiBzZWxmLmV4cHJzIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBTdXBwcmVzcyApOg0KICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgc3VwZXIoIFBhcnNlRXhwcmVzc2lvbiwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgICAgICAgICAgZS5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHN1cGVyKCBQYXJzZUV4cHJlc3Npb24sIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgICAgICBlLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIlczooJXMpIiAlICggc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF91c3RyKHNlbGYuZXhwcnMpICkNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLnN0cmVhbWxpbmUoKQ0KDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQ0KDQogICAgICAgICMgY29sbGFwc2UgbmVzdGVkIEFuZCdzIG9mIHRoZSBmb3JtIEFuZCggQW5kKCBBbmQoIGEsYiksIGMpLCBkKSB0byBBbmQoIGEsYixjLGQgKQ0KICAgICAgICAjIGJ1dCBvbmx5IGlmIHRoZXJlIGFyZSBubyBwYXJzZSBhY3Rpb25zIG9yIHJlc3VsdHNOYW1lcyBvbiB0aGUgbmVzdGVkIEFuZCdzDQogICAgICAgICMgKGxpa2V3aXNlIGZvciBPcidzIGFuZCBNYXRjaEZpcnN0J3MpDQogICAgICAgIGlmICggbGVuKHNlbGYuZXhwcnMpID09IDIgKToNCiAgICAgICAgICAgIG90aGVyID0gc2VsZi5leHByc1swXQ0KICAgICAgICAgICAgaWYgKCBpc2luc3RhbmNlKCBvdGhlciwgc2VsZi5fX2NsYXNzX18gKSBhbmQNCiAgICAgICAgICAgICAgICAgIG5vdChvdGhlci5wYXJzZUFjdGlvbikgYW5kDQogICAgICAgICAgICAgICAgICBvdGhlci5yZXN1bHRzTmFtZSBpcyBOb25lIGFuZA0KICAgICAgICAgICAgICAgICAgbm90IG90aGVyLmRlYnVnICk6DQogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IG90aGVyLmV4cHJzWzpdICsgWyBzZWxmLmV4cHJzWzFdIF0NCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSB8PSBvdGhlci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciAgfD0gb3RoZXIubWF5SW5kZXhFcnJvcg0KDQogICAgICAgICAgICBvdGhlciA9IHNlbGYuZXhwcnNbLTFdDQogICAgICAgICAgICBpZiAoIGlzaW5zdGFuY2UoIG90aGVyLCBzZWxmLl9fY2xhc3NfXyApIGFuZA0KICAgICAgICAgICAgICAgICAgbm90KG90aGVyLnBhcnNlQWN0aW9uKSBhbmQNCiAgICAgICAgICAgICAgICAgIG90aGVyLnJlc3VsdHNOYW1lIGlzIE5vbmUgYW5kDQogICAgICAgICAgICAgICAgICBub3Qgb3RoZXIuZGVidWcgKToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gc2VsZi5leHByc1s6LTFdICsgb3RoZXIuZXhwcnNbOl0NCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSB8PSBvdGhlci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciAgfD0gb3RoZXIubWF5SW5kZXhFcnJvcg0KDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBfdXN0cihzZWxmKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRSZXN1bHRzTmFtZSggc2VsZiwgbmFtZSwgbGlzdEFsbE1hdGNoZXM9RmFsc2UgKToNCiAgICAgICAgcmV0ID0gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLnNldFJlc3VsdHNOYW1lKG5hbWUsbGlzdEFsbE1hdGNoZXMpDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS52YWxpZGF0ZSh0bXApDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkNCiAgICAgICAgDQogICAgZGVmIGNvcHkoc2VsZik6DQogICAgICAgIHJldCA9IHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5jb3B5KCkNCiAgICAgICAgcmV0LmV4cHJzID0gW2UuY29weSgpIGZvciBlIGluIHNlbGYuZXhwcnNdDQogICAgICAgIHJldHVybiByZXQNCg0KY2xhc3MgQW5kKFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgYWxsIGdpdmVuIEN7UGFyc2VFeHByZXNzaW9ufXMgdG8gYmUgZm91bmQgaW4gdGhlIGdpdmVuIG9yZGVyLg0KICAgIEV4cHJlc3Npb25zIG1heSBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4NCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7JysnfSBvcGVyYXRvci4NCiAgICBNYXkgYWxzbyBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snLSd9IG9wZXJhdG9yLCB3aGljaCB3aWxsIHN1cHByZXNzIGJhY2t0cmFja2luZy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBuYW1lX2V4cHIgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQ0KDQogICAgICAgIGV4cHIgPSBBbmQoW2ludGVnZXIoImlkIiksbmFtZV9leHByKCJuYW1lIiksaW50ZWdlcigiYWdlIildKQ0KICAgICAgICAjIG1vcmUgZWFzaWx5IHdyaXR0ZW4gYXM6DQogICAgICAgIGV4cHIgPSBpbnRlZ2VyKCJpZCIpICsgbmFtZV9leHByKCJuYW1lIikgKyBpbnRlZ2VyKCJhZ2UiKQ0KICAgICIiIg0KDQogICAgY2xhc3MgX0Vycm9yU3RvcChFbXB0eSk6DQogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KICAgICAgICAgICAgc3VwZXIoQW5kLl9FcnJvclN0b3Asc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQ0KICAgICAgICAgICAgc2VsZi5uYW1lID0gJy0nDQogICAgICAgICAgICBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQoNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IFRydWUgKToNCiAgICAgICAgc3VwZXIoQW5kLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFsbChlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLmV4cHJzWzBdLndoaXRlQ2hhcnMgKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gc2VsZi5leHByc1swXS5za2lwV2hpdGVzcGFjZQ0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgICMgcGFzcyBGYWxzZSBhcyBsYXN0IGFyZyB0byBfcGFyc2UgZm9yIGZpcnN0IGVsZW1lbnQsIHNpbmNlIHdlIGFscmVhZHkNCiAgICAgICAgIyBwcmUtcGFyc2VkIHRoZSBzdHJpbmcgYXMgcGFydCBvZiBvdXIgQW5kIHByZS1wYXJzaW5nDQogICAgICAgIGxvYywgcmVzdWx0bGlzdCA9IHNlbGYuZXhwcnNbMF0uX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIGVycm9yU3RvcCA9IEZhbHNlDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnNbMTpdOg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLCBBbmQuX0Vycm9yU3RvcCk6DQogICAgICAgICAgICAgICAgZXJyb3JTdG9wID0gVHJ1ZQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBpZiBlcnJvclN0b3A6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBsb2MsIGV4cHJ0b2tlbnMgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VTeW50YXhFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgICAgICAgICAgcGUuX190cmFjZWJhY2tfXyA9IE5vbmUNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VTeW50YXhFeGNlcHRpb24uX2Zyb21fZXhjZXB0aW9uKHBlKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZVN5bnRheEV4Y2VwdGlvbihpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGxvYywgZXhwcnRva2VucyA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgaWYgZXhwcnRva2VucyBvciBleHBydG9rZW5zLmhhc2tleXMoKToNCiAgICAgICAgICAgICAgICByZXN1bHRsaXN0ICs9IGV4cHJ0b2tlbnMNCiAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0bGlzdA0KDQogICAgZGVmIF9faWFkZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI0FuZCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQogICAgICAgICAgICBpZiBub3QgZS5tYXlSZXR1cm5FbXB0eToNCiAgICAgICAgICAgICAgICBicmVhaw0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBPcihQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIEN7UGFyc2VFeHByZXNzaW9ufSBpcyBmb3VuZC4NCiAgICBJZiB0d28gZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyB0aGUgbG9uZ2VzdCBzdHJpbmcgd2lsbCBiZSB1c2VkLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snXid9IG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgY29uc3RydWN0IE9yIHVzaW5nICdeJyBvcGVyYXRvcg0KICAgICAgICANCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKSBeIENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpDQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snMTIzJ10sIFsnMy4xNDE2J10sIFsnNzg5J11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOg0KICAgICAgICBzdXBlcihPcixzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpDQogICAgICAgIGlmIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYW55KGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBtYXhFeGNMb2MgPSAtMQ0KICAgICAgICBtYXhFeGNlcHRpb24gPSBOb25lDQogICAgICAgIG1hdGNoZXMgPSBbXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGxvYzIgPSBlLnRyeVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgZXJyLl9fdHJhY2ViYWNrX18gPSBOb25lDQogICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MNCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgIGlmIGxlbihpbnN0cmluZykgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxlbihpbnN0cmluZyksZS5lcnJtc2csc2VsZikNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIHNhdmUgbWF0Y2ggYW1vbmcgYWxsIG1hdGNoZXMsIHRvIHJldHJ5IGxvbmdlc3QgdG8gc2hvcnRlc3QNCiAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgobG9jMiwgZSkpDQoNCiAgICAgICAgaWYgbWF0Y2hlczoNCiAgICAgICAgICAgIG1hdGNoZXMuc29ydChrZXk9bGFtYmRhIHg6IC14WzBdKQ0KICAgICAgICAgICAgZm9yIF8sZSBpbiBtYXRjaGVzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgICAgIGVyci5fX3RyYWNlYmFja19fID0gTm9uZQ0KICAgICAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyDQogICAgICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jDQoNCiAgICAgICAgaWYgbWF4RXhjZXB0aW9uIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgbWF4RXhjZXB0aW9uLm1zZyA9IHNlbGYuZXJybXNnDQogICAgICAgICAgICByYWlzZSBtYXhFeGNlcHRpb24NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsICJubyBkZWZpbmVkIGFsdGVybmF0aXZlcyB0byBtYXRjaCIsIHNlbGYpDQoNCg0KICAgIGRlZiBfX2l4b3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgcmV0dXJuIHNlbGYuYXBwZW5kKCBvdGhlciApICNPciggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiBeICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQoNCg0KY2xhc3MgTWF0Y2hGaXJzdChQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIEN7UGFyc2VFeHByZXNzaW9ufSBpcyBmb3VuZC4NCiAgICBJZiB0d28gZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBmaXJzdCBvbmUgbGlzdGVkIGlzIHRoZSBvbmUgdGhhdCB3aWxsIG1hdGNoLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snfCd9IG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgY29uc3RydWN0IE1hdGNoRmlyc3QgdXNpbmcgJ3wnIG9wZXJhdG9yDQogICAgICAgIA0KICAgICAgICAjIHdhdGNoIHRoZSBvcmRlciBvZiBleHByZXNzaW9ucyB0byBtYXRjaA0KICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpIHwgQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkNCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkgIyAgRmFpbCEgLT4gW1snMTIzJ10sIFsnMyddLCBbJzE0MTYnXSwgWyc3ODknXV0NCg0KICAgICAgICAjIHB1dCBtb3JlIHNlbGVjdGl2ZSBleHByZXNzaW9uIGZpcnN0DQogICAgICAgIG51bWJlciA9IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpIHwgV29yZChudW1zKQ0KICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKSAjICBCZXR0ZXIgLT4gW1snMTIzJ10sIFsnMy4xNDE2J10sIFsnNzg5J11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOg0KICAgICAgICBzdXBlcihNYXRjaEZpcnN0LHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgaWYgc2VsZi5leHByczoNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbnkoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIG1heEV4Y0xvYyA9IC0xDQogICAgICAgIG1heEV4Y2VwdGlvbiA9IE5vbmUNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXQgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICByZXR1cm4gcmV0DQogICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IGVycg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jDQogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICBpZiBsZW4oaW5zdHJpbmcpID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsZW4oaW5zdHJpbmcpLGUuZXJybXNnLHNlbGYpDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGxlbihpbnN0cmluZykNCg0KICAgICAgICAjIG9ubHkgZ290IGhlcmUgaWYgbm8gZXhwcmVzc2lvbiBtYXRjaGVkLCByYWlzZSBleGNlcHRpb24gZm9yIG1hdGNoIHRoYXQgbWFkZSBpdCB0aGUgZnVydGhlc3QNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIG1heEV4Y2VwdGlvbiBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cNCiAgICAgICAgICAgICAgICByYWlzZSBtYXhFeGNlcHRpb24NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgIm5vIGRlZmluZWQgYWx0ZXJuYXRpdmVzIHRvIG1hdGNoIiwgc2VsZikNCg0KICAgIGRlZiBfX2lvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI01hdGNoRmlyc3QoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgfCAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQoNCmNsYXNzIEVhY2goUGFyc2VFeHByZXNzaW9uKToNCiAgICAiIiINCiAgICBSZXF1aXJlcyBhbGwgZ2l2ZW4gQ3tQYXJzZUV4cHJlc3Npb259cyB0byBiZSBmb3VuZCwgYnV0IGluIGFueSBvcmRlci4NCiAgICBFeHByZXNzaW9ucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeycmJ30gb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgY29sb3IgPSBvbmVPZigiUkVEIE9SQU5HRSBZRUxMT1cgR1JFRU4gQkxVRSBQVVJQTEUgQkxBQ0sgV0hJVEUgQlJPV04iKQ0KICAgICAgICBzaGFwZV90eXBlID0gb25lT2YoIlNRVUFSRSBDSVJDTEUgVFJJQU5HTEUgU1RBUiBIRVhBR09OIE9DVEFHT04iKQ0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBzaGFwZV9hdHRyID0gInNoYXBlOiIgKyBzaGFwZV90eXBlKCJzaGFwZSIpDQogICAgICAgIHBvc25fYXR0ciA9ICJwb3NuOiIgKyBHcm91cChpbnRlZ2VyKCJ4IikgKyAnLCcgKyBpbnRlZ2VyKCJ5IikpKCJwb3NuIikNCiAgICAgICAgY29sb3JfYXR0ciA9ICJjb2xvcjoiICsgY29sb3IoImNvbG9yIikNCiAgICAgICAgc2l6ZV9hdHRyID0gInNpemU6IiArIGludGVnZXIoInNpemUiKQ0KDQogICAgICAgICMgdXNlIEVhY2ggKHVzaW5nIG9wZXJhdG9yICcmJykgdG8gYWNjZXB0IGF0dHJpYnV0ZXMgaW4gYW55IG9yZGVyIA0KICAgICAgICAjIChzaGFwZSBhbmQgcG9zbiBhcmUgcmVxdWlyZWQsIGNvbG9yIGFuZCBzaXplIGFyZSBvcHRpb25hbCkNCiAgICAgICAgc2hhcGVfc3BlYyA9IHNoYXBlX2F0dHIgJiBwb3NuX2F0dHIgJiBPcHRpb25hbChjb2xvcl9hdHRyKSAmIE9wdGlvbmFsKHNpemVfYXR0cikNCg0KICAgICAgICBzaGFwZV9zcGVjLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgc2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogMTAwLCAxMjANCiAgICAgICAgICAgIHNoYXBlOiBDSVJDTEUgc2l6ZTogNTAgY29sb3I6IEJMVUUgcG9zbjogNTAsODANCiAgICAgICAgICAgIGNvbG9yOkdSRUVOIHNpemU6MjAgc2hhcGU6VFJJQU5HTEUgcG9zbjoyMCw0MA0KICAgICAgICAgICAgJycnDQogICAgICAgICAgICApDQogICAgcHJpbnRzOjoNCiAgICAgICAgc2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogMTAwLCAxMjANCiAgICAgICAgWydzaGFwZTonLCAnU1FVQVJFJywgJ2NvbG9yOicsICdCTEFDSycsICdwb3NuOicsIFsnMTAwJywgJywnLCAnMTIwJ11dDQogICAgICAgIC0gY29sb3I6IEJMQUNLDQogICAgICAgIC0gcG9zbjogWycxMDAnLCAnLCcsICcxMjAnXQ0KICAgICAgICAgIC0geDogMTAwDQogICAgICAgICAgLSB5OiAxMjANCiAgICAgICAgLSBzaGFwZTogU1FVQVJFDQoNCg0KICAgICAgICBzaGFwZTogQ0lSQ0xFIHNpemU6IDUwIGNvbG9yOiBCTFVFIHBvc246IDUwLDgwDQogICAgICAgIFsnc2hhcGU6JywgJ0NJUkNMRScsICdzaXplOicsICc1MCcsICdjb2xvcjonLCAnQkxVRScsICdwb3NuOicsIFsnNTAnLCAnLCcsICc4MCddXQ0KICAgICAgICAtIGNvbG9yOiBCTFVFDQogICAgICAgIC0gcG9zbjogWyc1MCcsICcsJywgJzgwJ10NCiAgICAgICAgICAtIHg6IDUwDQogICAgICAgICAgLSB5OiA4MA0KICAgICAgICAtIHNoYXBlOiBDSVJDTEUNCiAgICAgICAgLSBzaXplOiA1MA0KDQoNCiAgICAgICAgY29sb3I6IEdSRUVOIHNpemU6IDIwIHNoYXBlOiBUUklBTkdMRSBwb3NuOiAyMCw0MA0KICAgICAgICBbJ2NvbG9yOicsICdHUkVFTicsICdzaXplOicsICcyMCcsICdzaGFwZTonLCAnVFJJQU5HTEUnLCAncG9zbjonLCBbJzIwJywgJywnLCAnNDAnXV0NCiAgICAgICAgLSBjb2xvcjogR1JFRU4NCiAgICAgICAgLSBwb3NuOiBbJzIwJywgJywnLCAnNDAnXQ0KICAgICAgICAgIC0geDogMjANCiAgICAgICAgICAtIHk6IDQwDQogICAgICAgIC0gc2hhcGU6IFRSSUFOR0xFDQogICAgICAgIC0gc2l6ZTogMjANCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IFRydWUgKToNCiAgICAgICAgc3VwZXIoRWFjaCxzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbGwoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLmluaXRFeHByR3JvdXBzID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5pbml0RXhwckdyb3VwczoNCiAgICAgICAgICAgIHNlbGYub3B0MW1hcCA9IGRpY3QoKGlkKGUuZXhwciksZSkgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpKQ0KICAgICAgICAgICAgb3B0MSA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSBdDQogICAgICAgICAgICBvcHQyID0gWyBlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgZS5tYXlSZXR1cm5FbXB0eSBhbmQgbm90IGlzaW5zdGFuY2UoZSxPcHRpb25hbCldDQogICAgICAgICAgICBzZWxmLm9wdGlvbmFscyA9IG9wdDEgKyBvcHQyDQogICAgICAgICAgICBzZWxmLm11bHRpb3B0aW9uYWxzID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsWmVyb09yTW9yZSkgXQ0KICAgICAgICAgICAgc2VsZi5tdWx0aXJlcXVpcmVkID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT25lT3JNb3JlKSBdDQogICAgICAgICAgICBzZWxmLnJlcXVpcmVkID0gWyBlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgbm90IGlzaW5zdGFuY2UoZSwoT3B0aW9uYWwsWmVyb09yTW9yZSxPbmVPck1vcmUpKSBdDQogICAgICAgICAgICBzZWxmLnJlcXVpcmVkICs9IHNlbGYubXVsdGlyZXF1aXJlZA0KICAgICAgICAgICAgc2VsZi5pbml0RXhwckdyb3VwcyA9IEZhbHNlDQogICAgICAgIHRtcExvYyA9IGxvYw0KICAgICAgICB0bXBSZXFkID0gc2VsZi5yZXF1aXJlZFs6XQ0KICAgICAgICB0bXBPcHQgID0gc2VsZi5vcHRpb25hbHNbOl0NCiAgICAgICAgbWF0Y2hPcmRlciA9IFtdDQoNCiAgICAgICAga2VlcE1hdGNoaW5nID0gVHJ1ZQ0KICAgICAgICB3aGlsZSBrZWVwTWF0Y2hpbmc6DQogICAgICAgICAgICB0bXBFeHBycyA9IHRtcFJlcWQgKyB0bXBPcHQgKyBzZWxmLm11bHRpb3B0aW9uYWxzICsgc2VsZi5tdWx0aXJlcXVpcmVkDQogICAgICAgICAgICBmYWlsZWQgPSBbXQ0KICAgICAgICAgICAgZm9yIGUgaW4gdG1wRXhwcnM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICB0bXBMb2MgPSBlLnRyeVBhcnNlKCBpbnN0cmluZywgdG1wTG9jICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIGZhaWxlZC5hcHBlbmQoZSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaE9yZGVyLmFwcGVuZChzZWxmLm9wdDFtYXAuZ2V0KGlkKGUpLGUpKQ0KICAgICAgICAgICAgICAgICAgICBpZiBlIGluIHRtcFJlcWQ6DQogICAgICAgICAgICAgICAgICAgICAgICB0bXBSZXFkLnJlbW92ZShlKQ0KICAgICAgICAgICAgICAgICAgICBlbGlmIGUgaW4gdG1wT3B0Og0KICAgICAgICAgICAgICAgICAgICAgICAgdG1wT3B0LnJlbW92ZShlKQ0KICAgICAgICAgICAgaWYgbGVuKGZhaWxlZCkgPT0gbGVuKHRtcEV4cHJzKToNCiAgICAgICAgICAgICAgICBrZWVwTWF0Y2hpbmcgPSBGYWxzZQ0KDQogICAgICAgIGlmIHRtcFJlcWQ6DQogICAgICAgICAgICBtaXNzaW5nID0gIiwgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHRtcFJlcWQpDQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsb2MsIk1pc3Npbmcgb25lIG9yIG1vcmUgcmVxdWlyZWQgZWxlbWVudHMgKCVzKSIgJSBtaXNzaW5nICkNCg0KICAgICAgICAjIGFkZCBhbnkgdW5tYXRjaGVkIE9wdGlvbmFscywgaW4gY2FzZSB0aGV5IGhhdmUgZGVmYXVsdCB2YWx1ZXMgZGVmaW5lZA0KICAgICAgICBtYXRjaE9yZGVyICs9IFtlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSBhbmQgZS5leHByIGluIHRtcE9wdF0NCg0KICAgICAgICByZXN1bHRsaXN0ID0gW10NCiAgICAgICAgZm9yIGUgaW4gbWF0Y2hPcmRlcjoNCiAgICAgICAgICAgIGxvYyxyZXN1bHRzID0gZS5fcGFyc2UoaW5zdHJpbmcsbG9jLGRvQWN0aW9ucykNCiAgICAgICAgICAgIHJlc3VsdGxpc3QuYXBwZW5kKHJlc3VsdHMpDQoNCiAgICAgICAgZmluYWxSZXN1bHRzID0gc3VtKHJlc3VsdGxpc3QsIFBhcnNlUmVzdWx0cyhbXSkpDQogICAgICAgIHJldHVybiBsb2MsIGZpbmFsUmVzdWx0cw0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiICYgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KDQpjbGFzcyBQYXJzZUVsZW1lbnRFbmhhbmNlKFBhcnNlckVsZW1lbnQpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIEN7UGFyc2VyRWxlbWVudH0sIGZvciBjb21iaW5pbmcgYW5kIHBvc3QtcHJvY2Vzc2luZyBwYXJzZWQgdG9rZW5zLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5fX2luaXRfXyhzYXZlbGlzdCkNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgaWYgaXNzdWJjbGFzcyhQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MsIFRva2VuKToNCiAgICAgICAgICAgICAgICBleHByID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGV4cHIpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGV4cHIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoTGl0ZXJhbChleHByKSkNCiAgICAgICAgc2VsZi5leHByID0gZXhwcg0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIGlmIGV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBleHByLm1heUluZGV4RXJyb3INCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBleHByLm1heVJldHVybkVtcHR5DQogICAgICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggZXhwci53aGl0ZUNoYXJzICkNCiAgICAgICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBleHByLnNraXBXaGl0ZXNwYWNlDQogICAgICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBleHByLnNhdmVBc0xpc3QNCiAgICAgICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gZXhwci5jYWxsUHJlcGFyc2UNCiAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuZXh0ZW5kKGV4cHIuaWdub3JlRXhwcnMpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5leHByLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIiIsbG9jLHNlbGYuZXJybXNnLHNlbGYpDQoNCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLmV4cHIgPSBzZWxmLmV4cHIuY29weSgpDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6DQogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBzdXBlciggUGFyc2VFbGVtZW50RW5oYW5jZSwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLmV4cHIuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzdXBlciggUGFyc2VFbGVtZW50RW5oYW5jZSwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgc2VsZi5leHByLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5zdHJlYW1saW5lKCkNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLnN0cmVhbWxpbmUoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIGlmIHNlbGYgaW4gcGFyc2VFbGVtZW50TGlzdDoNCiAgICAgICAgICAgIHJhaXNlIFJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24oIHBhcnNlRWxlbWVudExpc3QrW3NlbGZdICkNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQ0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLmV4cHIudmFsaWRhdGUodG1wKQ0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKCBbXSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZSBhbmQgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiVzOiglcykiICUgKCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgX3VzdHIoc2VsZi5leHByKSApDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBGb2xsb3dlZEJ5KFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIExvb2thaGVhZCBtYXRjaGluZyBvZiB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIEN7Rm9sbG93ZWRCeX0NCiAgICBkb2VzIEl7bm90fSBhZHZhbmNlIHRoZSBwYXJzaW5nIHBvc2l0aW9uIHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nLCBpdCBvbmx5DQogICAgdmVyaWZpZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHBhcnNlIGV4cHJlc3Npb24gbWF0Y2hlcyBhdCB0aGUgY3VycmVudA0KICAgIHBvc2l0aW9uLiAgQ3tGb2xsb3dlZEJ5fSBhbHdheXMgcmV0dXJucyBhIG51bGwgdG9rZW4gbGlzdC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIHVzZSBGb2xsb3dlZEJ5IHRvIG1hdGNoIGEgbGFiZWwgb25seSBpZiBpdCBpcyBmb2xsb3dlZCBieSBhICc6Jw0KICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykNCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIA0KICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZygic2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogdXBwZXIgbGVmdCIpLnBwcmludCgpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsnY29sb3InLCAnQkxBQ0snXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToNCiAgICAgICAgc3VwZXIoRm9sbG93ZWRCeSxzZWxmKS5fX2luaXRfXyhleHByKQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc2VsZi5leHByLnRyeVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KDQpjbGFzcyBOb3RBbnkoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgTG9va2FoZWFkIHRvIGRpc2FsbG93IG1hdGNoaW5nIHdpdGggdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBDe05vdEFueX0NCiAgICBkb2VzIEl7bm90fSBhZHZhbmNlIHRoZSBwYXJzaW5nIHBvc2l0aW9uIHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nLCBpdCBvbmx5DQogICAgdmVyaWZpZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHBhcnNlIGV4cHJlc3Npb24gZG9lcyBJe25vdH0gbWF0Y2ggYXQgdGhlIGN1cnJlbnQNCiAgICBwb3NpdGlvbi4gIEFsc28sIEN7Tm90QW55fSBkb2VzIEl7bm90fSBza2lwIG92ZXIgbGVhZGluZyB3aGl0ZXNwYWNlLiBDe05vdEFueX0NCiAgICBhbHdheXMgcmV0dXJucyBhIG51bGwgdG9rZW4gbGlzdC4gIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgJ34nIG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIA0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihOb3RBbnksc2VsZikuX19pbml0X18oZXhwcikNCiAgICAgICAgI34gc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UgICMgZG8gTk9UIHVzZSBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpLCBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZSB0byBleHBycw0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJGb3VuZCB1bndhbnRlZCB0b2tlbiwgIitfdXN0cihzZWxmLmV4cHIpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmV4cHIuY2FuUGFyc2VOZXh0KGluc3RyaW5nLCBsb2MpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ+eyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBfTXVsdGlwbGVNYXRjaChQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHN0b3BPbj1Ob25lKToNCiAgICAgICAgc3VwZXIoX011bHRpcGxlTWF0Y2gsIHNlbGYpLl9faW5pdF9fKGV4cHIpDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCiAgICAgICAgZW5kZXIgPSBzdG9wT24NCiAgICAgICAgaWYgaXNpbnN0YW5jZShlbmRlciwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBlbmRlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhlbmRlcikNCiAgICAgICAgc2VsZi5ub3RfZW5kZXIgPSB+ZW5kZXIgaWYgZW5kZXIgaXMgbm90IE5vbmUgZWxzZSBOb25lDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzZWxmX2V4cHJfcGFyc2UgPSBzZWxmLmV4cHIuX3BhcnNlDQogICAgICAgIHNlbGZfc2tpcF9pZ25vcmFibGVzID0gc2VsZi5fc2tpcElnbm9yYWJsZXMNCiAgICAgICAgY2hlY2tfZW5kZXIgPSBzZWxmLm5vdF9lbmRlciBpcyBub3QgTm9uZQ0KICAgICAgICBpZiBjaGVja19lbmRlcjoNCiAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIgPSBzZWxmLm5vdF9lbmRlci50cnlQYXJzZQ0KICAgICAgICANCiAgICAgICAgIyBtdXN0IGJlIGF0IGxlYXN0IG9uZSAoYnV0IGZpcnN0IHNlZSBpZiB3ZSBhcmUgdGhlIHN0b3BPbiBzZW50aW5lbDsNCiAgICAgICAgIyBpZiBzbywgZmFpbCkNCiAgICAgICAgaWYgY2hlY2tfZW5kZXI6DQogICAgICAgICAgICB0cnlfbm90X2VuZGVyKGluc3RyaW5nLCBsb2MpDQogICAgICAgIGxvYywgdG9rZW5zID0gc2VsZl9leHByX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGhhc0lnbm9yZUV4cHJzID0gKG5vdCBub3Qgc2VsZi5pZ25vcmVFeHBycykNCiAgICAgICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICAgICAgaWYgY2hlY2tfZW5kZXI6DQogICAgICAgICAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIoaW5zdHJpbmcsIGxvYykNCiAgICAgICAgICAgICAgICBpZiBoYXNJZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZl9za2lwX2lnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYw0KICAgICAgICAgICAgICAgIGxvYywgdG1wdG9rZW5zID0gc2VsZl9leHByX3BhcnNlKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGlmIHRtcHRva2VucyBvciB0bXB0b2tlbnMuaGFza2V5cygpOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgKz0gdG1wdG9rZW5zDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgcmV0dXJuIGxvYywgdG9rZW5zDQogICAgICAgIA0KY2xhc3MgT25lT3JNb3JlKF9NdWx0aXBsZU1hdGNoKToNCiAgICAiIiINCiAgICBSZXBldGl0aW9uIG9mIG9uZSBvciBtb3JlIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLg0KICAgIA0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIG9uZSBvciBtb3JlIHRpbWVzDQogICAgIC0gc3RvcE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgLSBleHByZXNzaW9uIGZvciBhIHRlcm1pbmF0aW5nIHNlbnRpbmVsDQogICAgICAgICAgKG9ubHkgcmVxdWlyZWQgaWYgdGhlIHNlbnRpbmVsIHdvdWxkIG9yZGluYXJpbHkgbWF0Y2ggdGhlIHJlcGV0aXRpb24gDQogICAgICAgICAgZXhwcmVzc2lvbikgICAgICAgICAgDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpDQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCg0KICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogQkxBQ0siDQogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpICAjIEZhaWwhIHJlYWQgJ2NvbG9yJyBhcyBkYXRhIGluc3RlYWQgb2YgbmV4dCBsYWJlbCAtPiBbWydzaGFwZScsICdTUVVBUkUgY29sb3InXV0NCg0KICAgICAgICAjIHVzZSBzdG9wT24gYXR0cmlidXRlIGZvciBPbmVPck1vcmUgdG8gYXZvaWQgcmVhZGluZyBsYWJlbCBzdHJpbmcgYXMgcGFydCBvZiB0aGUgZGF0YQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkgIyBCZXR0ZXIgLT4gW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnQkxBQ0snXV0NCiAgICAgICAgDQogICAgICAgICMgY291bGQgYWxzbyBiZSB3cml0dGVuIGFzDQogICAgICAgIChhdHRyX2V4cHIgKiAoMSwpKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKQ0KICAgICIiIg0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIn0uLi4iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBaZXJvT3JNb3JlKF9NdWx0aXBsZU1hdGNoKToNCiAgICAiIiINCiAgICBPcHRpb25hbCByZXBldGl0aW9uIG9mIHplcm8gb3IgbW9yZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4NCiAgICANCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCB6ZXJvIG9yIG1vcmUgdGltZXMNCiAgICAgLSBzdG9wT24gLSAoZGVmYXVsdD1De05vbmV9KSAtIGV4cHJlc3Npb24gZm9yIGEgdGVybWluYXRpbmcgc2VudGluZWwNCiAgICAgICAgICAob25seSByZXF1aXJlZCBpZiB0aGUgc2VudGluZWwgd291bGQgb3JkaW5hcmlseSBtYXRjaCB0aGUgcmVwZXRpdGlvbiANCiAgICAgICAgICBleHByZXNzaW9uKSAgICAgICAgICANCg0KICAgIEV4YW1wbGU6IHNpbWlsYXIgdG8gTHtPbmVPck1vcmV9DQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzdG9wT249Tm9uZSk6DQogICAgICAgIHN1cGVyKFplcm9Pck1vcmUsc2VsZikuX19pbml0X18oZXhwciwgc3RvcE9uPXN0b3BPbikNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFplcm9Pck1vcmUsIHNlbGYpLnBhcnNlSW1wbChpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMpDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6DQogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiWyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIl0uLi4iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBfTnVsbFRva2VuKG9iamVjdCk6DQogICAgZGVmIF9fYm9vbF9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gRmFsc2UNCiAgICBfX25vbnplcm9fXyA9IF9fYm9vbF9fDQogICAgZGVmIF9fc3RyX18oc2VsZik6DQogICAgICAgIHJldHVybiAiIg0KDQpfb3B0aW9uYWxOb3RNYXRjaGVkID0gX051bGxUb2tlbigpDQpjbGFzcyBPcHRpb25hbChQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBPcHRpb25hbCBtYXRjaGluZyBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIHplcm8gb3IgbW9yZSB0aW1lcw0KICAgICAtIGRlZmF1bHQgKG9wdGlvbmFsKSAtIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIHRoZSBvcHRpb25hbCBleHByZXNzaW9uIGlzIG5vdCBmb3VuZC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIFVTIHBvc3RhbCBjb2RlIGNhbiBiZSBhIDUtZGlnaXQgemlwLCBwbHVzIG9wdGlvbmFsIDQtZGlnaXQgcXVhbGlmaWVyDQogICAgICAgIHppcCA9IENvbWJpbmUoV29yZChudW1zLCBleGFjdD01KSArIE9wdGlvbmFsKCctJyArIFdvcmQobnVtcywgZXhhY3Q9NCkpKQ0KICAgICAgICB6aXAucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIHRyYWRpdGlvbmFsIFpJUCBjb2RlDQogICAgICAgICAgICAxMjM0NQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIFpJUCs0IGZvcm0NCiAgICAgICAgICAgIDEyMTAxLTAwMDENCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBpbnZhbGlkIFpJUA0KICAgICAgICAgICAgOTg3NjUtDQogICAgICAgICAgICAnJycpDQogICAgcHJpbnRzOjoNCiAgICAgICAgIyB0cmFkaXRpb25hbCBaSVAgY29kZQ0KICAgICAgICAxMjM0NQ0KICAgICAgICBbJzEyMzQ1J10NCg0KICAgICAgICAjIFpJUCs0IGZvcm0NCiAgICAgICAgMTIxMDEtMDAwMQ0KICAgICAgICBbJzEyMTAxLTAwMDEnXQ0KDQogICAgICAgICMgaW52YWxpZCBaSVANCiAgICAgICAgOTg3NjUtDQogICAgICAgICAgICAgXg0KICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciA1KSwgKGxpbmU6MSwgY29sOjYpDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBkZWZhdWx0PV9vcHRpb25hbE5vdE1hdGNoZWQgKToNCiAgICAgICAgc3VwZXIoT3B0aW9uYWwsc2VsZikuX19pbml0X18oIGV4cHIsIHNhdmVsaXN0PUZhbHNlICkNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2VsZi5leHByLnNhdmVBc0xpc3QNCiAgICAgICAgc2VsZi5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0DQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBsb2MsIHRva2VucyA9IHNlbGYuZXhwci5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToNCiAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdFZhbHVlIGlzIG5vdCBfb3B0aW9uYWxOb3RNYXRjaGVkOg0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZXhwci5yZXN1bHRzTmFtZToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gUGFyc2VSZXN1bHRzKFsgc2VsZi5kZWZhdWx0VmFsdWUgXSkNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zW3NlbGYuZXhwci5yZXN1bHRzTmFtZV0gPSBzZWxmLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IFsgc2VsZi5kZWZhdWx0VmFsdWUgXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICB0b2tlbnMgPSBbXQ0KICAgICAgICByZXR1cm4gbG9jLCB0b2tlbnMNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlsiICsgX3VzdHIoc2VsZi5leHByKSArICJdIg0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgU2tpcFRvKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIFRva2VuIGZvciBza2lwcGluZyBvdmVyIGFsbCB1bmRlZmluZWQgdGV4dCB1bnRpbCB0aGUgbWF0Y2hlZCBleHByZXNzaW9uIGlzIGZvdW5kLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gdGFyZ2V0IGV4cHJlc3Npb24gbWFya2luZyB0aGUgZW5kIG9mIHRoZSBkYXRhIHRvIGJlIHNraXBwZWQNCiAgICAgLSBpbmNsdWRlIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGlmIFRydWUsIHRoZSB0YXJnZXQgZXhwcmVzc2lvbiBpcyBhbHNvIHBhcnNlZCANCiAgICAgICAgICAodGhlIHNraXBwZWQgdGV4dCBhbmQgdGFyZ2V0IGV4cHJlc3Npb24gYXJlIHJldHVybmVkIGFzIGEgMi1lbGVtZW50IGxpc3QpLg0KICAgICAtIGlnbm9yZSAtIChkZWZhdWx0PUN7Tm9uZX0pIHVzZWQgdG8gZGVmaW5lIGdyYW1tYXJzICh0eXBpY2FsbHkgcXVvdGVkIHN0cmluZ3MgYW5kIA0KICAgICAgICAgIGNvbW1lbnRzKSB0aGF0IG1pZ2h0IGNvbnRhaW4gZmFsc2UgbWF0Y2hlcyB0byB0aGUgdGFyZ2V0IGV4cHJlc3Npb24NCiAgICAgLSBmYWlsT24gLSAoZGVmYXVsdD1De05vbmV9KSBkZWZpbmUgZXhwcmVzc2lvbnMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgDQogICAgICAgICAgaW5jbHVkZWQgaW4gdGhlIHNraXBwZWQgdGVzdDsgaWYgZm91bmQgYmVmb3JlIHRoZSB0YXJnZXQgZXhwcmVzc2lvbiBpcyBmb3VuZCwgDQogICAgICAgICAgdGhlIFNraXBUbyBpcyBub3QgYSBtYXRjaA0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHJlcG9ydCA9ICcnJw0KICAgICAgICAgICAgT3V0c3RhbmRpbmcgSXNzdWVzIFJlcG9ydCAtIDEgSmFuIDIwMDANCg0KICAgICAgICAgICAgICAgIyB8IFNldmVyaXR5IHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRGF5cyBPcGVuDQogICAgICAgICAgICAtLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0NCiAgICAgICAgICAgICAxMDEgfCBDcml0aWNhbCB8IEludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2ggICAgICAgICAgICAgICAgIHwgICAgICAgICAgNg0KICAgICAgICAgICAgICA5NCB8IENvc21ldGljIHwgU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpICAgICAgICAgfCAgICAgICAgIDE0DQogICAgICAgICAgICAgIDc5IHwgTWlub3IgICAgfCBTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cyB8ICAgICAgICAgNDcNCiAgICAgICAgICAgICcnJw0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBTRVAgPSBTdXBwcmVzcygnfCcpDQogICAgICAgICMgdXNlIFNraXBUbyB0byBzaW1wbHkgbWF0Y2ggZXZlcnl0aGluZyB1cCB1bnRpbCB0aGUgbmV4dCBTRVANCiAgICAgICAgIyAtIGlnbm9yZSBxdW90ZWQgc3RyaW5ncywgc28gdGhhdCBhICd8JyBjaGFyYWN0ZXIgaW5zaWRlIGEgcXVvdGVkIHN0cmluZyBkb2VzIG5vdCBtYXRjaA0KICAgICAgICAjIC0gcGFyc2UgYWN0aW9uIHdpbGwgY2FsbCB0b2tlbi5zdHJpcCgpIGZvciBlYWNoIG1hdGNoZWQgdG9rZW4sIGkuZS4sIHRoZSBkZXNjcmlwdGlvbiBib2R5DQogICAgICAgIHN0cmluZ19kYXRhID0gU2tpcFRvKFNFUCwgaWdub3JlPXF1b3RlZFN0cmluZykNCiAgICAgICAgc3RyaW5nX2RhdGEuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnN0cmlwKSkNCiAgICAgICAgdGlja2V0X2V4cHIgPSAoaW50ZWdlcigiaXNzdWVfbnVtIikgKyBTRVAgDQogICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmdfZGF0YSgic2V2IikgKyBTRVAgDQogICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmdfZGF0YSgiZGVzYyIpICsgU0VQIA0KICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlcigiZGF5c19vcGVuIikpDQogICAgICAgIA0KICAgICAgICBmb3IgdGt0IGluIHRpY2tldF9leHByLnNlYXJjaFN0cmluZyhyZXBvcnQpOg0KICAgICAgICAgICAgcHJpbnQgdGt0LmR1bXAoKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnMTAxJywgJ0NyaXRpY2FsJywgJ0ludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2gnLCAnNiddDQogICAgICAgIC0gZGF5c19vcGVuOiA2DQogICAgICAgIC0gZGVzYzogSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaA0KICAgICAgICAtIGlzc3VlX251bTogMTAxDQogICAgICAgIC0gc2V2OiBDcml0aWNhbA0KICAgICAgICBbJzk0JywgJ0Nvc21ldGljJywgIlNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKSIsICcxNCddDQogICAgICAgIC0gZGF5c19vcGVuOiAxNA0KICAgICAgICAtIGRlc2M6IFNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKQ0KICAgICAgICAtIGlzc3VlX251bTogOTQNCiAgICAgICAgLSBzZXY6IENvc21ldGljDQogICAgICAgIFsnNzknLCAnTWlub3InLCAnU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMnLCAnNDcnXQ0KICAgICAgICAtIGRheXNfb3BlbjogNDcNCiAgICAgICAgLSBkZXNjOiBTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cw0KICAgICAgICAtIGlzc3VlX251bTogNzkNCiAgICAgICAgLSBzZXY6IE1pbm9yDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBvdGhlciwgaW5jbHVkZT1GYWxzZSwgaWdub3JlPU5vbmUsIGZhaWxPbj1Ob25lICk6DQogICAgICAgIHN1cGVyKCBTa2lwVG8sIHNlbGYgKS5fX2luaXRfXyggb3RoZXIgKQ0KICAgICAgICBzZWxmLmlnbm9yZUV4cHIgPSBpZ25vcmUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5pbmNsdWRlTWF0Y2ggPSBpbmNsdWRlDQogICAgICAgIHNlbGYuYXNMaXN0ID0gRmFsc2UNCiAgICAgICAgaWYgaXNpbnN0YW5jZShmYWlsT24sIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgc2VsZi5mYWlsT24gPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZmFpbE9uKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5mYWlsT24gPSBmYWlsT24NCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm8gbWF0Y2ggZm91bmQgZm9yICIrX3VzdHIoc2VsZi5leHByKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc3RhcnRsb2MgPSBsb2MNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIGV4cHIgPSBzZWxmLmV4cHINCiAgICAgICAgZXhwcl9wYXJzZSA9IHNlbGYuZXhwci5fcGFyc2UNCiAgICAgICAgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0ID0gc2VsZi5mYWlsT24uY2FuUGFyc2VOZXh0IGlmIHNlbGYuZmFpbE9uIGlzIG5vdCBOb25lIGVsc2UgTm9uZQ0KICAgICAgICBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UgPSBzZWxmLmlnbm9yZUV4cHIudHJ5UGFyc2UgaWYgc2VsZi5pZ25vcmVFeHByIGlzIG5vdCBOb25lIGVsc2UgTm9uZQ0KICAgICAgICANCiAgICAgICAgdG1wbG9jID0gbG9jDQogICAgICAgIHdoaWxlIHRtcGxvYyA8PSBpbnN0cmxlbjoNCiAgICAgICAgICAgIGlmIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dCBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAjIGJyZWFrIGlmIGZhaWxPbiBleHByZXNzaW9uIG1hdGNoZXMNCiAgICAgICAgICAgICAgICBpZiBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQoaW5zdHJpbmcsIHRtcGxvYyk6DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICMgYWR2YW5jZSBwYXN0IGlnbm9yZSBleHByZXNzaW9ucw0KICAgICAgICAgICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcGxvYyA9IHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZShpbnN0cmluZywgdG1wbG9jKQ0KICAgICAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGV4cHJfcGFyc2UoaW5zdHJpbmcsIHRtcGxvYywgZG9BY3Rpb25zPUZhbHNlLCBjYWxsUHJlUGFyc2U9RmFsc2UpDQogICAgICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLCBJbmRleEVycm9yKToNCiAgICAgICAgICAgICAgICAjIG5vIG1hdGNoLCBhZHZhbmNlIGxvYyBpbiBzdHJpbmcNCiAgICAgICAgICAgICAgICB0bXBsb2MgKz0gMQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIG1hdGNoZWQgc2tpcHRvIGV4cHIsIGRvbmUNCiAgICAgICAgICAgICAgICBicmVhaw0KDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICAjIHJhbiBvZmYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyaW5nIHdpdGhvdXQgbWF0Y2hpbmcgc2tpcHRvIGV4cHIsIGZhaWwNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgICMgYnVpbGQgdXAgcmV0dXJuIHZhbHVlcw0KICAgICAgICBsb2MgPSB0bXBsb2MNCiAgICAgICAgc2tpcHRleHQgPSBpbnN0cmluZ1tzdGFydGxvYzpsb2NdDQogICAgICAgIHNraXByZXN1bHQgPSBQYXJzZVJlc3VsdHMoc2tpcHRleHQpDQogICAgICAgIA0KICAgICAgICBpZiBzZWxmLmluY2x1ZGVNYXRjaDoNCiAgICAgICAgICAgIGxvYywgbWF0ID0gZXhwcl9wYXJzZShpbnN0cmluZyxsb2MsZG9BY3Rpb25zLGNhbGxQcmVQYXJzZT1GYWxzZSkNCiAgICAgICAgICAgIHNraXByZXN1bHQgKz0gbWF0DQoNCiAgICAgICAgcmV0dXJuIGxvYywgc2tpcHJlc3VsdA0KDQpjbGFzcyBGb3J3YXJkKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgYW4gZXhwcmVzc2lvbiB0byBiZSBkZWZpbmVkIGxhdGVyIC0NCiAgICB1c2VkIGZvciByZWN1cnNpdmUgZ3JhbW1hcnMsIHN1Y2ggYXMgYWxnZWJyYWljIGluZml4IG5vdGF0aW9uLg0KICAgIFdoZW4gdGhlIGV4cHJlc3Npb24gaXMga25vd24sIGl0IGlzIGFzc2lnbmVkIHRvIHRoZSBDe0ZvcndhcmR9IHZhcmlhYmxlIHVzaW5nIHRoZSAnPDwnIG9wZXJhdG9yLg0KDQogICAgTm90ZTogdGFrZSBjYXJlIHdoZW4gYXNzaWduaW5nIHRvIEN7Rm9yd2FyZH0gbm90IHRvIG92ZXJsb29rIHByZWNlZGVuY2Ugb2Ygb3BlcmF0b3JzLg0KICAgIFNwZWNpZmljYWxseSwgJ3wnIGhhcyBhIGxvd2VyIHByZWNlZGVuY2UgdGhhbiAnPDwnLCBzbyB0aGF0OjoNCiAgICAgICAgZndkRXhwciA8PCBhIHwgYiB8IGMNCiAgICB3aWxsIGFjdHVhbGx5IGJlIGV2YWx1YXRlZCBhczo6DQogICAgICAgIChmd2RFeHByIDw8IGEpIHwgYiB8IGMNCiAgICB0aGVyZWJ5IGxlYXZpbmcgYiBhbmQgYyBvdXQgYXMgcGFyc2VhYmxlIGFsdGVybmF0aXZlcy4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91DQogICAgZXhwbGljaXRseSBncm91cCB0aGUgdmFsdWVzIGluc2VydGVkIGludG8gdGhlIEN7Rm9yd2FyZH06Og0KICAgICAgICBmd2RFeHByIDw8IChhIHwgYiB8IGMpDQogICAgQ29udmVydGluZyB0byB1c2UgdGhlICc8PD0nIG9wZXJhdG9yIGluc3RlYWQgd2lsbCBhdm9pZCB0aGlzIHByb2JsZW0uDQoNCiAgICBTZWUgTHtQYXJzZVJlc3VsdHMucHByaW50fSBmb3IgYW4gZXhhbXBsZSBvZiBhIHJlY3Vyc2l2ZSBwYXJzZXIgY3JlYXRlZCB1c2luZw0KICAgIEN7Rm9yd2FyZH0uDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBvdGhlcj1Ob25lICk6DQogICAgICAgIHN1cGVyKEZvcndhcmQsc2VsZikuX19pbml0X18oIG90aGVyLCBzYXZlbGlzdD1GYWxzZSApDQoNCiAgICBkZWYgX19sc2hpZnRfXyggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKG90aGVyKQ0KICAgICAgICBzZWxmLmV4cHIgPSBvdGhlcg0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IHNlbGYuZXhwci5tYXlJbmRleEVycm9yDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBzZWxmLmV4cHIubWF5UmV0dXJuRW1wdHkNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYuZXhwci53aGl0ZUNoYXJzICkNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IHNlbGYuZXhwci5za2lwV2hpdGVzcGFjZQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBzZWxmLmV4cHIuc2F2ZUFzTGlzdA0KICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmV4dGVuZChzZWxmLmV4cHIuaWdub3JlRXhwcnMpDQogICAgICAgIHJldHVybiBzZWxmDQogICAgICAgIA0KICAgIGRlZiBfX2lsc2hpZnRfXyhzZWxmLCBvdGhlcik6DQogICAgICAgIHJldHVybiBzZWxmIDw8IG90aGVyDQogICAgDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6DQogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOg0KICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IFRydWUNCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHIuc3RyZWFtbGluZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToNCiAgICAgICAgaWYgc2VsZiBub3QgaW4gdmFsaWRhdGVUcmFjZToNCiAgICAgICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdDQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgc2VsZi5leHByLnZhbGlkYXRlKHRtcCkNCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbihbXSkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAiOiAuLi4iDQoNCiAgICAgICAgIyBzdHViYmVkIG91dCBmb3Igbm93IC0gY3JlYXRlcyBhd2Z1bCBtZW1vcnkgYW5kIHBlcmYgaXNzdWVzDQogICAgICAgIHNlbGYuX3JldmVydENsYXNzID0gc2VsZi5fX2NsYXNzX18NCiAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBfRm9yd2FyZE5vUmVjdXJzZQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gX3VzdHIoc2VsZi5leHByKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSAiTm9uZSINCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fID0gc2VsZi5fcmV2ZXJ0Q2xhc3MNCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgIjogIiArIHJldFN0cmluZw0KDQogICAgZGVmIGNvcHkoc2VsZik6DQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihGb3J3YXJkLHNlbGYpLmNvcHkoKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0ID0gRm9yd2FyZCgpDQogICAgICAgICAgICByZXQgPDw9IHNlbGYNCiAgICAgICAgICAgIHJldHVybiByZXQNCg0KY2xhc3MgX0ZvcndhcmROb1JlY3Vyc2UoRm9yd2FyZCk6DQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICIuLi4iDQoNCmNsYXNzIFRva2VuQ29udmVydGVyKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIEN7UGFyc2VFeHByZXNzaW9ufSwgZm9yIGNvbnZlcnRpbmcgcGFyc2VkIHJlc3VsdHMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzYXZlbGlzdD1GYWxzZSApOg0KICAgICAgICBzdXBlcihUb2tlbkNvbnZlcnRlcixzZWxmKS5fX2luaXRfXyggZXhwciApIywgc2F2ZWxpc3QgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBGYWxzZQ0KDQpjbGFzcyBDb21iaW5lKFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgdG8gY29uY2F0ZW5hdGUgYWxsIG1hdGNoaW5nIHRva2VucyB0byBhIHNpbmdsZSBzdHJpbmcuDQogICAgQnkgZGVmYXVsdCwgdGhlIG1hdGNoaW5nIHBhdHRlcm5zIG11c3QgYWxzbyBiZSBjb250aWd1b3VzIGluIHRoZSBpbnB1dCBzdHJpbmc7DQogICAgdGhpcyBjYW4gYmUgZGlzYWJsZWQgYnkgc3BlY2lmeWluZyBDeydhZGphY2VudD1GYWxzZSd9IGluIHRoZSBjb25zdHJ1Y3Rvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICByZWFsID0gV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4xNDE2JykpICMgLT4gWyczJywgJy4nLCAnMTQxNiddDQogICAgICAgICMgd2lsbCBhbHNvIGVycm9uZW91c2x5IG1hdGNoIHRoZSBmb2xsb3dpbmcNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4gMTQxNicpKSAjIC0+IFsnMycsICcuJywgJzE0MTYnXQ0KDQogICAgICAgIHJlYWwgPSBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQ0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLjE0MTYnKSkgIyAtPiBbJzMuMTQxNiddDQogICAgICAgICMgbm8gbWF0Y2ggd2hlbiB0aGVyZSBhcmUgaW50ZXJuYWwgc3BhY2VzDQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuIDE0MTYnKSkgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIFc6KDAxMjMuLi4pDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBqb2luU3RyaW5nPSIiLCBhZGphY2VudD1UcnVlICk6DQogICAgICAgIHN1cGVyKENvbWJpbmUsc2VsZikuX19pbml0X18oIGV4cHIgKQ0KICAgICAgICAjIHN1cHByZXNzIHdoaXRlc3BhY2Utc3RyaXBwaW5nIGluIGNvbnRhaW5lZCBwYXJzZSBleHByZXNzaW9ucywgYnV0IHJlLWVuYWJsZSBpdCBvbiB0aGUgQ29tYmluZSBpdHNlbGYNCiAgICAgICAgaWYgYWRqYWNlbnQ6DQogICAgICAgICAgICBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHNlbGYuYWRqYWNlbnQgPSBhZGphY2VudA0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLmpvaW5TdHJpbmcgPSBqb2luU3RyaW5nDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZQ0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgc2VsZi5hZGphY2VudDoNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuaWdub3JlKHNlbGYsIG90aGVyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc3VwZXIoIENvbWJpbmUsIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIHJldFRva3MgPSB0b2tlbmxpc3QuY29weSgpDQogICAgICAgIGRlbCByZXRUb2tzWzpdDQogICAgICAgIHJldFRva3MgKz0gUGFyc2VSZXN1bHRzKFsgIiIuam9pbih0b2tlbmxpc3QuX2FzU3RyaW5nTGlzdChzZWxmLmpvaW5TdHJpbmcpKSBdLCBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cykNCg0KICAgICAgICBpZiBzZWxmLnJlc3VsdHNOYW1lIGFuZCByZXRUb2tzLmhhc2tleXMoKToNCiAgICAgICAgICAgIHJldHVybiBbIHJldFRva3MgXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHJldFRva3MNCg0KY2xhc3MgR3JvdXAoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciB0byByZXR1cm4gdGhlIG1hdGNoZWQgdG9rZW5zIGFzIGEgbGlzdCAtIHVzZWZ1bCBmb3IgcmV0dXJuaW5nIHRva2VucyBvZiBDe0x7WmVyb09yTW9yZX19IGFuZCBDe0x7T25lT3JNb3JlfX0gZXhwcmVzc2lvbnMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbnVtID0gV29yZChudW1zKQ0KICAgICAgICB0ZXJtID0gaWRlbnQgfCBudW0NCiAgICAgICAgZnVuYyA9IGlkZW50ICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkNCiAgICAgICAgcHJpbnQoZnVuYy5wYXJzZVN0cmluZygiZm4gYSxiLDEwMCIpKSAgIyAtPiBbJ2ZuJywgJ2EnLCAnYicsICcxMDAnXQ0KDQogICAgICAgIGZ1bmMgPSBpZGVudCArIEdyb3VwKE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpKQ0KICAgICAgICBwcmludChmdW5jLnBhcnNlU3RyaW5nKCJmbiBhLGIsMTAwIikpICAjIC0+IFsnZm4nLCBbJ2EnLCAnYicsICcxMDAnXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToNCiAgICAgICAgc3VwZXIoR3JvdXAsc2VsZikuX19pbml0X18oIGV4cHIgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0dXJuIFsgdG9rZW5saXN0IF0NCg0KY2xhc3MgRGljdChUb2tlbkNvbnZlcnRlcik6DQogICAgIiIiDQogICAgQ29udmVydGVyIHRvIHJldHVybiBhIHJlcGV0aXRpdmUgZXhwcmVzc2lvbiBhcyBhIGxpc3QsIGJ1dCBhbHNvIGFzIGEgZGljdGlvbmFyeS4NCiAgICBFYWNoIGVsZW1lbnQgY2FuIGFsc28gYmUgcmVmZXJlbmNlZCB1c2luZyB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGV4cHJlc3Npb24gYXMgaXRzIGtleS4NCiAgICBVc2VmdWwgZm9yIHRhYnVsYXIgcmVwb3J0IHNjcmFwaW5nIHdoZW4gdGhlIGZpcnN0IGNvbHVtbiBjYW4gYmUgdXNlZCBhcyBhIGl0ZW0ga2V5Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQoNCiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IGxpZ2h0IGJsdWUgdGV4dHVyZTogYnVybGFwIg0KICAgICAgICBhdHRyX2V4cHIgPSAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIA0KICAgICAgICAjIHByaW50IGF0dHJpYnV0ZXMgYXMgcGxhaW4gZ3JvdXBzDQogICAgICAgIHByaW50KE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLmR1bXAoKSkNCiAgICAgICAgDQogICAgICAgICMgaW5zdGVhZCBvZiBPbmVPck1vcmUoZXhwciksIHBhcnNlIHVzaW5nIERpY3QoT25lT3JNb3JlKEdyb3VwKGV4cHIpKSkgLSBEaWN0IHdpbGwgYXV0by1hc3NpZ24gbmFtZXMNCiAgICAgICAgcmVzdWx0ID0gRGljdChPbmVPck1vcmUoR3JvdXAoYXR0cl9leHByKSkpLnBhcnNlU3RyaW5nKHRleHQpDQogICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpDQogICAgICAgIA0KICAgICAgICAjIGFjY2VzcyBuYW1lZCBmaWVsZHMgYXMgZGljdCBlbnRyaWVzLCBvciBvdXRwdXQgYXMgZGljdA0KICAgICAgICBwcmludChyZXN1bHRbJ3NoYXBlJ10pICAgICAgICANCiAgICAgICAgcHJpbnQocmVzdWx0LmFzRGljdCgpKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnc2hhcGUnLCAnU1FVQVJFJywgJ3Bvc24nLCAndXBwZXIgbGVmdCcsICdjb2xvcicsICdsaWdodCBibHVlJywgJ3RleHR1cmUnLCAnYnVybGFwJ10NCg0KICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdsaWdodCBibHVlJ10sIFsndGV4dHVyZScsICdidXJsYXAnXV0NCiAgICAgICAgLSBjb2xvcjogbGlnaHQgYmx1ZQ0KICAgICAgICAtIHBvc246IHVwcGVyIGxlZnQNCiAgICAgICAgLSBzaGFwZTogU1FVQVJFDQogICAgICAgIC0gdGV4dHVyZTogYnVybGFwDQogICAgICAgIFNRVUFSRQ0KICAgICAgICB7J2NvbG9yJzogJ2xpZ2h0IGJsdWUnLCAncG9zbic6ICd1cHBlciBsZWZ0JywgJ3RleHR1cmUnOiAnYnVybGFwJywgJ3NoYXBlJzogJ1NRVUFSRSd9DQogICAgU2VlIG1vcmUgZXhhbXBsZXMgYXQgTHtQYXJzZVJlc3VsdHN9IG9mIGFjY2Vzc2luZyBmaWVsZHMgYnkgcmVzdWx0cyBuYW1lLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihEaWN0LHNlbGYpLl9faW5pdF9fKCBleHByICkNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIGZvciBpLHRvayBpbiBlbnVtZXJhdGUodG9rZW5saXN0KToNCiAgICAgICAgICAgIGlmIGxlbih0b2spID09IDA6DQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIGlrZXkgPSB0b2tbMF0NCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaWtleSxpbnQpOg0KICAgICAgICAgICAgICAgIGlrZXkgPSBfdXN0cih0b2tbMF0pLnN0cmlwKCkNCiAgICAgICAgICAgIGlmIGxlbih0b2spPT0xOg0KICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KCIiLGkpDQogICAgICAgICAgICBlbGlmIGxlbih0b2spPT0yIGFuZCBub3QgaXNpbnN0YW5jZSh0b2tbMV0sUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh0b2tbMV0saSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgZGljdHZhbHVlID0gdG9rLmNvcHkoKSAjUGFyc2VSZXN1bHRzKGkpDQogICAgICAgICAgICAgICAgZGVsIGRpY3R2YWx1ZVswXQ0KICAgICAgICAgICAgICAgIGlmIGxlbihkaWN0dmFsdWUpIT0gMSBvciAoaXNpbnN0YW5jZShkaWN0dmFsdWUsUGFyc2VSZXN1bHRzKSBhbmQgZGljdHZhbHVlLmhhc2tleXMoKSk6DQogICAgICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KGRpY3R2YWx1ZSxpKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KGRpY3R2YWx1ZVswXSxpKQ0KDQogICAgICAgIGlmIHNlbGYucmVzdWx0c05hbWU6DQogICAgICAgICAgICByZXR1cm4gWyB0b2tlbmxpc3QgXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHRva2VubGlzdA0KDQoNCmNsYXNzIFN1cHByZXNzKFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgZm9yIGlnbm9yaW5nIHRoZSByZXN1bHRzIG9mIGEgcGFyc2VkIGV4cHJlc3Npb24uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgc291cmNlID0gImEsIGIsIGMsZCINCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCiAgICAgICAgd2RfbGlzdDEgPSB3ZCArIFplcm9Pck1vcmUoJywnICsgd2QpDQogICAgICAgIHByaW50KHdkX2xpc3QxLnBhcnNlU3RyaW5nKHNvdXJjZSkpDQoNCiAgICAgICAgIyBvZnRlbiwgZGVsaW1pdGVycyB0aGF0IGFyZSB1c2VmdWwgZHVyaW5nIHBhcnNpbmcgYXJlIGp1c3QgaW4gdGhlDQogICAgICAgICMgd2F5IGFmdGVyd2FyZCAtIHVzZSBTdXBwcmVzcyB0byBrZWVwIHRoZW0gb3V0IG9mIHRoZSBwYXJzZWQgb3V0cHV0DQogICAgICAgIHdkX2xpc3QyID0gd2QgKyBaZXJvT3JNb3JlKFN1cHByZXNzKCcsJykgKyB3ZCkNCiAgICAgICAgcHJpbnQod2RfbGlzdDIucGFyc2VTdHJpbmcoc291cmNlKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJ2EnLCAnLCcsICdiJywgJywnLCAnYycsICcsJywgJ2QnXQ0KICAgICAgICBbJ2EnLCAnYicsICdjJywgJ2QnXQ0KICAgIChTZWUgYWxzbyBMe2RlbGltaXRlZExpc3R9LikNCiAgICAiIiINCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0dXJuIFtdDQoNCiAgICBkZWYgc3VwcHJlc3MoIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KDQpjbGFzcyBPbmx5T25jZShvYmplY3QpOg0KICAgICIiIg0KICAgIFdyYXBwZXIgZm9yIHBhcnNlIGFjdGlvbnMsIHRvIGVuc3VyZSB0aGV5IGFyZSBvbmx5IGNhbGxlZCBvbmNlLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2RDYWxsKToNCiAgICAgICAgc2VsZi5jYWxsYWJsZSA9IF90cmltX2FyaXR5KG1ldGhvZENhbGwpDQogICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UNCiAgICBkZWYgX19jYWxsX18oc2VsZixzLGwsdCk6DQogICAgICAgIGlmIG5vdCBzZWxmLmNhbGxlZDoNCiAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxmLmNhbGxhYmxlKHMsbCx0KQ0KICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlDQogICAgICAgICAgICByZXR1cm4gcmVzdWx0cw0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIiIpDQogICAgZGVmIHJlc2V0KHNlbGYpOg0KICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlDQoNCmRlZiB0cmFjZVBhcnNlQWN0aW9uKGYpOg0KICAgICIiIg0KICAgIERlY29yYXRvciBmb3IgZGVidWdnaW5nIHBhcnNlIGFjdGlvbnMuIA0KICAgIA0KICAgIFdoZW4gdGhlIHBhcnNlIGFjdGlvbiBpcyBjYWxsZWQsIHRoaXMgZGVjb3JhdG9yIHdpbGwgcHJpbnQgQ3siPj4gZW50ZXJpbmcgSXttZXRob2QtbmFtZX0obGluZTpJe2N1cnJlbnRfc291cmNlX2xpbmV9LCBJe3BhcnNlX2xvY2F0aW9ufSwgSXttYXRjaGVkX3Rva2Vuc30pIi59DQogICAgV2hlbiB0aGUgcGFyc2UgYWN0aW9uIGNvbXBsZXRlcywgdGhlIGRlY29yYXRvciB3aWxsIHByaW50IEN7Ijw8In0gZm9sbG93ZWQgYnkgdGhlIHJldHVybmVkIHZhbHVlLCBvciBhbnkgZXhjZXB0aW9uIHRoYXQgdGhlIHBhcnNlIGFjdGlvbiByYWlzZWQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCg0KICAgICAgICBAdHJhY2VQYXJzZUFjdGlvbg0KICAgICAgICBkZWYgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyh0b2tlbnMpOg0KICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4oc29ydGVkKHNldCgnJy5qb2luKHRva2VucykpKQ0KDQogICAgICAgIHdkcyA9IE9uZU9yTW9yZSh3ZCkuc2V0UGFyc2VBY3Rpb24ocmVtb3ZlX2R1cGxpY2F0ZV9jaGFycykNCiAgICAgICAgcHJpbnQod2RzLnBhcnNlU3RyaW5nKCJzbGtkanMgc2xkIHNsZGQgc2RsZiBzZGxqZiIpKQ0KICAgIHByaW50czo6DQogICAgICAgID4+ZW50ZXJpbmcgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyhsaW5lOiAnc2xrZGpzIHNsZCBzbGRkIHNkbGYgc2RsamYnLCAwLCAoWydzbGtkanMnLCAnc2xkJywgJ3NsZGQnLCAnc2RsZicsICdzZGxqZiddLCB7fSkpDQogICAgICAgIDw8bGVhdmluZyByZW1vdmVfZHVwbGljYXRlX2NoYXJzIChyZXQ6ICdkZmprbHMnKQ0KICAgICAgICBbJ2RmamtscyddDQogICAgIiIiDQogICAgZiA9IF90cmltX2FyaXR5KGYpDQogICAgZGVmIHooKnBhQXJncyk6DQogICAgICAgIHRoaXNGdW5jID0gZi5fX25hbWVfXw0KICAgICAgICBzLGwsdCA9IHBhQXJnc1stMzpdDQogICAgICAgIGlmIGxlbihwYUFyZ3MpPjM6DQogICAgICAgICAgICB0aGlzRnVuYyA9IHBhQXJnc1swXS5fX2NsYXNzX18uX19uYW1lX18gKyAnLicgKyB0aGlzRnVuYw0KICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPj5lbnRlcmluZyAlcyhsaW5lOiAnJXMnLCAlZCwgJXIpXG4iICUgKHRoaXNGdW5jLGxpbmUobCxzKSxsLHQpICkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0ID0gZigqcGFBcmdzKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI8PGxlYXZpbmcgJXMgKGV4Y2VwdGlvbjogJXMpXG4iICUgKHRoaXNGdW5jLGV4YykgKQ0KICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIjw8bGVhdmluZyAlcyAocmV0OiAlcilcbiIgJSAodGhpc0Z1bmMscmV0KSApDQogICAgICAgIHJldHVybiByZXQNCiAgICB0cnk6DQogICAgICAgIHouX19uYW1lX18gPSBmLl9fbmFtZV9fDQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KICAgICAgICBwYXNzDQogICAgcmV0dXJuIHoNCg0KIw0KIyBnbG9iYWwgaGVscGVycw0KIw0KZGVmIGRlbGltaXRlZExpc3QoIGV4cHIsIGRlbGltPSIsIiwgY29tYmluZT1GYWxzZSApOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYSBkZWxpbWl0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyAtIHRoZSBkZWxpbWl0ZXIgZGVmYXVsdHMgdG8gJywnLg0KICAgIEJ5IGRlZmF1bHQsIHRoZSBsaXN0IGVsZW1lbnRzIGFuZCBkZWxpbWl0ZXJzIGNhbiBoYXZlIGludGVydmVuaW5nIHdoaXRlc3BhY2UsIGFuZA0KICAgIGNvbW1lbnRzLCBidXQgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nIEN7Y29tYmluZT1UcnVlfSBpbiB0aGUgY29uc3RydWN0b3IuDQogICAgSWYgQ3tjb21iaW5lfSBpcyBzZXQgdG8gQ3tUcnVlfSwgdGhlIG1hdGNoaW5nIHRva2VucyBhcmUgcmV0dXJuZWQgYXMgYSBzaW5nbGUgdG9rZW4NCiAgICBzdHJpbmcsIHdpdGggdGhlIGRlbGltaXRlcnMgaW5jbHVkZWQ7IG90aGVyd2lzZSwgdGhlIG1hdGNoaW5nIHRva2VucyBhcmUgcmV0dXJuZWQNCiAgICBhcyBhIGxpc3Qgb2YgdG9rZW5zLCB3aXRoIHRoZSBkZWxpbWl0ZXJzIHN1cHByZXNzZWQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGVsaW1pdGVkTGlzdChXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYSxiYixjYyIpICMgLT4gWydhYScsICdiYicsICdjYyddDQogICAgICAgIGRlbGltaXRlZExpc3QoV29yZChoZXhudW1zKSwgZGVsaW09JzonLCBjb21iaW5lPVRydWUpLnBhcnNlU3RyaW5nKCJBQTpCQjpDQzpERDpFRSIpICMgLT4gWydBQTpCQjpDQzpERDpFRSddDQogICAgIiIiDQogICAgZGxOYW1lID0gX3VzdHIoZXhwcikrIiBbIitfdXN0cihkZWxpbSkrIiAiK191c3RyKGV4cHIpKyJdLi4uIg0KICAgIGlmIGNvbWJpbmU6DQogICAgICAgIHJldHVybiBDb21iaW5lKCBleHByICsgWmVyb09yTW9yZSggZGVsaW0gKyBleHByICkgKS5zZXROYW1lKGRsTmFtZSkNCiAgICBlbHNlOg0KICAgICAgICByZXR1cm4gKCBleHByICsgWmVyb09yTW9yZSggU3VwcHJlc3MoIGRlbGltICkgKyBleHByICkgKS5zZXROYW1lKGRsTmFtZSkNCg0KZGVmIGNvdW50ZWRBcnJheSggZXhwciwgaW50RXhwcj1Ob25lICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhIGNvdW50ZWQgbGlzdCBvZiBleHByZXNzaW9ucy4NCiAgICBUaGlzIGhlbHBlciBkZWZpbmVzIGEgcGF0dGVybiBvZiB0aGUgZm9ybTo6DQogICAgICAgIGludGVnZXIgZXhwciBleHByIGV4cHIuLi4NCiAgICB3aGVyZSB0aGUgbGVhZGluZyBpbnRlZ2VyIHRlbGxzIGhvdyBtYW55IGV4cHIgZXhwcmVzc2lvbnMgZm9sbG93Lg0KICAgIFRoZSBtYXRjaGVkIHRva2VucyByZXR1cm5zIHRoZSBhcnJheSBvZiBleHByIHRva2VucyBhcyBhIGxpc3QgLSB0aGUgbGVhZGluZyBjb3VudCB0b2tlbiBpcyBzdXBwcmVzc2VkLg0KICAgIA0KICAgIElmIEN7aW50RXhwcn0gaXMgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbiB0aGF0IHByb2R1Y2VzIGFuIGludGVnZXIgdmFsdWUuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgY291bnRlZEFycmF5KFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoJzIgYWIgY2QgZWYnKSAgIyAtPiBbJ2FiJywgJ2NkJ10NCg0KICAgICAgICAjIGluIHRoaXMgcGFyc2VyLCB0aGUgbGVhZGluZyBpbnRlZ2VyIHZhbHVlIGlzIGdpdmVuIGluIGJpbmFyeSwNCiAgICAgICAgIyAnMTAnIGluZGljYXRpbmcgdGhhdCAyIHZhbHVlcyBhcmUgaW4gdGhlIGFycmF5DQogICAgICAgIGJpbmFyeUNvbnN0YW50ID0gV29yZCgnMDEnKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDogaW50KHRbMF0sIDIpKQ0KICAgICAgICBjb3VudGVkQXJyYXkoV29yZChhbHBoYXMpLCBpbnRFeHByPWJpbmFyeUNvbnN0YW50KS5wYXJzZVN0cmluZygnMTAgYWIgY2QgZWYnKSAgIyAtPiBbJ2FiJywgJ2NkJ10NCiAgICAiIiINCiAgICBhcnJheUV4cHIgPSBGb3J3YXJkKCkNCiAgICBkZWYgY291bnRGaWVsZFBhcnNlQWN0aW9uKHMsbCx0KToNCiAgICAgICAgbiA9IHRbMF0NCiAgICAgICAgYXJyYXlFeHByIDw8IChuIGFuZCBHcm91cChBbmQoW2V4cHJdKm4pKSBvciBHcm91cChlbXB0eSkpDQogICAgICAgIHJldHVybiBbXQ0KICAgIGlmIGludEV4cHIgaXMgTm9uZToNCiAgICAgICAgaW50RXhwciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6aW50KHRbMF0pKQ0KICAgIGVsc2U6DQogICAgICAgIGludEV4cHIgPSBpbnRFeHByLmNvcHkoKQ0KICAgIGludEV4cHIuc2V0TmFtZSgiYXJyYXlMZW4iKQ0KICAgIGludEV4cHIuYWRkUGFyc2VBY3Rpb24oY291bnRGaWVsZFBhcnNlQWN0aW9uLCBjYWxsRHVyaW5nVHJ5PVRydWUpDQogICAgcmV0dXJuICggaW50RXhwciArIGFycmF5RXhwciApLnNldE5hbWUoJyhsZW4pICcgKyBfdXN0cihleHByKSArICcuLi4nKQ0KDQpkZWYgX2ZsYXR0ZW4oTCk6DQogICAgcmV0ID0gW10NCiAgICBmb3IgaSBpbiBMOg0KICAgICAgICBpZiBpc2luc3RhbmNlKGksbGlzdCk6DQogICAgICAgICAgICByZXQuZXh0ZW5kKF9mbGF0dGVuKGkpKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0LmFwcGVuZChpKQ0KICAgIHJldHVybiByZXQNCg0KZGVmIG1hdGNoUHJldmlvdXNMaXRlcmFsKGV4cHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYW4gZXhwcmVzc2lvbiB0aGF0IGlzIGluZGlyZWN0bHkgZGVmaW5lZCBmcm9tDQogICAgdGhlIHRva2VucyBtYXRjaGVkIGluIGEgcHJldmlvdXMgZXhwcmVzc2lvbiwgdGhhdCBpcywgaXQgbG9va3MNCiAgICBmb3IgYSAncmVwZWF0JyBvZiBhIHByZXZpb3VzIGV4cHJlc3Npb24uICBGb3IgZXhhbXBsZTo6DQogICAgICAgIGZpcnN0ID0gV29yZChudW1zKQ0KICAgICAgICBzZWNvbmQgPSBtYXRjaFByZXZpb3VzTGl0ZXJhbChmaXJzdCkNCiAgICAgICAgbWF0Y2hFeHByID0gZmlyc3QgKyAiOiIgKyBzZWNvbmQNCiAgICB3aWxsIG1hdGNoIEN7IjE6MSJ9LCBidXQgbm90IEN7IjE6MiJ9LiAgQmVjYXVzZSB0aGlzIG1hdGNoZXMgYQ0KICAgIHByZXZpb3VzIGxpdGVyYWwsIHdpbGwgYWxzbyBtYXRjaCB0aGUgbGVhZGluZyBDeyIxOjEifSBpbiBDeyIxOjEwIn0uDQogICAgSWYgdGhpcyBpcyBub3QgZGVzaXJlZCwgdXNlIEN7bWF0Y2hQcmV2aW91c0V4cHJ9Lg0KICAgIERvIEl7bm90fSB1c2Ugd2l0aCBwYWNrcmF0IHBhcnNpbmcgZW5hYmxlZC4NCiAgICAiIiINCiAgICByZXAgPSBGb3J3YXJkKCkNCiAgICBkZWYgY29weVRva2VuVG9SZXBlYXRlcihzLGwsdCk6DQogICAgICAgIGlmIHQ6DQogICAgICAgICAgICBpZiBsZW4odCkgPT0gMToNCiAgICAgICAgICAgICAgICByZXAgPDwgdFswXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGZsYXR0ZW4gdCB0b2tlbnMNCiAgICAgICAgICAgICAgICB0ZmxhdCA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpDQogICAgICAgICAgICAgICAgcmVwIDw8IEFuZChMaXRlcmFsKHR0KSBmb3IgdHQgaW4gdGZsYXQpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXAgPDwgRW1wdHkoKQ0KICAgIGV4cHIuYWRkUGFyc2VBY3Rpb24oY29weVRva2VuVG9SZXBlYXRlciwgY2FsbER1cmluZ1RyeT1UcnVlKQ0KICAgIHJlcC5zZXROYW1lKCcocHJldikgJyArIF91c3RyKGV4cHIpKQ0KICAgIHJldHVybiByZXANCg0KZGVmIG1hdGNoUHJldmlvdXNFeHByKGV4cHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYW4gZXhwcmVzc2lvbiB0aGF0IGlzIGluZGlyZWN0bHkgZGVmaW5lZCBmcm9tDQogICAgdGhlIHRva2VucyBtYXRjaGVkIGluIGEgcHJldmlvdXMgZXhwcmVzc2lvbiwgdGhhdCBpcywgaXQgbG9va3MNCiAgICBmb3IgYSAncmVwZWF0JyBvZiBhIHByZXZpb3VzIGV4cHJlc3Npb24uICBGb3IgZXhhbXBsZTo6DQogICAgICAgIGZpcnN0ID0gV29yZChudW1zKQ0KICAgICAgICBzZWNvbmQgPSBtYXRjaFByZXZpb3VzRXhwcihmaXJzdCkNCiAgICAgICAgbWF0Y2hFeHByID0gZmlyc3QgKyAiOiIgKyBzZWNvbmQNCiAgICB3aWxsIG1hdGNoIEN7IjE6MSJ9LCBidXQgbm90IEN7IjE6MiJ9LiAgQmVjYXVzZSB0aGlzIG1hdGNoZXMgYnkNCiAgICBleHByZXNzaW9ucywgd2lsbCBJe25vdH0gbWF0Y2ggdGhlIGxlYWRpbmcgQ3siMToxIn0gaW4gQ3siMToxMCJ9Ow0KICAgIHRoZSBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGZpcnN0LCBhbmQgdGhlbiBjb21wYXJlZCwgc28NCiAgICBDeyIxIn0gaXMgY29tcGFyZWQgd2l0aCBDeyIxMCJ9Lg0KICAgIERvIEl7bm90fSB1c2Ugd2l0aCBwYWNrcmF0IHBhcnNpbmcgZW5hYmxlZC4NCiAgICAiIiINCiAgICByZXAgPSBGb3J3YXJkKCkNCiAgICBlMiA9IGV4cHIuY29weSgpDQogICAgcmVwIDw8PSBlMg0KICAgIGRlZiBjb3B5VG9rZW5Ub1JlcGVhdGVyKHMsbCx0KToNCiAgICAgICAgbWF0Y2hUb2tlbnMgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQ0KICAgICAgICBkZWYgbXVzdE1hdGNoVGhlc2VUb2tlbnMocyxsLHQpOg0KICAgICAgICAgICAgdGhlc2VUb2tlbnMgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQ0KICAgICAgICAgICAgaWYgIHRoZXNlVG9rZW5zICE9IG1hdGNoVG9rZW5zOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCIiLDAsIiIpDQogICAgICAgIHJlcC5zZXRQYXJzZUFjdGlvbiggbXVzdE1hdGNoVGhlc2VUb2tlbnMsIGNhbGxEdXJpbmdUcnk9VHJ1ZSApDQogICAgZXhwci5hZGRQYXJzZUFjdGlvbihjb3B5VG9rZW5Ub1JlcGVhdGVyLCBjYWxsRHVyaW5nVHJ5PVRydWUpDQogICAgcmVwLnNldE5hbWUoJyhwcmV2KSAnICsgX3VzdHIoZXhwcikpDQogICAgcmV0dXJuIHJlcA0KDQpkZWYgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzKToNCiAgICAjfiAgZXNjYXBlIHRoZXNlIGNoYXJzOiBeLV0NCiAgICBmb3IgYyBpbiByIlxeLV0iOg0KICAgICAgICBzID0gcy5yZXBsYWNlKGMsX2JzbGFzaCtjKQ0KICAgIHMgPSBzLnJlcGxhY2UoIlxuIixyIlxuIikNCiAgICBzID0gcy5yZXBsYWNlKCJcdCIsciJcdCIpDQogICAgcmV0dXJuIF91c3RyKHMpDQoNCmRlZiBvbmVPZiggc3RycywgY2FzZWxlc3M9RmFsc2UsIHVzZVJlZ2V4PVRydWUgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gcXVpY2tseSBkZWZpbmUgYSBzZXQgb2YgYWx0ZXJuYXRpdmUgTGl0ZXJhbHMsIGFuZCBtYWtlcyBzdXJlIHRvIGRvDQogICAgbG9uZ2VzdC1maXJzdCB0ZXN0aW5nIHdoZW4gdGhlcmUgaXMgYSBjb25mbGljdCwgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgb3JkZXIsDQogICAgYnV0IHJldHVybnMgYSBDe0x7TWF0Y2hGaXJzdH19IGZvciBiZXN0IHBlcmZvcm1hbmNlLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBzdHJzIC0gYSBzdHJpbmcgb2Ygc3BhY2UtZGVsaW1pdGVkIGxpdGVyYWxzLCBvciBhIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIGxpdGVyYWxzDQogICAgIC0gY2FzZWxlc3MgLSAoZGVmYXVsdD1De0ZhbHNlfSkgLSB0cmVhdCBhbGwgbGl0ZXJhbHMgYXMgY2FzZWxlc3MNCiAgICAgLSB1c2VSZWdleCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gYXMgYW4gb3B0aW1pemF0aW9uLCB3aWxsIGdlbmVyYXRlIGEgUmVnZXgNCiAgICAgICAgICBvYmplY3Q7IG90aGVyd2lzZSwgd2lsbCBnZW5lcmF0ZSBhIEN7TWF0Y2hGaXJzdH0gb2JqZWN0IChpZiBDe2Nhc2VsZXNzPVRydWV9LCBvcg0KICAgICAgICAgIGlmIGNyZWF0aW5nIGEgQ3tSZWdleH0gcmFpc2VzIGFuIGV4Y2VwdGlvbikNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBjb21wX29wZXIgPSBvbmVPZigiPCA9ID4gPD0gPj0gIT0iKQ0KICAgICAgICB2YXIgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKQ0KICAgICAgICB0ZXJtID0gdmFyIHwgbnVtYmVyDQogICAgICAgIGNvbXBhcmlzb25fZXhwciA9IHRlcm0gKyBjb21wX29wZXIgKyB0ZXJtDQogICAgICAgIHByaW50KGNvbXBhcmlzb25fZXhwci5zZWFyY2hTdHJpbmcoIkIgPSAxMiAgQUE9MjMgQjw9QUEgQUE+MTIiKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydCJywgJz0nLCAnMTInXSwgWydBQScsICc9JywgJzIzJ10sIFsnQicsICc8PScsICdBQSddLCBbJ0FBJywgJz4nLCAnMTInXV0NCiAgICAiIiINCiAgICBpZiBjYXNlbGVzczoNCiAgICAgICAgaXNlcXVhbCA9ICggbGFtYmRhIGEsYjogYS51cHBlcigpID09IGIudXBwZXIoKSApDQogICAgICAgIG1hc2tzID0gKCBsYW1iZGEgYSxiOiBiLnVwcGVyKCkuc3RhcnRzd2l0aChhLnVwcGVyKCkpICkNCiAgICAgICAgcGFyc2VFbGVtZW50Q2xhc3MgPSBDYXNlbGVzc0xpdGVyYWwNCiAgICBlbHNlOg0KICAgICAgICBpc2VxdWFsID0gKCBsYW1iZGEgYSxiOiBhID09IGIgKQ0KICAgICAgICBtYXNrcyA9ICggbGFtYmRhIGEsYjogYi5zdGFydHN3aXRoKGEpICkNCiAgICAgICAgcGFyc2VFbGVtZW50Q2xhc3MgPSBMaXRlcmFsDQoNCiAgICBzeW1ib2xzID0gW10NCiAgICBpZiBpc2luc3RhbmNlKHN0cnMsYmFzZXN0cmluZyk6DQogICAgICAgIHN5bWJvbHMgPSBzdHJzLnNwbGl0KCkNCiAgICBlbGlmIGlzaW5zdGFuY2Uoc3RycywgY29sbGVjdGlvbnMuSXRlcmFibGUpOg0KICAgICAgICBzeW1ib2xzID0gbGlzdChzdHJzKQ0KICAgIGVsc2U6DQogICAgICAgIHdhcm5pbmdzLndhcm4oIkludmFsaWQgYXJndW1lbnQgdG8gb25lT2YsIGV4cGVjdGVkIHN0cmluZyBvciBpdGVyYWJsZSIsDQogICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgIGlmIG5vdCBzeW1ib2xzOg0KICAgICAgICByZXR1cm4gTm9NYXRjaCgpDQoNCiAgICBpID0gMA0KICAgIHdoaWxlIGkgPCBsZW4oc3ltYm9scyktMToNCiAgICAgICAgY3VyID0gc3ltYm9sc1tpXQ0KICAgICAgICBmb3IgaixvdGhlciBpbiBlbnVtZXJhdGUoc3ltYm9sc1tpKzE6XSk6DQogICAgICAgICAgICBpZiAoIGlzZXF1YWwob3RoZXIsIGN1cikgKToNCiAgICAgICAgICAgICAgICBkZWwgc3ltYm9sc1tpK2orMV0NCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgZWxpZiAoIG1hc2tzKGN1ciwgb3RoZXIpICk6DQogICAgICAgICAgICAgICAgZGVsIHN5bWJvbHNbaStqKzFdDQogICAgICAgICAgICAgICAgc3ltYm9scy5pbnNlcnQoaSxvdGhlcikNCiAgICAgICAgICAgICAgICBjdXIgPSBvdGhlcg0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpICs9IDENCg0KICAgIGlmIG5vdCBjYXNlbGVzcyBhbmQgdXNlUmVnZXg6DQogICAgICAgICN+IHByaW50IChzdHJzLCItPiIsICJ8Ii5qb2luKCBbIF9lc2NhcGVSZWdleENoYXJzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzXSApKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBpZiBsZW4oc3ltYm9scyk9PWxlbigiIi5qb2luKHN5bWJvbHMpKToNCiAgICAgICAgICAgICAgICByZXR1cm4gUmVnZXgoICJbJXNdIiAlICIiLmpvaW4oX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzeW0pIGZvciBzeW0gaW4gc3ltYm9scykgKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBSZWdleCggInwiLmpvaW4ocmUuZXNjYXBlKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKSApLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkV4Y2VwdGlvbiBjcmVhdGluZyBSZWdleCBmb3Igb25lT2YsIGJ1aWxkaW5nIE1hdGNoRmlyc3QiLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQoNCg0KICAgICMgbGFzdCByZXNvcnQsIGp1c3QgdXNlIE1hdGNoRmlyc3QNCiAgICByZXR1cm4gTWF0Y2hGaXJzdChwYXJzZUVsZW1lbnRDbGFzcyhzeW0pIGZvciBzeW0gaW4gc3ltYm9scykuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQ0KDQpkZWYgZGljdE9mKCBrZXksIHZhbHVlICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGVhc2lseSBhbmQgY2xlYXJseSBkZWZpbmUgYSBkaWN0aW9uYXJ5IGJ5IHNwZWNpZnlpbmcgdGhlIHJlc3BlY3RpdmUgcGF0dGVybnMNCiAgICBmb3IgdGhlIGtleSBhbmQgdmFsdWUuICBUYWtlcyBjYXJlIG9mIGRlZmluaW5nIHRoZSBDe0x7RGljdH19LCBDe0x7WmVyb09yTW9yZX19LCBhbmQgQ3tMe0dyb3VwfX0gdG9rZW5zDQogICAgaW4gdGhlIHByb3BlciBvcmRlci4gIFRoZSBrZXkgcGF0dGVybiBjYW4gaW5jbHVkZSBkZWxpbWl0aW5nIG1hcmtlcnMgb3IgcHVuY3R1YXRpb24sDQogICAgYXMgbG9uZyBhcyB0aGV5IGFyZSBzdXBwcmVzc2VkLCB0aGVyZWJ5IGxlYXZpbmcgdGhlIHNpZ25pZmljYW50IGtleSB0ZXh0LiAgVGhlIHZhbHVlDQogICAgcGF0dGVybiBjYW4gaW5jbHVkZSBuYW1lZCByZXN1bHRzLCBzbyB0aGF0IHRoZSBDe0RpY3R9IHJlc3VsdHMgY2FuIGluY2x1ZGUgbmFtZWQgdG9rZW4NCiAgICBmaWVsZHMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IGxpZ2h0IGJsdWUgdGV4dHVyZTogYnVybGFwIg0KICAgICAgICBhdHRyX2V4cHIgPSAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIHByaW50KE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLmR1bXAoKSkNCiAgICAgICAgDQogICAgICAgIGF0dHJfbGFiZWwgPSBsYWJlbA0KICAgICAgICBhdHRyX3ZhbHVlID0gU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pDQoNCiAgICAgICAgIyBzaW1pbGFyIHRvIERpY3QsIGJ1dCBzaW1wbGVyIGNhbGwgZm9ybWF0DQogICAgICAgIHJlc3VsdCA9IGRpY3RPZihhdHRyX2xhYmVsLCBhdHRyX3ZhbHVlKS5wYXJzZVN0cmluZyh0ZXh0KQ0KICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQ0KICAgICAgICBwcmludChyZXN1bHRbJ3NoYXBlJ10pDQogICAgICAgIHByaW50KHJlc3VsdC5zaGFwZSkgICMgb2JqZWN0IGF0dHJpYnV0ZSBhY2Nlc3Mgd29ya3MgdG9vDQogICAgICAgIHByaW50KHJlc3VsdC5hc0RpY3QoKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdsaWdodCBibHVlJ10sIFsndGV4dHVyZScsICdidXJsYXAnXV0NCiAgICAgICAgLSBjb2xvcjogbGlnaHQgYmx1ZQ0KICAgICAgICAtIHBvc246IHVwcGVyIGxlZnQNCiAgICAgICAgLSBzaGFwZTogU1FVQVJFDQogICAgICAgIC0gdGV4dHVyZTogYnVybGFwDQogICAgICAgIFNRVUFSRQ0KICAgICAgICBTUVVBUkUNCiAgICAgICAgeydjb2xvcic6ICdsaWdodCBibHVlJywgJ3NoYXBlJzogJ1NRVUFSRScsICdwb3NuJzogJ3VwcGVyIGxlZnQnLCAndGV4dHVyZSc6ICdidXJsYXAnfQ0KICAgICIiIg0KICAgIHJldHVybiBEaWN0KCBaZXJvT3JNb3JlKCBHcm91cCAoIGtleSArIHZhbHVlICkgKSApDQoNCmRlZiBvcmlnaW5hbFRleHRGb3IoZXhwciwgYXNTdHJpbmc9VHJ1ZSk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIHJldHVybiB0aGUgb3JpZ2luYWwsIHVudG9rZW5pemVkIHRleHQgZm9yIGEgZ2l2ZW4gZXhwcmVzc2lvbi4gIFVzZWZ1bCB0bw0KICAgIHJlc3RvcmUgdGhlIHBhcnNlZCBmaWVsZHMgb2YgYW4gSFRNTCBzdGFydCB0YWcgaW50byB0aGUgcmF3IHRhZyB0ZXh0IGl0c2VsZiwgb3IgdG8NCiAgICByZXZlcnQgc2VwYXJhdGUgdG9rZW5zIHdpdGggaW50ZXJ2ZW5pbmcgd2hpdGVzcGFjZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtYXRjaGluZw0KICAgIGlucHV0IHRleHQuIEJ5IGRlZmF1bHQsIHJldHVybnMgYXN0cmluZyBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBwYXJzZWQgdGV4dC4gIA0KICAgICAgIA0KICAgIElmIHRoZSBvcHRpb25hbCBDe2FzU3RyaW5nfSBhcmd1bWVudCBpcyBwYXNzZWQgYXMgQ3tGYWxzZX0sIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyBhIA0KICAgIEN7THtQYXJzZVJlc3VsdHN9fSBjb250YWluaW5nIGFueSByZXN1bHRzIG5hbWVzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IG1hdGNoZWQsIGFuZCBhIA0KICAgIHNpbmdsZSB0b2tlbiBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBtYXRjaGVkIHRleHQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLiAgU28gaWYgDQogICAgdGhlIGV4cHJlc3Npb24gcGFzc2VkIHRvIEN7THtvcmlnaW5hbFRleHRGb3J9fSBjb250YWlucyBleHByZXNzaW9ucyB3aXRoIGRlZmluZWQNCiAgICByZXN1bHRzIG5hbWVzLCB5b3UgbXVzdCBzZXQgQ3thc1N0cmluZ30gdG8gQ3tGYWxzZX0gaWYgeW91IHdhbnQgdG8gcHJlc2VydmUgdGhvc2UNCiAgICByZXN1bHRzIG5hbWUgdmFsdWVzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHNyYyA9ICJ0aGlzIGlzIHRlc3QgPGI+IGJvbGQgPGk+dGV4dDwvaT4gPC9iPiBub3JtYWwgdGV4dCAiDQogICAgICAgIGZvciB0YWcgaW4gKCJiIiwiaSIpOg0KICAgICAgICAgICAgb3BlbmVyLGNsb3NlciA9IG1ha2VIVE1MVGFncyh0YWcpDQogICAgICAgICAgICBwYXR0ID0gb3JpZ2luYWxUZXh0Rm9yKG9wZW5lciArIFNraXBUbyhjbG9zZXIpICsgY2xvc2VyKQ0KICAgICAgICAgICAgcHJpbnQocGF0dC5zZWFyY2hTdHJpbmcoc3JjKVswXSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJzxiPiBib2xkIDxpPnRleHQ8L2k+IDwvYj4nXQ0KICAgICAgICBbJzxpPnRleHQ8L2k+J10NCiAgICAiIiINCiAgICBsb2NNYXJrZXIgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGxvYyx0OiBsb2MpDQogICAgZW5kbG9jTWFya2VyID0gbG9jTWFya2VyLmNvcHkoKQ0KICAgIGVuZGxvY01hcmtlci5jYWxsUHJlcGFyc2UgPSBGYWxzZQ0KICAgIG1hdGNoRXhwciA9IGxvY01hcmtlcigiX29yaWdpbmFsX3N0YXJ0IikgKyBleHByICsgZW5kbG9jTWFya2VyKCJfb3JpZ2luYWxfZW5kIikNCiAgICBpZiBhc1N0cmluZzoNCiAgICAgICAgZXh0cmFjdFRleHQgPSBsYW1iZGEgcyxsLHQ6IHNbdC5fb3JpZ2luYWxfc3RhcnQ6dC5fb3JpZ2luYWxfZW5kXQ0KICAgIGVsc2U6DQogICAgICAgIGRlZiBleHRyYWN0VGV4dChzLGwsdCk6DQogICAgICAgICAgICB0WzpdID0gW3NbdC5wb3AoJ19vcmlnaW5hbF9zdGFydCcpOnQucG9wKCdfb3JpZ2luYWxfZW5kJyldXQ0KICAgIG1hdGNoRXhwci5zZXRQYXJzZUFjdGlvbihleHRyYWN0VGV4dCkNCiAgICBtYXRjaEV4cHIuaWdub3JlRXhwcnMgPSBleHByLmlnbm9yZUV4cHJzDQogICAgcmV0dXJuIG1hdGNoRXhwcg0KDQpkZWYgdW5ncm91cChleHByKTogDQogICAgIiIiDQogICAgSGVscGVyIHRvIHVuZG8gcHlwYXJzaW5nJ3MgZGVmYXVsdCBncm91cGluZyBvZiBBbmQgZXhwcmVzc2lvbnMsIGV2ZW4NCiAgICBpZiBhbGwgYnV0IG9uZSBhcmUgbm9uLWVtcHR5Lg0KICAgICIiIg0KICAgIHJldHVybiBUb2tlbkNvbnZlcnRlcihleHByKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdKQ0KDQpkZWYgbG9jYXRlZEV4cHIoZXhwcik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlY29yYXRlIGEgcmV0dXJuZWQgdG9rZW4gd2l0aCBpdHMgc3RhcnRpbmcgYW5kIGVuZGluZyBsb2NhdGlvbnMgaW4gdGhlIGlucHV0IHN0cmluZy4NCiAgICBUaGlzIGhlbHBlciBhZGRzIHRoZSBmb2xsb3dpbmcgcmVzdWx0cyBuYW1lczoNCiAgICAgLSBsb2NuX3N0YXJ0ID0gbG9jYXRpb24gd2hlcmUgbWF0Y2hlZCBleHByZXNzaW9uIGJlZ2lucw0KICAgICAtIGxvY25fZW5kID0gbG9jYXRpb24gd2hlcmUgbWF0Y2hlZCBleHByZXNzaW9uIGVuZHMNCiAgICAgLSB2YWx1ZSA9IHRoZSBhY3R1YWwgcGFyc2VkIHJlc3VsdHMNCg0KICAgIEJlIGNhcmVmdWwgaWYgdGhlIGlucHV0IHRleHQgY29udGFpbnMgQ3s8VEFCPn0gY2hhcmFjdGVycywgeW91IG1heSB3YW50IHRvIGNhbGwNCiAgICBDe0x7UGFyc2VyRWxlbWVudC5wYXJzZVdpdGhUYWJzfX0NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBmb3IgbWF0Y2ggaW4gbG9jYXRlZEV4cHIod2QpLnNlYXJjaFN0cmluZygibGpzZGYxMjNsa3NkampmMTIzbGtramoxMjIyIik6DQogICAgICAgICAgICBwcmludChtYXRjaCkNCiAgICBwcmludHM6Og0KICAgICAgICBbWzAsICdsanNkZicsIDVdXQ0KICAgICAgICBbWzgsICdsa3NkampmJywgMTVdXQ0KICAgICAgICBbWzE4LCAnbGtramonLCAyM11dDQogICAgIiIiDQogICAgbG9jYXRvciA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OiBsKQ0KICAgIHJldHVybiBHcm91cChsb2NhdG9yKCJsb2NuX3N0YXJ0IikgKyBleHByKCJ2YWx1ZSIpICsgbG9jYXRvci5jb3B5KCkubGVhdmVXaGl0ZXNwYWNlKCkoImxvY25fZW5kIikpDQoNCg0KIyBjb252ZW5pZW5jZSBjb25zdGFudHMgZm9yIHBvc2l0aW9uYWwgZXhwcmVzc2lvbnMNCmVtcHR5ICAgICAgID0gRW1wdHkoKS5zZXROYW1lKCJlbXB0eSIpDQpsaW5lU3RhcnQgICA9IExpbmVTdGFydCgpLnNldE5hbWUoImxpbmVTdGFydCIpDQpsaW5lRW5kICAgICA9IExpbmVFbmQoKS5zZXROYW1lKCJsaW5lRW5kIikNCnN0cmluZ1N0YXJ0ID0gU3RyaW5nU3RhcnQoKS5zZXROYW1lKCJzdHJpbmdTdGFydCIpDQpzdHJpbmdFbmQgICA9IFN0cmluZ0VuZCgpLnNldE5hbWUoInN0cmluZ0VuZCIpDQoNCl9lc2NhcGVkUHVuYyA9IFdvcmQoIF9ic2xhc2gsIHIiXFtdLSouJCtePygpfiAiLCBleGFjdD0yICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF1bMV0pDQpfZXNjYXBlZEhleENoYXIgPSBSZWdleChyIlxcMD9beFhdWzAtOWEtZkEtRl0rIikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnVuaWNocihpbnQodFswXS5sc3RyaXAocidcMHgnKSwxNikpKQ0KX2VzY2FwZWRPY3RDaGFyID0gUmVnZXgociJcXDBbMC03XSsiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dW5pY2hyKGludCh0WzBdWzE6XSw4KSkpDQpfc2luZ2xlQ2hhciA9IF9lc2NhcGVkUHVuYyB8IF9lc2NhcGVkSGV4Q2hhciB8IF9lc2NhcGVkT2N0Q2hhciB8IFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPXInXF0nLCBleGFjdD0xKSB8IFJlZ2V4KHIiXHciLCByZS5VTklDT0RFKQ0KX2NoYXJSYW5nZSA9IEdyb3VwKF9zaW5nbGVDaGFyICsgU3VwcHJlc3MoIi0iKSArIF9zaW5nbGVDaGFyKQ0KX3JlQnJhY2tldEV4cHIgPSBMaXRlcmFsKCJbIikgKyBPcHRpb25hbCgiXiIpLnNldFJlc3VsdHNOYW1lKCJuZWdhdGUiKSArIEdyb3VwKCBPbmVPck1vcmUoIF9jaGFyUmFuZ2UgfCBfc2luZ2xlQ2hhciApICkuc2V0UmVzdWx0c05hbWUoImJvZHkiKSArICJdIg0KDQpkZWYgc3JhbmdlKHMpOg0KICAgIHIiIiINCiAgICBIZWxwZXIgdG8gZWFzaWx5IGRlZmluZSBzdHJpbmcgcmFuZ2VzIGZvciB1c2UgaW4gV29yZCBjb25zdHJ1Y3Rpb24uICBCb3Jyb3dzDQogICAgc3ludGF4IGZyb20gcmVnZXhwICdbXScgc3RyaW5nIHJhbmdlIGRlZmluaXRpb25zOjoNCiAgICAgICAgc3JhbmdlKCJbMC05XSIpICAgLT4gIjAxMjM0NTY3ODkiDQogICAgICAgIHNyYW5nZSgiW2Etel0iKSAgIC0+ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiINCiAgICAgICAgc3JhbmdlKCJbYS16JF9dIikgLT4gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JF8iDQogICAgVGhlIGlucHV0IHN0cmluZyBtdXN0IGJlIGVuY2xvc2VkIGluIFtdJ3MsIGFuZCB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIHRoZSBleHBhbmRlZA0KICAgIGNoYXJhY3RlciBzZXQgam9pbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nLg0KICAgIFRoZSB2YWx1ZXMgZW5jbG9zZWQgaW4gdGhlIFtdJ3MgbWF5IGJlOg0KICAgICAtIGEgc2luZ2xlIGNoYXJhY3Rlcg0KICAgICAtIGFuIGVzY2FwZWQgY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIGJhY2tzbGFzaCAoc3VjaCBhcyBDe1wtfSBvciBDe1xdfSkNCiAgICAgLSBhbiBlc2NhcGVkIGhleCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgQ3snXHgnfSAoQ3tceDIxfSwgd2hpY2ggaXMgYSBDeychJ30gY2hhcmFjdGVyKSANCiAgICAgICAgIChDe1wweCMjfSBpcyBhbHNvIHN1cHBvcnRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpIA0KICAgICAtIGFuIGVzY2FwZWQgb2N0YWwgY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIEN7J1wwJ30gKEN7XDA0MX0sIHdoaWNoIGlzIGEgQ3snISd9IGNoYXJhY3RlcikNCiAgICAgLSBhIHJhbmdlIG9mIGFueSBvZiB0aGUgYWJvdmUsIHNlcGFyYXRlZCBieSBhIGRhc2ggKEN7J2Eteid9LCBldGMuKQ0KICAgICAtIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgYWJvdmUgKEN7J2FlaW91eSd9LCBDeydhLXpBLVowLTlfJCd9LCBldGMuKQ0KICAgICIiIg0KICAgIF9leHBhbmRlZCA9IGxhbWJkYSBwOiBwIGlmIG5vdCBpc2luc3RhbmNlKHAsUGFyc2VSZXN1bHRzKSBlbHNlICcnLmpvaW4odW5pY2hyKGMpIGZvciBjIGluIHJhbmdlKG9yZChwWzBdKSxvcmQocFsxXSkrMSkpDQogICAgdHJ5Og0KICAgICAgICByZXR1cm4gIiIuam9pbihfZXhwYW5kZWQocGFydCkgZm9yIHBhcnQgaW4gX3JlQnJhY2tldEV4cHIucGFyc2VTdHJpbmcocykuYm9keSkNCiAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICByZXR1cm4gIiINCg0KZGVmIG1hdGNoT25seUF0Q29sKG4pOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGRlZmluaW5nIHBhcnNlIGFjdGlvbnMgdGhhdCByZXF1aXJlIG1hdGNoaW5nIGF0IGEgc3BlY2lmaWMNCiAgICBjb2x1bW4gaW4gdGhlIGlucHV0IHRleHQuDQogICAgIiIiDQogICAgZGVmIHZlcmlmeUNvbChzdHJnLGxvY24sdG9rcyk6DQogICAgICAgIGlmIGNvbChsb2NuLHN0cmcpICE9IG46DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzdHJnLGxvY24sIm1hdGNoZWQgdG9rZW4gbm90IGF0IGNvbHVtbiAlZCIgJSBuKQ0KICAgIHJldHVybiB2ZXJpZnlDb2wNCg0KZGVmIHJlcGxhY2VXaXRoKHJlcGxTdHIpOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGNvbW1vbiBwYXJzZSBhY3Rpb25zIHRoYXQgc2ltcGx5IHJldHVybiBhIGxpdGVyYWwgdmFsdWUuICBFc3BlY2lhbGx5DQogICAgdXNlZnVsIHdoZW4gdXNlZCB3aXRoIEN7THt0cmFuc2Zvcm1TdHJpbmc8UGFyc2VyRWxlbWVudC50cmFuc2Zvcm1TdHJpbmc+fSgpfS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBudW0gPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgIG5hID0gb25lT2YoIk4vQSBOQSIpLnNldFBhcnNlQWN0aW9uKHJlcGxhY2VXaXRoKG1hdGgubmFuKSkNCiAgICAgICAgdGVybSA9IG5hIHwgbnVtDQogICAgICAgIA0KICAgICAgICBPbmVPck1vcmUodGVybSkucGFyc2VTdHJpbmcoIjMyNCAyMzQgTi9BIDIzNCIpICMgLT4gWzMyNCwgMjM0LCBuYW4sIDIzNF0NCiAgICAiIiINCiAgICByZXR1cm4gbGFtYmRhIHMsbCx0OiBbcmVwbFN0cl0NCg0KZGVmIHJlbW92ZVF1b3RlcyhzLGwsdCk6DQogICAgIiIiDQogICAgSGVscGVyIHBhcnNlIGFjdGlvbiBmb3IgcmVtb3ZpbmcgcXVvdGF0aW9uIG1hcmtzIGZyb20gcGFyc2VkIHF1b3RlZCBzdHJpbmdzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgYnkgZGVmYXVsdCwgcXVvdGF0aW9uIG1hcmtzIGFyZSBpbmNsdWRlZCBpbiBwYXJzZWQgcmVzdWx0cw0KICAgICAgICBxdW90ZWRTdHJpbmcucGFyc2VTdHJpbmcoIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciKSAjIC0+IFsiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyJdDQoNCiAgICAgICAgIyB1c2UgcmVtb3ZlUXVvdGVzIHRvIHN0cmlwIHF1b3RhdGlvbiBtYXJrcyBmcm9tIHBhcnNlZCByZXN1bHRzDQogICAgICAgIHF1b3RlZFN0cmluZy5zZXRQYXJzZUFjdGlvbihyZW1vdmVRdW90ZXMpDQogICAgICAgIHF1b3RlZFN0cmluZy5wYXJzZVN0cmluZygiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyIpICMgLT4gWyJOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCJdDQogICAgIiIiDQogICAgcmV0dXJuIHRbMF1bMTotMV0NCg0KZGVmIHRva2VuTWFwKGZ1bmMsICphcmdzKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgcGFyc2UgYWN0aW9uIGJ5IG1hcHBpbmcgYSBmdW5jdGlvbiB0byBhbGwgZWxlbWVudHMgb2YgYSBQYXJzZVJlc3VsdHMgbGlzdC5JZiBhbnkgYWRkaXRpb25hbCANCiAgICBhcmdzIGFyZSBwYXNzZWQsIHRoZXkgYXJlIGZvcndhcmRlZCB0byB0aGUgZ2l2ZW4gZnVuY3Rpb24gYXMgYWRkaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXINCiAgICB0aGUgdG9rZW4sIGFzIGluIEN7aGV4X2ludGVnZXIgPSBXb3JkKGhleG51bXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwgMTYpKX0sIHdoaWNoIHdpbGwgY29udmVydCB0aGUNCiAgICBwYXJzZWQgZGF0YSB0byBhbiBpbnRlZ2VyIHVzaW5nIGJhc2UgMTYuDQoNCiAgICBFeGFtcGxlIChjb21wYXJlIHRoZSBsYXN0IHRvIGV4YW1wbGUgaW4gTHtQYXJzZXJFbGVtZW50LnRyYW5zZm9ybVN0cmluZ306Og0KICAgICAgICBoZXhfaW50cyA9IE9uZU9yTW9yZShXb3JkKGhleG51bXMpKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsIDE2KSkNCiAgICAgICAgaGV4X2ludHMucnVuVGVzdHMoJycnDQogICAgICAgICAgICAwMCAxMSAyMiBhYSBGRiAwYSAwZCAxYQ0KICAgICAgICAgICAgJycnKQ0KICAgICAgICANCiAgICAgICAgdXBwZXJ3b3JkID0gV29yZChhbHBoYXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci51cHBlcikpDQogICAgICAgIE9uZU9yTW9yZSh1cHBlcndvcmQpLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgbXkga2luZ2RvbSBmb3IgYSBob3JzZQ0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHdkID0gV29yZChhbHBoYXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci50aXRsZSkpDQogICAgICAgIE9uZU9yTW9yZSh3ZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgbm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yaw0KICAgICAgICAgICAgJycnKQ0KICAgIHByaW50czo6DQogICAgICAgIDAwIDExIDIyIGFhIEZGIDBhIDBkIDFhDQogICAgICAgIFswLCAxNywgMzQsIDE3MCwgMjU1LCAxMCwgMTMsIDI2XQ0KDQogICAgICAgIG15IGtpbmdkb20gZm9yIGEgaG9yc2UNCiAgICAgICAgWydNWScsICdLSU5HRE9NJywgJ0ZPUicsICdBJywgJ0hPUlNFJ10NCg0KICAgICAgICBub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrDQogICAgICAgIFsnTm93IElzIFRoZSBXaW50ZXIgT2YgT3VyIERpc2NvbnRlbnQgTWFkZSBHbG9yaW91cyBTdW1tZXIgQnkgVGhpcyBTdW4gT2YgWW9yayddDQogICAgIiIiDQogICAgZGVmIHBhKHMsbCx0KToNCiAgICAgICAgcmV0dXJuIFtmdW5jKHRva24sICphcmdzKSBmb3IgdG9rbiBpbiB0XQ0KDQogICAgdHJ5Og0KICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICdfX25hbWVfXycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoZnVuYywgJ19fY2xhc3NfXycpLl9fbmFtZV9fKQ0KICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgIGZ1bmNfbmFtZSA9IHN0cihmdW5jKQ0KICAgIHBhLl9fbmFtZV9fID0gZnVuY19uYW1lDQoNCiAgICByZXR1cm4gcGENCg0KdXBjYXNlVG9rZW5zID0gdG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLnVwcGVyKCkpDQoiIiIoRGVwcmVjYXRlZCkgSGVscGVyIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byB1cHBlciBjYXNlLiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi51cGNhc2VUb2tlbnN9IiIiDQoNCmRvd25jYXNlVG9rZW5zID0gdG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLmxvd2VyKCkpDQoiIiIoRGVwcmVjYXRlZCkgSGVscGVyIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byBsb3dlciBjYXNlLiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi5kb3duY2FzZVRva2Vuc30iIiINCiAgICANCmRlZiBfbWFrZVRhZ3ModGFnU3RyLCB4bWwpOg0KICAgICIiIkludGVybmFsIGhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMsIGdpdmVuIGEgdGFnIG5hbWUiIiINCiAgICBpZiBpc2luc3RhbmNlKHRhZ1N0cixiYXNlc3RyaW5nKToNCiAgICAgICAgcmVzbmFtZSA9IHRhZ1N0cg0KICAgICAgICB0YWdTdHIgPSBLZXl3b3JkKHRhZ1N0ciwgY2FzZWxlc3M9bm90IHhtbCkNCiAgICBlbHNlOg0KICAgICAgICByZXNuYW1lID0gdGFnU3RyLm5hbWUNCg0KICAgIHRhZ0F0dHJOYW1lID0gV29yZChhbHBoYXMsYWxwaGFudW1zKyJfLToiKQ0KICAgIGlmICh4bWwpOg0KICAgICAgICB0YWdBdHRyVmFsdWUgPSBkYmxRdW90ZWRTdHJpbmcuY29weSgpLnNldFBhcnNlQWN0aW9uKCByZW1vdmVRdW90ZXMgKQ0KICAgICAgICBvcGVuVGFnID0gU3VwcHJlc3MoIjwiKSArIHRhZ1N0cigidGFnIikgKyBcDQogICAgICAgICAgICAgICAgRGljdChaZXJvT3JNb3JlKEdyb3VwKCB0YWdBdHRyTmFtZSArIFN1cHByZXNzKCI9IikgKyB0YWdBdHRyVmFsdWUgKSkpICsgXA0KICAgICAgICAgICAgICAgIE9wdGlvbmFsKCIvIixkZWZhdWx0PVtGYWxzZV0pLnNldFJlc3VsdHNOYW1lKCJlbXB0eSIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdPT0nLycpICsgU3VwcHJlc3MoIj4iKQ0KICAgIGVsc2U6DQogICAgICAgIHByaW50YWJsZXNMZXNzUkFicmFjayA9ICIiLmpvaW4oYyBmb3IgYyBpbiBwcmludGFibGVzIGlmIGMgbm90IGluICI+IikNCiAgICAgICAgdGFnQXR0clZhbHVlID0gcXVvdGVkU3RyaW5nLmNvcHkoKS5zZXRQYXJzZUFjdGlvbiggcmVtb3ZlUXVvdGVzICkgfCBXb3JkKHByaW50YWJsZXNMZXNzUkFicmFjaykNCiAgICAgICAgb3BlblRhZyA9IFN1cHByZXNzKCI8IikgKyB0YWdTdHIoInRhZyIpICsgXA0KICAgICAgICAgICAgICAgIERpY3QoWmVyb09yTW9yZShHcm91cCggdGFnQXR0ck5hbWUuc2V0UGFyc2VBY3Rpb24oZG93bmNhc2VUb2tlbnMpICsgXA0KICAgICAgICAgICAgICAgIE9wdGlvbmFsKCBTdXBwcmVzcygiPSIpICsgdGFnQXR0clZhbHVlICkgKSkpICsgXA0KICAgICAgICAgICAgICAgIE9wdGlvbmFsKCIvIixkZWZhdWx0PVtGYWxzZV0pLnNldFJlc3VsdHNOYW1lKCJlbXB0eSIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdPT0nLycpICsgU3VwcHJlc3MoIj4iKQ0KICAgIGNsb3NlVGFnID0gQ29tYmluZShfTCgiPC8iKSArIHRhZ1N0ciArICI+IikNCg0KICAgIG9wZW5UYWcgPSBvcGVuVGFnLnNldFJlc3VsdHNOYW1lKCJzdGFydCIrIiIuam9pbihyZXNuYW1lLnJlcGxhY2UoIjoiLCIgIikudGl0bGUoKS5zcGxpdCgpKSkuc2V0TmFtZSgiPCVzPiIgJSByZXNuYW1lKQ0KICAgIGNsb3NlVGFnID0gY2xvc2VUYWcuc2V0UmVzdWx0c05hbWUoImVuZCIrIiIuam9pbihyZXNuYW1lLnJlcGxhY2UoIjoiLCIgIikudGl0bGUoKS5zcGxpdCgpKSkuc2V0TmFtZSgiPC8lcz4iICUgcmVzbmFtZSkNCiAgICBvcGVuVGFnLnRhZyA9IHJlc25hbWUNCiAgICBjbG9zZVRhZy50YWcgPSByZXNuYW1lDQogICAgcmV0dXJuIG9wZW5UYWcsIGNsb3NlVGFnDQoNCmRlZiBtYWtlSFRNTFRhZ3ModGFnU3RyKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zIGZvciBIVE1MLCBnaXZlbiBhIHRhZyBuYW1lLiBNYXRjaGVzDQogICAgdGFncyBpbiBlaXRoZXIgdXBwZXIgb3IgbG93ZXIgY2FzZSwgYXR0cmlidXRlcyB3aXRoIG5hbWVzcGFjZXMgYW5kIHdpdGggcXVvdGVkIG9yIHVucXVvdGVkIHZhbHVlcy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB0ZXh0ID0gJzx0ZD5Nb3JlIGluZm8gYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20iPnB5cGFyc2luZzwvYT4gd2lraSBwYWdlPC90ZD4nDQogICAgICAgICMgbWFrZUhUTUxUYWdzIHJldHVybnMgcHlwYXJzaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyB0YWdzIGFzIGEgMi10dXBsZQ0KICAgICAgICBhLGFfZW5kID0gbWFrZUhUTUxUYWdzKCJBIikNCiAgICAgICAgbGlua19leHByID0gYSArIFNraXBUbyhhX2VuZCkoImxpbmtfdGV4dCIpICsgYV9lbmQNCiAgICAgICAgDQogICAgICAgIGZvciBsaW5rIGluIGxpbmtfZXhwci5zZWFyY2hTdHJpbmcodGV4dCk6DQogICAgICAgICAgICAjIGF0dHJpYnV0ZXMgaW4gdGhlIDxBPiB0YWcgKGxpa2UgImhyZWYiIHNob3duIGhlcmUpIGFyZSBhbHNvIGFjY2Vzc2libGUgYXMgbmFtZWQgcmVzdWx0cw0KICAgICAgICAgICAgcHJpbnQobGluay5saW5rX3RleHQsICctPicsIGxpbmsuaHJlZikNCiAgICBwcmludHM6Og0KICAgICAgICBweXBhcnNpbmcgLT4gaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbQ0KICAgICIiIg0KICAgIHJldHVybiBfbWFrZVRhZ3MoIHRhZ1N0ciwgRmFsc2UgKQ0KDQpkZWYgbWFrZVhNTFRhZ3ModGFnU3RyKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zIGZvciBYTUwsIGdpdmVuIGEgdGFnIG5hbWUuIE1hdGNoZXMNCiAgICB0YWdzIG9ubHkgaW4gdGhlIGdpdmVuIHVwcGVyL2xvd2VyIGNhc2UuDQoNCiAgICBFeGFtcGxlOiBzaW1pbGFyIHRvIEx7bWFrZUhUTUxUYWdzfQ0KICAgICIiIg0KICAgIHJldHVybiBfbWFrZVRhZ3MoIHRhZ1N0ciwgVHJ1ZSApDQoNCmRlZiB3aXRoQXR0cmlidXRlKCphcmdzLCoqYXR0ckRpY3QpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBjcmVhdGUgYSB2YWxpZGF0aW5nIHBhcnNlIGFjdGlvbiB0byBiZSB1c2VkIHdpdGggc3RhcnQgdGFncyBjcmVhdGVkDQogICAgd2l0aCBDe0x7bWFrZVhNTFRhZ3N9fSBvciBDe0x7bWFrZUhUTUxUYWdzfX0uIFVzZSBDe3dpdGhBdHRyaWJ1dGV9IHRvIHF1YWxpZnkgYSBzdGFydGluZyB0YWcNCiAgICB3aXRoIGEgcmVxdWlyZWQgYXR0cmlidXRlIHZhbHVlLCB0byBhdm9pZCBmYWxzZSBtYXRjaGVzIG9uIGNvbW1vbiB0YWdzIHN1Y2ggYXMNCiAgICBDezxURD59IG9yIEN7PERJVj59Lg0KDQogICAgQ2FsbCBDe3dpdGhBdHRyaWJ1dGV9IHdpdGggYSBzZXJpZXMgb2YgYXR0cmlidXRlIG5hbWVzIGFuZCB2YWx1ZXMuIFNwZWNpZnkgdGhlIGxpc3QNCiAgICBvZiBmaWx0ZXIgYXR0cmlidXRlcyBuYW1lcyBhbmQgdmFsdWVzIGFzOg0KICAgICAtIGtleXdvcmQgYXJndW1lbnRzLCBhcyBpbiBDeyhhbGlnbj0icmlnaHQiKX0sIG9yDQogICAgIC0gYXMgYW4gZXhwbGljaXQgZGljdCB3aXRoIEN7Kip9IG9wZXJhdG9yLCB3aGVuIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGFsc28gYSBQeXRob24NCiAgICAgICAgICByZXNlcnZlZCB3b3JkLCBhcyBpbiBDeyoqeyJjbGFzcyI6IkN1c3RvbWVyIiwgImFsaWduIjoicmlnaHQifX0NCiAgICAgLSBhIGxpc3Qgb2YgbmFtZS12YWx1ZSB0dXBsZXMsIGFzIGluICggKCJuczE6Y2xhc3MiLCAiQ3VzdG9tZXIiKSwgKCJuczI6YWxpZ24iLCJyaWdodCIpICkNCiAgICBGb3IgYXR0cmlidXRlIG5hbWVzIHdpdGggYSBuYW1lc3BhY2UgcHJlZml4LCB5b3UgbXVzdCB1c2UgdGhlIHNlY29uZCBmb3JtLiAgQXR0cmlidXRlDQogICAgbmFtZXMgYXJlIG1hdGNoZWQgaW5zZW5zaXRpdmUgdG8gdXBwZXIvbG93ZXIgY2FzZS4NCiAgICAgICANCiAgICBJZiBqdXN0IHRlc3RpbmcgZm9yIEN7Y2xhc3N9ICh3aXRoIG9yIHdpdGhvdXQgYSBuYW1lc3BhY2UpLCB1c2UgQ3tMe3dpdGhDbGFzc319Lg0KDQogICAgVG8gdmVyaWZ5IHRoYXQgdGhlIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCB3aXRob3V0IHNwZWNpZnlpbmcgYSB2YWx1ZSwgcGFzcw0KICAgIEN7d2l0aEF0dHJpYnV0ZS5BTllfVkFMVUV9IGFzIHRoZSB2YWx1ZS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBodG1sID0gJycnDQogICAgICAgICAgICA8ZGl2Pg0KICAgICAgICAgICAgU29tZSB0ZXh0DQogICAgICAgICAgICA8ZGl2IHR5cGU9ImdyaWQiPjEgNCAwIDEgMDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiB0eXBlPSJncmFwaCI+MSwzIDIsMyAxLDE8L2Rpdj4NCiAgICAgICAgICAgIDxkaXY+dGhpcyBoYXMgbm8gdHlwZTwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgDQogICAgICAgICcnJw0KICAgICAgICBkaXYsZGl2X2VuZCA9IG1ha2VIVE1MVGFncygiZGl2IikNCg0KICAgICAgICAjIG9ubHkgbWF0Y2ggZGl2IHRhZyBoYXZpbmcgYSB0eXBlIGF0dHJpYnV0ZSB3aXRoIHZhbHVlICJncmlkIg0KICAgICAgICBkaXZfZ3JpZCA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhBdHRyaWJ1dGUodHlwZT0iZ3JpZCIpKQ0KICAgICAgICBncmlkX2V4cHIgPSBkaXZfZ3JpZCArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBncmlkX2hlYWRlciBpbiBncmlkX2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZ3JpZF9oZWFkZXIuYm9keSkNCiAgICAgICAgDQogICAgICAgICMgY29uc3RydWN0IGEgbWF0Y2ggd2l0aCBhbnkgZGl2IHRhZyBoYXZpbmcgYSB0eXBlIGF0dHJpYnV0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUNCiAgICAgICAgZGl2X2FueV90eXBlID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aEF0dHJpYnV0ZSh0eXBlPXdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFKSkNCiAgICAgICAgZGl2X2V4cHIgPSBkaXZfYW55X3R5cGUgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQ0KICAgICAgICBmb3IgZGl2X2hlYWRlciBpbiBkaXZfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6DQogICAgICAgICAgICBwcmludChkaXZfaGVhZGVyLmJvZHkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgMSA0IDAgMSAwDQoNCiAgICAgICAgMSA0IDAgMSAwDQogICAgICAgIDEsMyAyLDMgMSwxDQogICAgIiIiDQogICAgaWYgYXJnczoNCiAgICAgICAgYXR0cnMgPSBhcmdzWzpdDQogICAgZWxzZToNCiAgICAgICAgYXR0cnMgPSBhdHRyRGljdC5pdGVtcygpDQogICAgYXR0cnMgPSBbKGssdikgZm9yIGssdiBpbiBhdHRyc10NCiAgICBkZWYgcGEocyxsLHRva2Vucyk6DQogICAgICAgIGZvciBhdHRyTmFtZSxhdHRyVmFsdWUgaW4gYXR0cnM6DQogICAgICAgICAgICBpZiBhdHRyTmFtZSBub3QgaW4gdG9rZW5zOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm8gbWF0Y2hpbmcgYXR0cmlidXRlICIgKyBhdHRyTmFtZSkNCiAgICAgICAgICAgIGlmIGF0dHJWYWx1ZSAhPSB3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSBhbmQgdG9rZW5zW2F0dHJOYW1lXSAhPSBhdHRyVmFsdWU6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJhdHRyaWJ1dGUgJyVzJyBoYXMgdmFsdWUgJyVzJywgbXVzdCBiZSAnJXMnIiAlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdHRyTmFtZSwgdG9rZW5zW2F0dHJOYW1lXSwgYXR0clZhbHVlKSkNCiAgICByZXR1cm4gcGENCndpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFID0gb2JqZWN0KCkNCg0KZGVmIHdpdGhDbGFzcyhjbGFzc25hbWUsIG5hbWVzcGFjZT0nJyk6DQogICAgIiIiDQogICAgU2ltcGxpZmllZCB2ZXJzaW9uIG9mIEN7THt3aXRoQXR0cmlidXRlfX0gd2hlbiBtYXRjaGluZyBvbiBhIGRpdiBjbGFzcyAtIG1hZGUNCiAgICBkaWZmaWN1bHQgYmVjYXVzZSBDe2NsYXNzfSBpcyBhIHJlc2VydmVkIHdvcmQgaW4gUHl0aG9uLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGh0bWwgPSAnJycNCiAgICAgICAgICAgIDxkaXY+DQogICAgICAgICAgICBTb21lIHRleHQNCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdyaWQiPjEgNCAwIDEgMDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JhcGgiPjEsMyAyLDMgMSwxPC9kaXY+DQogICAgICAgICAgICA8ZGl2PnRoaXMgJmx0O2RpdiZndDsgaGFzIG5vIGNsYXNzPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICANCiAgICAgICAgJycnDQogICAgICAgIGRpdixkaXZfZW5kID0gbWFrZUhUTUxUYWdzKCJkaXYiKQ0KICAgICAgICBkaXZfZ3JpZCA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhDbGFzcygiZ3JpZCIpKQ0KICAgICAgICANCiAgICAgICAgZ3JpZF9leHByID0gZGl2X2dyaWQgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQ0KICAgICAgICBmb3IgZ3JpZF9oZWFkZXIgaW4gZ3JpZF9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGdyaWRfaGVhZGVyLmJvZHkpDQogICAgICAgIA0KICAgICAgICBkaXZfYW55X3R5cGUgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQ2xhc3Mod2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUpKQ0KICAgICAgICBkaXZfZXhwciA9IGRpdl9hbnlfdHlwZSArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBkaXZfaGVhZGVyIGluIGRpdl9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGRpdl9oZWFkZXIuYm9keSkNCiAgICBwcmludHM6Og0KICAgICAgICAxIDQgMCAxIDANCg0KICAgICAgICAxIDQgMCAxIDANCiAgICAgICAgMSwzIDIsMyAxLDENCiAgICAiIiINCiAgICBjbGFzc2F0dHIgPSAiJXM6Y2xhc3MiICUgbmFtZXNwYWNlIGlmIG5hbWVzcGFjZSBlbHNlICJjbGFzcyINCiAgICByZXR1cm4gd2l0aEF0dHJpYnV0ZSgqKntjbGFzc2F0dHIgOiBjbGFzc25hbWV9KSAgICAgICAgDQoNCm9wQXNzb2MgPSBfQ29uc3RhbnRzKCkNCm9wQXNzb2MuTEVGVCA9IG9iamVjdCgpDQpvcEFzc29jLlJJR0hUID0gb2JqZWN0KCkNCg0KZGVmIGluZml4Tm90YXRpb24oIGJhc2VFeHByLCBvcExpc3QsIGxwYXI9U3VwcHJlc3MoJygnKSwgcnBhcj1TdXBwcmVzcygnKScpICk6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGdyYW1tYXJzIG9mIGV4cHJlc3Npb25zIG1hZGUgdXAgb2YNCiAgICBvcGVyYXRvcnMgd29ya2luZyBpbiBhIHByZWNlZGVuY2UgaGllcmFyY2h5LiAgT3BlcmF0b3JzIG1heSBiZSB1bmFyeSBvcg0KICAgIGJpbmFyeSwgbGVmdC0gb3IgcmlnaHQtYXNzb2NpYXRpdmUuICBQYXJzZSBhY3Rpb25zIGNhbiBhbHNvIGJlIGF0dGFjaGVkDQogICAgdG8gb3BlcmF0b3IgZXhwcmVzc2lvbnMuIFRoZSBnZW5lcmF0ZWQgcGFyc2VyIHdpbGwgYWxzbyByZWNvZ25pemUgdGhlIHVzZSANCiAgICBvZiBwYXJlbnRoZXNlcyB0byBvdmVycmlkZSBvcGVyYXRvciBwcmVjZWRlbmNlcyAoc2VlIGV4YW1wbGUgYmVsb3cpLg0KICAgIA0KICAgIE5vdGU6IGlmIHlvdSBkZWZpbmUgYSBkZWVwIG9wZXJhdG9yIGxpc3QsIHlvdSBtYXkgc2VlIHBlcmZvcm1hbmNlIGlzc3Vlcw0KICAgIHdoZW4gdXNpbmcgaW5maXhOb3RhdGlvbi4gU2VlIEx7UGFyc2VyRWxlbWVudC5lbmFibGVQYWNrcmF0fSBmb3IgYQ0KICAgIG1lY2hhbmlzbSB0byBwb3RlbnRpYWxseSBpbXByb3ZlIHlvdXIgcGFyc2VyIHBlcmZvcm1hbmNlLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBiYXNlRXhwciAtIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBtb3N0IGJhc2ljIGVsZW1lbnQgZm9yIHRoZSBuZXN0ZWQNCiAgICAgLSBvcExpc3QgLSBsaXN0IG9mIHR1cGxlcywgb25lIGZvciBlYWNoIG9wZXJhdG9yIHByZWNlZGVuY2UgbGV2ZWwgaW4gdGhlDQogICAgICBleHByZXNzaW9uIGdyYW1tYXI7IGVhY2ggdHVwbGUgaXMgb2YgdGhlIGZvcm0NCiAgICAgIChvcEV4cHIsIG51bVRlcm1zLCByaWdodExlZnRBc3NvYywgcGFyc2VBY3Rpb24pLCB3aGVyZToNCiAgICAgICAtIG9wRXhwciBpcyB0aGUgcHlwYXJzaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBvcGVyYXRvcjsNCiAgICAgICAgICBtYXkgYWxzbyBiZSBhIHN0cmluZywgd2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBMaXRlcmFsOw0KICAgICAgICAgIGlmIG51bVRlcm1zIGlzIDMsIG9wRXhwciBpcyBhIHR1cGxlIG9mIHR3byBleHByZXNzaW9ucywgZm9yIHRoZQ0KICAgICAgICAgIHR3byBvcGVyYXRvcnMgc2VwYXJhdGluZyB0aGUgMyB0ZXJtcw0KICAgICAgIC0gbnVtVGVybXMgaXMgdGhlIG51bWJlciBvZiB0ZXJtcyBmb3IgdGhpcyBvcGVyYXRvciAobXVzdA0KICAgICAgICAgIGJlIDEsIDIsIG9yIDMpDQogICAgICAgLSByaWdodExlZnRBc3NvYyBpcyB0aGUgaW5kaWNhdG9yIHdoZXRoZXIgdGhlIG9wZXJhdG9yIGlzDQogICAgICAgICAgcmlnaHQgb3IgbGVmdCBhc3NvY2lhdGl2ZSwgdXNpbmcgdGhlIHB5cGFyc2luZy1kZWZpbmVkDQogICAgICAgICAgY29uc3RhbnRzIEN7b3BBc3NvYy5SSUdIVH0gYW5kIEN7b3BBc3NvYy5MRUZUfS4NCiAgICAgICAtIHBhcnNlQWN0aW9uIGlzIHRoZSBwYXJzZSBhY3Rpb24gdG8gYmUgYXNzb2NpYXRlZCB3aXRoDQogICAgICAgICAgZXhwcmVzc2lvbnMgbWF0Y2hpbmcgdGhpcyBvcGVyYXRvciBleHByZXNzaW9uICh0aGUNCiAgICAgICAgICBwYXJzZSBhY3Rpb24gdHVwbGUgbWVtYmVyIG1heSBiZSBvbWl0dGVkKQ0KICAgICAtIGxwYXIgLSBleHByZXNzaW9uIGZvciBtYXRjaGluZyBsZWZ0LXBhcmVudGhlc2VzIChkZWZhdWx0PUN7U3VwcHJlc3MoJygnKX0pDQogICAgIC0gcnBhciAtIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIHJpZ2h0LXBhcmVudGhlc2VzIChkZWZhdWx0PUN7U3VwcHJlc3MoJyknKX0pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBzaW1wbGUgZXhhbXBsZSBvZiBmb3VyLWZ1bmN0aW9uIGFyaXRobWV0aWMgd2l0aCBpbnRzIGFuZCB2YXJpYWJsZSBuYW1lcw0KICAgICAgICBpbnRlZ2VyID0gcHlwYXJzaW5nX2NvbW1vbi5zaWduZWRfaW50ZWdlcg0KICAgICAgICB2YXJuYW1lID0gcHlwYXJzaW5nX2NvbW1vbi5pZGVudGlmaWVyIA0KICAgICAgICANCiAgICAgICAgYXJpdGhfZXhwciA9IGluZml4Tm90YXRpb24oaW50ZWdlciB8IHZhcm5hbWUsDQogICAgICAgICAgICBbDQogICAgICAgICAgICAoJy0nLCAxLCBvcEFzc29jLlJJR0hUKSwNCiAgICAgICAgICAgIChvbmVPZignKiAvJyksIDIsIG9wQXNzb2MuTEVGVCksDQogICAgICAgICAgICAob25lT2YoJysgLScpLCAyLCBvcEFzc29jLkxFRlQpLA0KICAgICAgICAgICAgXSkNCiAgICAgICAgDQogICAgICAgIGFyaXRoX2V4cHIucnVuVGVzdHMoJycnDQogICAgICAgICAgICA1KzMqNg0KICAgICAgICAgICAgKDUrMykqNg0KICAgICAgICAgICAgLTItLTExDQogICAgICAgICAgICAnJycsIGZ1bGxEdW1wPUZhbHNlKQ0KICAgIHByaW50czo6DQogICAgICAgIDUrMyo2DQogICAgICAgIFtbNSwgJysnLCBbMywgJyonLCA2XV1dDQoNCiAgICAgICAgKDUrMykqNg0KICAgICAgICBbW1s1LCAnKycsIDNdLCAnKicsIDZdXQ0KDQogICAgICAgIC0yLS0xMQ0KICAgICAgICBbW1snLScsIDJdLCAnLScsIFsnLScsIDExXV1dDQogICAgIiIiDQogICAgcmV0ID0gRm9yd2FyZCgpDQogICAgbGFzdEV4cHIgPSBiYXNlRXhwciB8ICggbHBhciArIHJldCArIHJwYXIgKQ0KICAgIGZvciBpLG9wZXJEZWYgaW4gZW51bWVyYXRlKG9wTGlzdCk6DQogICAgICAgIG9wRXhwcixhcml0eSxyaWdodExlZnRBc3NvYyxwYSA9IChvcGVyRGVmICsgKE5vbmUsKSlbOjRdDQogICAgICAgIHRlcm1OYW1lID0gIiVzIHRlcm0iICUgb3BFeHByIGlmIGFyaXR5IDwgMyBlbHNlICIlcyVzIHRlcm0iICUgb3BFeHByDQogICAgICAgIGlmIGFyaXR5ID09IDM6DQogICAgICAgICAgICBpZiBvcEV4cHIgaXMgTm9uZSBvciBsZW4ob3BFeHByKSAhPSAyOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImlmIG51bXRlcm1zPTMsIG9wRXhwciBtdXN0IGJlIGEgdHVwbGUgb3IgbGlzdCBvZiB0d28gZXhwcmVzc2lvbnMiKQ0KICAgICAgICAgICAgb3BFeHByMSwgb3BFeHByMiA9IG9wRXhwcg0KICAgICAgICB0aGlzRXhwciA9IEZvcndhcmQoKS5zZXROYW1lKHRlcm1OYW1lKQ0KICAgICAgICBpZiByaWdodExlZnRBc3NvYyA9PSBvcEFzc29jLkxFRlQ6DQogICAgICAgICAgICBpZiBhcml0eSA9PSAxOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKSApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDI6DQogICAgICAgICAgICAgICAgaWYgb3BFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByICsgbGFzdEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKyBsYXN0RXhwciApICkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByK2xhc3RFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZShsYXN0RXhwcikgKQ0KICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAzOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIxICsgbGFzdEV4cHIgKyBvcEV4cHIyICsgbGFzdEV4cHIpICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwKCBsYXN0RXhwciArIG9wRXhwcjEgKyBsYXN0RXhwciArIG9wRXhwcjIgKyBsYXN0RXhwciApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgYmUgdW5hcnkgKDEpLCBiaW5hcnkgKDIpLCBvciB0ZXJuYXJ5ICgzKSIpDQogICAgICAgIGVsaWYgcmlnaHRMZWZ0QXNzb2MgPT0gb3BBc3NvYy5SSUdIVDoNCiAgICAgICAgICAgIGlmIGFyaXR5ID09IDE6DQogICAgICAgICAgICAgICAgIyB0cnkgdG8gYXZvaWQgTFIgd2l0aCB0aGlzIGV4dHJhIHRlc3QNCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvcEV4cHIsIE9wdGlvbmFsKToNCiAgICAgICAgICAgICAgICAgICAgb3BFeHByID0gT3B0aW9uYWwob3BFeHByKQ0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkob3BFeHByLmV4cHIgKyB0aGlzRXhwcikgKyBHcm91cCggb3BFeHByICsgdGhpc0V4cHIgKQ0KICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAyOg0KICAgICAgICAgICAgICAgIGlmIG9wRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggb3BFeHByICsgdGhpc0V4cHIgKSApDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggdGhpc0V4cHIgKSApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDM6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcjEgKyB0aGlzRXhwciArIG9wRXhwcjIgKyB0aGlzRXhwcikgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAoIGxhc3RFeHByICsgb3BFeHByMSArIHRoaXNFeHByICsgb3BFeHByMiArIHRoaXNFeHByICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBiZSB1bmFyeSAoMSksIGJpbmFyeSAoMiksIG9yIHRlcm5hcnkgKDMpIikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgaW5kaWNhdGUgcmlnaHQgb3IgbGVmdCBhc3NvY2lhdGl2aXR5IikNCiAgICAgICAgaWYgcGE6DQogICAgICAgICAgICBtYXRjaEV4cHIuc2V0UGFyc2VBY3Rpb24oIHBhICkNCiAgICAgICAgdGhpc0V4cHIgPDw9ICggbWF0Y2hFeHByLnNldE5hbWUodGVybU5hbWUpIHwgbGFzdEV4cHIgKQ0KICAgICAgICBsYXN0RXhwciA9IHRoaXNFeHByDQogICAgcmV0IDw8PSBsYXN0RXhwcg0KICAgIHJldHVybiByZXQNCg0Kb3BlcmF0b3JQcmVjZWRlbmNlID0gaW5maXhOb3RhdGlvbg0KIiIiKERlcHJlY2F0ZWQpIEZvcm1lciBuYW1lIG9mIEN7THtpbmZpeE5vdGF0aW9ufX0sIHdpbGwgYmUgZHJvcHBlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLiIiIg0KDQpkYmxRdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHInIig/OlteIlxuXHJcXF18KD86IiIpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKicpKyciJykuc2V0TmFtZSgic3RyaW5nIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMiKQ0Kc2dsUXVvdGVkU3RyaW5nID0gQ29tYmluZShSZWdleChyIicoPzpbXidcblxyXFxdfCg/OicnKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSoiKSsiJyIpLnNldE5hbWUoInN0cmluZyBlbmNsb3NlZCBpbiBzaW5nbGUgcXVvdGVzIikNCnF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociciKD86W14iXG5cclxcXXwoPzoiIil8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqJykrJyInfA0KICAgICAgICAgICAgICAgICAgICAgICBSZWdleChyIicoPzpbXidcblxyXFxdfCg/OicnKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSoiKSsiJyIpLnNldE5hbWUoInF1b3RlZFN0cmluZyB1c2luZyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyIpDQp1bmljb2RlU3RyaW5nID0gQ29tYmluZShfTCgndScpICsgcXVvdGVkU3RyaW5nLmNvcHkoKSkuc2V0TmFtZSgidW5pY29kZSBzdHJpbmcgbGl0ZXJhbCIpDQoNCmRlZiBuZXN0ZWRFeHByKG9wZW5lcj0iKCIsIGNsb3Nlcj0iKSIsIGNvbnRlbnQ9Tm9uZSwgaWdub3JlRXhwcj1xdW90ZWRTdHJpbmcuY29weSgpKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBuZXN0ZWQgbGlzdHMgZW5jbG9zZWQgaW4gb3BlbmluZyBhbmQgY2xvc2luZw0KICAgIGRlbGltaXRlcnMgKCIoIiBhbmQgIikiIGFyZSB0aGUgZGVmYXVsdCkuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIG9wZW5lciAtIG9wZW5pbmcgY2hhcmFjdGVyIGZvciBhIG5lc3RlZCBsaXN0IChkZWZhdWx0PUN7IigifSk7IGNhbiBhbHNvIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24NCiAgICAgLSBjbG9zZXIgLSBjbG9zaW5nIGNoYXJhY3RlciBmb3IgYSBuZXN0ZWQgbGlzdCAoZGVmYXVsdD1DeyIpIn0pOyBjYW4gYWxzbyBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uDQogICAgIC0gY29udGVudCAtIGV4cHJlc3Npb24gZm9yIGl0ZW1zIHdpdGhpbiB0aGUgbmVzdGVkIGxpc3RzIChkZWZhdWx0PUN7Tm9uZX0pDQogICAgIC0gaWdub3JlRXhwciAtIGV4cHJlc3Npb24gZm9yIGlnbm9yaW5nIG9wZW5pbmcgYW5kIGNsb3NpbmcgZGVsaW1pdGVycyAoZGVmYXVsdD1De3F1b3RlZFN0cmluZ30pDQoNCiAgICBJZiBhbiBleHByZXNzaW9uIGlzIG5vdCBwcm92aWRlZCBmb3IgdGhlIGNvbnRlbnQgYXJndW1lbnQsIHRoZSBuZXN0ZWQNCiAgICBleHByZXNzaW9uIHdpbGwgY2FwdHVyZSBhbGwgd2hpdGVzcGFjZS1kZWxpbWl0ZWQgY29udGVudCBiZXR3ZWVuIGRlbGltaXRlcnMNCiAgICBhcyBhIGxpc3Qgb2Ygc2VwYXJhdGUgdmFsdWVzLg0KDQogICAgVXNlIHRoZSBDe2lnbm9yZUV4cHJ9IGFyZ3VtZW50IHRvIGRlZmluZSBleHByZXNzaW9ucyB0aGF0IG1heSBjb250YWluDQogICAgb3BlbmluZyBvciBjbG9zaW5nIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgbm90IGJlIHRyZWF0ZWQgYXMgb3BlbmluZw0KICAgIG9yIGNsb3NpbmcgY2hhcmFjdGVycyBmb3IgbmVzdGluZywgc3VjaCBhcyBxdW90ZWRTdHJpbmcgb3IgYSBjb21tZW50DQogICAgZXhwcmVzc2lvbi4gIFNwZWNpZnkgbXVsdGlwbGUgZXhwcmVzc2lvbnMgdXNpbmcgYW4gQ3tMe09yfX0gb3IgQ3tMe01hdGNoRmlyc3R9fS4NCiAgICBUaGUgZGVmYXVsdCBpcyBMe3F1b3RlZFN0cmluZ30sIGJ1dCBpZiBubyBleHByZXNzaW9ucyBhcmUgdG8gYmUgaWdub3JlZCwNCiAgICB0aGVuIHBhc3MgQ3tOb25lfSBmb3IgdGhpcyBhcmd1bWVudC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhX3R5cGUgPSBvbmVPZigidm9pZCBpbnQgc2hvcnQgbG9uZyBjaGFyIGZsb2F0IGRvdWJsZSIpDQogICAgICAgIGRlY2xfZGF0YV90eXBlID0gQ29tYmluZShkYXRhX3R5cGUgKyBPcHRpb25hbChXb3JkKCcqJykpKQ0KICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzKydfJywgYWxwaGFudW1zKydfJykNCiAgICAgICAgbnVtYmVyID0gcHlwYXJzaW5nX2NvbW1vbi5udW1iZXINCiAgICAgICAgYXJnID0gR3JvdXAoZGVjbF9kYXRhX3R5cGUgKyBpZGVudCkNCiAgICAgICAgTFBBUixSUEFSID0gbWFwKFN1cHByZXNzLCAiKCkiKQ0KDQogICAgICAgIGNvZGVfYm9keSA9IG5lc3RlZEV4cHIoJ3snLCAnfScsIGlnbm9yZUV4cHI9KHF1b3RlZFN0cmluZyB8IGNTdHlsZUNvbW1lbnQpKQ0KDQogICAgICAgIGNfZnVuY3Rpb24gPSAoZGVjbF9kYXRhX3R5cGUoInR5cGUiKSANCiAgICAgICAgICAgICAgICAgICAgICArIGlkZW50KCJuYW1lIikNCiAgICAgICAgICAgICAgICAgICAgICArIExQQVIgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KGFyZyksIFtdKSgiYXJncyIpICsgUlBBUiANCiAgICAgICAgICAgICAgICAgICAgICArIGNvZGVfYm9keSgiYm9keSIpKQ0KICAgICAgICBjX2Z1bmN0aW9uLmlnbm9yZShjU3R5bGVDb21tZW50KQ0KICAgICAgICANCiAgICAgICAgc291cmNlX2NvZGUgPSAnJycNCiAgICAgICAgICAgIGludCBpc19vZGQoaW50IHgpIHsgDQogICAgICAgICAgICAgICAgcmV0dXJuICh4JTIpOyANCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGludCBkZWNfdG9faGV4KGNoYXIgaGNoYXIpIHsgDQogICAgICAgICAgICAgICAgaWYgKGhjaGFyID49ICcwJyAmJiBoY2hhciA8PSAnOScpIHsgDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkKGhjaGFyKS1vcmQoJzAnKSk7IA0KICAgICAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDEwK29yZChoY2hhciktb3JkKCdBJykpOw0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9DQogICAgICAgICcnJw0KICAgICAgICBmb3IgZnVuYyBpbiBjX2Z1bmN0aW9uLnNlYXJjaFN0cmluZyhzb3VyY2VfY29kZSk6DQogICAgICAgICAgICBwcmludCgiJShuYW1lKXMgKCUodHlwZSlzKSBhcmdzOiAlKGFyZ3MpcyIgJSBmdW5jKQ0KDQogICAgcHJpbnRzOjoNCiAgICAgICAgaXNfb2RkIChpbnQpIGFyZ3M6IFtbJ2ludCcsICd4J11dDQogICAgICAgIGRlY190b19oZXggKGludCkgYXJnczogW1snY2hhcicsICdoY2hhciddXQ0KICAgICIiIg0KICAgIGlmIG9wZW5lciA9PSBjbG9zZXI6DQogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZW5pbmcgYW5kIGNsb3Npbmcgc3RyaW5ncyBjYW5ub3QgYmUgdGhlIHNhbWUiKQ0KICAgIGlmIGNvbnRlbnQgaXMgTm9uZToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShvcGVuZXIsYmFzZXN0cmluZykgYW5kIGlzaW5zdGFuY2UoY2xvc2VyLGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgaWYgbGVuKG9wZW5lcikgPT0gMSBhbmQgbGVuKGNsb3Nlcik9PTE6DQogICAgICAgICAgICAgICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+aWdub3JlRXhwciArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKG9wZW5lcitjbG9zZXIrUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChlbXB0eS5jb3B5KCkrQ2hhcnNOb3RJbihvcGVuZXIrY2xvc2VyK1BhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofmlnbm9yZUV4cHIgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5MaXRlcmFsKG9wZW5lcikgKyB+TGl0ZXJhbChjbG9zZXIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4oUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+TGl0ZXJhbChvcGVuZXIpICsgfkxpdGVyYWwoY2xvc2VyKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlbmluZyBhbmQgY2xvc2luZyBhcmd1bWVudHMgbXVzdCBiZSBzdHJpbmdzIGlmIG5vIGNvbnRlbnQgZXhwcmVzc2lvbiBpcyBnaXZlbiIpDQogICAgcmV0ID0gRm9yd2FyZCgpDQogICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgcmV0IDw8PSBHcm91cCggU3VwcHJlc3Mob3BlbmVyKSArIFplcm9Pck1vcmUoIGlnbm9yZUV4cHIgfCByZXQgfCBjb250ZW50ICkgKyBTdXBwcmVzcyhjbG9zZXIpICkNCiAgICBlbHNlOg0KICAgICAgICByZXQgPDw9IEdyb3VwKCBTdXBwcmVzcyhvcGVuZXIpICsgWmVyb09yTW9yZSggcmV0IHwgY29udGVudCApICArIFN1cHByZXNzKGNsb3NlcikgKQ0KICAgIHJldC5zZXROYW1lKCduZXN0ZWQgJXMlcyBleHByZXNzaW9uJyAlIChvcGVuZXIsY2xvc2VyKSkNCiAgICByZXR1cm4gcmV0DQoNCmRlZiBpbmRlbnRlZEJsb2NrKGJsb2NrU3RhdGVtZW50RXhwciwgaW5kZW50U3RhY2ssIGluZGVudD1UcnVlKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBzcGFjZS1kZWxpbWl0ZWQgaW5kZW50YXRpb24gYmxvY2tzLCBzdWNoIGFzDQogICAgdGhvc2UgdXNlZCB0byBkZWZpbmUgYmxvY2sgc3RhdGVtZW50cyBpbiBQeXRob24gc291cmNlIGNvZGUuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGJsb2NrU3RhdGVtZW50RXhwciAtIGV4cHJlc3Npb24gZGVmaW5pbmcgc3ludGF4IG9mIHN0YXRlbWVudCB0aGF0DQogICAgICAgICAgICBpcyByZXBlYXRlZCB3aXRoaW4gdGhlIGluZGVudGVkIGJsb2NrDQogICAgIC0gaW5kZW50U3RhY2sgLSBsaXN0IGNyZWF0ZWQgYnkgY2FsbGVyIHRvIG1hbmFnZSBpbmRlbnRhdGlvbiBzdGFjaw0KICAgICAgICAgICAgKG11bHRpcGxlIHN0YXRlbWVudFdpdGhJbmRlbnRlZEJsb2NrIGV4cHJlc3Npb25zIHdpdGhpbiBhIHNpbmdsZSBncmFtbWFyDQogICAgICAgICAgICBzaG91bGQgc2hhcmUgYSBjb21tb24gaW5kZW50U3RhY2spDQogICAgIC0gaW5kZW50IC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYmxvY2sgbXVzdCBiZSBpbmRlbnRlZCBiZXlvbmQgdGhlDQogICAgICAgICAgICB0aGUgY3VycmVudCBsZXZlbDsgc2V0IHRvIEZhbHNlIGZvciBibG9jayBvZiBsZWZ0LW1vc3Qgc3RhdGVtZW50cw0KICAgICAgICAgICAgKGRlZmF1bHQ9Q3tUcnVlfSkNCg0KICAgIEEgdmFsaWQgYmxvY2sgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBDe2Jsb2NrU3RhdGVtZW50fS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhID0gJycnDQogICAgICAgIGRlZiBBKHopOg0KICAgICAgICAgIEExDQogICAgICAgICAgQiA9IDEwMA0KICAgICAgICAgIEcgPSBBMg0KICAgICAgICAgIEEyDQogICAgICAgICAgQTMNCiAgICAgICAgQg0KICAgICAgICBkZWYgQkIoYSxiLGMpOg0KICAgICAgICAgIEJCMQ0KICAgICAgICAgIGRlZiBCQkEoKToNCiAgICAgICAgICAgIGJiYTENCiAgICAgICAgICAgIGJiYTINCiAgICAgICAgICAgIGJiYTMNCiAgICAgICAgQw0KICAgICAgICBEDQogICAgICAgIGRlZiBzcGFtKHgseSk6DQogICAgICAgICAgICAgZGVmIGVnZ3Moeik6DQogICAgICAgICAgICAgICAgIHBhc3MNCiAgICAgICAgJycnDQoNCg0KICAgICAgICBpbmRlbnRTdGFjayA9IFsxXQ0KICAgICAgICBzdG10ID0gRm9yd2FyZCgpDQoNCiAgICAgICAgaWRlbnRpZmllciA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMpDQogICAgICAgIGZ1bmNEZWNsID0gKCJkZWYiICsgaWRlbnRpZmllciArIEdyb3VwKCAiKCIgKyBPcHRpb25hbCggZGVsaW1pdGVkTGlzdChpZGVudGlmaWVyKSApICsgIikiICkgKyAiOiIpDQogICAgICAgIGZ1bmNfYm9keSA9IGluZGVudGVkQmxvY2soc3RtdCwgaW5kZW50U3RhY2spDQogICAgICAgIGZ1bmNEZWYgPSBHcm91cCggZnVuY0RlY2wgKyBmdW5jX2JvZHkgKQ0KDQogICAgICAgIHJ2YWx1ZSA9IEZvcndhcmQoKQ0KICAgICAgICBmdW5jQ2FsbCA9IEdyb3VwKGlkZW50aWZpZXIgKyAiKCIgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHJ2YWx1ZSkpICsgIikiKQ0KICAgICAgICBydmFsdWUgPDwgKGZ1bmNDYWxsIHwgaWRlbnRpZmllciB8IFdvcmQobnVtcykpDQogICAgICAgIGFzc2lnbm1lbnQgPSBHcm91cChpZGVudGlmaWVyICsgIj0iICsgcnZhbHVlKQ0KICAgICAgICBzdG10IDw8ICggZnVuY0RlZiB8IGFzc2lnbm1lbnQgfCBpZGVudGlmaWVyICkNCg0KICAgICAgICBtb2R1bGVfYm9keSA9IE9uZU9yTW9yZShzdG10KQ0KDQogICAgICAgIHBhcnNlVHJlZSA9IG1vZHVsZV9ib2R5LnBhcnNlU3RyaW5nKGRhdGEpDQogICAgICAgIHBhcnNlVHJlZS5wcHJpbnQoKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ2RlZicsDQogICAgICAgICAgJ0EnLA0KICAgICAgICAgIFsnKCcsICd6JywgJyknXSwNCiAgICAgICAgICAnOicsDQogICAgICAgICAgW1snQTEnXSwgW1snQicsICc9JywgJzEwMCddXSwgW1snRycsICc9JywgJ0EyJ11dLCBbJ0EyJ10sIFsnQTMnXV1dLA0KICAgICAgICAgJ0InLA0KICAgICAgICAgWydkZWYnLA0KICAgICAgICAgICdCQicsDQogICAgICAgICAgWycoJywgJ2EnLCAnYicsICdjJywgJyknXSwNCiAgICAgICAgICAnOicsDQogICAgICAgICAgW1snQkIxJ10sIFtbJ2RlZicsICdCQkEnLCBbJygnLCAnKSddLCAnOicsIFtbJ2JiYTEnXSwgWydiYmEyJ10sIFsnYmJhMyddXV1dXV0sDQogICAgICAgICAnQycsDQogICAgICAgICAnRCcsDQogICAgICAgICBbJ2RlZicsDQogICAgICAgICAgJ3NwYW0nLA0KICAgICAgICAgIFsnKCcsICd4JywgJ3knLCAnKSddLA0KICAgICAgICAgICc6JywNCiAgICAgICAgICBbW1snZGVmJywgJ2VnZ3MnLCBbJygnLCAneicsICcpJ10sICc6JywgW1sncGFzcyddXV1dXV1dIA0KICAgICIiIg0KICAgIGRlZiBjaGVja1BlZXJJbmRlbnQocyxsLHQpOg0KICAgICAgICBpZiBsID49IGxlbihzKTogcmV0dXJuDQogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpDQogICAgICAgIGlmIGN1ckNvbCAhPSBpbmRlbnRTdGFja1stMV06DQogICAgICAgICAgICBpZiBjdXJDb2wgPiBpbmRlbnRTdGFja1stMV06DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VGYXRhbEV4Y2VwdGlvbihzLGwsImlsbGVnYWwgbmVzdGluZyIpDQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhIHBlZXIgZW50cnkiKQ0KDQogICAgZGVmIGNoZWNrU3ViSW5kZW50KHMsbCx0KToNCiAgICAgICAgY3VyQ29sID0gY29sKGwscykNCiAgICAgICAgaWYgY3VyQ29sID4gaW5kZW50U3RhY2tbLTFdOg0KICAgICAgICAgICAgaW5kZW50U3RhY2suYXBwZW5kKCBjdXJDb2wgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJub3QgYSBzdWJlbnRyeSIpDQoNCiAgICBkZWYgY2hlY2tVbmluZGVudChzLGwsdCk6DQogICAgICAgIGlmIGwgPj0gbGVuKHMpOiByZXR1cm4NCiAgICAgICAgY3VyQ29sID0gY29sKGwscykNCiAgICAgICAgaWYgbm90KGluZGVudFN0YWNrIGFuZCBjdXJDb2wgPCBpbmRlbnRTdGFja1stMV0gYW5kIGN1ckNvbCA8PSBpbmRlbnRTdGFja1stMl0pOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJub3QgYW4gdW5pbmRlbnQiKQ0KICAgICAgICBpbmRlbnRTdGFjay5wb3AoKQ0KDQogICAgTkwgPSBPbmVPck1vcmUoTGluZUVuZCgpLnNldFdoaXRlc3BhY2VDaGFycygiXHQgIikuc3VwcHJlc3MoKSkNCiAgICBJTkRFTlQgPSAoRW1wdHkoKSArIEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tTdWJJbmRlbnQpKS5zZXROYW1lKCdJTkRFTlQnKQ0KICAgIFBFRVIgICA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tQZWVySW5kZW50KS5zZXROYW1lKCcnKQ0KICAgIFVOREVOVCA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tVbmluZGVudCkuc2V0TmFtZSgnVU5JTkRFTlQnKQ0KICAgIGlmIGluZGVudDoNCiAgICAgICAgc21FeHByID0gR3JvdXAoIE9wdGlvbmFsKE5MKSArDQogICAgICAgICAgICAjfiBGb2xsb3dlZEJ5KGJsb2NrU3RhdGVtZW50RXhwcikgKw0KICAgICAgICAgICAgSU5ERU5UICsgKE9uZU9yTW9yZSggUEVFUiArIEdyb3VwKGJsb2NrU3RhdGVtZW50RXhwcikgKyBPcHRpb25hbChOTCkgKSkgKyBVTkRFTlQpDQogICAgZWxzZToNCiAgICAgICAgc21FeHByID0gR3JvdXAoIE9wdGlvbmFsKE5MKSArDQogICAgICAgICAgICAoT25lT3JNb3JlKCBQRUVSICsgR3JvdXAoYmxvY2tTdGF0ZW1lbnRFeHByKSArIE9wdGlvbmFsKE5MKSApKSApDQogICAgYmxvY2tTdGF0ZW1lbnRFeHByLmlnbm9yZShfYnNsYXNoICsgTGluZUVuZCgpKQ0KICAgIHJldHVybiBzbUV4cHIuc2V0TmFtZSgnaW5kZW50ZWQgYmxvY2snKQ0KDQphbHBoYXM4Yml0ID0gc3JhbmdlKHIiW1wweGMwLVwweGQ2XDB4ZDgtXDB4ZjZcMHhmOC1cMHhmZl0iKQ0KcHVuYzhiaXQgPSBzcmFuZ2UociJbXDB4YTEtXDB4YmZcMHhkN1wweGY3XSIpDQoNCmFueU9wZW5UYWcsYW55Q2xvc2VUYWcgPSBtYWtlSFRNTFRhZ3MoV29yZChhbHBoYXMsYWxwaGFudW1zKyJfOiIpLnNldE5hbWUoJ2FueSB0YWcnKSkNCl9odG1sRW50aXR5TWFwID0gZGljdCh6aXAoImd0IGx0IGFtcCBuYnNwIHF1b3QgYXBvcyIuc3BsaXQoKSwnPjwmICJcJycpKQ0KY29tbW9uSFRNTEVudGl0eSA9IFJlZ2V4KCcmKD9QPGVudGl0eT4nICsgJ3wnLmpvaW4oX2h0bWxFbnRpdHlNYXAua2V5cygpKSArIik7Iikuc2V0TmFtZSgiY29tbW9uIEhUTUwgZW50aXR5IikNCmRlZiByZXBsYWNlSFRNTEVudGl0eSh0KToNCiAgICAiIiJIZWxwZXIgcGFyc2VyIGFjdGlvbiB0byByZXBsYWNlIGNvbW1vbiBIVE1MIGVudGl0aWVzIHdpdGggdGhlaXIgc3BlY2lhbCBjaGFyYWN0ZXJzIiIiDQogICAgcmV0dXJuIF9odG1sRW50aXR5TWFwLmdldCh0LmVudGl0eSkNCg0KIyBpdCdzIGVhc3kgdG8gZ2V0IHRoZXNlIGNvbW1lbnQgc3RydWN0dXJlcyB3cm9uZyAtIHRoZXkncmUgdmVyeSBjb21tb24sIHNvIG1heSBhcyB3ZWxsIG1ha2UgdGhlbSBhdmFpbGFibGUNCmNTdHlsZUNvbW1lbnQgPSBDb21iaW5lKFJlZ2V4KHIiL1wqKD86W14qXXxcKig/IS8pKSoiKSArICcqLycpLnNldE5hbWUoIkMgc3R5bGUgY29tbWVudCIpDQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDey8qIC4uLiAqL30iDQoNCmh0bWxDb21tZW50ID0gUmVnZXgociI8IS0tW1xzXFNdKj8tLT4iKS5zZXROYW1lKCJIVE1MIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3s8IS0tIC4uLiAtLT59Ig0KDQpyZXN0T2ZMaW5lID0gUmVnZXgociIuKiIpLmxlYXZlV2hpdGVzcGFjZSgpLnNldE5hbWUoInJlc3Qgb2YgbGluZSIpDQpkYmxTbGFzaENvbW1lbnQgPSBSZWdleChyIi8vKD86XFxcbnxbXlxuXSkqIikuc2V0TmFtZSgiLy8gY29tbWVudCIpDQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDey8vIC4uLiAodG8gZW5kIG9mIGxpbmUpfSINCg0KY3BwU3R5bGVDb21tZW50ID0gQ29tYmluZShSZWdleChyIi9cKig/OlteKl18XCooPyEvKSkqIikgKyAnKi8nfCBkYmxTbGFzaENvbW1lbnQpLnNldE5hbWUoIkMrKyBzdHlsZSBjb21tZW50IikNCiJDb21tZW50IG9mIGVpdGhlciBmb3JtIEN7THtjU3R5bGVDb21tZW50fX0gb3IgQ3tMe2RibFNsYXNoQ29tbWVudH19Ig0KDQpqYXZhU3R5bGVDb21tZW50ID0gY3BwU3R5bGVDb21tZW50DQoiU2FtZSBhcyBDe0x7Y3BwU3R5bGVDb21tZW50fX0iDQoNCnB5dGhvblN0eWxlQ29tbWVudCA9IFJlZ2V4KHIiIy4qIikuc2V0TmFtZSgiUHl0aG9uIHN0eWxlIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3sjIC4uLiAodG8gZW5kIG9mIGxpbmUpfSINCg0KX2NvbW1hc2VwaXRlbSA9IENvbWJpbmUoT25lT3JNb3JlKFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPScsJykgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsKCBXb3JkKCIgXHQiKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5MaXRlcmFsKCIsIikgKyB+TGluZUVuZCgpICkgKSApLnN0cmVhbWxpbmUoKS5zZXROYW1lKCJjb21tYUl0ZW0iKQ0KY29tbWFTZXBhcmF0ZWRMaXN0ID0gZGVsaW1pdGVkTGlzdCggT3B0aW9uYWwoIHF1b3RlZFN0cmluZy5jb3B5KCkgfCBfY29tbWFzZXBpdGVtLCBkZWZhdWx0PSIiKSApLnNldE5hbWUoImNvbW1hU2VwYXJhdGVkTGlzdCIpDQoiIiIoRGVwcmVjYXRlZCkgUHJlZGVmaW5lZCBleHByZXNzaW9uIG9mIDEgb3IgbW9yZSBwcmludGFibGUgd29yZHMgb3IgcXVvdGVkIHN0cmluZ3MsIHNlcGFyYXRlZCBieSBjb21tYXMuDQogICBUaGlzIGV4cHJlc3Npb24gaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBMe3B5cGFyc2luZ19jb21tb24uY29tbWFfc2VwYXJhdGVkX2xpc3R9LiIiIg0KDQojIHNvbWUgb3RoZXIgdXNlZnVsIGV4cHJlc3Npb25zIC0gdXNpbmcgbG93ZXItY2FzZSBjbGFzcyBuYW1lIHNpbmNlIHdlIGFyZSByZWFsbHkgdXNpbmcgdGhpcyBhcyBhIG5hbWVzcGFjZQ0KY2xhc3MgcHlwYXJzaW5nX2NvbW1vbjoNCiAgICAiIiINCiAgICBIZXJlIGFyZSBzb21lIGNvbW1vbiBsb3ctbGV2ZWwgZXhwcmVzc2lvbnMgdGhhdCBtYXkgYmUgdXNlZnVsIGluIGp1bXAtc3RhcnRpbmcgcGFyc2VyIGRldmVsb3BtZW50Og0KICAgICAtIG51bWVyaWMgZm9ybXMgKEx7aW50ZWdlcnM8aW50ZWdlcj59LCBMe3JlYWxzPHJlYWw+fSwgTHtzY2llbnRpZmljIG5vdGF0aW9uPHNjaV9yZWFsPn0pDQogICAgIC0gY29tbW9uIEx7cHJvZ3JhbW1pbmcgaWRlbnRpZmllcnM8aWRlbnRpZmllcj59DQogICAgIC0gbmV0d29yayBhZGRyZXNzZXMgKEx7TUFDPG1hY19hZGRyZXNzPn0sIEx7SVB2NDxpcHY0X2FkZHJlc3M+fSwgTHtJUHY2PGlwdjZfYWRkcmVzcz59KQ0KICAgICAtIElTTzg2MDEgTHtkYXRlczxpc284NjAxX2RhdGU+fSBhbmQgTHtkYXRldGltZTxpc284NjAxX2RhdGV0aW1lPn0NCiAgICAgLSBMe1VVSUQ8dXVpZD59DQogICAgIC0gTHtjb21tYS1zZXBhcmF0ZWQgbGlzdDxjb21tYV9zZXBhcmF0ZWRfbGlzdD59DQogICAgUGFyc2UgYWN0aW9uczoNCiAgICAgLSBDe0x7Y29udmVydFRvSW50ZWdlcn19DQogICAgIC0gQ3tMe2NvbnZlcnRUb0Zsb2F0fX0NCiAgICAgLSBDe0x7Y29udmVydFRvRGF0ZX19DQogICAgIC0gQ3tMe2NvbnZlcnRUb0RhdGV0aW1lfX0NCiAgICAgLSBDe0x7c3RyaXBIVE1MVGFnc319DQogICAgIC0gQ3tMe3VwY2FzZVRva2Vuc319DQogICAgIC0gQ3tMe2Rvd25jYXNlVG9rZW5zfX0NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLm51bWJlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgdGhlIGFwcHJvcHJpYXRlIHR5cGUNCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgLTEwMA0KICAgICAgICAgICAgKzEwMA0KICAgICAgICAgICAgMy4xNDE1OQ0KICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLmZudW1iZXIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0DQogICAgICAgICAgICAxMDANCiAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgICsxMDANCiAgICAgICAgICAgIDMuMTQxNTkNCiAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgIDFlLTEyDQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5oZXhfaW50ZWdlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgaGV4IG51bWJlcnMNCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgRkYNCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLmZyYWN0aW9uLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBmcmFjdGlvbnMNCiAgICAgICAgICAgIDEvMg0KICAgICAgICAgICAgLTMvNA0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHB5cGFyc2luZ19jb21tb24ubWl4ZWRfaW50ZWdlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgbWl4ZWQgZnJhY3Rpb25zDQogICAgICAgICAgICAxDQogICAgICAgICAgICAxLzINCiAgICAgICAgICAgIC0zLzQNCiAgICAgICAgICAgIDEtMy80DQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgaW1wb3J0IHV1aWQNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHV1aWQuVVVJRCkpDQogICAgICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgdXVpZA0KICAgICAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4DQogICAgICAgICAgICAnJycpDQogICAgcHJpbnRzOjoNCiAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyB0aGUgYXBwcm9wcmlhdGUgdHlwZQ0KICAgICAgICAxMDANCiAgICAgICAgWzEwMF0NCg0KICAgICAgICAtMTAwDQogICAgICAgIFstMTAwXQ0KDQogICAgICAgICsxMDANCiAgICAgICAgWzEwMF0NCg0KICAgICAgICAzLjE0MTU5DQogICAgICAgIFszLjE0MTU5XQ0KDQogICAgICAgIDYuMDJlMjMNCiAgICAgICAgWzYuMDJlKzIzXQ0KDQogICAgICAgIDFlLTEyDQogICAgICAgIFsxZS0xMl0NCg0KICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0DQogICAgICAgIDEwMA0KICAgICAgICBbMTAwLjBdDQoNCiAgICAgICAgLTEwMA0KICAgICAgICBbLTEwMC4wXQ0KDQogICAgICAgICsxMDANCiAgICAgICAgWzEwMC4wXQ0KDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgWzMuMTQxNTldDQoNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICBbNi4wMmUrMjNdDQoNCiAgICAgICAgMWUtMTINCiAgICAgICAgWzFlLTEyXQ0KDQogICAgICAgICMgaGV4IG51bWJlcnMNCiAgICAgICAgMTAwDQogICAgICAgIFsyNTZdDQoNCiAgICAgICAgRkYNCiAgICAgICAgWzI1NV0NCg0KICAgICAgICAjIGZyYWN0aW9ucw0KICAgICAgICAxLzINCiAgICAgICAgWzAuNV0NCg0KICAgICAgICAtMy80DQogICAgICAgIFstMC43NV0NCg0KICAgICAgICAjIG1peGVkIGZyYWN0aW9ucw0KICAgICAgICAxDQogICAgICAgIFsxXQ0KDQogICAgICAgIDEvMg0KICAgICAgICBbMC41XQ0KDQogICAgICAgIC0zLzQNCiAgICAgICAgWy0wLjc1XQ0KDQogICAgICAgIDEtMy80DQogICAgICAgIFsxLjc1XQ0KDQogICAgICAgICMgdXVpZA0KICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgNCiAgICAgICAgW1VVSUQoJzEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OCcpXQ0KICAgICIiIg0KDQogICAgY29udmVydFRvSW50ZWdlciA9IHRva2VuTWFwKGludCkNCiAgICAiIiINCiAgICBQYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGludGVnZXJzIHRvIFB5dGhvbiBpbnQNCiAgICAiIiINCg0KICAgIGNvbnZlcnRUb0Zsb2F0ID0gdG9rZW5NYXAoZmxvYXQpDQogICAgIiIiDQogICAgUGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBudW1iZXJzIHRvIFB5dGhvbiBmbG9hdA0KICAgICIiIg0KDQogICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0ludGVnZXIpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLCByZXR1cm5zIGFuIGludCIiIg0KDQogICAgaGV4X2ludGVnZXIgPSBXb3JkKGhleG51bXMpLnNldE5hbWUoImhleCBpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LDE2KSkNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgaGV4YWRlY2ltYWwgaW50ZWdlciwgcmV0dXJucyBhbiBpbnQiIiINCg0KICAgIHNpZ25lZF9pbnRlZ2VyID0gUmVnZXgocidbKy1dP1xkKycpLnNldE5hbWUoInNpZ25lZCBpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvSW50ZWdlcikNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGFuIGludGVnZXIgd2l0aCBvcHRpb25hbCBsZWFkaW5nIHNpZ24sIHJldHVybnMgYW4gaW50IiIiDQoNCiAgICBmcmFjdGlvbiA9IChzaWduZWRfaW50ZWdlcigpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KSArICcvJyArIHNpZ25lZF9pbnRlZ2VyKCkuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpKS5zZXROYW1lKCJmcmFjdGlvbiIpDQogICAgIiIiZnJhY3Rpb25hbCBleHByZXNzaW9uIG9mIGFuIGludGVnZXIgZGl2aWRlZCBieSBhbiBpbnRlZ2VyLCByZXR1cm5zIGEgZmxvYXQiIiINCiAgICBmcmFjdGlvbi5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdDogdFswXS90Wy0xXSkNCg0KICAgIG1peGVkX2ludGVnZXIgPSAoZnJhY3Rpb24gfCBzaWduZWRfaW50ZWdlciArIE9wdGlvbmFsKE9wdGlvbmFsKCctJykuc3VwcHJlc3MoKSArIGZyYWN0aW9uKSkuc2V0TmFtZSgiZnJhY3Rpb24gb3IgbWl4ZWQgaW50ZWdlci1mcmFjdGlvbiIpDQogICAgIiIibWl4ZWQgaW50ZWdlciBvZiB0aGUgZm9ybSAnaW50ZWdlciAtIGZyYWN0aW9uJywgd2l0aCBvcHRpb25hbCBsZWFkaW5nIGludGVnZXIsIHJldHVybnMgZmxvYXQiIiINCiAgICBtaXhlZF9pbnRlZ2VyLmFkZFBhcnNlQWN0aW9uKHN1bSkNCg0KICAgIHJlYWwgPSBSZWdleChyJ1srLV0/XGQrXC5cZConKS5zZXROYW1lKCJyZWFsIG51bWJlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgYW5kIHJldHVybnMgYSBmbG9hdCIiIg0KDQogICAgc2NpX3JlYWwgPSBSZWdleChyJ1srLV0/XGQrKFtlRV1bKy1dP1xkK3xcLlxkKihbZUVdWystXT9cZCspPyknKS5zZXROYW1lKCJyZWFsIG51bWJlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24iKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHdpdGggb3B0aW9uYWwgc2NpZW50aWZpYyBub3RhdGlvbiBhbmQgcmV0dXJucyBhIGZsb2F0IiIiDQoNCiAgICAjIHN0cmVhbWxpbmluZyB0aGlzIGV4cHJlc3Npb24gbWFrZXMgdGhlIGRvY3MgbmljZXItbG9va2luZw0KICAgIG51bWJlciA9IChzY2lfcmVhbCB8IHJlYWwgfCBzaWduZWRfaW50ZWdlcikuc3RyZWFtbGluZSgpDQogICAgIiIiYW55IG51bWVyaWMgZXhwcmVzc2lvbiwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBQeXRob24gdHlwZSIiIg0KDQogICAgZm51bWJlciA9IFJlZ2V4KHInWystXT9cZCtcLj9cZCooW2VFXVsrLV0/XGQrKT8nKS5zZXROYW1lKCJmbnVtYmVyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpDQogICAgIiIiYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQiIiINCiAgICANCiAgICBpZGVudGlmaWVyID0gV29yZChhbHBoYXMrJ18nLCBhbHBoYW51bXMrJ18nKS5zZXROYW1lKCJpZGVudGlmaWVyIikNCiAgICAiIiJ0eXBpY2FsIGNvZGUgaWRlbnRpZmllciAobGVhZGluZyBhbHBoYSBvciAnXycsIGZvbGxvd2VkIGJ5IDAgb3IgbW9yZSBhbHBoYXMsIG51bXMsIG9yICdfJykiIiINCiAgICANCiAgICBpcHY0X2FkZHJlc3MgPSBSZWdleChyJygyNVswLTVdfDJbMC00XVswLTldfDE/WzAtOV17MSwyfSkoXC4oMjVbMC01XXwyWzAtNF1bMC05XXwxP1swLTldezEsMn0pKXszfScpLnNldE5hbWUoIklQdjQgYWRkcmVzcyIpDQogICAgIklQdjQgYWRkcmVzcyAoQ3swLjAuMC4wIC0gMjU1LjI1NS4yNTUuMjU1fSkiDQoNCiAgICBfaXB2Nl9wYXJ0ID0gUmVnZXgocidbMC05YS1mQS1GXXsxLDR9Jykuc2V0TmFtZSgiaGV4X2ludGVnZXIiKQ0KICAgIF9mdWxsX2lwdjZfYWRkcmVzcyA9IChfaXB2Nl9wYXJ0ICsgKCc6JyArIF9pcHY2X3BhcnQpKjcpLnNldE5hbWUoImZ1bGwgSVB2NiBhZGRyZXNzIikNCiAgICBfc2hvcnRfaXB2Nl9hZGRyZXNzID0gKE9wdGlvbmFsKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqKDAsNikpICsgIjo6IiArIE9wdGlvbmFsKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqKDAsNikpKS5zZXROYW1lKCJzaG9ydCBJUHY2IGFkZHJlc3MiKQ0KICAgIF9zaG9ydF9pcHY2X2FkZHJlc3MuYWRkQ29uZGl0aW9uKGxhbWJkYSB0OiBzdW0oMSBmb3IgdHQgaW4gdCBpZiBweXBhcnNpbmdfY29tbW9uLl9pcHY2X3BhcnQubWF0Y2hlcyh0dCkpIDwgOCkNCiAgICBfbWl4ZWRfaXB2Nl9hZGRyZXNzID0gKCI6OmZmZmY6IiArIGlwdjRfYWRkcmVzcykuc2V0TmFtZSgibWl4ZWQgSVB2NiBhZGRyZXNzIikNCiAgICBpcHY2X2FkZHJlc3MgPSBDb21iaW5lKChfZnVsbF9pcHY2X2FkZHJlc3MgfCBfbWl4ZWRfaXB2Nl9hZGRyZXNzIHwgX3Nob3J0X2lwdjZfYWRkcmVzcykuc2V0TmFtZSgiSVB2NiBhZGRyZXNzIikpLnNldE5hbWUoIklQdjYgYWRkcmVzcyIpDQogICAgIklQdjYgYWRkcmVzcyAobG9uZywgc2hvcnQsIG9yIG1peGVkIGZvcm0pIg0KICAgIA0KICAgIG1hY19hZGRyZXNzID0gUmVnZXgocidbMC05YS1mQS1GXXsyfShbOi4tXSlbMC05YS1mQS1GXXsyfSg/OlwxWzAtOWEtZkEtRl17Mn0pezR9Jykuc2V0TmFtZSgiTUFDIGFkZHJlc3MiKQ0KICAgICJNQUMgYWRkcmVzcyB4eDp4eDp4eDp4eDp4eCAobWF5IGFsc28gaGF2ZSAnLScgb3IgJy4nIGRlbGltaXRlcnMpIg0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBjb252ZXJ0VG9EYXRlKGZtdD0iJVktJW0tJWQiKToNCiAgICAgICAgIiIiDQogICAgICAgIEhlbHBlciB0byBjcmVhdGUgYSBwYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGRhdGUgc3RyaW5nIHRvIFB5dGhvbiBkYXRldGltZS5kYXRlDQoNCiAgICAgICAgUGFyYW1zIC0NCiAgICAgICAgIC0gZm10IC0gZm9ybWF0IHRvIGJlIHBhc3NlZCB0byBkYXRldGltZS5zdHJwdGltZSAoZGVmYXVsdD1DeyIlWS0lbS0lZCJ9KQ0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZGF0ZV9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5pc284NjAxX2RhdGUuY29weSgpDQogICAgICAgICAgICBkYXRlX2V4cHIuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5jb252ZXJ0VG9EYXRlKCkpDQogICAgICAgICAgICBwcmludChkYXRlX2V4cHIucGFyc2VTdHJpbmcoIjE5OTktMTItMzEiKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFtkYXRldGltZS5kYXRlKDE5OTksIDEyLCAzMSldDQogICAgICAgICIiIg0KICAgICAgICBkZWYgY3Z0X2ZuKHMsbCx0KToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuc3RycHRpbWUodFswXSwgZm10KS5kYXRlKCkNCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIHZlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsIGwsIHN0cih2ZSkpDQogICAgICAgIHJldHVybiBjdnRfZm4NCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgY29udmVydFRvRGF0ZXRpbWUoZm10PSIlWS0lbS0lZFQlSDolTTolUy4lZiIpOg0KICAgICAgICAiIiINCiAgICAgICAgSGVscGVyIHRvIGNyZWF0ZSBhIHBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgZGF0ZXRpbWUgc3RyaW5nIHRvIFB5dGhvbiBkYXRldGltZS5kYXRldGltZQ0KDQogICAgICAgIFBhcmFtcyAtDQogICAgICAgICAtIGZtdCAtIGZvcm1hdCB0byBiZSBwYXNzZWQgdG8gZGF0ZXRpbWUuc3RycHRpbWUgKGRlZmF1bHQ9Q3siJVktJW0tJWRUJUg6JU06JVMuJWYifSkNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGR0X2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLmlzbzg2MDFfZGF0ZXRpbWUuY29weSgpDQogICAgICAgICAgICBkdF9leHByLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uY29udmVydFRvRGF0ZXRpbWUoKSkNCiAgICAgICAgICAgIHByaW50KGR0X2V4cHIucGFyc2VTdHJpbmcoIjE5OTktMTItMzFUMjM6NTk6NTkuOTk5IikpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbZGF0ZXRpbWUuZGF0ZXRpbWUoMTk5OSwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTkwMDApXQ0KICAgICAgICAiIiINCiAgICAgICAgZGVmIGN2dF9mbihzLGwsdCk6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnN0cnB0aW1lKHRbMF0sIGZtdCkNCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIHZlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsIGwsIHN0cih2ZSkpDQogICAgICAgIHJldHVybiBjdnRfZm4NCg0KICAgIGlzbzg2MDFfZGF0ZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pKD86LSg/UDxtb250aD5cZFxkKSg/Oi0oP1A8ZGF5PlxkXGQpKT8pPycpLnNldE5hbWUoIklTTzg2MDEgZGF0ZSIpDQogICAgIklTTzg2MDEgZGF0ZSAoQ3t5eXl5LW1tLWRkfSkiDQoNCiAgICBpc284NjAxX2RhdGV0aW1lID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSktKD9QPG1vbnRoPlxkXGQpLSg/UDxkYXk+XGRcZClbVCBdKD9QPGhvdXI+XGRcZCk6KD9QPG1pbnV0ZT5cZFxkKSg6KD9QPHNlY29uZD5cZFxkKFwuXGQqKT8pPyk/KD9QPHR6Plp8WystXVxkXGQ6P1xkXGQpPycpLnNldE5hbWUoIklTTzg2MDEgZGF0ZXRpbWUiKQ0KICAgICJJU084NjAxIGRhdGV0aW1lIChDe3l5eXktbW0tZGRUaGg6bW06c3MucyhafCstMDA6MDApfSkgLSB0cmFpbGluZyBzZWNvbmRzLCBtaWxsaXNlY29uZHMsIGFuZCB0aW1lem9uZSBvcHRpb25hbDsgYWNjZXB0cyBzZXBhcmF0aW5nIEN7J1QnfSBvciBDeycgJ30iDQoNCiAgICB1dWlkID0gUmVnZXgocidbMC05YS1mQS1GXXs4fSgtWzAtOWEtZkEtRl17NH0pezN9LVswLTlhLWZBLUZdezEyfScpLnNldE5hbWUoIlVVSUQiKQ0KICAgICJVVUlEIChDe3h4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eH0pIg0KDQogICAgX2h0bWxfc3RyaXBwZXIgPSBhbnlPcGVuVGFnLnN1cHByZXNzKCkgfCBhbnlDbG9zZVRhZy5zdXBwcmVzcygpDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBzdHJpcEhUTUxUYWdzKHMsIGwsIHRva2Vucyk6DQogICAgICAgICIiIg0KICAgICAgICBQYXJzZSBhY3Rpb24gdG8gcmVtb3ZlIEhUTUwgdGFncyBmcm9tIHdlYiBwYWdlIEhUTUwgc291cmNlDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIHN0cmlwIEhUTUwgbGlua3MgZnJvbSBub3JtYWwgdGV4dCANCiAgICAgICAgICAgIHRleHQgPSAnPHRkPk1vcmUgaW5mbyBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbSI+cHlwYXJzaW5nPC9hPiB3aWtpIHBhZ2U8L3RkPicNCiAgICAgICAgICAgIHRkLHRkX2VuZCA9IG1ha2VIVE1MVGFncygiVEQiKQ0KICAgICAgICAgICAgdGFibGVfdGV4dCA9IHRkICsgU2tpcFRvKHRkX2VuZCkuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5zdHJpcEhUTUxUYWdzKSgiYm9keSIpICsgdGRfZW5kDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KHRhYmxlX3RleHQucGFyc2VTdHJpbmcodGV4dCkuYm9keSkgIyAtPiAnTW9yZSBpbmZvIGF0IHRoZSBweXBhcnNpbmcgd2lraSBwYWdlJw0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIHB5cGFyc2luZ19jb21tb24uX2h0bWxfc3RyaXBwZXIudHJhbnNmb3JtU3RyaW5nKHRva2Vuc1swXSkNCg0KICAgIF9jb21tYXNlcGl0ZW0gPSBDb21iaW5lKE9uZU9yTW9yZSh+TGl0ZXJhbCgiLCIpICsgfkxpbmVFbmQoKSArIFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPScsJykgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBPcHRpb25hbCggV2hpdGUoIiBcdCIpICkgKSApLnN0cmVhbWxpbmUoKS5zZXROYW1lKCJjb21tYUl0ZW0iKQ0KICAgIGNvbW1hX3NlcGFyYXRlZF9saXN0ID0gZGVsaW1pdGVkTGlzdCggT3B0aW9uYWwoIHF1b3RlZFN0cmluZy5jb3B5KCkgfCBfY29tbWFzZXBpdGVtLCBkZWZhdWx0PSIiKSApLnNldE5hbWUoImNvbW1hIHNlcGFyYXRlZCBsaXN0IikNCiAgICAiIiJQcmVkZWZpbmVkIGV4cHJlc3Npb24gb2YgMSBvciBtb3JlIHByaW50YWJsZSB3b3JkcyBvciBxdW90ZWQgc3RyaW5ncywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4iIiINCg0KICAgIHVwY2FzZVRva2VucyA9IHN0YXRpY21ldGhvZCh0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkudXBwZXIoKSkpDQogICAgIiIiUGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIHVwcGVyIGNhc2UuIiIiDQoNCiAgICBkb3duY2FzZVRva2VucyA9IHN0YXRpY21ldGhvZCh0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkubG93ZXIoKSkpDQogICAgIiIiUGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIGxvd2VyIGNhc2UuIiIiDQoNCg0KaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoNCg0KICAgIHNlbGVjdFRva2VuICAgID0gQ2FzZWxlc3NMaXRlcmFsKCJzZWxlY3QiKQ0KICAgIGZyb21Ub2tlbiAgICAgID0gQ2FzZWxlc3NMaXRlcmFsKCJmcm9tIikNCg0KICAgIGlkZW50ICAgICAgICAgID0gV29yZChhbHBoYXMsIGFscGhhbnVtcyArICJfJCIpDQoNCiAgICBjb2x1bW5OYW1lICAgICA9IGRlbGltaXRlZExpc3QoaWRlbnQsICIuIiwgY29tYmluZT1UcnVlKS5zZXRQYXJzZUFjdGlvbih1cGNhc2VUb2tlbnMpDQogICAgY29sdW1uTmFtZUxpc3QgPSBHcm91cChkZWxpbWl0ZWRMaXN0KGNvbHVtbk5hbWUpKS5zZXROYW1lKCJjb2x1bW5zIikNCiAgICBjb2x1bW5TcGVjICAgICA9ICgnKicgfCBjb2x1bW5OYW1lTGlzdCkNCg0KICAgIHRhYmxlTmFtZSAgICAgID0gZGVsaW1pdGVkTGlzdChpZGVudCwgIi4iLCBjb21iaW5lPVRydWUpLnNldFBhcnNlQWN0aW9uKHVwY2FzZVRva2VucykNCiAgICB0YWJsZU5hbWVMaXN0ICA9IEdyb3VwKGRlbGltaXRlZExpc3QodGFibGVOYW1lKSkuc2V0TmFtZSgidGFibGVzIikNCiAgICANCiAgICBzaW1wbGVTUUwgICAgICA9IHNlbGVjdFRva2VuKCJjb21tYW5kIikgKyBjb2x1bW5TcGVjKCJjb2x1bW5zIikgKyBmcm9tVG9rZW4gKyB0YWJsZU5hbWVMaXN0KCJ0YWJsZXMiKQ0KDQogICAgIyBkZW1vIHJ1blRlc3RzIG1ldGhvZCwgaW5jbHVkaW5nIGVtYmVkZGVkIGNvbW1lbnRzIGluIHRlc3Qgc3RyaW5nDQogICAgc2ltcGxlU1FMLnJ1blRlc3RzKCIiIg0KICAgICAgICAjICcqJyBhcyBjb2x1bW4gbGlzdCBhbmQgZG90dGVkIHRhYmxlIG5hbWUNCiAgICAgICAgc2VsZWN0ICogZnJvbSBTWVMuWFlaWlkNCg0KICAgICAgICAjIGNhc2VsZXNzIG1hdGNoIG9uICJTRUxFQ1QiLCBhbmQgY2FzdHMgYmFjayB0byAic2VsZWN0Ig0KICAgICAgICBTRUxFQ1QgKiBmcm9tIFhZWlpZLCBBQkMNCg0KICAgICAgICAjIGxpc3Qgb2YgY29sdW1uIG5hbWVzLCBhbmQgbWl4ZWQgY2FzZSBTRUxFQ1Qga2V5d29yZA0KICAgICAgICBTZWxlY3QgQUEsQkIsQ0MgZnJvbSBTeXMuZHVhbA0KDQogICAgICAgICMgbXVsdGlwbGUgdGFibGVzDQogICAgICAgIFNlbGVjdCBBLCBCLCBDIGZyb20gU3lzLmR1YWwsIFRhYmxlMg0KDQogICAgICAgICMgaW52YWxpZCBTRUxFQ1Qga2V5d29yZCAtIHNob3VsZCBmYWlsDQogICAgICAgIFhlbGVjdCBBLCBCLCBDIGZyb20gU3lzLmR1YWwNCg0KICAgICAgICAjIGluY29tcGxldGUgY29tbWFuZCAtIHNob3VsZCBmYWlsDQogICAgICAgIFNlbGVjdA0KDQogICAgICAgICMgaW52YWxpZCBjb2x1bW4gbmFtZSAtIHNob3VsZCBmYWlsDQogICAgICAgIFNlbGVjdCBeXl4gZnJveCBTeXMuZHVhbA0KDQogICAgICAgICIiIikNCg0KICAgIHB5cGFyc2luZ19jb21tb24ubnVtYmVyLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMDANCiAgICAgICAgLTEwMA0KICAgICAgICArMTAwDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICAxZS0xMg0KICAgICAgICAiIiIpDQoNCiAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0DQogICAgcHlwYXJzaW5nX2NvbW1vbi5mbnVtYmVyLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMDANCiAgICAgICAgLTEwMA0KICAgICAgICArMTAwDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICAxZS0xMg0KICAgICAgICAiIiIpDQoNCiAgICBweXBhcnNpbmdfY29tbW9uLmhleF9pbnRlZ2VyLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMDANCiAgICAgICAgRkYNCiAgICAgICAgIiIiKQ0KDQogICAgaW1wb3J0IHV1aWQNCiAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAodXVpZC5VVUlEKSkNCiAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQucnVuVGVzdHMoIiIiDQogICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OA0KICAgICAgICAiIiIpDQpQSwMEFAAAAAAAAAAhAJlYTVqSdQAAknUAADQAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3Ivc2l4LnB5IiIiVXRpbGl0aWVzIGZvciB3cml0aW5nIGNvZGUgdGhhdCBydW5zIG9uIFB5dGhvbiAyIGFuZCAzIiIiCgojIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IEJlbmphbWluIFBldGVyc29uCiMKIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKIyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwojIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKIyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKIyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKIyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQojIFNPRlRXQVJFLgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHN5cwppbXBvcnQgdHlwZXMKCl9fYXV0aG9yX18gPSAiQmVuamFtaW4gUGV0ZXJzb24gPGJlbmphbWluQHB5dGhvbi5vcmc+IgpfX3ZlcnNpb25fXyA9ICIxLjEwLjAiCgoKIyBVc2VmdWwgZm9yIHZlcnkgY29hcnNlIHZlcnNpb24gZGlmZmVyZW50aWF0aW9uLgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzClBZMzQgPSBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPj0gKDMsIDQpCgppZiBQWTM6CiAgICBzdHJpbmdfdHlwZXMgPSBzdHIsCiAgICBpbnRlZ2VyX3R5cGVzID0gaW50LAogICAgY2xhc3NfdHlwZXMgPSB0eXBlLAogICAgdGV4dF90eXBlID0gc3RyCiAgICBiaW5hcnlfdHlwZSA9IGJ5dGVzCgogICAgTUFYU0laRSA9IHN5cy5tYXhzaXplCmVsc2U6CiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAogICAgaW50ZWdlcl90eXBlcyA9IChpbnQsIGxvbmcpCiAgICBjbGFzc190eXBlcyA9ICh0eXBlLCB0eXBlcy5DbGFzc1R5cGUpCiAgICB0ZXh0X3R5cGUgPSB1bmljb2RlCiAgICBiaW5hcnlfdHlwZSA9IHN0cgoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJqYXZhIik6CiAgICAgICAgIyBKeXRob24gYWx3YXlzIHVzZXMgMzIgYml0cy4KICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICBlbHNlOgogICAgICAgICMgSXQncyBwb3NzaWJsZSB0byBoYXZlIHNpemVvZihsb25nKSAhPSBzaXplb2YoUHlfc3NpemVfdCkuCiAgICAgICAgY2xhc3MgWChvYmplY3QpOgoKICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gMSA8PCAzMQogICAgICAgIHRyeToKICAgICAgICAgICAgbGVuKFgoKSkKICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKICAgICAgICAgICAgIyAzMi1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgNjQtYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgNjMpIC0gMSkKICAgICAgICBkZWwgWAoKCmRlZiBfYWRkX2RvYyhmdW5jLCBkb2MpOgogICAgIiIiQWRkIGRvY3VtZW50YXRpb24gdG8gYSBmdW5jdGlvbi4iIiIKICAgIGZ1bmMuX19kb2NfXyA9IGRvYwoKCmRlZiBfaW1wb3J0X21vZHVsZShuYW1lKToKICAgICIiIkltcG9ydCBtb2R1bGUsIHJldHVybmluZyB0aGUgbW9kdWxlIGFmdGVyIHRoZSBsYXN0IGRvdC4iIiIKICAgIF9faW1wb3J0X18obmFtZSkKICAgIHJldHVybiBzeXMubW9kdWxlc1tuYW1lXQoKCmNsYXNzIF9MYXp5RGVzY3Iob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgdHApOgogICAgICAgIHJlc3VsdCA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHNldGF0dHIob2JqLCBzZWxmLm5hbWUsIHJlc3VsdCkgICMgSW52b2tlcyBfX3NldF9fLgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBUaGlzIGlzIGEgYml0IHVnbHksIGJ1dCBpdCBhdm9pZHMgcnVubmluZyB0aGlzIGFnYWluIGJ5CiAgICAgICAgICAgICMgcmVtb3ZpbmcgdGhpcyBkZXNjcmlwdG9yLgogICAgICAgICAgICBkZWxhdHRyKG9iai5fX2NsYXNzX18sIHNlbGYubmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgTW92ZWRNb2R1bGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZCwgbmV3PU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkTW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXcgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGQKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgcmV0dXJuIF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICBfbW9kdWxlID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgdmFsdWUgPSBnZXRhdHRyKF9tb2R1bGUsIGF0dHIpCiAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWx1ZSkKICAgICAgICByZXR1cm4gdmFsdWUKCgpjbGFzcyBfTGF6eU1vZHVsZSh0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc3VwZXIoX0xhenlNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgc2VsZi5fX2RvY19fID0gc2VsZi5fX2NsYXNzX18uX19kb2NfXwoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIGF0dHJzID0gWyJfX2RvY19fIiwgIl9fbmFtZV9fIl0KICAgICAgICBhdHRycyArPSBbYXR0ci5uYW1lIGZvciBhdHRyIGluIHNlbGYuX21vdmVkX2F0dHJpYnV0ZXNdCiAgICAgICAgcmV0dXJuIGF0dHJzCgogICAgIyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzCiAgICBfbW92ZWRfYXR0cmlidXRlcyA9IFtdCgoKY2xhc3MgTW92ZWRBdHRyaWJ1dGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZF9tb2QsIG5ld19tb2QsIG9sZF9hdHRyPU5vbmUsIG5ld19hdHRyPU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkQXR0cmlidXRlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3X21vZCBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3X21vZCA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXdfbW9kCiAgICAgICAgICAgIGlmIG5ld19hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gbmFtZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG9sZF9hdHRyCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG5ld19hdHRyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGRfbW9kCiAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBvbGRfYXR0ciA9IG5hbWUKICAgICAgICAgICAgc2VsZi5hdHRyID0gb2xkX2F0dHIKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgbW9kdWxlID0gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCiAgICAgICAgcmV0dXJuIGdldGF0dHIobW9kdWxlLCBzZWxmLmF0dHIpCgoKY2xhc3MgX1NpeE1ldGFQYXRoSW1wb3J0ZXIob2JqZWN0KToKCiAgICAiIiIKICAgIEEgbWV0YSBwYXRoIGltcG9ydGVyIHRvIGltcG9ydCBzaXgubW92ZXMgYW5kIGl0cyBzdWJtb2R1bGVzLgoKICAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIFBFUDMwMiBmaW5kZXIgYW5kIGxvYWRlci4gSXQgc2hvdWxkIGJlIGNvbXBhdGlibGUKICAgIHdpdGggUHl0aG9uIDIuNSBhbmQgYWxsIGV4aXN0aW5nIHZlcnNpb25zIG9mIFB5dGhvbjMKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXhfbW9kdWxlX25hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IHNpeF9tb2R1bGVfbmFtZQogICAgICAgIHNlbGYua25vd25fbW9kdWxlcyA9IHt9CgogICAgZGVmIF9hZGRfbW9kdWxlKHNlbGYsIG1vZCwgKmZ1bGxuYW1lcyk6CiAgICAgICAgZm9yIGZ1bGxuYW1lIGluIGZ1bGxuYW1lczoKICAgICAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXSA9IG1vZAoKICAgIGRlZiBfZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0KCiAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5rbm93bl9tb2R1bGVzOgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIlRoaXMgbG9hZGVyIGRvZXMgbm90IGtub3cgbW9kdWxlICIgKyBmdWxsbmFtZSkKCiAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGEgcmVsb2FkCiAgICAgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBtb2QgPSBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkKICAgICAgICBpZiBpc2luc3RhbmNlKG1vZCwgTW92ZWRNb2R1bGUpOgogICAgICAgICAgICBtb2QgPSBtb2QuX3Jlc29sdmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZC5fX2xvYWRlcl9fID0gc2VsZgogICAgICAgIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXSA9IG1vZAogICAgICAgIHJldHVybiBtb2QKCiAgICBkZWYgaXNfcGFja2FnZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRydWUsIGlmIHRoZSBuYW1lZCBtb2R1bGUgaXMgYSBwYWNrYWdlLgoKICAgICAgICBXZSBuZWVkIHRoaXMgbWV0aG9kIHRvIGdldCBjb3JyZWN0IHNwZWMgb2JqZWN0cyB3aXRoCiAgICAgICAgUHl0aG9uIDMuNCAoc2VlIFBFUDQ1MSkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaGFzYXR0cihzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSksICJfX3BhdGhfXyIpCgogICAgZGVmIGdldF9jb2RlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiJSZXR1cm4gTm9uZQoKICAgICAgICBSZXF1aXJlZCwgaWYgaXNfcGFja2FnZSBpcyBpbXBsZW1lbnRlZCIiIgogICAgICAgIHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSAgIyBldmVudHVhbGx5IHJhaXNlcyBJbXBvcnRFcnJvcgogICAgICAgIHJldHVybiBOb25lCiAgICBnZXRfc291cmNlID0gZ2V0X2NvZGUgICMgc2FtZSBhcyBnZXRfY29kZQoKX2ltcG9ydGVyID0gX1NpeE1ldGFQYXRoSW1wb3J0ZXIoX19uYW1lX18pCgoKY2xhc3MgX01vdmVkSXRlbXMoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQoKCl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImNTdHJpbmdJTyIsICJjU3RyaW5nSU8iLCAiaW8iLCAiU3RyaW5nSU8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXIiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImlmaWx0ZXIiLCAiZmlsdGVyIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyZmFsc2UiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpZmlsdGVyZmFsc2UiLCAiZmlsdGVyZmFsc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnB1dCIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJyYXdfaW5wdXQiLCAiaW5wdXQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnRlcm4iLCAiX19idWlsdGluX18iLCAic3lzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgibWFwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpbWFwIiwgIm1hcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZCIsICJvcyIsICJvcyIsICJnZXRjd2R1IiwgImdldGN3ZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZGIiLCAib3MiLCAib3MiLCAiZ2V0Y3dkIiwgImdldGN3ZGIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWxvYWRfbW9kdWxlIiwgIl9fYnVpbHRpbl9fIiwgImltcG9ydGxpYiIgaWYgUFkzNCBlbHNlICJpbXAiLCAicmVsb2FkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVkdWNlIiwgIl9fYnVpbHRpbl9fIiwgImZ1bmN0b29scyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNobGV4X3F1b3RlIiwgInBpcGVzIiwgInNobGV4IiwgInF1b3RlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3RyaW5nSU8iLCAiU3RyaW5nSU8iLCAiaW8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyRGljdCIsICJVc2VyRGljdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJMaXN0IiwgIlVzZXJMaXN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlclN0cmluZyIsICJVc2VyU3RyaW5nIiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgieHJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaXppcCIsICJ6aXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXBfbG9uZ2VzdCIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgIml6aXBfbG9uZ2VzdCIsICJ6aXBfbG9uZ2VzdCIpLAogICAgTW92ZWRNb2R1bGUoImJ1aWx0aW5zIiwgIl9fYnVpbHRpbl9fIiksCiAgICBNb3ZlZE1vZHVsZSgiY29uZmlncGFyc2VyIiwgIkNvbmZpZ1BhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImNvcHlyZWciLCAiY29weV9yZWciKSwKICAgIE1vdmVkTW9kdWxlKCJkYm1fZ251IiwgImdkYm0iLCAiZGJtLmdudSIpLAogICAgTW92ZWRNb2R1bGUoIl9kdW1teV90aHJlYWQiLCAiZHVtbXlfdGhyZWFkIiwgIl9kdW1teV90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZWphciIsICJjb29raWVsaWIiLCAiaHR0cC5jb29raWVqYXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZXMiLCAiQ29va2llIiwgImh0dHAuY29va2llcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfZW50aXRpZXMiLCAiaHRtbGVudGl0eWRlZnMiLCAiaHRtbC5lbnRpdGllcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfcGFyc2VyIiwgIkhUTUxQYXJzZXIiLCAiaHRtbC5wYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2NsaWVudCIsICJodHRwbGliIiwgImh0dHAuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU11bHRpcGFydCIsICJlbWFpbC5taW1lLm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbm9ubXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVOb25NdWx0aXBhcnQiLCAiZW1haWwubWltZS5ub25tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX3RleHQiLCAiZW1haWwuTUlNRVRleHQiLCAiZW1haWwubWltZS50ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9iYXNlIiwgImVtYWlsLk1JTUVCYXNlIiwgImVtYWlsLm1pbWUuYmFzZSIpLAogICAgTW92ZWRNb2R1bGUoIkJhc2VIVFRQU2VydmVyIiwgIkJhc2VIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiQ0dJSFRUUFNlcnZlciIsICJDR0lIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiU2ltcGxlSFRUUFNlcnZlciIsICJTaW1wbGVIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiY1BpY2tsZSIsICJjUGlja2xlIiwgInBpY2tsZSIpLAogICAgTW92ZWRNb2R1bGUoInF1ZXVlIiwgIlF1ZXVlIiksCiAgICBNb3ZlZE1vZHVsZSgicmVwcmxpYiIsICJyZXByIiksCiAgICBNb3ZlZE1vZHVsZSgic29ja2V0c2VydmVyIiwgIlNvY2tldFNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIl90aHJlYWQiLCAidGhyZWFkIiwgIl90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyIiwgIlRraW50ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RpYWxvZyIsICJEaWFsb2ciLCAidGtpbnRlci5kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZpbGVkaWFsb2ciLCAiRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Njcm9sbGVkdGV4dCIsICJTY3JvbGxlZFRleHQiLCAidGtpbnRlci5zY3JvbGxlZHRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3NpbXBsZWRpYWxvZyIsICJTaW1wbGVEaWFsb2ciLCAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RpeCIsICJUaXgiLCAidGtpbnRlci50aXgiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3R0ayIsICJ0dGsiLCAidGtpbnRlci50dGsiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbnN0YW50cyIsICJUa2NvbnN0YW50cyIsICJ0a2ludGVyLmNvbnN0YW50cyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZG5kIiwgIlRrZG5kIiwgInRraW50ZXIuZG5kIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb2xvcmNob29zZXIiLCAidGtDb2xvckNob29zZXIiLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29sb3JjaG9vc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb21tb25kaWFsb2ciLCAidGtDb21tb25EaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29tbW9uZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a2ZpbGVkaWFsb2ciLCAidGtGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZm9udCIsICJ0a0ZvbnQiLCAidGtpbnRlci5mb250IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9tZXNzYWdlYm94IiwgInRrTWVzc2FnZUJveCIsICJ0a2ludGVyLm1lc3NhZ2Vib3giKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Rrc2ltcGxlZGlhbG9nIiwgInRrU2ltcGxlRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9wYXJzZSIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX2Vycm9yIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9lcnJvciIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9yb2JvdHBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfY2xpZW50IiwgInhtbHJwY2xpYiIsICJ4bWxycGMuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX3NlcnZlciIsICJTaW1wbGVYTUxSUENTZXJ2ZXIiLCAieG1scnBjLnNlcnZlciIpLApdCiMgQWRkIHdpbmRvd3Mgc3BlY2lmaWMgbW9kdWxlcy4KaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICBfbW92ZWRfYXR0cmlidXRlcyArPSBbCiAgICAgICAgTW92ZWRNb2R1bGUoIndpbnJlZyIsICJfd2lucmVnIiksCiAgICBdCgpmb3IgYXR0ciBpbiBfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIGF0dHIubmFtZSwgYXR0cikKICAgIGlmIGlzaW5zdGFuY2UoYXR0ciwgTW92ZWRNb2R1bGUpOgogICAgICAgIF9pbXBvcnRlci5fYWRkX21vZHVsZShhdHRyLCAibW92ZXMuIiArIGF0dHIubmFtZSkKZGVsIGF0dHIKCl9Nb3ZlZEl0ZW1zLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX21vdmVkX2F0dHJpYnV0ZXMKCm1vdmVzID0gX01vdmVkSXRlbXMoX19uYW1lX18gKyAiLm1vdmVzIikKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKG1vdmVzLCAibW92ZXMiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3BhcnNlIiIiCgoKX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlBhcnNlUmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlNwbGl0UmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzbCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxkZWZyYWciLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsam9pbiIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxwYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxzcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVuc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZW5jb2RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHF1ZXJ5IiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHRhZyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR1c2VyIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX2ZyYWdtZW50IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfbmV0bG9jIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcGFyYW1zIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcXVlcnkiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19yZWxhdGl2ZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcGFyc2UiLCAibW92ZXMudXJsbGliLnBhcnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9lcnJvciIiIgoKCl91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNvbnRlbnRUb29TaG9ydEVycm9yIiwgInVybGxpYiIsICJ1cmxsaWIuZXJyb3IiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIuZXJyb3IiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfZXJyb3IiLCAibW92ZXMudXJsbGliLmVycm9yIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JlcXVlc3QiIiIKCgpfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxvcGVuIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnN0YWxsX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYnVpbGRfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXRobmFtZTJ1cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsMnBhdGhuYW1lIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldHByb3hpZXMiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUmVxdWVzdCIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiT3BlbmVyRGlyZWN0b3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUmVkaXJlY3RIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQ29va2llUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkJhc2VIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1ncldpdGhEZWZhdWx0UmVhbG0iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eURpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFNIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGaWxlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ2FjaGVGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVbmtub3duSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxyZXRyaWV2ZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxjbGVhbnVwIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGYW5jeVVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwcm94eV9ieXBhc3MiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXF1ZXN0IiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JlcXVlc3QiLCAibW92ZXMudXJsbGliLnJlcXVlc3QiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3Jlc3BvbnNlIiIiCgoKX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGJhc2UiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGNsb3NlaG9vayIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mbyIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mb3VybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlc3BvbnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3Jlc3BvbnNlIiwgIm1vdmVzLnVybGxpYi5yZXNwb25zZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiIiIKCgpfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUm9ib3RGaWxlUGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIsICJtb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgICIiIkNyZWF0ZSBhIHNpeC5tb3Zlcy51cmxsaWIgbmFtZXNwYWNlIHRoYXQgcmVzZW1ibGVzIHRoZSBQeXRob24gMyBuYW1lc3BhY2UiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCiAgICBwYXJzZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3BhcnNlIikKICAgIGVycm9yID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfZXJyb3IiKQogICAgcmVxdWVzdCA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JlcXVlc3QiKQogICAgcmVzcG9uc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXNwb25zZSIpCiAgICByb2JvdHBhcnNlciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIikKCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gWydwYXJzZScsICdlcnJvcicsICdyZXF1ZXN0JywgJ3Jlc3BvbnNlJywgJ3JvYm90cGFyc2VyJ10KCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYihfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliIikKCgpkZWYgYWRkX21vdmUobW92ZSk6CiAgICAiIiJBZGQgYW4gaXRlbSB0byBzaXgubW92ZXMuIiIiCiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBtb3ZlLm5hbWUsIG1vdmUpCgoKZGVmIHJlbW92ZV9tb3ZlKG5hbWUpOgogICAgIiIiUmVtb3ZlIGl0ZW0gZnJvbSBzaXgubW92ZXMuIiIiCiAgICB0cnk6CiAgICAgICAgZGVsYXR0cihfTW92ZWRJdGVtcywgbmFtZSkKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBtb3Zlcy5fX2RpY3RfX1tuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIm5vIHN1Y2ggbW92ZSwgJXIiICUgKG5hbWUsKSkKCgppZiBQWTM6CiAgICBfbWV0aF9mdW5jID0gIl9fZnVuY19fIgogICAgX21ldGhfc2VsZiA9ICJfX3NlbGZfXyIKCiAgICBfZnVuY19jbG9zdXJlID0gIl9fY2xvc3VyZV9fIgogICAgX2Z1bmNfY29kZSA9ICJfX2NvZGVfXyIKICAgIF9mdW5jX2RlZmF1bHRzID0gIl9fZGVmYXVsdHNfXyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiX19nbG9iYWxzX18iCmVsc2U6CiAgICBfbWV0aF9mdW5jID0gImltX2Z1bmMiCiAgICBfbWV0aF9zZWxmID0gImltX3NlbGYiCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJmdW5jX2Nsb3N1cmUiCiAgICBfZnVuY19jb2RlID0gImZ1bmNfY29kZSIKICAgIF9mdW5jX2RlZmF1bHRzID0gImZ1bmNfZGVmYXVsdHMiCiAgICBfZnVuY19nbG9iYWxzID0gImZ1bmNfZ2xvYmFscyIKCgp0cnk6CiAgICBhZHZhbmNlX2l0ZXJhdG9yID0gbmV4dApleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGFkdmFuY2VfaXRlcmF0b3IoaXQpOgogICAgICAgIHJldHVybiBpdC5uZXh0KCkKbmV4dCA9IGFkdmFuY2VfaXRlcmF0b3IKCgp0cnk6CiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgY2FsbGFibGUob2JqKToKICAgICAgICByZXR1cm4gYW55KCJfX2NhbGxfXyIgaW4ga2xhc3MuX19kaWN0X18gZm9yIGtsYXNzIGluIHR5cGUob2JqKS5fX21yb19fKQoKCmlmIFBZMzoKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZAoKICAgIGNyZWF0ZV9ib3VuZF9tZXRob2QgPSB0eXBlcy5NZXRob2RUeXBlCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiBmdW5jCgogICAgSXRlcmF0b3IgPSBvYmplY3QKZWxzZToKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZC5pbV9mdW5jCgogICAgZGVmIGNyZWF0ZV9ib3VuZF9tZXRob2QoZnVuYywgb2JqKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBvYmosIG9iai5fX2NsYXNzX18pCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIE5vbmUsIGNscykKCiAgICBjbGFzcyBJdGVyYXRvcihvYmplY3QpOgoKICAgICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikuX19uZXh0X18oc2VsZikKCiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCl9hZGRfZG9jKGdldF91bmJvdW5kX2Z1bmN0aW9uLAogICAgICAgICAiIiJHZXQgdGhlIGZ1bmN0aW9uIG91dCBvZiBhIHBvc3NpYmx5IHVuYm91bmQgZnVuY3Rpb24iIiIpCgoKZ2V0X21ldGhvZF9mdW5jdGlvbiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfZnVuYykKZ2V0X21ldGhvZF9zZWxmID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9zZWxmKQpnZXRfZnVuY3Rpb25fY2xvc3VyZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY2xvc3VyZSkKZ2V0X2Z1bmN0aW9uX2NvZGUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2NvZGUpCmdldF9mdW5jdGlvbl9kZWZhdWx0cyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZGVmYXVsdHMpCmdldF9mdW5jdGlvbl9nbG9iYWxzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19nbG9iYWxzKQoKCmlmIFBZMzoKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmtleXMoKiprdykpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC52YWx1ZXMoKiprdykpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLml0ZW1zKCoqa3cpKQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5saXN0cygqKmt3KSkKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigia2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoIml0ZW1zIikKZWxzZToKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVya2V5cygqKmt3KQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJ2YWx1ZXMoKiprdykKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJpdGVtcygqKmt3KQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmxpc3RzKCoqa3cpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3dmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdpdGVtcyIpCgpfYWRkX2RvYyhpdGVya2V5cywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVydmFsdWVzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcml0ZW1zLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcmxpc3RzLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIFt2YWx1ZXNdKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKCgppZiBQWTM6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoImxhdGluLTEiKQoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiBzCiAgICB1bmljaHIgPSBjaHIKICAgIGltcG9ydCBzdHJ1Y3QKICAgIGludDJieXRlID0gc3RydWN0LlN0cnVjdCgiPkIiKS5wYWNrCiAgICBkZWwgc3RydWN0CiAgICBieXRlMmludCA9IG9wZXJhdG9yLml0ZW1nZXR0ZXIoMCkKICAgIGluZGV4Ynl0ZXMgPSBvcGVyYXRvci5nZXRpdGVtCiAgICBpdGVyYnl0ZXMgPSBpdGVyCiAgICBpbXBvcnQgaW8KICAgIFN0cmluZ0lPID0gaW8uU3RyaW5nSU8KICAgIEJ5dGVzSU8gPSBpby5CeXRlc0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRDb3VudEVxdWFsIgogICAgaWYgc3lzLnZlcnNpb25faW5mb1sxXSA8PSAxOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCiAgICBlbHNlOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXgiCmVsc2U6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcwogICAgIyBXb3JrYXJvdW5kIGZvciBzdGFuZGFsb25lIGJhY2tzbGFzaAoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiB1bmljb2RlKHMucmVwbGFjZShyJ1xcJywgcidcXFxcJyksICJ1bmljb2RlX2VzY2FwZSIpCiAgICB1bmljaHIgPSB1bmljaHIKICAgIGludDJieXRlID0gY2hyCgogICAgZGVmIGJ5dGUyaW50KGJzKToKICAgICAgICByZXR1cm4gb3JkKGJzWzBdKQoKICAgIGRlZiBpbmRleGJ5dGVzKGJ1ZiwgaSk6CiAgICAgICAgcmV0dXJuIG9yZChidWZbaV0pCiAgICBpdGVyYnl0ZXMgPSBmdW5jdG9vbHMucGFydGlhbChpdGVydG9vbHMuaW1hcCwgb3JkKQogICAgaW1wb3J0IFN0cmluZ0lPCiAgICBTdHJpbmdJTyA9IEJ5dGVzSU8gPSBTdHJpbmdJTy5TdHJpbmdJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0SXRlbXNFcXVhbCIKICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKX2FkZF9kb2MoYiwgIiIiQnl0ZSBsaXRlcmFsIiIiKQpfYWRkX2RvYyh1LCAiIiJUZXh0IGxpdGVyYWwiIiIpCgoKZGVmIGFzc2VydENvdW50RXF1YWwoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRDb3VudEVxdWFsKSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJhaXNlc1JlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmFpc2VzUmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmlmIFBZMzoKICAgIGV4ZWNfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgImV4ZWMiKQoKICAgIGRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgdmFsdWUgPSB0cCgpCiAgICAgICAgaWYgdmFsdWUuX190cmFjZWJhY2tfXyBpcyBub3QgdGI6CiAgICAgICAgICAgIHJhaXNlIHZhbHVlLndpdGhfdHJhY2ViYWNrKHRiKQogICAgICAgIHJhaXNlIHZhbHVlCgplbHNlOgogICAgZGVmIGV4ZWNfKF9jb2RlXywgX2dsb2JzXz1Ob25lLCBfbG9jc189Tm9uZSk6CiAgICAgICAgIiIiRXhlY3V0ZSBjb2RlIGluIGEgbmFtZXNwYWNlLiIiIgogICAgICAgIGlmIF9nbG9ic18gaXMgTm9uZToKICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKDEpCiAgICAgICAgICAgIF9nbG9ic18gPSBmcmFtZS5mX2dsb2JhbHMKICAgICAgICAgICAgaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBfbG9jc18gPSBmcmFtZS5mX2xvY2FscwogICAgICAgICAgICBkZWwgZnJhbWUKICAgICAgICBlbGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICBfbG9jc18gPSBfZ2xvYnNfCiAgICAgICAgZXhlYygiIiJleGVjIF9jb2RlXyBpbiBfZ2xvYnNfLCBfbG9jc18iIiIpCgogICAgZXhlY18oIiIiZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgIHJhaXNlIHRwLCB2YWx1ZSwgdGIKIiIiKQoKCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID09ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIGlmIGZyb21fdmFsdWUgaXMgTm9uZToKICAgICAgICByYWlzZSB2YWx1ZQogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA+ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsc2U6CiAgICBkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICAgICAgcmFpc2UgdmFsdWUKCgpwcmludF8gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAicHJpbnQiLCBOb25lKQppZiBwcmludF8gaXMgTm9uZToKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJUaGUgbmV3LXN0eWxlIHByaW50IGZ1bmN0aW9uIGZvciBQeXRob24gMi40IGFuZCAyLjUuIiIiCiAgICAgICAgZnAgPSBrd2FyZ3MucG9wKCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBpZiBmcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZGVmIHdyaXRlKGRhdGEpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRhLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgIGRhdGEgPSBzdHIoZGF0YSkKICAgICAgICAgICAgIyBJZiB0aGUgZmlsZSBoYXMgYW4gZW5jb2RpbmcsIGVuY29kZSB1bmljb2RlIHdpdGggaXQuCiAgICAgICAgICAgIGlmIChpc2luc3RhbmNlKGZwLCBmaWxlKSBhbmQKICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGZwLmVuY29kaW5nIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIGVycm9ycyA9IGdldGF0dHIoZnAsICJlcnJvcnMiLCBOb25lKQogICAgICAgICAgICAgICAgaWYgZXJyb3JzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gInN0cmljdCIKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShmcC5lbmNvZGluZywgZXJyb3JzKQogICAgICAgICAgICBmcC53cml0ZShkYXRhKQogICAgICAgIHdhbnRfdW5pY29kZSA9IEZhbHNlCiAgICAgICAgc2VwID0ga3dhcmdzLnBvcCgic2VwIiwgTm9uZSkKICAgICAgICBpZiBzZXAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VwLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzZXAsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGVuZCA9IGt3YXJncy5wb3AoImVuZCIsIE5vbmUpCiAgICAgICAgaWYgZW5kIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVuZCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UoZW5kLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJlbmQgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBpZiBrd2FyZ3M6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50cyB0byBwcmludCgpIikKICAgICAgICBpZiBub3Qgd2FudF91bmljb2RlOgogICAgICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgdW5pY29kZSk6CiAgICAgICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgd2FudF91bmljb2RlOgogICAgICAgICAgICBuZXdsaW5lID0gdW5pY29kZSgiXG4iKQogICAgICAgICAgICBzcGFjZSA9IHVuaWNvZGUoIiAiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ld2xpbmUgPSAiXG4iCiAgICAgICAgICAgIHNwYWNlID0gIiAiCiAgICAgICAgaWYgc2VwIGlzIE5vbmU6CiAgICAgICAgICAgIHNlcCA9IHNwYWNlCiAgICAgICAgaWYgZW5kIGlzIE5vbmU6CiAgICAgICAgICAgIGVuZCA9IG5ld2xpbmUKICAgICAgICBmb3IgaSwgYXJnIGluIGVudW1lcmF0ZShhcmdzKToKICAgICAgICAgICAgaWYgaToKICAgICAgICAgICAgICAgIHdyaXRlKHNlcCkKICAgICAgICAgICAgd3JpdGUoYXJnKQogICAgICAgIHdyaXRlKGVuZCkKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPCAoMywgMyk6CiAgICBfcHJpbnQgPSBwcmludF8KCiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgZnAgPSBrd2FyZ3MuZ2V0KCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBmbHVzaCA9IGt3YXJncy5wb3AoImZsdXNoIiwgRmFsc2UpCiAgICAgICAgX3ByaW50KCphcmdzLCAqKmt3YXJncykKICAgICAgICBpZiBmbHVzaCBhbmQgZnAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZwLmZsdXNoKCkKCl9hZGRfZG9jKHJlcmFpc2UsICIiIlJlcmFpc2UgYW4gZXhjZXB0aW9uLiIiIikKCmlmIHN5cy52ZXJzaW9uX2luZm9bMDoyXSA8ICgzLCA0KToKICAgIGRlZiB3cmFwcyh3cmFwcGVkLCBhc3NpZ25lZD1mdW5jdG9vbHMuV1JBUFBFUl9BU1NJR05NRU5UUywKICAgICAgICAgICAgICB1cGRhdGVkPWZ1bmN0b29scy5XUkFQUEVSX1VQREFURVMpOgogICAgICAgIGRlZiB3cmFwcGVyKGYpOgogICAgICAgICAgICBmID0gZnVuY3Rvb2xzLndyYXBzKHdyYXBwZWQsIGFzc2lnbmVkLCB1cGRhdGVkKShmKQogICAgICAgICAgICBmLl9fd3JhcHBlZF9fID0gd3JhcHBlZAogICAgICAgICAgICByZXR1cm4gZgogICAgICAgIHJldHVybiB3cmFwcGVyCmVsc2U6CiAgICB3cmFwcyA9IGZ1bmN0b29scy53cmFwcwoKCmRlZiB3aXRoX21ldGFjbGFzcyhtZXRhLCAqYmFzZXMpOgogICAgIiIiQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgIyBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGV4cGxhbmF0aW9uOiB0aGUgYmFzaWMgaWRlYSBpcyB0byBtYWtlIGEgZHVtbXkKICAgICMgbWV0YWNsYXNzIGZvciBvbmUgbGV2ZWwgb2YgY2xhc3MgaW5zdGFudGlhdGlvbiB0aGF0IHJlcGxhY2VzIGl0c2VsZiB3aXRoCiAgICAjIHRoZSBhY3R1YWwgbWV0YWNsYXNzLgogICAgY2xhc3MgbWV0YWNsYXNzKG1ldGEpOgoKICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHRoaXNfYmFzZXMsIGQpOgogICAgICAgICAgICByZXR1cm4gbWV0YShuYW1lLCBiYXNlcywgZCkKICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YWNsYXNzLCAndGVtcG9yYXJ5X2NsYXNzJywgKCksIHt9KQoKCmRlZiBhZGRfbWV0YWNsYXNzKG1ldGFjbGFzcyk6CiAgICAiIiJDbGFzcyBkZWNvcmF0b3IgZm9yIGNyZWF0aW5nIGEgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgIGRlZiB3cmFwcGVyKGNscyk6CiAgICAgICAgb3JpZ192YXJzID0gY2xzLl9fZGljdF9fLmNvcHkoKQogICAgICAgIHNsb3RzID0gb3JpZ192YXJzLmdldCgnX19zbG90c19fJykKICAgICAgICBpZiBzbG90cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzbG90cywgc3RyKToKICAgICAgICAgICAgICAgIHNsb3RzID0gW3Nsb3RzXQogICAgICAgICAgICBmb3Igc2xvdHNfdmFyIGluIHNsb3RzOgogICAgICAgICAgICAgICAgb3JpZ192YXJzLnBvcChzbG90c192YXIpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX19kaWN0X18nLCBOb25lKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fd2Vha3JlZl9fJywgTm9uZSkKICAgICAgICByZXR1cm4gbWV0YWNsYXNzKGNscy5fX25hbWVfXywgY2xzLl9fYmFzZXNfXywgb3JpZ192YXJzKQogICAgcmV0dXJuIHdyYXBwZXIKCgpkZWYgcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlKGtsYXNzKToKICAgICIiIgogICAgQSBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIF9fdW5pY29kZV9fIGFuZCBfX3N0cl9fIG1ldGhvZHMgdW5kZXIgUHl0aG9uIDIuCiAgICBVbmRlciBQeXRob24gMyBpdCBkb2VzIG5vdGhpbmcuCgogICAgVG8gc3VwcG9ydCBQeXRob24gMiBhbmQgMyB3aXRoIGEgc2luZ2xlIGNvZGUgYmFzZSwgZGVmaW5lIGEgX19zdHJfXyBtZXRob2QKICAgIHJldHVybmluZyB0ZXh0IGFuZCBhcHBseSB0aGlzIGRlY29yYXRvciB0byB0aGUgY2xhc3MuCiAgICAiIiIKICAgIGlmIFBZMjoKICAgICAgICBpZiAnX19zdHJfXycgbm90IGluIGtsYXNzLl9fZGljdF9fOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJAcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlIGNhbm5vdCBiZSBhcHBsaWVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gJXMgYmVjYXVzZSBpdCBkb2Vzbid0IGRlZmluZSBfX3N0cl9fKCkuIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2xhc3MuX19uYW1lX18pCiAgICAgICAga2xhc3MuX191bmljb2RlX18gPSBrbGFzcy5fX3N0cl9fCiAgICAgICAga2xhc3MuX19zdHJfXyA9IGxhbWJkYSBzZWxmOiBzZWxmLl9fdW5pY29kZV9fKCkuZW5jb2RlKCd1dGYtOCcpCiAgICByZXR1cm4ga2xhc3MKCgojIENvbXBsZXRlIHRoZSBtb3ZlcyBpbXBsZW1lbnRhdGlvbi4KIyBUaGlzIGNvZGUgaXMgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZHVsZSB0byBzcGVlZCB1cCBtb2R1bGUgbG9hZGluZy4KIyBUdXJuIHRoaXMgbW9kdWxlIGludG8gYSBwYWNrYWdlLgpfX3BhdGhfXyA9IFtdICAjIHJlcXVpcmVkIGZvciBQRVAgMzAyIGFuZCBQRVAgNDUxCl9fcGFja2FnZV9fID0gX19uYW1lX18gICMgc2VlIFBFUCAzNjYgQFJlc2VydmVkQXNzaWdubWVudAppZiBnbG9iYWxzKCkuZ2V0KCJfX3NwZWNfXyIpIGlzIG5vdCBOb25lOgogICAgX19zcGVjX18uc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMgPSBbXSAgIyBQRVAgNDUxIEBVbmRlZmluZWRWYXJpYWJsZQojIFJlbW92ZSBvdGhlciBzaXggbWV0YSBwYXRoIGltcG9ydGVycywgc2luY2UgdGhleSBjYXVzZSBwcm9ibGVtcy4gVGhpcyBjYW4KIyBoYXBwZW4gaWYgc2l4IGlzIHJlbW92ZWQgZnJvbSBzeXMubW9kdWxlcyBhbmQgdGhlbiByZWxvYWRlZC4gKFNldHVwdG9vbHMgZG9lcwojIHRoaXMgZm9yIHNvbWUgcmVhc29uLikKaWYgc3lzLm1ldGFfcGF0aDoKICAgIGZvciBpLCBpbXBvcnRlciBpbiBlbnVtZXJhdGUoc3lzLm1ldGFfcGF0aCk6CiAgICAgICAgIyBIZXJlJ3Mgc29tZSByZWFsIG5hc3RpbmVzczogQW5vdGhlciAiaW5zdGFuY2UiIG9mIHRoZSBzaXggbW9kdWxlIG1pZ2h0CiAgICAgICAgIyBiZSBmbG9hdGluZyBhcm91bmQuIFRoZXJlZm9yZSwgd2UgY2FuJ3QgdXNlIGlzaW5zdGFuY2UoKSB0byBjaGVjayBmb3IKICAgICAgICAjIHRoZSBzaXggbWV0YSBwYXRoIGltcG9ydGVyLCBzaW5jZSB0aGUgb3RoZXIgc2l4IGluc3RhbmNlIHdpbGwgaGF2ZQogICAgICAgICMgaW5zZXJ0ZWQgYW4gaW1wb3J0ZXIgd2l0aCBkaWZmZXJlbnQgY2xhc3MuCiAgICAgICAgaWYgKHR5cGUoaW1wb3J0ZXIpLl9fbmFtZV9fID09ICJfU2l4TWV0YVBhdGhJbXBvcnRlciIgYW5kCiAgICAgICAgICAgICAgICBpbXBvcnRlci5uYW1lID09IF9fbmFtZV9fKToKICAgICAgICAgICAgZGVsIHN5cy5tZXRhX3BhdGhbaV0KICAgICAgICAgICAgYnJlYWsKICAgIGRlbCBpLCBpbXBvcnRlcgojIEZpbmFsbHksIGFkZCB0aGUgaW1wb3J0ZXIgdG8gdGhlIG1ldGEgcGF0aCBpbXBvcnQgaG9vay4Kc3lzLm1ldGFfcGF0aC5hcHBlbmQoX2ltcG9ydGVyKQpQSwMEFAAAAAAAAAAhAHXY8Xm3CQAAtwkAADgAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL2V4dGVybi9fX2luaXRfXy5weWltcG9ydCBzeXMKCgpjbGFzcyBWZW5kb3JJbXBvcnRlcjoKICAgICIiIgogICAgQSBQRVAgMzAyIG1ldGEgcGF0aCBpbXBvcnRlciBmb3IgZmluZGluZyBvcHRpb25hbGx5LXZlbmRvcmVkCiAgICBvciBvdGhlcndpc2UgbmF0dXJhbGx5LWluc3RhbGxlZCBwYWNrYWdlcyBmcm9tIHJvb3RfbmFtZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290X25hbWUsIHZlbmRvcmVkX25hbWVzPSgpLCB2ZW5kb3JfcGtnPU5vbmUpOgogICAgICAgIHNlbGYucm9vdF9uYW1lID0gcm9vdF9uYW1lCiAgICAgICAgc2VsZi52ZW5kb3JlZF9uYW1lcyA9IHNldCh2ZW5kb3JlZF9uYW1lcykKICAgICAgICBzZWxmLnZlbmRvcl9wa2cgPSB2ZW5kb3JfcGtnIG9yIHJvb3RfbmFtZS5yZXBsYWNlKCdleHRlcm4nLCAnX3ZlbmRvcicpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2VhcmNoX3BhdGgoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2VhcmNoIGZpcnN0IHRoZSB2ZW5kb3IgcGFja2FnZSB0aGVuIGFzIGEgbmF0dXJhbCBwYWNrYWdlLgogICAgICAgICIiIgogICAgICAgIHlpZWxkIHNlbGYudmVuZG9yX3BrZyArICcuJwogICAgICAgIHlpZWxkICcnCgogICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBzZWxmIHdoZW4gZnVsbG5hbWUgc3RhcnRzIHdpdGggcm9vdF9uYW1lIGFuZCB0aGUKICAgICAgICB0YXJnZXQgbW9kdWxlIGlzIG9uZSB2ZW5kb3JlZCB0aHJvdWdoIHRoaXMgaW1wb3J0ZXIuCiAgICAgICAgIiIiCiAgICAgICAgcm9vdCwgYmFzZSwgdGFyZ2V0ID0gZnVsbG5hbWUucGFydGl0aW9uKHNlbGYucm9vdF9uYW1lICsgJy4nKQogICAgICAgIGlmIHJvb3Q6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIG5vdCBhbnkobWFwKHRhcmdldC5zdGFydHN3aXRoLCBzZWxmLnZlbmRvcmVkX25hbWVzKSk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiIKICAgICAgICBJdGVyYXRlIG92ZXIgdGhlIHNlYXJjaCBwYXRoIHRvIGxvY2F0ZSBhbmQgbG9hZCBmdWxsbmFtZS4KICAgICAgICAiIiIKICAgICAgICByb290LCBiYXNlLCB0YXJnZXQgPSBmdWxsbmFtZS5wYXJ0aXRpb24oc2VsZi5yb290X25hbWUgKyAnLicpCiAgICAgICAgZm9yIHByZWZpeCBpbiBzZWxmLnNlYXJjaF9wYXRoOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBleHRhbnQgPSBwcmVmaXggKyB0YXJnZXQKICAgICAgICAgICAgICAgIF9faW1wb3J0X18oZXh0YW50KQogICAgICAgICAgICAgICAgbW9kID0gc3lzLm1vZHVsZXNbZXh0YW50XQogICAgICAgICAgICAgICAgc3lzLm1vZHVsZXNbZnVsbG5hbWVdID0gbW9kCiAgICAgICAgICAgICAgICAjIG15c3RlcmlvdXMgaGFjazoKICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGV4dGFudCBwYWNrYWdlL21vZHVsZQogICAgICAgICAgICAgICAgIyBvbiBsYXRlciBQeXRob24gdmVyc2lvbnMgdG8gY2F1c2UgcmVsYXRpdmUgaW1wb3J0cwogICAgICAgICAgICAgICAgIyBpbiB0aGUgdmVuZG9yIHBhY2thZ2UgdG8gcmVzb2x2ZSB0aGUgc2FtZSBtb2R1bGVzCiAgICAgICAgICAgICAgICAjIGFzIHRob3NlIGdvaW5nIHRocm91Z2ggdGhpcyBpbXBvcnRlci4KICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPiAoMywgMyk6CiAgICAgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW2V4dGFudF0KICAgICAgICAgICAgICAgIHJldHVybiBtb2QKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKAogICAgICAgICAgICAgICAgIlRoZSAne3RhcmdldH0nIHBhY2thZ2UgaXMgcmVxdWlyZWQ7ICIKICAgICAgICAgICAgICAgICJub3JtYWxseSB0aGlzIGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2Ugc28gaWYgeW91IGdldCAiCiAgICAgICAgICAgICAgICAidGhpcyB3YXJuaW5nLCBjb25zdWx0IHRoZSBwYWNrYWdlciBvZiB5b3VyICIKICAgICAgICAgICAgICAgICJkaXN0cmlidXRpb24uIi5mb3JtYXQoKipsb2NhbHMoKSkKICAgICAgICAgICAgKQoKICAgIGRlZiBpbnN0YWxsKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEluc3RhbGwgdGhpcyBpbXBvcnRlciBpbnRvIHN5cy5tZXRhX3BhdGggaWYgbm90IGFscmVhZHkgcHJlc2VudC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmIG5vdCBpbiBzeXMubWV0YV9wYXRoOgogICAgICAgICAgICBzeXMubWV0YV9wYXRoLmFwcGVuZChzZWxmKQoKCm5hbWVzID0gJ3BhY2thZ2luZycsICdweXBhcnNpbmcnLCAnc2l4JywgJ2FwcGRpcnMnClZlbmRvckltcG9ydGVyKF9fbmFtZV9fLCBuYW1lcykuaW5zdGFsbCgpClBLAwQUAAAAAAAAACEAx0d9MlgCAABYAgAAMwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvcHkzMWNvbXBhdC5weWltcG9ydCBvcwppbXBvcnQgZXJybm8KaW1wb3J0IHN5cwoKCmRlZiBfbWFrZWRpcnNfMzEocGF0aCwgZXhpc3Rfb2s9RmFsc2UpOgogICAgdHJ5OgogICAgICAgIG9zLm1ha2VkaXJzKHBhdGgpCiAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CiAgICAgICAgaWYgbm90IGV4aXN0X29rIG9yIGV4Yy5lcnJubyAhPSBlcnJuby5FRVhJU1Q6CiAgICAgICAgICAgIHJhaXNlCgoKIyByZWx5IG9uIGNvbXBhdGliaWxpdHkgYmVoYXZpb3IgdW50aWwgbW9kZSBjb25zaWRlcmF0aW9ucwojICBhbmQgZXhpc3RzX29rIGNvbnNpZGVyYXRpb25zIGFyZSBkaXNlbnRhbmdsZWQuCiMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvcHVsbC8xMDgzI2lzc3VlY29tbWVudC0zMTUxNjg2NjMKbmVlZHNfbWFrZWRpcnMgPSAoCiAgICBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDIsIDUpIG9yCiAgICAoMywgMykgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzLCA2KSBvcgogICAgKDMsIDQpIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgNCwgMSkKKQptYWtlZGlycyA9IF9tYWtlZGlyc18zMSBpZiBuZWVkc19tYWtlZGlycyBlbHNlIG9zLm1ha2VkaXJzClBLAwQUAAAAAAAAACEAf9S6XI4FAACOBQAAQwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9ERVNDUklQVElPTi5yc3QuLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcHlwaS92L3NldHVwdG9vbHMuc3ZnCiAgIDp0YXJnZXQ6IGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9zZXR1cHRvb2xzCgouLiBpbWFnZTo6IGh0dHBzOi8vcmVhZHRoZWRvY3Mub3JnL3Byb2plY3RzL3NldHVwdG9vbHMvYmFkZ2UvP3ZlcnNpb249bGF0ZXN0CiAgICA6dGFyZ2V0OiBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8KCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby90cmF2aXMvcHlwYS9zZXR1cHRvb2xzL21hc3Rlci5zdmc/bGFiZWw9TGludXglMjBidWlsZCUyMCU0MCUyMFRyYXZpcyUyMENJCiAgIDp0YXJnZXQ6IGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9weXBhL3NldHVwdG9vbHMKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9hcHB2ZXlvci9jaS9qYXJhY28vc2V0dXB0b29scy9tYXN0ZXIuc3ZnP2xhYmVsPVdpbmRvd3MlMjBidWlsZCUyMCU0MCUyMEFwcHZleW9yCiAgIDp0YXJnZXQ6IGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvamFyYWNvL3NldHVwdG9vbHMvYnJhbmNoL21hc3RlcgoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvcHl2ZXJzaW9ucy9zZXR1cHRvb2xzLnN2ZwoKU2VlIHRoZSBgSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucwo8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9pbnN0YWxsaW5nLz5gXyBpbiB0aGUgUHl0aG9uIFBhY2thZ2luZwpVc2VyJ3MgR3VpZGUgZm9yIGluc3RydWN0aW9ucyBvbiBpbnN0YWxsaW5nLCB1cGdyYWRpbmcsIGFuZCB1bmluc3RhbGxpbmcKU2V0dXB0b29scy4KClRoZSBwcm9qZWN0IGlzIGBtYWludGFpbmVkIGF0IEdpdEh1YiA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scz5gXy4KClF1ZXN0aW9ucyBhbmQgY29tbWVudHMgc2hvdWxkIGJlIGRpcmVjdGVkIHRvIHRoZSBgZGlzdHV0aWxzLXNpZwptYWlsaW5nIGxpc3QgPGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL2Rpc3R1dGlscy1zaWcvPmBfLgpCdWcgcmVwb3J0cyBhbmQgZXNwZWNpYWxseSB0ZXN0ZWQgcGF0Y2hlcyBtYXkgYmUKc3VibWl0dGVkIGRpcmVjdGx5IHRvIHRoZSBgYnVnIHRyYWNrZXIKPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzPmBfLgoKCkNvZGUgb2YgQ29uZHVjdAotLS0tLS0tLS0tLS0tLS0KCkV2ZXJ5b25lIGludGVyYWN0aW5nIGluIHRoZSBzZXR1cHRvb2xzIHByb2plY3QncyBjb2RlYmFzZXMsIGlzc3VlIHRyYWNrZXJzLApjaGF0IHJvb21zLCBhbmQgbWFpbGluZyBsaXN0cyBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlCmBQeVBBIENvZGUgb2YgQ29uZHVjdCA8aHR0cHM6Ly93d3cucHlwYS5pby9lbi9sYXRlc3QvY29kZS1vZi1jb25kdWN0Lz5gXy4KCgpQSwMEFAAAAAAAAAAhAFDXqwc2BAAANgQAAD8AAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vTElDRU5TRS50eHRDb3B5cmlnaHQgKEMpIDIwMTYgSmFzb24gUiBDb29tYnMgPGphcmFjb0BqYXJhY28uY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgp0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgp0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCnVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCm9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbwpzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQpTT0ZUV0FSRS4KUEsDBBQAAAAAAAAAIQDxDJD/7goAAO4KAAA8AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL01FVEFEQVRBTWV0YWRhdGEtVmVyc2lvbjogMi4wCk5hbWU6IHNldHVwdG9vbHMKVmVyc2lvbjogMzguMi40ClN1bW1hcnk6IEVhc2lseSBkb3dubG9hZCwgYnVpbGQsIGluc3RhbGwsIHVwZ3JhZGUsIGFuZCB1bmluc3RhbGwgUHl0aG9uIHBhY2thZ2VzCkhvbWUtcGFnZTogaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scwpBdXRob3I6IFB5dGhvbiBQYWNrYWdpbmcgQXV0aG9yaXR5CkF1dGhvci1lbWFpbDogZGlzdHV0aWxzLXNpZ0BweXRob24ub3JnCkxpY2Vuc2U6IFVOS05PV04KRGVzY3JpcHRpb24tQ29udGVudC1UeXBlOiB0ZXh0L3gtcnN0OyBjaGFyc2V0PVVURi04CktleXdvcmRzOiBDUEFOIFB5UEkgZGlzdHV0aWxzIGVnZ3MgcGFja2FnZSBtYW5hZ2VtZW50ClBsYXRmb3JtOiBVTktOT1dOCkNsYXNzaWZpZXI6IERldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUKQ2xhc3NpZmllcjogSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycwpDbGFzc2lmaWVyOiBMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBNSVQgTGljZW5zZQpDbGFzc2lmaWVyOiBPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjcKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy40CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjUKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNgpDbGFzc2lmaWVyOiBUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMgOjogUHl0aG9uIE1vZHVsZXMKQ2xhc3NpZmllcjogVG9waWMgOjogU3lzdGVtIDo6IEFyY2hpdmluZyA6OiBQYWNrYWdpbmcKQ2xhc3NpZmllcjogVG9waWMgOjogU3lzdGVtIDo6IFN5c3RlbXMgQWRtaW5pc3RyYXRpb24KQ2xhc3NpZmllcjogVG9waWMgOjogVXRpbGl0aWVzClJlcXVpcmVzLVB5dGhvbjogPj0yLjcsIT0zLjAuKiwhPTMuMS4qLCE9My4yLioKUHJvdmlkZXMtRXh0cmE6IGNlcnRzClJlcXVpcmVzLURpc3Q6IGNlcnRpZmkgKD09MjAxNi45LjI2KTsgZXh0cmEgPT0gJ2NlcnRzJwpQcm92aWRlcy1FeHRyYTogc3NsClJlcXVpcmVzLURpc3Q6IHdpbmNlcnRzdG9yZSAoPT0wLjIpOyBzeXNfcGxhdGZvcm09PSd3aW4zMicgYW5kIGV4dHJhID09ICdzc2wnCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcHlwaS92L3NldHVwdG9vbHMuc3ZnCiAgIDp0YXJnZXQ6IGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9zZXR1cHRvb2xzCgouLiBpbWFnZTo6IGh0dHBzOi8vcmVhZHRoZWRvY3Mub3JnL3Byb2plY3RzL3NldHVwdG9vbHMvYmFkZ2UvP3ZlcnNpb249bGF0ZXN0CiAgICA6dGFyZ2V0OiBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8KCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby90cmF2aXMvcHlwYS9zZXR1cHRvb2xzL21hc3Rlci5zdmc/bGFiZWw9TGludXglMjBidWlsZCUyMCU0MCUyMFRyYXZpcyUyMENJCiAgIDp0YXJnZXQ6IGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9weXBhL3NldHVwdG9vbHMKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9hcHB2ZXlvci9jaS9qYXJhY28vc2V0dXB0b29scy9tYXN0ZXIuc3ZnP2xhYmVsPVdpbmRvd3MlMjBidWlsZCUyMCU0MCUyMEFwcHZleW9yCiAgIDp0YXJnZXQ6IGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvamFyYWNvL3NldHVwdG9vbHMvYnJhbmNoL21hc3RlcgoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvcHl2ZXJzaW9ucy9zZXR1cHRvb2xzLnN2ZwoKU2VlIHRoZSBgSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucwo8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9pbnN0YWxsaW5nLz5gXyBpbiB0aGUgUHl0aG9uIFBhY2thZ2luZwpVc2VyJ3MgR3VpZGUgZm9yIGluc3RydWN0aW9ucyBvbiBpbnN0YWxsaW5nLCB1cGdyYWRpbmcsIGFuZCB1bmluc3RhbGxpbmcKU2V0dXB0b29scy4KClRoZSBwcm9qZWN0IGlzIGBtYWludGFpbmVkIGF0IEdpdEh1YiA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scz5gXy4KClF1ZXN0aW9ucyBhbmQgY29tbWVudHMgc2hvdWxkIGJlIGRpcmVjdGVkIHRvIHRoZSBgZGlzdHV0aWxzLXNpZwptYWlsaW5nIGxpc3QgPGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL2Rpc3R1dGlscy1zaWcvPmBfLgpCdWcgcmVwb3J0cyBhbmQgZXNwZWNpYWxseSB0ZXN0ZWQgcGF0Y2hlcyBtYXkgYmUKc3VibWl0dGVkIGRpcmVjdGx5IHRvIHRoZSBgYnVnIHRyYWNrZXIKPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzPmBfLgoKCkNvZGUgb2YgQ29uZHVjdAotLS0tLS0tLS0tLS0tLS0KCkV2ZXJ5b25lIGludGVyYWN0aW5nIGluIHRoZSBzZXR1cHRvb2xzIHByb2plY3QncyBjb2RlYmFzZXMsIGlzc3VlIHRyYWNrZXJzLApjaGF0IHJvb21zLCBhbmQgbWFpbGluZyBsaXN0cyBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlCmBQeVBBIENvZGUgb2YgQ29uZHVjdCA8aHR0cHM6Ly93d3cucHlwYS5pby9lbi9sYXRlc3QvY29kZS1vZi1jb25kdWN0Lz5gXy4KCgpQSwMEFAAAAAAAAAAhAFysJqeDHgAAgx4AADoAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vUkVDT1JEZWFzeV9pbnN0YWxsLnB5LHNoYTI1Nj1NREM5dnQ1QXhEc1hYNXFjS2xCejJUblc2VHB1dl9Bb2JuZmhDSjlYM1BNLDEyNg0KcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weSxzaGEyNTY9NFFZMTVQOGNTX09BemJYSXl0bWJ2R2tudlg3dmRpaW9tRzRZaGJRUlpDSSwxMDU5OTENCnBrZ19yZXNvdXJjZXMvcHkzMWNvbXBhdC5weSxzaGEyNTY9LXlzVnFveExldEFuTDk0dU0wa0hrb21LUVRDMUpaTE4yWlVqcVVoTWVLRSw2MDANCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvYXBwZGlycy5weSxzaGEyNTY9dGdHYUwwbTRKbzJWZXVHZm9PT2lmTHY3YTdvVUVKdTJuMXZSa3FvUHctMCwyMjM3NA0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3B5cGFyc2luZy5weSxzaGEyNTY9UGlmZUxZMy1XaEljQlZ6THR2MFU0VF9wd0R0UHJ1QmhCQ2tnNXZMcWEyOCwyMjk4NjcNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9zaXgucHksc2hhMjU2PUE2aGRKWlZqSTN0X2dlZWJaOUJ6VXZ3UnJJWG8wbGZ3elFsTTJMY0t5YXMsMzAwOTgNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19hYm91dF9fLnB5LHNoYTI1Nj16a2NDUFROXzZUY0xXME5ybGcwMTc2LVIxUVFfV1ZQVG04c3oxUjQtSGpNLDcyMA0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weSxzaGEyNTY9X3ZOYWM1VHJ6d3NyemJPRkliRi01Y0hxY19ZMmFQVDJEN3pySVIwNkJPbyw1MTMNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weSxzaGEyNTY9VmlfQTByQVFlSGJVLWE5WDB0dDF5UW05UnFrZ1FiRFN4elJ3OFdsVTlrQSw4NjANCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHksc2hhMjU2PVJJbUVDSjRjX3dUbGFUWVl3WllMSEVpZWJETWFBSm1LMW9QQVJodzFUNW8sMTQxNg0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5LHNoYTI1Nj11RWNCQnRHdnpxbHRnbkFycWI5YzRScmNJblhlekRMb3MxNHpiQkhoV0pvLDgyNDgNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5LHNoYTI1Nj1TaWtMMlV5bmJzVDBxdFk5bHRxbmduZGhhX3NmbzB3NlhHRmhBaG9Tb2FRLDQzNTUNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weSxzaGEyNTY9U0FNUmVyek8zZksySWtGWkNhWmt1d1phTF9FR3FITk96NHBuaTR2aG5OMCwyODAyNQ0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weSxzaGEyNTY9M202V3ZQbTZOTnhFOHJrVEdtbjByNzVCX0daU0dnN2lrYWZ4SHNCTjFXQSw0MjENCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weSxzaGEyNTY9T3dHbnhZZnIyZ2hOell4NTlxV0lCa3JLM1NuQjZuLVpmZDFYYUxwbm5NMCwxMTU1Ng0KcGtnX3Jlc291cmNlcy9leHRlcm4vX19pbml0X18ucHksc2hhMjU2PUpVdGxISHZseEhTTnVCNHBXcU5qY3g3bjZrRy1md1hnN3FtSjJ6TkpsSVksMjQ4Nw0Kc2V0dXB0b29scy9fX2luaXRfXy5weSxzaGEyNTY9V1dJZENiRkpuWjlmWm9hV0ROX3gxdkRBX1JrbS1TYzE1aUt2UHRJWUtGcyw1NzAwDQpzZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weSxzaGEyNTY9a3c4SWJfbEtqQ2NuUEtOYlM3aDhIenRSVkswZDVSYWNVM3JfS1JkVm5tTSw2NTkyDQpzZXR1cHRvb2xzL2J1aWxkX21ldGEucHksc2hhMjU2PUZsbGFLVHIxdlNKeWlVZVJqVkpFWm1lRWFSemhZdWVObGltdGN3YUpiYTgsNTY3MQ0Kc2V0dXB0b29scy9jbGktMzIuZXhlLHNoYTI1Nj1kZkV1b3ZNTm5BMkhMYTNqUmZNUFZpNXRrNFI3YWxDYnBUdnV4dEN5dzBZLDY1NTM2DQpzZXR1cHRvb2xzL2NsaS02NC5leGUsc2hhMjU2PUtMQUJ1NXB5cm5va0pDdjZza2pYWjZHc1hleVlIR2NxT1VUM29ISTNYcG8sNzQ3NTINCnNldHVwdG9vbHMvY2xpLmV4ZSxzaGEyNTY9ZGZFdW92TU5uQTJITGEzalJmTVBWaTV0azRSN2FsQ2JwVHZ1eHRDeXcwWSw2NTUzNg0Kc2V0dXB0b29scy9jb25maWcucHksc2hhMjU2PVpUQ2dBQzE4bTR4WHh1ZmxsZkd4aS1YSHZGZzZnal9qR3Bpc1JqcDBLQ3csMTYzMDUNCnNldHVwdG9vbHMvZGVwX3V0aWwucHksc2hhMjU2PWZnaXh2QzFSN3NIM3IxM2t0eWY3TjBGQUxvcUVYTDFjQmFybU5wU0VvV2csOTM1DQpzZXR1cHRvb2xzL2RlcGVuZHMucHksc2hhMjU2PWhDOFFJRGNNM1ZEcFJYdlJWQTZPZkw5QWFRZnh2aHhIY05fdzZzQXlOcTgsNTgzNw0Kc2V0dXB0b29scy9kaXN0LnB5LHNoYTI1Nj1seDVFcnJuN25hbF9fd3VILTlZSXBHRkZaR05ZbnNoY0VNRFp0SEJQcHJrLDQwMzM2DQpzZXR1cHRvb2xzL2V4dGVuc2lvbi5weSxzaGEyNTY9dWM2bkhJLU14d21OQ05QYlVpQm55YlN5cWhwSnFqYmh2T1EtZW1kdnRfRSwxNzI5DQpzZXR1cHRvb2xzL2dsaWJjLnB5LHNoYTI1Nj1YNjRWdkdQTDJBYlVSS3dZUnNXSk9YWEdBWU9pRl92MnFpeGVUa0FVTHVVLDMxNDYNCnNldHVwdG9vbHMvZ2xvYi5weSxzaGEyNTY9WS1mcHY4d2RIWnp2OURQQ2FHQUNwTVNCV0o2YW1xXzFlMFJfaThfZWw0dyw1MjA3DQpzZXR1cHRvb2xzL2d1aS0zMi5leGUsc2hhMjU2PVhCcjBiSE1BNkhwejJzOXM5QnpqbC1Qd1hmYTluSDRpZTByRm40VjJrV0EsNjU1MzYNCnNldHVwdG9vbHMvZ3VpLTY0LmV4ZSxzaGEyNTY9YVlLTWhYMUlKTG40VUxIZ1dYMHNFMHlSRVV0NkIzVEVIZl9qT3c2eU55RSw3NTI2NA0Kc2V0dXB0b29scy9ndWkuZXhlLHNoYTI1Nj1YQnIwYkhNQTZIcHoyczlzOUJ6amwtUHdYZmE5bkg0aWUwckZuNFYya1dBLDY1NTM2DQpzZXR1cHRvb2xzL2xhdW5jaC5weSxzaGEyNTY9c2Q3ZWp3aEJvY0NEeF93RzlySXMwT2FaOEh0bW1GVThaQzZJUl9TMEx2Zyw3ODcNCnNldHVwdG9vbHMvbGliMnRvM19leC5weSxzaGEyNTY9dDVlMTJoYlIycGk5VjRleldEVEI0Sk0tQUlTVW5HT2ttY25ZSGVrM3hqZywyMDEzDQpzZXR1cHRvb2xzL21vbmtleS5weSxzaGEyNTY9elpHVEg3cDB4ZVhRS0xtRXdKVFBJRTRtNW03ZkplSG9Bc3h5djVNOGVfRSw1Nzg5DQpzZXR1cHRvb2xzL21zdmMucHksc2hhMjU2PUFFYldOTEowcFR1SEpTa1F1QlpFVDZ3cl9kMi15R0dQa2RIQ01kSUtXQjQsNDA4ODQNCnNldHVwdG9vbHMvbmFtZXNwYWNlcy5weSxzaGEyNTY9RjBOcmJ2OEtDVDJPck83cndhMDNvbTRONEdaS0FsbmNlLXJyLWNnRFFhOCwzMTk5DQpzZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHksc2hhMjU2PUI3ZzdOcENZa19iRWpqZXFCbTNOYnFCa2JKaGgtbW5yZXMzbDFWMmhkbHcsNDA1MDcNCnNldHVwdG9vbHMvcGVwNDI1dGFncy5weSxzaGEyNTY9TnVHTXgxZ0dpZjd4NmlZZW1oMExmZ0JyX0ZaRjVHRk9SSWJnbU1kVThKNCwxMDg4Mg0Kc2V0dXB0b29scy9weTI3Y29tcGF0LnB5LHNoYTI1Nj0zbXd4Uk1EazVRNU8xclNYT0VSYlFEWGhGcXdESmhoVWl0Zk1XX3FwVUNvLDUzNg0Kc2V0dXB0b29scy9weTMxY29tcGF0LnB5LHNoYTI1Nj1YdVUxSENzR0VfM3pHdkJSSWhZdzJpQi1JaENGSzQtUHh3X2pNaXFkTlZrLDExOTINCnNldHVwdG9vbHMvcHkzM2NvbXBhdC5weSxzaGEyNTY9VzhfSkZacjhXUWJKVF83LUpGV2pjXzZsSEd0b01LLTRwQ3JISXdrNUpOMCw5OTgNCnNldHVwdG9vbHMvcHkzNmNvbXBhdC5weSxzaGEyNTY9VlVEV3htdTVydDRRSGxHVFJ0QUZ1Nlc1anZmTDZXQmplREF6ZW9CeTBPTSwyODkxDQpzZXR1cHRvb2xzL3NhbmRib3gucHksc2hhMjU2PTlVYndmRUw1UVk0MzZvTUkxTHRGV29oaG9aLVV6d0h2R3laalVIX3Foa3csMTQyNzYNCnNldHVwdG9vbHMvc2NyaXB0IChkZXYpLnRtcGwsc2hhMjU2PWY3TVIxN2RUa3phcWtDTVNWc2V5T0NNVnJQVlNNZG1UUXNhQjhjWnpmdUksMjAxDQpzZXR1cHRvb2xzL3NjcmlwdC50bXBsLHNoYTI1Nj1XR1R0NXBpZXpPMjdjLURieDZsNVE0VDNGZjIwQTV6Nzg3Mmh2M2FBaFlZLDEzOA0Kc2V0dXB0b29scy9zaXRlLXBhdGNoLnB5LHNoYTI1Nj1CVnQ2eUlyRE1YSm9mbEE1SjZESkljc0pVZldfWEVlVmhPemVsVFRGRFA0LDIzMDcNCnNldHVwdG9vbHMvc3NsX3N1cHBvcnQucHksc2hhMjU2PVlCREpzQ1pqU3A2MkNXanhtU2trZTlrbjlyaEhIajI1Q3VzNnpoSlJXM2MsODQ5Mg0Kc2V0dXB0b29scy91bmljb2RlX3V0aWxzLnB5LHNoYTI1Nj1OT2laXzVoRDcyQTZ3LTR3Vmo4YXdIRk0zbjUxS213MUljX3Z4MTVYRnF3LDk5Ng0Kc2V0dXB0b29scy92ZXJzaW9uLnB5LHNoYTI1Nj1vZ19jdVpRYjBRSTZ1a0taRmZaV1BscjFIZ0pCUFBuMnZPMm1fYkk5WlRFLDE0NA0Kc2V0dXB0b29scy93aGVlbC5weSxzaGEyNTY9NnFZOFR0T19ZSnMyY2o5SnRmaUdRZGx2TllVMlRYRFpOay0yS3ZlQkpiYyw3MjMzDQpzZXR1cHRvb2xzL3dpbmRvd3Nfc3VwcG9ydC5weSxzaGEyNTY9NUdyZnFTUDItZExHSm9aVHEyZzZkQ0treVF4eGEybjVJUWlYbEpDb1lFRSw3MTQNCnNldHVwdG9vbHMvY29tbWFuZC9fX2luaXRfXy5weSxzaGEyNTY9Tld6SjBBMUJFZW5nWnBWZXFVeVdMTm0yYms0UDNGNGlMNVFVRXJIeTdrQSw1OTQNCnNldHVwdG9vbHMvY29tbWFuZC9hbGlhcy5weSxzaGEyNTY9S2pwRTBzel9TRElIdjNmcFpjSVFLLXNDa0p6LVNyQzZHbXVnNmI5TmtjOCwyNDI2DQpzZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfZWdnLnB5LHNoYTI1Nj1kaDg4VzhwTUhVSlBIbExULVhuUHZ5eURjbU1mRWJJMmpLMUUzdzFFSEtjLDE4MDExDQpzZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfcnBtLnB5LHNoYTI1Nj1CN2wwVG56Q0diLTBuTGxtNnJTMDBqV0xrb2pBU3dWbWRoVzJ3NVF6X0FrLDE1MDgNCnNldHVwdG9vbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5LHNoYTI1Nj1fNmR6M2xwQjF0WTIwMEx4S1BMTTdxZ3dUQ2NlT01nYVdGRi1qVzItcG0wLDYzNw0Kc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2NsaWIucHksc2hhMjU2PWJROWFCci01WlNPLTlmR3NHc0RMejBtbm5GdGVIVVpuZnRWTGtodkhEcTAsNDQ4NA0Kc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2V4dC5weSxzaGEyNTY9ZE84OWotSUMwZEFqU3R5MXNTWnh2aTBMU2RrUEdSX1pQWEZ1QUFGRFpqNCwxMzA0OQ0Kc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX3B5LnB5LHNoYTI1Nj15V3lZYWFTOUYzbzlKYkljem4wNjRBNWcxQzVfVWlLUkR4R2FUcVlidExFLDk1OTYNCnNldHVwdG9vbHMvY29tbWFuZC9kZXZlbG9wLnB5LHNoYTI1Nj13S2JPdzJfcVV2Y0R0aTJsWm10eGJEbVliNTR5QUFpYkV4elhJdlRvei1BLDgwNDYNCnNldHVwdG9vbHMvY29tbWFuZC9kaXN0X2luZm8ucHksc2hhMjU2PTV0NmtPZnJkZ0FMVC1QM29nc3M2UEY5ay1MZXllc3VleWN1azNkVXlabkksOTYwDQpzZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5LHNoYTI1Nj1ZQUlzVWh6bXdfc2h2dm9EUDhFZXNEUzJ4YkZIN3RENE11WUU4WDN4NlljLDg3MTI1DQpzZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHksc2hhMjU2PURMUjVfWHItZ1JxeFF3SmN5VkNrVXJmVlpacmlNdVFTV29RR0ozWEw3VDgsMjQ5NDQNCnNldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsLnB5LHNoYTI1Nj1hMEVacExfQTg2NktFZGhpY1RHYnV5RF9UWWwxc3lrZnpkcnJpLXphelQ0LDQ2ODMNCnNldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5LHNoYTI1Nj1iTWdlSWVSaVh6UTREQUdQVjEzMjhrY2p3UWpIak9XVTRGbmdBV0xWNzhRLDIyMDMNCnNldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weSxzaGEyNTY9MTFteGYwQ2gxMk5zdVl3UzhQSHdYQlJ2eWg2NzFRQU00Y1RSaDdlcHpHMCwzODQwDQpzZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5LHNoYTI1Nj1VRDByRVo2ODYxbVRZaElkemNzcUtuVWw4UG96b2NYV2w5VkJRMVZUV25jLDI0MzkNCnNldHVwdG9vbHMvY29tbWFuZC9sYXVuY2hlciBtYW5pZmVzdC54bWwsc2hhMjU2PXhsTGJqV3JCMDF0S0MwLWhsVmtPS2tpU1Biek1tbDJlT1B0Sl91Y0NuYkUsNjI4DQpzZXR1cHRvb2xzL2NvbW1hbmQvcHkzNmNvbXBhdC5weSxzaGEyNTY9U3pqWmNPeEY3emRGVVQ0N1p2Mm43QU0zSDhrb0R5c18wT3BTLW45Z0lmYyw0OTg2DQpzZXR1cHRvb2xzL2NvbW1hbmQvcmVnaXN0ZXIucHksc2hhMjU2PWJIbE1tMXFtQmJTZGFoVE9UOHc2VWhBLUVnZVFJejdwNmNELXFPYXVhaUksMjcwDQpzZXR1cHRvb2xzL2NvbW1hbmQvcm90YXRlLnB5LHNoYTI1Nj1jbzVDMUVrSTdQMEdHVDZUcXotVDJTSWoyTEJKVFpYWUVMcG1hbzZkNEtRLDIxNjQNCnNldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weSxzaGEyNTY9emE3UUNCY1FpbUtLcmlXY29DY2JoeFBqVXozMGdTQjc0enVUTDQ3eHBQNCw2NTgNCnNldHVwdG9vbHMvY29tbWFuZC9zZGlzdC5weSxzaGEyNTY9b2JEVGUyQm1XdDJQbG5GUFpaaDdlMExXdmVtRXNiQ0NPOU16aHJUWmptOCw2NzExDQpzZXR1cHRvb2xzL2NvbW1hbmQvc2V0b3B0LnB5LHNoYTI1Nj1OVFdEeXgtZ2pERi10eGY0ZE81NzdzN0xPekhWb0tSME1xMzNyRnhhUnI4LDUwODUNCnNldHVwdG9vbHMvY29tbWFuZC90ZXN0LnB5LHNoYTI1Nj1NZUJBY1hVZVBHalBLcWp6NHp2VHJIYXRMdk5zamxQRmNhZ3QzWG5GWWRrLDkyMTQNCnNldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHksc2hhMjU2PWkxZ2ZJdFozblFPbjVGS1hiOHRMQzJLZDdlS0M4bFdPNGJkRTZOcUdwRTQsMTE3Mg0Kc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZF9kb2NzLnB5LHNoYTI1Nj1vWGlHcGxNX2NVS0x3RTRDV1d3OThSekN1ZkF1OHRCaE1DOTdHZWdGY21zLDczMTENCnNldHVwdG9vbHMvZXh0ZXJuL19faW5pdF9fLnB5LHNoYTI1Nj1adENMWVE4SlR0T3RtN1NZb3hla1p3LVV6WTNUUjUwU1JJVWFlcXIyUk9rLDEzMQ0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdCxzaGEyNTY9SXQzYTNHUmpUNTcwMW1xaHJwTWNMeVdfWVMyRG9rdi1YOHpXb1RhTVJlMCwxNDIyDQpzZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vTElDRU5TRS50eHQsc2hhMjU2PXd5bzZ3NVd2WXlIdjBvdm5QUWFnRHcyMnE0aDlIQ0hVX3NSaEtOSUZiVm8sMTA3OA0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL01FVEFEQVRBLHNoYTI1Nj1XTGdwYlVYMW9PNW9HZTc0d2VjUlJMLW50bE5jampPRXdVZFFrak5RTnpJLDI3OTgNCnNldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9SRUNPUkQsLA0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL1dIRUVMLHNoYTI1Nj1rZHNOLTVPSkFaSWlITi1pTzRSaGw4Mkt5UzBiRFdmNHVCd01ia05hZnI4LDExMA0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL2RlcGVuZGVuY3lfbGlua3MudHh0LHNoYTI1Nj1IbGtDRmtvSzVUYlo1RU1MYkxLWWhMY1lfRTMxa0JXRDhUcVcyRWdtYXRRLDIzOQ0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHQsc2hhMjU2PWpCcUNZRGxWamxfX3NqWUZHWG8xSlFHSU1BWUZKRS1wcllXVXRuTVpFZXcsMjk5MA0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL21ldGFkYXRhLmpzb24sc2hhMjU2PXhkMF9OZ01PLWFUSi13c002ZHQ2ZGdRV2V4SXZ2ZkN6dU8wa1JEN01aNWssNDkwMQ0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHQsc2hhMjU2PTJIVVhWVndBNFBmZjF4Z1RGcjNHc1RYWEthUGFPNnZsRzZvTkpfNHU0VGcsMzgNCnNldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby96aXAtc2FmZSxzaGEyNTY9QWJwSEdjZ0xiLWtSc0pHbndGRWt0azd1enBaT0NjQlk3NC1ZQmRyS1ZHcywxDQpQSwMEFAAAAAAAAAAhAPbd0r5uAAAAbgAAADkAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vV0hFRUxXaGVlbC1WZXJzaW9uOiAxLjAKR2VuZXJhdG9yOiBiZGlzdF93aGVlbCAoMC4zMC4wKQpSb290LUlzLVB1cmVsaWI6IHRydWUKVGFnOiBweTItbm9uZS1hbnkKVGFnOiBweTMtbm9uZS1hbnkKClBLAwQUAAAAAAAAACEAN9lf3e8AAADvAAAASAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9kZXBlbmRlbmN5X2xpbmtzLnR4dGh0dHBzOi8vZmlsZXMucHl0aG9uaG9zdGVkLm9yZy9wYWNrYWdlcy9zb3VyY2UvYy9jZXJ0aWZpL2NlcnRpZmktMjAxNi45LjI2LnRhci5neiNtZDU9YmFhODFlOTUxYTI5OTU4NTYzNjg5ZDg2OGVmMTA2NGQKaHR0cHM6Ly9maWxlcy5weXRob25ob3N0ZWQub3JnL3BhY2thZ2VzL3NvdXJjZS93L3dpbmNlcnRzdG9yZS93aW5jZXJ0c3RvcmUtMC4yLnppcCNtZDU9YWU3MjhmMmYwMDcxODU2NDhkMGM3YTg2NzliMzYxZTIKUEsDBBQAAAAAAAAAIQDRNY6OrgsAAK4LAABEAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHRbY29uc29sZV9zY3JpcHRzXQplYXN5X2luc3RhbGwgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4KZWFzeV9pbnN0YWxsLTMuNiA9IHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6bWFpbgoKW2Rpc3R1dGlscy5jb21tYW5kc10KYWxpYXMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYWxpYXM6YWxpYXMKYmRpc3RfZWdnID0gc2V0dXB0b29scy5jb21tYW5kLmJkaXN0X2VnZzpiZGlzdF9lZ2cKYmRpc3RfcnBtID0gc2V0dXB0b29scy5jb21tYW5kLmJkaXN0X3JwbTpiZGlzdF9ycG0KYmRpc3Rfd2luaW5zdCA9IHNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF93aW5pbnN0OmJkaXN0X3dpbmluc3QKYnVpbGRfY2xpYiA9IHNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9jbGliOmJ1aWxkX2NsaWIKYnVpbGRfZXh0ID0gc2V0dXB0b29scy5jb21tYW5kLmJ1aWxkX2V4dDpidWlsZF9leHQKYnVpbGRfcHkgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfcHk6YnVpbGRfcHkKZGV2ZWxvcCA9IHNldHVwdG9vbHMuY29tbWFuZC5kZXZlbG9wOmRldmVsb3AKZGlzdF9pbmZvID0gc2V0dXB0b29scy5jb21tYW5kLmRpc3RfaW5mbzpkaXN0X2luZm8KZWFzeV9pbnN0YWxsID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDplYXN5X2luc3RhbGwKZWdnX2luZm8gPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86ZWdnX2luZm8KaW5zdGFsbCA9IHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsOmluc3RhbGwKaW5zdGFsbF9lZ2dfaW5mbyA9IHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX2VnZ19pbmZvOmluc3RhbGxfZWdnX2luZm8KaW5zdGFsbF9saWIgPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9saWI6aW5zdGFsbF9saWIKaW5zdGFsbF9zY3JpcHRzID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfc2NyaXB0czppbnN0YWxsX3NjcmlwdHMKcmVnaXN0ZXIgPSBzZXR1cHRvb2xzLmNvbW1hbmQucmVnaXN0ZXI6cmVnaXN0ZXIKcm90YXRlID0gc2V0dXB0b29scy5jb21tYW5kLnJvdGF0ZTpyb3RhdGUKc2F2ZW9wdHMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2F2ZW9wdHM6c2F2ZW9wdHMKc2Rpc3QgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3Q6c2Rpc3QKc2V0b3B0ID0gc2V0dXB0b29scy5jb21tYW5kLnNldG9wdDpzZXRvcHQKdGVzdCA9IHNldHVwdG9vbHMuY29tbWFuZC50ZXN0OnRlc3QKdXBsb2FkID0gc2V0dXB0b29scy5jb21tYW5kLnVwbG9hZDp1cGxvYWQKdXBsb2FkX2RvY3MgPSBzZXR1cHRvb2xzLmNvbW1hbmQudXBsb2FkX2RvY3M6dXBsb2FkX2RvY3MKCltkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHNdCmNvbnZlcnRfMnRvM19kb2N0ZXN0cyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKZGVwZW5kZW5jeV9saW5rcyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKZWFnZXJfcmVzb3VyY2VzID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdAplbnRyeV9wb2ludHMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfZW50cnlfcG9pbnRzCmV4Y2x1ZGVfcGFja2FnZV9kYXRhID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VfZGF0YQpleHRyYXNfcmVxdWlyZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19leHRyYXMKaW5jbHVkZV9wYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wKaW5zdGFsbF9yZXF1aXJlcyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMKbmFtZXNwYWNlX3BhY2thZ2VzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX25zcApwYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZV9kYXRhCnBhY2thZ2VzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VzCnB5dGhvbl9yZXF1aXJlcyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19zcGVjaWZpZXIKc2V0dXBfcmVxdWlyZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcmVxdWlyZW1lbnRzCnRlc3RfbG9hZGVyID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX2ltcG9ydGFibGUKdGVzdF9ydW5uZXIgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfaW1wb3J0YWJsZQp0ZXN0X3N1aXRlID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3Rlc3Rfc3VpdGUKdGVzdHNfcmVxdWlyZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMKdXNlXzJ0bzMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wKdXNlXzJ0bzNfZXhjbHVkZV9maXhlcnMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0CnVzZV8ydG8zX2ZpeGVycyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKemlwX3NhZmUgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wKCltlZ2dfaW5mby53cml0ZXJzXQpQS0ctSU5GTyA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9wa2dfaW5mbwpkZXBlbmRlbmN5X2xpbmtzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnCmRlcGVuZHMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndhcm5fZGVwZW5kc19vYnNvbGV0ZQplYWdlcl9yZXNvdXJjZXMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmcKZW50cnlfcG9pbnRzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9lbnRyaWVzCm5hbWVzcGFjZV9wYWNrYWdlcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZwpyZXF1aXJlcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfcmVxdWlyZW1lbnRzCnRvcF9sZXZlbC50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfdG9wbGV2ZWxfbmFtZXMKCltzZXR1cHRvb2xzLmluc3RhbGxhdGlvbl0KZWdnc2VjdXRhYmxlID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDpib290c3RyYXAKClBLAwQUAAAAAAAAACEA+9Yg9SUTAAAlEwAAQQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9tZXRhZGF0YS5qc29ueyJjbGFzc2lmaWVycyI6IFsiRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZSIsICJJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzIiwgIkxpY2Vuc2UgOjogT1NJIEFwcHJvdmVkIDo6IE1JVCBMaWNlbnNlIiwgIk9wZXJhdGluZyBTeXN0ZW0gOjogT1MgSW5kZXBlbmRlbnQiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4zIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjQiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNSIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy42IiwgIlRvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcyA6OiBQeXRob24gTW9kdWxlcyIsICJUb3BpYyA6OiBTeXN0ZW0gOjogQXJjaGl2aW5nIDo6IFBhY2thZ2luZyIsICJUb3BpYyA6OiBTeXN0ZW0gOjogU3lzdGVtcyBBZG1pbmlzdHJhdGlvbiIsICJUb3BpYyA6OiBVdGlsaXRpZXMiXSwgImRlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZSI6ICJ0ZXh0L3gtcnN0OyBjaGFyc2V0PVVURi04IiwgImV4dGVuc2lvbnMiOiB7InB5dGhvbi5jb21tYW5kcyI6IHsid3JhcF9jb25zb2xlIjogeyJlYXN5X2luc3RhbGwiOiAic2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDptYWluIiwgImVhc3lfaW5zdGFsbC0zLjYiOiAic2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDptYWluIn19LCAicHl0aG9uLmRldGFpbHMiOiB7ImNvbnRhY3RzIjogW3siZW1haWwiOiAiZGlzdHV0aWxzLXNpZ0BweXRob24ub3JnIiwgIm5hbWUiOiAiUHl0aG9uIFBhY2thZ2luZyBBdXRob3JpdHkiLCAicm9sZSI6ICJhdXRob3IifV0sICJkb2N1bWVudF9uYW1lcyI6IHsiZGVzY3JpcHRpb24iOiAiREVTQ1JJUFRJT04ucnN0IiwgImxpY2Vuc2UiOiAiTElDRU5TRS50eHQifSwgInByb2plY3RfdXJscyI6IHsiSG9tZSI6ICJodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzIn19LCAicHl0aG9uLmV4cG9ydHMiOiB7ImNvbnNvbGVfc2NyaXB0cyI6IHsiZWFzeV9pbnN0YWxsIjogInNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6bWFpbiIsICJlYXN5X2luc3RhbGwtMy42IjogInNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6bWFpbiJ9LCAiZGlzdHV0aWxzLmNvbW1hbmRzIjogeyJhbGlhcyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuYWxpYXM6YWxpYXMiLCAiYmRpc3RfZWdnIjogInNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9lZ2c6YmRpc3RfZWdnIiwgImJkaXN0X3JwbSI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3RfcnBtOmJkaXN0X3JwbSIsICJiZGlzdF93aW5pbnN0IjogInNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF93aW5pbnN0OmJkaXN0X3dpbmluc3QiLCAiYnVpbGRfY2xpYiI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfY2xpYjpidWlsZF9jbGliIiwgImJ1aWxkX2V4dCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfZXh0OmJ1aWxkX2V4dCIsICJidWlsZF9weSI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfcHk6YnVpbGRfcHkiLCAiZGV2ZWxvcCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZGV2ZWxvcDpkZXZlbG9wIiwgImRpc3RfaW5mbyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZGlzdF9pbmZvOmRpc3RfaW5mbyIsICJlYXN5X2luc3RhbGwiOiAic2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDplYXN5X2luc3RhbGwiLCAiZWdnX2luZm8iOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOmVnZ19pbmZvIiwgImluc3RhbGwiOiAic2V0dXB0b29scy5jb21tYW5kLmluc3RhbGw6aW5zdGFsbCIsICJpbnN0YWxsX2VnZ19pbmZvIjogInNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX2VnZ19pbmZvOmluc3RhbGxfZWdnX2luZm8iLCAiaW5zdGFsbF9saWIiOiAic2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfbGliOmluc3RhbGxfbGliIiwgImluc3RhbGxfc2NyaXB0cyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9zY3JpcHRzOmluc3RhbGxfc2NyaXB0cyIsICJyZWdpc3RlciI6ICJzZXR1cHRvb2xzLmNvbW1hbmQucmVnaXN0ZXI6cmVnaXN0ZXIiLCAicm90YXRlIjogInNldHVwdG9vbHMuY29tbWFuZC5yb3RhdGU6cm90YXRlIiwgInNhdmVvcHRzIjogInNldHVwdG9vbHMuY29tbWFuZC5zYXZlb3B0czpzYXZlb3B0cyIsICJzZGlzdCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3Q6c2Rpc3QiLCAic2V0b3B0IjogInNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQ6c2V0b3B0IiwgInRlc3QiOiAic2V0dXB0b29scy5jb21tYW5kLnRlc3Q6dGVzdCIsICJ1cGxvYWQiOiAic2V0dXB0b29scy5jb21tYW5kLnVwbG9hZDp1cGxvYWQiLCAidXBsb2FkX2RvY3MiOiAic2V0dXB0b29scy5jb21tYW5kLnVwbG9hZF9kb2NzOnVwbG9hZF9kb2NzIn0sICJkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHMiOiB7ImNvbnZlcnRfMnRvM19kb2N0ZXN0cyI6ICJzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0IiwgImRlcGVuZGVuY3lfbGlua3MiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdCIsICJlYWdlcl9yZXNvdXJjZXMiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdCIsICJlbnRyeV9wb2ludHMiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX2VudHJ5X3BvaW50cyIsICJleGNsdWRlX3BhY2thZ2VfZGF0YSI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZV9kYXRhIiwgImV4dHJhc19yZXF1aXJlIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19leHRyYXMiLCAiaW5jbHVkZV9wYWNrYWdlX2RhdGEiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9ib29sIiwgImluc3RhbGxfcmVxdWlyZXMiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cyIsICJuYW1lc3BhY2VfcGFja2FnZXMiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX25zcCIsICJwYWNrYWdlX2RhdGEiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VfZGF0YSIsICJwYWNrYWdlcyI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZXMiLCAicHl0aG9uX3JlcXVpcmVzIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19zcGVjaWZpZXIiLCAic2V0dXBfcmVxdWlyZXMiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cyIsICJ0ZXN0X2xvYWRlciI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfaW1wb3J0YWJsZSIsICJ0ZXN0X3J1bm5lciI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfaW1wb3J0YWJsZSIsICJ0ZXN0X3N1aXRlIjogInNldHVwdG9vbHMuZGlzdDpjaGVja190ZXN0X3N1aXRlIiwgInRlc3RzX3JlcXVpcmUiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cyIsICJ1c2VfMnRvMyI6ICJzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wiLCAidXNlXzJ0bzNfZXhjbHVkZV9maXhlcnMiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdCIsICJ1c2VfMnRvM19maXhlcnMiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdCIsICJ6aXBfc2FmZSI6ICJzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wifSwgImVnZ19pbmZvLndyaXRlcnMiOiB7IlBLRy1JTkZPIjogInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9wa2dfaW5mbyIsICJkZXBlbmRlbmN5X2xpbmtzLnR4dCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZyIsICJkZXBlbmRzLnR4dCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d2Fybl9kZXBlbmRzX29ic29sZXRlIiwgImVhZ2VyX3Jlc291cmNlcy50eHQiOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmciLCAiZW50cnlfcG9pbnRzLnR4dCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfZW50cmllcyIsICJuYW1lc3BhY2VfcGFja2FnZXMudHh0IjogInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnIiwgInJlcXVpcmVzLnR4dCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfcmVxdWlyZW1lbnRzIiwgInRvcF9sZXZlbC50eHQiOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3RvcGxldmVsX25hbWVzIn0sICJzZXR1cHRvb2xzLmluc3RhbGxhdGlvbiI6IHsiZWdnc2VjdXRhYmxlIjogInNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6Ym9vdHN0cmFwIn19fSwgImV4dHJhcyI6IFsiY2VydHMiLCAic3NsIl0sICJnZW5lcmF0b3IiOiAiYmRpc3Rfd2hlZWwgKDAuMzAuMCkiLCAia2V5d29yZHMiOiBbIkNQQU4iLCAiUHlQSSIsICJkaXN0dXRpbHMiLCAiZWdncyIsICJwYWNrYWdlIiwgIm1hbmFnZW1lbnQiXSwgIm1ldGFkYXRhX3ZlcnNpb24iOiAiMi4wIiwgIm5hbWUiOiAic2V0dXB0b29scyIsICJyZXF1aXJlc19weXRob24iOiAiPj0yLjcsIT0zLjAuKiwhPTMuMS4qLCE9My4yLioiLCAicnVuX3JlcXVpcmVzIjogW3siZXh0cmEiOiAiY2VydHMiLCAicmVxdWlyZXMiOiBbImNlcnRpZmkgKD09MjAxNi45LjI2KSJdfSwgeyJlbnZpcm9ubWVudCI6ICJzeXNfcGxhdGZvcm09PSd3aW4zMiciLCAiZXh0cmEiOiAic3NsIiwgInJlcXVpcmVzIjogWyJ3aW5jZXJ0c3RvcmUgKD09MC4yKSJdfV0sICJzdW1tYXJ5IjogIkVhc2lseSBkb3dubG9hZCwgYnVpbGQsIGluc3RhbGwsIHVwZ3JhZGUsIGFuZCB1bmluc3RhbGwgUHl0aG9uIHBhY2thZ2VzIiwgInZlcnNpb24iOiAiMzguMi40In1QSwMEFAAAAAAAAAAhADBcAZEmAAAAJgAAAEEAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vdG9wX2xldmVsLnR4dGVhc3lfaW5zdGFsbApwa2dfcmVzb3VyY2VzCnNldHVwdG9vbHMKUEsDBBQAAAAAAAAAIQCTBtcyAQAAAAEAAAA8AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL3ppcC1zYWZlClBLAwQUAAAAAAAAACEAIwtKA0QWAABEFgAALgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvX19pbml0X18ucHkiIiJFeHRlbnNpb25zIHRvIHRoZSAnZGlzdHV0aWxzJyBmb3IgbGFyZ2Ugb3IgY29tcGxleCBkaXN0cmlidXRpb25zIiIiCgppbXBvcnQgb3MKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgZGlzdHV0aWxzLmNvcmUKaW1wb3J0IGRpc3R1dGlscy5maWxlbGlzdApmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBmbm1hdGNoIGltcG9ydCBmbm1hdGNoY2FzZQoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGZpbHRlciwgbWFwCgppbXBvcnQgc2V0dXB0b29scy52ZXJzaW9uCmZyb20gc2V0dXB0b29scy5leHRlbnNpb24gaW1wb3J0IEV4dGVuc2lvbgpmcm9tIHNldHVwdG9vbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uLCBGZWF0dXJlCmZyb20gc2V0dXB0b29scy5kZXBlbmRzIGltcG9ydCBSZXF1aXJlCmZyb20gLiBpbXBvcnQgbW9ua2V5CgpfX2FsbF9fID0gWwogICAgJ3NldHVwJywgJ0Rpc3RyaWJ1dGlvbicsICdGZWF0dXJlJywgJ0NvbW1hbmQnLCAnRXh0ZW5zaW9uJywgJ1JlcXVpcmUnLAogICAgJ2ZpbmRfcGFja2FnZXMnLApdCgpfX3ZlcnNpb25fXyA9IHNldHVwdG9vbHMudmVyc2lvbi5fX3ZlcnNpb25fXwoKYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IE5vbmUKCiMgSWYgd2UgcnVuIDJ0bzMgb24gLnB5IGZpbGVzLCBzaG91bGQgd2UgYWxzbyBjb252ZXJ0IGRvY3N0cmluZ3M/CiMgRGVmYXVsdDogeWVzOyBhc3N1bWUgdGhhdCB3ZSBjYW4gZGV0ZWN0IGRvY3Rlc3RzIHJlbGlhYmx5CnJ1bl8ydG8zX29uX2RvY3Rlc3RzID0gVHJ1ZQojIFN0YW5kYXJkIHBhY2thZ2UgbmFtZXMgZm9yIGZpeGVyIHBhY2thZ2VzCmxpYjJ0bzNfZml4ZXJfcGFja2FnZXMgPSBbJ2xpYjJ0bzMuZml4ZXMnXQoKCmNsYXNzIFBhY2thZ2VGaW5kZXIob2JqZWN0KToKICAgICIiIgogICAgR2VuZXJhdGUgYSBsaXN0IG9mIGFsbCBQeXRob24gcGFja2FnZXMgZm91bmQgd2l0aGluIGEgZGlyZWN0b3J5CiAgICAiIiIKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmaW5kKGNscywgd2hlcmU9Jy4nLCBleGNsdWRlPSgpLCBpbmNsdWRlPSgnKicsKSk6CiAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBhbGwgUHl0aG9uIHBhY2thZ2VzIGZvdW5kIHdpdGhpbiBkaXJlY3RvcnkgJ3doZXJlJwoKICAgICAgICAnd2hlcmUnIGlzIHRoZSByb290IGRpcmVjdG9yeSB3aGljaCB3aWxsIGJlIHNlYXJjaGVkIGZvciBwYWNrYWdlcy4gIEl0CiAgICAgICAgc2hvdWxkIGJlIHN1cHBsaWVkIGFzIGEgImNyb3NzLXBsYXRmb3JtIiAoaS5lLiBVUkwtc3R5bGUpIHBhdGg7IGl0IHdpbGwKICAgICAgICBiZSBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGxvY2FsIHBhdGggc3ludGF4LgoKICAgICAgICAnZXhjbHVkZScgaXMgYSBzZXF1ZW5jZSBvZiBwYWNrYWdlIG5hbWVzIHRvIGV4Y2x1ZGU7ICcqJyBjYW4gYmUgdXNlZAogICAgICAgIGFzIGEgd2lsZGNhcmQgaW4gdGhlIG5hbWVzLCBzdWNoIHRoYXQgJ2Zvby4qJyB3aWxsIGV4Y2x1ZGUgYWxsCiAgICAgICAgc3VicGFja2FnZXMgb2YgJ2ZvbycgKGJ1dCBub3QgJ2ZvbycgaXRzZWxmKS4KCiAgICAgICAgJ2luY2x1ZGUnIGlzIGEgc2VxdWVuY2Ugb2YgcGFja2FnZSBuYW1lcyB0byBpbmNsdWRlLiAgSWYgaXQncwogICAgICAgIHNwZWNpZmllZCwgb25seSB0aGUgbmFtZWQgcGFja2FnZXMgd2lsbCBiZSBpbmNsdWRlZC4gIElmIGl0J3Mgbm90CiAgICAgICAgc3BlY2lmaWVkLCBhbGwgZm91bmQgcGFja2FnZXMgd2lsbCBiZSBpbmNsdWRlZC4gICdpbmNsdWRlJyBjYW4gY29udGFpbgogICAgICAgIHNoZWxsIHN0eWxlIHdpbGRjYXJkIHBhdHRlcm5zIGp1c3QgbGlrZSAnZXhjbHVkZScuCiAgICAgICAgIiIiCgogICAgICAgIHJldHVybiBsaXN0KGNscy5fZmluZF9wYWNrYWdlc19pdGVyKAogICAgICAgICAgICBjb252ZXJ0X3BhdGgod2hlcmUpLAogICAgICAgICAgICBjbHMuX2J1aWxkX2ZpbHRlcignZXpfc2V0dXAnLCAnKl9fcHljYWNoZV9fJywgKmV4Y2x1ZGUpLAogICAgICAgICAgICBjbHMuX2J1aWxkX2ZpbHRlcigqaW5jbHVkZSkpKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9maW5kX3BhY2thZ2VzX2l0ZXIoY2xzLCB3aGVyZSwgZXhjbHVkZSwgaW5jbHVkZSk6CiAgICAgICAgIiIiCiAgICAgICAgQWxsIHRoZSBwYWNrYWdlcyBmb3VuZCBpbiAnd2hlcmUnIHRoYXQgcGFzcyB0aGUgJ2luY2x1ZGUnIGZpbHRlciwgYnV0CiAgICAgICAgbm90IHRoZSAnZXhjbHVkZScgZmlsdGVyLgogICAgICAgICIiIgogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHdoZXJlLCBmb2xsb3dsaW5rcz1UcnVlKToKICAgICAgICAgICAgIyBDb3B5IGRpcnMgdG8gaXRlcmF0ZSBvdmVyIGl0LCB0aGVuIGVtcHR5IGRpcnMuCiAgICAgICAgICAgIGFsbF9kaXJzID0gZGlyc1s6XQogICAgICAgICAgICBkaXJzWzpdID0gW10KCiAgICAgICAgICAgIGZvciBkaXIgaW4gYWxsX2RpcnM6CiAgICAgICAgICAgICAgICBmdWxsX3BhdGggPSBvcy5wYXRoLmpvaW4ocm9vdCwgZGlyKQogICAgICAgICAgICAgICAgcmVsX3BhdGggPSBvcy5wYXRoLnJlbHBhdGgoZnVsbF9wYXRoLCB3aGVyZSkKICAgICAgICAgICAgICAgIHBhY2thZ2UgPSByZWxfcGF0aC5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLicpCgogICAgICAgICAgICAgICAgIyBTa2lwIGRpcmVjdG9yeSB0cmVlcyB0aGF0IGFyZSBub3QgdmFsaWQgcGFja2FnZXMKICAgICAgICAgICAgICAgIGlmICgnLicgaW4gZGlyIG9yIG5vdCBjbHMuX2xvb2tzX2xpa2VfcGFja2FnZShmdWxsX3BhdGgpKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICMgU2hvdWxkIHRoaXMgcGFja2FnZSBiZSBpbmNsdWRlZD8KICAgICAgICAgICAgICAgIGlmIGluY2x1ZGUocGFja2FnZSkgYW5kIG5vdCBleGNsdWRlKHBhY2thZ2UpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHBhY2thZ2UKCiAgICAgICAgICAgICAgICAjIEtlZXAgc2VhcmNoaW5nIHN1YmRpcmVjdG9yaWVzLCBhcyB0aGVyZSBtYXkgYmUgbW9yZSBwYWNrYWdlcwogICAgICAgICAgICAgICAgIyBkb3duIHRoZXJlLCBldmVuIGlmIHRoZSBwYXJlbnQgd2FzIGV4Y2x1ZGVkLgogICAgICAgICAgICAgICAgZGlycy5hcHBlbmQoZGlyKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfbG9va3NfbGlrZV9wYWNrYWdlKHBhdGgpOgogICAgICAgICIiIkRvZXMgYSBkaXJlY3RvcnkgbG9vayBsaWtlIGEgcGFja2FnZT8iIiIKICAgICAgICByZXR1cm4gb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKHBhdGgsICdfX2luaXRfXy5weScpKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfYnVpbGRfZmlsdGVyKCpwYXR0ZXJucyk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYSBsaXN0IG9mIHBhdHRlcm5zLCByZXR1cm4gYSBjYWxsYWJsZSB0aGF0IHdpbGwgYmUgdHJ1ZSBvbmx5IGlmCiAgICAgICAgdGhlIGlucHV0IG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBwYXR0ZXJucy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gbGFtYmRhIG5hbWU6IGFueShmbm1hdGNoY2FzZShuYW1lLCBwYXQ9cGF0KSBmb3IgcGF0IGluIHBhdHRlcm5zKQoKCmNsYXNzIFBFUDQyMFBhY2thZ2VGaW5kZXIoUGFja2FnZUZpbmRlcik6CiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2xvb2tzX2xpa2VfcGFja2FnZShwYXRoKToKICAgICAgICByZXR1cm4gVHJ1ZQoKCmZpbmRfcGFja2FnZXMgPSBQYWNrYWdlRmluZGVyLmZpbmQKCgpkZWYgX2luc3RhbGxfc2V0dXBfcmVxdWlyZXMoYXR0cnMpOgogICAgIyBOb3RlOiBkbyBub3QgdXNlIGBzZXR1cHRvb2xzLkRpc3RyaWJ1dGlvbmAgZGlyZWN0bHksIGFzCiAgICAjIG91ciBQRVAgNTE3IGJhY2tlbmQgcGF0Y2ggYGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbmAuCiAgICBkaXN0ID0gZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uKGRpY3QoCiAgICAgICAgKGssIHYpIGZvciBrLCB2IGluIGF0dHJzLml0ZW1zKCkKICAgICAgICBpZiBrIGluICgnZGVwZW5kZW5jeV9saW5rcycsICdzZXR1cF9yZXF1aXJlcycpCiAgICApKQogICAgIyBIb25vciBzZXR1cC5jZmcncyBvcHRpb25zLgogICAgZGlzdC5wYXJzZV9jb25maWdfZmlsZXMoaWdub3JlX29wdGlvbl9lcnJvcnM9VHJ1ZSkKICAgIGlmIGRpc3Quc2V0dXBfcmVxdWlyZXM6CiAgICAgICAgZGlzdC5mZXRjaF9idWlsZF9lZ2dzKGRpc3Quc2V0dXBfcmVxdWlyZXMpCgoKZGVmIHNldHVwKCoqYXR0cnMpOgogICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhbnkgcmVxdWlyZW1lbnRzIG5lZWRlZCB0byBpbnRlcnByZXQgJ2F0dHJzJy4KICAgIF9pbnN0YWxsX3NldHVwX3JlcXVpcmVzKGF0dHJzKQogICAgcmV0dXJuIGRpc3R1dGlscy5jb3JlLnNldHVwKCoqYXR0cnMpCgpzZXR1cC5fX2RvY19fID0gZGlzdHV0aWxzLmNvcmUuc2V0dXAuX19kb2NfXwoKCl9Db21tYW5kID0gbW9ua2V5LmdldF91bnBhdGNoZWQoZGlzdHV0aWxzLmNvcmUuQ29tbWFuZCkKCgpjbGFzcyBDb21tYW5kKF9Db21tYW5kKToKICAgIF9fZG9jX18gPSBfQ29tbWFuZC5fX2RvY19fCgogICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXN0LCAqKmt3KToKICAgICAgICAiIiIKICAgICAgICBDb25zdHJ1Y3QgdGhlIGNvbW1hbmQgZm9yIGRpc3QsIHVwZGF0aW5nCiAgICAgICAgdmFycyhzZWxmKSB3aXRoIGFueSBrZXl3b3JkIHBhcmFtZXRlcnMuCiAgICAgICAgIiIiCiAgICAgICAgX0NvbW1hbmQuX19pbml0X18oc2VsZiwgZGlzdCkKICAgICAgICB2YXJzKHNlbGYpLnVwZGF0ZShrdykKCiAgICBkZWYgcmVpbml0aWFsaXplX2NvbW1hbmQoc2VsZiwgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzPTAsICoqa3cpOgogICAgICAgIGNtZCA9IF9Db21tYW5kLnJlaW5pdGlhbGl6ZV9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIHJlaW5pdF9zdWJjb21tYW5kcykKICAgICAgICB2YXJzKGNtZCkudXBkYXRlKGt3KQogICAgICAgIHJldHVybiBjbWQKCgpkZWYgX2ZpbmRfYWxsX3NpbXBsZShwYXRoKToKICAgICIiIgogICAgRmluZCBhbGwgZmlsZXMgdW5kZXIgJ3BhdGgnCiAgICAiIiIKICAgIHJlc3VsdHMgPSAoCiAgICAgICAgb3MucGF0aC5qb2luKGJhc2UsIGZpbGUpCiAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCwgZm9sbG93bGlua3M9VHJ1ZSkKICAgICAgICBmb3IgZmlsZSBpbiBmaWxlcwogICAgKQogICAgcmV0dXJuIGZpbHRlcihvcy5wYXRoLmlzZmlsZSwgcmVzdWx0cykKCgpkZWYgZmluZGFsbChkaXI9b3MuY3VyZGlyKToKICAgICIiIgogICAgRmluZCBhbGwgZmlsZXMgdW5kZXIgJ2RpcicgYW5kIHJldHVybiB0aGUgbGlzdCBvZiBmdWxsIGZpbGVuYW1lcy4KICAgIFVubGVzcyBkaXIgaXMgJy4nLCByZXR1cm4gZnVsbCBmaWxlbmFtZXMgd2l0aCBkaXIgcHJlcGVuZGVkLgogICAgIiIiCiAgICBmaWxlcyA9IF9maW5kX2FsbF9zaW1wbGUoZGlyKQogICAgaWYgZGlyID09IG9zLmN1cmRpcjoKICAgICAgICBtYWtlX3JlbCA9IGZ1bmN0b29scy5wYXJ0aWFsKG9zLnBhdGgucmVscGF0aCwgc3RhcnQ9ZGlyKQogICAgICAgIGZpbGVzID0gbWFwKG1ha2VfcmVsLCBmaWxlcykKICAgIHJldHVybiBsaXN0KGZpbGVzKQoKCm1vbmtleS5wYXRjaF9hbGwoKQpQSwMEFAAAAAAAAAAhAKWHZVHAGQAAwBkAADIAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weSIiIlV0aWxpdGllcyBmb3IgZXh0cmFjdGluZyBjb21tb24gYXJjaGl2ZSBmb3JtYXRzIiIiCgppbXBvcnQgemlwZmlsZQppbXBvcnQgdGFyZmlsZQppbXBvcnQgb3MKaW1wb3J0IHNodXRpbAppbXBvcnQgcG9zaXhwYXRoCmltcG9ydCBjb250ZXh0bGliCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgZW5zdXJlX2RpcmVjdG9yeQoKX19hbGxfXyA9IFsKICAgICJ1bnBhY2tfYXJjaGl2ZSIsICJ1bnBhY2tfemlwZmlsZSIsICJ1bnBhY2tfdGFyZmlsZSIsICJkZWZhdWx0X2ZpbHRlciIsCiAgICAiVW5yZWNvZ25pemVkRm9ybWF0IiwgImV4dHJhY3Rpb25fZHJpdmVycyIsICJ1bnBhY2tfZGlyZWN0b3J5IiwKXQoKCmNsYXNzIFVucmVjb2duaXplZEZvcm1hdChEaXN0dXRpbHNFcnJvcik6CiAgICAiIiJDb3VsZG4ndCByZWNvZ25pemUgdGhlIGFyY2hpdmUgdHlwZSIiIgoKCmRlZiBkZWZhdWx0X2ZpbHRlcihzcmMsIGRzdCk6CiAgICAiIiJUaGUgZGVmYXVsdCBwcm9ncmVzcy9maWx0ZXIgY2FsbGJhY2s7IHJldHVybnMgVHJ1ZSBmb3IgYWxsIGZpbGVzIiIiCiAgICByZXR1cm4gZHN0CgoKZGVmIHVucGFja19hcmNoaXZlKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyPWRlZmF1bHRfZmlsdGVyLAogICAgICAgIGRyaXZlcnM9Tm9uZSk6CiAgICAiIiJVbnBhY2sgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgLCBvciByYWlzZSBgYFVucmVjb2duaXplZEZvcm1hdGBgCgogICAgYHByb2dyZXNzX2ZpbHRlcmAgaXMgYSBmdW5jdGlvbiB0YWtpbmcgdHdvIGFyZ3VtZW50czogYSBzb3VyY2UgcGF0aAogICAgaW50ZXJuYWwgdG8gdGhlIGFyY2hpdmUgKCcvJy1zZXBhcmF0ZWQpLCBhbmQgYSBmaWxlc3lzdGVtIHBhdGggd2hlcmUgaXQKICAgIHdpbGwgYmUgZXh0cmFjdGVkLiAgVGhlIGNhbGxiYWNrIG11c3QgcmV0dXJuIHRoZSBkZXNpcmVkIGV4dHJhY3QgcGF0aAogICAgKHdoaWNoIG1heSBiZSB0aGUgc2FtZSBhcyB0aGUgb25lIHBhc3NlZCBpbiksIG9yIGVsc2UgYGBOb25lYGAgdG8gc2tpcAogICAgdGhhdCBmaWxlIG9yIGRpcmVjdG9yeS4gIFRoZSBjYWxsYmFjayBjYW4gdGh1cyBiZSB1c2VkIHRvIHJlcG9ydCBvbiB0aGUKICAgIHByb2dyZXNzIG9mIHRoZSBleHRyYWN0aW9uLCBhcyB3ZWxsIGFzIHRvIGZpbHRlciB0aGUgaXRlbXMgZXh0cmFjdGVkIG9yCiAgICBhbHRlciB0aGVpciBleHRyYWN0aW9uIHBhdGhzLgoKICAgIGBkcml2ZXJzYCwgaWYgc3VwcGxpZWQsIG11c3QgYmUgYSBub24tZW1wdHkgc2VxdWVuY2Ugb2YgZnVuY3Rpb25zIHdpdGggdGhlCiAgICBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIGZ1bmN0aW9uIChtaW51cyB0aGUgYGRyaXZlcnNgIGFyZ3VtZW50KSwgdGhhdCByYWlzZQogICAgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiB0aGV5IGRvIG5vdCBzdXBwb3J0IGV4dHJhY3RpbmcgdGhlIGRlc2lnbmF0ZWQKICAgIGFyY2hpdmUgdHlwZS4gIFRoZSBgZHJpdmVyc2AgYXJlIHRyaWVkIGluIHNlcXVlbmNlIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0CiAgICBkb2VzIG5vdCByYWlzZSBhbiBlcnJvciwgb3IgdW50aWwgYWxsIGFyZSBleGhhdXN0ZWQgKGluIHdoaWNoIGNhc2UKICAgIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaXMgcmFpc2VkKS4gIElmIHlvdSBkbyBub3Qgc3VwcGx5IGEgc2VxdWVuY2Ugb2YKICAgIGRyaXZlcnMsIHRoZSBtb2R1bGUncyBgYGV4dHJhY3Rpb25fZHJpdmVyc2BgIGNvbnN0YW50IHdpbGwgYmUgdXNlZCwgd2hpY2gKICAgIG1lYW5zIHRoYXQgYGB1bnBhY2tfemlwZmlsZWBgIGFuZCBgYHVucGFja190YXJmaWxlYGAgd2lsbCBiZSB0cmllZCwgaW4gdGhhdAogICAgb3JkZXIuCiAgICAiIiIKICAgIGZvciBkcml2ZXIgaW4gZHJpdmVycyBvciBleHRyYWN0aW9uX2RyaXZlcnM6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkcml2ZXIoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXIpCiAgICAgICAgZXhjZXB0IFVucmVjb2duaXplZEZvcm1hdDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4KICAgIGVsc2U6CiAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KAogICAgICAgICAgICAiTm90IGEgcmVjb2duaXplZCBhcmNoaXZlIHR5cGU6ICVzIiAlIGZpbGVuYW1lCiAgICAgICAgKQoKCmRlZiB1bnBhY2tfZGlyZWN0b3J5KGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyPWRlZmF1bHRfZmlsdGVyKToKICAgICIiIiJVbnBhY2siIGEgZGlyZWN0b3J5LCB1c2luZyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgZm9yIGFyY2hpdmVzCgogICAgUmFpc2VzIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgYGZpbGVuYW1lYCBpcyBub3QgYSBkaXJlY3RvcnkKICAgICIiIgogICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgogICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgiJXMgaXMgbm90IGEgZGlyZWN0b3J5IiAlIGZpbGVuYW1lKQoKICAgIHBhdGhzID0gewogICAgICAgIGZpbGVuYW1lOiAoJycsIGV4dHJhY3RfZGlyKSwKICAgIH0KICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGZpbGVuYW1lKToKICAgICAgICBzcmMsIGRzdCA9IHBhdGhzW2Jhc2VdCiAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgcGF0aHNbb3MucGF0aC5qb2luKGJhc2UsIGQpXSA9IHNyYyArIGQgKyAnLycsIG9zLnBhdGguam9pbihkc3QsIGQpCiAgICAgICAgZm9yIGYgaW4gZmlsZXM6CiAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihkc3QsIGYpCiAgICAgICAgICAgIHRhcmdldCA9IHByb2dyZXNzX2ZpbHRlcihzcmMgKyBmLCB0YXJnZXQpCiAgICAgICAgICAgIGlmIG5vdCB0YXJnZXQ6CiAgICAgICAgICAgICAgICAjIHNraXAgbm9uLWZpbGVzCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgZiA9IG9zLnBhdGguam9pbihiYXNlLCBmKQogICAgICAgICAgICBzaHV0aWwuY29weWZpbGUoZiwgdGFyZ2V0KQogICAgICAgICAgICBzaHV0aWwuY29weXN0YXQoZiwgdGFyZ2V0KQoKCmRlZiB1bnBhY2tfemlwZmlsZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlcik6CiAgICAiIiJVbnBhY2sgemlwIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYAoKICAgIFJhaXNlcyBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIGBmaWxlbmFtZWAgaXMgbm90IGEgemlwZmlsZSAoYXMgZGV0ZXJtaW5lZAogICAgYnkgYGB6aXBmaWxlLmlzX3ppcGZpbGUoKWBgKS4gIFNlZSBgYHVucGFja19hcmNoaXZlKClgYCBmb3IgYW4gZXhwbGFuYXRpb24KICAgIG9mIHRoZSBgcHJvZ3Jlc3NfZmlsdGVyYCBhcmd1bWVudC4KICAgICIiIgoKICAgIGlmIG5vdCB6aXBmaWxlLmlzX3ppcGZpbGUoZmlsZW5hbWUpOgogICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgiJXMgaXMgbm90IGEgemlwIGZpbGUiICUgKGZpbGVuYW1lLCkpCgogICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZmlsZW5hbWUpIGFzIHo6CiAgICAgICAgZm9yIGluZm8gaW4gei5pbmZvbGlzdCgpOgogICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQoKICAgICAgICAgICAgIyBkb24ndCBleHRyYWN0IGFic29sdXRlIHBhdGhzIG9yIG9uZXMgd2l0aCAuLiBpbiB0aGVtCiAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnLycpIG9yICcuLicgaW4gbmFtZS5zcGxpdCgnLycpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihleHRyYWN0X2RpciwgKm5hbWUuc3BsaXQoJy8nKSkKICAgICAgICAgICAgdGFyZ2V0ID0gcHJvZ3Jlc3NfZmlsdGVyKG5hbWUsIHRhcmdldCkKICAgICAgICAgICAgaWYgbm90IHRhcmdldDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy8nKToKICAgICAgICAgICAgICAgICMgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgZmlsZQogICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgICAgICBkYXRhID0gei5yZWFkKGluZm8uZmlsZW5hbWUpCiAgICAgICAgICAgICAgICB3aXRoIG9wZW4odGFyZ2V0LCAnd2InKSBhcyBmOgogICAgICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKICAgICAgICAgICAgdW5peF9hdHRyaWJ1dGVzID0gaW5mby5leHRlcm5hbF9hdHRyID4+IDE2CiAgICAgICAgICAgIGlmIHVuaXhfYXR0cmlidXRlczoKICAgICAgICAgICAgICAgIG9zLmNobW9kKHRhcmdldCwgdW5peF9hdHRyaWJ1dGVzKQoKCmRlZiB1bnBhY2tfdGFyZmlsZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlcik6CiAgICAiIiJVbnBhY2sgdGFyL3Rhci5nei90YXIuYnoyIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYAoKICAgIFJhaXNlcyBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIGBmaWxlbmFtZWAgaXMgbm90IGEgdGFyZmlsZSAoYXMgZGV0ZXJtaW5lZAogICAgYnkgYGB0YXJmaWxlLm9wZW4oKWBgKS4gIFNlZSBgYHVucGFja19hcmNoaXZlKClgYCBmb3IgYW4gZXhwbGFuYXRpb24KICAgIG9mIHRoZSBgcHJvZ3Jlc3NfZmlsdGVyYCBhcmd1bWVudC4KICAgICIiIgogICAgdHJ5OgogICAgICAgIHRhcm9iaiA9IHRhcmZpbGUub3BlbihmaWxlbmFtZSkKICAgIGV4Y2VwdCB0YXJmaWxlLlRhckVycm9yOgogICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkIHRhciBmaWxlIiAlIChmaWxlbmFtZSwpCiAgICAgICAgKQogICAgd2l0aCBjb250ZXh0bGliLmNsb3NpbmcodGFyb2JqKToKICAgICAgICAjIGRvbid0IGRvIGFueSBjaG93bmluZyEKICAgICAgICB0YXJvYmouY2hvd24gPSBsYW1iZGEgKmFyZ3M6IE5vbmUKICAgICAgICBmb3IgbWVtYmVyIGluIHRhcm9iajoKICAgICAgICAgICAgbmFtZSA9IG1lbWJlci5uYW1lCiAgICAgICAgICAgICMgZG9uJ3QgZXh0cmFjdCBhYnNvbHV0ZSBwYXRocyBvciBvbmVzIHdpdGggLi4gaW4gdGhlbQogICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCcvJykgYW5kICcuLicgbm90IGluIG5hbWUuc3BsaXQoJy8nKToKICAgICAgICAgICAgICAgIHByZWxpbV9kc3QgPSBvcy5wYXRoLmpvaW4oZXh0cmFjdF9kaXIsICpuYW1lLnNwbGl0KCcvJykpCgogICAgICAgICAgICAgICAgIyByZXNvbHZlIGFueSBsaW5rcyBhbmQgdG8gZXh0cmFjdCB0aGUgbGluayB0YXJnZXRzIGFzIG5vcm1hbAogICAgICAgICAgICAgICAgIyBmaWxlcwogICAgICAgICAgICAgICAgd2hpbGUgbWVtYmVyIGlzIG5vdCBOb25lIGFuZCAobWVtYmVyLmlzbG5rKCkgb3IgbWVtYmVyLmlzc3ltKCkpOgogICAgICAgICAgICAgICAgICAgIGxpbmtwYXRoID0gbWVtYmVyLmxpbmtuYW1lCiAgICAgICAgICAgICAgICAgICAgaWYgbWVtYmVyLmlzc3ltKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSBwb3NpeHBhdGguZGlybmFtZShtZW1iZXIubmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgbGlua3BhdGggPSBwb3NpeHBhdGguam9pbihiYXNlLCBsaW5rcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgbGlua3BhdGggPSBwb3NpeHBhdGgubm9ybXBhdGgobGlua3BhdGgpCiAgICAgICAgICAgICAgICAgICAgbWVtYmVyID0gdGFyb2JqLl9nZXRtZW1iZXIobGlua3BhdGgpCgogICAgICAgICAgICAgICAgaWYgbWVtYmVyIGlzIG5vdCBOb25lIGFuZCAobWVtYmVyLmlzZmlsZSgpIG9yIG1lbWJlci5pc2RpcigpKToKICAgICAgICAgICAgICAgICAgICBmaW5hbF9kc3QgPSBwcm9ncmVzc19maWx0ZXIobmFtZSwgcHJlbGltX2RzdCkKICAgICAgICAgICAgICAgICAgICBpZiBmaW5hbF9kc3Q6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpbmFsX2RzdC5lbmRzd2l0aChvcy5zZXApOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfZHN0ID0gZmluYWxfZHN0WzotMV0KICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFggVWdoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJvYmouX2V4dHJhY3RfbWVtYmVyKG1lbWJlciwgZmluYWxfZHN0KQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgdGFyZmlsZS5FeHRyYWN0RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNob3duL2NobW9kL21rZmlmby9ta25vZGUvbWFrZWRldiBmYWlsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gVHJ1ZQoKCmV4dHJhY3Rpb25fZHJpdmVycyA9IHVucGFja19kaXJlY3RvcnksIHVucGFja196aXBmaWxlLCB1bnBhY2tfdGFyZmlsZQpQSwMEFAAAAAAAAAAhAB/iPRwnFgAAJxYAADAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2J1aWxkX21ldGEucHkiIiJBIFBFUCA1MTcgaW50ZXJmYWNlIHRvIHNldHVwdG9vbHMKClByZXZpb3VzbHksIHdoZW4gYSB1c2VyIG9yIGEgY29tbWFuZCBsaW5lIHRvb2wgKGxldCdzIGNhbGwgaXQgYSAiZnJvbnRlbmQiKQpuZWVkZWQgdG8gbWFrZSBhIHJlcXVlc3Qgb2Ygc2V0dXB0b29scyB0byB0YWtlIGEgY2VydGFpbiBhY3Rpb24sIGZvcgpleGFtcGxlLCBnZW5lcmF0aW5nIGEgbGlzdCBvZiBpbnN0YWxsYXRpb24gcmVxdWlyZW1lbnRzLCB0aGUgZnJvbnRlbmQgd291bGQKd291bGQgY2FsbCAic2V0dXAucHkgZWdnX2luZm8iIG9yICJzZXR1cC5weSBiZGlzdF93aGVlbCIgb24gdGhlIGNvbW1hbmQgbGluZS4KClBFUCA1MTcgZGVmaW5lcyBhIGRpZmZlcmVudCBtZXRob2Qgb2YgaW50ZXJmYWNpbmcgd2l0aCBzZXR1cHRvb2xzLiBSYXRoZXIKdGhhbiBjYWxsaW5nICJzZXR1cC5weSIgZGlyZWN0bHksIHRoZSBmcm9udGVuZCBzaG91bGQ6CgogIDEuIFNldCB0aGUgY3VycmVudCBkaXJlY3RvcnkgdG8gdGhlIGRpcmVjdG9yeSB3aXRoIGEgc2V0dXAucHkgZmlsZQogIDIuIEltcG9ydCB0aGlzIG1vZHVsZSBpbnRvIGEgc2FmZSBweXRob24gaW50ZXJwcmV0ZXIgKG9uZSBpbiB3aGljaAogICAgIHNldHVwdG9vbHMgY2FuIHBvdGVudGlhbGx5IHNldCBnbG9iYWwgdmFyaWFibGVzIG9yIGNyYXNoIGhhcmQpLgogIDMuIENhbGwgb25lIG9mIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBpbiBQRVAgNTE3LgoKV2hhdCBlYWNoIGZ1bmN0aW9uIGRvZXMgaXMgZGVmaW5lZCBpbiBQRVAgNTE3LiBIb3dldmVyLCBoZXJlIGlzIGEgImNhc3VhbCIKZGVmaW5pdGlvbiBvZiB0aGUgZnVuY3Rpb25zICh0aGlzIGRlZmluaXRpb24gc2hvdWxkIG5vdCBiZSByZWxpZWQgb24gZm9yCmJ1ZyByZXBvcnRzIG9yIEFQSSBzdGFiaWxpdHkpOgoKICAtIGBidWlsZF93aGVlbGA6IGJ1aWxkIGEgd2hlZWwgaW4gdGhlIGZvbGRlciBhbmQgcmV0dXJuIHRoZSBiYXNlbmFtZQogIC0gYGdldF9yZXF1aXJlc19mb3JfYnVpbGRfd2hlZWxgOiBnZXQgdGhlIGBzZXR1cF9yZXF1aXJlc2AgdG8gYnVpbGQKICAtIGBwcmVwYXJlX21ldGFkYXRhX2Zvcl9idWlsZF93aGVlbGA6IGdldCB0aGUgYGluc3RhbGxfcmVxdWlyZXNgCiAgLSBgYnVpbGRfc2Rpc3RgOiBidWlsZCBhbiBzZGlzdCBpbiB0aGUgZm9sZGVyIGFuZCByZXR1cm4gdGhlIGJhc2VuYW1lCiAgLSBgZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF9zZGlzdGA6IGdldCB0aGUgYHNldHVwX3JlcXVpcmVzYCB0byBidWlsZAoKQWdhaW4sIHRoaXMgaXMgbm90IGEgZm9ybWFsIGRlZmluaXRpb24hIEp1c3QgYSAidGFzdGUiIG9mIHRoZSBtb2R1bGUuCiIiIgoKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHRva2VuaXplCmltcG9ydCBzaHV0aWwKaW1wb3J0IGNvbnRleHRsaWIKCmltcG9ydCBzZXR1cHRvb2xzCmltcG9ydCBkaXN0dXRpbHMKCgpjbGFzcyBTZXR1cFJlcXVpcmVtZW50c0Vycm9yKEJhc2VFeGNlcHRpb24pOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWNpZmllcnMpOgogICAgICAgIHNlbGYuc3BlY2lmaWVycyA9IHNwZWNpZmllcnMKCgpjbGFzcyBEaXN0cmlidXRpb24oc2V0dXB0b29scy5kaXN0LkRpc3RyaWJ1dGlvbik6CiAgICBkZWYgZmV0Y2hfYnVpbGRfZWdncyhzZWxmLCBzcGVjaWZpZXJzKToKICAgICAgICByYWlzZSBTZXR1cFJlcXVpcmVtZW50c0Vycm9yKHNwZWNpZmllcnMpCgogICAgQGNsYXNzbWV0aG9kCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIHBhdGNoKGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVwbGFjZQogICAgICAgIGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbiB3aXRoIHRoaXMgY2xhc3MKICAgICAgICBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgY29udGV4dC4KICAgICAgICAiIiIKICAgICAgICBvcmlnID0gZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uCiAgICAgICAgZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uID0gY2xzCiAgICAgICAgdHJ5OgogICAgICAgICAgICB5aWVsZAogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbiA9IG9yaWcKCgpkZWYgX3J1bl9zZXR1cChzZXR1cF9zY3JpcHQ9J3NldHVwLnB5Jyk6CiAgICAjIE5vdGUgdGhhdCB3ZSBjYW4gcmV1c2Ugb3VyIGJ1aWxkIGRpcmVjdG9yeSBiZXR3ZWVuIGNhbGxzCiAgICAjIENvcnJlY3RuZXNzIGNvbWVzIGZpcnN0LCB0aGVuIG9wdGltaXphdGlvbiBsYXRlcgogICAgX19maWxlX18gPSBzZXR1cF9zY3JpcHQKICAgIF9fbmFtZV9fID0gJ19fbWFpbl9fJwogICAgZiA9IGdldGF0dHIodG9rZW5pemUsICdvcGVuJywgb3BlbikoX19maWxlX18pCiAgICBjb2RlID0gZi5yZWFkKCkucmVwbGFjZSgnXFxyXFxuJywgJ1xcbicpCiAgICBmLmNsb3NlKCkKICAgIGV4ZWMoY29tcGlsZShjb2RlLCBfX2ZpbGVfXywgJ2V4ZWMnKSwgbG9jYWxzKCkpCgoKZGVmIF9maXhfY29uZmlnKGNvbmZpZ19zZXR0aW5ncyk6CiAgICBjb25maWdfc2V0dGluZ3MgPSBjb25maWdfc2V0dGluZ3Mgb3Ige30KICAgIGNvbmZpZ19zZXR0aW5ncy5zZXRkZWZhdWx0KCctLWdsb2JhbC1vcHRpb24nLCBbXSkKICAgIHJldHVybiBjb25maWdfc2V0dGluZ3MKCgpkZWYgX2dldF9idWlsZF9yZXF1aXJlcyhjb25maWdfc2V0dGluZ3MpOgogICAgY29uZmlnX3NldHRpbmdzID0gX2ZpeF9jb25maWcoY29uZmlnX3NldHRpbmdzKQogICAgcmVxdWlyZW1lbnRzID0gWydzZXR1cHRvb2xzJywgJ3doZWVsJ10KCiAgICBzeXMuYXJndiA9IHN5cy5hcmd2WzoxXSArIFsnZWdnX2luZm8nXSArIFwKICAgICAgICBjb25maWdfc2V0dGluZ3NbIi0tZ2xvYmFsLW9wdGlvbiJdCiAgICB0cnk6CiAgICAgICAgd2l0aCBEaXN0cmlidXRpb24ucGF0Y2goKToKICAgICAgICAgICAgX3J1bl9zZXR1cCgpCiAgICBleGNlcHQgU2V0dXBSZXF1aXJlbWVudHNFcnJvciBhcyBlOgogICAgICAgIHJlcXVpcmVtZW50cyArPSBlLnNwZWNpZmllcnMKCiAgICByZXR1cm4gcmVxdWlyZW1lbnRzCgoKZGVmIF9nZXRfaW1tZWRpYXRlX3N1YmRpcmVjdG9yaWVzKGFfZGlyKToKICAgIHJldHVybiBbbmFtZSBmb3IgbmFtZSBpbiBvcy5saXN0ZGlyKGFfZGlyKQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihhX2RpciwgbmFtZSkpXQoKCmRlZiBnZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3doZWVsKGNvbmZpZ19zZXR0aW5ncz1Ob25lKToKICAgIGNvbmZpZ19zZXR0aW5ncyA9IF9maXhfY29uZmlnKGNvbmZpZ19zZXR0aW5ncykKICAgIHJldHVybiBfZ2V0X2J1aWxkX3JlcXVpcmVzKGNvbmZpZ19zZXR0aW5ncykKCgpkZWYgZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF9zZGlzdChjb25maWdfc2V0dGluZ3M9Tm9uZSk6CiAgICBjb25maWdfc2V0dGluZ3MgPSBfZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCiAgICByZXR1cm4gX2dldF9idWlsZF9yZXF1aXJlcyhjb25maWdfc2V0dGluZ3MpCgoKZGVmIHByZXBhcmVfbWV0YWRhdGFfZm9yX2J1aWxkX3doZWVsKG1ldGFkYXRhX2RpcmVjdG9yeSwgY29uZmlnX3NldHRpbmdzPU5vbmUpOgogICAgc3lzLmFyZ3YgPSBzeXMuYXJndls6MV0gKyBbJ2Rpc3RfaW5mbycsICctLWVnZy1iYXNlJywgbWV0YWRhdGFfZGlyZWN0b3J5XQogICAgX3J1bl9zZXR1cCgpCiAgICAKICAgIGRpc3RfaW5mb19kaXJlY3RvcnkgPSBtZXRhZGF0YV9kaXJlY3RvcnkKICAgIHdoaWxlIFRydWU6ICAgIAogICAgICAgIGRpc3RfaW5mb3MgPSBbZiBmb3IgZiBpbiBvcy5saXN0ZGlyKGRpc3RfaW5mb19kaXJlY3RvcnkpCiAgICAgICAgICAgICAgICAgICAgICBpZiBmLmVuZHN3aXRoKCcuZGlzdC1pbmZvJyldCgogICAgICAgIGlmIGxlbihkaXN0X2luZm9zKSA9PSAwIGFuZCBcCiAgICAgICAgICAgICAgICBsZW4oX2dldF9pbW1lZGlhdGVfc3ViZGlyZWN0b3JpZXMoZGlzdF9pbmZvX2RpcmVjdG9yeSkpID09IDE6CiAgICAgICAgICAgIGRpc3RfaW5mb19kaXJlY3RvcnkgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICBkaXN0X2luZm9fZGlyZWN0b3J5LCBvcy5saXN0ZGlyKGRpc3RfaW5mb19kaXJlY3RvcnkpWzBdKQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBhc3NlcnQgbGVuKGRpc3RfaW5mb3MpID09IDEKICAgICAgICBicmVhawoKICAgICMgUEVQIDUxNyByZXF1aXJlcyB0aGF0IHRoZSAuZGlzdC1pbmZvIGRpcmVjdG9yeSBiZSBwbGFjZWQgaW4gdGhlCiAgICAjIG1ldGFkYXRhX2RpcmVjdG9yeS4gVG8gY29tcGx5LCB3ZSBNVVNUIGNvcHkgdGhlIGRpcmVjdG9yeSB0byB0aGUgcm9vdAogICAgaWYgZGlzdF9pbmZvX2RpcmVjdG9yeSAhPSBtZXRhZGF0YV9kaXJlY3Rvcnk6CiAgICAgICAgc2h1dGlsLm1vdmUoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihkaXN0X2luZm9fZGlyZWN0b3J5LCBkaXN0X2luZm9zWzBdKSwKICAgICAgICAgICAgbWV0YWRhdGFfZGlyZWN0b3J5KQogICAgICAgIHNodXRpbC5ybXRyZWUoZGlzdF9pbmZvX2RpcmVjdG9yeSwgaWdub3JlX2Vycm9ycz1UcnVlKQoKICAgIHJldHVybiBkaXN0X2luZm9zWzBdCgoKZGVmIGJ1aWxkX3doZWVsKHdoZWVsX2RpcmVjdG9yeSwgY29uZmlnX3NldHRpbmdzPU5vbmUsCiAgICAgICAgICAgICAgICBtZXRhZGF0YV9kaXJlY3Rvcnk9Tm9uZSk6CiAgICBjb25maWdfc2V0dGluZ3MgPSBfZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCiAgICB3aGVlbF9kaXJlY3RvcnkgPSBvcy5wYXRoLmFic3BhdGgod2hlZWxfZGlyZWN0b3J5KQogICAgc3lzLmFyZ3YgPSBzeXMuYXJndls6MV0gKyBbJ2JkaXN0X3doZWVsJ10gKyBcCiAgICAgICAgY29uZmlnX3NldHRpbmdzWyItLWdsb2JhbC1vcHRpb24iXQogICAgX3J1bl9zZXR1cCgpCiAgICBpZiB3aGVlbF9kaXJlY3RvcnkgIT0gJ2Rpc3QnOgogICAgICAgIHNodXRpbC5ybXRyZWUod2hlZWxfZGlyZWN0b3J5KQogICAgICAgIHNodXRpbC5jb3B5dHJlZSgnZGlzdCcsIHdoZWVsX2RpcmVjdG9yeSkKCiAgICB3aGVlbHMgPSBbZiBmb3IgZiBpbiBvcy5saXN0ZGlyKHdoZWVsX2RpcmVjdG9yeSkKICAgICAgICAgICAgICBpZiBmLmVuZHN3aXRoKCcud2hsJyldCgogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIHJldHVybiB3aGVlbHNbMF0KCgpkZWYgYnVpbGRfc2Rpc3Qoc2Rpc3RfZGlyZWN0b3J5LCBjb25maWdfc2V0dGluZ3M9Tm9uZSk6CiAgICBjb25maWdfc2V0dGluZ3MgPSBfZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCiAgICBzZGlzdF9kaXJlY3RvcnkgPSBvcy5wYXRoLmFic3BhdGgoc2Rpc3RfZGlyZWN0b3J5KQogICAgc3lzLmFyZ3YgPSBzeXMuYXJndls6MV0gKyBbJ3NkaXN0J10gKyBcCiAgICAgICAgY29uZmlnX3NldHRpbmdzWyItLWdsb2JhbC1vcHRpb24iXQogICAgX3J1bl9zZXR1cCgpCiAgICBpZiBzZGlzdF9kaXJlY3RvcnkgIT0gJ2Rpc3QnOgogICAgICAgIHNodXRpbC5ybXRyZWUoc2Rpc3RfZGlyZWN0b3J5KQogICAgICAgIHNodXRpbC5jb3B5dHJlZSgnZGlzdCcsIHNkaXN0X2RpcmVjdG9yeSkKCiAgICBzZGlzdHMgPSBbZiBmb3IgZiBpbiBvcy5saXN0ZGlyKHNkaXN0X2RpcmVjdG9yeSkKICAgICAgICAgICAgICBpZiBmLmVuZHN3aXRoKCcudGFyLmd6JyldCgogICAgYXNzZXJ0IGxlbihzZGlzdHMpID09IDEKICAgIHJldHVybiBzZGlzdHNbMF0KUEsDBBQAAAAAAAAAIQD1hnppAAABAAAAAQAtAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jbGktMzIuZXhlTVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAA4f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QCSAD4Vn////M8k72Q+EXf///4oTiY3Y/f//iY3g/f//iY28/f//iJXv/f//hNIPhB8KAABDg73Y/f//AImdxP3//w+MCwoAAIrCLCA8WHcRD77CD76AWOJAAIPgDzP26wQz9jPAD76EwXjiQABqB8H4BFmJhZT9//87wQ+HrQkAAP8khd8yQACDjej9////ibWQ/f//ibXA/f//ibXM/f//ibXQ/f//ibXw/f//ibXI/f//6XYJAAAPvsKD6CB0SoPoA3Q2g+gIdCVISHQVg+gDD4VXCQAAg43w/f//COlLCQAAg43w/f//BOk/CQAAg43w/f//AekzCQAAgY3w/f//gAAAAOkkCQAAg43w/f//AukYCQAAgPoqdSyDxwSJvdz9//+Lf/w7/om9zP3//w+N+QgAAION8P3//wT3ncz9///p5wgAAIuFzP3//2vACg++yo1ECNCJhcz9///pzAgAAIm16P3//+nBCAAAgPoqdSaDxwSJvdz9//+Lf/w7/om96P3//w+NoggAAION6P3////plggAAIuF6P3//2vACg++yo1ECNCJhej9///pewgAAID6SXRVgPpodESA+mx0GID6dw+FYwgAAIGN8P3//wAIAADpVAgAAIA7bHUWQ4GN8P3//wAQAACJncT9///pOQgAAION8P3//xDpLQgAAION8P3//yDpIQgAAIoDPDZ1HYB7ATR1F0NDgY3w/f//AIAAAImdxP3//+n+BwAAPDN1HYB7ATJ1F0NDgaXw/f///3///4mdxP3//+ndBwAAPGQPhNUHAAA8aQ+EzQcAADxvD4TFBwAAPHUPhL0HAAA8eA+EtQcAADxYD4StBwAAibWU/f//jYWk/f//UA+2wlCJtcj9///opDwAAFmFwIqF7/3//1l0IouNtP3//4212P3//+ik+///igNDiZ3E/f//hMAPhKT8//+LjbT9//+Ntdj9///ogvv//+lNBwAAD77Cg/hkD4/oAQAAD4R5AgAAg/hTD4/yAAAAD4SAAAAAg+hBdBBISHRYSEh0CEhID4WSBQAAgMIgx4WQ/f//AQAAAIiV7/3//4ON8P3//0A5tej9//+NnfT9//+4AAIAAImd5P3//4mFoP3//w+NSAIAAMeF6P3//wYAAADppQIAAPeF8P3//zAIAAAPhZgAAACBjfD9//8ACAAA6YkAAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJvdz9//+Lf/yJveT9//8PhLEEAAA7/nULoZQSQQCJheT9//+LheT9///Hhcj9//8BAAAA6X8EAACD6FgPhNoCAABISHR5K8EPhCf///9ISA+FngQAAIPHBPeF8P3//xAIAACJvdz9//90MA+3R/xQaAACAACNhfT9//9QjYXg/f//UOjnOgAAg8QQhcB0H8eFwP3//wEAAADrE4pH/IiF9P3//8eF4P3//wEAAACNhfT9//+JheT9///pNQQAAIsHg8cEib3c/f//O8Z0O4tIBDvOdDT3hfD9//8ACAAAD78AiY3k/f//dBSZK8LR+MeFyP3//wEAAADp8AMAAIm1yP3//+nlAwAAoZASQQCJheT9//9Q6F44AABZ6c4DAACD+HAPj/sBAAAPhOMBAACD+GUPjLwDAACD+GcPjjT+//+D+Gl0cYP4bnQog/hvD4WgAwAA9oXw/f//gMeF4P3//wgAAAB0YYGN8P3//wACAADrVYs3g8cEib3c/f//6Nc3AACFwA+EL/r///aF8P3//yB0DGaLhdj9//9miQbrCIuF2P3//4kGx4XA/f//AQAAAOmmBAAAg43w/f//QMeF4P3//woAAACLjfD9///3wQCAAAAPhKkBAACLB4tXBIPHCOnVAQAAdRGA+md1ZceF6P3//wEAAADrWTmF6P3//34GiYXo/f//gb3o/f//owAAAH4/i7Xo/f//gcZdAQAAVugeCwAAipXv/f//WYmFvP3//4XAdBCJheT9//+JtaD9//+L2OsKx4Xo/f//owAAADP2iweDxwiJhYj9//+LR/yJhYz9//+NhaT9//9Q/7WQ/f//D77C/7Xo/f//ib3c/f//UP+1oP3//42FiP3//1NQ/zVYHEEA6D0gAABZ/9CLvfD9//+DxByB54AAAAB0IDm16P3//3UYjYWk/f//UFP/NWQcQQDoDiAAAFn/0FlZgL3v/f//Z3UcO/51GI2FpP3//1BT/zVgHEEA6OkfAABZ/9BZWYA7LXURgY3w/f//AAEAAEOJneT9//9T6QP+///Hhej9//8IAAAAiY24/f//6ySD6HMPhLb8//9ISA+Eif7//4PoAw+FtgEAAMeFuP3//ycAAAD2hfD9//+Ax4Xg/f//EAAAAA+Eaf7//4qFuP3//wRRxoXU/f//MIiF1f3//8eF0P3//wIAAADpRf7///fBABAAAA+FS/7//4PHBPbBIHQYib3c/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om93P3///bBQHQbO9Z/F3wEO8ZzEffYg9IA99qBjfD9//8AAQAA94Xw/f//AJAAAIvai/h1AjPbg73o/f//AH0Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LxwvDdQYhhdD9//+NdfOLhej9////jej9//+FwH8Gi8cLw3Qti4Xg/f//mVJQU1fogDcAAIPBMIP5OYmdoP3//4v4i9p+BgONuP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF4P3//4m15P3//3RhhcB0B4vOgDkwdFb/jeT9//+LjeT9///GATBA6z5JZjkwdAZAQDvOdfQrheT9///R+OsoO/51C6GQEkEAiYXk/f//i4Xk/f//6wdJgDgAdAVAO8519SuF5P3//4mF4P3//4O9wP3//wAPhVwBAACLhfD9//+oQHQyqQABAAB0CcaF1P3//y3rGKgBdAnGhdT9//8r6wuoAnQRxoXU/f//IMeF0P3//wEAAACLncz9//8rneD9//8rndD9///2hfD9//8MdRf/tbT9//+Nhdj9//9TaiDocPX//4PEDP+10P3//4u9tP3//42F2P3//42N1P3//+h29f//9oXw/f//CFl0G/aF8P3//wR1EldTajCNhdj9///oLvX//4PEDIO9yP3//wCLheD9//90ZoXAfmKLteT9//+JhaD9//8Ptwb/jaD9//9QagaNRfRQjYWY/f//RlBG6IE1AACDxBCFwHUoOYWY/f//dCD/tZj9//+Nhdj9//+NTfTo8fT//4O9oP3//wBZdbXrHION2P3////rE4uN5P3//1CNhdj9///oyvT//1mDvdj9//8AfBv2hfD9//8EdBJXU2ogjYXY/f//6IL0//+DxAyDvbz9//8AdBP/tbz9///oBAgAAIOlvP3//wBZi53E/f//igOIhe/9//+EwHQTi42U/f//i73c/f//itDp4fX//4C9sP3//wB0CouFrP3//4NgcP2Lhdj9//+LTfxfXjPNW+gG7P//ycOQ6ipAAOsoQAAbKUAAeSlA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AwAAiw6KE/+FOOX//4hUDzSLDolEDzjpDgMAADPJiwYDx/ZABIAPhL8CAACLhTTl//+JjUDl//+E2w+FygAAAImFPOX//zlNEA+GIAMAAOsGi7Uo5f//i4085f//g6VE5f//ACuNNOX//42FSOX//ztNEHM5i5U85f///4U85f//ihJBgPoKdRD/hTDl///GAA1A/4VE5f//iBBA/4VE5f//gb1E5f///xMAAHLCi9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EQgIAAIuFLOX//wGFOOX//zvDD4w6AgAAi4U85f//K4U05f//O0UQD4JM////6SACAACJhUTl//+A+wIPhdEAAAA5TRAPhk0CAADrBou1KOX//4uNROX//4OlPOX//wArjTTl//+NhUjl//87TRBzRouVROX//4OFROX//wIPtxJBQWaD+gp1FoOFMOX//wJqDVtmiRhAQIOFPOX//wKDhTzl//8CZokQQECBvTzl///+EwAAcrWL2I2FSOX//yvYagCNhSzl//9QU42FSOX//1CLBv80B/8VmOBAAIXAD4RiAQAAi4Us5f//AYU45f//O8MPjFoBAACLhUTl//8rhTTl//87RRAPgj/////pQAEAADlNEA+GfAEAAIuNROX//4OlPOX//wArjTTl//9qAo2FSPn//147TRBzPIuVROX//w+3EgG1ROX//wPOZoP6CnUOag1bZokYA8YBtTzl//8BtTzl//9miRADxoG9POX//6gGAAByvzP2VlZoVQ0AAI2N8Ov//1GNjUj5//8rwZkrwtH4UIvBUFZo6f0AAP8VsOBAAIvYO94PhJcAAABqAI2FLOX//1CLwyvGUI2ENfDr//9Qi4Uo5f//iwD/NAf/FZjgQACFwHQMA7Us5f//O95/y+sM/xVc4EAAiYVA5f//O95/XIuFROX//yuFNOX//4mFOOX//ztFEA+CCv///+s/agCNjSzl//9R/3UQ/7U05f///zD/FZjgQACFwHQVi4Us5f//g6VA5f//AImFOOX//+sM/xVc4EAAiYVA5f//g7045f//AHVsg71A5f//AHQtagVeObVA5f//dRToFrf//8cACQAAAOget///iTDrP/+1QOX//+git///Wesxi7Uo5f//iwb2RAcEQHQPi4U05f//gDgadQQzwOsk6Na2///HABwAAADo3rb//4MgAIPI/+sMi4U45f//K4Uw5f//X1uLTfwzzV7oaJ7//8nDahBo6PdAAOjotv//i0UIg/j+dRvoorb//4MgAOiHtv//xwAJAAAAg8j/6Z0AAAAz/zvHfAg7BZAqQQByIeh5tv//iTjoX7b//8cACQAAAFdXV1dX6Oe1//+DxBTryYvIwfkFjRyNoCpBAIvwg+YfweYGiwsPvkwxBIPhAXS/UOg5JAAAWYl9/IsD9kQwBAF0Fv91EP91DP91COgu+P//g8QMiUXk6xbo/LX//8cACQAAAOgEtv//iTiDTeT/x0X8/v///+gJAAAAi0Xk6Gi2///D/3UI6IMkAABZw2oQaAj4QADoDLb//4tFCIP4/nUT6LO1///HAAkAAACDyP/pqgAAADPbO8N8CDsFkCpBAHIa6JK1///HAAkAAABTU1NTU+gatf//g8QU69CLyMH5BY08jaAqQQCL8IPmH8HmBosPD75MDgSD4QF0xlDobCMAAFmJXfyLB/ZEBgQBdDH/dQjo4CIAAFlQ/xXk4EAAhcB1C/8VXOBAAIlF5OsDiV3kOV3kdBnoMbX//4tN5IkI6BS1///HAAkAAACDTeT/x0X8/v///+gJAAAAi0Xk6Ie1///D/3UI6KIjAABZw4v/VYvsg+wQUzPbOV0IdRzo1rT//1NTU1NTxwAWAAAA6F60//+DxBQzwOtqVot1DDvzdRrosrT//1NTU1NTxwAWAAAA6Dq0//+DxBTrBTl1CHIEM8DrPv91EI1N8OhWnP//i030jUb/OVkIdBxIOUUIdwoPthD2RAodBHXwi84ryIPhASvxTovGOF38dAeLTfiDYXD9XlvJw4v/VYvsagD/dQz/dQjoVf///4PEDF3Di/9Vi+yD7BRTM9tWi3UIOV0UdRA783UQOV0MdRAzwOnnAQAAO/N0BTldDHce6Am0//9qFl5TU1NTU4kw6JKz//+DxBSLxunAAQAAOV0UdQSIHuvJV4t9EDv7dR6IHujYs///ahZeU1NTU1OJMOhhs///g8QU6SgBAAD/dRiNTezog5v//4tF8DlYCHUV/3UUV/91DFboowoAAIPEEOlMAQAAg30U/4tVDIvGdQ+KD4gIQEc6y3QfSnXz6xqKD4gIQEc6y3QISnQF/00Ude45XRR1A4gYQDvTD4XIAAAAOB90BoN9FAF1NY14/4l9/Dv+ch6NRexQi0X8D7YAUOgwv///WVmFwHQI/038OXX8c+KLxytF/KgBD4XDAAAAg30U/3Vai0UMg/gBdjqNfAb+iX0UO/5yIY1F7FCLRRQPtgBQ6Oy+//9ZWYXAdAj/TRQ5dRRz4otFDIvPK00U9sEBdASIH+sEiFwG/zhd+HQHi0X0g2Bw/WpQWOmNAAAAiB7ot7L//2oiXlNTU1NTiTDoQLL//4PEFDhd+HQHi0X0g2Bw/YvG62SLyCvOg/kCfE2NeP6JfRQ7/nIejUXsUItFFA+2AFDoab7//1lZhcB0CP9NFDl1FHPii8crRRSoAXQciB/oVLL//4vIaipYiQE4Xfh0F4tN9INhcP3rDjhd+HQHi0X0g2Bw/TPAX15bycOL/1WL7ItFCIXAdBKD6AiBON3dAAB1B1DoeLX//1ldw4v/VYvsg+wUoYASQQAzxYlF/FNWM9tXi/E5HYQpQQB1OFNTM/9HV2hk6kAAaAABAABT/xXw4EAAhcB0CIk9hClBAOsV/xVc4EAAg/h4dQrHBYQpQQACAAAAOV0UfiKLTRSLRRBJOBh0CEA7y3X2g8n/i0UUK8FIO0UUfQFAiUUUoYQpQQCD+AIPhKwBAAA7ww+EpAEAAIP4AQ+FzAEAAIld+DldIHUIiwaLQASJRSCLNezgQAAzwDldJFNT/3UUD5XA/3UQjQTFAQAAAFD/dSD/1ov4O/sPhI8BAAB+Q2rgM9JY9/eD+AJyN41EPwg9AAQAAHcT6I4jAACLxDvDdBzHAMzMAADrEVDoDOT//1k7w3QJxwDd3QAAg8AIiUX06wOJXfQ5XfQPhD4BAABX/3X0/3UU/3UQagH/dSD/1oXAD4TjAAAAizXw4EAAU1NX/3X0/3UM/3UI/9aLyIlN+DvLD4TCAAAA90UMAAQAAHQpOV0cD4SwAAAAO00cD4+nAAAA/3Uc/3UYV/919P91DP91CP/W6ZAAAAA7y35FauAz0lj38YP4AnI5jUQJCD0ABAAAdxbozyIAAIv0O/N0ascGzMwAAIPGCOsaUOhK4///WTvDdAnHAN3dAACDwAiL8OsCM/Y783RB/3X4Vlf/dfT/dQz/dQj/FfDgQACFwHQiU1M5XRx1BFNT6wb/dRz/dRj/dfhWU/91IP8VsOBAAIlF+FbouP3//1n/dfTor/3//4tF+FnpWQEAAIld9Ild8DldCHUIiwaLQBSJRQg5XSB1CIsGi0AEiUUg/3UI6CAgAABZiUXsg/j/dQczwOkhAQAAO0UgD4TbAAAAU1ONTRRR/3UQUP91IOg+IAAAg8QYiUX0O8N01Is16OBAAFNT/3UUUP91DP91CP/WiUX4O8N1BzP26bcAAAB+PYP44Hc4g8AIPQAEAAB3Fui5IQAAi/w7+3TdxwfMzAAAg8cI6xpQ6DTi//9ZO8N0CccA3d0AAIPACIv46wIz/zv7dLT/dfhTV+jAkv//g8QM/3X4V/91FP919P91DP91CP/WiUX4O8N1BDP26yX/dRyNRfj/dRhQV/91IP917OiNHwAAi/CJdfCDxBj33hv2I3X4V+iN/P//Wesa/3Uc/3UY/3UU/3UQ/3UM/3UI/xXo4EAAi/A5XfR0Cf919Oj4sf//WYtF8DvDdAw5RRh0B1Do5bH//1mLxo1l4F9eW4tN/DPN6CeW///Jw4v/VYvsg+wQ/3UIjU3w6CGW////dSiNTfD/dST/dSD/dRz/dRj/dRT/dRD/dQzoKPz//4PEIIB9/AB0B4tN+INhcP3Jw4v/VYvsUVGhgBJBADPFiUX8oYgpQQBTVjPbV4v5O8N1Oo1F+FAz9kZWaGTqQABW/xX44EAAhcB0CIk1iClBAOs0/xVc4EAAg/h4dQpqAlijiClBAOsFoYgpQQCD+AIPhM8AAAA7ww+ExwAAAIP4AQ+F6AAAAIld+DldGHUIiweLQASJRRiLNezgQAAzwDldIFNT/3UQD5XA/3UMjQTFAQAAAFD/dRj/1ov4O/sPhKsAAAB+PIH/8P//f3c0jUQ/CD0ABAAAdxPo0h8AAIvEO8N0HMcAzMwAAOsRUOhQ4P//WTvDdAnHAN3dAACDwAiL2IXbdGmNBD9QagBT6N6Q//+DxAxXU/91EP91DGoB/3UY/9aFwHQR/3UUUFP/dQj/FfjgQACJRfhT6Mn6//+LRfhZ63Uz9jldHHUIiweLQBSJRRw5XRh1CIsHi0AEiUUY/3Uc6EEdAABZg/j/dQQzwOtHO0UYdB5TU41NEFH/dQxQ/3UY6GkdAACL8IPEGDvzdNyJdQz/dRT/dRD/dQz/dQj/dRz/FfTgQACL+DvzdAdW6Oav//9Zi8eNZexfXluLTfwzzegolP//ycOL/1WL7IPsEP91CI1N8OgilP///3UkjU3w/3Ug/3Uc/3UY/3UU/3UQ/3UM6Bb+//+DxByAffwAdAeLTfiDYXD9ycOL/1WL7FaLdQiF9g+EgQEAAP92BOh2r////3YI6G6v////dgzoZq////92EOher////3YU6Fav////dhjoTq////826Eev////diDoP6////92JOg3r////3Yo6C+v////dizoJ6////92MOgfr////3Y06Bev////dhzoD6////92OOgHr////3Y86P+u//+DxED/dkDo9K7///92ROjsrv///3ZI6OSu////dkzo3K7///92UOjUrv///3ZU6Myu////dljoxK7///92XOi8rv///3Zg6LSu////dmTorK7///92aOikrv///3Zs6Jyu////dnDolK7///92dOiMrv///3Z46ISu////dnzofK7//4PEQP+2gAAAAOhurv///7aEAAAA6GOu////togAAADoWK7///+2jAAAAOhNrv///7aQAAAA6EKu////tpQAAADoN67///+2mAAAAOgsrv///7acAAAA6CGu////tqAAAADoFq7///+2pAAAAOgLrv///7aoAAAA6ACu//+DxCxeXcOL/1WL7FaLdQiF9nQ1iwY7BUgdQQB0B1Do3a3//1mLRgQ7BUwdQQB0B1Doy63//1mLdgg7NVAdQQB0B1boua3//1leXcOL/1WL7FaLdQiF9nR+i0YMOwVUHUEAdAdQ6Jet//9Zi0YQOwVYHUEAdAdQ6IWt//9Zi0YUOwVcHUEAdAdQ6HOt//9Zi0YYOwVgHUEAdAdQ6GGt//9Zi0YcOwVkHUEAdAdQ6E+t//9Zi0YgOwVoHUEAdAdQ6D2t//9Zi3YkOzVsHUEAdAdW6Cut//9ZXl3Di/9Vi+yLRQhTM9tWVzvDdAeLfQw7+3cb6KGp//9qFl6JMFNTU1NT6Cqp//+DxBSLxus8i3UQO/N1BIgY69qL0DgadARCT3X4O/t07ooOiApCRjrLdANPdfM7+3UQiBjoWqn//2oiWYkIi/HrtTPAX15bXcPMzMzMzMxVi+xWM8BQUFBQUFBQUItVDI1JAIoCCsB0CYPCAQ+rBCTr8Yt1CIPJ/41JAIPBAYoGCsB0CYPGAQ+jBCRz7ovBg8QgXsnDi/9Vi+xTVot1CDPbVzldFHUQO/N1EDldDHUSM8BfXltdwzvzdAeLfQw7+3cb6Myo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IHRvIGNyZWF0ZSBwcm9jZXNzLgoAACAlcwAlcwAAQ291bGQgbm90IGV4ZWMgJXMAAABDYW5ub3QgZmluZCBQeXRob24gZXhlY3V0YWJsZSAlcwoAAAAjIXB5dGhvbi5leGUAAAAAIyEAAENhbm5vdCBvcGVuICVzCgAtc2NyaXB0LnB5AABDb3JFeGl0UHJvY2VzcwAAbQBzAGMAbwByAGUAZQAuAGQAbABsAAAAKABuAHUAbABsACkAAAAAAChudWxsKQAAAAAAAAYAAAYAAQAAEAADBgAGAhAERUVFBQUFBQU1MABQAAAAACggOFBYBwgANzAwV1AHAAAgIAgAAAAACGBoYGBgYAAAeHB4eHh4CAcIAAAHAAgICAAACAAIAAcIAAAAqCFBAAAiQQAAAAAAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+fwA9AAAARW5jb2RlUG9pbnRlcgAAAEsARQBSAE4ARQBMADMAMgAuAEQATABMAAAAAABEZWNvZGVQb2ludGVyAAAARmxzRnJlZQBGbHNTZXRWYWx1ZQBGbHNHZXRWYWx1ZQBGbHNBbGxvYwAAAABydW50aW1lIGVycm9yIAAADQoAAFRMT1NTIGVycm9yDQoAAABTSU5HIGVycm9yDQoAAAAARE9NQUlOIGVycm9yDQoAAFI2MDM0DQpBbiBhcHBsaWNhdGlvbiBoYXMgbWFkZSBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGluY29ycmVjdGx5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAAAAAABSNjAzMw0KLSBBdHRlbXB0IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAFI2MDE4DQotIHVuZXhwZWN0ZWQgaGVhcCBlcnJvcg0KAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNw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YXkAAAAARnJpZGF5AABUaHVyc2RheQAAAABXZWRuZXNkYXkAAABUdWVzZGF5AE1vbmRheQAAU3VuZGF5AABTYXQARnJpAFRodQBXZWQAVHVlAE1vbgBTdW4AR2V0UHJvY2Vzc1dpbmRvd1N0YXRpb24AR2V0VXNlck9iamVjdEluZm9ybWF0aW9uQQAAAEdldExhc3RBY3RpdmVQb3B1cAAAR2V0QWN0aXZlV2luZG93AE1lc3NhZ2VCb3hBAFVTRVIzMi5ETEwAAFN1bk1vblR1ZVdlZFRodUZyaVNhdAAAAEphbkZlYk1hckFwck1heUp1bkp1bEF1Z1NlcE9jdE5vdkRlYwAAAABDT05PVVQkAC5jb20AAAAALmV4ZQAAAAAuYmF0AAAAAC5jbWQAAAAALlwAAFN5c3RlbVJvb3QAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEkEA0PRAAAMAAADQNwAAIGkAABCZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAANcYQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAvCNAAAAAAAD+////AAAAAMz///8AAAAA/v///6klQAC9JUAAAAAAAP7///8AAAAAjP///wAAAAD+////PDVAAEA1QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA4zpAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAACxO0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAADs9QAAAAAAAAAAAAAc9QAD+////AAAAANT///8AAAAA/v///wAAAADAPkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAPM/QAAAAAAA/v///wAAAADU////AAAAAP7///8dQUAAOUFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAAtR0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAPtKQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAa05AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAACtUEAA/v///wAAAAC8UEAA/v///wAAAADY////AAAAAP7///8AAAAAb1JAAP7///8AAAAAe1JAAP7///8AAAAA1P///wAAAAD+////AAAAADVZQAAAAAAA/v///wAAAADY////AAAAAP7////bWkAA71pAAAAAAAD+////AAAAANj///8AAAAA/v///y1bQAAxW0AAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAAIheQAAAAAAA/v///wAAAADQ////AAAAAP7///8YX0AAL19AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAApakAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAADpsQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAPnlAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABOgUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAC+CQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAJJVAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAC9l0AAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAFShQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAy6VAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAACRp0AAAAAAAAAAAADNpkAA/v///wAAAADQ////AAAAAP7///8AAAAATK5AAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABowkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAAvKQABU+QAAAAAAAAAAAAAOAAEAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlPoAALD6AADG+gAA3PoAAO76AAAG+wAAHPsAADT7AABM+wAAYPsAAGj7AAB6+wAAiPsAAJr7AACs+wAAvPsAAMr7AADc+wAA9PsAAAj8AAAc/AAAOPwAAFb8AABq/AAAevwAAIb8AACS/AAAnvwAALb8AADO/AAA2PwAAOT8AAD2/AAABP0AABD9AAAe/QAAKP0AADj9AABO/QAAWv0AAGr9AACS/QAArP0AAMT9AADe/QAA9P0AAA7+AAAc/gAAKv4AAET+AABU/gAAav4AAIT+AACQ/gAAnv4AAK7+AAC+/gAA0P4AAOT+AAD0/gAACv8AABr/AAAs/wAAPv8AAFD/AABi/wAAbv8AAHz/AACM/wAAov8AALL/AADC/wAA0P8AAOL/AAD0/wAAHAABACgAAQA4AAEASgABAAAAAABSAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAxgFHZXRFeGl0Q29kZVByb2Nlc3MAAG4EV2FpdEZvclNpbmdsZU9iamVjdACVAENyZWF0ZVByb2Nlc3NBAACvA1NldENvbnNvbGVDdHJsSGFuZGxlcgD1AUdldE1vZHVsZUZpbGVOYW1lQQAA2gBFbnRlckNyaXRpY2FsU2VjdGlvbgAA9AJMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA+gFHZXRNb2R1bGVIYW5kbGVXAAArBFNsZWVwACICR2V0UHJvY0FkZHJlc3MAAAUBRXhpdFByb2Nlc3MAcAFHZXRDb21tYW5kTGluZUEA8ANTZXRIYW5kbGVDb3VudAAAPgJHZXRTdGRIYW5kbGUAANgBR2V0RmlsZVR5cGUAPAJHZXRTdGFydHVwSW5mb0EAvwBEZWxldGVDcml0aWNhbFNlY3Rpb24ANwRUZXJtaW5hdGVQcm9jZXNzAACqAUdldEN1cnJlbnRQcm9jZXNzAEgEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAfBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgDWAklzRGVidWdnZXJQcmVzZW50AOcBR2V0TGFzdEVycm9yAACmAkhlYXBGcmVlAACiAkhlYXBBbGxvYwBcAUdldENQSW5mbwDFAkludGVybG9ja2VkSW5jcmVtZW50AADBAkludGVybG9ja2VkRGVjcmVtZW50AABTAUdldEFDUAAAFAJHZXRPRU1DUAAA4AJJc1ZhbGlkQ29kZVBhZ2UAPgRUbHNHZXRWYWx1ZQA8BFRsc0FsbG9jAAA/BFRsc1NldFZhbHVlAD0EVGxzRnJlZQD0A1NldExhc3RFcnJvcgAArgFHZXRDdXJyZW50VGhyZWFkSWQAAJcEV3JpdGVGaWxlAPYCTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQASwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDAAUdldEVudmlyb25tZW50U3RyaW5ncwBMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIQEV2lkZUNoYXJUb011bHRpQnl0ZQDCAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKQCSGVhcENyZWF0ZQAAYQRWaXJ0dWFsRnJlZQBZA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACrAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCaA1J0bFVud2luZACpAkhlYXBSZUFsbG9jAF4EVmlydHVhbEFsbG9jAACEAUdldENvbnNvbGVDUAAAlgFHZXRDb25zb2xlTW9kZQAAQgFGbHVzaEZpbGVCdWZmZXJzAADmAkxDTWFwU3RyaW5nQQAAHwNNdWx0aUJ5dGVUb1dpZGVDaGFyAOgCTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdldExvY2FsZUluZm9BAADnA1NldEZpbGVQb2ludGVyAACrAkhlYXBTaXplAABEAENsb3NlSGFuZGxlAIwEV3JpdGVDb25zb2xlQQCaAUdldENvbnNvbGVPdXRwdXRDUAAAlgRXcml0ZUNvbnNvbGVXAAYEU2V0U3RkSGFuZGxlAAB5AENyZWF0ZUZpbGVBAFMAQ29tcGFyZVN0cmluZ0EAAFYAQ29tcGFyZVN0cmluZ1cAANgDU2V0RW52aXJvbm1lbnRWYXJpYWJsZUEAS0VSTkVMMzIuZGxsAABuA1JlYWRGaWxlAADVA1NldEVuZE9mRmlsZQAAJgJHZXRQcm9jZXNzSGVhcAAAygFHZXRGaWxlQXR0cmlidXRlc0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCtBAAAAAADAK0EAAQEAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE7mQLuxGb9E6iNAAAEAAABs4kAAXOJAAP////+ACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAAAGAAAAFgAAAIAAAAAKAAAAgQAAAAoAAACCAAAACQAAAIMAAAAWAAAAhAAAAA0AAACRAAAAKQAAAJ4AAAANAAAAoQAAAAIAAACkAAAACwAAAKcAAAANAAAAtwAAABEAAADOAAAAAgAAANcAAAALAAAAGAcAAAwAAAAMAAAACAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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ABAAAwYABgIQBEVFRQUFBQUFNTAAUAAAAAAoIDhQWAcIADcwMFdQBwAAICAIAAAAAAhgaGBgYGAAAHhweHh4eAgHCAAABwAICAgAAAgACAAHCAAAAAAAAAAQOAFAAQAAALA4AUABAAAAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+fwA9AAAAAAAAAHJ1bnRpbWUgZXJyb3IgAAANCgAAAAAAAFRMT1NTIGVycm9yDQoAAABTSU5HIGVycm9yDQoAAAAARE9NQUlOIGVycm9yDQoAAFI2MDM0DQpBbiBhcHBsaWNhdGlvbiBoYXMgbWFkZSBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGluY29ycmVjdGx5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAAAAAABSNjAzMw0KLSBBdHRlbXB0IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAAAAAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAAAAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoAAAAAAAAAAAAAAAAADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAAAAAABSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAAAAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG5vdCBsb2FkZWQNCgAAAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBSdW50aW1lIExpYnJhcnkAAAAACgoAAC4uLgA8cHJvZ3JhbSBuYW1lIHVua25vd24+AABSdW50aW1lIEVycm9yIQoKUHJvZ3JhbTogAAAAAAAAAAUAAMALAAAAAAAAAAAAAAAdAADABAAAAAAAAAAAAAAAlgAAwAQAAAAAAAAAAAAAAI0AAMAIAAAAAAAAAAAAAACOAADACAAAAAAAAAAAAAAAjwAAwAgAAAAAAAAAAAAAAJAAAMAIAAAAAAAAAAAAAACRAADACAAAAAAAAAAAAAAAkgAAwAgAAAAAAAAAAAAAAJMAAMAIAAAAAAAAAAAAAAAGgICGgIGAAAAQA4aAhoKAFAUFRUVFhYWFBQAAMDCAUICIAAgAKCc4UFeAAAcANzAwUFCIAAAAICiAiICAAAAAYGhgaGhoCAgHeHBwd3BwCAgAAAgACAAHCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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cmxFdmVudAAAxwFHZXRFeGl0Q29kZVByb2Nlc3MAAHIEV2FpdEZvclNpbmdsZU9iamVjdACWAENyZWF0ZVByb2Nlc3NBAAC0A1NldENvbnNvbGVDdHJsSGFuZGxlcgD1AUdldE1vZHVsZUZpbGVOYW1lQQAA2wBFbnRlckNyaXRpY2FsU2VjdGlvbgAA7gJMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA+gFHZXRNb2R1bGVIYW5kbGVXAAAvBFNsZWVwACICR2V0UHJvY0FkZHJlc3MAAAYBRXhpdFByb2Nlc3MAcQFHZXRDb21tYW5kTGluZUEAngNSdGxVbndpbmRFeAD0A1NldEhhbmRsZUNvdW50AAA+AkdldFN0ZEhhbmRsZQAA2QFHZXRGaWxlVHlwZQA8AkdldFN0YXJ0dXBJbmZvQQDAAERlbGV0ZUNyaXRpY2FsU2VjdGlvbgA7BFRlcm1pbmF0ZVByb2Nlc3MAAKsBR2V0Q3VycmVudFByb2Nlc3MATARVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAACMEU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANACSXNEZWJ1Z2dlclByZXNlbnQAnwNSdGxWaXJ0dWFsVW53aW5kAACYA1J0bExvb2t1cEZ1bmN0aW9uRW50cnkAAJEDUnRsQ2FwdHVyZUNvbnRleHQA5wFHZXRMYXN0RXJyb3IAAKYCSGVhcEZyZWUAAKICSGVhcEFsbG9jAF0BR2V0Q1BJbmZvAFQBR2V0QUNQAAAUAkdldE9FTUNQAADaAklzVmFsaWRDb2RlUGFnZQDXAEVuY29kZVBvaW50ZXIAuQBEZWNvZGVQb2ludGVyAEABRmxzR2V0VmFsdWUAQQFGbHNTZXRWYWx1ZQA/AUZsc0ZyZWUA+ANTZXRMYXN0RXJyb3IAAK8BR2V0Q3VycmVudFRocmVhZElkAAA+AUZsc0FsbG9jAACbBFdyaXRlRmlsZQDwAkxvYWRMaWJyYXJ5QQAAugJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AEwBRnJlZUVudmlyb25tZW50U3RyaW5nc0EAwQFHZXRFbnZpcm9ubWVudFN0cmluZ3MATQFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwCIBFdpZGVDaGFyVG9NdWx0aUJ5dGUAwwFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACqAkhlYXBTZXRJbmZvcm1hdGlvbgAApAJIZWFwQ3JlYXRlAABTA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACsAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCpAkhlYXBSZUFsbG9jAIUBR2V0Q29uc29sZUNQAACXAUdldENvbnNvbGVNb2RlAABDAUZsdXNoRmlsZUJ1ZmZlcnMAAOACTENNYXBTdHJpbmdBAAAZA011bHRpQnl0ZVRvV2lkZUNoYXIA4gJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5mb0EAAOwDU2V0RmlsZVBvaW50ZXIAAKsCSGVhcFNpemUAAEQAQ2xvc2VIYW5kbGUAkARXcml0ZUNvbnNvbGVBAJsBR2V0Q29uc29sZU91dHB1dENQAACaBFdyaXRlQ29uc29sZVcACgRTZXRTdGRIYW5kbGUAAHoAQ3JlYXRlRmlsZUEAUwBDb21wYXJlU3RyaW5nQQAAVgBDb21wYXJlU3RyaW5nVwAA3QNTZXRFbnZpcm9ubWVudFZhcmlhYmxlQQBLRVJORUwzMi5kbGwAAGgDUmVhZEZpbGUAANoDU2V0RW5kT2ZGaWxlAAAmAkdldFByb2Nlc3NIZWFwAADLAUdldEZpbGVBdHRyaWJ1dGVzQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4EUBQAEAAAAAAAAAAAAAAOBFAUABAAAAAQEAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMqLfLZkrAADNXSDSZtT//0wpAEABAAAAAQAAAAAAAAAA9ABAAQAAAPDzAEABAAAA//////////+ACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEAAABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAAbQAAACAAAABwAAAAHAAAAHIAAAAJAAAABgAAABYAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADXAAAACwAAABgHAAAMAAAADAAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AIBNAAA8TgAA9AkBADxOAADMTgAAlAcBAMxOAABDUQAAGAoBAERRAAA8UwAANAoBADxTAABkUwAADAgBAGRTAADeVAAAeBABACBWAAB3VgAApAcBAHhWAADtVgAAZAoBAAxXAAAxVwAADAgBADRXAADmVwAAhAoBAOhXAABsWAAAKA4BAGxYAACQWAAApAcBAJBYAADFWQAAuAoBAMhZAABJWgAApAcBAExaAABVWwAA7AoBAFhbAADlXAAA/AoBAOhcAAANXwAAEAsBABBfAABTXwAADAgBAFRfAACWXwAApAcBAJhfAACdYAAAJAsBAKBgAAC3YAAADAgBALhgAADwYAAAKA4BAPBgAAAoYQAAKA4BAChhAABeYQAAKA4BAOBhAAAhYgAAXAsBACRiAABHYgAAfAsBAEhiAABkYgAADAgBAGhiAAA2ZAAAYAkBAGRkAADVZgAAnAsBAPBmAAAlZwAAzAsBADBnAABiZwAApAcBAGRnAAClZwAADAgBAKhnAADAZwAADAgBAMBnAADvaAAArAkBAPBoAAC/agAA7AsBAMBqAAC2awAACAwBALhrAABqbQAAGAwBAGxtAAC4bQAAMAwBALhtAABrbgAAOAwBAIBuAACkbgAASAwBAORuAABTbwAAUAwBAFRvAACZbwAAlAcBAJxvAADjbwAAlAcBAMBwAADQcgAAWAwBANByAADkcgAAUAwBAOxyAACicwAAeBABAKRzAAB3dAAAeBABAHh0AAASdQAAaAwBABR1AACddQAAoAkBAKB1AAAWdgAAeAwBABh2AAB2fQAAnAwBAHh9AACpfgAAwAwBAKx+AAC/fwAA8AwBAMB/AAB6gAAAGA0BAISAAAArgwAAJA0BACyDAABpiAAAPA0BAGyIAAACiQAAZA0BAASJAABuiwAAdA0BAHCLAAD5iwAAnA0BAESPAAAukQAArA0BADCRAAB4kQAA3AgBAHiRAAANkgAArA0BABCSAACZkgAAtA0BAJySAABxkwAAtA0BAHSTAADlkwAAtA0BAIiVAAAdlgAAKA4BACCWAABXlwAAvA0BAFiXAACrlwAApAcBAKyXAACgmQAA7A0BAKCZAADwmQAAUAwBAPCZAAA2mgAAUAwBAESaAADlmgAABA4BAOiaAABqnQAADA4BAGydAACcnQAAUAwBAJydAABYngAAKA4BAFieAABwnwAANA4BAHCfAACnnwAApAcBAKifAAC8oAAAYA4BALygAAAtogAA2BABAECiAADvogAAYAkBAPCiAACcowAAeA4BAJyjAAAgpAAAUAwBACCkAADGpAAAiA4BAPCkAAAMpwAAuA4BAAynAABfpwAA+A4BAGCnAADlqQAACA8BADyqAABNqwAA2BABAFCrAACrqwAAUAwBAKyrAADnqwAALA8BAOirAAAjrAAADAgBACSsAADFrAAAeBABAMisAAD7rQAAPA8BAPytAABsrwAAaA8BAGyvAAB7sAAAdA8BAISwAAB2sQAAiA8BAHixAABStgAAmA8BAFS2AADdtgAAnA0BAOC2AAD1twAAnA0BAPi3AACouwAAuA8BAKi7AAAXvAAAaAwBABi8AAAOvQAAyBABAES9AACXvQAAUAwBAJi9AAAXxQAA0A8BABjFAACKxgAA6A8BAIzGAACKzgAAGBABAIzOAAB5zwAAOBABAHzPAAAR0AAAtA0BABTQAACV0gAAfAcBAJjSAAAw1AAAXBABADDUAADG1AAAeBABAMjUAACW1QAAiBABAJjVAADX1QAAUAwBANjVAACj2AAAkBABAKTYAACA3QAAqBABAIDdAAAQ3gAAtA0BABDeAAD93gAAyBABAAjfAADL4AAA2BABABDhAABe4QAAcA4BAGDhAAB44QAANA8BAHjhAACa4QAAVAsBAJrhAAC24QAAVAsBALbhAADP4QAAVAsBAM/hAAD14QAAVAsBAP/hAAAY4gAAVAsBABjiAAA04gAAVAsBADTiAABN4gAAVAsBAE3iAABm4gAAVAsBAGbiAAB/4gAAVAsBAIbiAACf4gAAVAsBAJ/iAACz4gAAVAsBAMDiAADh4gAAVAsBAOHiAAD94gAANA8BAP3iAAAf4wAAVAsBAB/jAAA34wAANA8BADfjAABO4wAANA8BAE7jAABl4wAANA8BAGXjAAB+4wAAVAsBAH7jAACX4wAAVAsBAJ7jAAC34wAAVAsBALfjAADQ4wAANA8BANDjAAAc5AAAMBABAAAAAABQSwMEFAAAAAAAAAAhAPWGemkAAAEAAAABACoAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NsaS5leGVNWpAAAwAAAAQAAAD//wAAuAAAAAAAAABAAAAAAAAA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dZGD+P90GYP4/nQUi8iD4B/B+QXB4AYDBI2gKkEA6wKLwvZAJIAPhWf///8zyTvZD4Rd////ihOJjdj9//+JjeD9//+Jjbz9//+Ile/9//+E0g+EHwoAAEODvdj9//8AiZ3E/f//D4wLCgAAisIsIDxYdxEPvsIPvoBY4kAAg+APM/brBDP2M8APvoTBeOJAAGoHwfgEWYmFlP3//zvBD4etCQAA/ySF3zJAAION6P3///+JtZD9//+JtcD9//+Jtcz9//+JtdD9//+JtfD9//+Jtcj9///pdgkAAA++woPoIHRKg+gDdDaD6Ah0JUhIdBWD6AMPhVcJAACDjfD9//8I6UsJAACDjfD9//8E6T8JAACDjfD9//8B6TMJAACBjfD9//+AAAAA6SQJAACDjfD9//8C6RgJAACA+ip1LIPHBIm93P3//4t//Dv+ib3M/f//D435CAAAg43w/f//BPedzP3//+nnCAAAi4XM/f//a8AKD77KjUQI0ImFzP3//+nMCAAAibXo/f//6cEIAACA+ip1JoPHBIm93P3//4t//Dv+ib3o/f//D42iCAAAg43o/f///+mWCAAAi4Xo/f//a8AKD77KjUQI0ImF6P3//+l7CAAAgPpJdFWA+mh0RID6bHQYgPp3D4VjCAAAgY3w/f//AAgAAOlUCAAAgDtsdRZDgY3w/f//ABAAAImdxP3//+k5CAAAg43w/f//EOktCAAAg43w/f//IOkhCAAAigM8NnUdgHsBNHUXQ0OBjfD9//8AgAAAiZ3E/f//6f4HAAA8M3UdgHsBMnUXQ0OBpfD9////f///iZ3E/f//6d0HAAA8ZA+E1QcAADxpD4TNBwAAPG8PhMUHAAA8dQ+EvQcAADx4D4S1BwAAPFgPhK0HAACJtZT9//+NhaT9//9QD7bCUIm1yP3//+ikPAAAWYXAioXv/f//WXQii420/f//jbXY/f//6KT7//+KA0OJncT9//+EwA+EpPz//4uNtP3//4212P3//+iC+///6U0HAAAPvsKD+GQPj+gBAAAPhHkCAACD+FMPj/IAAAAPhIAAAACD6EF0EEhIdFhISHQISEgPhZIFAACAwiDHhZD9//8BAAAAiJXv/f//g43w/f//QDm16P3//42d9P3//7gAAgAAiZ3k/f//iYWg/f//D41IAgAAx4Xo/f//BgAAAOmlAgAA94Xw/f//MAgAAA+FmAAAAIGN8P3//wAIAADpiQAAAPeF8P3//zAIAAB1CoGN8P3//wAIAACLjej9//+D+f91Bbn///9/g8cE94Xw/f//EAgAAIm93P3//4t//Im95P3//w+EsQQAADv+dQuhlBJBAImF5P3//4uF5P3//8eFyP3//wEAAADpfwQAAIPoWA+E2gIAAEhIdHkrwQ+EJ////0hID4WeBAAAg8cE94Xw/f//EAgAAIm93P3//3QwD7dH/FBoAAIAAI2F9P3//1CNheD9//9Q6Oc6AACDxBCFwHQfx4XA/f//AQAAAOsTikf8iIX0/f//x4Xg/f//AQAAAI2F9P3//4mF5P3//+k1BAAAiweDxwSJvdz9//87xnQ7i0gEO850NPeF8P3//wAIAAAPvwCJjeT9//90FJkrwtH4x4XI/f//AQAAAOnwAwAAibXI/f//6eUDAAChkBJBAImF5P3//1DoXjgAAFnpzgMAAIP4cA+P+wEAAA+E4wEAAIP4ZQ+MvAMAAIP4Zw+ONP7//4P4aXRxg/hudCiD+G8PhaADAAD2hfD9//+Ax4Xg/f//CAAAAHRhgY3w/f//AAIAAOtVizeDxwSJvdz9///o1zcAAIXAD4Qv+v//9oXw/f//IHQMZouF2P3//2aJBusIi4XY/f//iQbHhcD9//8BAAAA6aYEAACDjfD9//9Ax4Xg/f//CgAAAIuN8P3///fBAIAAAA+EqQEAAIsHi1cEg8cI6dUBAAB1EYD6Z3Vlx4Xo/f//AQAAAOtZOYXo/f//fgaJhej9//+Bvej9//+jAAAAfj+Ltej9//+Bxl0BAABW6B4LAACKle/9//9ZiYW8/f//hcB0EImF5P3//4m1oP3//4vY6wrHhej9//+jAAAAM/aLB4PHCImFiP3//4tH/ImFjP3//42FpP3//1D/tZD9//8PvsL/tej9//+Jvdz9//9Q/7Wg/f//jYWI/f//U1D/NVgcQQDoPSAAAFn/0Iu98P3//4PEHIHngAAAAHQgObXo/f//dRiNhaT9//9QU/81ZBxBAOgOIAAAWf/QWVmAve/9//9ndRw7/nUYjYWk/f//UFP/NWAcQQDo6R8AAFn/0FlZgDstdRGBjfD9//8AAQAAQ4md5P3//1PpA/7//8eF6P3//wgAAACJjbj9///rJIPocw+Etvz//0hID4SJ/v//g+gDD4W2AQAAx4W4/f//JwAAAPaF8P3//4DHheD9//8QAAAAD4Rp/v//ioW4/f//BFHGhdT9//8wiIXV/f//x4XQ/f//AgAAAOlF/v//98EAEAAAD4VL/v//g8cE9sEgdBiJvdz9///2wUB0Bg+/R/zrBA+3R/yZ6xOLR/z2wUB0A5nrAjPSib3c/f//9sFAdBs71n8XfAQ7xnMR99iD0gD32oGN8P3//wABAAD3hfD9//8AkAAAi9qL+HUCM9uDvej9//8AfQzHhej9//8BAAAA6xqDpfD9///3uAACAAA5hej9//9+BomF6P3//4vHC8N1BiGF0P3//41184uF6P3///+N6P3//4XAfwaLxwvDdC2LheD9//+ZUlBTV+iANwAAg8Ewg/k5iZ2g/f//i/iL2n4GA424/f//iA5O672NRfMrxkb3hfD9//8AAgAAiYXg/f//ibXk/f//dGGFwHQHi86AOTB0Vv+N5P3//4uN5P3//8YBMEDrPklmOTB0BkBAO8519CuF5P3//9H46yg7/nULoZASQQCJheT9//+LheT9///rB0mAOAB0BUA7znX1K4Xk/f//iYXg/f//g73A/f//AA+FXAEAAIuF8P3//6hAdDKpAAEAAHQJxoXU/f//LesYqAF0CcaF1P3//yvrC6gCdBHGhdT9//8gx4XQ/f//AQAAAIudzP3//yud4P3//yud0P3///aF8P3//wx1F/+1tP3//42F2P3//1NqIOhw9f//g8QM/7XQ/f//i720/f//jYXY/f//jY3U/f//6Hb1///2hfD9//8IWXQb9oXw/f//BHUSV1NqMI2F2P3//+gu9f//g8QMg73I/f//AIuF4P3//3RmhcB+You15P3//4mFoP3//w+3Bv+NoP3//1BqBo1F9FCNhZj9//9GUEbogTUAAIPEEIXAdSg5hZj9//90IP+1mP3//42F2P3//41N9Ojx9P//g72g/f//AFl1tescg43Y/f///+sTi43k/f//UI2F2P3//+jK9P//WYO92P3//wB8G/aF8P3//wR0EldTaiCNhdj9///ogvT//4PEDIO9vP3//wB0E/+1vP3//+gECAAAg6W8/f//AFmLncT9//+KA4iF7/3//4TAdBOLjZT9//+Lvdz9//+K0Onh9f//gL2w/f//AHQKi4Ws/f//g2Bw/YuF2P3//4tN/F9eM81b6Abs///Jw5DqKkAA6yhAABspQAB5KUAAxSlAANApQAAWKkAARCtAAGpUaFD1QADoZQQAADP/iX38jUWcUP8VQOBAAMdF/P7///9qQGogXlbodQYAAFlZO8cPhBQCAACjoCpBAIk1kCpBAI2IAAgAAOswxkAEAIMI/8ZABQqJeAjGQCQAxkAlCsZAJgqJeDjGQDQAg8BAiw2gKkEAgcEACAAAO8FyzGY5fc4PhAoBAACLRdA7xw+E/wAAAIs4jVgEjQQ7iUXkvgAIAAA7/nwCi/7HReABAAAA61tqQGog6OcFAABZWYXAdFaLTeCNDI2gKkEAiQGDBZAqQQAgjZAACAAA6yrGQAQAgwj/xkAFCoNgCACAYCSAxkAlCsZAJgqDYDgAxkA0AIPAQIsRA9Y7wnLS/0XgOT2QKkEAfJ3rBos9kCpBAINl4ACF/35ti0XkiwiD+f90VoP5/nRRigOoAXRLqAh1C1H/FTzgQACFwHQ8i3Xgi8bB+AWD5h/B5gYDNIWgKkEAi0XkiwCJBooDiEYEaKAPAACNRgxQ6IAqAABZWYXAD4TJAAAA/0YI/0XgQ4NF5AQ5feB8kzPbi/PB5gYDNaAqQQCLBoP4/3QLg/j+dAaATgSA63LGRgSBhdt1BWr2WOsKi8NI99gbwIPA9VD/FTjgQACL+IP//3RDhf90P1f/FTzgQACFwHQ0iT4l/wAAAIP4AnUGgE4EQOsJg/gDdQSATgQIaKAPAACNRgxQ6OopAABZWYXAdDf/RgjrCoBOBEDHBv7///9Dg/sDD4xn/////zWQKkEA/xU04EAAM8DrETPAQMOLZejHRfz+////g8j/6GMCAADDi/9Vi+yLRQhWM/Y7xnUd6L0BAABWVlZWVscAFgAAAOhFAQAAg8QUg8j/6wOLQBBeXcOL/1WL7ItFCKNQIEEAXcOL/1WL7IHsKAMAAKGAEkEAM8WJRfyDpdj8//8AU2pMjYXc/P//agBQ6B/l//+Nhdj8//+JhSj9//+NhTD9//+DxAyJhSz9//+JheD9//+Jjdz9//+Jldj9//+JndT9//+JtdD9//+Jvcz9//9mjJX4/f//ZoyN7P3//2aMncj9//9mjIXE/f//ZoylwP3//2aMrbz9//+cj4Xw/f//i0UEjU0Ex4Uw/f//AQABAImF6P3//4mN9P3//4tJ/ImN5P3//8eF2Pz//xcEAMDHhdz8//8BAAAAiYXk/P///xVY4EAAagCL2P8VVOBAAI2FKP3//1D/FVDgQACFwHUMhdt1CGoC6OkxAABZaBcEAMD/FUzgQABQ/xVI4EAAi038M81b6Cjo///Jw4v/VYvs/zVQIEEA6CYYAABZhcB0A13/4GoC6KoxAABZXemy/v//i/9Vi+yLRQgzyTsEzdgSQQB0E0GD+S1y8Y1I7YP5EXcOag1YXcOLBM3cEkEAXcMFRP///2oOWTvIG8AjwYPACF3D6JwZAACFwHUGuEAUQQDDg8AIw+iJGQAAhcB1BrhEFEEAw4PADMOL/1WL7Fbo4v///4tNCFGJCOiC////WYvw6Lz///+JMF5dw8zMzGjQN0AAZP81AAAAAItEJBCJbCQQjWwkECvgU1ZXoYASQQAxRfwzxVCJZej/dfiLRfzHRfz+////iUX4jUXwZKMAAAAAw4tN8GSJDQAAAABZX19eW4vlXVHDzMzMzMzMzIv/VYvsg+wYU4tdDFaLcwgzNYASQQBXiwbGRf8Ax0X0AQAAAI17EIP4/nQNi04EA88zDDjo2eb//4tODItGCAPPMww46Mnm//+LRQj2QARmD4UWAQAAi00QjVXoiVP8i1sMiUXoiU3sg/v+dF+NSQCNBFuLTIYUjUSGEIlF8IsAiUX4hcl0FIvX6CQxAADGRf8BhcB8QH9Hi0X4i9iD+P51zoB9/wB0JIsGg/j+dA2LTgQDzzMMOOhW5v//i04Mi1YIA88zDDroRub//4tF9F9eW4vlXcPHRfQAAAAA68mLTQiBOWNzbeB1KYM9jCpBAAB0IGiMKkEA6IMhAACDxASFwHQPi1UIagFS/xWMKkEAg8QIi00M6McwAACLRQw5WAx0EmiAEkEAV4vTi8joyjAAAItFDItN+IlIDIsGg/j+dA2LTgQDzzMMOOjD5f//i04Mi1YIA88zDDros+X//4tF8ItICIvX6F0wAAC6/v///zlTDA+EUv///2iAEkEAV4vL6HUwAADpHP///4v/VYvsVlcz9v91COjFMAAAi/hZhf91JzkFVCBBAHYfVv8VJOBAAI2G6AMAADsFVCBBAHYDg8j/i/CD+P91yovHX15dw4v/VYvsVlcz9moA/3UM/3UI6EUFAACL+IPEDIX/dSc5BVQgQQB2H1b/FSTgQACNhugDAAA7BVQgQQB2A4PI/4vwg/j/dcOLx19eXcOL/1WL7FZXM/b/dQz/dQjo+zAAAIv4WVmF/3UsOUUMdCc5BVQgQQB2H1b/FSTgQACNhugDAAA7BVQgQQB2A4PI/4vwg/j/dcGLx19eXcOL/1WL7FZXM/b/dRD/dQz/dQjoxTIAAIv4g8QMhf91LDlFEHQnOQVUIEEAdh9W/xUk4EAAjYboAwAAOwVUIEEAdgODyP+L8IP4/3W9i8dfXl3DagxocPVAAOjX/P//i3UIhfZ0dYM9hCpBAAN1Q2oE6BkEAABZg2X8AFbo1zIAAFmJReSFwHQJVlDo+DIAAFlZx0X8/v///+gLAAAAg33kAHU3/3UI6wpqBOgFAwAAWcNWagD/NXQpQQD/FWDgQACFwHUW6CD8//+L8P8VXOBAAFDo0Pv//4kGWeib/P//w2oQaJD1QADoSfz//zPbiV3kagHolgMAAFmJXfxqA1+JfeA7PcA7QQB9V4v3weYCobwrQQADxjkYdESLAPZADIN0D1Doaj0AAFmD+P90A/9F5IP/FHwoobwrQQCLBAaDwCBQ/xVE4EAAobwrQQD/NAbo/f7//1mhvCtBAIkcBkfrnsdF/P7////oCQAAAItF5OgF/P//w2oB6DcCAABZw4v/VYvsU1aLdQiLRgyLyIDhAzPbgPkCdUCpCAEAAHQ5i0YIV4s+K/iF/34sV1BW6GX5//9ZUOiHRAAAg8QMO8d1D4tGDITAeQ+D4P2JRgzrB4NODCCDy/9fi0YIg2YEAIkGXovDW13Di/9Vi+xWi3UIhfZ1CVboNQAAAFnrL1bofP///1mFwHQFg8j/6x/3RgwAQAAAdBRW6Pz4//9Q6PtEAABZ99hZG8DrAjPAXl3DahRosPVAAOj6+v//M/+JfeSJfdxqAehEAgAAWYl9/DP2iXXgOzXAO0EAD42DAAAAobwrQQCNBLA5OHReiwD2QAyDdFZQVuhE3f//WVkz0kKJVfyhvCtBAIsEsItIDPbBg3QvOVUIdRFQ6Er///9Zg/j/dB7/ReTrGTl9CHUU9sECdA9Q6C////9Zg/j/dQMJRdyJffzoCAAAAEbrhDP/i3XgobwrQQD/NLBW6E3d//9ZWcPHRfz+////6BIAAACDfQgBi0XkdAOLRdzoe/r//8NqAeitAAAAWcNqAegf////WcOL/1ZXM/a/WCBBAIM89UwUQQABdR6NBPVIFEEAiThooA8AAP8wg8cY6H0hAABZWYXAdAxGg/4kfNIzwEBfXsODJPVIFEEAADPA6/GL/1OLHUTgQABWvkgUQQBXiz6F/3QTg34EAXQNV//TV+jQ/P//gyYAWYPGCIH+aBVBAHzcvkgUQQBfiwaFwHQJg34EAXUDUP/Tg8YIgf5oFUEAfOZeW8OL/1WL7ItFCP80xUgUQQD/FRzgQABdw2oMaNj1QADoXvn//zP/R4l95DPbOR10KUEAdRjotBkAAGoe6AIYAABo/wAAAOiA4///WVmLdQiNNPVIFEEAOR50BIvH625qGOgJ+///WYv4O/t1D+jF+P//xwAMAAAAM8DrUWoK6FkAAABZiV38OR51LGigDwAAV+h0IAAAWVmFwHUXV+j++///WeiP+P//xwAMAAAAiV3k6wuJPusHV+jj+///WcdF/P7////oCQAAAItF5Oj2+P//w2oK6Cj///9Zw4v/VYvsi0UIVo00xUgUQQCDPgB1E1DoIv///1mFwHUIahHodOL//1n/Nv8VGOBAAF5dw2oMaPj1QADoaPj//4tNCDP/O892LmrgWDPS9/E7RQwbwEB1H+j/9///xwAMAAAAV1dXV1foh/f//4PEFDPA6dUAAAAPr00Mi/GJdQg793UDM/ZGM9uJXeSD/uB3aYM9hCpBAAN1S4PGD4Pm8Il1DItFCDsFcCpBAHc3agToTP///1mJffz/dQjo6DUAAFmJReTHRfz+////6F8AAACLXeQ733QR/3UIV1PoNtv//4PEDDvfdWFWagj/NXQpQQD/FWTgQACL2DvfdUw5PYApQQB0M1bokh8AAFmFwA+Fcv///4tFEDvHD4RQ////xwAMAAAA6UX///8z/4t1DGoE6PD9//9ZwzvfdQ2LRRA7x3QGxwAMAAAAi8PonPf//8NVi+yD7ASJffyLfQiLTQzB6QdmD+/A6wiNpCQAAAAAkGYPfwdmD39HEGYPf0cgZg9/RzBmD39HQGYPf0dQZg9/R2BmD39HcI2/gAAAAEl10It9/IvlXcNVi+yD7BCJffyLRQiZi/gz+iv6g+cPM/or+oX/dTyLTRCL0YPif4lV9DvKdBIrylFQ6HP///+DxAiLRQiLVfSF0nRFA0UQK8KJRfgzwIt9+ItN9POqi0UI6y7334PHEIl98DPAi30Ii03w86qLRfCLTQiLVRADyCvQUmoAUeh+////g8QMi0UIi338i+Vdw2oMaBj2QADoZPb//4Nl/ABmDyjBx0XkAQAAAOsji0XsiwCLAD0FAADAdAo9HQAAwHQDM8DDM8BAw4tl6INl5ADHRfz+////i0Xk6Gb2///Di/9Vi+yD7BgzwFOJRfyJRfSJRfhTnFiLyDUAACAAUJ2cWivRdB9RnTPAD6KJRfSJXeiJVeyJTfC4AQAAAA+iiVX8iUX4W/dF/AAAAAR0Duhc////hcB0BTPAQOsCM8BbycPomf///6OIKkEAM8DDi/9Vi+xRU1aLdQgz21c783QFOV0MdyDoSfX//2oWWVNTU1NTi/GJCOjQ9P//g8QUi8bpzQAAAItFEDP/O8N0GYoAOsN0E2oCXzl9DA+GnQAAAIgGRsYGOkaLTRSLwTvLdEA4GXQ86wOLffyLVQxHiX38O/pzeYoQiBZGQDgYdehQUeiMQAAAigBZWTwvdBA8XHQMRzt9DHNWxgZcRusDi338i0UYO8N0EusMRzt9DHM+igiIDkZAOBh18ItFHDvDdCeKCDrLdCGA+S50GEc7fQxzHMYGLkbrDEc7fQxzEIoIiA5GQDgYdfBHO30MdhGLRQiIGOhs9P//aiLpHv///4geM8BfXlvJw4v/VYvsg+wQ/3UIjU3w6Bbc//8PtkUMi030ilUUhFQBHXUeg30QAHQSi03wi4nIAAAAD7cEQSNFEOsCM8CFwHQDM8BAgH38AHQHi034g2Fw/cnDi/9Vi+xqBGoA/3UI/3UM6Jn///+DxBBdw4v/VYvsagRqAP91CGoA6IH///+DxBBdw4v/VYvsagD/dRT/dRD/dQz/dQjohT8AAIPEFF3Di/9Vi+yB7CgDAACjsCJBAIkNrCJBAIkVqCJBAIkdpCJBAIk1oCJBAIk9nCJBAGaMFcgiQQBmjA28IkEAZowdmCJBAGaMBZQiQQBmjCWQIkEAZowtjCJBAJyPBcAiQQCLRQCjtCJBAItFBKO4IkEAjUUIo8QiQQCLheD8///HBQAiQQABAAEAobgiQQCjtCFBAMcFqCFBAAkEAMDHBawhQQABAAAAoYASQQCJhdj8//+hhBJBAImF3Pz///8VWOBAAKP4IUEAagHoTyQAAFlqAP8VVOBAAGjU4kAA/xVQ4EAAgz34IUEAAHUIagHoKyQAAFloCQQAwP8VTOBAAFD/FUjgQADJwy2kAwAAdCKD6AR0F4PoDXQMSHQDM8DDuAQEAADDuBIEAADDuAQIAADDuBEEAADDi/9WV4vwaAEBAAAz/41GHFdQ6CvW//8zwA+3yIvBiX4EiX4IiX4MweEQC8GNfhCrq6u5aBVBAIPEDI1GHCvOvwEBAACKFAGIEEBPdfeNhh0BAAC+AAEAAIoUCIgQQE51919ew4v/VYvsgewcBQAAoYASQQAzxYlF/FNXjYXo+v//UP92BP8VaOBAAL8AAQAAhcAPhPsAAAAzwIiEBfz+//9AO8dy9IqF7vr//8aF/P7//yCEwHQujZ3v+v//D7bID7YDO8h3FivBQFCNlA38/v//aiBS6GjV//+DxAxDigNDhMB12GoA/3YMjYX8+v///3YEUFeNhfz+//9QagFqAOgZRQAAM9tT/3YEjYX8/f//V1BXjYX8/v//UFf/dgxT6PpCAACDxERT/3YEjYX8/P//V1BXjYX8/v//UGgAAgAA/3YMU+jVQgAAg8QkM8APt4xF/Pr///bBAXQOgEwGHRCKjAX8/f//6xH2wQJ0FYBMBh0giowF/Pz//4iMBh0BAADrCMaEBh0BAAAAQDvHcr7rVo2GHQEAAMeF5Pr//5////8zySmF5Pr//4uV5Pr//42EDh0BAAAD0I1aIIP7GXcMgEwOHRCK0YDCIOsPg/oZdw6ATA4dIIrRgOogiBDrA8YAAEE7z3LCi038XzPNW+hP2P//ycNqDGg49kAA6M/w///omAoAAIv4oYwaQQCFR3B0HYN/bAB0F4t3aIX2dQhqIOie2v//WYvG6Ofw///Dag3o8/f//1mDZfwAi3doiXXkOzWQGUEAdDaF9nQaVv8VcOBAAIXAdQ+B/mgVQQB0B1boh/P//1mhkBlBAIlHaIs1kBlBAIl15Fb/FWzgQADHRfz+////6AUAAADrjot15GoN6Lj2//9Zw4v/VYvsg+wQUzPbU41N8Oik1///iR3MJEEAg/7+dR7HBcwkQQABAAAA/xV44EAAOF38dEWLTfiDYXD96zyD/v11EscFzCRBAAEAAAD/FXTgQADr24P+/HUSi0Xwi0AExwXMJEEAAQAAAOvEOF38dAeLRfiDYHD9i8ZbycOL/1WL7IPsIKGAEkEAM8WJRfxTi10MVot1CFfoZP///4v4M/aJfQg7/nUOi8Pot/z//zPA6Z0BAACJdeQzwDm4mBlBAA+EkQAAAP9F5IPAMD3wAAAAcueB/+j9AAAPhHABAACB/+n9AAAPhGQBAAAPt8dQ/xV84EAAhcAPhFIBAACNRehQV/8VaOBAAIXAD4QzAQAAaAEBAACNQxxWUOiI0v//M9JCg8QMiXsEiXMMOVXoD4b4AAAAgH3uAA+EzwAAAI1174oOhMkPhMIAAAAPtkb/D7bJ6aYAAABoAQEAAI1DHFZQ6EHS//+LTeSDxAxryTCJdeCNsagZQQCJdeTrKopGAYTAdCgPtj4PtsDrEotF4IqAlBlBAAhEOx0PtkYBRzv4duqLfQhGRoA+AHXRi3Xk/0Xgg8YIg33gBIl15HLpi8eJewTHQwgBAAAA6Gf7//9qBolDDI1DEI2JnBlBAFpmizFBZokwQUBASnXzi/Po1/v//+m3/v//gEwDHQRAO8F29kZGgH7/AA+FNP///41DHrn+AAAAgAgIQEl1+YtDBOgS+///iUMMiVMI6wOJcwgzwA+3yIvBweEQC8GNexCrq6vrqDk1zCRBAA+FWP7//4PI/4tN/F9eM81b6ErV///Jw2oUaFj2QADoyu3//4NN4P/ojwcAAIv4iX3c6Nz8//+LX2iLdQjodf3//4lFCDtDBA+EVwEAAGggAgAA6ILv//9Zi9iF2w+ERgEAALmIAAAAi3doi/vzpYMjAFP/dQjouP3//1lZiUXghcAPhfwAAACLddz/dmj/FXDgQACFwHURi0ZoPWgVQQB0B1DoY/D//1mJXmhTiz1s4EAA/9f2RnACD4XqAAAA9gWMGkEAAQ+F3QAAAGoN6HT0//9Zg2X8AItDBKPcJEEAi0MIo+AkQQCLQwyj5CRBADPAiUXkg/gFfRBmi0xDEGaJDEXQJEEAQOvoM8CJReQ9AQEAAH0NikwYHIiIiBdBAEDr6TPAiUXkPQABAAB9EIqMGB0BAACIiJAYQQBA6+b/NZAZQQD/FXDgQACFwHUToZAZQQA9aBVBAHQHUOiq7///WYkdkBlBAFP/18dF/P7////oAgAAAOswag3o7fL//1nD6yWD+P91IIH7aBVBAHQHU+h07///WegF7P//xwAWAAAA6wSDZeAAi0Xg6ILs///Dgz2wK0EAAHUSav3oVv7//1nHBbArQQABAAAAM8DDi/9Vi+xTVot1CIuGvAAAADPbVzvDdG89SB1BAHRoi4awAAAAO8N0XjkYdVqLhrgAAAA7w3QXORh1E1Do++7///+2vAAAAOg7QQAAWVmLhrQAAAA7w3QXORh1E1Do2u7///+2vAAAAOjVQAAAWVn/trAAAADowu7///+2vAAAAOi37v//WVmLhsAAAAA7w3REORh1QIuGxAAAAC3+AAAAUOiW7v//i4bMAAAAv4AAAAArx1Dog+7//4uG0AAAACvHUOh17v///7bAAAAA6Gru//+DxBCNvtQAAACLBz2IHEEAdBc5mLQAAAB1D1Douz4AAP836EPu//9ZWY1+UMdFCAYAAACBf/iQGkEAdBGLBzvDdAs5GHUHUOge7v//WTlf/HQSi0cEO8N0CzkYdQdQ6Afu//9Zg8cQ/00IdcdW6Pjt//9ZX15bXcOL/1WL7FNWizVs4EAAV4t9CFf/1ouHsAAAAIXAdANQ/9aLh7gAAACFwHQDUP/Wi4e0AAAAhcB0A1D/1ouHwAAAAIXAdANQ/9aNX1DHRQgGAAAAgXv4kBpBAHQJiwOFwHQDUP/Wg3v8AHQKi0MEhcB0A1D/1oPDEP9NCHXWi4fUAAAABbQAAABQ/9ZfXltdw4v/VYvsV4t9CIX/D4SDAAAAU1aLNXDgQABX/9aLh7AAAACFwHQDUP/Wi4e4AAAAhcB0A1D/1ouHtAAAAIXAdANQ/9aLh8AAAACFwHQDUP/WjV9Qx0UIBgAAAIF7+JAaQQB0CYsDhcB0A1D/1oN7/AB0CotDBIXAdANQ/9aDwxD/TQh11ouH1AAAAAW0AAAAUP/WXluLx19dw4X/dDeFwHQzVoswO/d0KFeJOOjB/v//WYX2dBtW6EX///+DPgBZdQ+B/pgaQQB0B1boWf3//1mLx17DM8DDagxoePZAAOhj6f//6CwDAACL8KGMGkEAhUZwdCKDfmwAdBzoFQMAAItwbIX2dQhqIOgt0///WYvG6Hbp///DagzogvD//1mDZfwAjUZsiz1wG0EA6Gn///+JReTHRfz+////6AIAAADrwWoM6H3v//9Zi3Xkw4v/VYvsVv81hBtBAIs1gOBAAP/WhcB0IaGAG0EAg/j/dBdQ/zWEG0EA/9b/0IXAdAiLgPgBAADrJ75040AAVv8VIOBAAIXAdQtW6G7S//9ZhcB0GGhk40AAUP8VKOBAAIXAdAj/dQj/0IlFCItFCF5dw2oA6If///9Zw4v/VYvsVv81hBtBAIs1gOBAAP/WhcB0IaGAG0EAg/j/dBdQ/zWEG0EA/9b/0IXAdAiLgPwBAADrJ75040AAVv8VIOBAAIXAdQtW6PPR//9ZhcB0GGiQ40AAUP8VKOBAAIXAdAj/dQj/0IlFCItFCF5dw/8VhOBAAMIEAIv/Vv81hBtBAP8VgOBAAIvwhfZ1G/81ECVBAOhl////WYvwVv81hBtBAP8ViOBAAIvGXsOhgBtBAIP4/3QWUP81GCVBAOg7////Wf/Qgw2AG0EA/6GEG0EAg/j/dA5Q/xWM4EAAgw2EG0EA/+m67f//agxomPZAAOiG5///vnTjQABW/xUg4EAAhcB1B1boNNH//1mJReSLdQjHRlyQ6UAAM/9HiX4UhcB0JGhk40AAUIsdKOBAAP/TiYb4AQAAaJDjQAD/deT/04mG/AEAAIl+cMaGyAAAAEPGhksBAABDx0ZoaBVBAGoN6G7u//9Zg2X8AP92aP8VbOBAAMdF/P7////oPgAAAGoM6E3u//9ZiX38i0UMiUZshcB1CKFwG0EAiUZs/3Zs6AH8//9Zx0X8/v///+gVAAAA6Ann///DM/9Hi3UIag3oNe3//1nDagzoLO3//1nDi/9WV/8VXOBAAP81gBtBAIv46JH+////0IvwhfZ1TmgUAgAAagHosej//4vwWVmF9nQ6Vv81gBtBAP81FCVBAOjo/f//Wf/QhcB0GGoAVujF/v//WVn/FZTgQACDTgT/iQbrCVboXun//1kz9lf/FZDgQABfi8Zew4v/Vuh/////i/CF9nUIahDoEdD//1mLxl7DaghowPZAAOgM5v//i3UIhfYPhPgAAACLRiSFwHQHUOgR6f//WYtGLIXAdAdQ6APp//9Zi0Y0hcB0B1Do9ej//1mLRjyFwHQHUOjn6P//WYtGQIXAdAdQ6Nno//9Zi0ZEhcB0B1Doy+j//1mLRkiFwHQHUOi96P//WYtGXD2Q6UAAdAdQ6Kzo//9Zag3o4Oz//1mDZfwAi35ohf90Glf/FXDgQACFwHUPgf9oFUEAdAdX6H/o//9Zx0X8/v///+hXAAAAagzop+z//1nHRfwBAAAAi35shf90I1fo8/r//1k7PXAbQQB0FIH/mBpBAHQMgz8AdQdX6P/4//9Zx0X8/v///+geAAAAVugn6P//WehJ5f//wgQAi3UIag3oduv//1nDi3UIagzoauv//1nDi/9WV75040AAVv8VIOBAAIXAdQdW6JPO//9Zi/iF/w+EXgEAAIs1KOBAAGjA40AAV//WaLTjQABXowwlQQD/1mio40AAV6MQJUEA/9ZooONAAFejFCVBAP/Wgz0MJUEAAIs1iOBAAKMYJUEAdBaDPRAlQQAAdA2DPRQlQQAAdASFwHUkoYDgQACjECVBAKGM4EAAxwUMJUEAZE9AAIk1FCVBAKMYJUEA/xWE4EAAo4QbQQCD+P8PhMwAAAD/NRAlQQBQ/9aFwA+EuwAAAOjF0P///zUMJUEA6BP7////NRAlQQCjDCVBAOgD+////zUUJUEAoxAlQQDo8/r///81GCVBAKMUJUEA6OP6//+DxBCjGCVBAOis6f//hcB0ZWhYUUAA/zUMJUEA6D37//9Z/9CjgBtBAIP4/3RIaBQCAABqAejT5f//i/BZWYX2dDRW/zWAG0EA/zUUJUEA6Ar7//9Z/9CFwHQbagBW6Of7//9ZWf8VlOBAAINOBP+JBjPAQOsH6JL7//8zwF9ew4v/VYvsg+wYU/91EI1N6OjJyv//i10IjUMBPQABAAB3D4tF6IuAyAAAAA+3BFjrdYldCMF9CAiNRehQi0UIJf8AAABQ6EcTAABZWYXAdBKKRQhqAohF+Ihd+cZF+gBZ6wozyYhd+MZF+QBBi0XoagH/cBT/cASNRfxQUY1F+FCNRehqAVDoHjYAAIPEIIXAdRA4RfR0B4tF8INgcP0zwOsUD7dF/CNFDIB99AB0B4tN8INhcP1bycOL/1WL7FFWi3UMVuh34P//iUUMi0YMWaiCdRfoOOL//8cACQAAAINODCCDyP/pLwEAAKhAdA3oHeL//8cAIgAAAOvjUzPbqAF0FoleBKgQD4SHAAAAi04Ig+D+iQ6JRgyLRgyD4O+DyAKJRgyJXgSJXfypDAEAAHUs6JfD//+DwCA78HQM6IvD//+DwEA78HUN/3UM6KkPAABZhcB1B1bovj8AAFn3RgwIAQAAVw+EgAAAAItGCIs+jUgBiQ6LThgr+Ek7+4lOBH4dV1D/dQzo3CoAAIPEDIlF/OtNg8ggiUYMg8j/63mLTQyD+f90G4P5/nQWi8GD4B+L0cH6BcHgBgMElaAqQQDrBbiYEkEA9kAEIHQUagJTU1HoKj4AACPCg8QQg/j/dCWLRgiKTQiICOsWM/9HV41FCFD/dQzobSoAAIPEDIlF/Dl9/HQJg04MIIPI/+sIi0UIJf8AAABfW17Jw4v/VYvsUVFTi10IVlcz9jP/iX38Oxz9iBtBAHQJR4l9/IP/F3Lug/8XD4N3AQAAagPoekAAAFmD+AEPhDQBAABqA+hpQAAAWYXAdQ2DPYwSQQABD4QbAQAAgfv8AAAAD4RBAQAAaHDpQAC7FAMAAFO/ICVBAFfoMDgAAIPEDIXAdA1WVlZWVujY3v//g8QUaAQBAAC+OSVBAFZqAMYFPSZBAAD/FRTgQACFwHUmaFjpQABo+wIAAFbo7jcAAIPEDIXAdA8zwFBQUFBQ6JTe//+DxBRW6IcOAABAWYP4PHY4Vuh6DgAAg+47A8ZqA7k0KEEAaFTpQAAryFFQ6PY2AACDxBSFwHQRM/ZWVlZWVuhR3v//g8QU6wIz9mhQ6UAAU1foEDYAAIPEDIXAdA1WVlZWVugt3v//g8QUi0X8/zTFjBtBAFNX6Os1AACDxAyFwHQNVlZWVlboCN7//4PEFGgQIAEAaCjpQABX6Ng9AACDxAzrMmr0/xU44EAAi9g73nQkg/v/dB9qAI1F+FCNNP2MG0EA/zboxQ0AAFlQ/zZT/xWY4EAAX15bycNqA+j+PgAAWYP4AXQVagPo8T4AAFmFwHUfgz2MEkEAAXUWaPwAAADoKf7//2j/AAAA6B/+//9ZWcOL/1WL7FFTVlf/NawrQQDoyvb///81qCtBAIv4iX386Lr2//+L8FlZO/cPgoMAAACL3ivfjUMEg/gEcndX6NU+AACL+I1DBFk7+HNIuAAIAAA7+HMCi8cDxzvHcg9Q/3X86HPh//9ZWYXAdRaNRxA7x3JAUP91/Ohd4f//WVmFwHQxwfsCUI00mOjV9f//WaOsK0EA/3UI6Mf1//+JBoPGBFbovPX//1mjqCtBAItFCFnrAjPAX15bycOL/1ZqBGog6Mfg//+L8FbolfX//4PEDKOsK0EAo6grQQCF9nUFahhYXsODJgAzwF7Dagxo6PZAAOhl3v//6MDI//+DZfwA/3UI6Pj+//9ZiUXkx0X8/v///+gJAAAAi0Xk6IHe///D6J/I///Di/9Vi+z/dQjot/////fYG8D32FlIXcOL/1a44PRAAL7g9EAAV4v4O8ZzD4sHhcB0Av/Qg8cEO/5y8V9ew4v/Vrjo9EAAvuj0QABXi/g7xnMPiweFwHQC/9CDxwQ7/nLxX17Di/9WVzP/jbdAHEEA/zboxvT//4PHBFmJBoP/KHLoX17DzIv/VYvsi00IuE1aAABmOQF0BDPAXcOLQTwDwYE4UEUAAHXvM9K5CwEAAGY5SBgPlMKLwl3DzMzMzMzMzMzMzMyL/1WL7ItFCItIPAPID7dBFFNWD7dxBjPSV41ECBiF9nYbi30Mi0gMO/lyCYtYCAPZO/tyCkKDwCg71nLoM8BfXltdw8zMzMzMzMzMzMzMzIv/VYvsav5oCPdAAGjQN0AAZKEAAAAAUIPsCFNWV6GAEkEAMUX4M8VQjUXwZKMAAAAAiWXox0X8AAAAAGgAAEAA6Cr///+DxASFwHRVi0UILQAAQABQaAAAQADoUP///4PECIXAdDuLQCTB6B/30IPgAcdF/P7///+LTfBkiQ0AAAAAWV9eW4vlXcOLReyLCIsBM9I9BQAAwA+UwovCw4tl6MdF/P7///8zwItN8GSJDQAAAABZX15bi+Vdw2oIaCj3QADoV9z//+gg9v//i0B4hcB0FoNl/AD/0OsHM8BAw4tl6MdF/P7////olzwAAOhw3P//w2gNW0AA6Cfz//9ZozQoQQDDw4v/VYvsUVFW6GD1//+L8IX2D4RGAQAAi1ZcoXQcQQBXi30Ii8pTOTl0DovYa9sMg8EMA9o7y3Lua8AMA8I7yHMIOTl1BIvB6wIzwIXAdAqLWAiJXfyF23UHM8Dp+wAAAIP7BXUMg2AIADPAQOnqAAAAg/sBD4TeAAAAi05giU34i00MiU5gi0gEg/kID4W4AAAAiw1oHEEAiz1sHEEAi9ED+TvXfSRryQyLflyDZDkIAIs9aBxBAIsdbBxBAEID34PBDDvTfOKLXfyLAIt+ZD2OAADAdQnHRmSDAAAA6149kAAAwHUJx0ZkgQAAAOtOPZEAAMB1CcdGZIQAAADrPj2TAADAdQnHRmSFAAAA6y49jQAAwHUJx0ZkggAAAOsePY8AAMB1CcdGZIYAAADrDj2SAADAdQfHRmSKAAAA/3Zkagj/01mJfmTrB4NgCABR/9OLRfhZiUZgg8j/W19eycOL/1WL7ItFCKM4KEEAozwoQQCjQChBAKNEKEEAXcOL/1WL7ItFCIsNdBxBAFY5UAR0D4vxa/YMA3UIg8AMO8Zy7GvJDANNCF47wXMFOVAEdAIzwF3D/zVAKEEA6Nrx//9Zw2ogaEj3QADoStr//zP/iX3kiX3Yi10Ig/sLf0x0FYvDagJZK8F0IivBdAgrwXRkK8F1ROhz8///i/iJfdiF/3UUg8j/6WEBAAC+OChBAKE4KEEA62D/d1yL0+hd////i/CDxgiLButai8OD6A90PIPoBnQrSHQc6I7Z///HABYAAAAzwFBQUFBQ6BTZ//+DxBTrrr5AKEEAoUAoQQDrFr48KEEAoTwoQQDrCr5EKEEAoUQoQQDHReQBAAAAUOgW8f//iUXgWTPAg33gAQ+E2AAAADlF4HUHagPo8sX//zlF5HQHUOjG4P//WTPAiUX8g/sIdAqD+wt0BYP7BHUbi09giU3UiUdgg/sIdUCLT2SJTdDHR2SMAAAAg/sIdS6LDWgcQQCJTdyLDWwcQQCLFWgcQQADyjlN3H0Zi03ca8kMi1dciUQRCP9F3Ovb6H7w//+JBsdF/P7////oFQAAAIP7CHUf/3dkU/9V4FnrGYtdCIt92IN95AB0CGoA6FTf//9Zw1P/VeBZg/sIdAqD+wt0BYP7BHURi0XUiUdgg/sIdQaLRdCJR2QzwOjs2P//w4v/VYvsi0UIo0woQQBdw4v/VYvsi0UIo1goQQBdw4v/VYvsi0UIo1woQQBdw2oQaGj3QADobdj//4Nl/AD/dQz/dQj/FaDgQACJReTrL4tF7IsAiwCJReAzyT0XAADAD5TBi8HDi2XogX3gFwAAwHUIagj/FZDgQACDZeQAx0X8/v///4tF5Ohf2P//w4v/VYvsi0UIo2AoQQBdw4v/VYvs/zVgKEEA6Hzv//9ZhcB0D/91CP/QWYXAdAUzwEBdwzPAXcOL/1WL7ItFCIsAgThjc23gdSqDeBADdSSLQBQ9IAWTGXQVPSEFkxl0Dj0iBZMZdAc9AECZAXUF6EP7//8zwF3CBABojl9AAP8VVOBAADPAw4M9sCtBAAB1BehI6///Vos1PCBBAFcz/4X2dRiDyP/poAAAADw9dAFHVuiDBQAAWY10BgGKBoTAdepqBEdX6IDZ//+L+FlZiT0YIEEAhf90y4s1PCBBAFPrQlboUgUAAIvYQ4A+PVl0MWoBU+hS2f//WVmJB4XAdE5WU1DofC4AAIPEDIXAdA8zwFBQUFBQ6CLV//+DxBSDxwQD84A+AHW5/zU8IEEA6APa//+DJTwgQQAAgycAxwWkK0EAAQAAADPAWVtfXsP/NRggQQDo3dn//4MlGCBBAACDyP/r5Iv/VYvsUYtNEFMzwFaJB4vyi1UMxwEBAAAAOUUIdAmLXQiDRQgEiROJRfyAPiJ1EDPAOUX8syIPlMBGiUX86zz/B4XSdAiKBogCQolVDIoeD7bDUEboHuL//1mFwHQT/weDfQwAdAqLTQyKBv9FDIgBRotVDItNEITbdDKDffwAdamA+yB0BYD7CXWfhdJ0BMZC/wCDZfwAgD4AD4TpAAAAigY8IHQEPAl1Bkbr807r44A+AA+E0AAAAIN9CAB0CYtFCINFCASJEP8BM9tDM8nrAkZBgD5cdPmAPiJ1JvbBAXUfg338AHQMjUYBgDgidQSL8OsNM8Az2zlF/A+UwIlF/NHphcl0EkmF0nQExgJcQv8Hhcl18YlVDIoGhMB0VYN9/AB1CDwgdEs8CXRHhdt0PQ++wFCF0nQj6Dnh//9ZhcB0DYoGi00M/0UMiAFG/weLTQyKBv9FDIgB6w3oFuH//1mFwHQDRv8H/weLVQxG6Vb///+F0nQHxgIAQolVDP8Hi00Q6Q7///+LRQheW4XAdAODIAD/AcnDi/9Vi+yD7AxTM9tWVzkdsCtBAHUF6MTo//9oBAEAAL5oKEEAVlOIHWwpQQD/FRTgQAChoCtBAIk1KCBBADvDdAeJRfw4GHUDiXX8i1X8jUX4UFNTjX306Ar+//+LRfiDxAw9////P3NKi030g/n/c0KL+MHnAo0EDzvBcjZQ6IPW//+L8Fk783Qpi1X8jUX4UAP+V1aNffToyf3//4tF+IPEDEijDCBBAIk1ECBBADPA6wODyP9fXlvJw4v/VYvsoXApQQCD7AxTVos1tOBAAFcz2zP/O8N1Lv/Wi/g7+3QMxwVwKUEAAQAAAOsj/xVc4EAAg/h4dQpqAlijcClBAOsFoXApQQCD+AEPhYEAAAA7+3UP/9aL+Dv7dQczwOnKAAAAi8dmOR90DkBAZjkYdflAQGY5GHXyizWw4EAAU1NTK8dT0fhAUFdTU4lF9P/WiUX4O8N0L1DoqdX//1mJRfw7w3QhU1P/dfhQ/3X0V1NT/9aFwHUM/3X86LjW//9ZiV38i138V/8VrOBAAIvD61yD+AJ0BDvDdYL/FajgQACL8DvzD4Ry////OB50CkA4GHX7QDgYdfYrxkBQiUX46ELV//+L+Fk7+3UMVv8VpOBAAOlF/////3X4VlfoqSsAAIPEDFb/FaTgQACLx19eW8nDi/9Vi+wzwDlFCGoAD5TAaAAQAABQ/xW44EAAo3QpQQCFwHUCXcMzwECjhCpBAF3Di/9Vi+yD7BChgBJBAINl+ACDZfwAU1e/TuZAu7sAAP//O8d0DYXDdAn30KOEEkEA62BWjUX4UP8VzOBAAIt1/DN1+P8VyOBAADPw/xWU4EAAM/D/FcTgQAAz8I1F8FD/FcDgQACLRfQzRfAz8Dv3dQe+T+ZAu+sLhfN1B4vGweAQC/CJNYASQQD31ok1hBJBAF5fW8nDi/9Vi+yLRQiD+P51D+gE0v//xwAJAAAAM8Bdw1Yz9jvGfAg7BZAqQQByHOjm0f//VlZWVlbHAAkAAADobtH//4PEFDPA6xqLyIPgH8H5BYsMjaAqQQDB4AYPvkQBBIPgQF5dw6GAEkEAg8gBM8k5BXgpQQAPlMGLwcPMzMzMzMzMzItMJAT3wQMAAAB0JIoBg8EBhMB0TvfBAwAAAHXvBQAAAACNpCQAAAAAjaQkAAAAAIsBuv/+/n4D0IPw/zPCg8EEqQABAYF06ItB/ITAdDKE5HQkqQAA/wB0E6kAAAD/dALrzY1B/4tMJAQrwcONQf6LTCQEK8HDjUH9i0wkBCvBw41B/ItMJAQrwcOL/1WL7IPsEFNWi3UMM9tXi30QO/N1FDv7dhCLRQg7w3QCiRgzwOmDAAAAi0UIO8N0A4MI/4H/////f3Yb6MfQ//9qFl5TU1NTU4kw6FDQ//+DxBSLxutW/3UYjU3w6HO4//+LRfA5WBQPhZwAAABmi0UUuf8AAABmO8F2NjvzdA87+3YLV1NW6Di0//+DxAzodND//8cAKgAAAOhp0P//iwA4Xfx0B4tN+INhcP1fXlvJwzvzdDI7+3cs6EnQ//9qIl5TU1NTU4kw6NLP//+DxBQ4XfwPhHn///+LRfiDYHD96W3///+IBotFCDvDdAbHAAEAAAA4XfwPhCX///+LRfiDYHD96Rn///+NTQxRU1dWagGNTRRRU4ldDP9wBP8VsOBAADvDdBQ5XQwPhV7///+LTQg7y3S9iQHruf8VXOBAAIP4eg+FRP///zvzD4Rn////O/sPhl////9XU1boYbP//4PEDOlP////i/9Vi+xqAP91FP91EP91DP91COh8/v//g8QUXcOL/1WL7IPsEP91DI1N8Og6t///D7ZFCItN8IuJyAAAAA+3BEElAIAAAIB9/AB0B4tN+INhcP3Jw4v/VYvsagD/dQjouf///1lZXcPMVotEJBQLwHUoi0wkEItEJAwz0vfxi9iLRCQI9/GL8IvD92QkEIvIi8b3ZCQQA9HrR4vIi1wkEItUJAyLRCQI0enR29Hq0dgLyXX09/OL8PdkJBSLyItEJBD35gPRcg47VCQMdwhyDztEJAh2CU4rRCQQG1QkFDPbK0QkCBtUJAz32vfYg9oAi8qL04vZi8iLxl7CEACDJYAqQQAAw8zMzFNWV4tUJBCLRCQUi0wkGFVSUFFRaCBpQABk/zUAAAAAoYASQQAzxIlEJAhkiSUAAAAAi0QkMItYCItMJCwzGYtwDIP+/nQ7i1QkNIP6/nQEO/J2Lo00do1csxCLC4lIDIN7BAB1zGgBAQAAi0MI6AIxAAC5AQAAAItDCOgUMQAA67BkjwUAAAAAg8QYX15bw4tMJAT3QQQGAAAAuAEAAAB0M4tEJAiLSAgzyOiitf//VYtoGP9wDP9wEP9wFOg+////g8QMXYtEJAiLVCQQiQK4AwAAAMNVi0wkCIsp/3Ec/3EY/3Eo6BX///+DxAxdwgQAVVZXU4vqM8Az2zPSM/Yz///RW19eXcOL6ovxi8FqAehfMAAAM8Az2zPJM9Iz///mVYvsU1ZXagBqAGjHaUAAUeiXUQAAX15bXcNVi2wkCFJR/3QkFOi0/v//g8QMXcIIAGoMaIj3QADogc3//4Nl5ACLdQg7NXAqQQB3ImoE6MTU//9Zg2X8AFboYQsAAFmJReTHRfz+////6AkAAACLReTojc3//8NqBOi/0///WcOL/1WL7FaLdQiD/uAPh6EAAABTV4s9ZOBAAIM9dClBAAB1GOiB7f//ah7oz+v//2j/AAAA6E23//9ZWaGEKkEAg/gBdQ6F9nQEi8brAzPAQFDrHIP4A3ULVuhT////WYXAdRaF9nUBRoPGD4Pm8FZqAP81dClBAP/Xi9iF23UuagxeOQWAKUEAdBX/dQjoovT//1mFwHQPi3UI6Xv////oTsz//4kw6EfM//+JMF+Lw1vrFFboe/T//1noM8z//8cADAAAADPAXl3DahBoqPdAAOhozP//i10Ihdt1Dv91DOgb////WenMAQAAi3UMhfZ1DFPoY8///1nptwEAAIM9hCpBAAMPhZMBAAAz/4l95IP+4A+HigEAAGoE6HfT//9ZiX38U+g2AgAAWYlF4DvHD4SeAAAAOzVwKkEAd0lWU1DoGAcAAIPEDIXAdAWJXeTrNVbo5wkAAFmJReQ7x3Qni0P8SDvGcgKLxlBT/3Xk6DokAABT6OYBAACJReBTUOgMAgAAg8QYOX3kdUg793UGM/ZGiXUMg8YPg+bwiXUMVlf/NXQpQQD/FWTgQACJReQ7x3Qgi0P8SDvGcgKLxlBT/3Xk6OYjAABT/3Xg6L8BAACDxBTHRfz+////6C4AAACDfeAAdTGF9nUBRoPGD4Pm8Il1DFZTagD/NXQpQQD/FdTgQACL+OsSi3UMi10IagToqNH//1nDi33khf8Phb8AAAA5PYApQQB0LFboBPP//1mFwA+F0v7//+i0yv//OX3gdWyL8P8VXOBAAFDoX8r//1mJButfhf8PhYMAAADoj8r//zl94HRoxwAMAAAA63GF9nUBRlZTagD/NXQpQQD/FdTgQACL+IX/dVY5BYApQQB0NFbom/L//1mFwHQfg/7gds1W6Ivy//9Z6EPK///HAAwAAAAzwOjHyv//w+gwyv//6Xz///+F/3UW6CLK//+L8P8VXOBAAFDo0sn//4kGWYvH69KL/1WL7ItNDFMz2zvLdihq4DPSWPfxO0UQcxzo7cn//1NTU1NTxwAMAAAA6HXJ//+DxBQzwOtBD69NEFZXi/E5XQh0C/91COjIKQAAWYvYVv91COiN/f//i/hZWYX/dBQ73nMQK/NWagAD31PoWK3//4PEDIvHX15bXcOL/1WL7IsNaCpBAKFsKkEAa8kUA8jrEYtVCCtQDIH6AAAQAHIJg8AUO8Fy6zPAXcOL/1WL7IPsEItNCItBEFaLdQxXi/4reQyDxvzB7w+Lz2nJBAIAAI2MAUQBAACJTfCLDkmJTfz2wQEPhdMCAABTjRwxixOJVfSLVvyJVfiLVfSJXQz2wgF1dMH6BEqD+j92A2o/WotLBDtLCHVCuwAAAICD+iBzGYvK0+uNTAIE99MhXLhE/gl1I4tNCCEZ6xyNSuDT641MAgT30yGcuMQAAAD+CXUGi00IIVkEi10Mi1MIi1sEi038A030iVoEi1UMi1oEi1IIiVMIiU38i9HB+gRKg/o/dgNqP1qLXfiD4wGJXfQPhY8AAAArdfiLXfjB+wRqP4l1DEteO952AoveA034i9HB+gRKiU38O9Z2AovWO9p0XotNDItxBDtxCHU7vgAAAICD+yBzF4vL0+731iF0uET+TAMEdSGLTQghMesajUvg0+731iG0uMQAAAD+TAMEdQaLTQghcQSLTQyLcQiLSQSJTgSLTQyLcQSLSQiJTgiLdQzrA4tdCIN99AB1CDvaD4SAAAAAi03wjQzRi1kEiU4IiV4EiXEEi04EiXEIi04EO04IdWCKTAIEiE0P/sGITAIEg/ogcyWAfQ8AdQ6LyrsAAACA0+uLTQgJGbsAAACAi8rT641EuEQJGOspgH0PAHUQjUrguwAAAIDT64tNCAlZBI1K4LoAAACA0+qNhLjEAAAACRCLRfyJBolEMPyLRfD/CA+F8wAAAKF8KUEAhcAPhNgAAACLDXwqQQCLNbzgQABoAEAAAMHhDwNIDLsAgAAAU1H/1osNfCpBAKF8KUEAugAAAIDT6glQCKF8KUEAi0AQiw18KkEAg6SIxAAAAAChfClBAItAEP5IQ6F8KUEAi0gQgHlDAHUJg2AE/qF8KUEAg3gI/3VlU2oA/3AM/9ahfClBAP9wEGoA/zV0KUEA/xVg4EAAiw1oKkEAoXwpQQBryRSLFWwqQQAryI1MEexRjUgUUVDo7SsAAItFCIPEDP8NaCpBADsFfClBAHYEg20IFKFsKkEAo3QqQQCLRQijfClBAIk9fCpBAFtfXsnDoXgqQQBWizVoKkEAVzP/O/B1NIPAEGvAFFD/NWwqQQBX/zV0KUEA/xXU4EAAO8d1BDPA63iDBXgqQQAQizVoKkEAo2wqQQBr9hQDNWwqQQBoxEEAAGoI/zV0KUEA/xVk4EAAiUYQO8d0x2oEaAAgAABoAAAQAFf/FdjgQACJRgw7x3US/3YQV/81dClBAP8VYOBAAOubg04I/4k+iX4E/wVoKkEAi0YQgwj/i8ZfXsOL/1WL7FFRi00Ii0EIU1aLcRBXM9vrAwPAQ4XAffmLw2nABAIAAI2EMEQBAABqP4lF+FqJQAiJQASDwAhKdfRqBIv7aAAQAADB5w8DeQxoAIAAAFf/FdjgQACFwHUIg8j/6Z0AAACNlwBwAACJVfw7+ndDi8orz8HpDI1HEEGDSPj/g4jsDwAA/42Q/A8AAIkQjZD87///x0D88A8AAIlQBMeA6A8AAPAPAAAFABAAAEl1y4tV/ItF+AX4AQAAjU8MiUgEiUEIjUoMiUgIiUEEg2SeRAAz/0eJvJ7EAAAAikZDisj+wYTAi0UIiE5DdQMJeAS6AAAAgIvL0+r30iFQCIvDX15bycOL/1WL7IPsDItNCItBEFNWi3UQV4t9DIvXK1EMg8YXweoPi8ppyQQCAACNjAFEAQAAiU30i0/8g+bwSTvxjXw5/IsfiU0QiV38D45VAQAA9sMBD4VFAQAAA9k78w+POwEAAItN/MH5BEmJTfiD+T92Bmo/WYlN+ItfBDtfCHVDuwAAAICD+SBzGtPri034jUwBBPfTIVyQRP4JdSaLTQghGesfg8Hg0+uLTfiNTAEE99MhnJDEAAAA/gl1BotNCCFZBItPCItfBIlZBItPBIt/CIl5CItNECvOAU38g338AA+OpQAAAIt9/ItNDMH/BE+NTDH8g/8/dgNqP1+LXfSNHPuJXRCLWwSJWQSLXRCJWQiJSwSLWQSJSwiLWQQ7WQh1V4pMBwSITRP+wYhMBwSD/yBzHIB9EwB1DovPuwAAAIDT64tNCAkZjUSQRIvP6yCAfRMAdRCNT+C7AAAAgNPri00ICVkEjYSQxAAAAI1P4LoAAACA0+oJEItVDItN/I1EMvyJCIlMAfzrA4tVDI1GAYlC/IlEMvjpPAEAADPA6TgBAAAPjS8BAACLXQwpdRCNTgGJS/yNXDP8i3UQwf4EToldDIlL/IP+P3YDaj9e9kX8AQ+FgAAAAIt1/MH+BE6D/j92A2o/XotPBDtPCHVCuwAAAICD/iBzGYvO0+uNdAYE99MhXJBE/g51I4tNCCEZ6xyNTuDT641MBgT30yGckMQAAAD+CXUGi00IIVkEi10Mi08Ii3cEiXEEi3cIi08EiXEIi3UQA3X8iXUQwf4EToP+P3YDaj9ei030jQzxi3kEiUsIiXsEiVkEi0sEiVkIi0sEO0sIdVeKTAYEiE0P/sGITAYEg/4gcxyAfQ8AdQ6Lzr8AAACA0++LTQgJOY1EkESLzusggH0PAHUQjU7gvwAAAIDT74tNCAl5BI2EkMQAAACNTuC6AAAAgNPqCRCLRRCJA4lEGPwzwEBfXlvJw4v/VYvsg+wUoWgqQQCLTQhrwBQDBWwqQQCDwReD4fCJTfDB+QRTSYP5IFZXfQuDzv/T7oNN+P/rDYPB4IPK/zP20+qJVfiLDXQqQQCL2esRi1MEizsjVfgj/gvXdQqDwxSJXQg72HLoO9h1f4sdbCpBAOsRi1MEizsjVfgj/gvXdQqDwxSJXQg72XLoO9l1W+sMg3sIAHUKg8MUiV0IO9hy8DvYdTGLHWwqQQDrCYN7CAB1CoPDFIldCDvZcvA72XUV6KD6//+L2IldCIXbdQczwOkJAgAAU+g6+///WYtLEIkBi0MQgzj/dOWJHXQqQQCLQxCLEIlV/IP6/3QUi4yQxAAAAIt8kEQjTfgj/gvPdSmDZfwAi5DEAAAAjUhEizkjVfgj/gvXdQ7/RfyLkYQAAACDwQTr54tV/IvKackEAgAAjYwBRAEAAIlN9ItMkEQz/yPOdRKLjJDEAAAAI034aiBf6wMDyUeFyX35i030i1T5BIsKK03wi/HB/gROg/4/iU34fgNqP1479w+EAQEAAItKBDtKCHVcg/8guwAAAIB9JovP0+uLTfyNfDgE99OJXewjXIhEiVyIRP4PdTOLTeyLXQghC+ssjU/g0+uLTfyNjIjEAAAAjXw4BPfTIRn+D4ld7HULi10Ii03sIUsE6wOLXQiDffgAi0oIi3oEiXkEi0oEi3oIiXkID4SNAAAAi030jQzxi3kEiUoIiXoEiVEEi0oEiVEIi0oEO0oIdV6KTAYEiE0L/sGD/iCITAYEfSOAfQsAdQu/AAAAgIvO0+8JO4vOvwAAAIDT74tN/Al8iETrKYB9CwB1DY1O4L8AAACA0+8JewSLTfyNvIjEAAAAjU7gvgAAAIDT7gk3i034hcl0C4kKiUwR/OsDi034i3XwA9GNTgGJColMMvyLdfSLDo15AYk+hcl1GjsdfClBAHUSi038Ow18KkEAdQeDJXwpQQAAi038iQiNQgRfXlvJw4v/VYvsU1aLdQhXM/+Dy/8793Uc6LW+//9XV1dXV8cAFgAAAOg9vv//g8QUC8PrQvZGDIN0N1boKMP//1aL2OjEKAAAVuizvP//UOjrJwAAg8QQhcB9BYPL/+sRi0YcO8d0ClDozsH//1mJfhyJfgyLw19eW13DagxoyPdAAOiXvv//g03k/zPAi3UIM/879w+VwDvHdR3oMr7//8cAFgAAAFdXV1dX6Lq9//+DxBSDyP/rDPZGDEB0DIl+DItF5Oiavv//w1bolqD//1mJffxW6Cr///9ZiUXkx0X8/v///+gFAAAA69WLdQhW6OSg//9Zw4v/VYvsuOQaAADoOCoAAKGAEkEAM8WJRfyLRQxWM/aJhTTl//+JtTjl//+JtTDl//85dRB1BzPA6ekGAAA7xnUn6Ki9//+JMOiOvf//VlZWVlbHABYAAADoFr3//4PEFIPI/+m+BgAAU1eLfQiLx8H4BY00haAqQQCLBoPnH8HnBgPHilgkAtvQ+4m1KOX//4idJ+X//4D7AnQFgPsBdTCLTRD30fbBAXUm6D+9//8z9okw6CO9//9WVlZWVscAFgAAAOirvP//g8QU6UMGAAD2QAQgdBFqAmoAagD/dQjoYxkAAIPEEP91COjW6v//WYXAD4SdAgAAiwb2RAcEgA+EkAIAAOjr1v//i0BsM8k5SBSNhRzl//8PlMFQiwb/NAeJjSDl////FeDgQACFwA+EYAIAADPJOY0g5f//dAiE2w+EUAIAAP8V3OBAAIudNOX//4mFHOX//zPAiYU85f//OUUQD4ZCBQAAiYVE5f//ioUn5f//hMAPhWcBAACKC4u1KOX//zPAgPkKD5TAiYUg5f//iwYDx4N4OAB0FYpQNIhV9IhN9YNgOABqAo1F9FDrSw++wVDo1+z//1mFwHQ6i4005f//K8sDTRAzwEA7yA+GpQEAAGoCjYVA5f//U1DoPCgAAIPEDIP4/w+EsQQAAEP/hUTl///rG2oBU42FQOX//1DoGCgAAIPEDIP4/w+EjQQAADPAUFBqBY1N9FFqAY2NQOX//1FQ/7Uc5f//Q/+FROX///8VsOBAAIvwhfYPhFwEAABqAI2FPOX//1BWjUX0UIuFKOX//4sA/zQH/xWY4EAAhcAPhCkEAACLhUTl//+LjTDl//8DwTm1POX//4mFOOX//w+MFQQAAIO9IOX//wAPhM0AAABqAI2FPOX//1BqAY1F9FCLhSjl//+LAMZF9A3/NAf/FZjgQACFwA+E0AMAAIO9POX//wEPjM8DAAD/hTDl////hTjl///pgwAAADwBdAQ8AnUhD7czM8lmg/4KD5TBQ0ODhUTl//8CibVA5f//iY0g5f//PAF0BDwCdVL/tUDl///oJSUAAFlmO4VA5f//D4VoAwAAg4U45f//AoO9IOX//wB0KWoNWFCJhUDl///o+CQAAFlmO4VA5f//D4U7AwAA/4U45f///4Uw5f//i0UQOYVE5f//D4L5/f//6ScDAACLDooT/4U45f//iFQPNIsOiUQPOOkOAwAAM8mLBgPH9kAEgA+EvwIAAIuFNOX//4mNQOX//4TbD4XKAAAAiYU85f//OU0QD4YgAwAA6waLtSjl//+LjTzl//+DpUTl//8AK4005f//jYVI5f//O00QczmLlTzl////hTzl//+KEkGA+gp1EP+FMOX//8YADUD/hUTl//+IEED/hUTl//+BvUTl////EwAAcsKL2I2FSOX//yvYagCNhSzl//9QU42FSOX//1CLBv80B/8VmOBAAIXAD4RCAgAAi4Us5f//AYU45f//O8MPjDoCAACLhTzl//8rhTTl//87RRAPgkz////pIAIAAImFROX//4D7Ag+F0QAAADlNEA+GTQIAAOsGi7Uo5f//i41E5f//g6U85f//ACuNNOX//42FSOX//ztNEHNGi5VE5f//g4VE5f//Ag+3EkFBZoP6CnUWg4Uw5f//AmoNW2aJGEBAg4U85f//AoOFPOX//wJmiRBAQIG9POX///4TAABytYvYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhGIBAACLhSzl//8BhTjl//87ww+MWgEAAIuFROX//yuFNOX//ztFEA+CP////+lAAQAAOU0QD4Z8AQAAi41E5f//g6U85f//ACuNNOX//2oCjYVI+f//XjtNEHM8i5VE5f//D7cSAbVE5f//A85mg/oKdQ5qDVtmiRgDxgG1POX//wG1POX//2aJEAPGgb085f//qAYAAHK/M/ZWVmhVDQAAjY3w6///UY2NSPn//yvBmSvC0fhQi8FQVmjp/QAA/xWw4EAAi9g73g+ElwAAAGoAjYUs5f//UIvDK8ZQjYQ18Ov//1CLhSjl//+LAP80B/8VmOBAAIXAdAwDtSzl//873n/L6wz/FVzgQACJhUDl//873n9ci4VE5f//K4U05f//iYU45f//O0UQD4IK////6z9qAI2NLOX//1H/dRD/tTTl////MP8VmOBAAIXAdBWLhSzl//+DpUDl//8AiYU45f//6wz/FVzgQACJhUDl//+DvTjl//8AdWyDvUDl//8AdC1qBV45tUDl//91FOgWt///xwAJAAAA6B63//+JMOs//7VA5f//6CK3//9Z6zGLtSjl//+LBvZEBwRAdA+LhTTl//+AOBp1BDPA6yTo1rb//8cAHAAAAOjetv//gyAAg8j/6wyLhTjl//8rhTDl//9fW4tN/DPNXuhonv//ycNqEGjo90AA6Oi2//+LRQiD+P51G+iitv//gyAA6Ie2///HAAkAAACDyP/pnQAAADP/O8d8CDsFkCpBAHIh6Hm2//+JOOhftv//xwAJAAAAV1dXV1fo57X//4PEFOvJi8jB+QWNHI2gKkEAi/CD5h/B5gaLCw++TDEEg+EBdL9Q6DkkAABZiX38iwP2RDAEAXQW/3UQ/3UM/3UI6C74//+DxAyJReTrFuj8tf//xwAJAAAA6AS2//+JOINN5P/HRfz+////6AkAAACLReToaLb//8P/dQjogyQAAFnDahBoCPhAAOgMtv//i0UIg/j+dRPos7X//8cACQAAAIPI/+mqAAAAM9s7w3wIOwWQKkEAchrokrX//8cACQAAAFNTU1NT6Bq1//+DxBTr0IvIwfkFjTyNoCpBAIvwg+YfweYGiw8PvkwOBIPhAXTGUOhsIwAAWYld/IsH9kQGBAF0Mf91COjgIgAAWVD/FeTgQACFwHUL/xVc4EAAiUXk6wOJXeQ5XeR0Gegxtf//i03kiQjoFLX//8cACQAAAINN5P/HRfz+////6AkAAACLReToh7X//8P/dQjooiMAAFnDi/9Vi+yD7BBTM9s5XQh1HOjWtP//U1NTU1PHABYAAADoXrT//4PEFDPA62pWi3UMO/N1GuiytP//U1NTU1PHABYAAADoOrT//4PEFOsFOXUIcgQzwOs+/3UQjU3w6Fac//+LTfSNRv85WQh0HEg5RQh3Cg+2EPZECh0EdfCLzivIg+EBK/FOi8Y4Xfx0B4tN+INhcP1eW8nDi/9Vi+xqAP91DP91COhV////g8QMXcOL/1WL7IPsFFMz21aLdQg5XRR1EDvzdRA5XQx1EDPA6ecBAAA783QFOV0Mdx7oCbT//2oWXlNTU1NTiTDokrP//4PEFIvG6cABAAA5XRR1BIge68lXi30QO/t1Hoge6Niz//9qFl5TU1NTU4kw6GGz//+DxBTpKAEAAP91GI1N7OiDm///i0XwOVgIdRX/dRRX/3UMVuijCgAAg8QQ6UwBAACDfRT/i1UMi8Z1D4oPiAhARzrLdB9KdfPrGooPiAhARzrLdAhKdAX/TRR17jldFHUDiBhAO9MPhcgAAAA4H3QGg30UAXU1jXj/iX38O/5yHo1F7FCLRfwPtgBQ6DC///9ZWYXAdAj/Tfw5dfxz4ovHK0X8qAEPhcMAAACDfRT/dVqLRQyD+AF2Oo18Bv6JfRQ7/nIhjUXsUItFFA+2AFDo7L7//1lZhcB0CP9NFDl1FHPii0UMi88rTRT2wQF0BIgf6wSIXAb/OF34dAeLRfSDYHD9alBY6Y0AAACIHui3sv//aiJeU1NTU1OJMOhAsv//g8QUOF34dAeLRfSDYHD9i8brZIvIK86D+QJ8TY14/ol9FDv+ch6NRexQi0UUD7YAUOhpvv//WVmFwHQI/00UOXUUc+KLxytFFKgBdByIH+hUsv//i8hqKliJAThd+HQXi030g2Fw/esOOF34dAeLRfSDYHD9M8BfXlvJw4v/VYvsi0UIhcB0EoPoCIE43d0AAHUHUOh4tf//WV3Di/9Vi+yD7BShgBJBADPFiUX8U1Yz21eL8TkdhClBAHU4U1Mz/0dXaGTqQABoAAEAAFP/FfDgQACFwHQIiT2EKUEA6xX/FVzgQACD+Hh1CscFhClBAAIAAAA5XRR+IotNFItFEEk4GHQIQDvLdfaDyf+LRRQrwUg7RRR9AUCJRRShhClBAIP4Ag+ErAEAADvDD4SkAQAAg/gBD4XMAQAAiV34OV0gdQiLBotABIlFIIs17OBAADPAOV0kU1P/dRQPlcD/dRCNBMUBAAAAUP91IP/Wi/g7+w+EjwEAAH5DauAz0lj394P4AnI3jUQ/CD0ABAAAdxPojiMAAIvEO8N0HMcAzMwAAOsRUOgM5P//WTvDdAnHAN3dAACDwAiJRfTrA4ld9Dld9A+EPgEAAFf/dfT/dRT/dRBqAf91IP/WhcAPhOMAAACLNfDgQABTU1f/dfT/dQz/dQj/1ovIiU34O8sPhMIAAAD3RQwABAAAdCk5XRwPhLAAAAA7TRwPj6cAAAD/dRz/dRhX/3X0/3UM/3UI/9bpkAAAADvLfkVq4DPSWPfxg/gCcjmNRAkIPQAEAAB3FujPIgAAi/Q783RqxwbMzAAAg8YI6xpQ6Erj//9ZO8N0CccA3d0AAIPACIvw6wIz9jvzdEH/dfhWV/919P91DP91CP8V8OBAAIXAdCJTUzldHHUEU1PrBv91HP91GP91+FZT/3Ug/xWw4EAAiUX4Vui4/f//Wf919Oiv/f//i0X4WelZAQAAiV30iV3wOV0IdQiLBotAFIlFCDldIHUIiwaLQASJRSD/dQjoICAAAFmJReyD+P91BzPA6SEBAAA7RSAPhNsAAABTU41NFFH/dRBQ/3Ug6D4gAACDxBiJRfQ7w3TUizXo4EAAU1P/dRRQ/3UM/3UI/9aJRfg7w3UHM/bptwAAAH49g/jgdziDwAg9AAQAAHcW6LkhAACL/Dv7dN3HB8zMAACDxwjrGlDoNOL//1k7w3QJxwDd3QAAg8AIi/jrAjP/O/t0tP91+FNX6MCS//+DxAz/dfhX/3UU/3X0/3UM/3UI/9aJRfg7w3UEM/brJf91HI1F+P91GFBX/3Ug/3Xs6I0fAACL8Il18IPEGPfeG/YjdfhX6I38//9Z6xr/dRz/dRj/dRT/dRD/dQz/dQj/FejgQACL8Dld9HQJ/3X06Pix//9Zi0XwO8N0DDlFGHQHUOjlsf//WYvGjWXgX15bi038M83oJ5b//8nDi/9Vi+yD7BD/dQiNTfDoIZb///91KI1N8P91JP91IP91HP91GP91FP91EP91DOgo/P//g8QggH38AHQHi034g2Fw/cnDi/9Vi+xRUaGAEkEAM8WJRfyhiClBAFNWM9tXi/k7w3U6jUX4UDP2RlZoZOpAAFb/FfjgQACFwHQIiTWIKUEA6zT/FVzgQACD+Hh1CmoCWKOIKUEA6wWhiClBAIP4Ag+EzwAAADvDD4THAAAAg/gBD4XoAAAAiV34OV0YdQiLB4tABIlFGIs17OBAADPAOV0gU1P/dRAPlcD/dQyNBMUBAAAAUP91GP/Wi/g7+w+EqwAAAH48gf/w//9/dzSNRD8IPQAEAAB3E+jSHwAAi8Q7w3QcxwDMzAAA6xFQ6FDg//9ZO8N0CccA3d0AAIPACIvYhdt0aY0EP1BqAFPo3pD//4PEDFdT/3UQ/3UMagH/dRj/1oXAdBH/dRRQU/91CP8V+OBAAIlF+FPoyfr//4tF+FnrdTP2OV0cdQiLB4tAFIlFHDldGHUIiweLQASJRRj/dRzoQR0AAFmD+P91BDPA60c7RRh0HlNTjU0QUf91DFD/dRjoaR0AAIvwg8QYO/N03Il1DP91FP91EP91DP91CP91HP8V9OBAAIv4O/N0B1bo5q///1mLx41l7F9eW4tN/DPN6CiU///Jw4v/VYvsg+wQ/3UIjU3w6CKU////dSSNTfD/dSD/dRz/dRj/dRT/dRD/dQzoFv7//4PEHIB9/AB0B4tN+INhcP3Jw4v/VYvsVot1CIX2D4SBAQAA/3YE6Hav////dgjobq////92DOhmr////3YQ6F6v////dhToVq////92GOhOr////zboR6////92IOg/r////3Yk6Dev////dijoL6////92LOgnr////3Yw6B+v////djToF6////92HOgPr////3Y46Aev////djzo/67//4PEQP92QOj0rv///3ZE6Oyu////dkjo5K7///92TOjcrv///3ZQ6NSu////dlTozK7///92WOjErv///3Zc6Lyu////dmDotK7///92ZOisrv///3Zo6KSu////dmzonK7///92cOiUrv///3Z06Iyu////dnjohK7///92fOh8rv//g8RA/7aAAAAA6G6u////toQAAADoY67///+2iAAAAOhYrv///7aMAAAA6E2u////tpAAAADoQq7///+2lAAAAOg3rv///7aYAAAA6Cyu////tpwAAADoIa7///+2oAAAAOgWrv///7akAAAA6Auu////tqgAAADoAK7//4PELF5dw4v/VYvsVot1CIX2dDWLBjsFSB1BAHQHUOjdrf//WYtGBDsFTB1BAHQHUOjLrf//WYt2CDs1UB1BAHQHVui5rf//WV5dw4v/VYvsVot1CIX2dH6LRgw7BVQdQQB0B1Dol63//1mLRhA7BVgdQQB0B1Doha3//1mLRhQ7BVwdQQB0B1Doc63//1mLRhg7BWAdQQB0B1DoYa3//1mLRhw7BWQdQQB0B1DoT63//1mLRiA7BWgdQQB0B1DoPa3//1mLdiQ7NWwdQQB0B1boK63//1leXcOL/1WL7ItFCFMz21ZXO8N0B4t9DDv7dxvooan//2oWXokwU1NTU1PoKqn//4PEFIvG6zyLdRA783UEiBjr2ovQOBp0BEJPdfg7+3Tuig6ICkJGOst0A0918zv7dRCIGOhaqf//aiJZiQiL8eu1M8BfXltdw8zMzMzMzFWL7FYzwFBQUFBQUFBQi1UMjUkAigIKwHQJg8IBD6sEJOvxi3UIg8n/jUkAg8EBigYKwHQJg8YBD6MEJHPui8GDxCBeycOL/1WL7FNWi3UIM9tX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ZXQgZXhpdCBjb2RlIGZyb20gcHJvY2Vzcy4KAABmYWlsZWQgdG8gY3JlYXRlIHByb2Nlc3MuCgAAICVzACVzAABDb3VsZCBub3QgZXhlYyAlcwAAAENhbm5vdCBmaW5kIFB5dGhvbiBleGVjdXRhYmxlICVzCgAAACMhcHl0aG9uLmV4ZQAAAAAjIQAAQ2Fubm90IG9wZW4gJXMKAC1zY3JpcHQucHkAAENvckV4aXRQcm9jZXNzAABtAHMAYwBvAHIAZQBlAC4AZABsAGwAAAAoAG4AdQBsAGwAKQAAAAAAKG51bGwpAAAAAAAABgAABgABAAAQAAMGAAYCEARFRUUFBQUFBTUwAFAAAAAAKCA4UFgHCAA3MDBXUAcAACAgCAAAAAAIYGhgYGBgAAB4cHh4eHgIBwgAAAcACAgIAAAIAAgABwgAAACoIUEAACJBAAAAAAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/AD0AAABFbmNvZGVQb2ludGVyAAAASwBFAFIATgBFAEwAMwAyAC4ARABMAEwAAAAAAERlY29kZVBvaW50ZXIAAABGbHNGcmVlAEZsc1NldFZhbHVlAEZsc0dldFZhbHVlAEZsc0FsbG9jAAAAAHJ1bnRpbWUgZXJyb3IgAAANCgAAVExPU1MgZXJyb3INCgAAAFNJTkcgZXJyb3INCgAAAABET01BSU4gZXJyb3INCgAAUjYwMzQNCkFuIGFwcGxpY2F0aW9uIGhhcyBtYWRlIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgQyBydW50aW1lIGxpYnJhcnkgaW5jb3JyZWN0bHkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAAAAAFI2MDMzDQotIEF0dGVtcHQgdG8gdXNlIE1TSUwgY29kZSBmcm9tIHRoaXMgYXNzZW1ibHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAUjYwMzANCi0gQ1JUIG5vdCBpbml0aWFsaXplZA0KAABSNjAyOA0KLSB1bmFibGUgdG8gaW5pdGlhbGl6ZSBoZWFwDQoAAAAAUjYwMjcNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG93aW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBzdGRpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI1DQotIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsDQoAAABSNjAyNA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBfb25leGl0L2F0ZXhpdCB0YWJsZQ0KAAAAAFI2MDE5DQotIHVuYWJsZSB0byBvcGVuIGNvbnNvbGUgZGV2aWNlDQoAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAUjYwMDgNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgYXJndW1lbnRzDQoAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG5vdCBsb2FkZWQNCgAAAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBSdW50aW1lIExpYnJhcnkAAAAACgoAAC4uLgA8cHJvZ3JhbSBuYW1lIHVua25vd24+AABSdW50aW1lIEVycm9yIQoKUHJvZ3JhbTogAAAAAAAAAAUAAMALAAAAAAAAAB0AAMAEAAAAAAAAAJYAAMAEAAAAAAAAAI0AAMAIAAAAAAAAAI4AAMAIAAAAAAAAAI8AAMAIAAAAAAAAAJAAAMAIAAAAAAAAAJEAAMAIAAAAAAAAAJIAAMAIAAAAAAAAAJMAAMAIAAAAAAAAAAaAgIaAgYAAABADhoCGgoAUBQVFRUWFhYUFAAAwMIBQgIgACAAoJzhQV4AABwA3MDBQUIgAAAAgKICIgIAAAABgaGBoaGgICAd4cHB3cHAICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEBgQGBAYEBgQGBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQABAAEAAQABAAEACCAYIBggGCAYIBggECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAAQABAAEAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAUABQAEAAQABAAEAAQABQAEAAQABAAEAAQABAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAAQEBAQEBAQEBAQEBAQECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEQAAIBAgECAQIBAgECAQIBAgEBAQAAAACAgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWnt8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v9ISDptbTpzcwAAAABkZGRkLCBNTU1NIGRkLCB5eXl5AE1NL2RkL3l5AAAAAFBNAABBTQAARGVjZW1iZXIAAAAATm92ZW1iZXIAAAAAT2N0b2JlcgBTZXB0ZW1iZXIAAABBdWd1c3QAAEp1bHkAAAAASnVuZQAAAABBcHJpbAAAAE1hcmNoAAAARmVicnVhcnkAAAAASmFudWFyeQBEZWMATm92AE9jdABTZXAAQXVnAEp1bABKdW4ATWF5AEFwcgBNYXIARmViAEphbgBTYXR1cmRheQAAAABGcmlkYXkAAFRodXJzZGF5AAAAAFdlZG5lc2RheQAAAFR1ZXNkYXkATW9uZGF5AABTdW5kYXkAAFNhdABGcmkAVGh1AFdlZABUdWUATW9uAFN1bgBHZXRQcm9jZXNzV2luZG93U3RhdGlvbgBHZXRVc2VyT2JqZWN0SW5mb3JtYXRpb25BAAAAR2V0TGFzdEFjdGl2ZVBvcHVwAABHZXRBY3RpdmVXaW5kb3cATWVzc2FnZUJveEEAVVNFUjMyLkRMTAAAU3VuTW9uVHVlV2VkVGh1RnJpU2F0AAAASmFuRmViTWFyQXByTWF5SnVuSnVsQXVnU2VwT2N0Tm92RGVjAAAAAENPTk9VVCQALmNvbQAAAAAuZXhlAAAAAC5iYXQAAAAALmNtZAAAAAAuXAAAU3lzdGVtUm9vdAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIASQQDQ9EAAAwAAANA3AAAgaQAAEJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA1xhAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAAC8I0AAAAAAAP7///8AAAAAzP///wAAAAD+////qSVAAL0lQAAAAAAA/v///wAAAACM////AAAAAP7///88NUAAQDVAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADjOkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAALE7QAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAOz1AAAAAAAAAAAAABz1AAP7///8AAAAA1P///wAAAAD+////AAAAAMA+QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA8z9AAAAAAAD+////AAAAANT///8AAAAA/v///x1BQAA5QUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAC1HQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAA+0pAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABrTkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAK1QQAD+////AAAAALxQQAD+////AAAAANj///8AAAAA/v///wAAAABvUkAA/v///wAAAAB7UkAA/v///wAAAADU////AAAAAP7///8AAAAANVlAAAAAAAD+////AAAAANj///8AAAAA/v///9taQADvWkAAAAAAAP7///8AAAAA2P///wAAAAD+////LVtAADFbQAAAAAAA/v///wAAAADA////AAAAAP7///8AAAAAiF5AAAAAAAD+////AAAAAND///8AAAAA/v///xhfQAAvX0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAClqQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAOmxAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAA+eUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAE6BQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAL4JAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAAklUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAL2XQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAVKFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADLpUAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAAJGnQAAAAAAAAAAAAM2mQAD+////AAAAAND///8AAAAA/v///wAAAABMrkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAGjCQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAC8pAAFT5AAAAAAAAAAAAAA4AAQAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAACU+gAAsPoAAMb6AADc+gAA7voAAAb7AAAc+wAANPsAAEz7AABg+wAAaPsAAHr7AACI+wAAmvsAAKz7AAC8+wAAyvsAANz7AAD0+wAACPwAABz8AAA4/AAAVvwAAGr8AAB6/AAAhvwAAJL8AACe/AAAtvwAAM78AADY/AAA5PwAAPb8AAAE/QAAEP0AAB79AAAo/QAAOP0AAE79AABa/QAAav0AAJL9AACs/QAAxP0AAN79AAD0/QAADv4AABz+AAAq/gAARP4AAFT+AABq/gAAhP4AAJD+AACe/gAArv4AAL7+AADQ/gAA5P4AAPT+AAAK/wAAGv8AACz/AAA+/wAAUP8AAGL/AABu/wAAfP8AAIz/AACi/wAAsv8AAML/AADQ/wAA4v8AAPT/AAAcAAEAKAABADgAAQBKAAEAAAAAAFIBR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AADGAUdldEV4aXRDb2RlUHJvY2VzcwAAbgRXYWl0Rm9yU2luZ2xlT2JqZWN0AJUAQ3JlYXRlUHJvY2Vzc0EAAK8DU2V0Q29uc29sZUN0cmxIYW5kbGVyAPUBR2V0TW9kdWxlRmlsZU5hbWVBAADaAEVudGVyQ3JpdGljYWxTZWN0aW9uAAD0AkxlYXZlQ3JpdGljYWxTZWN0aW9uAAD6AUdldE1vZHVsZUhhbmRsZVcAACsEU2xlZXAAIgJHZXRQcm9jQWRkcmVzcwAABQFFeGl0UHJvY2VzcwBwAUdldENvbW1hbmRMaW5lQQDwA1NldEhhbmRsZUNvdW50AAA+AkdldFN0ZEhhbmRsZQAA2AFHZXRGaWxlVHlwZQA8AkdldFN0YXJ0dXBJbmZvQQC/AERlbGV0ZUNyaXRpY2FsU2VjdGlvbgA3BFRlcm1pbmF0ZVByb2Nlc3MAAKoBR2V0Q3VycmVudFByb2Nlc3MASARVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAB8EU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANYCSXNEZWJ1Z2dlclByZXNlbnQA5wFHZXRMYXN0RXJyb3IAAKYCSGVhcEZyZWUAAKICSGVhcEFsbG9jAFwBR2V0Q1BJbmZvAMUCSW50ZXJsb2NrZWRJbmNyZW1lbnQAAMECSW50ZXJsb2NrZWREZWNyZW1lbnQAAFMBR2V0QUNQAAAUAkdldE9FTUNQAADgAklzVmFsaWRDb2RlUGFnZQA+BFRsc0dldFZhbHVlADwEVGxzQWxsb2MAAD8EVGxzU2V0VmFsdWUAPQRUbHNGcmVlAPQDU2V0TGFzdEVycm9yAACuAUdldEN1cnJlbnRUaHJlYWRJZAAAlwRXcml0ZUZpbGUA9gJMb2FkTGlicmFyeUEAALoCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudABLAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NBAMABR2V0RW52aXJvbm1lbnRTdHJpbmdzAEwBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAhARXaWRlQ2hhclRvTXVsdGlCeXRlAMIBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAApAJIZWFwQ3JlYXRlAABhBFZpcnR1YWxGcmVlAFkDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKsBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAJoDUnRsVW53aW5kAKkCSGVhcFJlQWxsb2MAXgRWaXJ0dWFsQWxsb2MAAIQBR2V0Q29uc29sZUNQAACWAUdldENvbnNvbGVNb2RlAABCAUZsdXNoRmlsZUJ1ZmZlcnMAAOYCTENNYXBTdHJpbmdBAAAfA011bHRpQnl0ZVRvV2lkZUNoYXIA6AJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5mb0EAAOcDU2V0RmlsZVBvaW50ZXIAAKsCSGVhcFNpemUAAEQAQ2xvc2VIYW5kbGUAjARXcml0ZUNvbnNvbGVBAJoBR2V0Q29uc29sZU91dHB1dENQAACWBFdyaXRlQ29uc29sZVcABgRTZXRTdGRIYW5kbGUAAHkAQ3JlYXRlRmlsZUEAUwBDb21wYXJlU3RyaW5nQQAAVgBDb21wYXJlU3RyaW5nVwAA2ANTZXRFbnZpcm9ubWVudFZhcmlhYmxlQQBLRVJORUwzMi5kbGwAAG4DUmVhZEZpbGUAANUDU2V0RW5kT2ZGaWxlAAAmAkdldFByb2Nlc3NIZWFwAADKAUdldEZpbGVBdHRyaWJ1dGVzQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAK0EAAAAAAMArQQABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATuZAu7EZv0TqI0AAAQAAAGziQABc4kAA/////4AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAWAAAAAgAAAAIAAAADAAAAAgAAAAQAAAAYAAAABQAAAA0AAAAGAAAACQAAAAcAAAAMAAAACAAAAAwAAAAJAAAADAAAAAoAAAAHAAAACwAAAAgAAAAMAAAAFgAAAA0AAAAWAAAADwAAAAIAAAAQAAAADQAAABEAAAASAAAAEgAAAAIAAAAhAAAADQAAADUAAAACAAAAQQAAAA0AAABDAAAAAgAAAFAAAAARAAAAUgAAAA0AAABTAAAADQAAAFcAAAAWAAAAWQAAAAsAAABsAAAADQAAAG0AAAAgAAAAcAAAABwAAAByAAAACQAAAAYAAAAWAAAAgAAAAAoAAACBAAAACgAAAIIAAAAJAAAAgwAAABYAAACEAAAADQAAAJEAAAApAAAAngAAAA0AAAChAAAAAgAAAKQAAAALAAAApwAAAA0AAAC3AAAAEQAAAM4AAAACAAAA1wAAAAsAAAAYBwAADAAAAAwAAAAIAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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X2luZm8nLCAnaW5zdGFsbCcsICdpbnN0YWxsX2xpYicsICdyb3RhdGUnLCAnc2F2ZW9wdHMnLAogICAgJ3NkaXN0JywgJ3NldG9wdCcsICd0ZXN0JywgJ2luc3RhbGxfZWdnX2luZm8nLCAnaW5zdGFsbF9zY3JpcHRzJywKICAgICdyZWdpc3RlcicsICdiZGlzdF93aW5pbnN0JywgJ3VwbG9hZF9kb2NzJywgJ3VwbG9hZCcsICdidWlsZF9jbGliJywKICAgICdkaXN0X2luZm8nLApdCgpmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0IGltcG9ydCBiZGlzdAppbXBvcnQgc3lzCgpmcm9tIHNldHVwdG9vbHMuY29tbWFuZCBpbXBvcnQgaW5zdGFsbF9zY3JpcHRzCgppZiAnZWdnJyBub3QgaW4gYmRpc3QuZm9ybWF0X2NvbW1hbmRzOgogICAgYmRpc3QuZm9ybWF0X2NvbW1hbmRbJ2VnZyddID0gKCdiZGlzdF9lZ2cnLCAiUHl0aG9uIC5lZ2cgZmlsZSIpCiAgICBiZGlzdC5mb3JtYXRfY29tbWFuZHMuYXBwZW5kKCdlZ2cnKQoKZGVsIGJkaXN0LCBzeXMKUEsDBBQAAAAAAAAAIQBQ+CPyegkAAHoJAAAzAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2FsaWFzLnB5ZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcAoKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0IGltcG9ydCBlZGl0X2NvbmZpZywgb3B0aW9uX2Jhc2UsIGNvbmZpZ19maWxlCgoKZGVmIHNocXVvdGUoYXJnKToKICAgICIiIlF1b3RlIGFuIGFyZ3VtZW50IGZvciBsYXRlciBwYXJzaW5nIGJ5IHNobGV4LnNwbGl0KCkiIiIKICAgIGZvciBjIGluICciJywgIiciLCAiXFwiLCAiIyI6CiAgICAgICAgaWYgYyBpbiBhcmc6CiAgICAgICAgICAgIHJldHVybiByZXByKGFyZykKICAgIGlmIGFyZy5zcGxpdCgpICE9IFthcmddOgogICAgICAgIHJldHVybiByZXByKGFyZykKICAgIHJldHVybiBhcmcKCgpjbGFzcyBhbGlhcyhvcHRpb25fYmFzZSk6CiAgICAiIiJEZWZpbmUgYSBzaG9ydGN1dCB0aGF0IGludm9rZXMgb25lIG9yIG1vcmUgY29tbWFuZHMiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJkZWZpbmUgYSBzaG9ydGN1dCB0byBpbnZva2Ugb25lIG9yIG1vcmUgY29tbWFuZHMiCiAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IFRydWUKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdyZW1vdmUnLCAncicsICdyZW1vdmUgKHVuc2V0KSB0aGUgYWxpYXMnKSwKICAgIF0gKyBvcHRpb25fYmFzZS51c2VyX29wdGlvbnMKCiAgICBib29sZWFuX29wdGlvbnMgPSBvcHRpb25fYmFzZS5ib29sZWFuX29wdGlvbnMgKyBbJ3JlbW92ZSddCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcHRpb25fYmFzZS5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLmFyZ3MgPSBOb25lCiAgICAgICAgc2VsZi5yZW1vdmUgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3B0aW9uX2Jhc2UuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIGlmIHNlbGYucmVtb3ZlIGFuZCBsZW4oc2VsZi5hcmdzKSAhPSAxOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgZXhhY3RseSBvbmUgYXJndW1lbnQgKHRoZSBhbGlhcyBuYW1lKSB3aGVuICIKICAgICAgICAgICAgICAgICJ1c2luZyAtLXJlbW92ZSIKICAgICAgICAgICAgKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgYWxpYXNlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnYWxpYXNlcycpCgogICAgICAgIGlmIG5vdCBzZWxmLmFyZ3M6CiAgICAgICAgICAgIHByaW50KCJDb21tYW5kIEFsaWFzZXMiKQogICAgICAgICAgICBwcmludCgiLS0tLS0tLS0tLS0tLS0tIikKICAgICAgICAgICAgZm9yIGFsaWFzIGluIGFsaWFzZXM6CiAgICAgICAgICAgICAgICBwcmludCgic2V0dXAucHkgYWxpYXMiLCBmb3JtYXRfYWxpYXMoYWxpYXMsIGFsaWFzZXMpKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZWxpZiBsZW4oc2VsZi5hcmdzKSA9PSAxOgogICAgICAgICAgICBhbGlhcywgPSBzZWxmLmFyZ3MKICAgICAgICAgICAgaWYgc2VsZi5yZW1vdmU6CiAgICAgICAgICAgICAgICBjb21tYW5kID0gTm9uZQogICAgICAgICAgICBlbGlmIGFsaWFzIGluIGFsaWFzZXM6CiAgICAgICAgICAgICAgICBwcmludCgic2V0dXAucHkgYWxpYXMiLCBmb3JtYXRfYWxpYXMoYWxpYXMsIGFsaWFzZXMpKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludCgiTm8gYWxpYXMgZGVmaW5pdGlvbiBmb3VuZCBmb3IgJXIiICUgYWxpYXMpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICBlbHNlOgogICAgICAgICAgICBhbGlhcyA9IHNlbGYuYXJnc1swXQogICAgICAgICAgICBjb21tYW5kID0gJyAnLmpvaW4obWFwKHNocXVvdGUsIHNlbGYuYXJnc1sxOl0pKQoKICAgICAgICBlZGl0X2NvbmZpZyhzZWxmLmZpbGVuYW1lLCB7J2FsaWFzZXMnOiB7YWxpYXM6IGNvbW1hbmR9fSwgc2VsZi5kcnlfcnVuKQoKCmRlZiBmb3JtYXRfYWxpYXMobmFtZSwgYWxpYXNlcyk6CiAgICBzb3VyY2UsIGNvbW1hbmQgPSBhbGlhc2VzW25hbWVdCiAgICBpZiBzb3VyY2UgPT0gY29uZmlnX2ZpbGUoJ2dsb2JhbCcpOgogICAgICAgIHNvdXJjZSA9ICctLWdsb2JhbC1jb25maWcgJwogICAgZWxpZiBzb3VyY2UgPT0gY29uZmlnX2ZpbGUoJ3VzZXInKToKICAgICAgICBzb3VyY2UgPSAnLS11c2VyLWNvbmZpZyAnCiAgICBlbGlmIHNvdXJjZSA9PSBjb25maWdfZmlsZSgnbG9jYWwnKToKICAgICAgICBzb3VyY2UgPSAnJwogICAgZWxzZToKICAgICAgICBzb3VyY2UgPSAnLS1maWxlbmFtZT0lcicgJSBzb3VyY2UKICAgIHJldHVybiBzb3VyY2UgKyBuYW1lICsgJyAnICsgY29tbWFuZApQSwMEFAAAAAAAAAAhAEnMK6FbRgAAW0YAADcAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfZWdnLnB5IiIic2V0dXB0b29scy5jb21tYW5kLmJkaXN0X2VnZwoKQnVpbGQgLmVnZyBkaXN0cmlidXRpb25zIiIiCgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IHJlbW92ZV90cmVlLCBta3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIHR5cGVzIGltcG9ydCBDb2RlVHlwZQppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHRleHR3cmFwCmltcG9ydCBtYXJzaGFsCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgZ2V0X2J1aWxkX3BsYXRmb3JtLCBEaXN0cmlidXRpb24sIGVuc3VyZV9kaXJlY3RvcnkKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBFbnRyeVBvaW50CmZyb20gc2V0dXB0b29scy5leHRlbnNpb24gaW1wb3J0IExpYnJhcnkKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCgp0cnk6CiAgICAjIFB5dGhvbiAyLjcgb3IgPj0zLjIKICAgIGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGF0aCwgZ2V0X3B5dGhvbl92ZXJzaW9uCgogICAgZGVmIF9nZXRfcHVyZWxpYigpOgogICAgICAgIHJldHVybiBnZXRfcGF0aCgicHVyZWxpYiIpCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl9saWIsIGdldF9weXRob25fdmVyc2lvbgoKICAgIGRlZiBfZ2V0X3B1cmVsaWIoKToKICAgICAgICByZXR1cm4gZ2V0X3B5dGhvbl9saWIoRmFsc2UpCgoKZGVmIHN0cmlwX21vZHVsZShmaWxlbmFtZSk6CiAgICBpZiAnLicgaW4gZmlsZW5hbWU6CiAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKVswXQogICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJ21vZHVsZScpOgogICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi02XQogICAgcmV0dXJuIGZpbGVuYW1lCgpkZWYgc29ydGVkX3dhbGsoZGlyKToKICAgICIiIkRvIG9zLndhbGsgaW4gYSByZXByb2R1Y2libGUgd2F5LAogICAgaW5kZXBlbmRlbnQgb2YgaW5kZXRlcm1pbmlzdGljIGZpbGVzeXN0ZW0gcmVhZGRpciBvcmRlcgogICAgIiIiCiAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhkaXIpOgogICAgICAgIGRpcnMuc29ydCgpCiAgICAgICAgZmlsZXMuc29ydCgpCiAgICAgICAgeWllbGQgYmFzZSwgZGlycywgZmlsZXMKCmRlZiB3cml0ZV9zdHViKHJlc291cmNlLCBweWZpbGUpOgogICAgX3N0dWJfdGVtcGxhdGUgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgZGVmIF9fYm9vdHN0cmFwX18oKToKICAgICAgICAgICAgZ2xvYmFsIF9fYm9vdHN0cmFwX18sIF9fbG9hZGVyX18sIF9fZmlsZV9fCiAgICAgICAgICAgIGltcG9ydCBzeXMsIHBrZ19yZXNvdXJjZXMsIGltcAogICAgICAgICAgICBfX2ZpbGVfXyA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoX19uYW1lX18sICVyKQogICAgICAgICAgICBfX2xvYWRlcl9fID0gTm9uZTsgZGVsIF9fYm9vdHN0cmFwX18sIF9fbG9hZGVyX18KICAgICAgICAgICAgaW1wLmxvYWRfZHluYW1pYyhfX25hbWVfXyxfX2ZpbGVfXykKICAgICAgICBfX2Jvb3RzdHJhcF9fKCkKICAgICAgICAiIiIpLmxzdHJpcCgpCiAgICB3aXRoIG9wZW4ocHlmaWxlLCAndycpIGFzIGY6CiAgICAgICAgZi53cml0ZShfc3R1Yl90ZW1wbGF0ZSAlIHJlc291cmNlKQoKCmNsYXNzIGJkaXN0X2VnZyhDb21tYW5kKToKICAgIGRlc2NyaXB0aW9uID0gImNyZWF0ZSBhbiBcImVnZ1wiIGRpc3RyaWJ1dGlvbiIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdiZGlzdC1kaXI9JywgJ2InLAogICAgICAgICAidGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiIpLAogICAgICAgICgncGxhdC1uYW1lPScsICdwJywgInBsYXRmb3JtIG5hbWUgdG8gZW1iZWQgaW4gZ2VuZXJhdGVkIGZpbGVuYW1lcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHQ6ICVzKSIgJSBnZXRfYnVpbGRfcGxhdGZvcm0oKSksCiAgICAgICAgKCdleGNsdWRlLXNvdXJjZS1maWxlcycsIE5vbmUsCiAgICAgICAgICJyZW1vdmUgYWxsIC5weSBmaWxlcyBmcm9tIHRoZSBnZW5lcmF0ZWQgZWdnIiksCiAgICAgICAgKCdrZWVwLXRlbXAnLCAnaycsCiAgICAgICAgICJrZWVwIHRoZSBwc2V1ZG8taW5zdGFsbGF0aW9uIHRyZWUgYXJvdW5kIGFmdGVyICIgKwogICAgICAgICAiY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIiksCiAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsCiAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IGZpbmFsIGJ1aWx0IGRpc3RyaWJ1dGlvbnMgaW4iKSwKICAgICAgICAoJ3NraXAtYnVpbGQnLCBOb25lLAogICAgICAgICAic2tpcCByZWJ1aWxkaW5nIGV2ZXJ5dGhpbmcgKGZvciB0ZXN0aW5nL2RlYnVnZ2luZykiKSwKICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBbCiAgICAgICAgJ2tlZXAtdGVtcCcsICdza2lwLWJ1aWxkJywgJ2V4Y2x1ZGUtc291cmNlLWZpbGVzJwogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBOb25lCiAgICAgICAgc2VsZi5rZWVwX3RlbXAgPSAwCiAgICAgICAgc2VsZi5kaXN0X2RpciA9IE5vbmUKICAgICAgICBzZWxmLnNraXBfYnVpbGQgPSAwCiAgICAgICAgc2VsZi5lZ2dfb3V0cHV0ID0gTm9uZQogICAgICAgIHNlbGYuZXhjbHVkZV9zb3VyY2VfZmlsZXMgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgZWlfY21kID0gc2VsZi5laV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIHNlbGYuZWdnX2luZm8gPSBlaV9jbWQuZWdnX2luZm8KCiAgICAgICAgaWYgc2VsZi5iZGlzdF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgYmRpc3RfYmFzZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdiZGlzdCcpLmJkaXN0X2Jhc2UKICAgICAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBvcy5wYXRoLmpvaW4oYmRpc3RfYmFzZSwgJ2VnZycpCgogICAgICAgIGlmIHNlbGYucGxhdF9uYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYucGxhdF9uYW1lID0gZ2V0X2J1aWxkX3BsYXRmb3JtKCkKCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywgKCdkaXN0X2RpcicsICdkaXN0X2RpcicpKQoKICAgICAgICBpZiBzZWxmLmVnZ19vdXRwdXQgaXMgTm9uZToKCiAgICAgICAgICAgICMgQ29tcHV0ZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGVnZwogICAgICAgICAgICBiYXNlbmFtZSA9IERpc3RyaWJ1dGlvbigKICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUsIGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uLAogICAgICAgICAgICAgICAgZ2V0X3B5dGhvbl92ZXJzaW9uKCksCiAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKSBhbmQgc2VsZi5wbGF0X25hbWUKICAgICAgICAgICAgKS5lZ2dfbmFtZSgpCgogICAgICAgICAgICBzZWxmLmVnZ19vdXRwdXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpciwgYmFzZW5hbWUgKyAnLmVnZycpCgogICAgZGVmIGRvX2luc3RhbGxfZGF0YShzZWxmKToKICAgICAgICAjIEhhY2sgZm9yIHBhY2thZ2VzIHRoYXQgaW5zdGFsbCBkYXRhIHRvIGluc3RhbGwncyAtLWluc3RhbGwtbGliCiAgICAgICAgc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKS5pbnN0YWxsX2xpYiA9IHNlbGYuYmRpc3RfZGlyCgogICAgICAgIHNpdGVfcGFja2FnZXMgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoX2dldF9wdXJlbGliKCkpKQogICAgICAgIG9sZCwgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMsIFtdCgogICAgICAgIGZvciBpdGVtIGluIG9sZDoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCB0dXBsZSkgYW5kIGxlbihpdGVtKSA9PSAyOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2FicyhpdGVtWzBdKToKICAgICAgICAgICAgICAgICAgICByZWFscGF0aCA9IG9zLnBhdGgucmVhbHBhdGgoaXRlbVswXSkKICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkID0gb3MucGF0aC5ub3JtY2FzZShyZWFscGF0aCkKICAgICAgICAgICAgICAgICAgICBpZiBub3JtYWxpemVkID09IHNpdGVfcGFja2FnZXMgb3Igbm9ybWFsaXplZC5zdGFydHN3aXRoKAogICAgICAgICAgICAgICAgICAgICAgICBzaXRlX3BhY2thZ2VzICsgb3Muc2VwCiAgICAgICAgICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHJlYWxwYXRoW2xlbihzaXRlX3BhY2thZ2VzKSArIDE6XSwgaXRlbVsxXQogICAgICAgICAgICAgICAgICAgICAgICAjIFhYWCBlbHNlOiByYWlzZSA/Pz8KICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcy5hcHBlbmQoaXRlbSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyBwYWNrYWdlIGRhdGEgdG8gJXMiLCBzZWxmLmJkaXN0X2RpcikKICAgICAgICAgICAgc2VsZi5jYWxsX2NvbW1hbmQoJ2luc3RhbGxfZGF0YScsIGZvcmNlPTAsIHJvb3Q9Tm9uZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzID0gb2xkCgogICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgogICAgICAgIHJldHVybiBbc2VsZi5lZ2dfb3V0cHV0XQoKICAgIGRlZiBjYWxsX2NvbW1hbmQoc2VsZiwgY21kbmFtZSwgKiprdyk6CiAgICAgICAgIiIiSW52b2tlIHJlaW5pdGlhbGl6ZWQgY29tbWFuZCBgY21kbmFtZWAgd2l0aCBrZXl3b3JkIGFyZ3MiIiIKICAgICAgICBmb3IgZGlybmFtZSBpbiBJTlNUQUxMX0RJUkVDVE9SWV9BVFRSUzoKICAgICAgICAgICAga3cuc2V0ZGVmYXVsdChkaXJuYW1lLCBzZWxmLmJkaXN0X2RpcikKICAgICAgICBrdy5zZXRkZWZhdWx0KCdza2lwX2J1aWxkJywgc2VsZi5za2lwX2J1aWxkKQogICAgICAgIGt3LnNldGRlZmF1bHQoJ2RyeV9ydW4nLCBzZWxmLmRyeV9ydW4pCiAgICAgICAgY21kID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZChjbWRuYW1lLCAqKmt3KQogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoY21kbmFtZSkKICAgICAgICByZXR1cm4gY21kCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAjIEdlbmVyYXRlIG1ldGFkYXRhIGZpcnN0CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgICMgV2UgcnVuIGluc3RhbGxfbGliIGJlZm9yZSBpbnN0YWxsX2RhdGEsIGJlY2F1c2Ugc29tZSBkYXRhIGhhY2tzCiAgICAgICAgIyBwdWxsIHRoZWlyIGRhdGEgcGF0aCBmcm9tIHRoZSBpbnN0YWxsX2xpYiBjb21tYW5kLgogICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIGxpYnJhcnkgY29kZSB0byAlcyIsIHNlbGYuYmRpc3RfZGlyKQogICAgICAgIGluc3RjbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpCiAgICAgICAgb2xkX3Jvb3QgPSBpbnN0Y21kLnJvb3QKICAgICAgICBpbnN0Y21kLnJvb3QgPSBOb25lCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2NfbGlicmFyaWVzKCkgYW5kIG5vdCBzZWxmLnNraXBfYnVpbGQ6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2NsaWInKQogICAgICAgIGNtZCA9IHNlbGYuY2FsbF9jb21tYW5kKCdpbnN0YWxsX2xpYicsIHdhcm5fZGlyPTApCiAgICAgICAgaW5zdGNtZC5yb290ID0gb2xkX3Jvb3QKCiAgICAgICAgYWxsX291dHB1dHMsIGV4dF9vdXRwdXRzID0gc2VsZi5nZXRfZXh0X291dHB1dHMoKQogICAgICAgIHNlbGYuc3R1YnMgPSBbXQogICAgICAgIHRvX2NvbXBpbGUgPSBbXQogICAgICAgIGZvciAocCwgZXh0X25hbWUpIGluIGVudW1lcmF0ZShleHRfb3V0cHV0cyk6CiAgICAgICAgICAgIGZpbGVuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGV4dF9uYW1lKQogICAgICAgICAgICBweWZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9kaXIsIHN0cmlwX21vZHVsZShmaWxlbmFtZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5weScpCiAgICAgICAgICAgIHNlbGYuc3R1YnMuYXBwZW5kKHB5ZmlsZSkKICAgICAgICAgICAgbG9nLmluZm8oImNyZWF0aW5nIHN0dWIgbG9hZGVyIGZvciAlcyIsIGV4dF9uYW1lKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgd3JpdGVfc3R1Yihvcy5wYXRoLmJhc2VuYW1lKGV4dF9uYW1lKSwgcHlmaWxlKQogICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChweWZpbGUpCiAgICAgICAgICAgIGV4dF9vdXRwdXRzW3BdID0gZXh0X25hbWUucmVwbGFjZShvcy5zZXAsICcvJykKCiAgICAgICAgaWYgdG9fY29tcGlsZToKICAgICAgICAgICAgY21kLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXM6CiAgICAgICAgICAgIHNlbGYuZG9faW5zdGFsbF9kYXRhKCkKCiAgICAgICAgIyBNYWtlIHRoZSBFR0ctSU5GTyBkaXJlY3RvcnkKICAgICAgICBhcmNoaXZlX3Jvb3QgPSBzZWxmLmJkaXN0X2RpcgogICAgICAgIGVnZ19pbmZvID0gb3MucGF0aC5qb2luKGFyY2hpdmVfcm9vdCwgJ0VHRy1JTkZPJykKICAgICAgICBzZWxmLm1rcGF0aChlZ2dfaW5mbykKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgogICAgICAgICAgICBzY3JpcHRfZGlyID0gb3MucGF0aC5qb2luKGVnZ19pbmZvLCAnc2NyaXB0cycpCiAgICAgICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIHNjcmlwdHMgdG8gJXMiLCBzY3JpcHRfZGlyKQogICAgICAgICAgICBzZWxmLmNhbGxfY29tbWFuZCgnaW5zdGFsbF9zY3JpcHRzJywgaW5zdGFsbF9kaXI9c2NyaXB0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fZXA9MSkKCiAgICAgICAgc2VsZi5jb3B5X21ldGFkYXRhX3RvKGVnZ19pbmZvKQogICAgICAgIG5hdGl2ZV9saWJzID0gb3MucGF0aC5qb2luKGVnZ19pbmZvLCAibmF0aXZlX2xpYnMudHh0IikKICAgICAgICBpZiBhbGxfb3V0cHV0czoKICAgICAgICAgICAgbG9nLmluZm8oIndyaXRpbmcgJXMiLCBuYXRpdmVfbGlicykKICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkobmF0aXZlX2xpYnMpCiAgICAgICAgICAgICAgICBsaWJzX2ZpbGUgPSBvcGVuKG5hdGl2ZV9saWJzLCAnd3QnKQogICAgICAgICAgICAgICAgbGlic19maWxlLndyaXRlKCdcbicuam9pbihhbGxfb3V0cHV0cykpCiAgICAgICAgICAgICAgICBsaWJzX2ZpbGUud3JpdGUoJ1xuJykKICAgICAgICAgICAgICAgIGxpYnNfZmlsZS5jbG9zZSgpCiAgICAgICAgZWxpZiBvcy5wYXRoLmlzZmlsZShuYXRpdmVfbGlicyk6CiAgICAgICAgICAgIGxvZy5pbmZvKCJyZW1vdmluZyAlcyIsIG5hdGl2ZV9saWJzKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgb3MudW5saW5rKG5hdGl2ZV9saWJzKQoKICAgICAgICB3cml0ZV9zYWZldHlfZmxhZygKICAgICAgICAgICAgb3MucGF0aC5qb2luKGFyY2hpdmVfcm9vdCwgJ0VHRy1JTkZPJyksIHNlbGYuemlwX3NhZmUoKQogICAgICAgICkKCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sICdkZXBlbmRzLnR4dCcpKToKICAgICAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICAgICAiV0FSTklORzogJ2RlcGVuZHMudHh0JyB3aWxsIG5vdCBiZSB1c2VkIGJ5IHNldHVwdG9vbHMgMC42IVxuIgogICAgICAgICAgICAgICAgIlVzZSB0aGUgaW5zdGFsbF9yZXF1aXJlcy9leHRyYXNfcmVxdWlyZSBzZXR1cCgpIGFyZ3MgaW5zdGVhZC4iCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgc2VsZi5leGNsdWRlX3NvdXJjZV9maWxlczoKICAgICAgICAgICAgc2VsZi56YXBfcHlmaWxlcygpCgogICAgICAgICMgTWFrZSB0aGUgYXJjaGl2ZQogICAgICAgIG1ha2VfemlwZmlsZShzZWxmLmVnZ19vdXRwdXQsIGFyY2hpdmVfcm9vdCwgdmVyYm9zZT1zZWxmLnZlcmJvc2UsCiAgICAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuLCBtb2RlPXNlbGYuZ2VuX2hlYWRlcigpKQogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBfdGVtcDoKICAgICAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5iZGlzdF9kaXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQoKICAgICAgICAjIEFkZCB0byAnRGlzdHJpYnV0aW9uLmRpc3RfZmlsZXMnIHNvIHRoYXQgdGhlICJ1cGxvYWQiIGNvbW1hbmQgd29ya3MKICAgICAgICBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAnZGlzdF9maWxlcycsIFtdKS5hcHBlbmQoCiAgICAgICAgICAgICgnYmRpc3RfZWdnJywgZ2V0X3B5dGhvbl92ZXJzaW9uKCksIHNlbGYuZWdnX291dHB1dCkpCgogICAgZGVmIHphcF9weWZpbGVzKHNlbGYpOgogICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyAucHkgZmlsZXMgZnJvbSB0ZW1wb3JhcnkgZGlyZWN0b3J5IikKICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gd2Fsa19lZ2coc2VsZi5iZGlzdF9kaXIpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSwgbmFtZSkKCiAgICAgICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcucHknKToKICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0aW5nICVzIiwgcGF0aCkKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsocGF0aCkKCiAgICAgICAgICAgICAgICBpZiBiYXNlLmVuZHN3aXRoKCdfX3B5Y2FjaGVfXycpOgogICAgICAgICAgICAgICAgICAgIHBhdGhfb2xkID0gcGF0aAoKICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcicoP1A8bmFtZT4uKylcLig/UDxtYWdpYz5bXi5dKylcLnB5YycKICAgICAgICAgICAgICAgICAgICBtID0gcmUubWF0Y2gocGF0dGVybiwgbmFtZSkKICAgICAgICAgICAgICAgICAgICBwYXRoX25ldyA9IG9zLnBhdGguam9pbihiYXNlLCBvcy5wYXJkaXIsIG0uZ3JvdXAoJ25hbWUnKSArICcucHljJykKICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiUmVuYW1pbmcgZmlsZSBmcm9tIFslc10gdG8gWyVzXSIgJSAocGF0aF9vbGQsIHBhdGhfbmV3KSkKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoX25ldykKICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgICAgIG9zLnJlbmFtZShwYXRoX29sZCwgcGF0aF9uZXcpCgoKICAgIGRlZiB6aXBfc2FmZShzZWxmKToKICAgICAgICBzYWZlID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3ppcF9zYWZlJywgTm9uZSkKICAgICAgICBpZiBzYWZlIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2FmZQogICAgICAgIGxvZy53YXJuKCJ6aXBfc2FmZSBmbGFnIG5vdCBzZXQ7IGFuYWx5emluZyBhcmNoaXZlIGNvbnRlbnRzLi4uIikKICAgICAgICByZXR1cm4gYW5hbHl6ZV9lZ2coc2VsZi5iZGlzdF9kaXIsIHNlbGYuc3R1YnMpCgogICAgZGVmIGdlbl9oZWFkZXIoc2VsZik6CiAgICAgICAgZXBtID0gRW50cnlQb2ludC5wYXJzZV9tYXAoc2VsZi5kaXN0cmlidXRpb24uZW50cnlfcG9pbnRzIG9yICcnKQogICAgICAgIGVwID0gZXBtLmdldCgnc2V0dXB0b29scy5pbnN0YWxsYXRpb24nLCB7fSkuZ2V0KCdlZ2dzZWN1dGFibGUnKQogICAgICAgIGlmIGVwIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiAndycgICMgbm90IGFuIGVnZ3NlY3V0YWJsZSwgZG8gaXQgdGhlIHVzdWFsIHdheS4KCiAgICAgICAgaWYgbm90IGVwLmF0dHJzIG9yIGVwLmV4dHJhczoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICJlZ2dzZWN1dGFibGUgZW50cnkgcG9pbnQgKCVyKSBjYW5ub3QgaGF2ZSAnZXh0cmFzJyAiCiAgICAgICAgICAgICAgICAib3IgcmVmZXIgdG8gYSBtb2R1bGUiICUgKGVwLCkKICAgICAgICAgICAgKQoKICAgICAgICBweXZlciA9IHN5cy52ZXJzaW9uWzozXQogICAgICAgIHBrZyA9IGVwLm1vZHVsZV9uYW1lCiAgICAgICAgZnVsbCA9ICcuJy5qb2luKGVwLmF0dHJzKQogICAgICAgIGJhc2UgPSBlcC5hdHRyc1swXQogICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShzZWxmLmVnZ19vdXRwdXQpCgogICAgICAgIGhlYWRlciA9ICgKICAgICAgICAgICAgIiMhL2Jpbi9zaFxuIgogICAgICAgICAgICAnaWYgWyBgYmFzZW5hbWUgJDBgID0gIiUoYmFzZW5hbWUpcyIgXVxuJwogICAgICAgICAgICAndGhlbiBleGVjIHB5dGhvbiUocHl2ZXIpcyAtYyAiJwogICAgICAgICAgICAiaW1wb3J0IHN5cywgb3M7IHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmFic3BhdGgoJyQwJykpOyAiCiAgICAgICAgICAgICJmcm9tICUocGtnKXMgaW1wb3J0ICUoYmFzZSlzOyBzeXMuZXhpdCglKGZ1bGwpcygpKSIKICAgICAgICAgICAgJyIgIiRAIlxuJwogICAgICAgICAgICAnZWxzZVxuJwogICAgICAgICAgICAnICBlY2hvICQwIGlzIG5vdCB0aGUgY29ycmVjdCBuYW1lIGZvciB0aGlzIGVnZyBmaWxlLlxuJwogICAgICAgICAgICAnICBlY2hvIFBsZWFzZSByZW5hbWUgaXQgYmFjayB0byAlKGJhc2VuYW1lKXMgYW5kIHRyeSBhZ2Fpbi5cbicKICAgICAgICAgICAgJyAgZXhlYyBmYWxzZVxuJwogICAgICAgICAgICAnZmlcbicKICAgICAgICApICUgbG9jYWxzKCkKCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgbWtwYXRoKG9zLnBhdGguZGlybmFtZShzZWxmLmVnZ19vdXRwdXQpLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5lZ2dfb3V0cHV0LCAndycpCiAgICAgICAgICAgIGYud3JpdGUoaGVhZGVyKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICByZXR1cm4gJ2EnCgogICAgZGVmIGNvcHlfbWV0YWRhdGFfdG8oc2VsZiwgdGFyZ2V0X2Rpcik6CiAgICAgICAgIkNvcHkgbWV0YWRhdGEgKGVnZyBpbmZvKSB0byB0aGUgdGFyZ2V0X2RpciIKICAgICAgICAjIG5vcm1hbGl6ZSB0aGUgcGF0aCAoc28gdGhhdCBhIGZvcndhcmQtc2xhc2ggaW4gZWdnX2luZm8gd2lsbAogICAgICAgICMgbWF0Y2ggdXNpbmcgc3RhcnRzd2l0aCBiZWxvdykKICAgICAgICBub3JtX2VnZ19pbmZvID0gb3MucGF0aC5ub3JtcGF0aChzZWxmLmVnZ19pbmZvKQogICAgICAgIHByZWZpeCA9IG9zLnBhdGguam9pbihub3JtX2VnZ19pbmZvLCAnJykKICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLmVpX2NtZC5maWxlbGlzdC5maWxlczoKICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKHByZWZpeCk6CiAgICAgICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4odGFyZ2V0X2RpciwgcGF0aFtsZW4ocHJlZml4KTpdKQogICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgICAgICBzZWxmLmNvcHlfZmlsZShwYXRoLCB0YXJnZXQpCgogICAgZGVmIGdldF9leHRfb3V0cHV0cyhzZWxmKToKICAgICAgICAiIiJHZXQgYSBsaXN0IG9mIHJlbGF0aXZlIHBhdGhzIHRvIEMgZXh0ZW5zaW9ucyBpbiB0aGUgb3V0cHV0IGRpc3RybyIiIgoKICAgICAgICBhbGxfb3V0cHV0cyA9IFtdCiAgICAgICAgZXh0X291dHB1dHMgPSBbXQoKICAgICAgICBwYXRocyA9IHtzZWxmLmJkaXN0X2RpcjogJyd9CiAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIHNvcnRlZF93YWxrKHNlbGYuYmRpc3RfZGlyKToKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSlbMV0ubG93ZXIoKSBpbiBOQVRJVkVfRVhURU5TSU9OUzoKICAgICAgICAgICAgICAgICAgICBhbGxfb3V0cHV0cy5hcHBlbmQocGF0aHNbYmFzZV0gKyBmaWxlbmFtZSkKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGRpcnM6CiAgICAgICAgICAgICAgICBwYXRoc1tvcy5wYXRoLmpvaW4oYmFzZSwgZmlsZW5hbWUpXSA9IChwYXRoc1tiYXNlXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSArICcvJykKCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6CiAgICAgICAgICAgIGJ1aWxkX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9leHQnKQogICAgICAgICAgICBmb3IgZXh0IGluIGJ1aWxkX2NtZC5leHRlbnNpb25zOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IGJ1aWxkX2NtZC5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBidWlsZF9jbWQuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKS5zdGFydHN3aXRoKCdkbC0nKToKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9kaXIsIGZpbGVuYW1lKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9vdXRwdXRzLmFwcGVuZChmaWxlbmFtZSkKCiAgICAgICAgcmV0dXJuIGFsbF9vdXRwdXRzLCBleHRfb3V0cHV0cwoKCk5BVElWRV9FWFRFTlNJT05TID0gZGljdC5mcm9ta2V5cygnLmRsbCAuc28gLmR5bGliIC5weWQnLnNwbGl0KCkpCgoKZGVmIHdhbGtfZWdnKGVnZ19kaXIpOgogICAgIiIiV2FsayBhbiB1bnBhY2tlZCBlZ2cncyBjb250ZW50cywgc2tpcHBpbmcgdGhlIG1ldGFkYXRhIGRpcmVjdG9yeSIiIgogICAgd2Fsa2VyID0gc29ydGVkX3dhbGsoZWdnX2RpcikKICAgIGJhc2UsIGRpcnMsIGZpbGVzID0gbmV4dCh3YWxrZXIpCiAgICBpZiAnRUdHLUlORk8nIGluIGRpcnM6CiAgICAgICAgZGlycy5yZW1vdmUoJ0VHRy1JTkZPJykKICAgIHlpZWxkIGJhc2UsIGRpcnMsIGZpbGVzCiAgICBmb3IgYmRmIGluIHdhbGtlcjoKICAgICAgICB5aWVsZCBiZGYKCgpkZWYgYW5hbHl6ZV9lZ2coZWdnX2Rpciwgc3R1YnMpOgogICAgIyBjaGVjayBmb3IgZXhpc3RpbmcgZmxhZyBpbiBFR0ctSU5GTwogICAgZm9yIGZsYWcsIGZuIGluIHNhZmV0eV9mbGFncy5pdGVtcygpOgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihlZ2dfZGlyLCAnRUdHLUlORk8nLCBmbikpOgogICAgICAgICAgICByZXR1cm4gZmxhZwogICAgaWYgbm90IGNhbl9zY2FuKCk6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBzYWZlID0gVHJ1ZQogICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIHdhbGtfZWdnKGVnZ19kaXIpOgogICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgogICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcucHknKSBvciBuYW1lLmVuZHN3aXRoKCcucHl3Jyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbGlmIG5hbWUuZW5kc3dpdGgoJy5weWMnKSBvciBuYW1lLmVuZHN3aXRoKCcucHlvJyk6CiAgICAgICAgICAgICAgICAjIGFsd2F5cyBzY2FuLCBldmVuIGlmIHdlIGFscmVhZHkga25vdyB3ZSdyZSBub3Qgc2FmZQogICAgICAgICAgICAgICAgc2FmZSA9IHNjYW5fbW9kdWxlKGVnZ19kaXIsIGJhc2UsIG5hbWUsIHN0dWJzKSBhbmQgc2FmZQogICAgcmV0dXJuIHNhZmUKCgpkZWYgd3JpdGVfc2FmZXR5X2ZsYWcoZWdnX2Rpciwgc2FmZSk6CiAgICAjIFdyaXRlIG9yIHJlbW92ZSB6aXAgc2FmZXR5IGZsYWcgZmlsZShzKQogICAgZm9yIGZsYWcsIGZuIGluIHNhZmV0eV9mbGFncy5pdGVtcygpOgogICAgICAgIGZuID0gb3MucGF0aC5qb2luKGVnZ19kaXIsIGZuKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuKToKICAgICAgICAgICAgaWYgc2FmZSBpcyBOb25lIG9yIGJvb2woc2FmZSkgIT0gZmxhZzoKICAgICAgICAgICAgICAgIG9zLnVubGluayhmbikKICAgICAgICBlbGlmIHNhZmUgaXMgbm90IE5vbmUgYW5kIGJvb2woc2FmZSkgPT0gZmxhZzoKICAgICAgICAgICAgZiA9IG9wZW4oZm4sICd3dCcpCiAgICAgICAgICAgIGYud3JpdGUoJ1xuJykKICAgICAgICAgICAgZi5jbG9zZSgpCgoKc2FmZXR5X2ZsYWdzID0gewogICAgVHJ1ZTogJ3ppcC1zYWZlJywKICAgIEZhbHNlOiAnbm90LXppcC1zYWZlJywKfQoKCmRlZiBzY2FuX21vZHVsZShlZ2dfZGlyLCBiYXNlLCBuYW1lLCBzdHVicyk6CiAgICAiIiJDaGVjayB3aGV0aGVyIG1vZHVsZSBwb3NzaWJseSB1c2VzIHVuc2FmZS1mb3ItemlwZmlsZSBzdHVmZiIiIgoKICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKGJhc2UsIG5hbWUpCiAgICBpZiBmaWxlbmFtZVs6LTFdIGluIHN0dWJzOgogICAgICAgIHJldHVybiBUcnVlICAjIEV4dGVuc2lvbiBtb2R1bGUKICAgIHBrZyA9IGJhc2VbbGVuKGVnZ19kaXIpICsgMTpdLnJlcGxhY2Uob3Muc2VwLCAnLicpCiAgICBtb2R1bGUgPSBwa2cgKyAocGtnIGFuZCAnLicgb3IgJycpICsgb3MucGF0aC5zcGxpdGV4dChuYW1lKVswXQogICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKToKICAgICAgICBza2lwID0gOCAgIyBza2lwIG1hZ2ljICYgZGF0ZQogICAgZWxzZToKICAgICAgICBza2lwID0gMTIgICMgc2tpcCBtYWdpYyAmIGRhdGUgJiBmaWxlIHNpemUKICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAncmInKQogICAgZi5yZWFkKHNraXApCiAgICBjb2RlID0gbWFyc2hhbC5sb2FkKGYpCiAgICBmLmNsb3NlKCkKICAgIHNhZmUgPSBUcnVlCiAgICBzeW1ib2xzID0gZGljdC5mcm9ta2V5cyhpdGVyX3N5bWJvbHMoY29kZSkpCiAgICBmb3IgYmFkIGluIFsnX19maWxlX18nLCAnX19wYXRoX18nXToKICAgICAgICBpZiBiYWQgaW4gc3ltYm9sczoKICAgICAgICAgICAgbG9nLndhcm4oIiVzOiBtb2R1bGUgcmVmZXJlbmNlcyAlcyIsIG1vZHVsZSwgYmFkKQogICAgICAgICAgICBzYWZlID0gRmFsc2UKICAgIGlmICdpbnNwZWN0JyBpbiBzeW1ib2xzOgogICAgICAgIGZvciBiYWQgaW4gWwogICAgICAgICAgICAnZ2V0c291cmNlJywgJ2dldGFic2ZpbGUnLCAnZ2V0c291cmNlZmlsZScsICdnZXRmaWxlJwogICAgICAgICAgICAnZ2V0c291cmNlbGluZXMnLCAnZmluZHNvdXJjZScsICdnZXRjb21tZW50cycsICdnZXRmcmFtZWluZm8nLAogICAgICAgICAgICAnZ2V0aW5uZXJmcmFtZXMnLCAnZ2V0b3V0ZXJmcmFtZXMnLCAnc3RhY2snLCAndHJhY2UnCiAgICAgICAgXToKICAgICAgICAgICAgaWYgYmFkIGluIHN5bWJvbHM6CiAgICAgICAgICAgICAgICBsb2cud2FybigiJXM6IG1vZHVsZSBNQVkgYmUgdXNpbmcgaW5zcGVjdC4lcyIsIG1vZHVsZSwgYmFkKQogICAgICAgICAgICAgICAgc2FmZSA9IEZhbHNlCiAgICByZXR1cm4gc2FmZQoKCmRlZiBpdGVyX3N5bWJvbHMoY29kZSk6CiAgICAiIiJZaWVsZCBuYW1lcyBhbmQgc3RyaW5ncyB1c2VkIGJ5IGBjb2RlYCBhbmQgaXRzIG5lc3RlZCBjb2RlIG9iamVjdHMiIiIKICAgIGZvciBuYW1lIGluIGNvZGUuY29fbmFtZXM6CiAgICAgICAgeWllbGQgbmFtZQogICAgZm9yIGNvbnN0IGluIGNvZGUuY29fY29uc3RzOgogICAgICAgIGlmIGlzaW5zdGFuY2UoY29uc3QsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB5aWVsZCBjb25zdAogICAgICAgIGVsaWYgaXNpbnN0YW5jZShjb25zdCwgQ29kZVR5cGUpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBpdGVyX3N5bWJvbHMoY29uc3QpOgogICAgICAgICAgICAgICAgeWllbGQgbmFtZQoKCmRlZiBjYW5fc2NhbigpOgogICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJykgYW5kIHN5cy5wbGF0Zm9ybSAhPSAnY2xpJzoKICAgICAgICAjIENQeXRob24sIFB5UHksIGV0Yy4KICAgICAgICByZXR1cm4gVHJ1ZQogICAgbG9nLndhcm4oIlVuYWJsZSB0byBhbmFseXplIGNvbXBpbGVkIGNvZGUgb24gdGhpcyBwbGF0Zm9ybS4iKQogICAgbG9nLndhcm4oIlBsZWFzZSBhc2sgdGhlIGF1dGhvciB0byBpbmNsdWRlIGEgJ3ppcF9zYWZlJyIKICAgICAgICAgICAgICIgc2V0dGluZyAoZWl0aGVyIFRydWUgb3IgRmFsc2UpIGluIHRoZSBwYWNrYWdlJ3Mgc2V0dXAucHkiKQoKCiMgQXR0cmlidXRlIG5hbWVzIG9mIG9wdGlvbnMgZm9yIGNvbW1hbmRzIHRoYXQgbWlnaHQgbmVlZCB0byBiZSBjb252aW5jZWQgdG8KIyBpbnN0YWxsIHRvIHRoZSBlZ2cgYnVpbGQgZGlyZWN0b3J5CgpJTlNUQUxMX0RJUkVDVE9SWV9BVFRSUyA9IFsKICAgICdpbnN0YWxsX2xpYicsICdpbnN0YWxsX2RpcicsICdpbnN0YWxsX2RhdGEnLCAnaW5zdGFsbF9iYXNlJwpdCgoKZGVmIG1ha2VfemlwZmlsZSh6aXBfZmlsZW5hbWUsIGJhc2VfZGlyLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwgY29tcHJlc3M9VHJ1ZSwKICAgICAgICAgICAgICAgICBtb2RlPSd3Jyk6CiAgICAiIiJDcmVhdGUgYSB6aXAgZmlsZSBmcm9tIGFsbCB0aGUgZmlsZXMgdW5kZXIgJ2Jhc2VfZGlyJy4gIFRoZSBvdXRwdXQKICAgIHppcCBmaWxlIHdpbGwgYmUgbmFtZWQgJ2Jhc2VfZGlyJyArICIuemlwIi4gIFVzZXMgZWl0aGVyIHRoZSAiemlwZmlsZSIKICAgIFB5dGhvbiBtb2R1bGUgKGlmIGF2YWlsYWJsZSkgb3IgdGhlIEluZm9aSVAgInppcCIgdXRpbGl0eSAoaWYgaW5zdGFsbGVkCiAgICBhbmQgZm91bmQgb24gdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGgpLiAgSWYgbmVpdGhlciB0b29sIGlzIGF2YWlsYWJsZSwKICAgIHJhaXNlcyBEaXN0dXRpbHNFeGVjRXJyb3IuICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgemlwIGZpbGUuCiAgICAiIiIKICAgIGltcG9ydCB6aXBmaWxlCgogICAgbWtwYXRoKG9zLnBhdGguZGlybmFtZSh6aXBfZmlsZW5hbWUpLCBkcnlfcnVuPWRyeV9ydW4pCiAgICBsb2cuaW5mbygiY3JlYXRpbmcgJyVzJyBhbmQgYWRkaW5nICclcycgdG8gaXQiLCB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyKQoKICAgIGRlZiB2aXNpdCh6LCBkaXJuYW1lLCBuYW1lcyk6CiAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKSkKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CiAgICAgICAgICAgICAgICBwID0gcGF0aFtsZW4oYmFzZV9kaXIpICsgMTpdCiAgICAgICAgICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgICAgICAgICB6LndyaXRlKHBhdGgsIHApCiAgICAgICAgICAgICAgICBsb2cuZGVidWcoImFkZGluZyAnJXMnIiwgcCkKCiAgICBjb21wcmVzc2lvbiA9IHppcGZpbGUuWklQX0RFRkxBVEVEIGlmIGNvbXByZXNzIGVsc2UgemlwZmlsZS5aSVBfU1RPUkVECiAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICB6ID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgbW9kZSwgY29tcHJlc3Npb249Y29tcHJlc3Npb24pCiAgICAgICAgZm9yIGRpcm5hbWUsIGRpcnMsIGZpbGVzIGluIHNvcnRlZF93YWxrKGJhc2VfZGlyKToKICAgICAgICAgICAgdmlzaXQoeiwgZGlybmFtZSwgZmlsZXMpCiAgICAgICAgei5jbG9zZSgpCiAgICBlbHNlOgogICAgICAgIGZvciBkaXJuYW1lLCBkaXJzLCBmaWxlcyBpbiBzb3J0ZWRfd2FsayhiYXNlX2Rpcik6CiAgICAgICAgICAgIHZpc2l0KE5vbmUsIGRpcm5hbWUsIGZpbGVzKQogICAgcmV0dXJuIHppcF9maWxlbmFtZQpQSwMEFAAAAAAAAAAhAOvSdBbkBQAA5AUAADcAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfcnBtLnB5aW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3JwbSBhcyBvcmlnCgoKY2xhc3MgYmRpc3RfcnBtKG9yaWcuYmRpc3RfcnBtKToKICAgICIiIgogICAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmRpc3RfcnBtIGJlaGF2aW9yIHRvIGRvIHRoZSBmb2xsb3dpbmc6CgogICAgMS4gUnVuIGVnZ19pbmZvIHRvIGVuc3VyZSB0aGUgbmFtZSBhbmQgdmVyc2lvbiBhcmUgcHJvcGVybHkgY2FsY3VsYXRlZC4KICAgIDIuIEFsd2F5cyBydW4gJ2luc3RhbGwnIHVzaW5nIC0tc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkIHRvCiAgICAgICBkaXNhYmxlIGVnZ3MgaW4gUlBNIGRpc3RyaWJ1dGlvbnMuCiAgICAzLiBSZXBsYWNlIGRhc2ggd2l0aCB1bmRlcnNjb3JlIGluIHRoZSB2ZXJzaW9uIG51bWJlcnMgZm9yIGJldHRlciBSUE0KICAgICAgIGNvbXBhdGliaWxpdHkuCiAgICAiIiIKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICMgZW5zdXJlIGRpc3RybyBuYW1lIGlzIHVwLXRvLWRhdGUKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgIG9yaWcuYmRpc3RfcnBtLnJ1bihzZWxmKQoKICAgIGRlZiBfbWFrZV9zcGVjX2ZpbGUoc2VsZik6CiAgICAgICAgdmVyc2lvbiA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkKICAgICAgICBycG12ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKCctJywgJ18nKQogICAgICAgIHNwZWMgPSBvcmlnLmJkaXN0X3JwbS5fbWFrZV9zcGVjX2ZpbGUoc2VsZikKICAgICAgICBsaW5lMjMgPSAnJWRlZmluZSB2ZXJzaW9uICcgKyB2ZXJzaW9uCiAgICAgICAgbGluZTI0ID0gJyVkZWZpbmUgdmVyc2lvbiAnICsgcnBtdmVyc2lvbgogICAgICAgIHNwZWMgPSBbCiAgICAgICAgICAgIGxpbmUucmVwbGFjZSgKICAgICAgICAgICAgICAgICJTb3VyY2UwOiAle25hbWV9LSV7dmVyc2lvbn0udGFyIiwKICAgICAgICAgICAgICAgICJTb3VyY2UwOiAle25hbWV9LSV7dW5tYW5nbGVkX3ZlcnNpb259LnRhciIKICAgICAgICAgICAgKS5yZXBsYWNlKAogICAgICAgICAgICAgICAgInNldHVwLnB5IGluc3RhbGwgIiwKICAgICAgICAgICAgICAgICJzZXR1cC5weSBpbnN0YWxsIC0tc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkICIKICAgICAgICAgICAgKS5yZXBsYWNlKAogICAgICAgICAgICAgICAgIiVzZXR1cCIsCiAgICAgICAgICAgICAgICAiJXNldHVwIC1uICV7bmFtZX0tJXt1bm1hbmdsZWRfdmVyc2lvbn0iCiAgICAgICAgICAgICkucmVwbGFjZShsaW5lMjMsIGxpbmUyNCkKICAgICAgICAgICAgZm9yIGxpbmUgaW4gc3BlYwogICAgICAgIF0KICAgICAgICBpbnNlcnRfbG9jID0gc3BlYy5pbmRleChsaW5lMjQpICsgMQogICAgICAgIHVubWFuZ2xlZF92ZXJzaW9uID0gIiVkZWZpbmUgdW5tYW5nbGVkX3ZlcnNpb24gIiArIHZlcnNpb24KICAgICAgICBzcGVjLmluc2VydChpbnNlcnRfbG9jLCB1bm1hbmdsZWRfdmVyc2lvbikKICAgICAgICByZXR1cm4gc3BlYwpQSwMEFAAAAAAAAAAhACCMdRR9AgAAfQIAADsAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weWltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF93aW5pbnN0IGFzIG9yaWcKCgpjbGFzcyBiZGlzdF93aW5pbnN0KG9yaWcuYmRpc3Rfd2luaW5zdCk6CiAgICBkZWYgcmVpbml0aWFsaXplX2NvbW1hbmQoc2VsZiwgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzPTApOgogICAgICAgICIiIgogICAgICAgIFN1cHBsZW1lbnQgcmVpbml0aWFsaXplX2NvbW1hbmQgdG8gd29yayBhcm91bmQKICAgICAgICBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjA4MTkKICAgICAgICAiIiIKICAgICAgICBjbWQgPSBzZWxmLmRpc3RyaWJ1dGlvbi5yZWluaXRpYWxpemVfY29tbWFuZCgKICAgICAgICAgICAgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzKQogICAgICAgIGlmIGNvbW1hbmQgaW4gKCdpbnN0YWxsJywgJ2luc3RhbGxfbGliJyk6CiAgICAgICAgICAgIGNtZC5pbnN0YWxsX2xpYiA9IE5vbmUKICAgICAgICByZXR1cm4gY21kCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLl9pc19ydW5uaW5nID0gVHJ1ZQogICAgICAgIHRyeToKICAgICAgICAgICAgb3JpZy5iZGlzdF93aW5pbnN0LnJ1bihzZWxmKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuX2lzX3J1bm5pbmcgPSBGYWxzZQpQSwMEFAAAAAAAAAAhACcajRuEEQAAhBEAADgAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfY2xpYi5weWltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9jbGliIGFzIG9yaWcKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBzZXR1cHRvb2xzLmRlcF91dGlsIGltcG9ydCBuZXdlcl9wYWlyd2lzZV9ncm91cAoKCmNsYXNzIGJ1aWxkX2NsaWIob3JpZy5idWlsZF9jbGliKToKICAgICIiIgogICAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYnVpbGRfY2xpYiBiZWhhdmlvdXIgdG8gZG8gdGhlIGZvbGxvd2luZzoKCiAgICAxLiBJbXBsZW1lbnQgYSBydWRpbWVudGFyeSB0aW1lc3RhbXAtYmFzZWQgZGVwZW5kZW5jeSBzeXN0ZW0KICAgICAgIHNvICdjb21waWxlKCknIGRvZXNuJ3QgcnVuIGV2ZXJ5IHRpbWUuCiAgICAyLiBBZGQgbW9yZSBrZXlzIHRvIHRoZSAnYnVpbGRfaW5mbycgZGljdGlvbmFyeToKICAgICAgICAqIG9ial9kZXBzIC0gc3BlY2lmeSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggb2JqZWN0IGNvbXBpbGVkLgogICAgICAgICAgICAgICAgICAgICB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgbWFwcGluZyBhIGtleQogICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBzb3VyY2UgZmlsZW5hbWUgdG8gYSBsaXN0IG9mCiAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy4gVXNlIGFuIGVtcHR5IHN0cmluZyBmb3IgZ2xvYmFsCiAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy4KICAgICAgICAqIGNmbGFncyAgIC0gc3BlY2lmeSBhIGxpc3Qgb2YgYWRkaXRpb25hbCBmbGFncyB0byBwYXNzIHRvCiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21waWxlci4KICAgICIiIgoKICAgIGRlZiBidWlsZF9saWJyYXJpZXMoc2VsZiwgbGlicmFyaWVzKToKICAgICAgICBmb3IgKGxpYl9uYW1lLCBidWlsZF9pbmZvKSBpbiBsaWJyYXJpZXM6CiAgICAgICAgICAgIHNvdXJjZXMgPSBidWlsZF9pbmZvLmdldCgnc291cmNlcycpCiAgICAgICAgICAgIGlmIHNvdXJjZXMgaXMgTm9uZSBvciBub3QgaXNpbnN0YW5jZShzb3VyY2VzLCAobGlzdCwgdHVwbGUpKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgImluICdsaWJyYXJpZXMnIG9wdGlvbiAobGlicmFyeSAnJXMnKSwgIgogICAgICAgICAgICAgICAgICAgICAgICInc291cmNlcycgbXVzdCBiZSBwcmVzZW50IGFuZCBtdXN0IGJlICIKICAgICAgICAgICAgICAgICAgICAgICAiYSBsaXN0IG9mIHNvdXJjZSBmaWxlbmFtZXMiICUgbGliX25hbWUpCiAgICAgICAgICAgIHNvdXJjZXMgPSBsaXN0KHNvdXJjZXMpCgogICAgICAgICAgICBsb2cuaW5mbygiYnVpbGRpbmcgJyVzJyBsaWJyYXJ5IiwgbGliX25hbWUpCgogICAgICAgICAgICAjIE1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHRoZSBjb3JyZWN0IHR5cGUuCiAgICAgICAgICAgICMgb2JqX2RlcHMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvZiBrZXlzIGFzIHNvdXJjZXMKICAgICAgICAgICAgIyBhbmQgYSBsaXN0L3R1cGxlIG9mIGZpbGVzIHRoYXQgYXJlIGl0cyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgIG9ial9kZXBzID0gYnVpbGRfaW5mby5nZXQoJ29ial9kZXBzJywgZGljdCgpKQogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvYmpfZGVwcywgZGljdCk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKICAgICAgICAgICAgICAgICAgICAgICAiJ29ial9kZXBzJyBtdXN0IGJlIGEgZGljdGlvbmFyeSBvZiAiCiAgICAgICAgICAgICAgICAgICAgICAgInR5cGUgJ3NvdXJjZTogbGlzdCciICUgbGliX25hbWUpCiAgICAgICAgICAgIGRlcGVuZGVuY2llcyA9IFtdCgogICAgICAgICAgICAjIEdldCB0aGUgZ2xvYmFsIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBzcGVjaWZpZWQgYnkgdGhlICcnIGtleS4KICAgICAgICAgICAgIyBUaGVzZSB3aWxsIGdvIGludG8gZXZlcnkgc291cmNlJ3MgZGVwZW5kZW5jeSBsaXN0LgogICAgICAgICAgICBnbG9iYWxfZGVwcyA9IG9ial9kZXBzLmdldCgnJywgbGlzdCgpKQogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShnbG9iYWxfZGVwcywgKGxpc3QsIHR1cGxlKSk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKICAgICAgICAgICAgICAgICAgICAgICAiJ29ial9kZXBzJyBtdXN0IGJlIGEgZGljdGlvbmFyeSBvZiAiCiAgICAgICAgICAgICAgICAgICAgICAgInR5cGUgJ3NvdXJjZTogbGlzdCciICUgbGliX25hbWUpCgogICAgICAgICAgICAjIEJ1aWxkIHRoZSBsaXN0IHRvIGJlIHVzZWQgYnkgbmV3ZXJfcGFpcndpc2VfZ3JvdXAKICAgICAgICAgICAgIyBlYWNoIHNvdXJjZSB3aWxsIGJlIGF1dG8tYWRkZWQgdG8gaXRzIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgZm9yIHNvdXJjZSBpbiBzb3VyY2VzOgogICAgICAgICAgICAgICAgc3JjX2RlcHMgPSBbc291cmNlXQogICAgICAgICAgICAgICAgc3JjX2RlcHMuZXh0ZW5kKGdsb2JhbF9kZXBzKQogICAgICAgICAgICAgICAgZXh0cmFfZGVwcyA9IG9ial9kZXBzLmdldChzb3VyY2UsIGxpc3QoKSkKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4dHJhX2RlcHMsIChsaXN0LCB0dXBsZSkpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIidvYmpfZGVwcycgbXVzdCBiZSBhIGRpY3Rpb25hcnkgb2YgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSAnc291cmNlOiBsaXN0JyIgJSBsaWJfbmFtZSkKICAgICAgICAgICAgICAgIHNyY19kZXBzLmV4dGVuZChleHRyYV9kZXBzKQogICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFwcGVuZChzcmNfZGVwcykKCiAgICAgICAgICAgIGV4cGVjdGVkX29iamVjdHMgPSBzZWxmLmNvbXBpbGVyLm9iamVjdF9maWxlbmFtZXMoCiAgICAgICAgICAgICAgICAgICAgc291cmNlcywKICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPXNlbGYuYnVpbGRfdGVtcAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIG5ld2VyX3BhaXJ3aXNlX2dyb3VwKGRlcGVuZGVuY2llcywgZXhwZWN0ZWRfb2JqZWN0cykgIT0gKFtdLCBbXSk6CiAgICAgICAgICAgICAgICAjIEZpcnN0LCBjb21waWxlIHRoZSBzb3VyY2UgY29kZSB0byBvYmplY3QgZmlsZXMgaW4gdGhlIGxpYnJhcnkKICAgICAgICAgICAgICAgICMgZGlyZWN0b3J5LiAgKFRoaXMgc2hvdWxkIHByb2JhYmx5IGNoYW5nZSB0byBwdXR0aW5nIG9iamVjdAogICAgICAgICAgICAgICAgIyBmaWxlcyBpbiBhIHRlbXBvcmFyeSBidWlsZCBkaXJlY3RvcnkuKQogICAgICAgICAgICAgICAgbWFjcm9zID0gYnVpbGRfaW5mby5nZXQoJ21hY3JvcycpCiAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnMgPSBidWlsZF9pbmZvLmdldCgnaW5jbHVkZV9kaXJzJykKICAgICAgICAgICAgICAgIGNmbGFncyA9IGJ1aWxkX2luZm8uZ2V0KCdjZmxhZ3MnKQogICAgICAgICAgICAgICAgb2JqZWN0cyA9IHNlbGYuY29tcGlsZXIuY29tcGlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcywKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1zZWxmLmJ1aWxkX3RlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgIG1hY3Jvcz1tYWNyb3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1pbmNsdWRlX2RpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzPWNmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc9c2VsZi5kZWJ1ZwogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAjIE5vdyAibGluayIgdGhlIG9iamVjdCBmaWxlcyB0b2dldGhlciBpbnRvIGEgc3RhdGljIGxpYnJhcnkuCiAgICAgICAgICAgICMgKE9uIFVuaXggYXQgbGVhc3QsIHRoaXMgaXNuJ3QgcmVhbGx5IGxpbmtpbmcgLS0gaXQganVzdAogICAgICAgICAgICAjIGJ1aWxkcyBhbiBhcmNoaXZlLiAgV2hhdGV2ZXIuKQogICAgICAgICAgICBzZWxmLmNvbXBpbGVyLmNyZWF0ZV9zdGF0aWNfbGliKAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX29iamVjdHMsCiAgICAgICAgICAgICAgICAgICAgbGliX25hbWUsCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1zZWxmLmJ1aWxkX2NsaWIsCiAgICAgICAgICAgICAgICAgICAgZGVidWc9c2VsZi5kZWJ1ZwogICAgICAgICAgICAgICAgICAgICkKUEsDBBQAAAAAAAAAIQCRpWnn+TIAAPkyAAA3AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2V4dC5weWltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IGltcApmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0IGFzIF9kdV9idWlsZF9leHQKZnJvbSBkaXN0dXRpbHMuZmlsZV91dGlsIGltcG9ydCBjb3B5X2ZpbGUKZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBuZXdfY29tcGlsZXIKZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBjdXN0b21pemVfY29tcGlsZXIsIGdldF9jb25maWdfdmFyCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVuc2lvbiBpbXBvcnQgTGlicmFyeQpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCnRyeToKICAgICMgQXR0ZW1wdCB0byB1c2UgQ3l0aG9uIGZvciBidWlsZGluZyBleHRlbnNpb25zLCBpZiBhdmFpbGFibGUKICAgIGZyb20gQ3l0aG9uLkRpc3R1dGlscy5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dCBhcyBfYnVpbGRfZXh0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIF9idWlsZF9leHQgPSBfZHVfYnVpbGRfZXh0CgojIG1ha2Ugc3VyZSBfY29uZmlnX3ZhcnMgaXMgaW5pdGlhbGl6ZWQKZ2V0X2NvbmZpZ192YXIoIkxEU0hBUkVEIikKZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBfY29uZmlnX3ZhcnMgYXMgX0NPTkZJR19WQVJTCgoKZGVmIF9jdXN0b21pemVfY29tcGlsZXJfZm9yX3NobGliKGNvbXBpbGVyKToKICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICAjIGJ1aWxkaW5nIC5keWxpYiByZXF1aXJlcyBhZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIG9uIE9TWDsgaGVyZSB3ZQogICAgICAgICMgdGVtcG9yYXJpbHkgc3Vic3RpdHV0ZSB0aGUgcHljb25maWcuaCB2YXJpYWJsZXMgc28gdGhhdCBkaXN0dXRpbHMnCiAgICAgICAgIyAnY3VzdG9taXplX2NvbXBpbGVyJyB1c2VzIHRoZW0gYmVmb3JlIHdlIGJ1aWxkIHRoZSBzaGFyZWQgbGlicmFyaWVzLgogICAgICAgIHRtcCA9IF9DT05GSUdfVkFSUy5jb3B5KCkKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgWFhYIEhlbHAhICBJIGRvbid0IGhhdmUgYW55IGlkZWEgd2hldGhlciB0aGVzZSBhcmUgcmlnaHQuLi4KICAgICAgICAgICAgX0NPTkZJR19WQVJTWydMRFNIQVJFRCddID0gKAogICAgICAgICAgICAgICAgImdjYyAtV2wsLXggLWR5bmFtaWNsaWIgLXVuZGVmaW5lZCBkeW5hbWljX2xvb2t1cCIpCiAgICAgICAgICAgIF9DT05GSUdfVkFSU1snQ0NTSEFSRUQnXSA9ICIgLWR5bmFtaWNsaWIiCiAgICAgICAgICAgIF9DT05GSUdfVkFSU1snU08nXSA9ICIuZHlsaWIiCiAgICAgICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBfQ09ORklHX1ZBUlMuY2xlYXIoKQogICAgICAgICAgICBfQ09ORklHX1ZBUlMudXBkYXRlKHRtcCkKICAgIGVsc2U6CiAgICAgICAgY3VzdG9taXplX2NvbXBpbGVyKGNvbXBpbGVyKQoKCmhhdmVfcnRsZCA9IEZhbHNlCnVzZV9zdHVicyA9IEZhbHNlCmxpYnR5cGUgPSAnc2hhcmVkJwoKaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgdXNlX3N0dWJzID0gVHJ1ZQplbGlmIG9zLm5hbWUgIT0gJ250JzoKICAgIHRyeToKICAgICAgICBpbXBvcnQgZGwKICAgICAgICB1c2Vfc3R1YnMgPSBoYXZlX3J0bGQgPSBoYXNhdHRyKGRsLCAnUlRMRF9OT1cnKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHBhc3MKCmlmX2RsID0gbGFtYmRhIHM6IHMgaWYgaGF2ZV9ydGxkIGVsc2UgJycKCgpkZWYgZ2V0X2FiaTNfc3VmZml4KCk6CiAgICAiIiJSZXR1cm4gdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciBhbiBhYmkzLWNvbXBsaWFudCBFeHRlbnNpb24oKSIiIgogICAgZm9yIHN1ZmZpeCwgXywgXyBpbiAocyBmb3IgcyBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCkgaWYgc1syXSA9PSBpbXAuQ19FWFRFTlNJT04pOgogICAgICAgIGlmICcuYWJpMycgaW4gc3VmZml4OiAgIyBVbml4CiAgICAgICAgICAgIHJldHVybiBzdWZmaXgKICAgICAgICBlbGlmIHN1ZmZpeCA9PSAnLnB5ZCc6ICAjIFdpbmRvd3MKICAgICAgICAgICAgcmV0dXJuIHN1ZmZpeAoKCmNsYXNzIGJ1aWxkX2V4dChfYnVpbGRfZXh0KToKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiQnVpbGQgZXh0ZW5zaW9ucyBpbiBidWlsZCBkaXJlY3RvcnksIHRoZW4gY29weSBpZiAtLWlucGxhY2UiIiIKICAgICAgICBvbGRfaW5wbGFjZSwgc2VsZi5pbnBsYWNlID0gc2VsZi5pbnBsYWNlLCAwCiAgICAgICAgX2J1aWxkX2V4dC5ydW4oc2VsZikKICAgICAgICBzZWxmLmlucGxhY2UgPSBvbGRfaW5wbGFjZQogICAgICAgIGlmIG9sZF9pbnBsYWNlOgogICAgICAgICAgICBzZWxmLmNvcHlfZXh0ZW5zaW9uc190b19zb3VyY2UoKQoKICAgIGRlZiBjb3B5X2V4dGVuc2lvbnNfdG9fc291cmNlKHNlbGYpOgogICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKICAgICAgICAgICAgZnVsbG5hbWUgPSBzZWxmLmdldF9leHRfZnVsbG5hbWUoZXh0Lm5hbWUpCiAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRfZXh0X2ZpbGVuYW1lKGZ1bGxuYW1lKQogICAgICAgICAgICBtb2RwYXRoID0gZnVsbG5hbWUuc3BsaXQoJy4nKQogICAgICAgICAgICBwYWNrYWdlID0gJy4nLmpvaW4obW9kcGF0aFs6LTFdKQogICAgICAgICAgICBwYWNrYWdlX2RpciA9IGJ1aWxkX3B5LmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKQogICAgICAgICAgICBkZXN0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHBhY2thZ2VfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKQogICAgICAgICAgICBzcmNfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsIGZpbGVuYW1lKQoKICAgICAgICAgICAgIyBBbHdheXMgY29weSwgZXZlbiBpZiBzb3VyY2UgaXMgb2xkZXIgdGhhbiBkZXN0aW5hdGlvbiwgdG8gZW5zdXJlCiAgICAgICAgICAgICMgdGhhdCB0aGUgcmlnaHQgZXh0ZW5zaW9ucyBmb3IgdGhlIGN1cnJlbnQgUHl0aG9uL3BsYXRmb3JtIGFyZQogICAgICAgICAgICAjIHVzZWQuCiAgICAgICAgICAgIGNvcHlfZmlsZSgKICAgICAgICAgICAgICAgIHNyY19maWxlbmFtZSwgZGVzdF9maWxlbmFtZSwgdmVyYm9zZT1zZWxmLnZlcmJvc2UsCiAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1bgogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YjoKICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfc3R1YihwYWNrYWdlX2RpciBvciBvcy5jdXJkaXIsIGV4dCwgVHJ1ZSkKCiAgICBkZWYgZ2V0X2V4dF9maWxlbmFtZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgZmlsZW5hbWUgPSBfYnVpbGRfZXh0LmdldF9leHRfZmlsZW5hbWUoc2VsZiwgZnVsbG5hbWUpCiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5leHRfbWFwOgogICAgICAgICAgICBleHQgPSBzZWxmLmV4dF9tYXBbZnVsbG5hbWVdCiAgICAgICAgICAgIHVzZV9hYmkzID0gKAogICAgICAgICAgICAgICAgc2l4LlBZMwogICAgICAgICAgICAgICAgYW5kIGdldGF0dHIoZXh0LCAncHlfbGltaXRlZF9hcGknKQogICAgICAgICAgICAgICAgYW5kIGdldF9hYmkzX3N1ZmZpeCgpCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgdXNlX2FiaTM6CiAgICAgICAgICAgICAgICBzb19leHQgPSBfZ2V0X2NvbmZpZ192YXJfODM3KCdFWFRfU1VGRklYJykKICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi1sZW4oc29fZXh0KV0KICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUgKyBnZXRfYWJpM19zdWZmaXgoKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSk6CiAgICAgICAgICAgICAgICBmbiwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNobGliX2NvbXBpbGVyLmxpYnJhcnlfZmlsZW5hbWUoZm4sIGxpYnR5cGUpCiAgICAgICAgICAgIGVsaWYgdXNlX3N0dWJzIGFuZCBleHQuX2xpbmtzX3RvX2R5bmFtaWM6CiAgICAgICAgICAgICAgICBkLCBmbiA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGQsICdkbC0nICsgZm4pCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBfYnVpbGRfZXh0LmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuc2hsaWJfY29tcGlsZXIgPSBOb25lCiAgICAgICAgc2VsZi5zaGxpYnMgPSBbXQogICAgICAgIHNlbGYuZXh0X21hcCA9IHt9CgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgX2J1aWxkX2V4dC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5leHRlbnNpb25zID0gc2VsZi5leHRlbnNpb25zIG9yIFtdCiAgICAgICAgc2VsZi5jaGVja19leHRlbnNpb25zX2xpc3Qoc2VsZi5leHRlbnNpb25zKQogICAgICAgIHNlbGYuc2hsaWJzID0gW2V4dCBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9ucwogICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCBMaWJyYXJ5KV0KICAgICAgICBpZiBzZWxmLnNobGliczoKICAgICAgICAgICAgc2VsZi5zZXR1cF9zaGxpYl9jb21waWxlcigpCiAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CiAgICAgICAgICAgIGV4dC5fZnVsbF9uYW1lID0gc2VsZi5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQogICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgogICAgICAgICAgICBmdWxsbmFtZSA9IGV4dC5fZnVsbF9uYW1lCiAgICAgICAgICAgIHNlbGYuZXh0X21hcFtmdWxsbmFtZV0gPSBleHQKCiAgICAgICAgICAgICMgZGlzdHV0aWxzIDMuMSB3aWxsIGFsc28gYXNrIGZvciBtb2R1bGUgbmFtZXMKICAgICAgICAgICAgIyBYWFggd2hhdCB0byBkbyB3aXRoIGNvbmZsaWN0cz8KICAgICAgICAgICAgc2VsZi5leHRfbWFwW2Z1bGxuYW1lLnNwbGl0KCcuJylbLTFdXSA9IGV4dAoKICAgICAgICAgICAgbHRkID0gc2VsZi5zaGxpYnMgYW5kIHNlbGYubGlua3NfdG9fZHluYW1pYyhleHQpIG9yIEZhbHNlCiAgICAgICAgICAgIG5zID0gbHRkIGFuZCB1c2Vfc3R1YnMgYW5kIG5vdCBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSkKICAgICAgICAgICAgZXh0Ll9saW5rc190b19keW5hbWljID0gbHRkCiAgICAgICAgICAgIGV4dC5fbmVlZHNfc3R1YiA9IG5zCiAgICAgICAgICAgIGZpbGVuYW1lID0gZXh0Ll9maWxlX25hbWUgPSBzZWxmLmdldF9leHRfZmlsZW5hbWUoZnVsbG5hbWUpCiAgICAgICAgICAgIGxpYmRpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsIGZpbGVuYW1lKSkKICAgICAgICAgICAgaWYgbHRkIGFuZCBsaWJkaXIgbm90IGluIGV4dC5saWJyYXJ5X2RpcnM6CiAgICAgICAgICAgICAgICBleHQubGlicmFyeV9kaXJzLmFwcGVuZChsaWJkaXIpCiAgICAgICAgICAgIGlmIGx0ZCBhbmQgdXNlX3N0dWJzIGFuZCBvcy5jdXJkaXIgbm90IGluIGV4dC5ydW50aW1lX2xpYnJhcnlfZGlyczoKICAgICAgICAgICAgICAgIGV4dC5ydW50aW1lX2xpYnJhcnlfZGlycy5hcHBlbmQob3MuY3VyZGlyKQoKICAgIGRlZiBzZXR1cF9zaGxpYl9jb21waWxlcihzZWxmKToKICAgICAgICBjb21waWxlciA9IHNlbGYuc2hsaWJfY29tcGlsZXIgPSBuZXdfY29tcGlsZXIoCiAgICAgICAgICAgIGNvbXBpbGVyPXNlbGYuY29tcGlsZXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuLCBmb3JjZT1zZWxmLmZvcmNlCiAgICAgICAgKQogICAgICAgIF9jdXN0b21pemVfY29tcGlsZXJfZm9yX3NobGliKGNvbXBpbGVyKQoKICAgICAgICBpZiBzZWxmLmluY2x1ZGVfZGlycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X2luY2x1ZGVfZGlycyhzZWxmLmluY2x1ZGVfZGlycykKICAgICAgICBpZiBzZWxmLmRlZmluZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgIyAnZGVmaW5lJyBvcHRpb24gaXMgYSBsaXN0IG9mIChuYW1lLHZhbHVlKSB0dXBsZXMKICAgICAgICAgICAgZm9yIChuYW1lLCB2YWx1ZSkgaW4gc2VsZi5kZWZpbmU6CiAgICAgICAgICAgICAgICBjb21waWxlci5kZWZpbmVfbWFjcm8obmFtZSwgdmFsdWUpCiAgICAgICAgaWYgc2VsZi51bmRlZiBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIG1hY3JvIGluIHNlbGYudW5kZWY6CiAgICAgICAgICAgICAgICBjb21waWxlci51bmRlZmluZV9tYWNybyhtYWNybykKICAgICAgICBpZiBzZWxmLmxpYnJhcmllcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpYnJhcmllcyhzZWxmLmxpYnJhcmllcykKICAgICAgICBpZiBzZWxmLmxpYnJhcnlfZGlycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpYnJhcnlfZGlycyhzZWxmLmxpYnJhcnlfZGlycykKICAgICAgICBpZiBzZWxmLnJwYXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb21waWxlci5zZXRfcnVudGltZV9saWJyYXJ5X2RpcnMoc2VsZi5ycGF0aCkKICAgICAgICBpZiBzZWxmLmxpbmtfb2JqZWN0cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpbmtfb2JqZWN0cyhzZWxmLmxpbmtfb2JqZWN0cykKCiAgICAgICAgIyBoYWNrIHNvIGRpc3R1dGlscycgYnVpbGRfZXh0ZW5zaW9uKCkgYnVpbGRzIGEgbGlicmFyeSBpbnN0ZWFkCiAgICAgICAgY29tcGlsZXIubGlua19zaGFyZWRfb2JqZWN0ID0gbGlua19zaGFyZWRfb2JqZWN0Ll9fZ2V0X18oY29tcGlsZXIpCgogICAgZGVmIGdldF9leHBvcnRfc3ltYm9scyhzZWxmLCBleHQpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCBMaWJyYXJ5KToKICAgICAgICAgICAgcmV0dXJuIGV4dC5leHBvcnRfc3ltYm9scwogICAgICAgIHJldHVybiBfYnVpbGRfZXh0LmdldF9leHBvcnRfc3ltYm9scyhzZWxmLCBleHQpCgogICAgZGVmIGJ1aWxkX2V4dGVuc2lvbihzZWxmLCBleHQpOgogICAgICAgIGV4dC5fY29udmVydF9weXhfc291cmNlc190b19sYW5nKCkKICAgICAgICBfY29tcGlsZXIgPSBzZWxmLmNvbXBpbGVyCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSk6CiAgICAgICAgICAgICAgICBzZWxmLmNvbXBpbGVyID0gc2VsZi5zaGxpYl9jb21waWxlcgogICAgICAgICAgICBfYnVpbGRfZXh0LmJ1aWxkX2V4dGVuc2lvbihzZWxmLCBleHQpCiAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YjoKICAgICAgICAgICAgICAgIGNtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpLmJ1aWxkX2xpYgogICAgICAgICAgICAgICAgc2VsZi53cml0ZV9zdHViKGNtZCwgZXh0KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuY29tcGlsZXIgPSBfY29tcGlsZXIKCiAgICBkZWYgbGlua3NfdG9fZHluYW1pYyhzZWxmLCBleHQpOgogICAgICAgICIiIlJldHVybiB0cnVlIGlmICdleHQnIGxpbmtzIHRvIGEgZHluYW1pYyBsaWIgaW4gdGhlIHNhbWUgcGFja2FnZSIiIgogICAgICAgICMgWFhYIHRoaXMgc2hvdWxkIGNoZWNrIHRvIGVuc3VyZSB0aGUgbGliIGlzIGFjdHVhbGx5IGJlaW5nIGJ1aWx0CiAgICAgICAgIyBYWFggYXMgZHluYW1pYywgYW5kIG5vdCBqdXN0IHVzaW5nIGEgbG9jYWxseS1mb3VuZCB2ZXJzaW9uIG9yIGEKICAgICAgICAjIFhYWCBzdGF0aWMtY29tcGlsZWQgdmVyc2lvbgogICAgICAgIGxpYm5hbWVzID0gZGljdC5mcm9ta2V5cyhbbGliLl9mdWxsX25hbWUgZm9yIGxpYiBpbiBzZWxmLnNobGlic10pCiAgICAgICAgcGtnID0gJy4nLmpvaW4oZXh0Ll9mdWxsX25hbWUuc3BsaXQoJy4nKVs6LTFdICsgWycnXSkKICAgICAgICByZXR1cm4gYW55KHBrZyArIGxpYm5hbWUgaW4gbGlibmFtZXMgZm9yIGxpYm5hbWUgaW4gZXh0LmxpYnJhcmllcykKCiAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CiAgICAgICAgcmV0dXJuIF9idWlsZF9leHQuZ2V0X291dHB1dHMoc2VsZikgKyBzZWxmLl9fZ2V0X3N0dWJzX291dHB1dHMoKQoKICAgIGRlZiBfX2dldF9zdHVic19vdXRwdXRzKHNlbGYpOgogICAgICAgICMgYXNzZW1ibGUgdGhlIGJhc2UgbmFtZSBmb3IgZWFjaCBleHRlbnNpb24gdGhhdCBuZWVkcyBhIHN0dWIKICAgICAgICBuc19leHRfYmFzZXMgPSAoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2xpYiwgKmV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJykpCiAgICAgICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zCiAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YgogICAgICAgICkKICAgICAgICAjIHBhaXIgZWFjaCBiYXNlIHdpdGggdGhlIGV4dGVuc2lvbgogICAgICAgIHBhaXJzID0gaXRlcnRvb2xzLnByb2R1Y3QobnNfZXh0X2Jhc2VzLCBzZWxmLl9fZ2V0X291dHB1dF9leHRlbnNpb25zKCkpCiAgICAgICAgcmV0dXJuIGxpc3QoYmFzZSArIGZuZXh0IGZvciBiYXNlLCBmbmV4dCBpbiBwYWlycykKCiAgICBkZWYgX19nZXRfb3V0cHV0X2V4dGVuc2lvbnMoc2VsZik6CiAgICAgICAgeWllbGQgJy5weScKICAgICAgICB5aWVsZCAnLnB5YycKICAgICAgICBpZiBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKS5vcHRpbWl6ZToKICAgICAgICAgICAgeWllbGQgJy5weW8nCgogICAgZGVmIHdyaXRlX3N0dWIoc2VsZiwgb3V0cHV0X2RpciwgZXh0LCBjb21waWxlPUZhbHNlKToKICAgICAgICBsb2cuaW5mbygid3JpdGluZyBzdHViIGxvYWRlciBmb3IgJXMgdG8gJXMiLCBleHQuX2Z1bGxfbmFtZSwKICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyKQogICAgICAgIHN0dWJfZmlsZSA9IChvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgKmV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJykpICsKICAgICAgICAgICAgICAgICAgICAgJy5weScpCiAgICAgICAgaWYgY29tcGlsZSBhbmQgb3MucGF0aC5leGlzdHMoc3R1Yl9maWxlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc3R1Yl9maWxlICsgIiBhbHJlYWR5IGV4aXN0cyEgUGxlYXNlIGRlbGV0ZS4iKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGYgPSBvcGVuKHN0dWJfZmlsZSwgJ3cnKQogICAgICAgICAgICBmLndyaXRlKAogICAgICAgICAgICAgICAgJ1xuJy5qb2luKFsKICAgICAgICAgICAgICAgICAgICAiZGVmIF9fYm9vdHN0cmFwX18oKToiLAogICAgICAgICAgICAgICAgICAgICIgICBnbG9iYWwgX19ib290c3RyYXBfXywgX19maWxlX18sIF9fbG9hZGVyX18iLAogICAgICAgICAgICAgICAgICAgICIgICBpbXBvcnQgc3lzLCBvcywgcGtnX3Jlc291cmNlcywgaW1wIiArIGlmX2RsKCIsIGRsIiksCiAgICAgICAgICAgICAgICAgICAgIiAgIF9fZmlsZV9fID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSIKICAgICAgICAgICAgICAgICAgICAiKF9fbmFtZV9fLCVyKSIKICAgICAgICAgICAgICAgICAgICAlIG9zLnBhdGguYmFzZW5hbWUoZXh0Ll9maWxlX25hbWUpLAogICAgICAgICAgICAgICAgICAgICIgICBkZWwgX19ib290c3RyYXBfXyIsCiAgICAgICAgICAgICAgICAgICAgIiAgIGlmICdfX2xvYWRlcl9fJyBpbiBnbG9iYWxzKCk6IiwKICAgICAgICAgICAgICAgICAgICAiICAgICAgIGRlbCBfX2xvYWRlcl9fIiwKICAgICAgICAgICAgICAgICAgICBpZl9kbCgiICAgb2xkX2ZsYWdzID0gc3lzLmdldGRsb3BlbmZsYWdzKCkiKSwKICAgICAgICAgICAgICAgICAgICAiICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpIiwKICAgICAgICAgICAgICAgICAgICAiICAgdHJ5OiIsCiAgICAgICAgICAgICAgICAgICAgIiAgICAgb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkiLAogICAgICAgICAgICAgICAgICAgIGlmX2RsKCIgICAgIHN5cy5zZXRkbG9wZW5mbGFncyhkbC5SVExEX05PVykiKSwKICAgICAgICAgICAgICAgICAgICAiICAgICBpbXAubG9hZF9keW5hbWljKF9fbmFtZV9fLF9fZmlsZV9fKSIsCiAgICAgICAgICAgICAgICAgICAgIiAgIGZpbmFsbHk6IiwKICAgICAgICAgICAgICAgICAgICBpZl9kbCgiICAgICBzeXMuc2V0ZGxvcGVuZmxhZ3Mob2xkX2ZsYWdzKSIpLAogICAgICAgICAgICAgICAgICAgICIgICAgIG9zLmNoZGlyKG9sZF9kaXIpIiwKICAgICAgICAgICAgICAgICAgICAiX19ib290c3RyYXBfXygpIiwKICAgICAgICAgICAgICAgICAgICAiIiAgIyB0ZXJtaW5hbCBcbgogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICBpZiBjb21waWxlOgogICAgICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBieXRlX2NvbXBpbGUKCiAgICAgICAgICAgIGJ5dGVfY29tcGlsZShbc3R1Yl9maWxlXSwgb3B0aW1pemU9MCwKICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPVRydWUsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgICAgICBvcHRpbWl6ZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsX2xpYicpLm9wdGltaXplCiAgICAgICAgICAgIGlmIG9wdGltaXplID4gMDoKICAgICAgICAgICAgICAgIGJ5dGVfY29tcGlsZShbc3R1Yl9maWxlXSwgb3B0aW1pemU9b3B0aW1pemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9VHJ1ZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHN0dWJfZmlsZSkgYW5kIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBvcy51bmxpbmsoc3R1Yl9maWxlKQoKCmlmIHVzZV9zdHVicyBvciBvcy5uYW1lID09ICdudCc6CiAgICAjIEJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMKICAgICMKICAgIGRlZiBsaW5rX3NoYXJlZF9vYmplY3QoCiAgICAgICAgICAgIHNlbGYsIG9iamVjdHMsIG91dHB1dF9saWJuYW1lLCBvdXRwdXRfZGlyPU5vbmUsIGxpYnJhcmllcz1Ob25lLAogICAgICAgICAgICBsaWJyYXJ5X2RpcnM9Tm9uZSwgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwgZXhwb3J0X3N5bWJvbHM9Tm9uZSwKICAgICAgICAgICAgZGVidWc9MCwgZXh0cmFfcHJlYXJncz1Ob25lLCBleHRyYV9wb3N0YXJncz1Ob25lLCBidWlsZF90ZW1wPU5vbmUsCiAgICAgICAgICAgIHRhcmdldF9sYW5nPU5vbmUpOgogICAgICAgIHNlbGYubGluaygKICAgICAgICAgICAgc2VsZi5TSEFSRURfTElCUkFSWSwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsCiAgICAgICAgICAgIG91dHB1dF9kaXIsIGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycywKICAgICAgICAgICAgZXhwb3J0X3N5bWJvbHMsIGRlYnVnLCBleHRyYV9wcmVhcmdzLCBleHRyYV9wb3N0YXJncywKICAgICAgICAgICAgYnVpbGRfdGVtcCwgdGFyZ2V0X2xhbmcKICAgICAgICApCmVsc2U6CiAgICAjIEJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgZXZlcnl3aGVyZSBlbHNlCiAgICBsaWJ0eXBlID0gJ3N0YXRpYycKCiAgICBkZWYgbGlua19zaGFyZWRfb2JqZWN0KAogICAgICAgICAgICBzZWxmLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwgb3V0cHV0X2Rpcj1Ob25lLCBsaWJyYXJpZXM9Tm9uZSwKICAgICAgICAgICAgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsIGV4cG9ydF9zeW1ib2xzPU5vbmUsCiAgICAgICAgICAgIGRlYnVnPTAsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgYnVpbGRfdGVtcD1Ob25lLAogICAgICAgICAgICB0YXJnZXRfbGFuZz1Ob25lKToKICAgICAgICAjIFhYWCB3ZSBuZWVkIHRvIGVpdGhlciBkaXNhbGxvdyB0aGVzZSBhdHRycyBvbiBMaWJyYXJ5IGluc3RhbmNlcywKICAgICAgICAjIG9yIHdhcm4vYWJvcnQgaGVyZSBpZiBzZXQsIG9yIHNvbWV0aGluZy4uLgogICAgICAgICMgbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAogICAgICAgICMgZXhwb3J0X3N5bWJvbHM9Tm9uZSwgZXh0cmFfcHJlYXJncz1Ob25lLCBleHRyYV9wb3N0YXJncz1Ob25lLAogICAgICAgICMgYnVpbGRfdGVtcD1Ob25lCgogICAgICAgIGFzc2VydCBvdXRwdXRfZGlyIGlzIE5vbmUgICMgZGlzdHV0aWxzIGJ1aWxkX2V4dCBkb2Vzbid0IHBhc3MgdGhpcwogICAgICAgIG91dHB1dF9kaXIsIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChvdXRwdXRfbGlibmFtZSkKICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKICAgICAgICBpZiBzZWxmLmxpYnJhcnlfZmlsZW5hbWUoIngiKS5zdGFydHN3aXRoKCdsaWInKToKICAgICAgICAgICAgIyBzdHJpcCAnbGliJyBwcmVmaXg7IHRoaXMgaXMga2x1ZGd5IGlmIHNvbWUgcGxhdGZvcm0gdXNlcwogICAgICAgICAgICAjIGEgZGlmZmVyZW50IHByZWZpeAogICAgICAgICAgICBiYXNlbmFtZSA9IGJhc2VuYW1lWzM6XQoKICAgICAgICBzZWxmLmNyZWF0ZV9zdGF0aWNfbGliKAogICAgICAgICAgICBvYmplY3RzLCBiYXNlbmFtZSwgb3V0cHV0X2RpciwgZGVidWcsIHRhcmdldF9sYW5nCiAgICAgICAgKQoKCmRlZiBfZ2V0X2NvbmZpZ192YXJfODM3KG5hbWUpOgogICAgIiIiCiAgICBJbiBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL3B1bGwvODM3LCB3ZSBkaXNjb3ZlcmVkCiAgICBQeXRob24gMy4zLjAgZXhwb3NlcyB0aGUgZXh0ZW5zaW9uIHN1ZmZpeCB1bmRlciB0aGUgbmFtZSAnU08nLgogICAgIiIiCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMsIDEpOgogICAgICAgIG5hbWUgPSAnU08nCiAgICByZXR1cm4gZ2V0X2NvbmZpZ192YXIobmFtZSkKUEsDBBQAAAAAAAAAIQBARkLcfCUAAHwlAAA2AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX3B5LnB5ZnJvbSBnbG9iIGltcG9ydCBnbG9iCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfcHkgYXMgb3JpZwppbXBvcnQgb3MKaW1wb3J0IGZubWF0Y2gKaW1wb3J0IHRleHR3cmFwCmltcG9ydCBpbwppbXBvcnQgZGlzdHV0aWxzLmVycm9ycwppbXBvcnQgaXRlcnRvb2xzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcCwgZmlsdGVyLCBmaWx0ZXJmYWxzZQoKdHJ5OgogICAgZnJvbSBzZXR1cHRvb2xzLmxpYjJ0bzNfZXggaW1wb3J0IE1peGluMnRvMwpleGNlcHQgSW1wb3J0RXJyb3I6CgogICAgY2xhc3MgTWl4aW4ydG8zOgogICAgICAgIGRlZiBydW5fMnRvMyhzZWxmLCBmaWxlcywgZG9jdGVzdHM9VHJ1ZSk6CiAgICAgICAgICAgICJkbyBub3RoaW5nIgoKCmNsYXNzIGJ1aWxkX3B5KG9yaWcuYnVpbGRfcHksIE1peGluMnRvMyk6CiAgICAiIiJFbmhhbmNlZCAnYnVpbGRfcHknIGNvbW1hbmQgdGhhdCBpbmNsdWRlcyBkYXRhIGZpbGVzIHdpdGggcGFja2FnZXMKCiAgICBUaGUgZGF0YSBmaWxlcyBhcmUgc3BlY2lmaWVkIHZpYSBhICdwYWNrYWdlX2RhdGEnIGFyZ3VtZW50IHRvICdzZXR1cCgpJy4KICAgIFNlZSAnc2V0dXB0b29scy5kaXN0LkRpc3RyaWJ1dGlvbicgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBBbHNvLCB0aGlzIHZlcnNpb24gb2YgdGhlICdidWlsZF9weScgY29tbWFuZCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYm90aAogICAgJ3B5X21vZHVsZXMnIGFuZCAncGFja2FnZXMnIGluIHRoZSBzYW1lIHNldHVwIG9wZXJhdGlvbi4KICAgICIiIgoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuYnVpbGRfcHkuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYucGFja2FnZV9kYXRhID0gc2VsZi5kaXN0cmlidXRpb24ucGFja2FnZV9kYXRhCiAgICAgICAgc2VsZi5leGNsdWRlX3BhY2thZ2VfZGF0YSA9IChzZWxmLmRpc3RyaWJ1dGlvbi5leGNsdWRlX3BhY2thZ2VfZGF0YSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30pCiAgICAgICAgaWYgJ2RhdGFfZmlsZXMnIGluIHNlbGYuX19kaWN0X186CiAgICAgICAgICAgIGRlbCBzZWxmLl9fZGljdF9fWydkYXRhX2ZpbGVzJ10KICAgICAgICBzZWxmLl9fdXBkYXRlZF9maWxlcyA9IFtdCiAgICAgICAgc2VsZi5fX2RvY3Rlc3RzXzJ0bzMgPSBbXQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiQnVpbGQgbW9kdWxlcywgcGFja2FnZXMsIGFuZCBjb3B5IGRhdGEgZmlsZXMgdG8gYnVpbGQgZGlyZWN0b3J5IiIiCiAgICAgICAgaWYgbm90IHNlbGYucHlfbW9kdWxlcyBhbmQgbm90IHNlbGYucGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBzZWxmLnB5X21vZHVsZXM6CiAgICAgICAgICAgIHNlbGYuYnVpbGRfbW9kdWxlcygpCgogICAgICAgIGlmIHNlbGYucGFja2FnZXM6CiAgICAgICAgICAgIHNlbGYuYnVpbGRfcGFja2FnZXMoKQogICAgICAgICAgICBzZWxmLmJ1aWxkX3BhY2thZ2VfZGF0YSgpCgogICAgICAgIHNlbGYucnVuXzJ0bzMoc2VsZi5fX3VwZGF0ZWRfZmlsZXMsIEZhbHNlKQogICAgICAgIHNlbGYucnVuXzJ0bzMoc2VsZi5fX3VwZGF0ZWRfZmlsZXMsIFRydWUpCiAgICAgICAgc2VsZi5ydW5fMnRvMyhzZWxmLl9fZG9jdGVzdHNfMnRvMywgVHJ1ZSkKCiAgICAgICAgIyBPbmx5IGNvbXBpbGUgYWN0dWFsIC5weSBmaWxlcywgdXNpbmcgb3VyIGJhc2UgY2xhc3MnIGlkZWEgb2Ygd2hhdCBvdXIKICAgICAgICAjIG91dHB1dCBmaWxlcyBhcmUuCiAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUob3JpZy5idWlsZF9weS5nZXRfb3V0cHV0cyhzZWxmLCBpbmNsdWRlX2J5dGVjb2RlPTApKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICAibGF6aWx5IGNvbXB1dGUgZGF0YSBmaWxlcyIKICAgICAgICBpZiBhdHRyID09ICdkYXRhX2ZpbGVzJzoKICAgICAgICAgICAgc2VsZi5kYXRhX2ZpbGVzID0gc2VsZi5fZ2V0X2RhdGFfZmlsZXMoKQogICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhX2ZpbGVzCiAgICAgICAgcmV0dXJuIG9yaWcuYnVpbGRfcHkuX19nZXRhdHRyX18oc2VsZiwgYXR0cikKCiAgICBkZWYgYnVpbGRfbW9kdWxlKHNlbGYsIG1vZHVsZSwgbW9kdWxlX2ZpbGUsIHBhY2thZ2UpOgogICAgICAgIGlmIHNpeC5QWTIgYW5kIGlzaW5zdGFuY2UocGFja2FnZSwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICMgYXZvaWQgZXJyb3JzIG9uIFB5dGhvbiAyIHdoZW4gdW5pY29kZSBpcyBwYXNzZWQgKCMxOTApCiAgICAgICAgICAgIHBhY2thZ2UgPSBwYWNrYWdlLnNwbGl0KCcuJykKICAgICAgICBvdXRmaWxlLCBjb3BpZWQgPSBvcmlnLmJ1aWxkX3B5LmJ1aWxkX21vZHVsZShzZWxmLCBtb2R1bGUsIG1vZHVsZV9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UpCiAgICAgICAgaWYgY29waWVkOgogICAgICAgICAgICBzZWxmLl9fdXBkYXRlZF9maWxlcy5hcHBlbmQob3V0ZmlsZSkKICAgICAgICByZXR1cm4gb3V0ZmlsZSwgY29waWVkCgogICAgZGVmIF9nZXRfZGF0YV9maWxlcyhzZWxmKToKICAgICAgICAiIiJHZW5lcmF0ZSBsaXN0IG9mICcocGFja2FnZSxzcmNfZGlyLGJ1aWxkX2RpcixmaWxlbmFtZXMpJyB0dXBsZXMiIiIKICAgICAgICBzZWxmLmFuYWx5emVfbWFuaWZlc3QoKQogICAgICAgIHJldHVybiBsaXN0KG1hcChzZWxmLl9nZXRfcGtnX2RhdGFfZmlsZXMsIHNlbGYucGFja2FnZXMgb3IgKCkpKQoKICAgIGRlZiBfZ2V0X3BrZ19kYXRhX2ZpbGVzKHNlbGYsIHBhY2thZ2UpOgogICAgICAgICMgTG9jYXRlIHBhY2thZ2Ugc291cmNlIGRpcmVjdG9yeQogICAgICAgIHNyY19kaXIgPSBzZWxmLmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKQoKICAgICAgICAjIENvbXB1dGUgcGFja2FnZSBidWlsZCBkaXJlY3RvcnkKICAgICAgICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4oKihbc2VsZi5idWlsZF9saWJdICsgcGFja2FnZS5zcGxpdCgnLicpKSkKCiAgICAgICAgIyBTdHJpcCBkaXJlY3RvcnkgZnJvbSBnbG9iYmVkIGZpbGVuYW1lcwogICAgICAgIGZpbGVuYW1lcyA9IFsKICAgICAgICAgICAgb3MucGF0aC5yZWxwYXRoKGZpbGUsIHNyY19kaXIpCiAgICAgICAgICAgIGZvciBmaWxlIGluIHNlbGYuZmluZF9kYXRhX2ZpbGVzKHBhY2thZ2UsIHNyY19kaXIpCiAgICAgICAgXQogICAgICAgIHJldHVybiBwYWNrYWdlLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcwoKICAgIGRlZiBmaW5kX2RhdGFfZmlsZXMoc2VsZiwgcGFja2FnZSwgc3JjX2Rpcik6CiAgICAgICAgIiIiUmV0dXJuIGZpbGVuYW1lcyBmb3IgcGFja2FnZSdzIGRhdGEgZmlsZXMgaW4gJ3NyY19kaXInIiIiCiAgICAgICAgcGF0dGVybnMgPSBzZWxmLl9nZXRfcGxhdGZvcm1fcGF0dGVybnMoCiAgICAgICAgICAgIHNlbGYucGFja2FnZV9kYXRhLAogICAgICAgICAgICBwYWNrYWdlLAogICAgICAgICAgICBzcmNfZGlyLAogICAgICAgICkKICAgICAgICBnbG9ic19leHBhbmRlZCA9IG1hcChnbG9iLCBwYXR0ZXJucykKICAgICAgICAjIGZsYXR0ZW4gdGhlIGV4cGFuZGVkIGdsb2JzIGludG8gYW4gaXRlcmFibGUgb2YgbWF0Y2hlcwogICAgICAgIGdsb2JzX21hdGNoZXMgPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZShnbG9ic19leHBhbmRlZCkKICAgICAgICBnbG9iX2ZpbGVzID0gZmlsdGVyKG9zLnBhdGguaXNmaWxlLCBnbG9ic19tYXRjaGVzKQogICAgICAgIGZpbGVzID0gaXRlcnRvb2xzLmNoYWluKAogICAgICAgICAgICBzZWxmLm1hbmlmZXN0X2ZpbGVzLmdldChwYWNrYWdlLCBbXSksCiAgICAgICAgICAgIGdsb2JfZmlsZXMsCiAgICAgICAgKQogICAgICAgIHJldHVybiBzZWxmLmV4Y2x1ZGVfZGF0YV9maWxlcyhwYWNrYWdlLCBzcmNfZGlyLCBmaWxlcykKCiAgICBkZWYgYnVpbGRfcGFja2FnZV9kYXRhKHNlbGYpOgogICAgICAgICIiIkNvcHkgZGF0YSBmaWxlcyBpbnRvIGJ1aWxkIGRpcmVjdG9yeSIiIgogICAgICAgIGZvciBwYWNrYWdlLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcyBpbiBzZWxmLmRhdGFfZmlsZXM6CiAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIHNlbGYubWtwYXRoKG9zLnBhdGguZGlybmFtZSh0YXJnZXQpKQogICAgICAgICAgICAgICAgc3JjZmlsZSA9IG9zLnBhdGguam9pbihzcmNfZGlyLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIG91dGYsIGNvcGllZCA9IHNlbGYuY29weV9maWxlKHNyY2ZpbGUsIHRhcmdldCkKICAgICAgICAgICAgICAgIHNyY2ZpbGUgPSBvcy5wYXRoLmFic3BhdGgoc3JjZmlsZSkKICAgICAgICAgICAgICAgIGlmIChjb3BpZWQgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIHNyY2ZpbGUgaW4gc2VsZi5kaXN0cmlidXRpb24uY29udmVydF8ydG8zX2RvY3Rlc3RzKToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZG9jdGVzdHNfMnRvMy5hcHBlbmQob3V0ZikKCiAgICBkZWYgYW5hbHl6ZV9tYW5pZmVzdChzZWxmKToKICAgICAgICBzZWxmLm1hbmlmZXN0X2ZpbGVzID0gbWYgPSB7fQogICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5pbmNsdWRlX3BhY2thZ2VfZGF0YToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc3JjX2RpcnMgPSB7fQogICAgICAgIGZvciBwYWNrYWdlIGluIHNlbGYucGFja2FnZXMgb3IgKCk6CiAgICAgICAgICAgICMgTG9jYXRlIHBhY2thZ2Ugc291cmNlIGRpcmVjdG9yeQogICAgICAgICAgICBzcmNfZGlyc1thc3NlcnRfcmVsYXRpdmUoc2VsZi5nZXRfcGFja2FnZV9kaXIocGFja2FnZSkpXSA9IHBhY2thZ2UKCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgZm9yIHBhdGggaW4gZWlfY21kLmZpbGVsaXN0LmZpbGVzOgogICAgICAgICAgICBkLCBmID0gb3MucGF0aC5zcGxpdChhc3NlcnRfcmVsYXRpdmUocGF0aCkpCiAgICAgICAgICAgIHByZXYgPSBOb25lCiAgICAgICAgICAgIG9sZGYgPSBmCiAgICAgICAgICAgIHdoaWxlIGQgYW5kIGQgIT0gcHJldiBhbmQgZCBub3QgaW4gc3JjX2RpcnM6CiAgICAgICAgICAgICAgICBwcmV2ID0gZAogICAgICAgICAgICAgICAgZCwgZGYgPSBvcy5wYXRoLnNwbGl0KGQpCiAgICAgICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKGRmLCBmKQogICAgICAgICAgICBpZiBkIGluIHNyY19kaXJzOgogICAgICAgICAgICAgICAgaWYgcGF0aC5lbmRzd2l0aCgnLnB5JykgYW5kIGYgPT0gb2xkZjoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAgIyBpdCdzIGEgbW9kdWxlLCBub3QgZGF0YQogICAgICAgICAgICAgICAgbWYuc2V0ZGVmYXVsdChzcmNfZGlyc1tkXSwgW10pLmFwcGVuZChwYXRoKQoKICAgIGRlZiBnZXRfZGF0YV9maWxlcyhzZWxmKToKICAgICAgICBwYXNzICAjIExhemlseSBjb21wdXRlIGRhdGEgZmlsZXMgaW4gX2dldF9kYXRhX2ZpbGVzKCkgZnVuY3Rpb24uCgogICAgZGVmIGNoZWNrX3BhY2thZ2Uoc2VsZiwgcGFja2FnZSwgcGFja2FnZV9kaXIpOgogICAgICAgICIiIkNoZWNrIG5hbWVzcGFjZSBwYWNrYWdlcycgX19pbml0X18gZm9yIGRlY2xhcmVfbmFtZXNwYWNlIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYWNrYWdlc19jaGVja2VkW3BhY2thZ2VdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGluaXRfcHkgPSBvcmlnLmJ1aWxkX3B5LmNoZWNrX3BhY2thZ2Uoc2VsZiwgcGFja2FnZSwgcGFja2FnZV9kaXIpCiAgICAgICAgc2VsZi5wYWNrYWdlc19jaGVja2VkW3BhY2thZ2VdID0gaW5pdF9weQoKICAgICAgICBpZiBub3QgaW5pdF9weSBvciBub3Qgc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICByZXR1cm4gaW5pdF9weQoKICAgICAgICBmb3IgcGtnIGluIHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgaWYgcGtnID09IHBhY2thZ2Ugb3IgcGtnLnN0YXJ0c3dpdGgocGFja2FnZSArICcuJyk6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBpbml0X3B5CgogICAgICAgIHdpdGggaW8ub3Blbihpbml0X3B5LCAncmInKSBhcyBmOgogICAgICAgICAgICBjb250ZW50cyA9IGYucmVhZCgpCiAgICAgICAgaWYgYidkZWNsYXJlX25hbWVzcGFjZScgbm90IGluIGNvbnRlbnRzOgogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIk5hbWVzcGFjZSBwYWNrYWdlIHByb2JsZW06ICVzIGlzIGEgbmFtZXNwYWNlIHBhY2thZ2UsIGJ1dCAiCiAgICAgICAgICAgICAgICAiaXRzXG5fX2luaXRfXy5weSBkb2VzIG5vdCBjYWxsIGRlY2xhcmVfbmFtZXNwYWNlKCkhIFBsZWFzZSAiCiAgICAgICAgICAgICAgICAnZml4IGl0LlxuKFNlZSB0aGUgc2V0dXB0b29scyBtYW51YWwgdW5kZXIgJwogICAgICAgICAgICAgICAgJyJOYW1lc3BhY2UgUGFja2FnZXMiIGZvciBkZXRhaWxzLilcbiInICUgKHBhY2thZ2UsKQogICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGluaXRfcHkKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYucGFja2FnZXNfY2hlY2tlZCA9IHt9CiAgICAgICAgb3JpZy5idWlsZF9weS5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKCiAgICBkZWYgZ2V0X3BhY2thZ2VfZGlyKHNlbGYsIHBhY2thZ2UpOgogICAgICAgIHJlcyA9IG9yaWcuYnVpbGRfcHkuZ2V0X3BhY2thZ2VfZGlyKHNlbGYsIHBhY2thZ2UpCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc3JjX3Jvb3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0cmlidXRpb24uc3JjX3Jvb3QsIHJlcykKICAgICAgICByZXR1cm4gcmVzCgogICAgZGVmIGV4Y2x1ZGVfZGF0YV9maWxlcyhzZWxmLCBwYWNrYWdlLCBzcmNfZGlyLCBmaWxlcyk6CiAgICAgICAgIiIiRmlsdGVyIGZpbGVuYW1lcyBmb3IgcGFja2FnZSdzIGRhdGEgZmlsZXMgaW4gJ3NyY19kaXInIiIiCiAgICAgICAgZmlsZXMgPSBsaXN0KGZpbGVzKQogICAgICAgIHBhdHRlcm5zID0gc2VsZi5fZ2V0X3BsYXRmb3JtX3BhdHRlcm5zKAogICAgICAgICAgICBzZWxmLmV4Y2x1ZGVfcGFja2FnZV9kYXRhLAogICAgICAgICAgICBwYWNrYWdlLAogICAgICAgICAgICBzcmNfZGlyLAogICAgICAgICkKICAgICAgICBtYXRjaF9ncm91cHMgPSAoCiAgICAgICAgICAgIGZubWF0Y2guZmlsdGVyKGZpbGVzLCBwYXR0ZXJuKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJucwogICAgICAgICkKICAgICAgICAjIGZsYXR0ZW4gdGhlIGdyb3VwcyBvZiBtYXRjaGVzIGludG8gYW4gaXRlcmFibGUgb2YgbWF0Y2hlcwogICAgICAgIG1hdGNoZXMgPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZShtYXRjaF9ncm91cHMpCiAgICAgICAgYmFkID0gc2V0KG1hdGNoZXMpCiAgICAgICAga2VlcGVycyA9ICgKICAgICAgICAgICAgZm4KICAgICAgICAgICAgZm9yIGZuIGluIGZpbGVzCiAgICAgICAgICAgIGlmIGZuIG5vdCBpbiBiYWQKICAgICAgICApCiAgICAgICAgIyBkaXRjaCBkdXBlcwogICAgICAgIHJldHVybiBsaXN0KF91bmlxdWVfZXZlcnNlZW4oa2VlcGVycykpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9nZXRfcGxhdGZvcm1fcGF0dGVybnMoc3BlYywgcGFja2FnZSwgc3JjX2Rpcik6CiAgICAgICAgIiIiCiAgICAgICAgeWllbGQgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aCBwYXR0ZXJucyAoc3VpdGFibGUgZm9yIGdsb2IKICAgICAgICBvciBmbl9tYXRjaCkgZnJvbSBhIGdsb2ItYmFzZWQgc3BlYyAoc3VjaCBhcwogICAgICAgIHNlbGYucGFja2FnZV9kYXRhIG9yIHNlbGYuZXhjbHVkZV9wYWNrYWdlX2RhdGEpCiAgICAgICAgbWF0Y2hpbmcgcGFja2FnZSBpbiBzcmNfZGlyLgogICAgICAgICIiIgogICAgICAgIHJhd19wYXR0ZXJucyA9IGl0ZXJ0b29scy5jaGFpbigKICAgICAgICAgICAgc3BlYy5nZXQoJycsIFtdKSwKICAgICAgICAgICAgc3BlYy5nZXQocGFja2FnZSwgW10pLAogICAgICAgICkKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAjIEVhY2ggcGF0dGVybiBoYXMgdG8gYmUgY29udmVydGVkIHRvIGEgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3JjX2RpciwgY29udmVydF9wYXRoKHBhdHRlcm4pKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiByYXdfcGF0dGVybnMKICAgICAgICApCgoKIyBmcm9tIFB5dGhvbiBkb2NzCmRlZiBfdW5pcXVlX2V2ZXJzZWVuKGl0ZXJhYmxlLCBrZXk9Tm9uZSk6CiAgICAiTGlzdCB1bmlxdWUgZWxlbWVudHMsIHByZXNlcnZpbmcgb3JkZXIuIFJlbWVtYmVyIGFsbCBlbGVtZW50cyBldmVyIHNlZW4uIgogICAgIyB1bmlxdWVfZXZlcnNlZW4oJ0FBQUFCQkJDQ0RBQUJCQicpIC0tPiBBIEIgQyBECiAgICAjIHVuaXF1ZV9ldmVyc2VlbignQUJCQ2NBRCcsIHN0ci5sb3dlcikgLS0+IEEgQiBDIEQKICAgIHNlZW4gPSBzZXQoKQogICAgc2Vlbl9hZGQgPSBzZWVuLmFkZAogICAgaWYga2V5IGlzIE5vbmU6CiAgICAgICAgZm9yIGVsZW1lbnQgaW4gZmlsdGVyZmFsc2Uoc2Vlbi5fX2NvbnRhaW5zX18sIGl0ZXJhYmxlKToKICAgICAgICAgICAgc2Vlbl9hZGQoZWxlbWVudCkKICAgICAgICAgICAgeWllbGQgZWxlbWVudAogICAgZWxzZToKICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVyYWJsZToKICAgICAgICAgICAgayA9IGtleShlbGVtZW50KQogICAgICAgICAgICBpZiBrIG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgc2Vlbl9hZGQoaykKICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKCgpkZWYgYXNzZXJ0X3JlbGF0aXZlKHBhdGgpOgogICAgaWYgbm90IG9zLnBhdGguaXNhYnMocGF0aCk6CiAgICAgICAgcmV0dXJuIHBhdGgKICAgIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzU2V0dXBFcnJvcgoKICAgIG1zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBFcnJvcjogc2V0dXAgc2NyaXB0IHNwZWNpZmllcyBhbiBhYnNvbHV0ZSBwYXRoOgoKICAgICAgICAgICAgJXMKCiAgICAgICAgc2V0dXAoKSBhcmd1bWVudHMgbXVzdCAqYWx3YXlzKiBiZSAvLXNlcGFyYXRlZCBwYXRocyByZWxhdGl2ZSB0byB0aGUKICAgICAgICBzZXR1cC5weSBkaXJlY3RvcnksICpuZXZlciogYWJzb2x1dGUgcGF0aHMuCiAgICAgICAgIiIiKS5sc3RyaXAoKSAlIHBhdGgKICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IobXNnKQpQSwMEFAAAAAAAAAAhAEBcO/9uHwAAbh8AADUAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZGV2ZWxvcC5weWZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IsIERpc3R1dGlsc09wdGlvbkVycm9yCmltcG9ydCBvcwppbXBvcnQgZ2xvYgppbXBvcnQgaW8KCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBEaXN0cmlidXRpb24sIFBhdGhNZXRhZGF0YSwgbm9ybWFsaXplX3BhdGgKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBlYXN5X2luc3RhbGwKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBuYW1lc3BhY2VzCmltcG9ydCBzZXR1cHRvb2xzCgoKY2xhc3MgZGV2ZWxvcChuYW1lc3BhY2VzLkRldmVsb3BJbnN0YWxsZXIsIGVhc3lfaW5zdGFsbCk6CiAgICAiIiJTZXQgdXAgcGFja2FnZSBmb3IgZGV2ZWxvcG1lbnQiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJpbnN0YWxsIHBhY2thZ2UgaW4gJ2RldmVsb3BtZW50IG1vZGUnIgoKICAgIHVzZXJfb3B0aW9ucyA9IGVhc3lfaW5zdGFsbC51c2VyX29wdGlvbnMgKyBbCiAgICAgICAgKCJ1bmluc3RhbGwiLCAidSIsICJVbmluc3RhbGwgdGhpcyBzb3VyY2UgcGFja2FnZSIpLAogICAgICAgICgiZWdnLXBhdGg9IiwgTm9uZSwgIlNldCB0aGUgcGF0aCB0byBiZSB1c2VkIGluIHRoZSAuZWdnLWxpbmsgZmlsZSIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IGVhc3lfaW5zdGFsbC5ib29sZWFuX29wdGlvbnMgKyBbJ3VuaW5zdGFsbCddCgogICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBGYWxzZSAgIyBvdmVycmlkZSBiYXNlCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBpZiBzZWxmLnVuaW5zdGFsbDoKICAgICAgICAgICAgc2VsZi5tdWx0aV92ZXJzaW9uID0gVHJ1ZQogICAgICAgICAgICBzZWxmLnVuaW5zdGFsbF9saW5rKCkKICAgICAgICAgICAgc2VsZi51bmluc3RhbGxfbmFtZXNwYWNlcygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2Zvcl9kZXZlbG9wbWVudCgpCiAgICAgICAgc2VsZi53YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucygpCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnVuaW5zdGFsbCA9IE5vbmUKICAgICAgICBzZWxmLmVnZ19wYXRoID0gTm9uZQogICAgICAgIGVhc3lfaW5zdGFsbC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLnNldHVwX3BhdGggPSBOb25lCiAgICAgICAgc2VsZi5hbHdheXNfY29weV9mcm9tID0gJy4nICAjIGFsd2F5cyBjb3B5IGVnZ3MgaW5zdGFsbGVkIGluIGN1cmRpcgoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIGVpID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBpZiBlaS5icm9rZW5fZWdnX2luZm86CiAgICAgICAgICAgIHRlbXBsYXRlID0gIlBsZWFzZSByZW5hbWUgJXIgdG8gJXIgYmVmb3JlIHVzaW5nICdkZXZlbG9wJyIKICAgICAgICAgICAgYXJncyA9IGVpLmVnZ19pbmZvLCBlaS5icm9rZW5fZWdnX2luZm8KICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IodGVtcGxhdGUgJSBhcmdzKQogICAgICAgIHNlbGYuYXJncyA9IFtlaS5lZ2dfbmFtZV0KCiAgICAgICAgZWFzeV9pbnN0YWxsLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLmV4cGFuZF9iYXNlZGlycygpCiAgICAgICAgc2VsZi5leHBhbmRfZGlycygpCiAgICAgICAgIyBwaWNrIHVwIHNldHVwLWRpciAuZWdnIGZpbGVzIG9ubHk6IG5vIC5lZ2ctaW5mbwogICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5zY2FuKGdsb2IuZ2xvYignKi5lZ2cnKSkKCiAgICAgICAgZWdnX2xpbmtfZm4gPSBlaS5lZ2dfbmFtZSArICcuZWdnLWxpbmsnCiAgICAgICAgc2VsZi5lZ2dfbGluayA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBlZ2dfbGlua19mbikKICAgICAgICBzZWxmLmVnZ19iYXNlID0gZWkuZWdnX2Jhc2UKICAgICAgICBpZiBzZWxmLmVnZ19wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuZWdnX3BhdGggPSBvcy5wYXRoLmFic3BhdGgoZWkuZWdnX2Jhc2UpCgogICAgICAgIHRhcmdldCA9IG5vcm1hbGl6ZV9wYXRoKHNlbGYuZWdnX2Jhc2UpCiAgICAgICAgZWdnX3BhdGggPSBub3JtYWxpemVfcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVnZ19wYXRoKSkKICAgICAgICBpZiBlZ2dfcGF0aCAhPSB0YXJnZXQ6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIi0tZWdnLXBhdGggbXVzdCBiZSBhIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgaW5zdGFsbCIKICAgICAgICAgICAgICAgICIgZGlyZWN0b3J5IHRvICIgKyB0YXJnZXQKICAgICAgICAgICAgKQoKICAgICAgICAjIE1ha2UgYSBkaXN0cmlidXRpb24gZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlCiAgICAgICAgc2VsZi5kaXN0ID0gRGlzdHJpYnV0aW9uKAogICAgICAgICAgICB0YXJnZXQsCiAgICAgICAgICAgIFBhdGhNZXRhZGF0YSh0YXJnZXQsIG9zLnBhdGguYWJzcGF0aChlaS5lZ2dfaW5mbykpLAogICAgICAgICAgICBwcm9qZWN0X25hbWU9ZWkuZWdnX25hbWUKICAgICAgICApCgogICAgICAgIHNlbGYuc2V0dXBfcGF0aCA9IHNlbGYuX3Jlc29sdmVfc2V0dXBfcGF0aCgKICAgICAgICAgICAgc2VsZi5lZ2dfYmFzZSwKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RpciwKICAgICAgICAgICAgc2VsZi5lZ2dfcGF0aCwKICAgICAgICApCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZXNvbHZlX3NldHVwX3BhdGgoZWdnX2Jhc2UsIGluc3RhbGxfZGlyLCBlZ2dfcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgR2VuZXJhdGUgYSBwYXRoIGZyb20gZWdnX2Jhc2UgYmFjayB0byAnLicgd2hlcmUgdGhlCiAgICAgICAgc2V0dXAgc2NyaXB0IHJlc2lkZXMgYW5kIGVuc3VyZSB0aGF0IHBhdGggcG9pbnRzIHRvIHRoZQogICAgICAgIHNldHVwIHBhdGggZnJvbSAkaW5zdGFsbF9kaXIvJGVnZ19wYXRoLgogICAgICAgICIiIgogICAgICAgIHBhdGhfdG9fc2V0dXAgPSBlZ2dfYmFzZS5yZXBsYWNlKG9zLnNlcCwgJy8nKS5yc3RyaXAoJy8nKQogICAgICAgIGlmIHBhdGhfdG9fc2V0dXAgIT0gb3MuY3VyZGlyOgogICAgICAgICAgICBwYXRoX3RvX3NldHVwID0gJy4uLycgKiAocGF0aF90b19zZXR1cC5jb3VudCgnLycpICsgMSkKICAgICAgICByZXNvbHZlZCA9IG5vcm1hbGl6ZV9wYXRoKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oaW5zdGFsbF9kaXIsIGVnZ19wYXRoLCBwYXRoX3RvX3NldHVwKQogICAgICAgICkKICAgICAgICBpZiByZXNvbHZlZCAhPSBub3JtYWxpemVfcGF0aChvcy5jdXJkaXIpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCBnZXQgYSBjb25zaXN0ZW50IHBhdGggdG8gc2V0dXAgc2NyaXB0IGZyb20iCiAgICAgICAgICAgICAgICAiIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkiLCByZXNvbHZlZCwgbm9ybWFsaXplX3BhdGgob3MuY3VyZGlyKSkKICAgICAgICByZXR1cm4gcGF0aF90b19zZXR1cAoKICAgIGRlZiBpbnN0YWxsX2Zvcl9kZXZlbG9wbWVudChzZWxmKToKICAgICAgICBpZiBzaXguUFkzIGFuZCBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAndXNlXzJ0bzMnLCBGYWxzZSk6CiAgICAgICAgICAgICMgSWYgd2UgcnVuIDJ0bzMgd2UgY2FuIG5vdCBkbyB0aGlzIGlucGxhY2U6CgogICAgICAgICAgICAjIEVuc3VyZSBtZXRhZGF0YSBpcyB1cC10by1kYXRlCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX3B5JywgaW5wbGFjZT0wKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9weScpCiAgICAgICAgICAgIGJweV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiYnVpbGRfcHkiKQogICAgICAgICAgICBidWlsZF9wYXRoID0gbm9ybWFsaXplX3BhdGgoYnB5X2NtZC5idWlsZF9saWIpCgogICAgICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnZWdnX2luZm8nLCBlZ2dfYmFzZT1idWlsZF9wYXRoKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCgogICAgICAgICAgICAjIEZpeHVwIGVnZy1saW5rIGFuZCBlYXN5LWluc3RhbGwucHRoCiAgICAgICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgICAgIHNlbGYuZWdnX3BhdGggPSBidWlsZF9wYXRoCiAgICAgICAgICAgIHNlbGYuZGlzdC5sb2NhdGlvbiA9IGJ1aWxkX3BhdGgKICAgICAgICAgICAgIyBYWFgKICAgICAgICAgICAgc2VsZi5kaXN0Ll9wcm92aWRlciA9IFBhdGhNZXRhZGF0YShidWlsZF9wYXRoLCBlaV9jbWQuZWdnX2luZm8pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBXaXRob3V0IDJ0bzMgaW5wbGFjZSB3b3JrcyBmaW5lOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMgaW4tcGxhY2UKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfZXh0JywgaW5wbGFjZT0xKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQoKICAgICAgICBzZWxmLmluc3RhbGxfc2l0ZV9weSgpICAjIGVuc3VyZSB0aGF0IHRhcmdldCBkaXIgaXMgc2l0ZS1zYWZlCiAgICAgICAgaWYgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tOgogICAgICAgICAgICBzZWxmLmVhc3lfaW5zdGFsbChzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20pCiAgICAgICAgICAgIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IE5vbmUKCiAgICAgICAgc2VsZi5pbnN0YWxsX25hbWVzcGFjZXMoKQoKICAgICAgICAjIGNyZWF0ZSBhbiAuZWdnLWxpbmsgaW4gdGhlIGluc3RhbGxhdGlvbiBkaXIsIHBvaW50aW5nIHRvIG91ciBlZ2cKICAgICAgICBsb2cuaW5mbygiQ3JlYXRpbmcgJXMgKGxpbmsgdG8gJXMpIiwgc2VsZi5lZ2dfbGluaywgc2VsZi5lZ2dfYmFzZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5lZ2dfbGluaywgInciKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZShzZWxmLmVnZ19wYXRoICsgIlxuIiArIHNlbGYuc2V0dXBfcGF0aCkKICAgICAgICAjIHBvc3Rwcm9jZXNzIHRoZSBpbnN0YWxsZWQgZGlzdHJvLCBmaXhpbmcgdXAgLnB0aCwgaW5zdGFsbGluZyBzY3JpcHRzLAogICAgICAgICMgYW5kIGhhbmRsaW5nIHJlcXVpcmVtZW50cwogICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oTm9uZSwgc2VsZi5kaXN0LCBub3Qgc2VsZi5ub19kZXBzKQoKICAgIGRlZiB1bmluc3RhbGxfbGluayhzZWxmKToKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmVnZ19saW5rKToKICAgICAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nICVzIChsaW5rIHRvICVzKSIsIHNlbGYuZWdnX2xpbmssIHNlbGYuZWdnX2Jhc2UpCiAgICAgICAgICAgIGVnZ19saW5rX2ZpbGUgPSBvcGVuKHNlbGYuZWdnX2xpbmspCiAgICAgICAgICAgIGNvbnRlbnRzID0gW2xpbmUucnN0cmlwKCkgZm9yIGxpbmUgaW4gZWdnX2xpbmtfZmlsZV0KICAgICAgICAgICAgZWdnX2xpbmtfZmlsZS5jbG9zZSgpCiAgICAgICAgICAgIGlmIGNvbnRlbnRzIG5vdCBpbiAoW3NlbGYuZWdnX3BhdGhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLmVnZ19wYXRoLCBzZWxmLnNldHVwX3BhdGhdKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJMaW5rIHBvaW50cyB0byAlczogdW5pbnN0YWxsIGFib3J0ZWQiLCBjb250ZW50cykKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuZWdnX2xpbmspCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgc2VsZi51cGRhdGVfcHRoKHNlbGYuZGlzdCkgICMgcmVtb3ZlIGFueSAucHRoIGxpbmsgdG8gdXMKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgogICAgICAgICAgICAjIFhYWCBzaG91bGQgYWxzbyBjaGVjayBmb3IgZW50cnkgcG9pbnQgc2NyaXB0cyEKICAgICAgICAgICAgbG9nLndhcm4oIk5vdGU6IHlvdSBtdXN0IHVuaW5zdGFsbCBvciByZXBsYWNlIHNjcmlwdHMgbWFudWFsbHkhIikKCiAgICBkZWYgaW5zdGFsbF9lZ2dfc2NyaXB0cyhzZWxmLCBkaXN0KToKICAgICAgICBpZiBkaXN0IGlzIG5vdCBzZWxmLmRpc3Q6CiAgICAgICAgICAgICMgSW5zdGFsbGluZyBhIGRlcGVuZGVuY3ksIHNvIGZhbGwgYmFjayB0byBub3JtYWwgYmVoYXZpb3IKICAgICAgICAgICAgcmV0dXJuIGVhc3lfaW5zdGFsbC5pbnN0YWxsX2VnZ19zY3JpcHRzKHNlbGYsIGRpc3QpCgogICAgICAgICMgY3JlYXRlIHdyYXBwZXIgc2NyaXB0cyBpbiB0aGUgc2NyaXB0IGRpciwgcG9pbnRpbmcgdG8gZGlzdC5zY3JpcHRzCgogICAgICAgICMgbmV3LXN0eWxlLi4uCiAgICAgICAgc2VsZi5pbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhkaXN0KQoKICAgICAgICAjIC4uLmFuZCBvbGQtc3R5bGUKICAgICAgICBmb3Igc2NyaXB0X25hbWUgaW4gc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0cyBvciBbXToKICAgICAgICAgICAgc2NyaXB0X3BhdGggPSBvcy5wYXRoLmFic3BhdGgoY29udmVydF9wYXRoKHNjcmlwdF9uYW1lKSkKICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNjcmlwdF9wYXRoKQogICAgICAgICAgICB3aXRoIGlvLm9wZW4oc2NyaXB0X3BhdGgpIGFzIHN0cm06CiAgICAgICAgICAgICAgICBzY3JpcHRfdGV4dCA9IHN0cm0ucmVhZCgpCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHQoZGlzdCwgc2NyaXB0X25hbWUsIHNjcmlwdF90ZXh0LCBzY3JpcHRfcGF0aCkKCiAgICBkZWYgaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoc2VsZiwgZGlzdCk6CiAgICAgICAgZGlzdCA9IFZlcnNpb25sZXNzUmVxdWlyZW1lbnQoZGlzdCkKICAgICAgICByZXR1cm4gZWFzeV9pbnN0YWxsLmluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKHNlbGYsIGRpc3QpCgoKY2xhc3MgVmVyc2lvbmxlc3NSZXF1aXJlbWVudChvYmplY3QpOgogICAgIiIiCiAgICBBZGFwdCBhIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIHRvIHNpbXBseSByZXR1cm4gdGhlIHByb2plY3QKICAgIG5hbWUgYXMgdGhlICdyZXF1aXJlbWVudCcgc28gdGhhdCBzY3JpcHRzIHdpbGwgd29yayBhY3Jvc3MKICAgIG11bHRpcGxlIHZlcnNpb25zLgoKICAgID4+PiBkaXN0ID0gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0nZm9vJywgdmVyc2lvbj0nMS4wJykKICAgID4+PiBzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgJ2Zvbz09MS4wJwogICAgPj4+IGFkYXB0ZWRfZGlzdCA9IFZlcnNpb25sZXNzUmVxdWlyZW1lbnQoZGlzdCkKICAgID4+PiBzdHIoYWRhcHRlZF9kaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAnZm9vJwogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpc3QpOgogICAgICAgIHNlbGYuX19kaXN0ID0gZGlzdAoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9fZGlzdCwgbmFtZSkKCiAgICBkZWYgYXNfcmVxdWlyZW1lbnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucHJvamVjdF9uYW1lClBLAwQUAAAAAAAAACEA/+j2kcADAADAAwAANwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9kaXN0X2luZm8ucHkiIiIKQ3JlYXRlIGEgZGlzdF9pbmZvIGRpcmVjdG9yeQpBcyBkZWZpbmVkIGluIHRoZSB3aGVlbCBzcGVjaWZpY2F0aW9uCiIiIgoKaW1wb3J0IG9zCgpmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKCgpjbGFzcyBkaXN0X2luZm8oQ29tbWFuZCk6CgogICAgZGVzY3JpcHRpb24gPSAnY3JlYXRlIGEgLmRpc3QtaW5mbyBkaXJlY3RvcnknCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnZWdnLWJhc2U9JywgJ2UnLCAiZGlyZWN0b3J5IGNvbnRhaW5pbmcgLmVnZy1pbmZvIGRpcmVjdG9yaWVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAiIChkZWZhdWx0OiB0b3Agb2YgdGhlIHNvdXJjZSB0cmVlKSIpLAogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5lZ2dfYmFzZSA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBlZ2dfaW5mbyA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgZWdnX2luZm8uZWdnX2Jhc2UgPSBzZWxmLmVnZ19iYXNlCiAgICAgICAgZWdnX2luZm8uZmluYWxpemVfb3B0aW9ucygpCiAgICAgICAgZWdnX2luZm8ucnVuKCkKICAgICAgICBkaXN0X2luZm9fZGlyID0gZWdnX2luZm8uZWdnX2luZm9bOi1sZW4oJy5lZ2ctaW5mbycpXSArICcuZGlzdC1pbmZvJwogICAgICAgIGxvZy5pbmZvKCJjcmVhdGluZyAne30nIi5mb3JtYXQob3MucGF0aC5hYnNwYXRoKGRpc3RfaW5mb19kaXIpKSkKCiAgICAgICAgYmRpc3Rfd2hlZWwgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYmRpc3Rfd2hlZWwnKQogICAgICAgIGJkaXN0X3doZWVsLmVnZzJkaXN0KGVnZ19pbmZvLmVnZ19pbmZvLCBkaXN0X2luZm9fZGlyKQpQSwMEFAAAAAAAAAAhAKt0EulVVAEAVVQBADoAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiIiIgpFYXN5IEluc3RhbGwKLS0tLS0tLS0tLS0tCgpBIHRvb2wgZm9yIGRvaW5nIGF1dG9tYXRpYyBkb3dubG9hZC9leHRyYWN0L2J1aWxkIG9mIGRpc3R1dGlscy1iYXNlZCBQeXRob24KcGFja2FnZXMuICBGb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgRWFzeUluc3RhbGwudHh0CmZpbGUsIG9yIHZpc2l0IHRoZSBgRWFzeUluc3RhbGwgaG9tZSBwYWdlYF9fLgoKX18gaHR0cHM6Ly9zZXR1cHRvb2xzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9lYXN5X2luc3RhbGwuaHRtbAoKIiIiCgpmcm9tIGdsb2IgaW1wb3J0IGdsb2IKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aCwgc3Vic3RfdmFycwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICgKICAgIERpc3R1dGlsc0FyZ0Vycm9yLCBEaXN0dXRpbHNPcHRpb25FcnJvciwKICAgIERpc3R1dGlsc0Vycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLAopCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBpbXBvcnQgSU5TVEFMTF9TQ0hFTUVTLCBTQ0hFTUVfS0VZUwpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nLCBkaXJfdXRpbApmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3NjcmlwdHMgaW1wb3J0IGZpcnN0X2xpbmVfcmUKZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IGZpbmRfZXhlY3V0YWJsZQppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgemlwaW1wb3J0CmltcG9ydCBzaHV0aWwKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB6aXBmaWxlCmltcG9ydCByZQppbXBvcnQgc3RhdAppbXBvcnQgcmFuZG9tCmltcG9ydCB0ZXh0d3JhcAppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHNpdGUKaW1wb3J0IHN0cnVjdAppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgc2hsZXgKaW1wb3J0IGlvCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGNvbmZpZ3BhcnNlciwgbWFwCgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKZnJvbSBzZXR1cHRvb2xzLnNhbmRib3ggaW1wb3J0IHJ1bl9zZXR1cApmcm9tIHNldHVwdG9vbHMucHkzMWNvbXBhdCBpbXBvcnQgZ2V0X3BhdGgsIGdldF9jb25maWdfdmFycwpmcm9tIHNldHVwdG9vbHMucHkyN2NvbXBhdCBpbXBvcnQgcm10cmVlX3NhZmUKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQgaW1wb3J0IHNldG9wdApmcm9tIHNldHVwdG9vbHMuYXJjaGl2ZV91dGlsIGltcG9ydCB1bnBhY2tfYXJjaGl2ZQpmcm9tIHNldHVwdG9vbHMucGFja2FnZV9pbmRleCBpbXBvcnQgKAogICAgUGFja2FnZUluZGV4LCBwYXJzZV9yZXF1aXJlbWVudF9hcmcsIFVSTF9TQ0hFTUUsCikKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQgaW1wb3J0IGJkaXN0X2VnZywgZWdnX2luZm8KZnJvbSBzZXR1cHRvb2xzLndoZWVsIGltcG9ydCBXaGVlbApmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICgKICAgIHlpZWxkX2xpbmVzLCBub3JtYWxpemVfcGF0aCwgcmVzb3VyY2Vfc3RyaW5nLCBlbnN1cmVfZGlyZWN0b3J5LAogICAgZ2V0X2Rpc3RyaWJ1dGlvbiwgZmluZF9kaXN0cmlidXRpb25zLCBFbnZpcm9ubWVudCwgUmVxdWlyZW1lbnQsCiAgICBEaXN0cmlidXRpb24sIFBhdGhNZXRhZGF0YSwgRWdnTWV0YWRhdGEsIFdvcmtpbmdTZXQsIERpc3RyaWJ1dGlvbk5vdEZvdW5kLAogICAgVmVyc2lvbkNvbmZsaWN0LCBERVZFTE9QX0RJU1QsCikKaW1wb3J0IHBrZ19yZXNvdXJjZXMucHkzMWNvbXBhdAoKIyBUdXJuIG9uIFBFUDQ0MFdhcm5pbmdzCndhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJkZWZhdWx0IiwgY2F0ZWdvcnk9cGtnX3Jlc291cmNlcy5QRVA0NDBXYXJuaW5nKQoKX19hbGxfXyA9IFsKICAgICdzYW1lZmlsZScsICdlYXN5X2luc3RhbGwnLCAnUHRoRGlzdHJpYnV0aW9ucycsICdleHRyYWN0X3dpbmluc3RfY2ZnJywKICAgICdtYWluJywgJ2dldF9leGVfcHJlZml4ZXMnLApdCgoKZGVmIGlzXzY0Yml0KCk6CiAgICByZXR1cm4gc3RydWN0LmNhbGNzaXplKCJQIikgPT0gOAoKCmRlZiBzYW1lZmlsZShwMSwgcDIpOgogICAgIiIiCiAgICBEZXRlcm1pbmUgaWYgdHdvIHBhdGhzIHJlZmVyZW5jZSB0aGUgc2FtZSBmaWxlLgoKICAgIEF1Z21lbnRzIG9zLnBhdGguc2FtZWZpbGUgdG8gd29yayBvbiBXaW5kb3dzIGFuZAogICAgc3VwcHJlc3NlcyBlcnJvcnMgaWYgdGhlIHBhdGggZG9lc24ndCBleGlzdC4KICAgICIiIgogICAgYm90aF9leGlzdCA9IG9zLnBhdGguZXhpc3RzKHAxKSBhbmQgb3MucGF0aC5leGlzdHMocDIpCiAgICB1c2Vfc2FtZWZpbGUgPSBoYXNhdHRyKG9zLnBhdGgsICdzYW1lZmlsZScpIGFuZCBib3RoX2V4aXN0CiAgICBpZiB1c2Vfc2FtZWZpbGU6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguc2FtZWZpbGUocDEsIHAyKQogICAgbm9ybV9wMSA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5ub3JtY2FzZShwMSkpCiAgICBub3JtX3AyID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLm5vcm1jYXNlKHAyKSkKICAgIHJldHVybiBub3JtX3AxID09IG5vcm1fcDIKCgppZiBzaXguUFkyOgoKICAgIGRlZiBfdG9fYXNjaWkocyk6CiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgaXNhc2NpaShzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNpeC50ZXh0X3R5cGUocywgJ2FzY2lpJykKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKZWxzZToKCiAgICBkZWYgX3RvX2FzY2lpKHMpOgogICAgICAgIHJldHVybiBzLmVuY29kZSgnYXNjaWknKQoKICAgIGRlZiBpc2FzY2lpKHMpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcy5lbmNvZGUoJ2FzY2lpJykKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCgpfb25lX2xpbmVyID0gbGFtYmRhIHRleHQ6IHRleHR3cmFwLmRlZGVudCh0ZXh0KS5zdHJpcCgpLnJlcGxhY2UoJ1xuJywgJzsgJykKCgpjbGFzcyBlYXN5X2luc3RhbGwoQ29tbWFuZCk6CiAgICAiIiJNYW5hZ2UgYSBkb3dubG9hZC9idWlsZC9pbnN0YWxsIHByb2Nlc3MiIiIKICAgIGRlc2NyaXB0aW9uID0gIkZpbmQvZ2V0L2luc3RhbGwgUHl0aG9uIHBhY2thZ2VzIgogICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBUcnVlCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgncHJlZml4PScsIE5vbmUsICJpbnN0YWxsYXRpb24gcHJlZml4IiksCiAgICAgICAgKCJ6aXAtb2siLCAieiIsICJpbnN0YWxsIHBhY2thZ2UgYXMgYSB6aXBmaWxlIiksCiAgICAgICAgKCJtdWx0aS12ZXJzaW9uIiwgIm0iLCAibWFrZSBhcHBzIGhhdmUgdG8gcmVxdWlyZSgpIGEgdmVyc2lvbiIpLAogICAgICAgICgidXBncmFkZSIsICJVIiwgImZvcmNlIHVwZ3JhZGUgKHNlYXJjaGVzIFB5UEkgZm9yIGxhdGVzdCB2ZXJzaW9ucykiKSwKICAgICAgICAoImluc3RhbGwtZGlyPSIsICJkIiwgImluc3RhbGwgcGFja2FnZSB0byBESVIiKSwKICAgICAgICAoInNjcmlwdC1kaXI9IiwgInMiLCAiaW5zdGFsbCBzY3JpcHRzIHRvIERJUiIpLAogICAgICAgICgiZXhjbHVkZS1zY3JpcHRzIiwgIngiLCAiRG9uJ3QgaW5zdGFsbCBzY3JpcHRzIiksCiAgICAgICAgKCJhbHdheXMtY29weSIsICJhIiwgIkNvcHkgYWxsIG5lZWRlZCBwYWNrYWdlcyB0byBpbnN0YWxsIGRpciIpLAogICAgICAgICgiaW5kZXgtdXJsPSIsICJpIiwgImJhc2UgVVJMIG9mIFB5dGhvbiBQYWNrYWdlIEluZGV4IiksCiAgICAgICAgKCJmaW5kLWxpbmtzPSIsICJmIiwgImFkZGl0aW9uYWwgVVJMKHMpIHRvIHNlYXJjaCBmb3IgcGFja2FnZXMiKSwKICAgICAgICAoImJ1aWxkLWRpcmVjdG9yeT0iLCAiYiIsCiAgICAgICAgICJkb3dubG9hZC9leHRyYWN0L2J1aWxkIGluIERJUjsga2VlcCB0aGUgcmVzdWx0cyIpLAogICAgICAgICgnb3B0aW1pemU9JywgJ08nLAogICAgICAgICAiYWxzbyBjb21waWxlIHdpdGggb3B0aW1pemF0aW9uOiAtTzEgZm9yIFwicHl0aG9uIC1PXCIsICIKICAgICAgICAgIi1PMiBmb3IgXCJweXRob24gLU9PXCIsIGFuZCAtTzAgdG8gZGlzYWJsZSBbZGVmYXVsdDogLU8wXSIpLAogICAgICAgICgncmVjb3JkPScsIE5vbmUsCiAgICAgICAgICJmaWxlbmFtZSBpbiB3aGljaCB0byByZWNvcmQgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMiKSwKICAgICAgICAoJ2Fsd2F5cy11bnppcCcsICdaJywgImRvbid0IGluc3RhbGwgYXMgYSB6aXBmaWxlLCBubyBtYXR0ZXIgd2hhdCIpLAogICAgICAgICgnc2l0ZS1kaXJzPScsICdTJywgImxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hlcmUgLnB0aCBmaWxlcyB3b3JrIiksCiAgICAgICAgKCdlZGl0YWJsZScsICdlJywgIkluc3RhbGwgc3BlY2lmaWVkIHBhY2thZ2VzIGluIGVkaXRhYmxlIGZvcm0iKSwKICAgICAgICAoJ25vLWRlcHMnLCAnTicsICJkb24ndCBpbnN0YWxsIGRlcGVuZGVuY2llcyIpLAogICAgICAgICgnYWxsb3ctaG9zdHM9JywgJ0gnLCAicGF0dGVybihzKSB0aGF0IGhvc3RuYW1lcyBtdXN0IG1hdGNoIiksCiAgICAgICAgKCdsb2NhbC1zbmFwc2hvdHMtb2snLCAnbCcsCiAgICAgICAgICJhbGxvdyBidWlsZGluZyBlZ2dzIGZyb20gbG9jYWwgY2hlY2tvdXRzIiksCiAgICAgICAgKCd2ZXJzaW9uJywgTm9uZSwgInByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQiKSwKICAgICAgICAoJ25vLWZpbmQtbGlua3MnLCBOb25lLAogICAgICAgICAiRG9uJ3QgbG9hZCBmaW5kLWxpbmtzIGRlZmluZWQgaW4gcGFja2FnZXMgYmVpbmcgaW5zdGFsbGVkIikKICAgIF0KICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKICAgICAgICAnemlwLW9rJywgJ211bHRpLXZlcnNpb24nLCAnZXhjbHVkZS1zY3JpcHRzJywgJ3VwZ3JhZGUnLCAnYWx3YXlzLWNvcHknLAogICAgICAgICdlZGl0YWJsZScsCiAgICAgICAgJ25vLWRlcHMnLCAnbG9jYWwtc25hcHNob3RzLW9rJywgJ3ZlcnNpb24nCiAgICBdCgogICAgaWYgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgIGhlbHBfbXNnID0gImluc3RhbGwgaW4gdXNlciBzaXRlLXBhY2thZ2UgJyVzJyIgJSBzaXRlLlVTRVJfU0lURQogICAgICAgIHVzZXJfb3B0aW9ucy5hcHBlbmQoKCd1c2VyJywgTm9uZSwgaGVscF9tc2cpKQogICAgICAgIGJvb2xlYW5fb3B0aW9ucy5hcHBlbmQoJ3VzZXInKQoKICAgIG5lZ2F0aXZlX29wdCA9IHsnYWx3YXlzLXVuemlwJzogJ3ppcC1vayd9CiAgICBjcmVhdGVfaW5kZXggPSBQYWNrYWdlSW5kZXgKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgICMgdGhlIC0tdXNlciBvcHRpb24gc2VlbXMgdG8gYmUgYW4gb3B0LWluIG9uZSwKICAgICAgICAjIHNvIHRoZSBkZWZhdWx0IHNob3VsZCBiZSBGYWxzZS4KICAgICAgICBzZWxmLnVzZXIgPSAwCiAgICAgICAgc2VsZi56aXBfb2sgPSBzZWxmLmxvY2FsX3NuYXBzaG90c19vayA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gc2VsZi5zY3JpcHRfZGlyID0gc2VsZi5leGNsdWRlX3NjcmlwdHMgPSBOb25lCiAgICAgICAgc2VsZi5pbmRleF91cmwgPSBOb25lCiAgICAgICAgc2VsZi5maW5kX2xpbmtzID0gTm9uZQogICAgICAgIHNlbGYuYnVpbGRfZGlyZWN0b3J5ID0gTm9uZQogICAgICAgIHNlbGYuYXJncyA9IE5vbmUKICAgICAgICBzZWxmLm9wdGltaXplID0gc2VsZi5yZWNvcmQgPSBOb25lCiAgICAgICAgc2VsZi51cGdyYWRlID0gc2VsZi5hbHdheXNfY29weSA9IHNlbGYubXVsdGlfdmVyc2lvbiA9IE5vbmUKICAgICAgICBzZWxmLmVkaXRhYmxlID0gc2VsZi5ub19kZXBzID0gc2VsZi5hbGxvd19ob3N0cyA9IE5vbmUKICAgICAgICBzZWxmLnJvb3QgPSBzZWxmLnByZWZpeCA9IHNlbGYubm9fcmVwb3J0ID0gTm9uZQogICAgICAgIHNlbGYudmVyc2lvbiA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfcHVyZWxpYiA9IE5vbmUgICMgZm9yIHB1cmUgbW9kdWxlIGRpc3RyaWJ1dGlvbnMKICAgICAgICBzZWxmLmluc3RhbGxfcGxhdGxpYiA9IE5vbmUgICMgbm9uLXB1cmUgKGRpc3RzIHcvIGV4dGVuc2lvbnMpCiAgICAgICAgc2VsZi5pbnN0YWxsX2hlYWRlcnMgPSBOb25lICAjIGZvciBDL0MrKyBoZWFkZXJzCiAgICAgICAgc2VsZi5pbnN0YWxsX2xpYiA9IE5vbmUgICMgc2V0IHRvIGVpdGhlciBwdXJlbGliIG9yIHBsYXRsaWIKICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0cyA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfZGF0YSA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfYmFzZSA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfcGxhdGJhc2UgPSBOb25lCiAgICAgICAgaWYgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgICAgICBzZWxmLmluc3RhbGxfdXNlcmJhc2UgPSBzaXRlLlVTRVJfQkFTRQogICAgICAgICAgICBzZWxmLmluc3RhbGxfdXNlcnNpdGUgPSBzaXRlLlVTRVJfU0lURQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF91c2VyYmFzZSA9IE5vbmUKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3VzZXJzaXRlID0gTm9uZQogICAgICAgIHNlbGYubm9fZmluZF9saW5rcyA9IE5vbmUKCiAgICAgICAgIyBPcHRpb25zIG5vdCBzcGVjaWZpYWJsZSB2aWEgY29tbWFuZCBsaW5lCiAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4ID0gTm9uZQogICAgICAgIHNlbGYucHRoX2ZpbGUgPSBzZWxmLmFsd2F5c19jb3B5X2Zyb20gPSBOb25lCiAgICAgICAgc2VsZi5zaXRlX2RpcnMgPSBOb25lCiAgICAgICAgc2VsZi5pbnN0YWxsZWRfcHJvamVjdHMgPSB7fQogICAgICAgIHNlbGYuc2l0ZXB5X2luc3RhbGxlZCA9IEZhbHNlCiAgICAgICAgIyBBbHdheXMgcmVhZCBlYXN5X2luc3RhbGwgb3B0aW9ucywgZXZlbiBpZiB3ZSBhcmUgc3ViY2xhc3NlZCwgb3IgaGF2ZQogICAgICAgICMgYW4gaW5kZXBlbmRlbnQgaW5zdGFuY2UgY3JlYXRlZC4gIFRoaXMgZW5zdXJlcyB0aGF0IGRlZmF1bHRzIHdpbGwKICAgICAgICAjIGFsd2F5cyBjb21lIGZyb20gdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZmlsZShzKScgImVhc3lfaW5zdGFsbCIKICAgICAgICAjIHNlY3Rpb24sIGV2ZW4gaWYgdGhpcyBpcyBhICJkZXZlbG9wIiBvciAiaW5zdGFsbCIgY29tbWFuZCwgb3Igc29tZQogICAgICAgICMgb3RoZXIgZW1iZWRkaW5nLgogICAgICAgIHNlbGYuX2RyeV9ydW4gPSBOb25lCiAgICAgICAgc2VsZi52ZXJib3NlID0gc2VsZi5kaXN0cmlidXRpb24udmVyYm9zZQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLl9zZXRfY29tbWFuZF9vcHRpb25zKAogICAgICAgICAgICBzZWxmLCBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpCiAgICAgICAgKQoKICAgIGRlZiBkZWxldGVfYmxvY2tlcnMoc2VsZiwgYmxvY2tlcnMpOgogICAgICAgIGV4dGFudF9ibG9ja2VycyA9ICgKICAgICAgICAgICAgZmlsZW5hbWUgZm9yIGZpbGVuYW1lIGluIGJsb2NrZXJzCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKSBvciBvcy5wYXRoLmlzbGluayhmaWxlbmFtZSkKICAgICAgICApCiAgICAgICAgbGlzdChtYXAoc2VsZi5fZGVsZXRlX3BhdGgsIGV4dGFudF9ibG9ja2VycykpCgogICAgZGVmIF9kZWxldGVfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgJXMiLCBwYXRoKQogICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlzX3RyZWUgPSBvcy5wYXRoLmlzZGlyKHBhdGgpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsocGF0aCkKICAgICAgICByZW1vdmVyID0gcm10cmVlIGlmIGlzX3RyZWUgZWxzZSBvcy51bmxpbmsKICAgICAgICByZW1vdmVyKHBhdGgpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZW5kZXJfdmVyc2lvbigpOgogICAgICAgICIiIgogICAgICAgIFJlbmRlciB0aGUgU2V0dXB0b29scyB2ZXJzaW9uIGFuZCBpbnN0YWxsYXRpb24gZGV0YWlscywgdGhlbiBleGl0LgogICAgICAgICIiIgogICAgICAgIHZlciA9IHN5cy52ZXJzaW9uWzozXQogICAgICAgIGRpc3QgPSBnZXRfZGlzdHJpYnV0aW9uKCdzZXR1cHRvb2xzJykKICAgICAgICB0bXBsID0gJ3NldHVwdG9vbHMge2Rpc3QudmVyc2lvbn0gZnJvbSB7ZGlzdC5sb2NhdGlvbn0gKFB5dGhvbiB7dmVyfSknCiAgICAgICAgcHJpbnQodG1wbC5mb3JtYXQoKipsb2NhbHMoKSkpCiAgICAgICAgcmFpc2UgU3lzdGVtRXhpdCgpCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi52ZXJzaW9uIGFuZCBzZWxmLl9yZW5kZXJfdmVyc2lvbigpCgogICAgICAgIHB5X3ZlcnNpb24gPSBzeXMudmVyc2lvbi5zcGxpdCgpWzBdCiAgICAgICAgcHJlZml4LCBleGVjX3ByZWZpeCA9IGdldF9jb25maWdfdmFycygncHJlZml4JywgJ2V4ZWNfcHJlZml4JykKCiAgICAgICAgc2VsZi5jb25maWdfdmFycyA9IHsKICAgICAgICAgICAgJ2Rpc3RfbmFtZSc6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCksCiAgICAgICAgICAgICdkaXN0X3ZlcnNpb24nOiBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpLAogICAgICAgICAgICAnZGlzdF9mdWxsbmFtZSc6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpLAogICAgICAgICAgICAncHlfdmVyc2lvbic6IHB5X3ZlcnNpb24sCiAgICAgICAgICAgICdweV92ZXJzaW9uX3Nob3J0JzogcHlfdmVyc2lvblswOjNdLAogICAgICAgICAgICAncHlfdmVyc2lvbl9ub2RvdCc6IHB5X3ZlcnNpb25bMF0gKyBweV92ZXJzaW9uWzJdLAogICAgICAgICAgICAnc3lzX3ByZWZpeCc6IHByZWZpeCwKICAgICAgICAgICAgJ3ByZWZpeCc6IHByZWZpeCwKICAgICAgICAgICAgJ3N5c19leGVjX3ByZWZpeCc6IGV4ZWNfcHJlZml4LAogICAgICAgICAgICAnZXhlY19wcmVmaXgnOiBleGVjX3ByZWZpeCwKICAgICAgICAgICAgIyBPbmx5IHB5dGhvbiAzLjIrIGhhcyBhYmlmbGFncwogICAgICAgICAgICAnYWJpZmxhZ3MnOiBnZXRhdHRyKHN5cywgJ2FiaWZsYWdzJywgJycpLAogICAgICAgIH0KCiAgICAgICAgaWYgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgICAgICBzZWxmLmNvbmZpZ192YXJzWyd1c2VyYmFzZSddID0gc2VsZi5pbnN0YWxsX3VzZXJiYXNlCiAgICAgICAgICAgIHNlbGYuY29uZmlnX3ZhcnNbJ3VzZXJzaXRlJ10gPSBzZWxmLmluc3RhbGxfdXNlcnNpdGUKCiAgICAgICAgc2VsZi5fZml4X2luc3RhbGxfZGlyX2Zvcl91c2VyX3NpdGUoKQoKICAgICAgICBzZWxmLmV4cGFuZF9iYXNlZGlycygpCiAgICAgICAgc2VsZi5leHBhbmRfZGlycygpCgogICAgICAgIHNlbGYuX2V4cGFuZCgKICAgICAgICAgICAgJ2luc3RhbGxfZGlyJywgJ3NjcmlwdF9kaXInLCAnYnVpbGRfZGlyZWN0b3J5JywKICAgICAgICAgICAgJ3NpdGVfZGlycycsCiAgICAgICAgKQogICAgICAgICMgSWYgYSBub24tZGVmYXVsdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHdhcyBzcGVjaWZpZWQsIGRlZmF1bHQgdGhlCiAgICAgICAgIyBzY3JpcHQgZGlyZWN0b3J5IHRvIG1hdGNoIGl0LgogICAgICAgIGlmIHNlbGYuc2NyaXB0X2RpciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnNjcmlwdF9kaXIgPSBzZWxmLmluc3RhbGxfZGlyCgogICAgICAgIGlmIHNlbGYubm9fZmluZF9saW5rcyBpcyBOb25lOgogICAgICAgICAgICBzZWxmLm5vX2ZpbmRfbGlua3MgPSBGYWxzZQoKICAgICAgICAjIExldCBpbnN0YWxsX2RpciBnZXQgc2V0IGJ5IGluc3RhbGxfbGliIGNvbW1hbmQsIHdoaWNoIGluIHR1cm4KICAgICAgICAjIGdldHMgaXRzIGluZm8gZnJvbSB0aGUgaW5zdGFsbCBjb21tYW5kLCBhbmQgdGFrZXMgaW50byBhY2NvdW50CiAgICAgICAgIyAtLXByZWZpeCBhbmQgLS1ob21lIGFuZCBhbGwgdGhhdCBvdGhlciBjcnVkLgogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKAogICAgICAgICAgICAnaW5zdGFsbF9saWInLCAoJ2luc3RhbGxfZGlyJywgJ2luc3RhbGxfZGlyJykKICAgICAgICApCiAgICAgICAgIyBMaWtld2lzZSwgc2V0IGRlZmF1bHQgc2NyaXB0X2RpciBmcm9tICdpbnN0YWxsX3NjcmlwdHMuaW5zdGFsbF9kaXInCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoCiAgICAgICAgICAgICdpbnN0YWxsX3NjcmlwdHMnLCAoJ2luc3RhbGxfZGlyJywgJ3NjcmlwdF9kaXInKQogICAgICAgICkKCiAgICAgICAgaWYgc2VsZi51c2VyIGFuZCBzZWxmLmluc3RhbGxfcHVyZWxpYjoKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IHNlbGYuaW5zdGFsbF9wdXJlbGliCiAgICAgICAgICAgIHNlbGYuc2NyaXB0X2RpciA9IHNlbGYuaW5zdGFsbF9zY3JpcHRzCiAgICAgICAgIyBkZWZhdWx0IC0tcmVjb3JkIGZyb20gdGhlIGluc3RhbGwgY29tbWFuZAogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsJywgKCdyZWNvcmQnLCAncmVjb3JkJykpCiAgICAgICAgIyBTaG91bGQgdGhpcyBiZSBtb3ZlZCB0byB0aGUgaWYgc3RhdGVtZW50IGJlbG93PyBJdCdzIG5vdCB1c2VkCiAgICAgICAgIyBlbHNld2hlcmUKICAgICAgICBub3JtcGF0aCA9IG1hcChub3JtYWxpemVfcGF0aCwgc3lzLnBhdGgpCiAgICAgICAgc2VsZi5hbGxfc2l0ZV9kaXJzID0gZ2V0X3NpdGVfZGlycygpCiAgICAgICAgaWYgc2VsZi5zaXRlX2RpcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNpdGVfZGlycyA9IFsKICAgICAgICAgICAgICAgIG9zLnBhdGguZXhwYW5kdXNlcihzLnN0cmlwKCkpIGZvciBzIGluCiAgICAgICAgICAgICAgICBzZWxmLnNpdGVfZGlycy5zcGxpdCgnLCcpCiAgICAgICAgICAgIF0KICAgICAgICAgICAgZm9yIGQgaW4gc2l0ZV9kaXJzOgogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZCk6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIiVzIChpbiAtLXNpdGUtZGlycykgZG9lcyBub3QgZXhpc3QiLCBkKQogICAgICAgICAgICAgICAgZWxpZiBub3JtYWxpemVfcGF0aChkKSBub3QgaW4gbm9ybXBhdGg6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIGQgKyAiIChpbiAtLXNpdGUtZGlycykgaXMgbm90IG9uIHN5cy5wYXRoIgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxfc2l0ZV9kaXJzLmFwcGVuZChub3JtYWxpemVfcGF0aChkKSkKICAgICAgICBpZiBub3Qgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgc2VsZi5jaGVja19zaXRlX2RpcigpCiAgICAgICAgc2VsZi5pbmRleF91cmwgPSBzZWxmLmluZGV4X3VybCBvciAiaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvc2ltcGxlIgogICAgICAgIHNlbGYuc2hhZG93X3BhdGggPSBzZWxmLmFsbF9zaXRlX2RpcnNbOl0KICAgICAgICBmb3IgcGF0aF9pdGVtIGluIHNlbGYuaW5zdGFsbF9kaXIsIG5vcm1hbGl6ZV9wYXRoKHNlbGYuc2NyaXB0X2Rpcik6CiAgICAgICAgICAgIGlmIHBhdGhfaXRlbSBub3QgaW4gc2VsZi5zaGFkb3dfcGF0aDoKICAgICAgICAgICAgICAgIHNlbGYuc2hhZG93X3BhdGguaW5zZXJ0KDAsIHBhdGhfaXRlbSkKCiAgICAgICAgaWYgc2VsZi5hbGxvd19ob3N0cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaG9zdHMgPSBbcy5zdHJpcCgpIGZvciBzIGluIHNlbGYuYWxsb3dfaG9zdHMuc3BsaXQoJywnKV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBob3N0cyA9IFsnKiddCiAgICAgICAgaWYgc2VsZi5wYWNrYWdlX2luZGV4IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYucGFja2FnZV9pbmRleCA9IHNlbGYuY3JlYXRlX2luZGV4KAogICAgICAgICAgICAgICAgc2VsZi5pbmRleF91cmwsIHNlYXJjaF9wYXRoPXNlbGYuc2hhZG93X3BhdGgsIGhvc3RzPWhvc3RzLAogICAgICAgICAgICApCiAgICAgICAgc2VsZi5sb2NhbF9pbmRleCA9IEVudmlyb25tZW50KHNlbGYuc2hhZG93X3BhdGggKyBzeXMucGF0aCkKCiAgICAgICAgaWYgc2VsZi5maW5kX2xpbmtzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZmluZF9saW5rcywgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBzZWxmLmZpbmRfbGlua3MgPSBzZWxmLmZpbmRfbGlua3Muc3BsaXQoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZmluZF9saW5rcyA9IFtdCiAgICAgICAgaWYgc2VsZi5sb2NhbF9zbmFwc2hvdHNfb2s6CiAgICAgICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5zY2FuX2VnZ19saW5rcyhzZWxmLnNoYWRvd19wYXRoICsgc3lzLnBhdGgpCiAgICAgICAgaWYgbm90IHNlbGYubm9fZmluZF9saW5rczoKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LmFkZF9maW5kX2xpbmtzKHNlbGYuZmluZF9saW5rcykKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9saWInLCAoJ29wdGltaXplJywgJ29wdGltaXplJykpCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5vcHRpbWl6ZSwgaW50KToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5vcHRpbWl6ZSA9IGludChzZWxmLm9wdGltaXplKQogICAgICAgICAgICAgICAgaWYgbm90ICgwIDw9IHNlbGYub3B0aW1pemUgPD0gMik6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCItLW9wdGltaXplIG11c3QgYmUgMCwgMSwgb3IgMiIpCgogICAgICAgIGlmIHNlbGYuZWRpdGFibGUgYW5kIG5vdCBzZWxmLmJ1aWxkX2RpcmVjdG9yeToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGEgYnVpbGQgZGlyZWN0b3J5ICgtYikgd2hlbiB1c2luZyAtLWVkaXRhYmxlIgogICAgICAgICAgICApCiAgICAgICAgaWYgbm90IHNlbGYuYXJnczoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAiTm8gdXJscywgZmlsZW5hbWVzLCBvciByZXF1aXJlbWVudHMgc3BlY2lmaWVkIChzZWUgLS1oZWxwKSIpCgogICAgICAgIHNlbGYub3V0cHV0cyA9IFtdCgogICAgZGVmIF9maXhfaW5zdGFsbF9kaXJfZm9yX3VzZXJfc2l0ZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBGaXggdGhlIGluc3RhbGxfZGlyIGlmICItLXVzZXIiIHdhcyB1c2VkLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLnVzZXIgb3Igbm90IHNpdGUuRU5BQkxFX1VTRVJfU0lURToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuY3JlYXRlX2hvbWVfcGF0aCgpCiAgICAgICAgaWYgc2VsZi5pbnN0YWxsX3VzZXJiYXNlIGlzIE5vbmU6CiAgICAgICAgICAgIG1zZyA9ICJVc2VyIGJhc2UgZGlyZWN0b3J5IGlzIG5vdCBzcGVjaWZpZWQiCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IobXNnKQogICAgICAgIHNlbGYuaW5zdGFsbF9iYXNlID0gc2VsZi5pbnN0YWxsX3BsYXRiYXNlID0gc2VsZi5pbnN0YWxsX3VzZXJiYXNlCiAgICAgICAgc2NoZW1lX25hbWUgPSBvcy5uYW1lLnJlcGxhY2UoJ3Bvc2l4JywgJ3VuaXgnKSArICdfdXNlcicKICAgICAgICBzZWxmLnNlbGVjdF9zY2hlbWUoc2NoZW1lX25hbWUpCgogICAgZGVmIF9leHBhbmRfYXR0cnMoc2VsZiwgYXR0cnMpOgogICAgICAgIGZvciBhdHRyIGluIGF0dHJzOgogICAgICAgICAgICB2YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpCiAgICAgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JyBvciBvcy5uYW1lID09ICdudCc6CiAgICAgICAgICAgICAgICAgICAgdmFsID0gb3MucGF0aC5leHBhbmR1c2VyKHZhbCkKICAgICAgICAgICAgICAgIHZhbCA9IHN1YnN0X3ZhcnModmFsLCBzZWxmLmNvbmZpZ192YXJzKQogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWwpCgogICAgZGVmIGV4cGFuZF9iYXNlZGlycyhzZWxmKToKICAgICAgICAiIiJDYWxscyBgb3MucGF0aC5leHBhbmR1c2VyYCBvbiBpbnN0YWxsX2Jhc2UsIGluc3RhbGxfcGxhdGJhc2UgYW5kCiAgICAgICAgcm9vdC4iIiIKICAgICAgICBzZWxmLl9leHBhbmRfYXR0cnMoWydpbnN0YWxsX2Jhc2UnLCAnaW5zdGFsbF9wbGF0YmFzZScsICdyb290J10pCgogICAgZGVmIGV4cGFuZF9kaXJzKHNlbGYpOgogICAgICAgICIiIkNhbGxzIGBvcy5wYXRoLmV4cGFuZHVzZXJgIG9uIGluc3RhbGwgZGlycy4iIiIKICAgICAgICBkaXJzID0gWwogICAgICAgICAgICAnaW5zdGFsbF9wdXJlbGliJywKICAgICAgICAgICAgJ2luc3RhbGxfcGxhdGxpYicsCiAgICAgICAgICAgICdpbnN0YWxsX2xpYicsCiAgICAgICAgICAgICdpbnN0YWxsX2hlYWRlcnMnLAogICAgICAgICAgICAnaW5zdGFsbF9zY3JpcHRzJywKICAgICAgICAgICAgJ2luc3RhbGxfZGF0YScsCiAgICAgICAgXQogICAgICAgIHNlbGYuX2V4cGFuZF9hdHRycyhkaXJzKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgaWYgc2VsZi52ZXJib3NlICE9IHNlbGYuZGlzdHJpYnV0aW9uLnZlcmJvc2U6CiAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvciBzcGVjIGluIHNlbGYuYXJnczoKICAgICAgICAgICAgICAgIHNlbGYuZWFzeV9pbnN0YWxsKHNwZWMsIG5vdCBzZWxmLm5vX2RlcHMpCiAgICAgICAgICAgIGlmIHNlbGYucmVjb3JkOgogICAgICAgICAgICAgICAgb3V0cHV0cyA9IHNlbGYub3V0cHV0cwogICAgICAgICAgICAgICAgaWYgc2VsZi5yb290OiAgIyBzdHJpcCBhbnkgcGFja2FnZSBwcmVmaXgKICAgICAgICAgICAgICAgICAgICByb290X2xlbiA9IGxlbihzZWxmLnJvb3QpCiAgICAgICAgICAgICAgICAgICAgZm9yIGNvdW50ZXIgaW4gcmFuZ2UobGVuKG91dHB1dHMpKToKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0c1tjb3VudGVyXSA9IG91dHB1dHNbY291bnRlcl1bcm9vdF9sZW46XQogICAgICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGZpbGVfdXRpbAoKICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICBmaWxlX3V0aWwud3JpdGVfZmlsZSwgKHNlbGYucmVjb3JkLCBvdXRwdXRzKSwKICAgICAgICAgICAgICAgICAgICAid3JpdGluZyBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyB0byAnJXMnIiAlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWNvcmQKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi53YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucygpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi5kaXN0cmlidXRpb24udmVyYm9zZSkKCiAgICBkZWYgcHNldWRvX3RlbXBuYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIHBzZXVkby10ZW1wbmFtZSBiYXNlIGluIHRoZSBpbnN0YWxsIGRpcmVjdG9yeS4KICAgICAgICBUaGlzIGNvZGUgaXMgaW50ZW50aW9uYWxseSBuYWl2ZTsgaWYgYSBtYWxpY2lvdXMgcGFydHkgY2FuIHdyaXRlIHRvCiAgICAgICAgdGhlIHRhcmdldCBkaXJlY3RvcnkgeW91J3JlIGFscmVhZHkgaW4gZGVlcCBkb29kb28uCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBpZCA9IHJhbmRvbS5yYW5kaW50KDAsIHN5cy5tYXhzaXplKQogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgInRlc3QtZWFzeS1pbnN0YWxsLSVzIiAlIHBpZCkKCiAgICBkZWYgd2Fybl9kZXByZWNhdGVkX29wdGlvbnMoc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBjaGVja19zaXRlX2RpcihzZWxmKToKICAgICAgICAiIiJWZXJpZnkgdGhhdCBzZWxmLmluc3RhbGxfZGlyIGlzIC5wdGgtY2FwYWJsZSBkaXIsIGlmIG5lZWRlZCIiIgoKICAgICAgICBpbnN0ZGlyID0gbm9ybWFsaXplX3BhdGgoc2VsZi5pbnN0YWxsX2RpcikKICAgICAgICBwdGhfZmlsZSA9IG9zLnBhdGguam9pbihpbnN0ZGlyLCAnZWFzeS1pbnN0YWxsLnB0aCcpCgogICAgICAgICMgSXMgaXQgYSBjb25maWd1cmVkLCBQWVRIT05QQVRILCBpbXBsaWNpdCwgb3IgZXhwbGljaXQgc2l0ZSBkaXI/CiAgICAgICAgaXNfc2l0ZV9kaXIgPSBpbnN0ZGlyIGluIHNlbGYuYWxsX3NpdGVfZGlycwoKICAgICAgICBpZiBub3QgaXNfc2l0ZV9kaXIgYW5kIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CiAgICAgICAgICAgICMgTm8/ICBUaGVuIGRpcmVjdGx5IHRlc3Qgd2hldGhlciBpdCBkb2VzIC5wdGggZmlsZSBwcm9jZXNzaW5nCiAgICAgICAgICAgIGlzX3NpdGVfZGlyID0gc2VsZi5jaGVja19wdGhfcHJvY2Vzc2luZygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBtYWtlIHN1cmUgd2UgY2FuIHdyaXRlIHRvIHRhcmdldCBkaXIKICAgICAgICAgICAgdGVzdGZpbGUgPSBzZWxmLnBzZXVkb190ZW1wbmFtZSgpICsgJy53cml0ZS10ZXN0JwogICAgICAgICAgICB0ZXN0X2V4aXN0cyA9IG9zLnBhdGguZXhpc3RzKHRlc3RmaWxlKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpZiB0ZXN0X2V4aXN0czoKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsodGVzdGZpbGUpCiAgICAgICAgICAgICAgICBvcGVuKHRlc3RmaWxlLCAndycpLmNsb3NlKCkKICAgICAgICAgICAgICAgIG9zLnVubGluayh0ZXN0ZmlsZSkKICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgIHNlbGYuY2FudF93cml0ZV90b190YXJnZXQoKQoKICAgICAgICBpZiBub3QgaXNfc2l0ZV9kaXIgYW5kIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CiAgICAgICAgICAgICMgQ2FuJ3QgaW5zdGFsbCBub24tbXVsdGkgdG8gbm9uLXNpdGUgZGlyCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKHNlbGYubm9fZGVmYXVsdF92ZXJzaW9uX21zZygpKQoKICAgICAgICBpZiBpc19zaXRlX2RpcjoKICAgICAgICAgICAgaWYgc2VsZi5wdGhfZmlsZSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5wdGhfZmlsZSA9IFB0aERpc3RyaWJ1dGlvbnMocHRoX2ZpbGUsIHNlbGYuYWxsX3NpdGVfZGlycykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnB0aF9maWxlID0gTm9uZQoKICAgICAgICBpZiBpbnN0ZGlyIG5vdCBpbiBtYXAobm9ybWFsaXplX3BhdGgsIF9weXRob25wYXRoKCkpOgogICAgICAgICAgICAjIG9ubHkgUFlUSE9OUEFUSCBkaXJzIG5lZWQgYSBzaXRlLnB5LCBzbyBwcmV0ZW5kIGl0J3MgdGhlcmUKICAgICAgICAgICAgc2VsZi5zaXRlcHlfaW5zdGFsbGVkID0gVHJ1ZQogICAgICAgIGVsaWYgc2VsZi5tdWx0aV92ZXJzaW9uIGFuZCBub3Qgb3MucGF0aC5leGlzdHMocHRoX2ZpbGUpOgogICAgICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlICAjIGRvbid0IG5lZWQgc2l0ZS5weSBpbiB0aGlzIGNhc2UKICAgICAgICAgICAgc2VsZi5wdGhfZmlsZSA9IE5vbmUgICMgYW5kIGRvbid0IGNyZWF0ZSBhIC5wdGggZmlsZQogICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBpbnN0ZGlyCgogICAgX19jYW50X3dyaXRlX21zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBjYW4ndCBjcmVhdGUgb3IgcmVtb3ZlIGZpbGVzIGluIGluc3RhbGwgZGlyZWN0b3J5CgogICAgICAgIFRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGFkZCBvciByZW1vdmUgZmlsZXMgaW4gdGhlCiAgICAgICAgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeToKCiAgICAgICAgICAgICVzCgogICAgICAgIFRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHlvdSBzcGVjaWZpZWQgKHZpYSAtLWluc3RhbGwtZGlyLCAtLXByZWZpeCwgb3IKICAgICAgICB0aGUgZGlzdHV0aWxzIGRlZmF1bHQgc2V0dGluZykgd2FzOgoKICAgICAgICAgICAgJXMKICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgX19ub3RfZXhpc3RzX2lkID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIFRoaXMgZGlyZWN0b3J5IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4gIFBsZWFzZSBjcmVhdGUgaXQgYW5kIHRyeSBhZ2Fpbiwgb3IKICAgICAgICBjaG9vc2UgYSBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSAodXNpbmcgdGhlIC1kIG9yIC0taW5zdGFsbC1kaXIKICAgICAgICBvcHRpb24pLgogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBfX2FjY2Vzc19tc2cgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgUGVyaGFwcyB5b3VyIGFjY291bnQgZG9lcyBub3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBkaXJlY3Rvcnk/ICBJZiB0aGUKICAgICAgICBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGlzIGEgc3lzdGVtLW93bmVkIGRpcmVjdG9yeSwgeW91IG1heSBuZWVkIHRvIHNpZ24gaW4KICAgICAgICBhcyB0aGUgYWRtaW5pc3RyYXRvciBvciAicm9vdCIgYWNjb3VudC4gIElmIHlvdSBkbyBub3QgaGF2ZSBhZG1pbmlzdHJhdGl2ZQogICAgICAgIGFjY2VzcyB0byB0aGlzIG1hY2hpbmUsIHlvdSBtYXkgd2lzaCB0byBjaG9vc2UgYSBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uCiAgICAgICAgZGlyZWN0b3J5LCBwcmVmZXJhYmx5IG9uZSB0aGF0IGlzIGxpc3RlZCBpbiB5b3VyIFBZVEhPTlBBVEggZW52aXJvbm1lbnQKICAgICAgICB2YXJpYWJsZS4KCiAgICAgICAgRm9yIGluZm9ybWF0aW9uIG9uIG90aGVyIG9wdGlvbnMsIHlvdSBtYXkgd2lzaCB0byBjb25zdWx0IHRoZQogICAgICAgIGRvY3VtZW50YXRpb24gYXQ6CgogICAgICAgICAgaHR0cHM6Ly9zZXR1cHRvb2xzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9lYXN5X2luc3RhbGwuaHRtbAoKICAgICAgICBQbGVhc2UgbWFrZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlcyBmb3IgeW91ciBzeXN0ZW0gYW5kIHRyeSBhZ2Fpbi4KICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgZGVmIGNhbnRfd3JpdGVfdG9fdGFyZ2V0KHNlbGYpOgogICAgICAgIG1zZyA9IHNlbGYuX19jYW50X3dyaXRlX21zZyAlIChzeXMuZXhjX2luZm8oKVsxXSwgc2VsZi5pbnN0YWxsX2RpciwpCgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmluc3RhbGxfZGlyKToKICAgICAgICAgICAgbXNnICs9ICdcbicgKyBzZWxmLl9fbm90X2V4aXN0c19pZAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1zZyArPSAnXG4nICsgc2VsZi5fX2FjY2Vzc19tc2cKICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihtc2cpCgogICAgZGVmIGNoZWNrX3B0aF9wcm9jZXNzaW5nKHNlbGYpOgogICAgICAgICIiIkVtcGlyaWNhbGx5IHZlcmlmeSB3aGV0aGVyIC5wdGggZmlsZXMgYXJlIHN1cHBvcnRlZCBpbiBpbnN0LiBkaXIiIiIKICAgICAgICBpbnN0ZGlyID0gc2VsZi5pbnN0YWxsX2RpcgogICAgICAgIGxvZy5pbmZvKCJDaGVja2luZyAucHRoIGZpbGUgc3VwcG9ydCBpbiAlcyIsIGluc3RkaXIpCiAgICAgICAgcHRoX2ZpbGUgPSBzZWxmLnBzZXVkb190ZW1wbmFtZSgpICsgIi5wdGgiCiAgICAgICAgb2tfZmlsZSA9IHB0aF9maWxlICsgJy5vaycKICAgICAgICBva19leGlzdHMgPSBvcy5wYXRoLmV4aXN0cyhva19maWxlKQogICAgICAgIHRtcGwgPSBfb25lX2xpbmVyKCIiIgogICAgICAgICAgICBpbXBvcnQgb3MKICAgICAgICAgICAgZiA9IG9wZW4oe29rX2ZpbGUhcn0sICd3JykKICAgICAgICAgICAgZi53cml0ZSgnT0snKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgIiIiKSArICdcbicKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIG9rX2V4aXN0czoKICAgICAgICAgICAgICAgIG9zLnVubGluayhva19maWxlKQogICAgICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKG9rX2ZpbGUpCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMucHkzMWNvbXBhdC5tYWtlZGlycyhkaXJuYW1lLCBleGlzdF9vaz1UcnVlKQogICAgICAgICAgICBmID0gb3BlbihwdGhfZmlsZSwgJ3cnKQogICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgIHNlbGYuY2FudF93cml0ZV90b190YXJnZXQoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGYud3JpdGUodG1wbC5mb3JtYXQoKipsb2NhbHMoKSkpCiAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgIGYgPSBOb25lCiAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gc3lzLmV4ZWN1dGFibGUKICAgICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQoZXhlY3V0YWJsZSkKICAgICAgICAgICAgICAgICAgICBhbHQgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgJ3B5dGhvbncuZXhlJykKICAgICAgICAgICAgICAgICAgICB1c2VfYWx0ID0gKAogICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZS5sb3dlcigpID09ICdweXRob24uZXhlJyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5leGlzdHMoYWx0KQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpZiB1c2VfYWx0OgogICAgICAgICAgICAgICAgICAgICAgICAjIHVzZSBweXRob253LmV4ZSB0byBhdm9pZCBvcGVuaW5nIGEgY29uc29sZSB3aW5kb3cKICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZSA9IGFsdAoKICAgICAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgoKICAgICAgICAgICAgICAgIHNwYXduKFtleGVjdXRhYmxlLCAnLUUnLCAnLWMnLCAncGFzcyddLCAwKQoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9rX2ZpbGUpOgogICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAiVEVTVCBQQVNTRUQ6ICVzIGFwcGVhcnMgdG8gc3VwcG9ydCAucHRoIGZpbGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGRpcgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgaWYgZjoKICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9rX2ZpbGUpOgogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhva19maWxlKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocHRoX2ZpbGUpOgogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhwdGhfZmlsZSkKICAgICAgICBpZiBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgogICAgICAgICAgICBsb2cud2FybigiVEVTVCBGQUlMRUQ6ICVzIGRvZXMgTk9UIHN1cHBvcnQgLnB0aCBmaWxlcyIsIGluc3RkaXIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGluc3RhbGxfZWdnX3NjcmlwdHMoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiV3JpdGUgYWxsIHRoZSBzY3JpcHRzIGZvciBgZGlzdGAsIHVubGVzcyBzY3JpcHRzIGFyZSBleGNsdWRlZCIiIgogICAgICAgIGlmIG5vdCBzZWxmLmV4Y2x1ZGVfc2NyaXB0cyBhbmQgZGlzdC5tZXRhZGF0YV9pc2Rpcignc2NyaXB0cycpOgogICAgICAgICAgICBmb3Igc2NyaXB0X25hbWUgaW4gZGlzdC5tZXRhZGF0YV9saXN0ZGlyKCdzY3JpcHRzJyk6CiAgICAgICAgICAgICAgICBpZiBkaXN0Lm1ldGFkYXRhX2lzZGlyKCdzY3JpcHRzLycgKyBzY3JpcHRfbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgIyBUaGUgInNjcmlwdCIgaXMgYSBkaXJlY3RvcnksIGxpa2VseSBhIFB5dGhvbiAzCiAgICAgICAgICAgICAgICAgICAgIyBfX3B5Y2FjaGVfXyBkaXJlY3RvcnksIHNvIHNraXAgaXQuCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHQoCiAgICAgICAgICAgICAgICAgICAgZGlzdCwgc2NyaXB0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgZGlzdC5nZXRfbWV0YWRhdGEoJ3NjcmlwdHMvJyArIHNjcmlwdF9uYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgIHNlbGYuaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoZGlzdCkKCiAgICBkZWYgYWRkX291dHB1dChzZWxmLCBwYXRoKToKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoKToKICAgICAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKG9zLnBhdGguam9pbihiYXNlLCBmaWxlbmFtZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5vdXRwdXRzLmFwcGVuZChwYXRoKQoKICAgIGRlZiBub3RfZWRpdGFibGUoc2VsZiwgc3BlYyk6CiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAlcjogeW91IGNhbid0IHVzZSBmaWxlbmFtZXMgb3IgVVJMcyAiCiAgICAgICAgICAgICAgICAid2l0aCAtLWVkaXRhYmxlIChleGNlcHQgdmlhIHRoZSAtLWZpbmQtbGlua3Mgb3B0aW9uKS4iCiAgICAgICAgICAgICAgICAlIChzcGVjLCkKICAgICAgICAgICAgKQoKICAgIGRlZiBjaGVja19lZGl0YWJsZShzZWxmLCBzcGVjKToKICAgICAgICBpZiBub3Qgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2RpcmVjdG9yeSwgc3BlYy5rZXkpKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAiJXIgYWxyZWFkeSBleGlzdHMgaW4gJXM7IGNhbid0IGRvIGEgY2hlY2tvdXQgdGhlcmUiICUKICAgICAgICAgICAgICAgIChzcGVjLmtleSwgc2VsZi5idWlsZF9kaXJlY3RvcnkpCiAgICAgICAgICAgICkKCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIF90bXBkaXIoc2VsZik6CiAgICAgICAgdG1wZGlyID0gdGVtcGZpbGUubWtkdGVtcChwcmVmaXg9c2l4LnUoImVhc3lfaW5zdGFsbC0iKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgY2FzdCB0byBzdHIgYXMgd29ya2Fyb3VuZCBmb3IgIzcwOSBhbmQgIzcxMCBhbmQgIzcxMgogICAgICAgICAgICB5aWVsZCBzdHIodG1wZGlyKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKHRtcGRpcikgYW5kIHJtdHJlZShybXRyZWVfc2FmZSh0bXBkaXIpKQoKICAgIGRlZiBlYXN5X2luc3RhbGwoc2VsZiwgc3BlYywgZGVwcz1GYWxzZSk6CiAgICAgICAgaWYgbm90IHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zaXRlX3B5KCkKCiAgICAgICAgd2l0aCBzZWxmLl90bXBkaXIoKSBhcyB0bXBkaXI6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNwZWMsIFJlcXVpcmVtZW50KToKICAgICAgICAgICAgICAgIGlmIFVSTF9TQ0hFTUUoc3BlYyk6CiAgICAgICAgICAgICAgICAgICAgIyBJdCdzIGEgdXJsLCBkb3dubG9hZCBpdCB0byB0bXBkaXIgYW5kIHByb2Nlc3MKICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9lZGl0YWJsZShzcGVjKQogICAgICAgICAgICAgICAgICAgIGRsID0gc2VsZi5wYWNrYWdlX2luZGV4LmRvd25sb2FkKHNwZWMsIHRtcGRpcikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oTm9uZSwgZGwsIHRtcGRpciwgZGVwcywgVHJ1ZSkKCiAgICAgICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNwZWMpOgogICAgICAgICAgICAgICAgICAgICMgRXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnksIGp1c3QgcHJvY2VzcyBpdCBkaXJlY3RseQogICAgICAgICAgICAgICAgICAgIHNlbGYubm90X2VkaXRhYmxlKHNwZWMpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbF9pdGVtKE5vbmUsIHNwZWMsIHRtcGRpciwgZGVwcywgVHJ1ZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc3BlYyA9IHBhcnNlX3JlcXVpcmVtZW50X2FyZyhzcGVjKQoKICAgICAgICAgICAgc2VsZi5jaGVja19lZGl0YWJsZShzcGVjKQogICAgICAgICAgICBkaXN0ID0gc2VsZi5wYWNrYWdlX2luZGV4LmZldGNoX2Rpc3RyaWJ1dGlvbigKICAgICAgICAgICAgICAgIHNwZWMsIHRtcGRpciwgc2VsZi51cGdyYWRlLCBzZWxmLmVkaXRhYmxlLAogICAgICAgICAgICAgICAgbm90IHNlbGYuYWx3YXlzX2NvcHksIHNlbGYubG9jYWxfaW5kZXgKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBtc2cgPSAiQ291bGQgbm90IGZpbmQgc3VpdGFibGUgZGlzdHJpYnV0aW9uIGZvciAlciIgJSBzcGVjCiAgICAgICAgICAgICAgICBpZiBzZWxmLmFsd2F5c19jb3B5OgogICAgICAgICAgICAgICAgICAgIG1zZyArPSAiICgtLWFsd2F5cy1jb3B5IHNraXBzIHN5c3RlbSBhbmQgZGV2ZWxvcG1lbnQgZWdncykiCiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihtc2cpCiAgICAgICAgICAgIGVsaWYgZGlzdC5wcmVjZWRlbmNlID09IERFVkVMT1BfRElTVDoKICAgICAgICAgICAgICAgICMgLmVnZy1pbmZvIGRpc3RzIGRvbid0IG5lZWQgaW5zdGFsbGluZywganVzdCBwcm9jZXNzIGRlcHMKICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oc3BlYywgZGlzdCwgZGVwcywgIlVzaW5nIikKICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oc3BlYywgZGlzdC5sb2NhdGlvbiwgdG1wZGlyLCBkZXBzKQoKICAgIGRlZiBpbnN0YWxsX2l0ZW0oc2VsZiwgc3BlYywgZG93bmxvYWQsIHRtcGRpciwgZGVwcywgaW5zdGFsbF9uZWVkZWQ9RmFsc2UpOgoKICAgICAgICAjIEluc3RhbGxhdGlvbiBpcyBhbHNvIG5lZWRlZCBpZiBmaWxlIGluIHRtcGRpciBvciBpcyBub3QgYW4gZWdnCiAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBpbnN0YWxsX25lZWRlZCBvciBzZWxmLmFsd2F5c19jb3B5CiAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBpbnN0YWxsX25lZWRlZCBvciBvcy5wYXRoLmRpcm5hbWUoZG93bmxvYWQpID09IHRtcGRpcgogICAgICAgIGluc3RhbGxfbmVlZGVkID0gaW5zdGFsbF9uZWVkZWQgb3Igbm90IGRvd25sb2FkLmVuZHN3aXRoKCcuZWdnJykKICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yICgKICAgICAgICAgICAgc2VsZi5hbHdheXNfY29weV9mcm9tIGlzIG5vdCBOb25lIGFuZAogICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUobm9ybWFsaXplX3BhdGgoZG93bmxvYWQpKSA9PQogICAgICAgICAgICBub3JtYWxpemVfcGF0aChzZWxmLmFsd2F5c19jb3B5X2Zyb20pCiAgICAgICAgKQoKICAgICAgICBpZiBzcGVjIGFuZCBub3QgaW5zdGFsbF9uZWVkZWQ6CiAgICAgICAgICAgICMgYXQgdGhpcyBwb2ludCwgd2Uga25vdyBpdCdzIGEgbG9jYWwgLmVnZywgd2UganVzdCBkb24ndCBrbm93IGlmCiAgICAgICAgICAgICMgaXQncyBhbHJlYWR5IGluc3RhbGxlZC4KICAgICAgICAgICAgZm9yIGRpc3QgaW4gc2VsZi5sb2NhbF9pbmRleFtzcGVjLnByb2plY3RfbmFtZV06CiAgICAgICAgICAgICAgICBpZiBkaXN0LmxvY2F0aW9uID09IGRvd25sb2FkOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpbnN0YWxsX25lZWRlZCA9IFRydWUgICMgaXQncyBub3QgaW4gdGhlIGxvY2FsIGluZGV4CgogICAgICAgIGxvZy5pbmZvKCJQcm9jZXNzaW5nICVzIiwgb3MucGF0aC5iYXNlbmFtZShkb3dubG9hZCkpCgogICAgICAgIGlmIGluc3RhbGxfbmVlZGVkOgogICAgICAgICAgICBkaXN0cyA9IHNlbGYuaW5zdGFsbF9lZ2dzKHNwZWMsIGRvd25sb2FkLCB0bXBkaXIpCiAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0LCBkZXBzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRpc3RzID0gW3NlbGYuZWdnX2Rpc3RyaWJ1dGlvbihkb3dubG9hZCldCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oc3BlYywgZGlzdHNbMF0sIGRlcHMsICJVc2luZyIpCgogICAgICAgIGlmIHNwZWMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICAgICAgaWYgZGlzdCBpbiBzcGVjOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CgogICAgZGVmIHNlbGVjdF9zY2hlbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiU2V0cyB0aGUgaW5zdGFsbCBkaXJlY3RvcmllcyBieSBhcHBseWluZyB0aGUgaW5zdGFsbCBzY2hlbWVzLiIiIgogICAgICAgICMgaXQncyB0aGUgY2FsbGVyJ3MgcHJvYmxlbSBpZiB0aGV5IHN1cHBseSBhIGJhZCBuYW1lIQogICAgICAgIHNjaGVtZSA9IElOU1RBTExfU0NIRU1FU1tuYW1lXQogICAgICAgIGZvciBrZXkgaW4gU0NIRU1FX0tFWVM6CiAgICAgICAgICAgIGF0dHJuYW1lID0gJ2luc3RhbGxfJyArIGtleQogICAgICAgICAgICBpZiBnZXRhdHRyKHNlbGYsIGF0dHJuYW1lKSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRybmFtZSwgc2NoZW1lW2tleV0pCgogICAgZGVmIHByb2Nlc3NfZGlzdHJpYnV0aW9uKHNlbGYsIHJlcXVpcmVtZW50LCBkaXN0LCBkZXBzPVRydWUsICppbmZvKToKICAgICAgICBzZWxmLnVwZGF0ZV9wdGgoZGlzdCkKICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguYWRkKGRpc3QpCiAgICAgICAgaWYgZGlzdCBpbiBzZWxmLmxvY2FsX2luZGV4W2Rpc3Qua2V5XToKICAgICAgICAgICAgc2VsZi5sb2NhbF9pbmRleC5yZW1vdmUoZGlzdCkKICAgICAgICBzZWxmLmxvY2FsX2luZGV4LmFkZChkaXN0KQogICAgICAgIHNlbGYuaW5zdGFsbF9lZ2dfc2NyaXB0cyhkaXN0KQogICAgICAgIHNlbGYuaW5zdGFsbGVkX3Byb2plY3RzW2Rpc3Qua2V5XSA9IGRpc3QKICAgICAgICBsb2cuaW5mbyhzZWxmLmluc3RhbGxhdGlvbl9yZXBvcnQocmVxdWlyZW1lbnQsIGRpc3QsICppbmZvKSkKICAgICAgICBpZiAoZGlzdC5oYXNfbWV0YWRhdGEoJ2RlcGVuZGVuY3lfbGlua3MudHh0JykgYW5kCiAgICAgICAgICAgICAgICBub3Qgc2VsZi5ub19maW5kX2xpbmtzKToKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LmFkZF9maW5kX2xpbmtzKAogICAgICAgICAgICAgICAgZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2RlcGVuZGVuY3lfbGlua3MudHh0JykKICAgICAgICAgICAgKQogICAgICAgIGlmIG5vdCBkZXBzIGFuZCBub3Qgc2VsZi5hbHdheXNfY29weToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZWxpZiByZXF1aXJlbWVudCBpcyBub3QgTm9uZSBhbmQgZGlzdC5rZXkgIT0gcmVxdWlyZW1lbnQua2V5OgogICAgICAgICAgICBsb2cud2FybigiU2tpcHBpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIGRpc3QpCiAgICAgICAgICAgIHJldHVybiAgIyBYWFggdGhpcyBpcyBub3QgdGhlIGRpc3RyaWJ1dGlvbiB3ZSB3ZXJlIGxvb2tpbmcgZm9yCiAgICAgICAgZWxpZiByZXF1aXJlbWVudCBpcyBOb25lIG9yIGRpc3Qgbm90IGluIHJlcXVpcmVtZW50OgogICAgICAgICAgICAjIGlmIHdlIHdvdW5kIHVwIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiwgcmVzb2x2ZSB3aGF0IHdlJ3ZlIGdvdAogICAgICAgICAgICBkaXN0cmVxID0gZGlzdC5hc19yZXF1aXJlbWVudCgpCiAgICAgICAgICAgIHJlcXVpcmVtZW50ID0gUmVxdWlyZW1lbnQoc3RyKGRpc3RyZXEpKQogICAgICAgIGxvZy5pbmZvKCJQcm9jZXNzaW5nIGRlcGVuZGVuY2llcyBmb3IgJXMiLCByZXF1aXJlbWVudCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRpc3Ryb3MgPSBXb3JraW5nU2V0KFtdKS5yZXNvbHZlKAogICAgICAgICAgICAgICAgW3JlcXVpcmVtZW50XSwgc2VsZi5sb2NhbF9pbmRleCwgc2VsZi5lYXN5X2luc3RhbGwKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBEaXN0cmlidXRpb25Ob3RGb3VuZCBhcyBlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihzdHIoZSkpCiAgICAgICAgZXhjZXB0IFZlcnNpb25Db25mbGljdCBhcyBlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihlLnJlcG9ydCgpKQogICAgICAgIGlmIHNlbGYuYWx3YXlzX2NvcHkgb3Igc2VsZi5hbHdheXNfY29weV9mcm9tOgogICAgICAgICAgICAjIEZvcmNlIGFsbCB0aGUgcmVsZXZhbnQgZGlzdHJvcyB0byBiZSBjb3BpZWQgb3IgYWN0aXZhdGVkCiAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3Ryb3M6CiAgICAgICAgICAgICAgICBpZiBkaXN0LmtleSBub3QgaW4gc2VsZi5pbnN0YWxsZWRfcHJvamVjdHM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lYXN5X2luc3RhbGwoZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgICAgIGxvZy5pbmZvKCJGaW5pc2hlZCBwcm9jZXNzaW5nIGRlcGVuZGVuY2llcyBmb3IgJXMiLCByZXF1aXJlbWVudCkKCiAgICBkZWYgc2hvdWxkX3VuemlwKHNlbGYsIGRpc3QpOgogICAgICAgIGlmIHNlbGYuemlwX29rIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gbm90IHNlbGYuemlwX29rCiAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ25vdC16aXAtc2FmZScpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGlmIG5vdCBkaXN0Lmhhc19tZXRhZGF0YSgnemlwLXNhZmUnKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgbWF5YmVfbW92ZShzZWxmLCBzcGVjLCBkaXN0X2ZpbGVuYW1lLCBzZXR1cF9iYXNlKToKICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9kaXJlY3RvcnksIHNwZWMua2V5KQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRzdCk6CiAgICAgICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgICAgICIlciBhbHJlYWR5IGV4aXN0cyBpbiAlczsgYnVpbGQgZGlyZWN0b3J5ICVzIHdpbGwgbm90IGJlIGtlcHQiCiAgICAgICAgICAgICkKICAgICAgICAgICAgbG9nLndhcm4obXNnLCBzcGVjLmtleSwgc2VsZi5idWlsZF9kaXJlY3RvcnksIHNldHVwX2Jhc2UpCiAgICAgICAgICAgIHJldHVybiBzZXR1cF9iYXNlCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXN0X2ZpbGVuYW1lKToKICAgICAgICAgICAgc2V0dXBfYmFzZSA9IGRpc3RfZmlsZW5hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBvcy5wYXRoLmRpcm5hbWUoZGlzdF9maWxlbmFtZSkgPT0gc2V0dXBfYmFzZToKICAgICAgICAgICAgICAgIG9zLnVubGluayhkaXN0X2ZpbGVuYW1lKSAgIyBnZXQgaXQgb3V0IG9mIHRoZSB0bXAgZGlyCiAgICAgICAgICAgIGNvbnRlbnRzID0gb3MubGlzdGRpcihzZXR1cF9iYXNlKQogICAgICAgICAgICBpZiBsZW4oY29udGVudHMpID09IDE6CiAgICAgICAgICAgICAgICBkaXN0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNldHVwX2Jhc2UsIGNvbnRlbnRzWzBdKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXN0X2ZpbGVuYW1lKToKICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBvbmx5IHRoaW5nIHRoZXJlIGlzIGEgZGlyZWN0b3J5LCBtb3ZlIGl0IGluc3RlYWQKICAgICAgICAgICAgICAgICAgICBzZXR1cF9iYXNlID0gZGlzdF9maWxlbmFtZQogICAgICAgIGVuc3VyZV9kaXJlY3RvcnkoZHN0KQogICAgICAgIHNodXRpbC5tb3ZlKHNldHVwX2Jhc2UsIGRzdCkKICAgICAgICByZXR1cm4gZHN0CgogICAgZGVmIGluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKHNlbGYsIGRpc3QpOgogICAgICAgIGlmIHNlbGYuZXhjbHVkZV9zY3JpcHRzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBmb3IgYXJncyBpbiBTY3JpcHRXcml0ZXIuYmVzdCgpLmdldF9hcmdzKGRpc3QpOgogICAgICAgICAgICBzZWxmLndyaXRlX3NjcmlwdCgqYXJncykKCiAgICBkZWYgaW5zdGFsbF9zY3JpcHQoc2VsZiwgZGlzdCwgc2NyaXB0X25hbWUsIHNjcmlwdF90ZXh0LCBkZXZfcGF0aD1Ob25lKToKICAgICAgICAiIiJHZW5lcmF0ZSBhIGxlZ2FjeSBzY3JpcHQgd3JhcHBlciBhbmQgaW5zdGFsbCBpdCIiIgogICAgICAgIHNwZWMgPSBzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgICAgIGlzX3NjcmlwdCA9IGlzX3B5dGhvbl9zY3JpcHQoc2NyaXB0X3RleHQsIHNjcmlwdF9uYW1lKQoKICAgICAgICBpZiBpc19zY3JpcHQ6CiAgICAgICAgICAgIGJvZHkgPSBzZWxmLl9sb2FkX3RlbXBsYXRlKGRldl9wYXRoKSAlIGxvY2FscygpCiAgICAgICAgICAgIHNjcmlwdF90ZXh0ID0gU2NyaXB0V3JpdGVyLmdldF9oZWFkZXIoc2NyaXB0X3RleHQpICsgYm9keQogICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KHNjcmlwdF9uYW1lLCBfdG9fYXNjaWkoc2NyaXB0X3RleHQpLCAnYicpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9sb2FkX3RlbXBsYXRlKGRldl9wYXRoKToKICAgICAgICAiIiIKICAgICAgICBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgdGVtcGxhdGUgc2NyaXB0cyBpbiB0aGUgcGFja2FnZS4gVGhpcwogICAgICAgIGZ1bmN0aW9uIGxvYWRzIG9uZSBvZiB0aGVtIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXNlLgogICAgICAgICIiIgogICAgICAgICMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzEzNCBmb3IgaW5mbwogICAgICAgICMgb24gc2NyaXB0IGZpbGUgbmFtaW5nIGFuZCBkb3duc3RyZWFtIGlzc3VlcyB3aXRoIFNWUjQKICAgICAgICBuYW1lID0gJ3NjcmlwdC50bXBsJwogICAgICAgIGlmIGRldl9wYXRoOgogICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcudG1wbCcsICcgKGRldikudG1wbCcpCgogICAgICAgIHJhd19ieXRlcyA9IHJlc291cmNlX3N0cmluZygnc2V0dXB0b29scycsIG5hbWUpCiAgICAgICAgcmV0dXJuIHJhd19ieXRlcy5kZWNvZGUoJ3V0Zi04JykKCiAgICBkZWYgd3JpdGVfc2NyaXB0KHNlbGYsIHNjcmlwdF9uYW1lLCBjb250ZW50cywgbW9kZT0idCIsIGJsb2NrZXJzPSgpKToKICAgICAgICAiIiJXcml0ZSBhbiBleGVjdXRhYmxlIGZpbGUgdG8gdGhlIHNjcmlwdHMgZGlyZWN0b3J5IiIiCiAgICAgICAgc2VsZi5kZWxldGVfYmxvY2tlcnMoICAjIGNsZWFuIHVwIG9sZCAucHkvLnB5dyB3L28gYSBzY3JpcHQKICAgICAgICAgICAgW29zLnBhdGguam9pbihzZWxmLnNjcmlwdF9kaXIsIHgpIGZvciB4IGluIGJsb2NrZXJzXQogICAgICAgICkKICAgICAgICBsb2cuaW5mbygiSW5zdGFsbGluZyAlcyBzY3JpcHQgdG8gJXMiLCBzY3JpcHRfbmFtZSwgc2VsZi5zY3JpcHRfZGlyKQogICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLnNjcmlwdF9kaXIsIHNjcmlwdF9uYW1lKQogICAgICAgIHNlbGYuYWRkX291dHB1dCh0YXJnZXQpCgogICAgICAgIG1hc2sgPSBjdXJyZW50X3VtYXNrKCkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGFyZ2V0KToKICAgICAgICAgICAgICAgIG9zLnVubGluayh0YXJnZXQpCiAgICAgICAgICAgIHdpdGggb3Blbih0YXJnZXQsICJ3IiArIG1vZGUpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQogICAgICAgICAgICBjaG1vZCh0YXJnZXQsIDBvNzc3IC0gbWFzaykKCiAgICBkZWYgaW5zdGFsbF9lZ2dzKHNlbGYsIHNwZWMsIGRpc3RfZmlsZW5hbWUsIHRtcGRpcik6CiAgICAgICAgIyAuZWdnIGRpcnMgb3IgZmlsZXMgYXJlIGFscmVhZHkgYnVpbHQsIHNvIGp1c3QgcmV0dXJuIHRoZW0KICAgICAgICBpZiBkaXN0X2ZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy5lZ2cnKToKICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmluc3RhbGxfZWdnKGRpc3RfZmlsZW5hbWUsIHRtcGRpcildCiAgICAgICAgZWxpZiBkaXN0X2ZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy5leGUnKToKICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmluc3RhbGxfZXhlKGRpc3RfZmlsZW5hbWUsIHRtcGRpcildCiAgICAgICAgZWxpZiBkaXN0X2ZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmluc3RhbGxfd2hlZWwoZGlzdF9maWxlbmFtZSwgdG1wZGlyKV0KCiAgICAgICAgIyBBbnl0aGluZyBlbHNlLCB0cnkgdG8gZXh0cmFjdCBhbmQgYnVpbGQKICAgICAgICBzZXR1cF9iYXNlID0gdG1wZGlyCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZGlzdF9maWxlbmFtZSkgYW5kIG5vdCBkaXN0X2ZpbGVuYW1lLmVuZHN3aXRoKCcucHknKToKICAgICAgICAgICAgdW5wYWNrX2FyY2hpdmUoZGlzdF9maWxlbmFtZSwgdG1wZGlyLCBzZWxmLnVucGFja19wcm9ncmVzcykKICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZGlzdF9maWxlbmFtZSk6CiAgICAgICAgICAgIHNldHVwX2Jhc2UgPSBvcy5wYXRoLmFic3BhdGgoZGlzdF9maWxlbmFtZSkKCiAgICAgICAgaWYgKHNldHVwX2Jhc2Uuc3RhcnRzd2l0aCh0bXBkaXIpICAjIHNvbWV0aGluZyB3ZSBkb3dubG9hZGVkCiAgICAgICAgICAgICAgICBhbmQgc2VsZi5idWlsZF9kaXJlY3RvcnkgYW5kIHNwZWMgaXMgbm90IE5vbmUpOgogICAgICAgICAgICBzZXR1cF9iYXNlID0gc2VsZi5tYXliZV9tb3ZlKHNwZWMsIGRpc3RfZmlsZW5hbWUsIHNldHVwX2Jhc2UpCgogICAgICAgICMgRmluZCB0aGUgc2V0dXAucHkgZmlsZQogICAgICAgIHNldHVwX3NjcmlwdCA9IG9zLnBhdGguam9pbihzZXR1cF9iYXNlLCAnc2V0dXAucHknKQoKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2V0dXBfc2NyaXB0KToKICAgICAgICAgICAgc2V0dXBzID0gZ2xvYihvcy5wYXRoLmpvaW4oc2V0dXBfYmFzZSwgJyonLCAnc2V0dXAucHknKSkKICAgICAgICAgICAgaWYgbm90IHNldHVwczoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGEgc2V0dXAgc2NyaXB0IGluICVzIiAlCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKGRpc3RfZmlsZW5hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGlmIGxlbihzZXR1cHMpID4gMToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBzZXR1cCBzY3JpcHRzIGluICVzIiAlCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKGRpc3RfZmlsZW5hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHNldHVwX3NjcmlwdCA9IHNldHVwc1swXQoKICAgICAgICAjIE5vdyBydW4gaXQsIGFuZCByZXR1cm4gdGhlIHJlc3VsdAogICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIGxvZy5pbmZvKHNlbGYucmVwb3J0X2VkaXRhYmxlKHNwZWMsIHNldHVwX3NjcmlwdCkpCiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmJ1aWxkX2FuZF9pbnN0YWxsKHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSkKCiAgICBkZWYgZWdnX2Rpc3RyaWJ1dGlvbihzZWxmLCBlZ2dfcGF0aCk6CiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihlZ2dfcGF0aCk6CiAgICAgICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGVnZ19wYXRoLCBvcy5wYXRoLmpvaW4oZWdnX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0VHRy1JTkZPJykpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWV0YWRhdGEgPSBFZ2dNZXRhZGF0YSh6aXBpbXBvcnQuemlwaW1wb3J0ZXIoZWdnX3BhdGgpKQogICAgICAgIHJldHVybiBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShlZ2dfcGF0aCwgbWV0YWRhdGE9bWV0YWRhdGEpCgogICAgZGVmIGluc3RhbGxfZWdnKHNlbGYsIGVnZ19wYXRoLCB0bXBkaXIpOgogICAgICAgIGRlc3RpbmF0aW9uID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICBzZWxmLmluc3RhbGxfZGlyLAogICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKGVnZ19wYXRoKSwKICAgICAgICApCiAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmFic3BhdGgoZGVzdGluYXRpb24pCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShkZXN0aW5hdGlvbikKCiAgICAgICAgZGlzdCA9IHNlbGYuZWdnX2Rpc3RyaWJ1dGlvbihlZ2dfcGF0aCkKICAgICAgICBpZiBub3Qgc2FtZWZpbGUoZWdnX3BhdGgsIGRlc3RpbmF0aW9uKToKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkZXN0aW5hdGlvbikgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhkZXN0aW5hdGlvbik6CiAgICAgICAgICAgICAgICBkaXJfdXRpbC5yZW1vdmVfdHJlZShkZXN0aW5hdGlvbiwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoZGVzdGluYXRpb24pOgogICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgIG9zLnVubGluaywKICAgICAgICAgICAgICAgICAgICAoZGVzdGluYXRpb24sKSwKICAgICAgICAgICAgICAgICAgICAiUmVtb3ZpbmcgIiArIGRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBuZXdfZGlzdF9pc196aXBwZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihlZ2dfcGF0aCk6CiAgICAgICAgICAgICAgICAgICAgaWYgZWdnX3BhdGguc3RhcnRzd2l0aCh0bXBkaXIpOgogICAgICAgICAgICAgICAgICAgICAgICBmLCBtID0gc2h1dGlsLm1vdmUsICJNb3ZpbmciCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZiwgbSA9IHNodXRpbC5jb3B5dHJlZSwgIkNvcHlpbmciCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYuc2hvdWxkX3VuemlwKGRpc3QpOgogICAgICAgICAgICAgICAgICAgIHNlbGYubWtwYXRoKGRlc3RpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgIGYsIG0gPSBzZWxmLnVucGFja19hbmRfY29tcGlsZSwgIkV4dHJhY3RpbmciCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5ld19kaXN0X2lzX3ppcHBlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBpZiBlZ2dfcGF0aC5zdGFydHN3aXRoKHRtcGRpcik6CiAgICAgICAgICAgICAgICAgICAgICAgIGYsIG0gPSBzaHV0aWwubW92ZSwgIk1vdmluZyIKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBmLCBtID0gc2h1dGlsLmNvcHkyLCAiQ29weWluZyIKICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICBmLAogICAgICAgICAgICAgICAgICAgIChlZ2dfcGF0aCwgZGVzdGluYXRpb24pLAogICAgICAgICAgICAgICAgICAgIChtICsgIiAlcyB0byAlcyIpICUgKAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKGVnZ19wYXRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGRlc3RpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB1cGRhdGVfZGlzdF9jYWNoZXMoCiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICAgICAgZml4X3ppcGltcG9ydGVyX2NhY2hlcz1uZXdfZGlzdF9pc196aXBwZWQsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICB1cGRhdGVfZGlzdF9jYWNoZXMoZGVzdGluYXRpb24sIGZpeF96aXBpbXBvcnRlcl9jYWNoZXM9RmFsc2UpCiAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBzZWxmLmFkZF9vdXRwdXQoZGVzdGluYXRpb24pCiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2Rpc3RyaWJ1dGlvbihkZXN0aW5hdGlvbikKCiAgICBkZWYgaW5zdGFsbF9leGUoc2VsZiwgZGlzdF9maWxlbmFtZSwgdG1wZGlyKToKICAgICAgICAjIFNlZSBpZiBpdCdzIHZhbGlkLCBnZXQgZGF0YQogICAgICAgIGNmZyA9IGV4dHJhY3Rfd2luaW5zdF9jZmcoZGlzdF9maWxlbmFtZSkKICAgICAgICBpZiBjZmcgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgdmFsaWQgZGlzdHV0aWxzIFdpbmRvd3MgLmV4ZSIgJSBkaXN0X2ZpbGVuYW1lCiAgICAgICAgICAgICkKICAgICAgICAjIENyZWF0ZSBhIGR1bW15IGRpc3RyaWJ1dGlvbiBvYmplY3QgdW50aWwgd2UgYnVpbGQgdGhlIHJlYWwgZGlzdHJvCiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigKICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgcHJvamVjdF9uYW1lPWNmZy5nZXQoJ21ldGFkYXRhJywgJ25hbWUnKSwKICAgICAgICAgICAgdmVyc2lvbj1jZmcuZ2V0KCdtZXRhZGF0YScsICd2ZXJzaW9uJyksIHBsYXRmb3JtPWdldF9wbGF0Zm9ybSgpLAogICAgICAgICkKCiAgICAgICAgIyBDb252ZXJ0IHRoZSAuZXhlIHRvIGFuIHVucGFja2VkIGVnZwogICAgICAgIGVnZ19wYXRoID0gb3MucGF0aC5qb2luKHRtcGRpciwgZGlzdC5lZ2dfbmFtZSgpICsgJy5lZ2cnKQogICAgICAgIGRpc3QubG9jYXRpb24gPSBlZ2dfcGF0aAogICAgICAgIGVnZ190bXAgPSBlZ2dfcGF0aCArICcudG1wJwogICAgICAgIF9lZ2dfaW5mbyA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAnRUdHLUlORk8nKQogICAgICAgIHBrZ19pbmYgPSBvcy5wYXRoLmpvaW4oX2VnZ19pbmZvLCAnUEtHLUlORk8nKQogICAgICAgIGVuc3VyZV9kaXJlY3RvcnkocGtnX2luZikgICMgbWFrZSBzdXJlIEVHRy1JTkZPIGRpciBleGlzdHMKICAgICAgICBkaXN0Ll9wcm92aWRlciA9IFBhdGhNZXRhZGF0YShlZ2dfdG1wLCBfZWdnX2luZm8pICAjIFhYWAogICAgICAgIHNlbGYuZXhlX3RvX2VnZyhkaXN0X2ZpbGVuYW1lLCBlZ2dfdG1wKQoKICAgICAgICAjIFdyaXRlIEVHRy1JTkZPL1BLRy1JTkZPCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBrZ19pbmYpOgogICAgICAgICAgICBmID0gb3Blbihwa2dfaW5mLCAndycpCiAgICAgICAgICAgIGYud3JpdGUoJ01ldGFkYXRhLVZlcnNpb246IDEuMFxuJykKICAgICAgICAgICAgZm9yIGssIHYgaW4gY2ZnLml0ZW1zKCdtZXRhZGF0YScpOgogICAgICAgICAgICAgICAgaWYgayAhPSAndGFyZ2V0X3ZlcnNpb24nOgogICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyVzOiAlc1xuJyAlIChrLnJlcGxhY2UoJ18nLCAnLScpLnRpdGxlKCksIHYpKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICBzY3JpcHRfZGlyID0gb3MucGF0aC5qb2luKF9lZ2dfaW5mbywgJ3NjcmlwdHMnKQogICAgICAgICMgZGVsZXRlIGVudHJ5LXBvaW50IHNjcmlwdHMgdG8gYXZvaWQgZHVwaW5nCiAgICAgICAgc2VsZi5kZWxldGVfYmxvY2tlcnMoWwogICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2NyaXB0X2RpciwgYXJnc1swXSkKICAgICAgICAgICAgZm9yIGFyZ3MgaW4gU2NyaXB0V3JpdGVyLmdldF9hcmdzKGRpc3QpCiAgICAgICAgXSkKICAgICAgICAjIEJ1aWxkIC5lZ2cgZmlsZSBmcm9tIHRtcGRpcgogICAgICAgIGJkaXN0X2VnZy5tYWtlX3ppcGZpbGUoCiAgICAgICAgICAgIGVnZ19wYXRoLCBlZ2dfdG1wLCB2ZXJib3NlPXNlbGYudmVyYm9zZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sCiAgICAgICAgKQogICAgICAgICMgaW5zdGFsbCB0aGUgLmVnZwogICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfZWdnKGVnZ19wYXRoLCB0bXBkaXIpCgogICAgZGVmIGV4ZV90b19lZ2coc2VsZiwgZGlzdF9maWxlbmFtZSwgZWdnX3RtcCk6CiAgICAgICAgIiIiRXh0cmFjdCBhIGJkaXN0X3dpbmluc3QgdG8gdGhlIGRpcmVjdG9yaWVzIGFuIGVnZyB3b3VsZCB1c2UiIiIKICAgICAgICAjIENoZWNrIGZvciAucHRoIGZpbGUgYW5kIHNldCB1cCBwcmVmaXggdHJhbnNsYXRpb25zCiAgICAgICAgcHJlZml4ZXMgPSBnZXRfZXhlX3ByZWZpeGVzKGRpc3RfZmlsZW5hbWUpCiAgICAgICAgdG9fY29tcGlsZSA9IFtdCiAgICAgICAgbmF0aXZlX2xpYnMgPSBbXQogICAgICAgIHRvcF9sZXZlbCA9IHt9CgogICAgICAgIGRlZiBwcm9jZXNzKHNyYywgZHN0KToKICAgICAgICAgICAgcyA9IHNyYy5sb3dlcigpCiAgICAgICAgICAgIGZvciBvbGQsIG5ldyBpbiBwcmVmaXhlczoKICAgICAgICAgICAgICAgIGlmIHMuc3RhcnRzd2l0aChvbGQpOgogICAgICAgICAgICAgICAgICAgIHNyYyA9IG5ldyArIHNyY1tsZW4ob2xkKTpdCiAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBzcmMuc3BsaXQoJy8nKQogICAgICAgICAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAqcGFydHMpCiAgICAgICAgICAgICAgICAgICAgZGwgPSBkc3QubG93ZXIoKQogICAgICAgICAgICAgICAgICAgIGlmIGRsLmVuZHN3aXRoKCcucHlkJykgb3IgZGwuZW5kc3dpdGgoJy5kbGwnKToKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHNbLTFdID0gYmRpc3RfZWdnLnN0cmlwX21vZHVsZShwYXJ0c1stMV0pCiAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9sZXZlbFtvcy5wYXRoLnNwbGl0ZXh0KHBhcnRzWzBdKVswXV0gPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9saWJzLmFwcGVuZChzcmMpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBkbC5lbmRzd2l0aCgnLnB5JykgYW5kIG9sZCAhPSAnU0NSSVBUUy8nOgogICAgICAgICAgICAgICAgICAgICAgICB0b3BfbGV2ZWxbb3MucGF0aC5zcGxpdGV4dChwYXJ0c1swXSlbMF1dID0gMQogICAgICAgICAgICAgICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChkc3QpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRzdAogICAgICAgICAgICBpZiBub3Qgc3JjLmVuZHN3aXRoKCcucHRoJyk6CiAgICAgICAgICAgICAgICBsb2cud2FybigiV0FSTklORzogY2FuJ3QgcHJvY2VzcyAlcyIsIHNyYykKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyBleHRyYWN0LCB0cmFja2luZyAucHlkLy5kbGwtPm5hdGl2ZV9saWJzIGFuZCAucHkgLT4gdG9fY29tcGlsZQogICAgICAgIHVucGFja19hcmNoaXZlKGRpc3RfZmlsZW5hbWUsIGVnZ190bXAsIHByb2Nlc3MpCiAgICAgICAgc3R1YnMgPSBbXQogICAgICAgIGZvciByZXMgaW4gbmF0aXZlX2xpYnM6CiAgICAgICAgICAgIGlmIHJlcy5sb3dlcigpLmVuZHN3aXRoKCcucHlkJyk6ICAjIGNyZWF0ZSBzdHVicyBmb3IgLnB5ZCdzCiAgICAgICAgICAgICAgICBwYXJ0cyA9IHJlcy5zcGxpdCgnLycpCiAgICAgICAgICAgICAgICByZXNvdXJjZSA9IHBhcnRzWy0xXQogICAgICAgICAgICAgICAgcGFydHNbLTFdID0gYmRpc3RfZWdnLnN0cmlwX21vZHVsZShwYXJ0c1stMV0pICsgJy5weScKICAgICAgICAgICAgICAgIHB5ZmlsZSA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAqcGFydHMpCiAgICAgICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChweWZpbGUpCiAgICAgICAgICAgICAgICBzdHVicy5hcHBlbmQocHlmaWxlKQogICAgICAgICAgICAgICAgYmRpc3RfZWdnLndyaXRlX3N0dWIocmVzb3VyY2UsIHB5ZmlsZSkKICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKSAgIyBjb21waWxlIC5weSdzCiAgICAgICAgYmRpc3RfZWdnLndyaXRlX3NhZmV0eV9mbGFnKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgJ0VHRy1JTkZPJyksCiAgICAgICAgICAgIGJkaXN0X2VnZy5hbmFseXplX2VnZyhlZ2dfdG1wLCBzdHVicykpICAjIHdyaXRlIHppcC1zYWZldHkgZmxhZwoKICAgICAgICBmb3IgbmFtZSBpbiAndG9wX2xldmVsJywgJ25hdGl2ZV9saWJzJzoKICAgICAgICAgICAgaWYgbG9jYWxzKClbbmFtZV06CiAgICAgICAgICAgICAgICB0eHQgPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgJ0VHRy1JTkZPJywgbmFtZSArICcudHh0JykKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh0eHQpOgogICAgICAgICAgICAgICAgICAgIGYgPSBvcGVuKHR4dCwgJ3cnKQogICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJ1xuJy5qb2luKGxvY2FscygpW25hbWVdKSArICdcbicpCiAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgZGVmIGluc3RhbGxfd2hlZWwoc2VsZiwgd2hlZWxfcGF0aCwgdG1wZGlyKToKICAgICAgICB3aGVlbCA9IFdoZWVsKHdoZWVsX3BhdGgpCiAgICAgICAgYXNzZXJ0IHdoZWVsLmlzX2NvbXBhdGlibGUoKQogICAgICAgIGRlc3RpbmF0aW9uID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIHdoZWVsLmVnZ19uYW1lKCkpCiAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmFic3BhdGgoZGVzdGluYXRpb24pCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShkZXN0aW5hdGlvbikKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRlc3RpbmF0aW9uKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKGRlc3RpbmF0aW9uKToKICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoZGVzdGluYXRpb24sIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoZGVzdGluYXRpb24pOgogICAgICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICBvcy51bmxpbmssCiAgICAgICAgICAgICAgICAoZGVzdGluYXRpb24sKSwKICAgICAgICAgICAgICAgICJSZW1vdmluZyAiICsgZGVzdGluYXRpb24sCiAgICAgICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgICAgIHdoZWVsLmluc3RhbGxfYXNfZWdnLAogICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uLCksCiAgICAgICAgICAgICAgICAoIkluc3RhbGxpbmcgJXMgdG8gJXMiKSAlICgKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKHdoZWVsX3BhdGgpLAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShkZXN0aW5hdGlvbikKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICB1cGRhdGVfZGlzdF9jYWNoZXMoZGVzdGluYXRpb24sIGZpeF96aXBpbXBvcnRlcl9jYWNoZXM9RmFsc2UpCiAgICAgICAgc2VsZi5hZGRfb3V0cHV0KGRlc3RpbmF0aW9uKQogICAgICAgIHJldHVybiBzZWxmLmVnZ19kaXN0cmlidXRpb24oZGVzdGluYXRpb24pCgogICAgX19tdl93YXJuaW5nID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIEJlY2F1c2UgdGhpcyBkaXN0cmlidXRpb24gd2FzIGluc3RhbGxlZCAtLW11bHRpLXZlcnNpb24sIGJlZm9yZSB5b3UgY2FuCiAgICAgICAgaW1wb3J0IG1vZHVsZXMgZnJvbSB0aGlzIHBhY2thZ2UgaW4gYW4gYXBwbGljYXRpb24sIHlvdSB3aWxsIG5lZWQgdG8KICAgICAgICAnaW1wb3J0IHBrZ19yZXNvdXJjZXMnIGFuZCB0aGVuIHVzZSBhICdyZXF1aXJlKCknIGNhbGwgc2ltaWxhciB0byBvbmUgb2YKICAgICAgICB0aGVzZSBleGFtcGxlcywgaW4gb3JkZXIgdG8gc2VsZWN0IHRoZSBkZXNpcmVkIHZlcnNpb246CgogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnJlcXVpcmUoIiUobmFtZSlzIikgICMgbGF0ZXN0IGluc3RhbGxlZCB2ZXJzaW9uCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZSgiJShuYW1lKXM9PSUodmVyc2lvbilzIikgICMgdGhpcyBleGFjdCB2ZXJzaW9uCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZSgiJShuYW1lKXM+PSUodmVyc2lvbilzIikgICMgdGhpcyB2ZXJzaW9uIG9yIGhpZ2hlcgogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBfX2lkX3dhcm5pbmcgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgTm90ZSBhbHNvIHRoYXQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgbXVzdCBiZSBvbiBzeXMucGF0aCBhdCBydW50aW1lIGZvcgogICAgICAgIHRoaXMgdG8gd29yay4gIChlLmcuIGJ5IGJlaW5nIHRoZSBhcHBsaWNhdGlvbidzIHNjcmlwdCBkaXJlY3RvcnksIGJ5IGJlaW5nIG9uCiAgICAgICAgUFlUSE9OUEFUSCwgb3IgYnkgYmVpbmcgYWRkZWQgdG8gc3lzLnBhdGggYnkgeW91ciBjb2RlLikKICAgICAgICAiIiIpCgogICAgZGVmIGluc3RhbGxhdGlvbl9yZXBvcnQoc2VsZiwgcmVxLCBkaXN0LCB3aGF0PSJJbnN0YWxsZWQiKToKICAgICAgICAiIiJIZWxwZnVsIGluc3RhbGxhdGlvbiBtZXNzYWdlIGZvciBkaXNwbGF5IHRvIHBhY2thZ2UgdXNlcnMiIiIKICAgICAgICBtc2cgPSAiXG4lKHdoYXQpcyAlKGVnZ2xvYylzJShleHRyYXMpcyIKICAgICAgICBpZiBzZWxmLm11bHRpX3ZlcnNpb24gYW5kIG5vdCBzZWxmLm5vX3JlcG9ydDoKICAgICAgICAgICAgbXNnICs9ICdcbicgKyBzZWxmLl9fbXZfd2FybmluZwogICAgICAgICAgICBpZiBzZWxmLmluc3RhbGxfZGlyIG5vdCBpbiBtYXAobm9ybWFsaXplX3BhdGgsIHN5cy5wYXRoKToKICAgICAgICAgICAgICAgIG1zZyArPSAnXG4nICsgc2VsZi5fX2lkX3dhcm5pbmcKCiAgICAgICAgZWdnbG9jID0gZGlzdC5sb2NhdGlvbgogICAgICAgIG5hbWUgPSBkaXN0LnByb2plY3RfbmFtZQogICAgICAgIHZlcnNpb24gPSBkaXN0LnZlcnNpb24KICAgICAgICBleHRyYXMgPSAnJyAgIyBUT0RPOiBzZWxmLnJlcG9ydF9leHRyYXMocmVxLCBkaXN0KQogICAgICAgIHJldHVybiBtc2cgJSBsb2NhbHMoKQoKICAgIF9fZWRpdGFibGVfbXNnID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIEV4dHJhY3RlZCBlZGl0YWJsZSB2ZXJzaW9uIG9mICUoc3BlYylzIHRvICUoZGlybmFtZSlzCgogICAgICAgIElmIGl0IHVzZXMgc2V0dXB0b29scyBpbiBpdHMgc2V0dXAgc2NyaXB0LCB5b3UgY2FuIGFjdGl2YXRlIGl0IGluCiAgICAgICAgImRldmVsb3BtZW50IiBtb2RlIGJ5IGdvaW5nIHRvIHRoYXQgZGlyZWN0b3J5IGFuZCBydW5uaW5nOjoKCiAgICAgICAgICAgICUocHl0aG9uKXMgc2V0dXAucHkgZGV2ZWxvcAoKICAgICAgICBTZWUgdGhlIHNldHVwdG9vbHMgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJkZXZlbG9wIiBjb21tYW5kIGZvciBtb3JlIGluZm8uCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIGRlZiByZXBvcnRfZWRpdGFibGUoc2VsZiwgc3BlYywgc2V0dXBfc2NyaXB0KToKICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHNldHVwX3NjcmlwdCkKICAgICAgICBweXRob24gPSBzeXMuZXhlY3V0YWJsZQogICAgICAgIHJldHVybiAnXG4nICsgc2VsZi5fX2VkaXRhYmxlX21zZyAlIGxvY2FscygpCgogICAgZGVmIHJ1bl9zZXR1cChzZWxmLCBzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UsIGFyZ3MpOgogICAgICAgIHN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJ2Rpc3R1dGlscy5jb21tYW5kLmJkaXN0X2VnZycsIGJkaXN0X2VnZykKICAgICAgICBzeXMubW9kdWxlcy5zZXRkZWZhdWx0KCdkaXN0dXRpbHMuY29tbWFuZC5lZ2dfaW5mbycsIGVnZ19pbmZvKQoKICAgICAgICBhcmdzID0gbGlzdChhcmdzKQogICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDI6CiAgICAgICAgICAgIHYgPSAndicgKiAoc2VsZi52ZXJib3NlIC0gMSkKICAgICAgICAgICAgYXJncy5pbnNlcnQoMCwgJy0nICsgdikKICAgICAgICBlbGlmIHNlbGYudmVyYm9zZSA8IDI6CiAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsICctcScpCiAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBhcmdzLmluc2VydCgwLCAnLW4nKQogICAgICAgIGxvZy5pbmZvKAogICAgICAgICAgICAiUnVubmluZyAlcyAlcyIsIHNldHVwX3NjcmlwdFtsZW4oc2V0dXBfYmFzZSkgKyAxOl0sICcgJy5qb2luKGFyZ3MpCiAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgcnVuX3NldHVwKHNldHVwX3NjcmlwdCwgYXJncykKICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCBhcyB2OgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigiU2V0dXAgc2NyaXB0IGV4aXRlZCB3aXRoICVzIiAlICh2LmFyZ3NbMF0sKSkKCiAgICBkZWYgYnVpbGRfYW5kX2luc3RhbGwoc2VsZiwgc2V0dXBfc2NyaXB0LCBzZXR1cF9iYXNlKToKICAgICAgICBhcmdzID0gWydiZGlzdF9lZ2cnLCAnLS1kaXN0LWRpciddCgogICAgICAgIGRpc3RfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgKICAgICAgICAgICAgcHJlZml4PSdlZ2ctZGlzdC10bXAtJywgZGlyPW9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpCiAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fc2V0X2ZldGNoZXJfb3B0aW9ucyhvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KSkKICAgICAgICAgICAgYXJncy5hcHBlbmQoZGlzdF9kaXIpCgogICAgICAgICAgICBzZWxmLnJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UsIGFyZ3MpCiAgICAgICAgICAgIGFsbF9lZ2dzID0gRW52aXJvbm1lbnQoW2Rpc3RfZGlyXSkKICAgICAgICAgICAgZWdncyA9IFtdCiAgICAgICAgICAgIGZvciBrZXkgaW4gYWxsX2VnZ3M6CiAgICAgICAgICAgICAgICBmb3IgZGlzdCBpbiBhbGxfZWdnc1trZXldOgogICAgICAgICAgICAgICAgICAgIGVnZ3MuYXBwZW5kKHNlbGYuaW5zdGFsbF9lZ2coZGlzdC5sb2NhdGlvbiwgc2V0dXBfYmFzZSkpCiAgICAgICAgICAgIGlmIG5vdCBlZ2dzIGFuZCBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgbG9nLndhcm4oIk5vIGVnZ3MgZm91bmQgaW4gJXMgKHNldHVwIHNjcmlwdCBwcm9ibGVtPykiLAogICAgICAgICAgICAgICAgICAgICAgICAgZGlzdF9kaXIpCiAgICAgICAgICAgIHJldHVybiBlZ2dzCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgcm10cmVlKGRpc3RfZGlyKQogICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UpICAjIHJlc3RvcmUgb3VyIGxvZyB2ZXJib3NpdHkKCiAgICBkZWYgX3NldF9mZXRjaGVyX29wdGlvbnMoc2VsZiwgYmFzZSk6CiAgICAgICAgIiIiCiAgICAgICAgV2hlbiBlYXN5X2luc3RhbGwgaXMgYWJvdXQgdG8gcnVuIGJkaXN0X2VnZyBvbiBhIHNvdXJjZSBkaXN0LCB0aGF0CiAgICAgICAgc291cmNlIGRpc3QgbWlnaHQgaGF2ZSAnc2V0dXBfcmVxdWlyZXMnIGRpcmVjdGl2ZXMsIHJlcXVpcmluZwogICAgICAgIGFkZGl0aW9uYWwgZmV0Y2hpbmcuIEVuc3VyZSB0aGUgZmV0Y2hlciBvcHRpb25zIGdpdmVuIHRvIGVhc3lfaW5zdGFsbAogICAgICAgIGFyZSBhdmFpbGFibGUgdG8gdGhhdCBjb21tYW5kIGFzIHdlbGwuCiAgICAgICAgIiIiCiAgICAgICAgIyBmaW5kIHRoZSBmZXRjaCBvcHRpb25zIGZyb20gZWFzeV9pbnN0YWxsIGFuZCB3cml0ZSB0aGVtIG91dAogICAgICAgICMgdG8gdGhlIHNldHVwLmNmZyBmaWxlLgogICAgICAgIGVpX29wdHMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpLmNvcHkoKQogICAgICAgIGZldGNoX2RpcmVjdGl2ZXMgPSAoCiAgICAgICAgICAgICdmaW5kX2xpbmtzJywgJ3NpdGVfZGlycycsICdpbmRleF91cmwnLCAnb3B0aW1pemUnLAogICAgICAgICAgICAnc2l0ZV9kaXJzJywgJ2FsbG93X2hvc3RzJywKICAgICAgICApCiAgICAgICAgZmV0Y2hfb3B0aW9ucyA9IHt9CiAgICAgICAgZm9yIGtleSwgdmFsIGluIGVpX29wdHMuaXRlbXMoKToKICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBmZXRjaF9kaXJlY3RpdmVzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZmV0Y2hfb3B0aW9uc1trZXkucmVwbGFjZSgnXycsICctJyldID0gdmFsWzFdCiAgICAgICAgIyBjcmVhdGUgYSBzZXR0aW5ncyBkaWN0aW9uYXJ5IHN1aXRhYmxlIGZvciBgZWRpdF9jb25maWdgCiAgICAgICAgc2V0dGluZ3MgPSBkaWN0KGVhc3lfaW5zdGFsbD1mZXRjaF9vcHRpb25zKQogICAgICAgIGNmZ19maWxlbmFtZSA9IG9zLnBhdGguam9pbihiYXNlLCAnc2V0dXAuY2ZnJykKICAgICAgICBzZXRvcHQuZWRpdF9jb25maWcoY2ZnX2ZpbGVuYW1lLCBzZXR0aW5ncykKCiAgICBkZWYgdXBkYXRlX3B0aChzZWxmLCBkaXN0KToKICAgICAgICBpZiBzZWxmLnB0aF9maWxlIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBmb3IgZCBpbiBzZWxmLnB0aF9maWxlW2Rpc3Qua2V5XTogICMgZHJvcCBvbGQgZW50cmllcwogICAgICAgICAgICBpZiBzZWxmLm11bHRpX3ZlcnNpb24gb3IgZC5sb2NhdGlvbiAhPSBkaXN0LmxvY2F0aW9uOgogICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nICVzIGZyb20gZWFzeS1pbnN0YWxsLnB0aCBmaWxlIiwgZCkKICAgICAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUucmVtb3ZlKGQpCiAgICAgICAgICAgICAgICBpZiBkLmxvY2F0aW9uIGluIHNlbGYuc2hhZG93X3BhdGg6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGFkb3dfcGF0aC5yZW1vdmUoZC5sb2NhdGlvbikKCiAgICAgICAgaWYgbm90IHNlbGYubXVsdGlfdmVyc2lvbjoKICAgICAgICAgICAgaWYgZGlzdC5sb2NhdGlvbiBpbiBzZWxmLnB0aF9maWxlLnBhdGhzOgogICAgICAgICAgICAgICAgbG9nLmluZm8oCiAgICAgICAgICAgICAgICAgICAgIiVzIGlzIGFscmVhZHkgdGhlIGFjdGl2ZSB2ZXJzaW9uIGluIGVhc3ktaW5zdGFsbC5wdGgiLAogICAgICAgICAgICAgICAgICAgIGRpc3QsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2cuaW5mbygiQWRkaW5nICVzIHRvIGVhc3ktaW5zdGFsbC5wdGggZmlsZSIsIGRpc3QpCiAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlLmFkZChkaXN0KSAgIyBhZGQgbmV3IGVudHJ5CiAgICAgICAgICAgICAgICBpZiBkaXN0LmxvY2F0aW9uIG5vdCBpbiBzZWxmLnNoYWRvd19wYXRoOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hhZG93X3BhdGguYXBwZW5kKGRpc3QubG9jYXRpb24pCgogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CgogICAgICAgICAgICBzZWxmLnB0aF9maWxlLnNhdmUoKQoKICAgICAgICAgICAgaWYgZGlzdC5rZXkgPT0gJ3NldHVwdG9vbHMnOgogICAgICAgICAgICAgICAgIyBFbnN1cmUgdGhhdCBzZXR1cHRvb2xzIGl0c2VsZiBuZXZlciBiZWNvbWVzIHVuYXZhaWxhYmxlIQogICAgICAgICAgICAgICAgIyBYWFggc2hvdWxkIHRoaXMgY2hlY2sgZm9yIGxhdGVzdCB2ZXJzaW9uPwogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgJ3NldHVwdG9vbHMucHRoJykKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKGZpbGVuYW1lKToKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3d0JykKICAgICAgICAgICAgICAgIGYud3JpdGUoc2VsZi5wdGhfZmlsZS5tYWtlX3JlbGF0aXZlKGRpc3QubG9jYXRpb24pICsgJ1xuJykKICAgICAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgIGRlZiB1bnBhY2tfcHJvZ3Jlc3Moc2VsZiwgc3JjLCBkc3QpOgogICAgICAgICMgUHJvZ3Jlc3MgZmlsdGVyIGZvciB1bnBhY2tpbmcKICAgICAgICBsb2cuZGVidWcoIlVucGFja2luZyAlcyB0byAlcyIsIHNyYywgZHN0KQogICAgICAgIHJldHVybiBkc3QgICMgb25seSB1bnBhY2stYW5kLWNvbXBpbGUgc2tpcHMgZmlsZXMgZm9yIGRyeSBydW4KCiAgICBkZWYgdW5wYWNrX2FuZF9jb21waWxlKHNlbGYsIGVnZ19wYXRoLCBkZXN0aW5hdGlvbik6CiAgICAgICAgdG9fY29tcGlsZSA9IFtdCiAgICAgICAgdG9fY2htb2QgPSBbXQoKICAgICAgICBkZWYgcGYoc3JjLCBkc3QpOgogICAgICAgICAgICBpZiBkc3QuZW5kc3dpdGgoJy5weScpIGFuZCBub3Qgc3JjLnN0YXJ0c3dpdGgoJ0VHRy1JTkZPLycpOgogICAgICAgICAgICAgICAgdG9fY29tcGlsZS5hcHBlbmQoZHN0KQogICAgICAgICAgICBlbGlmIGRzdC5lbmRzd2l0aCgnLmRsbCcpIG9yIGRzdC5lbmRzd2l0aCgnLnNvJyk6CiAgICAgICAgICAgICAgICB0b19jaG1vZC5hcHBlbmQoZHN0KQogICAgICAgICAgICBzZWxmLnVucGFja19wcm9ncmVzcyhzcmMsIGRzdCkKICAgICAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmRyeV9ydW4gYW5kIGRzdCBvciBOb25lCgogICAgICAgIHVucGFja19hcmNoaXZlKGVnZ19wYXRoLCBkZXN0aW5hdGlvbiwgcGYpCiAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUodG9fY29tcGlsZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBmb3IgZiBpbiB0b19jaG1vZDoKICAgICAgICAgICAgICAgIG1vZGUgPSAoKG9zLnN0YXQoZilbc3RhdC5TVF9NT0RFXSkgfCAwbzU1NSkgJiAwbzc3NTUKICAgICAgICAgICAgICAgIGNobW9kKGYsIG1vZGUpCgogICAgZGVmIGJ5dGVfY29tcGlsZShzZWxmLCB0b19jb21waWxlKToKICAgICAgICBpZiBzeXMuZG9udF93cml0ZV9ieXRlY29kZToKICAgICAgICAgICAgc2VsZi53YXJuKCdieXRlLWNvbXBpbGluZyBpcyBkaXNhYmxlZCwgc2tpcHBpbmcuJykKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGJ5dGVfY29tcGlsZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgdHJ5IHRvIG1ha2UgdGhlIGJ5dGUgY29tcGlsZSBtZXNzYWdlcyBxdWlldGVyCiAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSAtIDEpCgogICAgICAgICAgICBieXRlX2NvbXBpbGUodG9fY29tcGlsZSwgb3B0aW1pemU9MCwgZm9yY2U9MSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgICAgIGlmIHNlbGYub3B0aW1pemU6CiAgICAgICAgICAgICAgICBieXRlX2NvbXBpbGUoCiAgICAgICAgICAgICAgICAgICAgdG9fY29tcGlsZSwgb3B0aW1pemU9c2VsZi5vcHRpbWl6ZSwgZm9yY2U9MSwKICAgICAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1biwKICAgICAgICAgICAgICAgICkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UpICAjIHJlc3RvcmUgb3JpZ2luYWwgdmVyYm9zaXR5CgogICAgX19ub19kZWZhdWx0X21zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBiYWQgaW5zdGFsbCBkaXJlY3Rvcnkgb3IgUFlUSE9OUEFUSAoKICAgICAgICBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gaW5zdGFsbCBhIHBhY2thZ2UgdG8gYSBkaXJlY3RvcnkgdGhhdCBpcyBub3QKICAgICAgICBvbiBQWVRIT05QQVRIIGFuZCB3aGljaCBQeXRob24gZG9lcyBub3QgcmVhZCAiLnB0aCIgZmlsZXMgZnJvbS4gIFRoZQogICAgICAgIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgeW91IHNwZWNpZmllZCAodmlhIC0taW5zdGFsbC1kaXIsIC0tcHJlZml4LCBvcgogICAgICAgIHRoZSBkaXN0dXRpbHMgZGVmYXVsdCBzZXR0aW5nKSB3YXM6CgogICAgICAgICAgICAlcwoKICAgICAgICBhbmQgeW91ciBQWVRIT05QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGN1cnJlbnRseSBjb250YWluczoKCiAgICAgICAgICAgICVyCgogICAgICAgIEhlcmUgYXJlIHNvbWUgb2YgeW91ciBvcHRpb25zIGZvciBjb3JyZWN0aW5nIHRoZSBwcm9ibGVtOgoKICAgICAgICAqIFlvdSBjYW4gY2hvb3NlIGEgZGlmZmVyZW50IGluc3RhbGxhdGlvbiBkaXJlY3RvcnksIGkuZS4sIG9uZSB0aGF0IGlzCiAgICAgICAgICBvbiBQWVRIT05QQVRIIG9yIHN1cHBvcnRzIC5wdGggZmlsZXMKCiAgICAgICAgKiBZb3UgY2FuIGFkZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB0byB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudAogICAgICAgICAgdmFyaWFibGUuICAoSXQgbXVzdCB0aGVuIGFsc28gYmUgb24gUFlUSE9OUEFUSCB3aGVuZXZlciB5b3UgcnVuCiAgICAgICAgICBQeXRob24gYW5kIHdhbnQgdG8gdXNlIHRoZSBwYWNrYWdlKHMpIHlvdSBhcmUgaW5zdGFsbGluZy4pCgogICAgICAgICogWW91IGNhbiBzZXQgdXAgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgdG8gc3VwcG9ydCAiLnB0aCIgZmlsZXMgYnkKICAgICAgICAgIHVzaW5nIG9uZSBvZiB0aGUgYXBwcm9hY2hlcyBkZXNjcmliZWQgaGVyZToKCiAgICAgICAgICBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2Vhc3lfaW5zdGFsbC5odG1sI2N1c3RvbS1pbnN0YWxsYXRpb24tbG9jYXRpb25zCgoKICAgICAgICBQbGVhc2UgbWFrZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlcyBmb3IgeW91ciBzeXN0ZW0gYW5kIHRyeSBhZ2Fpbi4iIiIpLmxzdHJpcCgpCgogICAgZGVmIG5vX2RlZmF1bHRfdmVyc2lvbl9tc2coc2VsZik6CiAgICAgICAgdGVtcGxhdGUgPSBzZWxmLl9fbm9fZGVmYXVsdF9tc2cKICAgICAgICByZXR1cm4gdGVtcGxhdGUgJSAoc2VsZi5pbnN0YWxsX2Rpciwgb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCAnJykpCgogICAgZGVmIGluc3RhbGxfc2l0ZV9weShzZWxmKToKICAgICAgICAiIiJNYWtlIHN1cmUgdGhlcmUncyBhIHNpdGUucHkgaW4gdGhlIHRhcmdldCBkaXIsIGlmIG5lZWRlZCIiIgoKICAgICAgICBpZiBzZWxmLnNpdGVweV9pbnN0YWxsZWQ6CiAgICAgICAgICAgIHJldHVybiAgIyBhbHJlYWR5IGRpZCBpdCwgb3IgZG9uJ3QgbmVlZCB0bwoKICAgICAgICBzaXRlcHkgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgInNpdGUucHkiKQogICAgICAgIHNvdXJjZSA9IHJlc291cmNlX3N0cmluZygic2V0dXB0b29scyIsICJzaXRlLXBhdGNoLnB5IikKICAgICAgICBzb3VyY2UgPSBzb3VyY2UuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgY3VycmVudCA9ICIiCgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNpdGVweSk6CiAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hlY2tpbmcgZXhpc3Rpbmcgc2l0ZS5weSBpbiAlcyIsIHNlbGYuaW5zdGFsbF9kaXIpCiAgICAgICAgICAgIHdpdGggaW8ub3BlbihzaXRlcHkpIGFzIHN0cm06CiAgICAgICAgICAgICAgICBjdXJyZW50ID0gc3RybS5yZWFkKCkKCiAgICAgICAgICAgIGlmIG5vdCBjdXJyZW50LnN0YXJ0c3dpdGgoJ2RlZiBfX2Jvb3QoKTonKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzZXR1cHRvb2xzLWdlbmVyYXRlZCBzaXRlLnB5OyBwbGVhc2UiCiAgICAgICAgICAgICAgICAgICAgIiByZW1vdmUgaXQuIiAlIHNpdGVweQogICAgICAgICAgICAgICAgKQoKICAgICAgICBpZiBjdXJyZW50ICE9IHNvdXJjZToKICAgICAgICAgICAgbG9nLmluZm8oIkNyZWF0aW5nICVzIiwgc2l0ZXB5KQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShzaXRlcHkpCiAgICAgICAgICAgICAgICB3aXRoIGlvLm9wZW4oc2l0ZXB5LCAndycsIGVuY29kaW5nPSd1dGYtOCcpIGFzIHN0cm06CiAgICAgICAgICAgICAgICAgICAgc3RybS53cml0ZShzb3VyY2UpCiAgICAgICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKFtzaXRlcHldKQoKICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlCgogICAgZGVmIGNyZWF0ZV9ob21lX3BhdGgoc2VsZik6CiAgICAgICAgIiIiQ3JlYXRlIGRpcmVjdG9yaWVzIHVuZGVyIH4uIiIiCiAgICAgICAgaWYgbm90IHNlbGYudXNlcjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaG9tZSA9IGNvbnZlcnRfcGF0aChvcy5wYXRoLmV4cGFuZHVzZXIoIn4iKSkKICAgICAgICBmb3IgbmFtZSwgcGF0aCBpbiBzaXguaXRlcml0ZW1zKHNlbGYuY29uZmlnX3ZhcnMpOgogICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoaG9tZSkgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgib3MubWFrZWRpcnMoJyVzJywgMG83MDApIiAlIHBhdGgpCiAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhwYXRoLCAwbzcwMCkKCiAgICBJTlNUQUxMX1NDSEVNRVMgPSBkaWN0KAogICAgICAgIHBvc2l4PWRpY3QoCiAgICAgICAgICAgIGluc3RhbGxfZGlyPSckYmFzZS9saWIvcHl0aG9uJHB5X3ZlcnNpb25fc2hvcnQvc2l0ZS1wYWNrYWdlcycsCiAgICAgICAgICAgIHNjcmlwdF9kaXI9JyRiYXNlL2JpbicsCiAgICAgICAgKSwKICAgICkKCiAgICBERUZBVUxUX1NDSEVNRSA9IGRpY3QoCiAgICAgICAgaW5zdGFsbF9kaXI9JyRiYXNlL0xpYi9zaXRlLXBhY2thZ2VzJywKICAgICAgICBzY3JpcHRfZGlyPSckYmFzZS9TY3JpcHRzJywKICAgICkKCiAgICBkZWYgX2V4cGFuZChzZWxmLCAqYXR0cnMpOgogICAgICAgIGNvbmZpZ192YXJzID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKS5jb25maWdfdmFycwoKICAgICAgICBpZiBzZWxmLnByZWZpeDoKICAgICAgICAgICAgIyBTZXQgZGVmYXVsdCBpbnN0YWxsX2Rpci9zY3JpcHRzIGZyb20gLS1wcmVmaXgKICAgICAgICAgICAgY29uZmlnX3ZhcnMgPSBjb25maWdfdmFycy5jb3B5KCkKICAgICAgICAgICAgY29uZmlnX3ZhcnNbJ2Jhc2UnXSA9IHNlbGYucHJlZml4CiAgICAgICAgICAgIHNjaGVtZSA9IHNlbGYuSU5TVEFMTF9TQ0hFTUVTLmdldChvcy5uYW1lLCBzZWxmLkRFRkFVTFRfU0NIRU1FKQogICAgICAgICAgICBmb3IgYXR0ciwgdmFsIGluIHNjaGVtZS5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCBhdHRyLCBOb25lKSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsKQoKICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBzdWJzdF92YXJzCgogICAgICAgIGZvciBhdHRyIGluIGF0dHJzOgogICAgICAgICAgICB2YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpCiAgICAgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHZhbCA9IHN1YnN0X3ZhcnModmFsLCBjb25maWdfdmFycykKICAgICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKICAgICAgICAgICAgICAgICAgICB2YWwgPSBvcy5wYXRoLmV4cGFuZHVzZXIodmFsKQogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWwpCgoKZGVmIF9weXRob25wYXRoKCk6CiAgICBpdGVtcyA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywgJycpLnNwbGl0KG9zLnBhdGhzZXApCiAgICByZXR1cm4gZmlsdGVyKE5vbmUsIGl0ZW1zKQoKCmRlZiBnZXRfc2l0ZV9kaXJzKCk6CiAgICAiIiIKICAgIFJldHVybiBhIGxpc3Qgb2YgJ3NpdGUnIGRpcnMKICAgICIiIgoKICAgIHNpdGVkaXJzID0gW10KCiAgICAjIHN0YXJ0IHdpdGggUFlUSE9OUEFUSAogICAgc2l0ZWRpcnMuZXh0ZW5kKF9weXRob25wYXRoKCkpCgogICAgcHJlZml4ZXMgPSBbc3lzLnByZWZpeF0KICAgIGlmIHN5cy5leGVjX3ByZWZpeCAhPSBzeXMucHJlZml4OgogICAgICAgIHByZWZpeGVzLmFwcGVuZChzeXMuZXhlY19wcmVmaXgpCiAgICBmb3IgcHJlZml4IGluIHByZWZpeGVzOgogICAgICAgIGlmIHByZWZpeDoKICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnb3MyZW14JywgJ3Jpc2NvcycpOgogICAgICAgICAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKG9zLnBhdGguam9pbihwcmVmaXgsICJMaWIiLCAic2l0ZS1wYWNrYWdlcyIpKQogICAgICAgICAgICBlbGlmIG9zLnNlcCA9PSAnLyc6CiAgICAgICAgICAgICAgICBzaXRlZGlycy5leHRlbmQoWwogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAibGliIiwKICAgICAgICAgICAgICAgICAgICAgICAgInB5dGhvbiIgKyBzeXMudmVyc2lvbls6M10sCiAgICAgICAgICAgICAgICAgICAgICAgICJzaXRlLXBhY2thZ2VzIiwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihwcmVmaXgsICJsaWIiLCAic2l0ZS1weXRob24iKSwKICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzaXRlZGlycy5leHRlbmQoWwogICAgICAgICAgICAgICAgICAgIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4ocHJlZml4LCAibGliIiwgInNpdGUtcGFja2FnZXMiKSwKICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgICAgICAgICMgZm9yIGZyYW1ld29yayBidWlsZHMgKm9ubHkqIHdlIGFkZCB0aGUgc3RhbmRhcmQgQXBwbGUKICAgICAgICAgICAgICAgICMgbG9jYXRpb25zLiBDdXJyZW50bHkgb25seSBwZXItdXNlciwgYnV0IC9MaWJyYXJ5IGFuZAogICAgICAgICAgICAgICAgIyAvTmV0d29yay9MaWJyYXJ5IGNvdWxkIGJlIGFkZGVkIHRvbwogICAgICAgICAgICAgICAgaWYgJ1B5dGhvbi5mcmFtZXdvcmsnIGluIHByZWZpeDoKICAgICAgICAgICAgICAgICAgICBob21lID0gb3MuZW52aXJvbi5nZXQoJ0hPTUUnKQogICAgICAgICAgICAgICAgICAgIGlmIGhvbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGhvbWVfc3AgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob21lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xpYnJhcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1B5dGhvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbls6M10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZS1wYWNrYWdlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKGhvbWVfc3ApCiAgICBsaWJfcGF0aHMgPSBnZXRfcGF0aCgncHVyZWxpYicpLCBnZXRfcGF0aCgncGxhdGxpYicpCiAgICBmb3Igc2l0ZV9saWIgaW4gbGliX3BhdGhzOgogICAgICAgIGlmIHNpdGVfbGliIG5vdCBpbiBzaXRlZGlyczoKICAgICAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKHNpdGVfbGliKQoKICAgIGlmIHNpdGUuRU5BQkxFX1VTRVJfU0lURToKICAgICAgICBzaXRlZGlycy5hcHBlbmQoc2l0ZS5VU0VSX1NJVEUpCgogICAgdHJ5OgogICAgICAgIHNpdGVkaXJzLmV4dGVuZChzaXRlLmdldHNpdGVwYWNrYWdlcygpKQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHBhc3MKCiAgICBzaXRlZGlycyA9IGxpc3QobWFwKG5vcm1hbGl6ZV9wYXRoLCBzaXRlZGlycykpCgogICAgcmV0dXJuIHNpdGVkaXJzCgoKZGVmIGV4cGFuZF9wYXRocyhpbnB1dHMpOgogICAgIiIiWWllbGQgc3lzLnBhdGggZGlyZWN0b3JpZXMgdGhhdCBtaWdodCBjb250YWluICJvbGQtc3R5bGUiIHBhY2thZ2VzIiIiCgogICAgc2VlbiA9IHt9CgogICAgZm9yIGRpcm5hbWUgaW4gaW5wdXRzOgogICAgICAgIGRpcm5hbWUgPSBub3JtYWxpemVfcGF0aChkaXJuYW1lKQogICAgICAgIGlmIGRpcm5hbWUgaW4gc2VlbjoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgc2VlbltkaXJuYW1lXSA9IDEKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCiAgICAgICAgeWllbGQgZGlybmFtZSwgZmlsZXMKCiAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgIGlmIG5vdCBuYW1lLmVuZHN3aXRoKCcucHRoJyk6CiAgICAgICAgICAgICAgICAjIFdlIG9ubHkgY2FyZSBhYm91dCB0aGUgLnB0aCBmaWxlcwogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbmFtZSBpbiAoJ2Vhc3ktaW5zdGFsbC5wdGgnLCAnc2V0dXB0b29scy5wdGgnKToKICAgICAgICAgICAgICAgICMgSWdub3JlIC5wdGggZmlsZXMgdGhhdCB3ZSBjb250cm9sCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBSZWFkIHRoZSAucHRoIGZpbGUKICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpKQogICAgICAgICAgICBsaW5lcyA9IGxpc3QoeWllbGRfbGluZXMoZikpCiAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgICAgICAgICAgIyBZaWVsZCBleGlzdGluZyBub24tZHVwZSwgbm9uLWltcG9ydCBkaXJlY3RvcnkgbGluZXMgZnJvbSBpdAogICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0YXJ0c3dpdGgoImltcG9ydCIpOgogICAgICAgICAgICAgICAgICAgIGxpbmUgPSBub3JtYWxpemVfcGF0aChsaW5lLnJzdHJpcCgpKQogICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5bbGluZV0gPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGxpbmUpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgbGluZSwgb3MubGlzdGRpcihsaW5lKQoKCmRlZiBleHRyYWN0X3dpbmluc3RfY2ZnKGRpc3RfZmlsZW5hbWUpOgogICAgIiIiRXh0cmFjdCBjb25maWd1cmF0aW9uIGRhdGEgZnJvbSBhIGJkaXN0X3dpbmluc3QgLmV4ZQoKICAgIFJldHVybnMgYSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyLCBvciBOb25lCiAgICAiIiIKICAgIGYgPSBvcGVuKGRpc3RfZmlsZW5hbWUsICdyYicpCiAgICB0cnk6CiAgICAgICAgZW5kcmVjID0gemlwZmlsZS5fRW5kUmVjRGF0YShmKQogICAgICAgIGlmIGVuZHJlYyBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBwcmVwZW5kZWQgPSAoZW5kcmVjWzldIC0gZW5kcmVjWzVdKSAtIGVuZHJlY1s2XQogICAgICAgIGlmIHByZXBlbmRlZCA8IDEyOiAgIyBubyB3aW5pbnN0IGRhdGEgaGVyZQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGYuc2VlayhwcmVwZW5kZWQgLSAxMikKCiAgICAgICAgdGFnLCBjZmdsZW4sIGJtbGVuID0gc3RydWN0LnVucGFjaygiPGlpaSIsIGYucmVhZCgxMikpCiAgICAgICAgaWYgdGFnIG5vdCBpbiAoMHgxMjM0NTY3QSwgMHgxMjM0NTY3Qik6CiAgICAgICAgICAgIHJldHVybiBOb25lICAjIG5vdCBhIHZhbGlkIHRhZwoKICAgICAgICBmLnNlZWsocHJlcGVuZGVkIC0gKDEyICsgY2ZnbGVuKSkKICAgICAgICBpbml0ID0geyd2ZXJzaW9uJzogJycsICd0YXJnZXRfdmVyc2lvbic6ICcnfQogICAgICAgIGNmZyA9IGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIoaW5pdCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBhcnQgPSBmLnJlYWQoY2ZnbGVuKQogICAgICAgICAgICAjIFJlYWQgdXAgdG8gdGhlIGZpcnN0IG51bGwgYnl0ZS4KICAgICAgICAgICAgY29uZmlnID0gcGFydC5zcGxpdChiJ1wwJywgMSlbMF0KICAgICAgICAgICAgIyBOb3cgdGhlIGNvbmZpZyBpcyBpbiBieXRlcywgYnV0IGZvciBSYXdDb25maWdQYXJzZXIsIGl0IHNob3VsZAogICAgICAgICAgICAjICBiZSB0ZXh0LCBzbyBkZWNvZGUgaXQuCiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZy5kZWNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQogICAgICAgICAgICBjZmcucmVhZGZwKHNpeC5TdHJpbmdJTyhjb25maWcpKQogICAgICAgIGV4Y2VwdCBjb25maWdwYXJzZXIuRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgaWYgbm90IGNmZy5oYXNfc2VjdGlvbignbWV0YWRhdGEnKSBvciBub3QgY2ZnLmhhc19zZWN0aW9uKCdTZXR1cCcpOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBjZmcKCiAgICBmaW5hbGx5OgogICAgICAgIGYuY2xvc2UoKQoKCmRlZiBnZXRfZXhlX3ByZWZpeGVzKGV4ZV9maWxlbmFtZSk6CiAgICAiIiJHZXQgZXhlLT5lZ2cgcGF0aCB0cmFuc2xhdGlvbnMgZm9yIGEgZ2l2ZW4gLmV4ZSBmaWxlIiIiCgogICAgcHJlZml4ZXMgPSBbCiAgICAgICAgKCdQVVJFTElCLycsICcnKSwKICAgICAgICAoJ1BMQVRMSUIvcHl3aW4zMl9zeXN0ZW0zMicsICcnKSwKICAgICAgICAoJ1BMQVRMSUIvJywgJycpLAogICAgICAgICgnU0NSSVBUUy8nLCAnRUdHLUlORk8vc2NyaXB0cy8nKSwKICAgICAgICAoJ0RBVEEvbGliL3NpdGUtcGFja2FnZXMnLCAnJyksCiAgICBdCiAgICB6ID0gemlwZmlsZS5aaXBGaWxlKGV4ZV9maWxlbmFtZSkKICAgIHRyeToKICAgICAgICBmb3IgaW5mbyBpbiB6LmluZm9saXN0KCk6CiAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCiAgICAgICAgICAgIHBhcnRzID0gbmFtZS5zcGxpdCgnLycpCiAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgPT0gMyBhbmQgcGFydHNbMl0gPT0gJ1BLRy1JTkZPJzoKICAgICAgICAgICAgICAgIGlmIHBhcnRzWzFdLmVuZHN3aXRoKCcuZWdnLWluZm8nKToKICAgICAgICAgICAgICAgICAgICBwcmVmaXhlcy5pbnNlcnQoMCwgKCcvJy5qb2luKHBhcnRzWzoyXSksICdFR0ctSU5GTy8nKSkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBsZW4ocGFydHMpICE9IDIgb3Igbm90IG5hbWUuZW5kc3dpdGgoJy5wdGgnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy1uc3BrZy5wdGgnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIHBhcnRzWzBdLnVwcGVyKCkgaW4gKCdQVVJFTElCJywgJ1BMQVRMSUInKToKICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gei5yZWFkKG5hbWUpCiAgICAgICAgICAgICAgICBpZiBzaXguUFkzOgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gY29udGVudHMuZGVjb2RlKCkKICAgICAgICAgICAgICAgIGZvciBwdGggaW4geWllbGRfbGluZXMoY29udGVudHMpOgogICAgICAgICAgICAgICAgICAgIHB0aCA9IHB0aC5zdHJpcCgpLnJlcGxhY2UoJ1xcJywgJy8nKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwdGguc3RhcnRzd2l0aCgnaW1wb3J0Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeGVzLmFwcGVuZCgoKCclcy8lcy8nICUgKHBhcnRzWzBdLCBwdGgpKSwgJycpKQogICAgZmluYWxseToKICAgICAgICB6LmNsb3NlKCkKICAgIHByZWZpeGVzID0gWyh4Lmxvd2VyKCksIHkpIGZvciB4LCB5IGluIHByZWZpeGVzXQogICAgcHJlZml4ZXMuc29ydCgpCiAgICBwcmVmaXhlcy5yZXZlcnNlKCkKICAgIHJldHVybiBwcmVmaXhlcwoKCmNsYXNzIFB0aERpc3RyaWJ1dGlvbnMoRW52aXJvbm1lbnQpOgogICAgIiIiQSAucHRoIGZpbGUgd2l0aCBEaXN0cmlidXRpb24gcGF0aHMgaW4gaXQiIiIKCiAgICBkaXJ0eSA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBzaXRlZGlycz0oKSk6CiAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgc2VsZi5zaXRlZGlycyA9IGxpc3QobWFwKG5vcm1hbGl6ZV9wYXRoLCBzaXRlZGlycykpCiAgICAgICAgc2VsZi5iYXNlZGlyID0gbm9ybWFsaXplX3BhdGgob3MucGF0aC5kaXJuYW1lKHNlbGYuZmlsZW5hbWUpKQogICAgICAgIHNlbGYuX2xvYWQoKQogICAgICAgIEVudmlyb25tZW50Ll9faW5pdF9fKHNlbGYsIFtdLCBOb25lLCBOb25lKQogICAgICAgIGZvciBwYXRoIGluIHlpZWxkX2xpbmVzKHNlbGYucGF0aHMpOgogICAgICAgICAgICBsaXN0KG1hcChzZWxmLmFkZCwgZmluZF9kaXN0cmlidXRpb25zKHBhdGgsIFRydWUpKSkKCiAgICBkZWYgX2xvYWQoc2VsZik6CiAgICAgICAgc2VsZi5wYXRocyA9IFtdCiAgICAgICAgc2F3X2ltcG9ydCA9IEZhbHNlCiAgICAgICAgc2VlbiA9IGRpY3QuZnJvbWtleXMoc2VsZi5zaXRlZGlycykKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzZWxmLmZpbGVuYW1lKToKICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5maWxlbmFtZSwgJ3J0JykKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnaW1wb3J0Jyk6CiAgICAgICAgICAgICAgICAgICAgc2F3X2ltcG9ydCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcGF0aCA9IGxpbmUucnN0cmlwKCkKICAgICAgICAgICAgICAgIHNlbGYucGF0aHMuYXBwZW5kKHBhdGgpCiAgICAgICAgICAgICAgICBpZiBub3QgcGF0aC5zdHJpcCgpIG9yIHBhdGguc3RyaXAoKS5zdGFydHN3aXRoKCcjJyk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICMgc2tpcCBub24tZXhpc3RlbnQgcGF0aHMsIGluIGNhc2Ugc29tZWJvZHkgZGVsZXRlZCBhIHBhY2thZ2UKICAgICAgICAgICAgICAgICMgbWFudWFsbHksIGFuZCBkdXBsaWNhdGUgcGF0aHMgYXMgd2VsbAogICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYucGF0aHNbLTFdID0gbm9ybWFsaXplX3BhdGgoCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuYmFzZWRpciwgcGF0aCkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKSBvciBwYXRoIGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRocy5wb3AoKSAgIyBza2lwIGl0CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUgICMgd2UgY2xlYW5lZCB1cCwgc28gd2UncmUgZGlydHkgbm93IDopCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHNlZW5bcGF0aF0gPSAxCiAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgICAgICBpZiBzZWxmLnBhdGhzIGFuZCBub3Qgc2F3X2ltcG9ydDoKICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUgICMgZW5zdXJlIGFueXRoaW5nIHdlIHRvdWNoIGhhcyBpbXBvcnQgd3JhcHBlcnMKICAgICAgICB3aGlsZSBzZWxmLnBhdGhzIGFuZCBub3Qgc2VsZi5wYXRoc1stMV0uc3RyaXAoKToKICAgICAgICAgICAgc2VsZi5wYXRocy5wb3AoKQoKICAgIGRlZiBzYXZlKHNlbGYpOgogICAgICAgICIiIldyaXRlIGNoYW5nZWQgLnB0aCBmaWxlIGJhY2sgdG8gZGlzayIiIgogICAgICAgIGlmIG5vdCBzZWxmLmRpcnR5OgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcmVsX3BhdGhzID0gbGlzdChtYXAoc2VsZi5tYWtlX3JlbGF0aXZlLCBzZWxmLnBhdGhzKSkKICAgICAgICBpZiByZWxfcGF0aHM6CiAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2F2aW5nICVzIiwgc2VsZi5maWxlbmFtZSkKICAgICAgICAgICAgbGluZXMgPSBzZWxmLl93cmFwX2xpbmVzKHJlbF9wYXRocykKICAgICAgICAgICAgZGF0YSA9ICdcbicuam9pbihsaW5lcykgKyAnXG4nCgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhzZWxmLmZpbGVuYW1lKToKICAgICAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmZpbGVuYW1lKQogICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlbmFtZSwgJ3d0JykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKCiAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmZpbGVuYW1lKToKICAgICAgICAgICAgbG9nLmRlYnVnKCJEZWxldGluZyBlbXB0eSAlcyIsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmZpbGVuYW1lKQoKICAgICAgICBzZWxmLmRpcnR5ID0gRmFsc2UKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3dyYXBfbGluZXMobGluZXMpOgogICAgICAgIHJldHVybiBsaW5lcwoKICAgIGRlZiBhZGQoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiQWRkIGBkaXN0YCB0byB0aGUgZGlzdHJpYnV0aW9uIG1hcCIiIgogICAgICAgIG5ld19wYXRoID0gKAogICAgICAgICAgICBkaXN0LmxvY2F0aW9uIG5vdCBpbiBzZWxmLnBhdGhzIGFuZCAoCiAgICAgICAgICAgICAgICBkaXN0LmxvY2F0aW9uIG5vdCBpbiBzZWxmLnNpdGVkaXJzIG9yCiAgICAgICAgICAgICAgICAjIGFjY291bnQgZm9yICcuJyBiZWluZyBpbiBQWVRIT05QQVRICiAgICAgICAgICAgICAgICBkaXN0LmxvY2F0aW9uID09IG9zLmdldGN3ZCgpCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgaWYgbmV3X3BhdGg6CiAgICAgICAgICAgIHNlbGYucGF0aHMuYXBwZW5kKGRpc3QubG9jYXRpb24pCiAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlCiAgICAgICAgRW52aXJvbm1lbnQuYWRkKHNlbGYsIGRpc3QpCgogICAgZGVmIHJlbW92ZShzZWxmLCBkaXN0KToKICAgICAgICAiIiJSZW1vdmUgYGRpc3RgIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBtYXAiIiIKICAgICAgICB3aGlsZSBkaXN0LmxvY2F0aW9uIGluIHNlbGYucGF0aHM6CiAgICAgICAgICAgIHNlbGYucGF0aHMucmVtb3ZlKGRpc3QubG9jYXRpb24pCiAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlCiAgICAgICAgRW52aXJvbm1lbnQucmVtb3ZlKHNlbGYsIGRpc3QpCgogICAgZGVmIG1ha2VfcmVsYXRpdmUoc2VsZiwgcGF0aCk6CiAgICAgICAgbnBhdGgsIGxhc3QgPSBvcy5wYXRoLnNwbGl0KG5vcm1hbGl6ZV9wYXRoKHBhdGgpKQogICAgICAgIGJhc2VsZW4gPSBsZW4oc2VsZi5iYXNlZGlyKQogICAgICAgIHBhcnRzID0gW2xhc3RdCiAgICAgICAgc2VwID0gb3MuYWx0c2VwID09ICcvJyBhbmQgJy8nIG9yIG9zLnNlcAogICAgICAgIHdoaWxlIGxlbihucGF0aCkgPj0gYmFzZWxlbjoKICAgICAgICAgICAgaWYgbnBhdGggPT0gc2VsZi5iYXNlZGlyOgogICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKG9zLmN1cmRpcikKICAgICAgICAgICAgICAgIHBhcnRzLnJldmVyc2UoKQogICAgICAgICAgICAgICAgcmV0dXJuIHNlcC5qb2luKHBhcnRzKQogICAgICAgICAgICBucGF0aCwgbGFzdCA9IG9zLnBhdGguc3BsaXQobnBhdGgpCiAgICAgICAgICAgIHBhcnRzLmFwcGVuZChsYXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBwYXRoCgoKY2xhc3MgUmV3cml0ZVB0aERpc3RyaWJ1dGlvbnMoUHRoRGlzdHJpYnV0aW9ucyk6CiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfd3JhcF9saW5lcyhjbHMsIGxpbmVzKToKICAgICAgICB5aWVsZCBjbHMucHJlbHVkZQogICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICAgICB5aWVsZCBsaW5lCiAgICAgICAgeWllbGQgY2xzLnBvc3RsdWRlCgogICAgcHJlbHVkZSA9IF9vbmVfbGluZXIoIiIiCiAgICAgICAgaW1wb3J0IHN5cwogICAgICAgIHN5cy5fX3BsZW4gPSBsZW4oc3lzLnBhdGgpCiAgICAgICAgIiIiKQogICAgcG9zdGx1ZGUgPSBfb25lX2xpbmVyKCIiIgogICAgICAgIGltcG9ydCBzeXMKICAgICAgICBuZXcgPSBzeXMucGF0aFtzeXMuX19wbGVuOl0KICAgICAgICBkZWwgc3lzLnBhdGhbc3lzLl9fcGxlbjpdCiAgICAgICAgcCA9IGdldGF0dHIoc3lzLCAnX19lZ2dpbnNlcnQnLCAwKQogICAgICAgIHN5cy5wYXRoW3A6cF0gPSBuZXcKICAgICAgICBzeXMuX19lZ2dpbnNlcnQgPSBwICsgbGVuKG5ldykKICAgICAgICAiIiIpCgoKaWYgb3MuZW52aXJvbi5nZXQoJ1NFVFVQVE9PTFNfU1lTX1BBVEhfVEVDSE5JUVVFJywgJ3JhdycpID09ICdyZXdyaXRlJzoKICAgIFB0aERpc3RyaWJ1dGlvbnMgPSBSZXdyaXRlUHRoRGlzdHJpYnV0aW9ucwoKCmRlZiBfZmlyc3RfbGluZV9yZSgpOgogICAgIiIiCiAgICBSZXR1cm4gYSByZWd1bGFyIGV4cHJlc3Npb24gYmFzZWQgb24gZmlyc3RfbGluZV9yZSBzdWl0YWJsZSBmb3IgbWF0Y2hpbmcKICAgIHN0cmluZ3MuCiAgICAiIiIKICAgIGlmIGlzaW5zdGFuY2UoZmlyc3RfbGluZV9yZS5wYXR0ZXJuLCBzdHIpOgogICAgICAgIHJldHVybiBmaXJzdF9saW5lX3JlCgogICAgIyBmaXJzdF9saW5lX3JlIGluIFB5dGhvbiA+PTMuMS40IGFuZCA+PTMuMi4xIGlzIGEgYnl0ZXMgcGF0dGVybi4KICAgIHJldHVybiByZS5jb21waWxlKGZpcnN0X2xpbmVfcmUucGF0dGVybi5kZWNvZGUoKSkKCgpkZWYgYXV0b19jaG1vZChmdW5jLCBhcmcsIGV4Yyk6CiAgICBpZiBmdW5jIGluIFtvcy51bmxpbmssIG9zLnJlbW92ZV0gYW5kIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICBjaG1vZChhcmcsIHN0YXQuU19JV1JJVEUpCiAgICAgICAgcmV0dXJuIGZ1bmMoYXJnKQogICAgZXQsIGV2LCBfID0gc3lzLmV4Y19pbmZvKCkKICAgIHNpeC5yZXJhaXNlKGV0LCAoZXZbMF0sIGV2WzFdICsgKCIgJXMgJXMiICUgKGZ1bmMsIGFyZykpKSkKCgpkZWYgdXBkYXRlX2Rpc3RfY2FjaGVzKGRpc3RfcGF0aCwgZml4X3ppcGltcG9ydGVyX2NhY2hlcyk6CiAgICAiIiIKICAgIEZpeCBhbnkgZ2xvYmFsbHkgY2FjaGVkIGBkaXN0X3BhdGhgIHJlbGF0ZWQgZGF0YQoKICAgIGBkaXN0X3BhdGhgIHNob3VsZCBiZSBhIHBhdGggb2YgYSBuZXdseSBpbnN0YWxsZWQgZWdnIGRpc3RyaWJ1dGlvbiAoemlwcGVkCiAgICBvciB1bnppcHBlZCkuCgogICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUgY29udGFpbnMgZmluZGVyIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gY2FjaGVkIHdoZW4KICAgIGltcG9ydGluZyBkYXRhIGZyb20gdGhlIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbi4gQW55IHN1Y2ggZmluZGVycyBuZWVkIHRvIGJlCiAgICBjbGVhcmVkIHNpbmNlIHRoZSByZXBsYWNlbWVudCBkaXN0cmlidXRpb24gbWlnaHQgYmUgcGFja2FnZWQgZGlmZmVyZW50bHksCiAgICBlLmcuIGEgemlwcGVkIGVnZyBkaXN0cmlidXRpb24gbWlnaHQgZ2V0IHJlcGxhY2VkIHdpdGggYW4gdW56aXBwZWQgZWdnCiAgICBmb2xkZXIgb3IgdmljZSB2ZXJzYS4gSGF2aW5nIHRoZSBvbGQgZmluZGVycyBjYWNoZWQgbWF5IHRoZW4gY2F1c2UgUHl0aG9uCiAgICB0byBhdHRlbXB0IGxvYWRpbmcgbW9kdWxlcyBmcm9tIHRoZSByZXBsYWNlbWVudCBkaXN0cmlidXRpb24gdXNpbmcgYW4KICAgIGluY29ycmVjdCBsb2FkZXIuCgogICAgemlwaW1wb3J0LnppcGltcG9ydGVyIG9iamVjdHMgYXJlIFB5dGhvbiBsb2FkZXJzIGNoYXJnZWQgd2l0aCBpbXBvcnRpbmcKICAgIGRhdGEgcGFja2FnZWQgaW5zaWRlIHppcCBhcmNoaXZlcy4gSWYgc3RhbGUgbG9hZGVycyByZWZlcmVuY2luZyB0aGUKICAgIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbiwgYXJlIGxlZnQgYmVoaW5kLCB0aGV5IGNhbiBmYWlsIHRvIGxvYWQgbW9kdWxlcyBmcm9tCiAgICB0aGUgcmVwbGFjZW1lbnQgZGlzdHJpYnV0aW9uLiBFLmcuIGlmIGFuIG9sZCB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2UKICAgIGlzIHVzZWQgdG8gbG9hZCBkYXRhIGZyb20gYSBuZXcgemlwcGVkIGVnZyBhcmNoaXZlLCBpdCBtYXkgY2F1c2UgdGhlCiAgICBvcGVyYXRpb24gdG8gYXR0ZW1wdCB0byBsb2NhdGUgdGhlIHJlcXVlc3RlZCBkYXRhIGluIHRoZSB3cm9uZyBsb2NhdGlvbiAtCiAgICBvbmUgaW5kaWNhdGVkIGJ5IHRoZSBvcmlnaW5hbCBkaXN0cmlidXRpb24ncyB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkKICAgIGluZm9ybWF0aW9uLiBTdWNoIGFuIG9wZXJhdGlvbiBtYXkgdGhlbiBmYWlsIG91dHJpZ2h0LCBlLmcuIHJlcG9ydCBoYXZpbmcKICAgIHJlYWQgYSAnYmFkIGxvY2FsIGZpbGUgaGVhZGVyJywgb3IgZXZlbiB3b3JzZSwgaXQgbWF5IGZhaWwgc2lsZW50bHkgJgogICAgcmV0dXJuIGludmFsaWQgZGF0YS4KCiAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUgY29udGFpbnMgY2FjaGVkIHppcCBhcmNoaXZlIGRpcmVjdG9yeQogICAgaW5mb3JtYXRpb24gZm9yIGFsbCBleGlzdGluZyB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2VzIGFuZCBhbGwgc3VjaAogICAgaW5zdGFuY2VzIGNvbm5lY3RlZCB0byB0aGUgc2FtZSBhcmNoaXZlIHNoYXJlIHRoZSBzYW1lIGNhY2hlZCBkaXJlY3RvcnkKICAgIGluZm9ybWF0aW9uLgoKICAgIElmIGFza2VkLCBhbmQgdGhlIHVuZGVybHlpbmcgUHl0aG9uIGltcGxlbWVudGF0aW9uIGFsbG93cyBpdCwgd2UgY2FuIGZpeAogICAgYWxsIGV4aXN0aW5nIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gdHJhY2sKICAgIHRoZW0gZG93biBhbmQgcmVtb3ZlIHRoZW0gb25lIGJ5IG9uZSwgYnkgdXBkYXRpbmcgdGhlaXIgc2hhcmVkIGNhY2hlZCB6aXAKICAgIGFyY2hpdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uLiBUaGlzLCBvZiBjb3Vyc2UsIGFzc3VtZXMgdGhhdCB0aGUKICAgIHJlcGxhY2VtZW50IGRpc3RyaWJ1dGlvbiBpcyBwYWNrYWdlZCBhcyBhIHppcHBlZCBlZ2cuCgogICAgSWYgbm90IGFza2VkIHRvIGZpeCBleGlzdGluZyB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2VzLCB3ZSBzdGlsbCBkbwogICAgb3VyIGJlc3QgdG8gY2xlYXIgYW55IHJlbWFpbmluZyB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgcmVsYXRlZCBjYWNoZWQgZGF0YQogICAgdGhhdCBtaWdodCBzb21laG93IGxhdGVyIGdldCB1c2VkIHdoZW4gYXR0ZW1wdGluZyB0byBsb2FkIGRhdGEgZnJvbSB0aGUgbmV3CiAgICBkaXN0cmlidXRpb24gYW5kIHRodXMgY2F1c2Ugc3VjaCBsb2FkIG9wZXJhdGlvbnMgdG8gZmFpbC4gTm90ZSB0aGF0IHdoZW4KICAgIHRyYWNraW5nIGRvd24gc3VjaCByZW1haW5pbmcgc3RhbGUgZGF0YSwgd2UgY2FuIG5vdCBjYXRjaCBldmVyeSBjb25jZWl2YWJsZQogICAgdXNhZ2UgZnJvbSBoZXJlLCBhbmQgd2UgY2xlYXIgb25seSB0aG9zZSB0aGF0IHdlIGtub3cgb2YgYW5kIGhhdmUgZm91bmQgdG8KICAgIGNhdXNlIHByb2JsZW1zIGlmIGxlZnQgYWxpdmUuIEFueSByZW1haW5pbmcgY2FjaGVzIHNob3VsZCBiZSB1cGRhdGVkIGJ5CiAgICB3aG9tZXZlciBpcyBpbiBjaGFyZ2Ugb2YgbWFpbnRhaW5pbmcgdGhlbSwgaS5lLiB0aGV5IHNob3VsZCBiZSByZWFkeSB0bwogICAgaGFuZGxlIHVzIHJlcGxhY2luZyB0aGVpciB6aXAgYXJjaGl2ZXMgd2l0aCBuZXcgZGlzdHJpYnV0aW9ucyBhdCBydW50aW1lLgoKICAgICIiIgogICAgIyBUaGVyZSBhcmUgc2V2ZXJhbCBvdGhlciBrbm93biBzb3VyY2VzIG9mIHN0YWxlIHppcGltcG9ydC56aXBpbXBvcnRlcgogICAgIyBpbnN0YW5jZXMgdGhhdCB3ZSBkbyBub3QgY2xlYXIgaGVyZSwgYnV0IG1pZ2h0IGlmIGV2ZXIgZ2l2ZW4gYSByZWFzb24gdG8KICAgICMgZG8gc286CiAgICAjICogR2xvYmFsIHNldHVwdG9vbHMgcGtnX3Jlc291cmNlcy53b3JraW5nX3NldCAoYS5rLmEuICdtYXN0ZXIgd29ya2luZwogICAgIyBzZXQnKSBtYXkgY29udGFpbiBkaXN0cmlidXRpb25zIHdoaWNoIG1heSBpbiB0dXJuIGNvbnRhaW4gdGhlaXIKICAgICMgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgbG9hZGVycy4KICAgICMgKiBTZXZlcmFsIHppcGltcG9ydC56aXBpbXBvcnRlciBsb2FkZXJzIGhlbGQgYnkgbG9jYWwgdmFyaWFibGVzIGZ1cnRoZXIKICAgICMgICB1cCB0aGUgZnVuY3Rpb24gY2FsbCBzdGFjayB3aGVuIHJ1bm5pbmcgdGhlIHNldHVwdG9vbHMgaW5zdGFsbGF0aW9uLgogICAgIyAqIEFscmVhZHkgbG9hZGVkIG1vZHVsZXMgbWF5IGhhdmUgdGhlaXIgX19sb2FkZXJfXyBhdHRyaWJ1dGUgc2V0IHRvIHRoZQogICAgIyAgIGV4YWN0IGxvYWRlciBpbnN0YW5jZSB1c2VkIHdoZW4gaW1wb3J0aW5nIHRoZW0uIFB5dGhvbiAzLjQgZG9jcyBzdGF0ZQogICAgIyAgIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBpbnRlbmRlZCBtb3N0bHkgZm9yIGludHJvc3BlY3Rpb24gYW5kIHNvIGlzCiAgICAjICAgbm90IGV4cGVjdGVkIHRvIGNhdXNlIHVzIHByb2JsZW1zLgogICAgbm9ybWFsaXplZF9wYXRoID0gbm9ybWFsaXplX3BhdGgoZGlzdF9wYXRoKQogICAgX3VuY2FjaGUobm9ybWFsaXplZF9wYXRoLCBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSkKICAgIGlmIGZpeF96aXBpbXBvcnRlcl9jYWNoZXM6CiAgICAgICAgX3JlcGxhY2VfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhKG5vcm1hbGl6ZWRfcGF0aCkKICAgIGVsc2U6CiAgICAgICAgIyBIZXJlLCBldmVuIHRob3VnaCB3ZSBkbyBub3Qgd2FudCB0byBmaXggZXhpc3RpbmcgYW5kIG5vdyBzdGFsZQogICAgICAgICMgemlwaW1wb3J0ZXIgY2FjaGUgaW5mb3JtYXRpb24sIHdlIHN0aWxsIHdhbnQgdG8gcmVtb3ZlIGl0LiBSZWxhdGVkIHRvCiAgICAgICAgIyBQeXRob24ncyB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gY2FjaGUsIHdlIGNsZWFyIGVhY2ggb2YKICAgICAgICAjIGl0cyBzdGFsZSBlbnRyaWVzIGluIHR3byBwaGFzZXM6CiAgICAgICAgIyAgIDEuIENsZWFyIHRoZSBlbnRyeSBzbyBhdHRlbXB0aW5nIHRvIGFjY2VzcyB6aXAgYXJjaGl2ZSBpbmZvcm1hdGlvbgogICAgICAgICMgICAgICB2aWEgYW55IGV4aXN0aW5nIHN0YWxlIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgZmFpbHMuCiAgICAgICAgIyAgIDIuIFJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgY2FjaGUgc28gYW55IG5ld2x5IGNvbnN0cnVjdGVkCiAgICAgICAgIyAgICAgIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgZG8gbm90IGVuZCB1cCB1c2luZyBvbGQgc3RhbGUKICAgICAgICAjICAgICAgemlwIGFyY2hpdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgogICAgICAgICMgVGhpcyB3aG9sZSBzdGFsZSBkYXRhIHJlbW92YWwgc3RlcCBkb2VzIG5vdCBzZWVtIHN0cmljdGx5IG5lY2Vzc2FyeSwKICAgICAgICAjIGJ1dCBoYXMgYmVlbiBsZWZ0IGluIGJlY2F1c2UgaXQgd2FzIGRvbmUgYmVmb3JlIHdlIHN0YXJ0ZWQgcmVwbGFjaW5nCiAgICAgICAgIyB0aGUgemlwIGFyY2hpdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGNhY2hlIGNvbnRlbnQgaWYgcG9zc2libGUsIGFuZAogICAgICAgICMgdGhlcmUgYXJlIG5vIHJlbGV2YW50IHVuaXQgdGVzdHMgdGhhdCB3ZSBjYW4gZGVwZW5kIG9uIHRvIHRlbGwgdXMgaWYKICAgICAgICAjIHRoaXMgaXMgcmVhbGx5IG5lZWRlZC4KICAgICAgICBfcmVtb3ZlX2FuZF9jbGVhcl96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEobm9ybWFsaXplZF9wYXRoKQoKCmRlZiBfY29sbGVjdF96aXBpbXBvcnRlcl9jYWNoZV9lbnRyaWVzKG5vcm1hbGl6ZWRfcGF0aCwgY2FjaGUpOgogICAgIiIiCiAgICBSZXR1cm4gemlwaW1wb3J0ZXIgY2FjaGUgZW50cnkga2V5cyByZWxhdGVkIHRvIGEgZ2l2ZW4gbm9ybWFsaXplZCBwYXRoLgoKICAgIEFsdGVybmF0aXZlIHBhdGggc3BlbGxpbmdzIChlLmcuIHRob3NlIHVzaW5nIGRpZmZlcmVudCBjaGFyYWN0ZXIgY2FzZSBvcgogICAgdGhvc2UgdXNpbmcgYWx0ZXJuYXRpdmUgcGF0aCBzZXBhcmF0b3JzKSByZWxhdGVkIHRvIHRoZSBzYW1lIHBhdGggYXJlCiAgICBpbmNsdWRlZC4gQW55IHN1Yi1wYXRoIGVudHJpZXMgYXJlIGluY2x1ZGVkIGFzIHdlbGwsIGkuZS4gdGhvc2UKICAgIGNvcnJlc3BvbmRpbmcgdG8gemlwIGFyY2hpdmVzIGVtYmVkZGVkIGluIG90aGVyIHppcCBhcmNoaXZlcy4KCiAgICAiIiIKICAgIHJlc3VsdCA9IFtdCiAgICBwcmVmaXhfbGVuID0gbGVuKG5vcm1hbGl6ZWRfcGF0aCkKICAgIGZvciBwIGluIGNhY2hlOgogICAgICAgIG5wID0gbm9ybWFsaXplX3BhdGgocCkKICAgICAgICBpZiAobnAuc3RhcnRzd2l0aChub3JtYWxpemVkX3BhdGgpIGFuZAogICAgICAgICAgICAgICAgbnBbcHJlZml4X2xlbjpwcmVmaXhfbGVuICsgMV0gaW4gKG9zLnNlcCwgJycpKToKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwKQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfdXBkYXRlX3ppcGltcG9ydGVyX2NhY2hlKG5vcm1hbGl6ZWRfcGF0aCwgY2FjaGUsIHVwZGF0ZXI9Tm9uZSk6CiAgICAiIiIKICAgIFVwZGF0ZSB6aXBpbXBvcnRlciBjYWNoZSBkYXRhIGZvciBhIGdpdmVuIG5vcm1hbGl6ZWQgcGF0aC4KCiAgICBBbnkgc3ViLXBhdGggZW50cmllcyBhcmUgcHJvY2Vzc2VkIGFzIHdlbGwsIGkuZS4gdGhvc2UgY29ycmVzcG9uZGluZyB0byB6aXAKICAgIGFyY2hpdmVzIGVtYmVkZGVkIGluIG90aGVyIHppcCBhcmNoaXZlcy4KCiAgICBHaXZlbiB1cGRhdGVyIGlzIGEgY2FsbGFibGUgdGFraW5nIGEgY2FjaGUgZW50cnkga2V5IGFuZCB0aGUgb3JpZ2luYWwgZW50cnkKICAgIChhZnRlciBhbHJlYWR5IHJlbW92aW5nIHRoZSBlbnRyeSBmcm9tIHRoZSBjYWNoZSksIGFuZCBleHBlY3RlZCB0byB1cGRhdGUKICAgIHRoZSBlbnRyeSBhbmQgcG9zc2libHkgcmV0dXJuIGEgbmV3IG9uZSB0byBiZSBpbnNlcnRlZCBpbiBpdHMgcGxhY2UuCiAgICBSZXR1cm5pbmcgTm9uZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50cnkgc2hvdWxkIG5vdCBiZSByZXBsYWNlZCB3aXRoIGEgbmV3CiAgICBvbmUuIElmIG5vIHVwZGF0ZXIgaXMgZ2l2ZW4sIHRoZSBjYWNoZSBlbnRyaWVzIGFyZSBzaW1wbHkgcmVtb3ZlZCB3aXRob3V0CiAgICBhbnkgYWRkaXRpb25hbCBwcm9jZXNzaW5nLCB0aGUgc2FtZSBhcyBpZiB0aGUgdXBkYXRlciBzaW1wbHkgcmV0dXJuZWQgTm9uZS4KCiAgICAiIiIKICAgIGZvciBwIGluIF9jb2xsZWN0X3ppcGltcG9ydGVyX2NhY2hlX2VudHJpZXMobm9ybWFsaXplZF9wYXRoLCBjYWNoZSk6CiAgICAgICAgIyBOLkIuIHB5cHkncyBjdXN0b20gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlIGltcGxlbWVudGF0aW9uIGRvZXMKICAgICAgICAjIG5vdCBzdXBwb3J0IHRoZSBjb21wbGV0ZSBkaWN0IGludGVyZmFjZToKICAgICAgICAjICogRG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQsIHRodXMgbm90IGFsbG93aW5nIHRoaXMgZnVuY3Rpb24KICAgICAgICAjICAgIHRvIGJlIHVzZWQgb25seSBmb3IgcmVtb3ZpbmcgZXhpc3RpbmcgY2FjaGUgZW50cmllcy4KICAgICAgICAjICAqIERvZXMgbm90IHN1cHBvcnQgdGhlIGRpY3QucG9wKCkgbWV0aG9kLCBmb3JjaW5nIHVzIHRvIHVzZSB0aGUKICAgICAgICAjICAgIGdldC9kZWwgcGF0dGVybnMgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gc2VlIHRoZQogICAgICAgICMgICAgZm9sbG93aW5nIGxpbmtzOgogICAgICAgICMgICAgICBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcy8yMDIjaXNzdWVjb21tZW50LTIwMjkxMzQyMAogICAgICAgICMgICAgICBodHRwOi8vYml0Lmx5LzJoOWl0SlgKICAgICAgICBvbGRfZW50cnkgPSBjYWNoZVtwXQogICAgICAgIGRlbCBjYWNoZVtwXQogICAgICAgIG5ld19lbnRyeSA9IHVwZGF0ZXIgYW5kIHVwZGF0ZXIocCwgb2xkX2VudHJ5KQogICAgICAgIGlmIG5ld19lbnRyeSBpcyBub3QgTm9uZToKICAgICAgICAgICAgY2FjaGVbcF0gPSBuZXdfZW50cnkKCgpkZWYgX3VuY2FjaGUobm9ybWFsaXplZF9wYXRoLCBjYWNoZSk6CiAgICBfdXBkYXRlX3ppcGltcG9ydGVyX2NhY2hlKG5vcm1hbGl6ZWRfcGF0aCwgY2FjaGUpCgoKZGVmIF9yZW1vdmVfYW5kX2NsZWFyX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YShub3JtYWxpemVkX3BhdGgpOgogICAgZGVmIGNsZWFyX2FuZF9yZW1vdmVfY2FjaGVkX3ppcF9hcmNoaXZlX2RpcmVjdG9yeV9kYXRhKHBhdGgsIG9sZF9lbnRyeSk6CiAgICAgICAgb2xkX2VudHJ5LmNsZWFyKCkKCiAgICBfdXBkYXRlX3ppcGltcG9ydGVyX2NhY2hlKAogICAgICAgIG5vcm1hbGl6ZWRfcGF0aCwgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLAogICAgICAgIHVwZGF0ZXI9Y2xlYXJfYW5kX3JlbW92ZV9jYWNoZWRfemlwX2FyY2hpdmVfZGlyZWN0b3J5X2RhdGEpCgoKIyBQeVB5IFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhbGxvdyBkaXJlY3RseSB3cml0aW5nIHRvIHRoZQojIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZSBhbmQgc28gcHJldmVudHMgdXMgZnJvbSBhdHRlbXB0aW5nIHRvIGNvcnJlY3QKIyBpdHMgY29udGVudC4gVGhlIGJlc3Qgd2UgY2FuIGRvIHRoZXJlIGlzIGNsZWFyIHRoZSBwcm9ibGVtYXRpYyBjYWNoZSBjb250ZW50CiMgYW5kIGhhdmUgUHlQeSByZXBvcHVsYXRlIGl0IGFzIG5lZWRlZC4gVGhlIGRvd25zaWRlIGlzIHRoYXQgaWYgdGhlcmUgYXJlIGFueQojIHN0YWxlIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgbGF5aW5nIGFyb3VuZCwgYXR0ZW1wdGluZyB0byB1c2UgdGhlbQojIHdpbGwgZmFpbCBkdWUgdG8gbm90IGhhdmluZyBpdHMgemlwIGFyY2hpdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGF2YWlsYWJsZQojIGluc3RlYWQgb2YgYmVpbmcgYXV0b21hdGljYWxseSBjb3JyZWN0ZWQgdG8gdXNlIHRoZSBuZXcgY29ycmVjdCB6aXAgYXJjaGl2ZQojIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KaWYgJ19fcHlweV9fJyBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6CiAgICBfcmVwbGFjZV96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEgPSBcCiAgICAgICAgX3JlbW92ZV9hbmRfY2xlYXJfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhCmVsc2U6CgogICAgZGVmIF9yZXBsYWNlX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YShub3JtYWxpemVkX3BhdGgpOgogICAgICAgIGRlZiByZXBsYWNlX2NhY2hlZF96aXBfYXJjaGl2ZV9kaXJlY3RvcnlfZGF0YShwYXRoLCBvbGRfZW50cnkpOgogICAgICAgICAgICAjIE4uQi4gSW4gdGhlb3J5LCB3ZSBjb3VsZCBsb2FkIHRoZSB6aXAgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGp1c3QKICAgICAgICAgICAgIyBvbmNlIGZvciBhbGwgdXBkYXRlZCBwYXRoIHNwZWxsaW5ncywgYW5kIHRoZW4gY29weSBpdCBsb2NhbGx5IGFuZAogICAgICAgICAgICAjIHVwZGF0ZSBpdHMgY29udGFpbmVkIHBhdGggc3RyaW5ncyB0byBjb250YWluIHRoZSBjb3JyZWN0CiAgICAgICAgICAgICMgc3BlbGxpbmcsIGJ1dCB0aGF0IHNlZW1zIGxpa2UgYSB3YXkgdG9vIGludmFzaXZlIG1vdmUgKHRoaXMgY2FjaGUKICAgICAgICAgICAgIyBzdHJ1Y3R1cmUgaXMgbm90IG9mZmljaWFsbHkgZG9jdW1lbnRlZCBhbnl3aGVyZSBhbmQgY291bGQgaW4KICAgICAgICAgICAgIyB0aGVvcnkgY2hhbmdlIHdpdGggbmV3IFB5dGhvbiByZWxlYXNlcykgZm9yIG5vIHNpZ25pZmljYW50CiAgICAgICAgICAgICMgYmVuZWZpdC4KICAgICAgICAgICAgb2xkX2VudHJ5LmNsZWFyKCkKICAgICAgICAgICAgemlwaW1wb3J0LnppcGltcG9ydGVyKHBhdGgpCiAgICAgICAgICAgIG9sZF9lbnRyeS51cGRhdGUoemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlW3BhdGhdKQogICAgICAgICAgICByZXR1cm4gb2xkX2VudHJ5CgogICAgICAgIF91cGRhdGVfemlwaW1wb3J0ZXJfY2FjaGUoCiAgICAgICAgICAgIG5vcm1hbGl6ZWRfcGF0aCwgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLAogICAgICAgICAgICB1cGRhdGVyPXJlcGxhY2VfY2FjaGVkX3ppcF9hcmNoaXZlX2RpcmVjdG9yeV9kYXRhKQoKCmRlZiBpc19weXRob24odGV4dCwgZmlsZW5hbWU9JzxzdHJpbmc+Jyk6CiAgICAiSXMgdGhpcyBzdHJpbmcgYSB2YWxpZCBQeXRob24gc2NyaXB0PyIKICAgIHRyeToKICAgICAgICBjb21waWxlKHRleHQsIGZpbGVuYW1lLCAnZXhlYycpCiAgICBleGNlcHQgKFN5bnRheEVycm9yLCBUeXBlRXJyb3IpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgZWxzZToKICAgICAgICByZXR1cm4gVHJ1ZQoKCmRlZiBpc19zaChleGVjdXRhYmxlKToKICAgICIiIkRldGVybWluZSBpZiB0aGUgc3BlY2lmaWVkIGV4ZWN1dGFibGUgaXMgYSAuc2ggKGNvbnRhaW5zIGEgIyEgbGluZSkiIiIKICAgIHRyeToKICAgICAgICB3aXRoIGlvLm9wZW4oZXhlY3V0YWJsZSwgZW5jb2Rpbmc9J2xhdGluLTEnKSBhcyBmcDoKICAgICAgICAgICAgbWFnaWMgPSBmcC5yZWFkKDIpCiAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgIHJldHVybiBleGVjdXRhYmxlCiAgICByZXR1cm4gbWFnaWMgPT0gJyMhJwoKCmRlZiBudF9xdW90ZV9hcmcoYXJnKToKICAgICIiIlF1b3RlIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGFjY29yZGluZyB0byBXaW5kb3dzIHBhcnNpbmcgcnVsZXMiIiIKICAgIHJldHVybiBzdWJwcm9jZXNzLmxpc3QyY21kbGluZShbYXJnXSkKCgpkZWYgaXNfcHl0aG9uX3NjcmlwdChzY3JpcHRfdGV4dCwgZmlsZW5hbWUpOgogICAgIiIiSXMgdGhpcyB0ZXh0LCBhcyBhIHdob2xlLCBhIFB5dGhvbiBzY3JpcHQ/IChhcyBvcHBvc2VkIHRvIHNoZWxsL2JhdC9ldGMuCiAgICAiIiIKICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBvciBmaWxlbmFtZS5lbmRzd2l0aCgnLnB5dycpOgogICAgICAgIHJldHVybiBUcnVlICAjIGV4dGVuc2lvbiBzYXlzIGl0J3MgUHl0aG9uCiAgICBpZiBpc19weXRob24oc2NyaXB0X3RleHQsIGZpbGVuYW1lKToKICAgICAgICByZXR1cm4gVHJ1ZSAgIyBpdCdzIHN5bnRhY3RpY2FsbHkgdmFsaWQgUHl0aG9uCiAgICBpZiBzY3JpcHRfdGV4dC5zdGFydHN3aXRoKCcjIScpOgogICAgICAgICMgSXQgYmVnaW5zIHdpdGggYSAnIyEnIGxpbmUsIHNvIGNoZWNrIGlmICdweXRob24nIGlzIGluIGl0IHNvbWV3aGVyZQogICAgICAgIHJldHVybiAncHl0aG9uJyBpbiBzY3JpcHRfdGV4dC5zcGxpdGxpbmVzKClbMF0ubG93ZXIoKQoKICAgIHJldHVybiBGYWxzZSAgIyBOb3QgYW55IFB5dGhvbiBJIGNhbiByZWNvZ25pemUKCgp0cnk6CiAgICBmcm9tIG9zIGltcG9ydCBjaG1vZCBhcyBfY2htb2QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgIyBKeXRob24gY29tcGF0aWJpbGl0eQogICAgZGVmIF9jaG1vZCgqYXJncyk6CiAgICAgICAgcGFzcwoKCmRlZiBjaG1vZChwYXRoLCBtb2RlKToKICAgIGxvZy5kZWJ1ZygiY2hhbmdpbmcgbW9kZSBvZiAlcyB0byAlbyIsIHBhdGgsIG1vZGUpCiAgICB0cnk6CiAgICAgICAgX2NobW9kKHBhdGgsIG1vZGUpCiAgICBleGNlcHQgb3MuZXJyb3IgYXMgZToKICAgICAgICBsb2cuZGVidWcoImNobW9kIGZhaWxlZDogJXMiLCBlKQoKCmNsYXNzIENvbW1hbmRTcGVjKGxpc3QpOgogICAgIiIiCiAgICBBIGNvbW1hbmQgc3BlYyBmb3IgYSAjISBoZWFkZXIsIHNwZWNpZmllZCBhcyBhIGxpc3Qgb2YgYXJndW1lbnRzIGFraW4gdG8KICAgIHRob3NlIHBhc3NlZCB0byBQb3Blbi4KICAgICIiIgoKICAgIG9wdGlvbnMgPSBbXQogICAgc3BsaXRfYXJncyA9IGRpY3QoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGJlc3QoY2xzKToKICAgICAgICAiIiIKICAgICAgICBDaG9vc2UgdGhlIGJlc3QgQ29tbWFuZFNwZWMgY2xhc3MgYmFzZWQgb24gZW52aXJvbm1lbnRhbCBjb25kaXRpb25zLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBjbHMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfc3lzX2V4ZWN1dGFibGUoY2xzKToKICAgICAgICBfZGVmYXVsdCA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWN1dGFibGUpCiAgICAgICAgcmV0dXJuIG9zLmVudmlyb24uZ2V0KCdfX1BZVkVOVl9MQVVOQ0hFUl9fJywgX2RlZmF1bHQpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9wYXJhbShjbHMsIHBhcmFtKToKICAgICAgICAiIiIKICAgICAgICBDb25zdHJ1Y3QgYSBDb21tYW5kU3BlYyBmcm9tIGEgcGFyYW1ldGVyIHRvIGJ1aWxkX3NjcmlwdHMsIHdoaWNoIG1heQogICAgICAgIGJlIE5vbmUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJhbSwgY2xzKToKICAgICAgICAgICAgcmV0dXJuIHBhcmFtCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJhbSwgbGlzdCk6CiAgICAgICAgICAgIHJldHVybiBjbHMocGFyYW0pCiAgICAgICAgaWYgcGFyYW0gaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGNscy5mcm9tX2Vudmlyb25tZW50KCkKICAgICAgICAjIG90aGVyd2lzZSwgYXNzdW1lIGl0J3MgYSBzdHJpbmcuCiAgICAgICAgcmV0dXJuIGNscy5mcm9tX3N0cmluZyhwYXJhbSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2Vudmlyb25tZW50KGNscyk6CiAgICAgICAgcmV0dXJuIGNscyhbY2xzLl9zeXNfZXhlY3V0YWJsZSgpXSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX3N0cmluZyhjbHMsIHN0cmluZyk6CiAgICAgICAgIiIiCiAgICAgICAgQ29uc3RydWN0IGEgY29tbWFuZCBzcGVjIGZyb20gYSBzaW1wbGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGNvbW1hbmQKICAgICAgICBsaW5lIHBhcnNlYWJsZSBieSBzaGxleC5zcGxpdC4KICAgICAgICAiIiIKICAgICAgICBpdGVtcyA9IHNobGV4LnNwbGl0KHN0cmluZywgKipjbHMuc3BsaXRfYXJncykKICAgICAgICByZXR1cm4gY2xzKGl0ZW1zKQoKICAgIGRlZiBpbnN0YWxsX29wdGlvbnMoc2VsZiwgc2NyaXB0X3RleHQpOgogICAgICAgIHNlbGYub3B0aW9ucyA9IHNobGV4LnNwbGl0KHNlbGYuX2V4dHJhY3Rfb3B0aW9ucyhzY3JpcHRfdGV4dCkpCiAgICAgICAgY21kbGluZSA9IHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKHNlbGYpCiAgICAgICAgaWYgbm90IGlzYXNjaWkoY21kbGluZSk6CiAgICAgICAgICAgIHNlbGYub3B0aW9uc1s6MF0gPSBbJy14J10KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2V4dHJhY3Rfb3B0aW9ucyhvcmlnX3NjcmlwdCk6CiAgICAgICAgIiIiCiAgICAgICAgRXh0cmFjdCBhbnkgb3B0aW9ucyBmcm9tIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBzY3JpcHQuCiAgICAgICAgIiIiCiAgICAgICAgZmlyc3QgPSAob3JpZ19zY3JpcHQgKyAnXG4nKS5zcGxpdGxpbmVzKClbMF0KICAgICAgICBtYXRjaCA9IF9maXJzdF9saW5lX3JlKCkubWF0Y2goZmlyc3QpCiAgICAgICAgb3B0aW9ucyA9IG1hdGNoLmdyb3VwKDEpIG9yICcnIGlmIG1hdGNoIGVsc2UgJycKICAgICAgICByZXR1cm4gb3B0aW9ucy5zdHJpcCgpCgogICAgZGVmIGFzX2hlYWRlcihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fcmVuZGVyKHNlbGYgKyBsaXN0KHNlbGYub3B0aW9ucykpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9zdHJpcF9xdW90ZXMoaXRlbSk6CiAgICAgICAgX1FVT1RFUyA9ICciXCcnCiAgICAgICAgZm9yIHEgaW4gX1FVT1RFUzoKICAgICAgICAgICAgaWYgaXRlbS5zdGFydHN3aXRoKHEpIGFuZCBpdGVtLmVuZHN3aXRoKHEpOgogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bMTotMV0KICAgICAgICByZXR1cm4gaXRlbQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcmVuZGVyKGl0ZW1zKToKICAgICAgICBjbWRsaW5lID0gc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoCiAgICAgICAgICAgIENvbW1hbmRTcGVjLl9zdHJpcF9xdW90ZXMoaXRlbS5zdHJpcCgpKSBmb3IgaXRlbSBpbiBpdGVtcykKICAgICAgICByZXR1cm4gJyMhJyArIGNtZGxpbmUgKyAnXG4nCgoKIyBGb3IgcGJyIGNvbXBhdDsgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uCnN5c19leGVjdXRhYmxlID0gQ29tbWFuZFNwZWMuX3N5c19leGVjdXRhYmxlKCkKCgpjbGFzcyBXaW5kb3dzQ29tbWFuZFNwZWMoQ29tbWFuZFNwZWMpOgogICAgc3BsaXRfYXJncyA9IGRpY3QocG9zaXg9RmFsc2UpCgoKY2xhc3MgU2NyaXB0V3JpdGVyKG9iamVjdCk6CiAgICAiIiIKICAgIEVuY2Fwc3VsYXRlcyBiZWhhdmlvciBhcm91bmQgd3JpdGluZyBlbnRyeSBwb2ludCBzY3JpcHRzIGZvciBjb25zb2xlIGFuZAogICAgZ3VpIGFwcHMuCiAgICAiIiIKCiAgICB0ZW1wbGF0ZSA9IHRleHR3cmFwLmRlZGVudChyIiIiCiAgICAgICAgIyBFQVNZLUlOU1RBTEwtRU5UUlktU0NSSVBUOiAlKHNwZWMpciwlKGdyb3VwKXIsJShuYW1lKXIKICAgICAgICBfX3JlcXVpcmVzX18gPSAlKHNwZWMpcgogICAgICAgIGltcG9ydCByZQogICAgICAgIGltcG9ydCBzeXMKICAgICAgICBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IGxvYWRfZW50cnlfcG9pbnQKCiAgICAgICAgaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICAgICAgICAgc3lzLmFyZ3ZbMF0gPSByZS5zdWIocicoLXNjcmlwdFwucHl3P3xcLmV4ZSk/JCcsICcnLCBzeXMuYXJndlswXSkKICAgICAgICAgICAgc3lzLmV4aXQoCiAgICAgICAgICAgICAgICBsb2FkX2VudHJ5X3BvaW50KCUoc3BlYylyLCAlKGdyb3VwKXIsICUobmFtZSlyKSgpCiAgICAgICAgICAgICkKICAgICIiIikubHN0cmlwKCkKCiAgICBjb21tYW5kX3NwZWNfY2xhc3MgPSBDb21tYW5kU3BlYwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF9zY3JpcHRfYXJncyhjbHMsIGRpc3QsIGV4ZWN1dGFibGU9Tm9uZSwgd2luaW5zdD1GYWxzZSk6CiAgICAgICAgIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgICAgIHdhcm5pbmdzLndhcm4oIlVzZSBnZXRfYXJncyIsIERlcHJlY2F0aW9uV2FybmluZykKICAgICAgICB3cml0ZXIgPSAoV2luZG93c1NjcmlwdFdyaXRlciBpZiB3aW5pbnN0IGVsc2UgU2NyaXB0V3JpdGVyKS5iZXN0KCkKICAgICAgICBoZWFkZXIgPSBjbHMuZ2V0X3NjcmlwdF9oZWFkZXIoIiIsIGV4ZWN1dGFibGUsIHdpbmluc3QpCiAgICAgICAgcmV0dXJuIHdyaXRlci5nZXRfYXJncyhkaXN0LCBoZWFkZXIpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X3NjcmlwdF9oZWFkZXIoY2xzLCBzY3JpcHRfdGV4dCwgZXhlY3V0YWJsZT1Ob25lLCB3aW5pbnN0PUZhbHNlKToKICAgICAgICAjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgICAgd2FybmluZ3Mud2FybigiVXNlIGdldF9oZWFkZXIiLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgaWYgd2luaW5zdDoKICAgICAgICAgICAgZXhlY3V0YWJsZSA9ICJweXRob24uZXhlIgogICAgICAgIGNtZCA9IGNscy5jb21tYW5kX3NwZWNfY2xhc3MuYmVzdCgpLmZyb21fcGFyYW0oZXhlY3V0YWJsZSkKICAgICAgICBjbWQuaW5zdGFsbF9vcHRpb25zKHNjcmlwdF90ZXh0KQogICAgICAgIHJldHVybiBjbWQuYXNfaGVhZGVyKCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfYXJncyhjbHMsIGRpc3QsIGhlYWRlcj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBZaWVsZCB3cml0ZV9zY3JpcHQoKSBhcmd1bWVudCB0dXBsZXMgZm9yIGEgZGlzdHJpYnV0aW9uJ3MKICAgICAgICBjb25zb2xlX3NjcmlwdHMgYW5kIGd1aV9zY3JpcHRzIGVudHJ5IHBvaW50cy4KICAgICAgICAiIiIKICAgICAgICBpZiBoZWFkZXIgaXMgTm9uZToKICAgICAgICAgICAgaGVhZGVyID0gY2xzLmdldF9oZWFkZXIoKQogICAgICAgIHNwZWMgPSBzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgICAgIGZvciB0eXBlXyBpbiAnY29uc29sZScsICdndWknOgogICAgICAgICAgICBncm91cCA9IHR5cGVfICsgJ19zY3JpcHRzJwogICAgICAgICAgICBmb3IgbmFtZSwgZXAgaW4gZGlzdC5nZXRfZW50cnlfbWFwKGdyb3VwKS5pdGVtcygpOgogICAgICAgICAgICAgICAgY2xzLl9lbnN1cmVfc2FmZV9uYW1lKG5hbWUpCiAgICAgICAgICAgICAgICBzY3JpcHRfdGV4dCA9IGNscy50ZW1wbGF0ZSAlIGxvY2FscygpCiAgICAgICAgICAgICAgICBhcmdzID0gY2xzLl9nZXRfc2NyaXB0X2FyZ3ModHlwZV8sIG5hbWUsIGhlYWRlciwgc2NyaXB0X3RleHQpCiAgICAgICAgICAgICAgICBmb3IgcmVzIGluIGFyZ3M6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVzCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9lbnN1cmVfc2FmZV9uYW1lKG5hbWUpOgogICAgICAgICIiIgogICAgICAgIFByZXZlbnQgcGF0aHMgaW4gKl9zY3JpcHRzIGVudHJ5IHBvaW50IG5hbWVzLgogICAgICAgICIiIgogICAgICAgIGhhc19wYXRoX3NlcCA9IHJlLnNlYXJjaChyJ1tcXC9dJywgbmFtZSkKICAgICAgICBpZiBoYXNfcGF0aF9zZXA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlBhdGggc2VwYXJhdG9ycyBub3QgYWxsb3dlZCBpbiBzY3JpcHQgbmFtZXMiKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF93cml0ZXIoY2xzLCBmb3JjZV93aW5kb3dzKToKICAgICAgICAjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgICAgd2FybmluZ3Mud2FybigiVXNlIGJlc3QiLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgcmV0dXJuIFdpbmRvd3NTY3JpcHRXcml0ZXIuYmVzdCgpIGlmIGZvcmNlX3dpbmRvd3MgZWxzZSBjbHMuYmVzdCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYmVzdChjbHMpOgogICAgICAgICIiIgogICAgICAgIFNlbGVjdCB0aGUgYmVzdCBTY3JpcHRXcml0ZXIgZm9yIHRoaXMgZW52aXJvbm1lbnQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMicgb3IgKG9zLm5hbWUgPT0gJ2phdmEnIGFuZCBvcy5fbmFtZSA9PSAnbnQnKToKICAgICAgICAgICAgcmV0dXJuIFdpbmRvd3NTY3JpcHRXcml0ZXIuYmVzdCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGNscwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9nZXRfc2NyaXB0X2FyZ3MoY2xzLCB0eXBlXywgbmFtZSwgaGVhZGVyLCBzY3JpcHRfdGV4dCk6CiAgICAgICAgIyBTaW1wbHkgd3JpdGUgdGhlIHN0dWIgd2l0aCBubyBleHRlbnNpb24uCiAgICAgICAgeWllbGQgKG5hbWUsIGhlYWRlciArIHNjcmlwdF90ZXh0KQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF9oZWFkZXIoY2xzLCBzY3JpcHRfdGV4dD0iIiwgZXhlY3V0YWJsZT1Ob25lKToKICAgICAgICAiIiJDcmVhdGUgYSAjISBsaW5lLCBnZXR0aW5nIG9wdGlvbnMgKGlmIGFueSkgZnJvbSBzY3JpcHRfdGV4dCIiIgogICAgICAgIGNtZCA9IGNscy5jb21tYW5kX3NwZWNfY2xhc3MuYmVzdCgpLmZyb21fcGFyYW0oZXhlY3V0YWJsZSkKICAgICAgICBjbWQuaW5zdGFsbF9vcHRpb25zKHNjcmlwdF90ZXh0KQogICAgICAgIHJldHVybiBjbWQuYXNfaGVhZGVyKCkKCgpjbGFzcyBXaW5kb3dzU2NyaXB0V3JpdGVyKFNjcmlwdFdyaXRlcik6CiAgICBjb21tYW5kX3NwZWNfY2xhc3MgPSBXaW5kb3dzQ29tbWFuZFNwZWMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfd3JpdGVyKGNscyk6CiAgICAgICAgIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgICAgIHdhcm5pbmdzLndhcm4oIlVzZSBiZXN0IiwgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgIHJldHVybiBjbHMuYmVzdCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYmVzdChjbHMpOgogICAgICAgICIiIgogICAgICAgIFNlbGVjdCB0aGUgYmVzdCBTY3JpcHRXcml0ZXIgc3VpdGFibGUgZm9yIFdpbmRvd3MKICAgICAgICAiIiIKICAgICAgICB3cml0ZXJfbG9va3VwID0gZGljdCgKICAgICAgICAgICAgZXhlY3V0YWJsZT1XaW5kb3dzRXhlY3V0YWJsZUxhdW5jaGVyV3JpdGVyLAogICAgICAgICAgICBuYXR1cmFsPWNscywKICAgICAgICApCiAgICAgICAgIyBmb3IgY29tcGF0aWJpbGl0eSwgdXNlIHRoZSBleGVjdXRhYmxlIGxhdW5jaGVyIGJ5IGRlZmF1bHQKICAgICAgICBsYXVuY2hlciA9IG9zLmVudmlyb24uZ2V0KCdTRVRVUFRPT0xTX0xBVU5DSEVSJywgJ2V4ZWN1dGFibGUnKQogICAgICAgIHJldHVybiB3cml0ZXJfbG9va3VwW2xhdW5jaGVyXQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9nZXRfc2NyaXB0X2FyZ3MoY2xzLCB0eXBlXywgbmFtZSwgaGVhZGVyLCBzY3JpcHRfdGV4dCk6CiAgICAgICAgIkZvciBXaW5kb3dzLCBhZGQgYSAucHkgZXh0ZW5zaW9uIgogICAgICAgIGV4dCA9IGRpY3QoY29uc29sZT0nLnB5YScsIGd1aT0nLnB5dycpW3R5cGVfXQogICAgICAgIGlmIGV4dCBub3QgaW4gb3MuZW52aXJvblsnUEFUSEVYVCddLmxvd2VyKCkuc3BsaXQoJzsnKToKICAgICAgICAgICAgbXNnID0gKAogICAgICAgICAgICAgICAgIntleHR9IG5vdCBsaXN0ZWQgaW4gUEFUSEVYVDsgc2NyaXB0cyB3aWxsIG5vdCBiZSAiCiAgICAgICAgICAgICAgICAicmVjb2duaXplZCBhcyBleGVjdXRhYmxlcy4iCiAgICAgICAgICAgICkuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnLCBVc2VyV2FybmluZykKICAgICAgICBvbGQgPSBbJy5weWEnLCAnLnB5JywgJy1zY3JpcHQucHknLCAnLnB5YycsICcucHlvJywgJy5weXcnLCAnLmV4ZSddCiAgICAgICAgb2xkLnJlbW92ZShleHQpCiAgICAgICAgaGVhZGVyID0gY2xzLl9hZGp1c3RfaGVhZGVyKHR5cGVfLCBoZWFkZXIpCiAgICAgICAgYmxvY2tlcnMgPSBbbmFtZSArIHggZm9yIHggaW4gb2xkXQogICAgICAgIHlpZWxkIG5hbWUgKyBleHQsIGhlYWRlciArIHNjcmlwdF90ZXh0LCAndCcsIGJsb2NrZXJzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2FkanVzdF9oZWFkZXIoY2xzLCB0eXBlXywgb3JpZ19oZWFkZXIpOgogICAgICAgICIiIgogICAgICAgIE1ha2Ugc3VyZSAncHl0aG9udycgaXMgdXNlZCBmb3IgZ3VpIGFuZCBhbmQgJ3B5dGhvbicgaXMgdXNlZCBmb3IKICAgICAgICBjb25zb2xlIChyZWdhcmRsZXNzIG9mIHdoYXQgc3lzLmV4ZWN1dGFibGUgaXMpLgogICAgICAgICIiIgogICAgICAgIHBhdHRlcm4gPSAncHl0aG9udy5leGUnCiAgICAgICAgcmVwbCA9ICdweXRob24uZXhlJwogICAgICAgIGlmIHR5cGVfID09ICdndWknOgogICAgICAgICAgICBwYXR0ZXJuLCByZXBsID0gcmVwbCwgcGF0dGVybgogICAgICAgIHBhdHRlcm5fb2IgPSByZS5jb21waWxlKHJlLmVzY2FwZShwYXR0ZXJuKSwgcmUuSUdOT1JFQ0FTRSkKICAgICAgICBuZXdfaGVhZGVyID0gcGF0dGVybl9vYi5zdWIoc3RyaW5nPW9yaWdfaGVhZGVyLCByZXBsPXJlcGwpCiAgICAgICAgcmV0dXJuIG5ld19oZWFkZXIgaWYgY2xzLl91c2VfaGVhZGVyKG5ld19oZWFkZXIpIGVsc2Ugb3JpZ19oZWFkZXIKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3VzZV9oZWFkZXIobmV3X2hlYWRlcik6CiAgICAgICAgIiIiCiAgICAgICAgU2hvdWxkIF9hZGp1c3RfaGVhZGVyIHVzZSB0aGUgcmVwbGFjZWQgaGVhZGVyPwoKICAgICAgICBPbiBub24td2luZG93cyBzeXN0ZW1zLCBhbHdheXMgdXNlLiBPbgogICAgICAgIFdpbmRvd3Mgc3lzdGVtcywgb25seSB1c2UgdGhlIHJlcGxhY2VkIGhlYWRlciBpZiBpdCByZXNvbHZlcwogICAgICAgIHRvIGFuIGV4ZWN1dGFibGUgb24gdGhlIHN5c3RlbS4KICAgICAgICAiIiIKICAgICAgICBjbGVhbl9oZWFkZXIgPSBuZXdfaGVhZGVyWzI6LTFdLnN0cmlwKCciJykKICAgICAgICByZXR1cm4gc3lzLnBsYXRmb3JtICE9ICd3aW4zMicgb3IgZmluZF9leGVjdXRhYmxlKGNsZWFuX2hlYWRlcikKCgpjbGFzcyBXaW5kb3dzRXhlY3V0YWJsZUxhdW5jaGVyV3JpdGVyKFdpbmRvd3NTY3JpcHRXcml0ZXIpOgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2dldF9zY3JpcHRfYXJncyhjbHMsIHR5cGVfLCBuYW1lLCBoZWFkZXIsIHNjcmlwdF90ZXh0KToKICAgICAgICAiIiIKICAgICAgICBGb3IgV2luZG93cywgYWRkIGEgLnB5IGV4dGVuc2lvbiBhbmQgYW4gLmV4ZSBsYXVuY2hlcgogICAgICAgICIiIgogICAgICAgIGlmIHR5cGVfID09ICdndWknOgogICAgICAgICAgICBsYXVuY2hlcl90eXBlID0gJ2d1aScKICAgICAgICAgICAgZXh0ID0gJy1zY3JpcHQucHl3JwogICAgICAgICAgICBvbGQgPSBbJy5weXcnXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxhdW5jaGVyX3R5cGUgPSAnY2xpJwogICAgICAgICAgICBleHQgPSAnLXNjcmlwdC5weScKICAgICAgICAgICAgb2xkID0gWycucHknLCAnLnB5YycsICcucHlvJ10KICAgICAgICBoZHIgPSBjbHMuX2FkanVzdF9oZWFkZXIodHlwZV8sIGhlYWRlcikKICAgICAgICBibG9ja2VycyA9IFtuYW1lICsgeCBmb3IgeCBpbiBvbGRdCiAgICAgICAgeWllbGQgKG5hbWUgKyBleHQsIGhkciArIHNjcmlwdF90ZXh0LCAndCcsIGJsb2NrZXJzKQogICAgICAgIHlpZWxkICgKICAgICAgICAgICAgbmFtZSArICcuZXhlJywgZ2V0X3dpbl9sYXVuY2hlcihsYXVuY2hlcl90eXBlKSwKICAgICAgICAgICAgJ2InICAjIHdyaXRlIGluIGJpbmFyeSBtb2RlCiAgICAgICAgKQogICAgICAgIGlmIG5vdCBpc182NGJpdCgpOgogICAgICAgICAgICAjIGluc3RhbGwgYSBtYW5pZmVzdCBmb3IgdGhlIGxhdW5jaGVyIHRvIHByZXZlbnQgV2luZG93cwogICAgICAgICAgICAjIGZyb20gZGV0ZWN0aW5nIGl0IGFzIGFuIGluc3RhbGxlciAod2hpY2ggaXQgd2lsbCBmb3IKICAgICAgICAgICAgIyAgbGF1bmNoZXJzIGxpa2UgZWFzeV9pbnN0YWxsLmV4ZSkuIENvbnNpZGVyIG9ubHkKICAgICAgICAgICAgIyAgYWRkaW5nIGEgbWFuaWZlc3QgZm9yIGxhdW5jaGVycyBkZXRlY3RlZCBhcyBpbnN0YWxsZXJzLgogICAgICAgICAgICAjICBTZWUgRGlzdHJpYnV0ZSAjMTQzIGZvciBkZXRhaWxzLgogICAgICAgICAgICBtX25hbWUgPSBuYW1lICsgJy5leGUubWFuaWZlc3QnCiAgICAgICAgICAgIHlpZWxkIChtX25hbWUsIGxvYWRfbGF1bmNoZXJfbWFuaWZlc3QobmFtZSksICd0JykKCgojIGZvciBiYWNrd2FyZC1jb21wYXRpYmlsaXR5CmdldF9zY3JpcHRfYXJncyA9IFNjcmlwdFdyaXRlci5nZXRfc2NyaXB0X2FyZ3MKZ2V0X3NjcmlwdF9oZWFkZXIgPSBTY3JpcHRXcml0ZXIuZ2V0X3NjcmlwdF9oZWFkZXIKCgpkZWYgZ2V0X3dpbl9sYXVuY2hlcih0eXBlKToKICAgICIiIgogICAgTG9hZCB0aGUgV2luZG93cyBsYXVuY2hlciAoZXhlY3V0YWJsZSkgc3VpdGFibGUgZm9yIGxhdW5jaGluZyBhIHNjcmlwdC4KCiAgICBgdHlwZWAgc2hvdWxkIGJlIGVpdGhlciAnY2xpJyBvciAnZ3VpJwoKICAgIFJldHVybnMgdGhlIGV4ZWN1dGFibGUgYXMgYSBieXRlIHN0cmluZy4KICAgICIiIgogICAgbGF1bmNoZXJfZm4gPSAnJXMuZXhlJyAlIHR5cGUKICAgIGlmIGlzXzY0Yml0KCk6CiAgICAgICAgbGF1bmNoZXJfZm4gPSBsYXVuY2hlcl9mbi5yZXBsYWNlKCIuIiwgIi02NC4iKQogICAgZWxzZToKICAgICAgICBsYXVuY2hlcl9mbiA9IGxhdW5jaGVyX2ZuLnJlcGxhY2UoIi4iLCAiLTMyLiIpCiAgICByZXR1cm4gcmVzb3VyY2Vfc3RyaW5nKCdzZXR1cHRvb2xzJywgbGF1bmNoZXJfZm4pCgoKZGVmIGxvYWRfbGF1bmNoZXJfbWFuaWZlc3QobmFtZSk6CiAgICBtYW5pZmVzdCA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2Vfc3RyaW5nKF9fbmFtZV9fLCAnbGF1bmNoZXIgbWFuaWZlc3QueG1sJykKICAgIGlmIHNpeC5QWTI6CiAgICAgICAgcmV0dXJuIG1hbmlmZXN0ICUgdmFycygpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBtYW5pZmVzdC5kZWNvZGUoJ3V0Zi04JykgJSB2YXJzKCkKCgpkZWYgcm10cmVlKHBhdGgsIGlnbm9yZV9lcnJvcnM9RmFsc2UsIG9uZXJyb3I9YXV0b19jaG1vZCk6CiAgICByZXR1cm4gc2h1dGlsLnJtdHJlZShwYXRoLCBpZ25vcmVfZXJyb3JzLCBvbmVycm9yKQoKCmRlZiBjdXJyZW50X3VtYXNrKCk6CiAgICB0bXAgPSBvcy51bWFzaygwbzAyMikKICAgIG9zLnVtYXNrKHRtcCkKICAgIHJldHVybiB0bXAKCgpkZWYgYm9vdHN0cmFwKCk6CiAgICAjIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gc2V0dXB0b29scyouZWdnIGlzIHJ1biB1c2luZyAvYmluL3NoCiAgICBpbXBvcnQgc2V0dXB0b29scwoKICAgIGFyZ3YwID0gb3MucGF0aC5kaXJuYW1lKHNldHVwdG9vbHMuX19wYXRoX19bMF0pCiAgICBzeXMuYXJndlswXSA9IGFyZ3YwCiAgICBzeXMuYXJndi5hcHBlbmQoYXJndjApCiAgICBtYWluKCkKCgpkZWYgbWFpbihhcmd2PU5vbmUsICoqa3cpOgogICAgZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAogICAgZnJvbSBzZXR1cHRvb2xzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbgoKICAgIGNsYXNzIERpc3RyaWJ1dGlvbldpdGhvdXRIZWxwQ29tbWFuZHMoRGlzdHJpYnV0aW9uKToKICAgICAgICBjb21tb25fdXNhZ2UgPSAiIgoKICAgICAgICBkZWYgX3Nob3dfaGVscChzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIHdpdGggX3BhdGNoX3VzYWdlKCk6CiAgICAgICAgICAgICAgICBEaXN0cmlidXRpb24uX3Nob3dfaGVscChzZWxmLCAqYXJncywgKiprdykKCiAgICBpZiBhcmd2IGlzIE5vbmU6CiAgICAgICAgYXJndiA9IHN5cy5hcmd2WzE6XQoKICAgIHdpdGggX3BhdGNoX3VzYWdlKCk6CiAgICAgICAgc2V0dXAoCiAgICAgICAgICAgIHNjcmlwdF9hcmdzPVsnLXEnLCAnZWFzeV9pbnN0YWxsJywgJy12J10gKyBhcmd2LAogICAgICAgICAgICBzY3JpcHRfbmFtZT1zeXMuYXJndlswXSBvciAnZWFzeV9pbnN0YWxsJywKICAgICAgICAgICAgZGlzdGNsYXNzPURpc3RyaWJ1dGlvbldpdGhvdXRIZWxwQ29tbWFuZHMsCiAgICAgICAgICAgICoqa3cKICAgICAgICApCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIF9wYXRjaF91c2FnZSgpOgogICAgaW1wb3J0IGRpc3R1dGlscy5jb3JlCiAgICBVU0FHRSA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICB1c2FnZTogJShzY3JpcHQpcyBbb3B0aW9uc10gcmVxdWlyZW1lbnRfb3JfdXJsIC4uLgogICAgICAgICAgIG9yOiAlKHNjcmlwdClzIC0taGVscAogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBkZWYgZ2VuX3VzYWdlKHNjcmlwdF9uYW1lKToKICAgICAgICByZXR1cm4gVVNBR0UgJSBkaWN0KAogICAgICAgICAgICBzY3JpcHQ9b3MucGF0aC5iYXNlbmFtZShzY3JpcHRfbmFtZSksCiAgICAgICAgKQoKICAgIHNhdmVkID0gZGlzdHV0aWxzLmNvcmUuZ2VuX3VzYWdlCiAgICBkaXN0dXRpbHMuY29yZS5nZW5fdXNhZ2UgPSBnZW5fdXNhZ2UKICAgIHRyeToKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBkaXN0dXRpbHMuY29yZS5nZW5fdXNhZ2UgPSBzYXZlZApQSwMEFAAAAAAAAAAhAE4sckJwYQAAcGEAADYAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHkiIiJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm8KCkNyZWF0ZSBhIGRpc3RyaWJ1dGlvbidzIC5lZ2ctaW5mbyBkaXJlY3RvcnkgYW5kIGNvbnRlbnRzIiIiCgpmcm9tIGRpc3R1dGlscy5maWxlbGlzdCBpbXBvcnQgRmlsZUxpc3QgYXMgX0ZpbGVMaXN0CmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzSW50ZXJuYWxFcnJvcgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgZGlzdHV0aWxzLmVycm9ycwppbXBvcnQgZGlzdHV0aWxzLmZpbGVsaXN0CmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgaW8KaW1wb3J0IHdhcm5pbmdzCmltcG9ydCB0aW1lCmltcG9ydCBjb2xsZWN0aW9ucwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZApmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdCBpbXBvcnQgc2Rpc3QKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3QgaW1wb3J0IHdhbGtfcmV2Y3RybApmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQgaW1wb3J0IGVkaXRfY29uZmlnCmZyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBiZGlzdF9lZ2cKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAoCiAgICBwYXJzZV9yZXF1aXJlbWVudHMsIHNhZmVfbmFtZSwgcGFyc2VfdmVyc2lvbiwKICAgIHNhZmVfdmVyc2lvbiwgeWllbGRfbGluZXMsIEVudHJ5UG9pbnQsIGl0ZXJfZW50cnlfcG9pbnRzLCB0b19maWxlbmFtZSkKaW1wb3J0IHNldHVwdG9vbHMudW5pY29kZV91dGlscyBhcyB1bmljb2RlX3V0aWxzCmZyb20gc2V0dXB0b29scy5nbG9iIGltcG9ydCBnbG9iCgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBwYWNrYWdpbmcKCgpkZWYgdHJhbnNsYXRlX3BhdHRlcm4oZ2xvYik6CiAgICAiIiIKICAgIFRyYW5zbGF0ZSBhIGZpbGUgcGF0aCBnbG9iIGxpa2UgJyoudHh0JyBpbiB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgIFRoaXMgZGlmZmVycyBmcm9tIGZubWF0Y2gudHJhbnNsYXRlIHdoaWNoIGFsbG93cyB3aWxkY2FyZHMgdG8gbWF0Y2gKICAgIGRpcmVjdG9yeSBzZXBhcmF0b3JzLiBJdCBhbHNvIGtub3dzIGFib3V0ICcqKi8nIHdoaWNoIG1hdGNoZXMgYW55IG51bWJlciBvZgogICAgZGlyZWN0b3JpZXMuCiAgICAiIiIKICAgIHBhdCA9ICcnCgogICAgIyBUaGlzIHdpbGwgc3BsaXQgb24gJy8nIHdpdGhpbiBbY2hhcmFjdGVyIGNsYXNzZXNdLiBUaGlzIGlzIGRlbGliZXJhdGUuCiAgICBjaHVua3MgPSBnbG9iLnNwbGl0KG9zLnBhdGguc2VwKQoKICAgIHNlcCA9IHJlLmVzY2FwZShvcy5zZXApCiAgICB2YWxpZF9jaGFyID0gJ1teJXNdJyAlIChzZXAsKQoKICAgIGZvciBjLCBjaHVuayBpbiBlbnVtZXJhdGUoY2h1bmtzKToKICAgICAgICBsYXN0X2NodW5rID0gYyA9PSBsZW4oY2h1bmtzKSAtIDEKCiAgICAgICAgIyBDaHVua3MgdGhhdCBhcmUgYSBsaXRlcmFsICoqIGFyZSBnbG9ic3RhcnMuIFRoZXkgbWF0Y2ggYW55dGhpbmcuCiAgICAgICAgaWYgY2h1bmsgPT0gJyoqJzoKICAgICAgICAgICAgaWYgbGFzdF9jaHVuazoKICAgICAgICAgICAgICAgICMgTWF0Y2ggYW55dGhpbmcgaWYgdGhpcyBpcyB0aGUgbGFzdCBjb21wb25lbnQKICAgICAgICAgICAgICAgIHBhdCArPSAnLionCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIE1hdGNoICcobmFtZS8pKicKICAgICAgICAgICAgICAgIHBhdCArPSAnKD86JXMrJXMpKicgJSAodmFsaWRfY2hhciwgc2VwKQogICAgICAgICAgICBjb250aW51ZSAgIyBCcmVhayBoZXJlIGFzIHRoZSB3aG9sZSBwYXRoIGNvbXBvbmVudCBoYXMgYmVlbiBoYW5kbGVkCgogICAgICAgICMgRmluZCBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSByZW1haW5kZXIKICAgICAgICBpID0gMAogICAgICAgIGNodW5rX2xlbiA9IGxlbihjaHVuaykKICAgICAgICB3aGlsZSBpIDwgY2h1bmtfbGVuOgogICAgICAgICAgICBjaGFyID0gY2h1bmtbaV0KICAgICAgICAgICAgaWYgY2hhciA9PSAnKic6CiAgICAgICAgICAgICAgICAjIE1hdGNoIGFueSBudW1iZXIgb2YgbmFtZSBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAgICBwYXQgKz0gdmFsaWRfY2hhciArICcqJwogICAgICAgICAgICBlbGlmIGNoYXIgPT0gJz8nOgogICAgICAgICAgICAgICAgIyBNYXRjaCBhIG5hbWUgY2hhcmFjdGVyCiAgICAgICAgICAgICAgICBwYXQgKz0gdmFsaWRfY2hhcgogICAgICAgICAgICBlbGlmIGNoYXIgPT0gJ1snOgogICAgICAgICAgICAgICAgIyBDaGFyYWN0ZXIgY2xhc3MKICAgICAgICAgICAgICAgIGlubmVyX2kgPSBpICsgMQogICAgICAgICAgICAgICAgIyBTa2lwIGluaXRpYWwgIS9dIGNoYXJzCiAgICAgICAgICAgICAgICBpZiBpbm5lcl9pIDwgY2h1bmtfbGVuIGFuZCBjaHVua1tpbm5lcl9pXSA9PSAnISc6CiAgICAgICAgICAgICAgICAgICAgaW5uZXJfaSA9IGlubmVyX2kgKyAxCiAgICAgICAgICAgICAgICBpZiBpbm5lcl9pIDwgY2h1bmtfbGVuIGFuZCBjaHVua1tpbm5lcl9pXSA9PSAnXSc6CiAgICAgICAgICAgICAgICAgICAgaW5uZXJfaSA9IGlubmVyX2kgKyAxCgogICAgICAgICAgICAgICAgIyBMb29wIHRpbGwgdGhlIGNsb3NpbmcgXSBpcyBmb3VuZAogICAgICAgICAgICAgICAgd2hpbGUgaW5uZXJfaSA8IGNodW5rX2xlbiBhbmQgY2h1bmtbaW5uZXJfaV0gIT0gJ10nOgogICAgICAgICAgICAgICAgICAgIGlubmVyX2kgPSBpbm5lcl9pICsgMQoKICAgICAgICAgICAgICAgIGlmIGlubmVyX2kgPj0gY2h1bmtfbGVuOgogICAgICAgICAgICAgICAgICAgICMgR290IHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyB3aXRob3V0IGZpbmRpbmcgYSBjbG9zaW5nIF0KICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCB0cmVhdCB0aGlzIGFzIGEgbWF0Y2hpbmcgZ3JvdXAsIGJ1dCBhcyBhIGxpdGVyYWwgWwogICAgICAgICAgICAgICAgICAgIHBhdCArPSByZS5lc2NhcGUoY2hhcikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBHcmFiIHRoZSBpbnNpZGVzIG9mIHRoZSBbYnJhY2tldHNdCiAgICAgICAgICAgICAgICAgICAgaW5uZXIgPSBjaHVua1tpICsgMTppbm5lcl9pXQogICAgICAgICAgICAgICAgICAgIGNoYXJfY2xhc3MgPSAnJwoKICAgICAgICAgICAgICAgICAgICAjIENsYXNzIG5lZ2F0aW9uCiAgICAgICAgICAgICAgICAgICAgaWYgaW5uZXJbMF0gPT0gJyEnOgogICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2NsYXNzID0gJ14nCiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyID0gaW5uZXJbMTpdCgogICAgICAgICAgICAgICAgICAgIGNoYXJfY2xhc3MgKz0gcmUuZXNjYXBlKGlubmVyKQogICAgICAgICAgICAgICAgICAgIHBhdCArPSAnWyVzXScgJSAoY2hhcl9jbGFzcywpCgogICAgICAgICAgICAgICAgICAgICMgU2tpcCB0byB0aGUgZW5kIF0KICAgICAgICAgICAgICAgICAgICBpID0gaW5uZXJfaQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0ICs9IHJlLmVzY2FwZShjaGFyKQogICAgICAgICAgICBpICs9IDEKCiAgICAgICAgIyBKb2luIGVhY2ggY2h1bmsgd2l0aCB0aGUgZGlyIHNlcGFyYXRvcgogICAgICAgIGlmIG5vdCBsYXN0X2NodW5rOgogICAgICAgICAgICBwYXQgKz0gc2VwCgogICAgcGF0ICs9IHInXFonCiAgICByZXR1cm4gcmUuY29tcGlsZShwYXQsIGZsYWdzPXJlLk1VTFRJTElORXxyZS5ET1RBTEwpCgoKY2xhc3MgZWdnX2luZm8oQ29tbWFuZCk6CiAgICBkZXNjcmlwdGlvbiA9ICJjcmVhdGUgYSBkaXN0cmlidXRpb24ncyAuZWdnLWluZm8gZGlyZWN0b3J5IgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2VnZy1iYXNlPScsICdlJywgImRpcmVjdG9yeSBjb250YWluaW5nIC5lZ2ctaW5mbyBkaXJlY3RvcmllcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoZGVmYXVsdDogdG9wIG9mIHRoZSBzb3VyY2UgdHJlZSkiKSwKICAgICAgICAoJ3RhZy1kYXRlJywgJ2QnLCAiQWRkIGRhdGUgc3RhbXAgKGUuZy4gMjAwNTA1MjgpIHRvIHZlcnNpb24gbnVtYmVyIiksCiAgICAgICAgKCd0YWctYnVpbGQ9JywgJ2InLCAiU3BlY2lmeSBleHBsaWNpdCB0YWcgdG8gYWRkIHRvIHZlcnNpb24gbnVtYmVyIiksCiAgICAgICAgKCduby1kYXRlJywgJ0QnLCAiRG9uJ3QgaW5jbHVkZSBkYXRlIHN0YW1wIFtkZWZhdWx0XSIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsndGFnLWRhdGUnXQogICAgbmVnYXRpdmVfb3B0ID0gewogICAgICAgICduby1kYXRlJzogJ3RhZy1kYXRlJywKICAgIH0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuZWdnX25hbWUgPSBOb25lCiAgICAgICAgc2VsZi5lZ2dfdmVyc2lvbiA9IE5vbmUKICAgICAgICBzZWxmLmVnZ19iYXNlID0gTm9uZQogICAgICAgIHNlbGYuZWdnX2luZm8gPSBOb25lCiAgICAgICAgc2VsZi50YWdfYnVpbGQgPSBOb25lCiAgICAgICAgc2VsZi50YWdfZGF0ZSA9IDAKICAgICAgICBzZWxmLmJyb2tlbl9lZ2dfaW5mbyA9IEZhbHNlCiAgICAgICAgc2VsZi52dGFncyA9IE5vbmUKCiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICMgYWxsb3cgdGhlICd0YWdfc3ZuX3JldmlzaW9uJyB0byBiZSBkZXRlY3RlZCBhbmQKICAgICMgc2V0LCBzdXBwb3J0aW5nIHNkaXN0cyBidWlsdCBvbiBvbGRlciBTZXR1cHRvb2xzLgogICAgQHByb3BlcnR5CiAgICBkZWYgdGFnX3N2bl9yZXZpc2lvbihzZWxmKToKICAgICAgICBwYXNzCgogICAgQHRhZ19zdm5fcmV2aXNpb24uc2V0dGVyCiAgICBkZWYgdGFnX3N2bl9yZXZpc2lvbihzZWxmLCB2YWx1ZSk6CiAgICAgICAgcGFzcwogICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgZGVmIHNhdmVfdmVyc2lvbl9pbmZvKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICAiIiIKICAgICAgICBNYXRlcmlhbGl6ZSB0aGUgdmFsdWUgb2YgZGF0ZSBpbnRvIHRoZQogICAgICAgIGJ1aWxkIHRhZy4gSW5zdGFsbCBidWlsZCBrZXlzIGluIGEgZGV0ZXJtaW5pc3RpYyBvcmRlcgogICAgICAgIHRvIGF2b2lkIGFyYml0cmFyeSByZW9yZGVyaW5nIG9uIHN1YnNlcXVlbnQgYnVpbGRzLgogICAgICAgICIiIgogICAgICAgIGVnZ19pbmZvID0gY29sbGVjdGlvbnMuT3JkZXJlZERpY3QoKQogICAgICAgICMgZm9sbG93IHRoZSBvcmRlciB0aGVzZSBrZXlzIHdvdWxkIGhhdmUgYmVlbiBhZGRlZAogICAgICAgICMgd2hlbiBQWVRIT05IQVNIU0VFRD0wCiAgICAgICAgZWdnX2luZm9bJ3RhZ19idWlsZCddID0gc2VsZi50YWdzKCkKICAgICAgICBlZ2dfaW5mb1sndGFnX2RhdGUnXSA9IDAKICAgICAgICBlZGl0X2NvbmZpZyhmaWxlbmFtZSwgZGljdChlZ2dfaW5mbz1lZ2dfaW5mbykpCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5lZ2dfbmFtZSA9IHNhZmVfbmFtZShzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpKQogICAgICAgIHNlbGYudnRhZ3MgPSBzZWxmLnRhZ3MoKQogICAgICAgIHNlbGYuZWdnX3ZlcnNpb24gPSBzZWxmLnRhZ2dlZF92ZXJzaW9uKCkKCiAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHNlbGYuZWdnX3ZlcnNpb24pCgogICAgICAgIHRyeToKICAgICAgICAgICAgaXNfdmVyc2lvbiA9IGlzaW5zdGFuY2UocGFyc2VkX3ZlcnNpb24sIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24pCiAgICAgICAgICAgIHNwZWMgPSAoCiAgICAgICAgICAgICAgICAiJXM9PSVzIiBpZiBpc192ZXJzaW9uIGVsc2UgIiVzPT09JXMiCiAgICAgICAgICAgICkKICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgIHBhcnNlX3JlcXVpcmVtZW50cyhzcGVjICUgKHNlbGYuZWdnX25hbWUsIHNlbGYuZWdnX3ZlcnNpb24pKQogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiSW52YWxpZCBkaXN0cmlidXRpb24gbmFtZSBvciB2ZXJzaW9uIHN5bnRheDogJXMtJXMiICUKICAgICAgICAgICAgICAgIChzZWxmLmVnZ19uYW1lLCBzZWxmLmVnZ192ZXJzaW9uKQogICAgICAgICAgICApCgogICAgICAgIGlmIHNlbGYuZWdnX2Jhc2UgaXMgTm9uZToKICAgICAgICAgICAgZGlycyA9IHNlbGYuZGlzdHJpYnV0aW9uLnBhY2thZ2VfZGlyCiAgICAgICAgICAgIHNlbGYuZWdnX2Jhc2UgPSAoZGlycyBvciB7fSkuZ2V0KCcnLCBvcy5jdXJkaXIpCgogICAgICAgIHNlbGYuZW5zdXJlX2Rpcm5hbWUoJ2VnZ19iYXNlJykKICAgICAgICBzZWxmLmVnZ19pbmZvID0gdG9fZmlsZW5hbWUoc2VsZi5lZ2dfbmFtZSkgKyAnLmVnZy1pbmZvJwogICAgICAgIGlmIHNlbGYuZWdnX2Jhc2UgIT0gb3MuY3VyZGlyOgogICAgICAgICAgICBzZWxmLmVnZ19pbmZvID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2Jhc2UsIHNlbGYuZWdnX2luZm8pCiAgICAgICAgaWYgJy0nIGluIHNlbGYuZWdnX25hbWU6CiAgICAgICAgICAgIHNlbGYuY2hlY2tfYnJva2VuX2VnZ19pbmZvKCkKCiAgICAgICAgIyBTZXQgcGFja2FnZSB2ZXJzaW9uIGZvciB0aGUgYmVuZWZpdCBvZiBkdW1iZXIgY29tbWFuZHMKICAgICAgICAjIChlLmcuIHNkaXN0LCBiZGlzdF93aW5pbnN0LCBldGMuKQogICAgICAgICMKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YS52ZXJzaW9uID0gc2VsZi5lZ2dfdmVyc2lvbgoKICAgICAgICAjIElmIHdlIGJvb3RzdHJhcHBlZCBhcm91bmQgdGhlIGxhY2sgb2YgYSBQS0ctSU5GTywgYXMgbWlnaHQgYmUgdGhlCiAgICAgICAgIyBjYXNlIGluIGEgZnJlc2ggY2hlY2tvdXQsIG1ha2Ugc3VyZSB0aGF0IGFueSBzcGVjaWFsIHRhZ3MgZ2V0IGFkZGVkCiAgICAgICAgIyB0byB0aGUgdmVyc2lvbiBpbmZvCiAgICAgICAgIwogICAgICAgIHBkID0gc2VsZi5kaXN0cmlidXRpb24uX3BhdGNoZWRfZGlzdAogICAgICAgIGlmIHBkIGlzIG5vdCBOb25lIGFuZCBwZC5rZXkgPT0gc2VsZi5lZ2dfbmFtZS5sb3dlcigpOgogICAgICAgICAgICBwZC5fdmVyc2lvbiA9IHNlbGYuZWdnX3ZlcnNpb24KICAgICAgICAgICAgcGQuX3BhcnNlZF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbihzZWxmLmVnZ192ZXJzaW9uKQogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5fcGF0Y2hlZF9kaXN0ID0gTm9uZQoKICAgIGRlZiB3cml0ZV9vcl9kZWxldGVfZmlsZShzZWxmLCB3aGF0LCBmaWxlbmFtZSwgZGF0YSwgZm9yY2U9RmFsc2UpOgogICAgICAgICIiIldyaXRlIGBkYXRhYCB0byBgZmlsZW5hbWVgIG9yIGRlbGV0ZSBpZiBlbXB0eQoKICAgICAgICBJZiBgZGF0YWAgaXMgbm9uLWVtcHR5LCB0aGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgYGB3cml0ZV9maWxlKClgYC4KICAgICAgICBJZiBgZGF0YWAgaXMgZW1wdHkgYnV0IG5vdCBgYE5vbmVgYCwgdGhpcyBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nCiAgICAgICAgYGBkZWxldGVfZmlsZShmaWxlbmFtZSlgLiAgSWYgYGRhdGFgIGlzIGBgTm9uZWBgLCB0aGVuIHRoaXMgaXMgYSBuby1vcAogICAgICAgIHVubGVzcyBgZmlsZW5hbWVgIGV4aXN0cywgaW4gd2hpY2ggY2FzZSBhIHdhcm5pbmcgaXMgaXNzdWVkIGFib3V0IHRoZQogICAgICAgIG9ycGhhbmVkIGZpbGUgKGlmIGBmb3JjZWAgaXMgZmFsc2UpLCBvciBkZWxldGVkIChpZiBgZm9yY2VgIGlzIHRydWUpLgogICAgICAgICIiIgogICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgIHNlbGYud3JpdGVfZmlsZSh3aGF0LCBmaWxlbmFtZSwgZGF0YSkKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lIGFuZCBub3QgZm9yY2U6CiAgICAgICAgICAgICAgICBsb2cud2FybigKICAgICAgICAgICAgICAgICAgICAiJXMgbm90IHNldCBpbiBzZXR1cCgpLCBidXQgJXMgZXhpc3RzIiwgd2hhdCwgZmlsZW5hbWUKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5kZWxldGVfZmlsZShmaWxlbmFtZSkKCiAgICBkZWYgd3JpdGVfZmlsZShzZWxmLCB3aGF0LCBmaWxlbmFtZSwgZGF0YSk6CiAgICAgICAgIiIiV3JpdGUgYGRhdGFgIHRvIGBmaWxlbmFtZWAgKGlmIG5vdCBhIGRyeSBydW4pIGFmdGVyIGFubm91bmNpbmcgaXQKCiAgICAgICAgYHdoYXRgIGlzIHVzZWQgaW4gYSBsb2cgbWVzc2FnZSB0byBpZGVudGlmeSB3aGF0IGlzIGJlaW5nIHdyaXR0ZW4KICAgICAgICB0byB0aGUgZmlsZS4KICAgICAgICAiIiIKICAgICAgICBsb2cuaW5mbygid3JpdGluZyAlcyB0byAlcyIsIHdoYXQsIGZpbGVuYW1lKQogICAgICAgIGlmIHNpeC5QWTM6CiAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZSgidXRmLTgiKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAnd2InKQogICAgICAgICAgICBmLndyaXRlKGRhdGEpCiAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgIGRlZiBkZWxldGVfZmlsZShzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgIiIiRGVsZXRlIGBmaWxlbmFtZWAgKGlmIG5vdCBhIGRyeSBydW4pIGFmdGVyIGFubm91bmNpbmcgaXQiIiIKICAgICAgICBsb2cuaW5mbygiZGVsZXRpbmcgJXMiLCBmaWxlbmFtZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCgogICAgZGVmIHRhZ2dlZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIHZlcnNpb24gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpCiAgICAgICAgIyBlZ2dfaW5mbyBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGZvciBhIGRpc3RyaWJ1dGlvbiwKICAgICAgICAjIGluIHdoaWNoIGNhc2UgdGhlIHZlcnNpb24gc3RyaW5nIGFscmVhZHkgY29udGFpbnMgYWxsIHRhZ3MuCiAgICAgICAgaWYgc2VsZi52dGFncyBhbmQgdmVyc2lvbi5lbmRzd2l0aChzZWxmLnZ0YWdzKToKICAgICAgICAgICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2ZXJzaW9uKQogICAgICAgIHJldHVybiBzYWZlX3ZlcnNpb24odmVyc2lvbiArIHNlbGYudnRhZ3MpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLm1rcGF0aChzZWxmLmVnZ19pbmZvKQogICAgICAgIGluc3RhbGxlciA9IHNlbGYuZGlzdHJpYnV0aW9uLmZldGNoX2J1aWxkX2VnZwogICAgICAgIGZvciBlcCBpbiBpdGVyX2VudHJ5X3BvaW50cygnZWdnX2luZm8ud3JpdGVycycpOgogICAgICAgICAgICBlcC5yZXF1aXJlKGluc3RhbGxlcj1pbnN0YWxsZXIpCiAgICAgICAgICAgIHdyaXRlciA9IGVwLnJlc29sdmUoKQogICAgICAgICAgICB3cml0ZXIoc2VsZiwgZXAubmFtZSwgb3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sIGVwLm5hbWUpKQoKICAgICAgICAjIEdldCByaWQgb2YgbmF0aXZlX2xpYnMudHh0IGlmIGl0IHdhcyBwdXQgdGhlcmUgYnkgb2xkZXIgYmRpc3RfZWdnCiAgICAgICAgbmwgPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywgIm5hdGl2ZV9saWJzLnR4dCIpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmwpOgogICAgICAgICAgICBzZWxmLmRlbGV0ZV9maWxlKG5sKQoKICAgICAgICBzZWxmLmZpbmRfc291cmNlcygpCgogICAgZGVmIHRhZ3Moc2VsZik6CiAgICAgICAgdmVyc2lvbiA9ICcnCiAgICAgICAgaWYgc2VsZi50YWdfYnVpbGQ6CiAgICAgICAgICAgIHZlcnNpb24gKz0gc2VsZi50YWdfYnVpbGQKICAgICAgICBpZiBzZWxmLnRhZ19kYXRlOgogICAgICAgICAgICB2ZXJzaW9uICs9IHRpbWUuc3RyZnRpbWUoIi0lWSVtJWQiKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgZGVmIGZpbmRfc291cmNlcyhzZWxmKToKICAgICAgICAiIiJHZW5lcmF0ZSBTT1VSQ0VTLnR4dCBtYW5pZmVzdCBmaWxlIiIiCiAgICAgICAgbWFuaWZlc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywgIlNPVVJDRVMudHh0IikKICAgICAgICBtbSA9IG1hbmlmZXN0X21ha2VyKHNlbGYuZGlzdHJpYnV0aW9uKQogICAgICAgIG1tLm1hbmlmZXN0ID0gbWFuaWZlc3RfZmlsZW5hbWUKICAgICAgICBtbS5ydW4oKQogICAgICAgIHNlbGYuZmlsZWxpc3QgPSBtbS5maWxlbGlzdAoKICAgIGRlZiBjaGVja19icm9rZW5fZWdnX2luZm8oc2VsZik6CiAgICAgICAgYmVpID0gc2VsZi5lZ2dfbmFtZSArICcuZWdnLWluZm8nCiAgICAgICAgaWYgc2VsZi5lZ2dfYmFzZSAhPSBvcy5jdXJkaXI6CiAgICAgICAgICAgIGJlaSA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19iYXNlLCBiZWkpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoYmVpKToKICAgICAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICAgICAiLSIgKiA3OCArICdcbicKICAgICAgICAgICAgICAgICJOb3RlOiBZb3VyIGN1cnJlbnQgLmVnZy1pbmZvIGRpcmVjdG9yeSBoYXMgYSAnLScgaW4gaXRzIG5hbWU7IgogICAgICAgICAgICAgICAgJ1xudGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSB3aXRoICJzZXR1cC5weSBkZXZlbG9wIi5cblxuJwogICAgICAgICAgICAgICAgJ1BsZWFzZSByZW5hbWUgJXMgdG8gJXMgdG8gY29ycmVjdCB0aGlzIHByb2JsZW0uXG4nICsgJy0nICogNzgsCiAgICAgICAgICAgICAgICBiZWksIHNlbGYuZWdnX2luZm8KICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmJyb2tlbl9lZ2dfaW5mbyA9IHNlbGYuZWdnX2luZm8KICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGJlaSAgIyBtYWtlIGl0IHdvcmsgZm9yIG5vdwoKCmNsYXNzIEZpbGVMaXN0KF9GaWxlTGlzdCk6CiAgICAjIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgdmFyaW91cyBNQU5JRkVTVC5pbiBjb21tYW5kcwoKICAgIGRlZiBwcm9jZXNzX3RlbXBsYXRlX2xpbmUoc2VsZiwgbGluZSk6CiAgICAgICAgIyBQYXJzZSB0aGUgbGluZTogc3BsaXQgaXQgdXAsIG1ha2Ugc3VyZSB0aGUgcmlnaHQgbnVtYmVyIG9mIHdvcmRzCiAgICAgICAgIyBpcyB0aGVyZSwgYW5kIHJldHVybiB0aGUgcmVsZXZhbnQgd29yZHMuICAnYWN0aW9uJyBpcyBhbHdheXMKICAgICAgICAjIGRlZmluZWQ6IGl0J3MgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIGxpbmUuICBXaGljaCBvZiB0aGUgb3RoZXIKICAgICAgICAjIHRocmVlIGFyZSBkZWZpbmVkIGRlcGVuZHMgb24gdGhlIGFjdGlvbjsgaXQnbGwgYmUgZWl0aGVyCiAgICAgICAgIyBwYXR0ZXJucywgKGRpciBhbmQgcGF0dGVybnMpLCBvciAoZGlyX3BhdHRlcm4pLgogICAgICAgIChhY3Rpb24sIHBhdHRlcm5zLCBkaXIsIGRpcl9wYXR0ZXJuKSA9IHNlbGYuX3BhcnNlX3RlbXBsYXRlX2xpbmUobGluZSkKCiAgICAgICAgIyBPSywgbm93IHdlIGtub3cgdGhhdCB0aGUgYWN0aW9uIGlzIHZhbGlkIGFuZCB3ZSBoYXZlIHRoZQogICAgICAgICMgcmlnaHQgbnVtYmVyIG9mIHdvcmRzIG9uIHRoZSBsaW5lIGZvciB0aGF0IGFjdGlvbiAtLSBzbyB3ZQogICAgICAgICMgY2FuIHByb2NlZWQgd2l0aCBtaW5pbWFsIGVycm9yLWNoZWNraW5nLgogICAgICAgIGlmIGFjdGlvbiA9PSAnaW5jbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImluY2x1ZGUgIiArICcgJy5qb2luKHBhdHRlcm5zKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pbmNsdWRlKHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJ3YXJuaW5nOiBubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAnJXMnIiwgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2V4Y2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJleGNsdWRlICIgKyAnICcuam9pbihwYXR0ZXJucykpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZXhjbHVkZShwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgbWF0Y2hpbmcgJyVzJyIpLCBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ2xvYmFsLWluY2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJnbG9iYWwtaW5jbHVkZSAiICsgJyAnLmpvaW4ocGF0dGVybnMpKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmdsb2JhbF9pbmNsdWRlKHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgJyVzJyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnl3aGVyZSBpbiBkaXN0cmlidXRpb24iKSwgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dsb2JhbC1leGNsdWRlJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiZ2xvYmFsLWV4Y2x1ZGUgIiArICcgJy5qb2luKHBhdHRlcm5zKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5nbG9iYWxfZXhjbHVkZShwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgbWF0Y2hpbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBmb3VuZCBhbnl3aGVyZSBpbiBkaXN0cmlidXRpb24iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncmVjdXJzaXZlLWluY2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJyZWN1cnNpdmUtaW5jbHVkZSAlcyAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXIsICcgJy5qb2luKHBhdHRlcm5zKSkpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucmVjdXJzaXZlX2luY2x1ZGUoZGlyLCBwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICclcycgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5kZXIgZGlyZWN0b3J5ICclcyciKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLCBkaXIpCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdyZWN1cnNpdmUtZXhjbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoInJlY3Vyc2l2ZS1leGNsdWRlICVzICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpciwgJyAnLmpvaW4ocGF0dGVybnMpKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5yZWN1cnNpdmVfZXhjbHVkZShkaXIsIHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyBtYXRjaGluZyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGZvdW5kIHVuZGVyIGRpcmVjdG9yeSAnJXMnIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiwgZGlyKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ3JhZnQnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJncmFmdCAiICsgZGlyX3BhdHRlcm4pCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmdyYWZ0KGRpcl9wYXR0ZXJuKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJ3YXJuaW5nOiBubyBkaXJlY3RvcmllcyBmb3VuZCBtYXRjaGluZyAnJXMnIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9wYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncHJ1bmUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJwcnVuZSAiICsgZGlyX3BhdHRlcm4pCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBydW5lKGRpcl9wYXR0ZXJuKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCgibm8gcHJldmlvdXNseS1pbmNsdWRlZCBkaXJlY3RvcmllcyBmb3VuZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoaW5nICclcyciKSwgZGlyX3BhdHRlcm4pCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ludGVybmFsRXJyb3IoCiAgICAgICAgICAgICAgICAidGhpcyBjYW5ub3QgaGFwcGVuOiBpbnZhbGlkIGFjdGlvbiAnJXMnIiAlIGFjdGlvbikKCiAgICBkZWYgX3JlbW92ZV9maWxlcyhzZWxmLCBwcmVkaWNhdGUpOgogICAgICAgICIiIgogICAgICAgIFJlbW92ZSBhbGwgZmlsZXMgZnJvbSB0aGUgZmlsZSBsaXN0IHRoYXQgbWF0Y2ggdGhlIHByZWRpY2F0ZS4KICAgICAgICBSZXR1cm4gVHJ1ZSBpZiBhbnkgbWF0Y2hpbmcgZmlsZXMgd2VyZSByZW1vdmVkCiAgICAgICAgIiIiCiAgICAgICAgZm91bmQgPSBGYWxzZQogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmZpbGVzKSAtIDEsIC0xLCAtMSk6CiAgICAgICAgICAgIGlmIHByZWRpY2F0ZShzZWxmLmZpbGVzW2ldKToKICAgICAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoIiByZW1vdmluZyAiICsgc2VsZi5maWxlc1tpXSkKICAgICAgICAgICAgICAgIGRlbCBzZWxmLmZpbGVzW2ldCiAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKICAgICAgICByZXR1cm4gZm91bmQKCiAgICBkZWYgaW5jbHVkZShzZWxmLCBwYXR0ZXJuKToKICAgICAgICAiIiJJbmNsdWRlIGZpbGVzIHRoYXQgbWF0Y2ggJ3BhdHRlcm4nLiIiIgogICAgICAgIGZvdW5kID0gW2YgZm9yIGYgaW4gZ2xvYihwYXR0ZXJuKSBpZiBub3Qgb3MucGF0aC5pc2RpcihmKV0KICAgICAgICBzZWxmLmV4dGVuZChmb3VuZCkKICAgICAgICByZXR1cm4gYm9vbChmb3VuZCkKCiAgICBkZWYgZXhjbHVkZShzZWxmLCBwYXR0ZXJuKToKICAgICAgICAiIiJFeGNsdWRlIGZpbGVzIHRoYXQgbWF0Y2ggJ3BhdHRlcm4nLiIiIgogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ocGF0dGVybikKICAgICAgICByZXR1cm4gc2VsZi5fcmVtb3ZlX2ZpbGVzKG1hdGNoLm1hdGNoKQoKICAgIGRlZiByZWN1cnNpdmVfaW5jbHVkZShzZWxmLCBkaXIsIHBhdHRlcm4pOgogICAgICAgICIiIgogICAgICAgIEluY2x1ZGUgYWxsIGZpbGVzIGFueXdoZXJlIGluICdkaXIvJyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLgogICAgICAgICIiIgogICAgICAgIGZ1bGxfcGF0dGVybiA9IG9zLnBhdGguam9pbihkaXIsICcqKicsIHBhdHRlcm4pCiAgICAgICAgZm91bmQgPSBbZiBmb3IgZiBpbiBnbG9iKGZ1bGxfcGF0dGVybiwgcmVjdXJzaXZlPVRydWUpCiAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZildCiAgICAgICAgc2VsZi5leHRlbmQoZm91bmQpCiAgICAgICAgcmV0dXJuIGJvb2woZm91bmQpCgogICAgZGVmIHJlY3Vyc2l2ZV9leGNsdWRlKHNlbGYsIGRpciwgcGF0dGVybik6CiAgICAgICAgIiIiCiAgICAgICAgRXhjbHVkZSBhbnkgZmlsZSBhbnl3aGVyZSBpbiAnZGlyLycgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4KICAgICAgICAiIiIKICAgICAgICBtYXRjaCA9IHRyYW5zbGF0ZV9wYXR0ZXJuKG9zLnBhdGguam9pbihkaXIsICcqKicsIHBhdHRlcm4pKQogICAgICAgIHJldHVybiBzZWxmLl9yZW1vdmVfZmlsZXMobWF0Y2gubWF0Y2gpCgogICAgZGVmIGdyYWZ0KHNlbGYsIGRpcik6CiAgICAgICAgIiIiSW5jbHVkZSBhbGwgZmlsZXMgZnJvbSAnZGlyLycuIiIiCiAgICAgICAgZm91bmQgPSBbCiAgICAgICAgICAgIGl0ZW0KICAgICAgICAgICAgZm9yIG1hdGNoX2RpciBpbiBnbG9iKGRpcikKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZGlzdHV0aWxzLmZpbGVsaXN0LmZpbmRhbGwobWF0Y2hfZGlyKQogICAgICAgIF0KICAgICAgICBzZWxmLmV4dGVuZChmb3VuZCkKICAgICAgICByZXR1cm4gYm9vbChmb3VuZCkKCiAgICBkZWYgcHJ1bmUoc2VsZiwgZGlyKToKICAgICAgICAiIiJGaWx0ZXIgb3V0IGZpbGVzIGZyb20gJ2Rpci8nLiIiIgogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ob3MucGF0aC5qb2luKGRpciwgJyoqJykpCiAgICAgICAgcmV0dXJuIHNlbGYuX3JlbW92ZV9maWxlcyhtYXRjaC5tYXRjaCkKCiAgICBkZWYgZ2xvYmFsX2luY2x1ZGUoc2VsZiwgcGF0dGVybik6CiAgICAgICAgIiIiCiAgICAgICAgSW5jbHVkZSBhbGwgZmlsZXMgYW55d2hlcmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgbWF0Y2ggdGhlCiAgICAgICAgcGF0dGVybi4gVGhpcyBpcyB2ZXJ5IGluZWZmaWNpZW50IG9uIGxhcmdlIGZpbGUgdHJlZXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5hbGxmaWxlcyBpcyBOb25lOgogICAgICAgICAgICBzZWxmLmZpbmRhbGwoKQogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ob3MucGF0aC5qb2luKCcqKicsIHBhdHRlcm4pKQogICAgICAgIGZvdW5kID0gW2YgZm9yIGYgaW4gc2VsZi5hbGxmaWxlcyBpZiBtYXRjaC5tYXRjaChmKV0KICAgICAgICBzZWxmLmV4dGVuZChmb3VuZCkKICAgICAgICByZXR1cm4gYm9vbChmb3VuZCkKCiAgICBkZWYgZ2xvYmFsX2V4Y2x1ZGUoc2VsZiwgcGF0dGVybik6CiAgICAgICAgIiIiCiAgICAgICAgRXhjbHVkZSBhbGwgZmlsZXMgYW55d2hlcmUgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4KICAgICAgICAiIiIKICAgICAgICBtYXRjaCA9IHRyYW5zbGF0ZV9wYXR0ZXJuKG9zLnBhdGguam9pbignKionLCBwYXR0ZXJuKSkKICAgICAgICByZXR1cm4gc2VsZi5fcmVtb3ZlX2ZpbGVzKG1hdGNoLm1hdGNoKQoKICAgIGRlZiBhcHBlbmQoc2VsZiwgaXRlbSk6CiAgICAgICAgaWYgaXRlbS5lbmRzd2l0aCgnXHInKTogICMgRml4IG9sZGVyIHNkaXN0cyBidWlsdCBvbiBXaW5kb3dzCiAgICAgICAgICAgIGl0ZW0gPSBpdGVtWzotMV0KICAgICAgICBwYXRoID0gY29udmVydF9wYXRoKGl0ZW0pCgogICAgICAgIGlmIHNlbGYuX3NhZmVfcGF0aChwYXRoKToKICAgICAgICAgICAgc2VsZi5maWxlcy5hcHBlbmQocGF0aCkKCiAgICBkZWYgZXh0ZW5kKHNlbGYsIHBhdGhzKToKICAgICAgICBzZWxmLmZpbGVzLmV4dGVuZChmaWx0ZXIoc2VsZi5fc2FmZV9wYXRoLCBwYXRocykpCgogICAgZGVmIF9yZXBhaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVwbGFjZSBzZWxmLmZpbGVzIHdpdGggb25seSBzYWZlIHBhdGhzCgogICAgICAgIEJlY2F1c2Ugc29tZSBvd25lcnMgb2YgRmlsZUxpc3QgbWFuaXB1bGF0ZSB0aGUgdW5kZXJseWluZwogICAgICAgIGBgZmlsZXNgYCBhdHRyaWJ1dGUgZGlyZWN0bHksIHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHRvCiAgICAgICAgcmVwYWlyIHRob3NlIHBhdGhzLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZmlsZXMgPSBsaXN0KGZpbHRlcihzZWxmLl9zYWZlX3BhdGgsIHNlbGYuZmlsZXMpKQoKICAgIGRlZiBfc2FmZV9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgIGVuY193YXJuID0gIiclcycgbm90ICVzIGVuY29kYWJsZSAtLSBza2lwcGluZyIKCiAgICAgICAgIyBUbyBhdm9pZCBhY2NpZGVudGFsIHRyYW5zLWNvZGluZ3MgZXJyb3JzLCBmaXJzdCB0byB1bmljb2RlCiAgICAgICAgdV9wYXRoID0gdW5pY29kZV91dGlscy5maWxlc3lzX2RlY29kZShwYXRoKQogICAgICAgIGlmIHVfcGF0aCBpcyBOb25lOgogICAgICAgICAgICBsb2cud2FybigiJyVzJyBpbiB1bmV4cGVjdGVkIGVuY29kaW5nIC0tIHNraXBwaW5nIiAlIHBhdGgpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIE11c3QgZW5zdXJlIHV0Zi04IGVuY29kYWJpbGl0eQogICAgICAgIHV0ZjhfcGF0aCA9IHVuaWNvZGVfdXRpbHMudHJ5X2VuY29kZSh1X3BhdGgsICJ1dGYtOCIpCiAgICAgICAgaWYgdXRmOF9wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZy53YXJuKGVuY193YXJuLCBwYXRoLCAndXRmLTgnKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIGFjY2VwdCBpcyBlaXRoZXIgd2F5IGNoZWNrcyBvdXQKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModV9wYXRoKSBvciBvcy5wYXRoLmV4aXN0cyh1dGY4X3BhdGgpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAjIHRoaXMgd2lsbCBjYXRjaCBhbnkgZW5jb2RlIGVycm9ycyBkZWNvZGluZyB1X3BhdGgKICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICBsb2cud2FybihlbmNfd2FybiwgcGF0aCwgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQoKCmNsYXNzIG1hbmlmZXN0X21ha2VyKHNkaXN0KToKICAgIHRlbXBsYXRlID0gIk1BTklGRVNULmluIgoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi51c2VfZGVmYXVsdHMgPSAxCiAgICAgICAgc2VsZi5wcnVuZSA9IDEKICAgICAgICBzZWxmLm1hbmlmZXN0X29ubHkgPSAxCiAgICAgICAgc2VsZi5mb3JjZV9tYW5pZmVzdCA9IDEKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLmZpbGVsaXN0ID0gRmlsZUxpc3QoKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLm1hbmlmZXN0KToKICAgICAgICAgICAgc2VsZi53cml0ZV9tYW5pZmVzdCgpICAjIGl0IG11c3QgZXhpc3Qgc28gaXQnbGwgZ2V0IGluIHRoZSBsaXN0CiAgICAgICAgc2VsZi5hZGRfZGVmYXVsdHMoKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudGVtcGxhdGUpOgogICAgICAgICAgICBzZWxmLnJlYWRfdGVtcGxhdGUoKQogICAgICAgIHNlbGYucHJ1bmVfZmlsZV9saXN0KCkKICAgICAgICBzZWxmLmZpbGVsaXN0LnNvcnQoKQogICAgICAgIHNlbGYuZmlsZWxpc3QucmVtb3ZlX2R1cGxpY2F0ZXMoKQogICAgICAgIHNlbGYud3JpdGVfbWFuaWZlc3QoKQoKICAgIGRlZiBfbWFuaWZlc3Rfbm9ybWFsaXplKHNlbGYsIHBhdGgpOgogICAgICAgIHBhdGggPSB1bmljb2RlX3V0aWxzLmZpbGVzeXNfZGVjb2RlKHBhdGgpCiAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZShvcy5zZXAsICcvJykKCiAgICBkZWYgd3JpdGVfbWFuaWZlc3Qoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgV3JpdGUgdGhlIGZpbGUgbGlzdCBpbiAnc2VsZi5maWxlbGlzdCcgdG8gdGhlIG1hbmlmZXN0IGZpbGUKICAgICAgICBuYW1lZCBieSAnc2VsZi5tYW5pZmVzdCcuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5maWxlbGlzdC5fcmVwYWlyKCkKCiAgICAgICAgIyBOb3cgX3JlcGFpcnMgc2hvdWxkIGVuY29kYWJpbGl0eSwgYnV0IG5vdCB1bmljb2RlCiAgICAgICAgZmlsZXMgPSBbc2VsZi5fbWFuaWZlc3Rfbm9ybWFsaXplKGYpIGZvciBmIGluIHNlbGYuZmlsZWxpc3QuZmlsZXNdCiAgICAgICAgbXNnID0gIndyaXRpbmcgbWFuaWZlc3QgZmlsZSAnJXMnIiAlIHNlbGYubWFuaWZlc3QKICAgICAgICBzZWxmLmV4ZWN1dGUod3JpdGVfZmlsZSwgKHNlbGYubWFuaWZlc3QsIGZpbGVzKSwgbXNnKQoKICAgIGRlZiB3YXJuKHNlbGYsIG1zZyk6CiAgICAgICAgaWYgbm90IHNlbGYuX3Nob3VsZF9zdXBwcmVzc193YXJuaW5nKG1zZyk6CiAgICAgICAgICAgIHNkaXN0Lndhcm4oc2VsZiwgbXNnKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfc2hvdWxkX3N1cHByZXNzX3dhcm5pbmcobXNnKToKICAgICAgICAiIiIKICAgICAgICBzdXBwcmVzcyBtaXNzaW5nLWZpbGUgd2FybmluZ3MgZnJvbSBzZGlzdAogICAgICAgICIiIgogICAgICAgIHJldHVybiByZS5tYXRjaChyInN0YW5kYXJkIGZpbGUgLipub3QgZm91bmQiLCBtc2cpCgogICAgZGVmIGFkZF9kZWZhdWx0cyhzZWxmKToKICAgICAgICBzZGlzdC5hZGRfZGVmYXVsdHMoc2VsZikKICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChzZWxmLnRlbXBsYXRlKQogICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHNlbGYubWFuaWZlc3QpCiAgICAgICAgcmNmaWxlcyA9IGxpc3Qod2Fsa19yZXZjdHJsKCkpCiAgICAgICAgaWYgcmNmaWxlczoKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQocmNmaWxlcykKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNlbGYubWFuaWZlc3QpOgogICAgICAgICAgICBzZWxmLnJlYWRfbWFuaWZlc3QoKQogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgc2VsZi5maWxlbGlzdC5ncmFmdChlaV9jbWQuZWdnX2luZm8pCgogICAgZGVmIHBydW5lX2ZpbGVfbGlzdChzZWxmKToKICAgICAgICBidWlsZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZCcpCiAgICAgICAgYmFzZV9kaXIgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKQogICAgICAgIHNlbGYuZmlsZWxpc3QucHJ1bmUoYnVpbGQuYnVpbGRfYmFzZSkKICAgICAgICBzZWxmLmZpbGVsaXN0LnBydW5lKGJhc2VfZGlyKQogICAgICAgIHNlcCA9IHJlLmVzY2FwZShvcy5zZXApCiAgICAgICAgc2VsZi5maWxlbGlzdC5leGNsdWRlX3BhdHRlcm4ocicoXnwnICsgc2VwICsgcicpKFJDU3xDVlN8XC5zdm4pJyArIHNlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWdleD0xKQoKCmRlZiB3cml0ZV9maWxlKGZpbGVuYW1lLCBjb250ZW50cyk6CiAgICAiIiJDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB3cml0ZSAnY29udGVudHMnIChhCiAgICBzZXF1ZW5jZSBvZiBzdHJpbmdzIHdpdGhvdXQgbGluZSB0ZXJtaW5hdG9ycykgdG8gaXQuCiAgICAiIiIKICAgIGNvbnRlbnRzID0gIlxuIi5qb2luKGNvbnRlbnRzKQoKICAgICMgYXNzdW1pbmcgdGhlIGNvbnRlbnRzIGhhcyBiZWVuIHZldHRlZCBmb3IgdXRmLTggZW5jb2RpbmcKICAgIGNvbnRlbnRzID0gY29udGVudHMuZW5jb2RlKCJ1dGYtOCIpCgogICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAid2IiKSBhcyBmOiAgIyBhbHdheXMgd3JpdGUgUE9TSVgtc3R5bGUgbWFuaWZlc3QKICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQoKCmRlZiB3cml0ZV9wa2dfaW5mbyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBsb2cuaW5mbygid3JpdGluZyAlcyIsIGZpbGVuYW1lKQogICAgaWYgbm90IGNtZC5kcnlfcnVuOgogICAgICAgIG1ldGFkYXRhID0gY21kLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YQogICAgICAgIG1ldGFkYXRhLnZlcnNpb24sIG9sZHZlciA9IGNtZC5lZ2dfdmVyc2lvbiwgbWV0YWRhdGEudmVyc2lvbgogICAgICAgIG1ldGFkYXRhLm5hbWUsIG9sZG5hbWUgPSBjbWQuZWdnX25hbWUsIG1ldGFkYXRhLm5hbWUKICAgICAgICBtZXRhZGF0YS5sb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZSA9IGdldGF0dHIoCiAgICAgICAgICAgIGNtZC5kaXN0cmlidXRpb24sCiAgICAgICAgICAgICdsb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZScKICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIHdyaXRlIHVuZXNjYXBlZCBkYXRhIHRvIFBLRy1JTkZPLCBzbyBvbGRlciBwa2dfcmVzb3VyY2VzCiAgICAgICAgICAgICMgY2FuIHN0aWxsIHBhcnNlIGl0CiAgICAgICAgICAgIG1ldGFkYXRhLndyaXRlX3BrZ19pbmZvKGNtZC5lZ2dfaW5mbykKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS52ZXJzaW9uID0gb2xkbmFtZSwgb2xkdmVyCgogICAgICAgIHNhZmUgPSBnZXRhdHRyKGNtZC5kaXN0cmlidXRpb24sICd6aXBfc2FmZScsIE5vbmUpCgogICAgICAgIGJkaXN0X2VnZy53cml0ZV9zYWZldHlfZmxhZyhjbWQuZWdnX2luZm8sIHNhZmUpCgoKZGVmIHdhcm5fZGVwZW5kc19vYnNvbGV0ZShjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICJXQVJOSU5HOiAnZGVwZW5kcy50eHQnIGlzIG5vdCB1c2VkIGJ5IHNldHVwdG9vbHMgMC42IVxuIgogICAgICAgICAgICAiVXNlIHRoZSBpbnN0YWxsX3JlcXVpcmVzL2V4dHJhc19yZXF1aXJlIHNldHVwKCkgYXJncyBpbnN0ZWFkLiIKICAgICAgICApCgoKZGVmIF93cml0ZV9yZXF1aXJlbWVudHMoc3RyZWFtLCByZXFzKToKICAgIGxpbmVzID0geWllbGRfbGluZXMocmVxcyBvciAoKSkKICAgIGFwcGVuZF9jciA9IGxhbWJkYSBsaW5lOiBsaW5lICsgJ1xuJwogICAgbGluZXMgPSBtYXAoYXBwZW5kX2NyLCBsaW5lcykKICAgIHN0cmVhbS53cml0ZWxpbmVzKGxpbmVzKQoKCmRlZiB3cml0ZV9yZXF1aXJlbWVudHMoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgZGlzdCA9IGNtZC5kaXN0cmlidXRpb24KICAgIGRhdGEgPSBzaXguU3RyaW5nSU8oKQogICAgX3dyaXRlX3JlcXVpcmVtZW50cyhkYXRhLCBkaXN0Lmluc3RhbGxfcmVxdWlyZXMpCiAgICBleHRyYXNfcmVxdWlyZSA9IGRpc3QuZXh0cmFzX3JlcXVpcmUgb3Ige30KICAgIGZvciBleHRyYSBpbiBzb3J0ZWQoZXh0cmFzX3JlcXVpcmUpOgogICAgICAgIGRhdGEud3JpdGUoJ1xuW3tleHRyYX1dXG4nLmZvcm1hdCgqKnZhcnMoKSkpCiAgICAgICAgX3dyaXRlX3JlcXVpcmVtZW50cyhkYXRhLCBleHRyYXNfcmVxdWlyZVtleHRyYV0pCiAgICBjbWQud3JpdGVfb3JfZGVsZXRlX2ZpbGUoInJlcXVpcmVtZW50cyIsIGZpbGVuYW1lLCBkYXRhLmdldHZhbHVlKCkpCgoKZGVmIHdyaXRlX3NldHVwX3JlcXVpcmVtZW50cyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBkYXRhID0gaW8uU3RyaW5nSU8oKQogICAgX3dyaXRlX3JlcXVpcmVtZW50cyhkYXRhLCBjbWQuZGlzdHJpYnV0aW9uLnNldHVwX3JlcXVpcmVzKQogICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKCJzZXR1cC1yZXF1aXJlbWVudHMiLCBmaWxlbmFtZSwgZGF0YS5nZXR2YWx1ZSgpKQoKCmRlZiB3cml0ZV90b3BsZXZlbF9uYW1lcyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBwa2dzID0gZGljdC5mcm9ta2V5cygKICAgICAgICBbCiAgICAgICAgICAgIGsuc3BsaXQoJy4nLCAxKVswXQogICAgICAgICAgICBmb3IgayBpbiBjbWQuZGlzdHJpYnV0aW9uLml0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKCkKICAgICAgICBdCiAgICApCiAgICBjbWQud3JpdGVfZmlsZSgidG9wLWxldmVsIG5hbWVzIiwgZmlsZW5hbWUsICdcbicuam9pbihzb3J0ZWQocGtncykpICsgJ1xuJykKCgpkZWYgb3ZlcndyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICB3cml0ZV9hcmcoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUsIFRydWUpCgoKZGVmIHdyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSwgZm9yY2U9RmFsc2UpOgogICAgYXJnbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoYmFzZW5hbWUpWzBdCiAgICB2YWx1ZSA9IGdldGF0dHIoY21kLmRpc3RyaWJ1dGlvbiwgYXJnbmFtZSwgTm9uZSkKICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgIHZhbHVlID0gJ1xuJy5qb2luKHZhbHVlKSArICdcbicKICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZShhcmduYW1lLCBmaWxlbmFtZSwgdmFsdWUsIGZvcmNlKQoKCmRlZiB3cml0ZV9lbnRyaWVzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIGVwID0gY21kLmRpc3RyaWJ1dGlvbi5lbnRyeV9wb2ludHMKCiAgICBpZiBpc2luc3RhbmNlKGVwLCBzaXguc3RyaW5nX3R5cGVzKSBvciBlcCBpcyBOb25lOgogICAgICAgIGRhdGEgPSBlcAogICAgZWxpZiBlcCBpcyBub3QgTm9uZToKICAgICAgICBkYXRhID0gW10KICAgICAgICBmb3Igc2VjdGlvbiwgY29udGVudHMgaW4gc29ydGVkKGVwLml0ZW1zKCkpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjb250ZW50cywgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBjb250ZW50cyA9IEVudHJ5UG9pbnQucGFyc2VfZ3JvdXAoc2VjdGlvbiwgY29udGVudHMpCiAgICAgICAgICAgICAgICBjb250ZW50cyA9ICdcbicuam9pbihzb3J0ZWQobWFwKHN0ciwgY29udGVudHMudmFsdWVzKCkpKSkKICAgICAgICAgICAgZGF0YS5hcHBlbmQoJ1slc11cbiVzXG5cbicgJSAoc2VjdGlvbiwgY29udGVudHMpKQogICAgICAgIGRhdGEgPSAnJy5qb2luKGRhdGEpCgogICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKCdlbnRyeSBwb2ludHMnLCBmaWxlbmFtZSwgZGF0YSwgVHJ1ZSkKCgpkZWYgZ2V0X3BrZ19pbmZvX3JldmlzaW9uKCk6CiAgICAiIiIKICAgIEdldCBhIC1yIyMjIG9mZiBvZiBQS0ctSU5GTyBWZXJzaW9uIGluIGNhc2UgdGhpcyBpcyBhbiBzZGlzdCBvZgogICAgYSBzdWJ2ZXJzaW9uIHJldmlzaW9uLgogICAgIiIiCiAgICB3YXJuaW5ncy53YXJuKCJnZXRfcGtnX2luZm9fcmV2aXNpb24gaXMgZGVwcmVjYXRlZC4iLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICBpZiBvcy5wYXRoLmV4aXN0cygnUEtHLUlORk8nKToKICAgICAgICB3aXRoIGlvLm9wZW4oJ1BLRy1JTkZPJykgYXMgZjoKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgIG1hdGNoID0gcmUubWF0Y2gociJWZXJzaW9uOi4qLXIoXGQrKVxzKiQiLCBsaW5lKQogICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludChtYXRjaC5ncm91cCgxKSkKICAgIHJldHVybiAwClBLAwQUAAAAAAAAACEAjdu1P0sSAABLEgAANQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsLnB5ZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNBcmdFcnJvcgppbXBvcnQgaW5zcGVjdAppbXBvcnQgZ2xvYgppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsIGFzIG9yaWcKCmltcG9ydCBzZXR1cHRvb2xzCgojIFByaW9yIHRvIG51bXB5IDEuOSwgTnVtUHkgcmVsaWVzIG9uIHRoZSAnX2luc3RhbGwnIG5hbWUsIHNvIHByb3ZpZGUgaXQgZm9yCiMgbm93LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvMTk5LwpfaW5zdGFsbCA9IG9yaWcuaW5zdGFsbAoKCmNsYXNzIGluc3RhbGwob3JpZy5pbnN0YWxsKToKICAgICIiIlVzZSBlYXN5X2luc3RhbGwgdG8gaW5zdGFsbCB0aGUgcGFja2FnZSwgdy9kZXBlbmRlbmNpZXMiIiIKCiAgICB1c2VyX29wdGlvbnMgPSBvcmlnLmluc3RhbGwudXNlcl9vcHRpb25zICsgWwogICAgICAgICgnb2xkLWFuZC11bm1hbmFnZWFibGUnLCBOb25lLCAiVHJ5IG5vdCB0byB1c2UgdGhpcyEiKSwKICAgICAgICAoJ3NpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCcsIE5vbmUsCiAgICAgICAgICJ1c2VkIGJ5IHN5c3RlbSBwYWNrYWdlIGJ1aWxkZXJzIHRvIGNyZWF0ZSAnZmxhdCcgZWdncyIpLAogICAgXQogICAgYm9vbGVhbl9vcHRpb25zID0gb3JpZy5pbnN0YWxsLmJvb2xlYW5fb3B0aW9ucyArIFsKICAgICAgICAnb2xkLWFuZC11bm1hbmFnZWFibGUnLCAnc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkJywKICAgIF0KICAgIG5ld19jb21tYW5kcyA9IFsKICAgICAgICAoJ2luc3RhbGxfZWdnX2luZm8nLCBsYW1iZGEgc2VsZjogVHJ1ZSksCiAgICAgICAgKCdpbnN0YWxsX3NjcmlwdHMnLCBsYW1iZGEgc2VsZjogVHJ1ZSksCiAgICBdCiAgICBfbmMgPSBkaWN0KG5ld19jb21tYW5kcykKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuaW5zdGFsbC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLm9sZF9hbmRfdW5tYW5hZ2VhYmxlID0gTm9uZQogICAgICAgIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuaW5zdGFsbC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgaWYgc2VsZi5yb290OgogICAgICAgICAgICBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZCA9IFRydWUKICAgICAgICBlbGlmIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5yb290IGFuZCBub3Qgc2VsZi5yZWNvcmQ6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSAtLXJlY29yZCBvciAtLXJvb3Qgd2hlbiBidWlsZGluZyBzeXN0ZW0iCiAgICAgICAgICAgICAgICAgICAgIiBwYWNrYWdlcyIKICAgICAgICAgICAgICAgICkKCiAgICBkZWYgaGFuZGxlX2V4dHJhX3BhdGgoc2VsZik6CiAgICAgICAgaWYgc2VsZi5yb290IG9yIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkOgogICAgICAgICAgICAjIGV4cGxpY2l0IGJhY2t3YXJkLWNvbXBhdGliaWxpdHkgbW9kZSwgYWxsb3cgZXh0cmFfcGF0aCB0byB3b3JrCiAgICAgICAgICAgIHJldHVybiBvcmlnLmluc3RhbGwuaGFuZGxlX2V4dHJhX3BhdGgoc2VsZikKCiAgICAgICAgIyBJZ25vcmUgZXh0cmFfcGF0aCB3aGVuIGluc3RhbGxpbmcgYW4gZWdnIChvciBiZWluZyBydW4gYnkgYW5vdGhlcgogICAgICAgICMgY29tbWFuZCB3aXRob3V0IC0tcm9vdCBvciAtLXNpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZAogICAgICAgIHNlbGYucGF0aF9maWxlID0gTm9uZQogICAgICAgIHNlbGYuZXh0cmFfZGlycyA9ICcnCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAjIEV4cGxpY2l0IHJlcXVlc3QgZm9yIG9sZC1zdHlsZSBpbnN0YWxsPyAgSnVzdCBkbyBpdAogICAgICAgIGlmIHNlbGYub2xkX2FuZF91bm1hbmFnZWFibGUgb3Igc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQ6CiAgICAgICAgICAgIHJldHVybiBvcmlnLmluc3RhbGwucnVuKHNlbGYpCgogICAgICAgIGlmIG5vdCBzZWxmLl9jYWxsZWRfZnJvbV9zZXR1cChpbnNwZWN0LmN1cnJlbnRmcmFtZSgpKToKICAgICAgICAgICAgIyBSdW4gaW4gYmFja3dhcmQtY29tcGF0aWJpbGl0eSBtb2RlIHRvIHN1cHBvcnQgYmRpc3RfKiBjb21tYW5kcy4KICAgICAgICAgICAgb3JpZy5pbnN0YWxsLnJ1bihzZWxmKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZG9fZWdnX2luc3RhbGwoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfY2FsbGVkX2Zyb21fc2V0dXAocnVuX2ZyYW1lKToKICAgICAgICAiIiIKICAgICAgICBBdHRlbXB0IHRvIGRldGVjdCB3aGV0aGVyIHJ1bigpIHdhcyBjYWxsZWQgZnJvbSBzZXR1cCgpIG9yIGJ5IGFub3RoZXIKICAgICAgICBjb21tYW5kLiAgSWYgY2FsbGVkIGJ5IHNldHVwKCksIHRoZSBwYXJlbnQgY2FsbGVyIHdpbGwgYmUgdGhlCiAgICAgICAgJ3J1bl9jb21tYW5kJyBtZXRob2QgaW4gJ2Rpc3R1dGlscy5kaXN0JywgYW5kICppdHMqIGNhbGxlciB3aWxsIGJlCiAgICAgICAgdGhlICdydW5fY29tbWFuZHMnIG1ldGhvZC4gIElmIGNhbGxlZCBhbnkgb3RoZXIgd2F5LCB0aGUKICAgICAgICBpbW1lZGlhdGUgY2FsbGVyICptaWdodCogYmUgJ3J1bl9jb21tYW5kJywgYnV0IGl0IHdvbid0IGhhdmUgYmVlbgogICAgICAgIGNhbGxlZCBieSAncnVuX2NvbW1hbmRzJy4gUmV0dXJuIFRydWUgaW4gdGhhdCBjYXNlIG9yIGlmIGEgY2FsbCBzdGFjawogICAgICAgIGlzIHVuYXZhaWxhYmxlLiBSZXR1cm4gRmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICIiIgogICAgICAgIGlmIHJ1bl9mcmFtZSBpcyBOb25lOgogICAgICAgICAgICBtc2cgPSAiQ2FsbCBzdGFjayBub3QgYXZhaWxhYmxlLiBiZGlzdF8qIGNvbW1hbmRzIG1heSBmYWlsLiIKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2cpCiAgICAgICAgICAgIGlmIHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpID09ICdJcm9uUHl0aG9uJzoKICAgICAgICAgICAgICAgIG1zZyA9ICJGb3IgYmVzdCByZXN1bHRzLCBwYXNzIC1YOkZyYW1lcyB0byBlbmFibGUgY2FsbCBzdGFjay4iCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZykKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXMgPSBpbnNwZWN0LmdldG91dGVyZnJhbWVzKHJ1bl9mcmFtZSlbMl0KICAgICAgICBjYWxsZXIsID0gcmVzWzoxXQogICAgICAgIGluZm8gPSBpbnNwZWN0LmdldGZyYW1laW5mbyhjYWxsZXIpCiAgICAgICAgY2FsbGVyX21vZHVsZSA9IGNhbGxlci5mX2dsb2JhbHMuZ2V0KCdfX25hbWVfXycsICcnKQogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGNhbGxlcl9tb2R1bGUgPT0gJ2Rpc3R1dGlscy5kaXN0JwogICAgICAgICAgICBhbmQgaW5mby5mdW5jdGlvbiA9PSAncnVuX2NvbW1hbmRzJwogICAgICAgICkKCiAgICBkZWYgZG9fZWdnX2luc3RhbGwoc2VsZik6CgogICAgICAgIGVhc3lfaW5zdGFsbCA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX2NsYXNzKCdlYXN5X2luc3RhbGwnKQoKICAgICAgICBjbWQgPSBlYXN5X2luc3RhbGwoCiAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLCBhcmdzPSJ4Iiwgcm9vdD1zZWxmLnJvb3QsIHJlY29yZD1zZWxmLnJlY29yZCwKICAgICAgICApCiAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKSAgIyBmaW5hbGl6ZSBiZWZvcmUgYmRpc3RfZWdnIG11bmdlcyBpbnN0YWxsIGNtZAogICAgICAgIGNtZC5hbHdheXNfY29weV9mcm9tID0gJy4nICAjIG1ha2Ugc3VyZSBsb2NhbC1kaXIgZWdncyBnZXQgaW5zdGFsbGVkCgogICAgICAgICMgcGljayB1cCBzZXR1cC1kaXIgLmVnZyBmaWxlcyBvbmx5OiBubyAuZWdnLWluZm8KICAgICAgICBjbWQucGFja2FnZV9pbmRleC5zY2FuKGdsb2IuZ2xvYignKi5lZ2cnKSkKCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYmRpc3RfZWdnJykKICAgICAgICBhcmdzID0gW3NlbGYuZGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX29iaignYmRpc3RfZWdnJykuZWdnX291dHB1dF0KCiAgICAgICAgaWYgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tOgogICAgICAgICAgICAjIEJvb3RzdHJhcCBzZWxmLWluc3RhbGxhdGlvbiBvZiBzZXR1cHRvb2xzCiAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSkKCiAgICAgICAgY21kLmFyZ3MgPSBhcmdzCiAgICAgICAgY21kLnJ1bigpCiAgICAgICAgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tID0gTm9uZQoKCiMgWFhYIFB5dGhvbiAzLjEgZG9lc24ndCBzZWUgX25jIGlmIHRoaXMgaXMgaW5zaWRlIHRoZSBjbGFzcwppbnN0YWxsLnN1Yl9jb21tYW5kcyA9ICgKICAgIFtjbWQgZm9yIGNtZCBpbiBvcmlnLmluc3RhbGwuc3ViX2NvbW1hbmRzIGlmIGNtZFswXSBub3QgaW4gaW5zdGFsbC5fbmNdICsKICAgIGluc3RhbGwubmV3X2NvbW1hbmRzCikKUEsDBBQAAAAAAAAAIQBc0qjlmwgAAJsIAAA+AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHlmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nLCBkaXJfdXRpbAppbXBvcnQgb3MKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZApmcm9tIHNldHVwdG9vbHMgaW1wb3J0IG5hbWVzcGFjZXMKZnJvbSBzZXR1cHRvb2xzLmFyY2hpdmVfdXRpbCBpbXBvcnQgdW5wYWNrX2FyY2hpdmUKaW1wb3J0IHBrZ19yZXNvdXJjZXMKCgpjbGFzcyBpbnN0YWxsX2VnZ19pbmZvKG5hbWVzcGFjZXMuSW5zdGFsbGVyLCBDb21tYW5kKToKICAgICIiIkluc3RhbGwgYW4gLmVnZy1pbmZvIGRpcmVjdG9yeSBmb3IgdGhlIHBhY2thZ2UiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJJbnN0YWxsIGFuIC5lZ2ctaW5mbyBkaXJlY3RvcnkgZm9yIHRoZSBwYWNrYWdlIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2luc3RhbGwtZGlyPScsICdkJywgImRpcmVjdG9yeSB0byBpbnN0YWxsIHRvIiksCiAgICBdCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsX2xpYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsX2RpcicsICdpbnN0YWxsX2RpcicpKQogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgYmFzZW5hbWUgPSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbigKICAgICAgICAgICAgTm9uZSwgTm9uZSwgZWlfY21kLmVnZ19uYW1lLCBlaV9jbWQuZWdnX3ZlcnNpb24KICAgICAgICApLmVnZ19uYW1lKCkgKyAnLmVnZy1pbmZvJwogICAgICAgIHNlbGYuc291cmNlID0gZWlfY21kLmVnZ19pbmZvCiAgICAgICAgc2VsZi50YXJnZXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgYmFzZW5hbWUpCiAgICAgICAgc2VsZi5vdXRwdXRzID0gW10KCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHNlbGYudGFyZ2V0KSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKHNlbGYudGFyZ2V0KToKICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoc2VsZi50YXJnZXQsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc2VsZi50YXJnZXQpOgogICAgICAgICAgICBzZWxmLmV4ZWN1dGUob3MudW5saW5rLCAoc2VsZi50YXJnZXQsKSwgIlJlbW92aW5nICIgKyBzZWxmLnRhcmdldCkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLmVuc3VyZV9kaXJlY3Rvcnkoc2VsZi50YXJnZXQpCiAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICBzZWxmLmNvcHl0cmVlLCAoKSwgIkNvcHlpbmcgJXMgdG8gJXMiICUgKHNlbGYuc291cmNlLCBzZWxmLnRhcmdldCkKICAgICAgICApCiAgICAgICAgc2VsZi5pbnN0YWxsX25hbWVzcGFjZXMoKQoKICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5vdXRwdXRzCgogICAgZGVmIGNvcHl0cmVlKHNlbGYpOgogICAgICAgICMgQ29weSB0aGUgLmVnZy1pbmZvIHRyZWUgdG8gc2l0ZS1wYWNrYWdlcwogICAgICAgIGRlZiBza2ltbWVyKHNyYywgZHN0KToKICAgICAgICAgICAgIyBmaWx0ZXIgb3V0IHNvdXJjZS1jb250cm9sIGRpcmVjdG9yaWVzOyBub3RlIHRoYXQgJ3NyYycgaXMgYWx3YXlzCiAgICAgICAgICAgICMgYSAnLyctc2VwYXJhdGVkIHBhdGgsIHJlZ2FyZGxlc3Mgb2YgcGxhdGZvcm0uICAnZHN0JyBpcyBhCiAgICAgICAgICAgICMgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aC4KICAgICAgICAgICAgZm9yIHNraXAgaW4gJy5zdm4vJywgJ0NWUy8nOgogICAgICAgICAgICAgICAgaWYgc3JjLnN0YXJ0c3dpdGgoc2tpcCkgb3IgJy8nICsgc2tpcCBpbiBzcmM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgc2VsZi5vdXRwdXRzLmFwcGVuZChkc3QpCiAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29weWluZyAlcyB0byAlcyIsIHNyYywgZHN0KQogICAgICAgICAgICByZXR1cm4gZHN0CgogICAgICAgIHVucGFja19hcmNoaXZlKHNlbGYuc291cmNlLCBzZWxmLnRhcmdldCwgc2tpbW1lcikKUEsDBBQAAAAAAAAAIQCQnDtTAA8AAAAPAAA5AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfbGliLnB5aW1wb3J0IG9zCmltcG9ydCBpbXAKZnJvbSBpdGVydG9vbHMgaW1wb3J0IHByb2R1Y3QsIHN0YXJtYXAKaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfbGliIGFzIG9yaWcKCgpjbGFzcyBpbnN0YWxsX2xpYihvcmlnLmluc3RhbGxfbGliKToKICAgICIiIkRvbid0IGFkZCBjb21waWxlZCBmbGFncyB0byBmaWxlbmFtZXMgb2Ygbm9uLVB5dGhvbiBmaWxlcyIiIgoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5idWlsZCgpCiAgICAgICAgb3V0ZmlsZXMgPSBzZWxmLmluc3RhbGwoKQogICAgICAgIGlmIG91dGZpbGVzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAjIGFsd2F5cyBjb21waWxlLCBpbiBjYXNlIHdlIGhhdmUgYW55IGV4dGVuc2lvbiBzdHVicyB0byBkZWFsIHdpdGgKICAgICAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUob3V0ZmlsZXMpCgogICAgZGVmIGdldF9leGNsdXNpb25zKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGNvbGxlY3Rpb25zLlNpemVkIGNvbGxlY3Rpb25zLkNvbnRhaW5lciBvZiBwYXRocyB0byBiZQogICAgICAgIGV4Y2x1ZGVkIGZvciBzaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgaW5zdGFsbGF0aW9ucy4KICAgICAgICAiIiIKICAgICAgICBhbGxfcGFja2FnZXMgPSAoCiAgICAgICAgICAgIHBrZwogICAgICAgICAgICBmb3IgbnNfcGtnIGluIHNlbGYuX2dldF9TVkVNX05TUHMoKQogICAgICAgICAgICBmb3IgcGtnIGluIHNlbGYuX2FsbF9wYWNrYWdlcyhuc19wa2cpCiAgICAgICAgKQoKICAgICAgICBleGNsX3NwZWNzID0gcHJvZHVjdChhbGxfcGFja2FnZXMsIHNlbGYuX2dlbl9leGNsdXNpb25fcGF0aHMoKSkKICAgICAgICByZXR1cm4gc2V0KHN0YXJtYXAoc2VsZi5fZXhjbHVkZV9wa2dfcGF0aCwgZXhjbF9zcGVjcykpCgogICAgZGVmIF9leGNsdWRlX3BrZ19wYXRoKHNlbGYsIHBrZywgZXhjbHVzaW9uX3BhdGgpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGEgcGFja2FnZSBuYW1lIGFuZCBleGNsdXNpb24gcGF0aCB3aXRoaW4gdGhhdCBwYWNrYWdlLAogICAgICAgIGNvbXB1dGUgdGhlIGZ1bGwgZXhjbHVzaW9uIHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgcGFydHMgPSBwa2cuc3BsaXQoJy4nKSArIFtleGNsdXNpb25fcGF0aF0KICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsICpwYXJ0cykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2FsbF9wYWNrYWdlcyhwa2dfbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgPj4+IGxpc3QoaW5zdGFsbF9saWIuX2FsbF9wYWNrYWdlcygnZm9vLmJhci5iYXonKSkKICAgICAgICBbJ2Zvby5iYXIuYmF6JywgJ2Zvby5iYXInLCAnZm9vJ10KICAgICAgICAiIiIKICAgICAgICB3aGlsZSBwa2dfbmFtZToKICAgICAgICAgICAgeWllbGQgcGtnX25hbWUKICAgICAgICAgICAgcGtnX25hbWUsIHNlcCwgY2hpbGQgPSBwa2dfbmFtZS5ycGFydGl0aW9uKCcuJykKCiAgICBkZWYgX2dldF9TVkVNX05TUHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IG5hbWVzcGFjZSBwYWNrYWdlcyAobGlzdCkgYnV0IG9ubHkgZm9yCiAgICAgICAgc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkIGluc3RhbGxhdGlvbnMgYW5kIGVtcHR5IG90aGVyd2lzZS4KICAgICAgICAiIiIKICAgICAgICAjIFRPRE86IGlzIGl0IG5lY2Vzc2FyeSB0byBzaG9ydC1jaXJjdWl0IGhlcmU/IGkuZS4gd2hhdCdzIHRoZSBjb3N0CiAgICAgICAgIyBpZiBnZXRfZmluYWxpemVkX2NvbW1hbmQgaXMgY2FsbGVkIGV2ZW4gd2hlbiBuYW1lc3BhY2VfcGFja2FnZXMgaXMKICAgICAgICAjIEZhbHNlPwogICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICBpbnN0YWxsX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykKICAgICAgICBzdmVtID0gaW5zdGFsbF9jbWQuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkCgogICAgICAgIHJldHVybiBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXMgaWYgc3ZlbSBlbHNlIFtdCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9nZW5fZXhjbHVzaW9uX3BhdGhzKCk6CiAgICAgICAgIiIiCiAgICAgICAgR2VuZXJhdGUgZmlsZSBwYXRocyB0byBiZSBleGNsdWRlZCBmb3IgbmFtZXNwYWNlIHBhY2thZ2VzIChieXRlY29kZQogICAgICAgIGNhY2hlIGZpbGVzKS4KICAgICAgICAiIiIKICAgICAgICAjIGFsd2F5cyBleGNsdWRlIHRoZSBwYWNrYWdlIG1vZHVsZSBpdHNlbGYKICAgICAgICB5aWVsZCAnX19pbml0X18ucHknCgogICAgICAgIHlpZWxkICdfX2luaXRfXy5weWMnCiAgICAgICAgeWllbGQgJ19faW5pdF9fLnB5bycKCiAgICAgICAgaWYgbm90IGhhc2F0dHIoaW1wLCAnZ2V0X3RhZycpOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgYmFzZSA9IG9zLnBhdGguam9pbignX19weWNhY2hlX18nLCAnX19pbml0X18uJyArIGltcC5nZXRfdGFnKCkpCiAgICAgICAgeWllbGQgYmFzZSArICcucHljJwogICAgICAgIHlpZWxkIGJhc2UgKyAnLnB5bycKICAgICAgICB5aWVsZCBiYXNlICsgJy5vcHQtMS5weWMnCiAgICAgICAgeWllbGQgYmFzZSArICcub3B0LTIucHljJwoKICAgIGRlZiBjb3B5X3RyZWUoCiAgICAgICAgICAgIHNlbGYsIGluZmlsZSwgb3V0ZmlsZSwKICAgICAgICAgICAgcHJlc2VydmVfbW9kZT0xLCBwcmVzZXJ2ZV90aW1lcz0xLCBwcmVzZXJ2ZV9zeW1saW5rcz0wLCBsZXZlbD0xCiAgICApOgogICAgICAgIGFzc2VydCBwcmVzZXJ2ZV9tb2RlIGFuZCBwcmVzZXJ2ZV90aW1lcyBhbmQgbm90IHByZXNlcnZlX3N5bWxpbmtzCiAgICAgICAgZXhjbHVkZSA9IHNlbGYuZ2V0X2V4Y2x1c2lvbnMoKQoKICAgICAgICBpZiBub3QgZXhjbHVkZToKICAgICAgICAgICAgcmV0dXJuIG9yaWcuaW5zdGFsbF9saWIuY29weV90cmVlKHNlbGYsIGluZmlsZSwgb3V0ZmlsZSkKCiAgICAgICAgIyBFeGNsdWRlIG5hbWVzcGFjZSBwYWNrYWdlIF9faW5pdF9fLnB5KiBmaWxlcyBmcm9tIHRoZSBvdXRwdXQKCiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmFyY2hpdmVfdXRpbCBpbXBvcnQgdW5wYWNrX2RpcmVjdG9yeQogICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKCiAgICAgICAgb3V0ZmlsZXMgPSBbXQoKICAgICAgICBkZWYgcGYoc3JjLCBkc3QpOgogICAgICAgICAgICBpZiBkc3QgaW4gZXhjbHVkZToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJTa2lwcGluZyBpbnN0YWxsYXRpb24gb2YgJXMgKG5hbWVzcGFjZSBwYWNrYWdlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBkc3QpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIGxvZy5pbmZvKCJjb3B5aW5nICVzIC0+ICVzIiwgc3JjLCBvcy5wYXRoLmRpcm5hbWUoZHN0KSkKICAgICAgICAgICAgb3V0ZmlsZXMuYXBwZW5kKGRzdCkKICAgICAgICAgICAgcmV0dXJuIGRzdAoKICAgICAgICB1bnBhY2tfZGlyZWN0b3J5KGluZmlsZSwgb3V0ZmlsZSwgcGYpCiAgICAgICAgcmV0dXJuIG91dGZpbGVzCgogICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgogICAgICAgIG91dHB1dHMgPSBvcmlnLmluc3RhbGxfbGliLmdldF9vdXRwdXRzKHNlbGYpCiAgICAgICAgZXhjbHVkZSA9IHNlbGYuZ2V0X2V4Y2x1c2lvbnMoKQogICAgICAgIGlmIGV4Y2x1ZGU6CiAgICAgICAgICAgIHJldHVybiBbZiBmb3IgZiBpbiBvdXRwdXRzIGlmIGYgbm90IGluIGV4Y2x1ZGVdCiAgICAgICAgcmV0dXJuIG91dHB1dHMKUEsDBBQAAAAAAAAAIQBGP/EehwkAAIcJAAA9AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weWZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfc2NyaXB0cyBhcyBvcmlnCmltcG9ydCBvcwppbXBvcnQgc3lzCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IERpc3RyaWJ1dGlvbiwgUGF0aE1ldGFkYXRhLCBlbnN1cmVfZGlyZWN0b3J5CgoKY2xhc3MgaW5zdGFsbF9zY3JpcHRzKG9yaWcuaW5zdGFsbF9zY3JpcHRzKToKICAgICIiIkRvIG5vcm1hbCBzY3JpcHQgaW5zdGFsbCwgcGx1cyBhbnkgZWdnX2luZm8gd3JhcHBlciBzY3JpcHRzIiIiCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcmlnLmluc3RhbGxfc2NyaXB0cy5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLm5vX2VwID0gRmFsc2UKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGltcG9ydCBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGFzIGVpCgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgogICAgICAgICAgICBvcmlnLmluc3RhbGxfc2NyaXB0cy5ydW4oc2VsZikgICMgcnVuIGZpcnN0IHRvIHNldCB1cCBzZWxmLm91dGZpbGVzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5vdXRmaWxlcyA9IFtdCiAgICAgICAgaWYgc2VsZi5ub19lcDoKICAgICAgICAgICAgIyBkb24ndCBpbnN0YWxsIGVudHJ5IHBvaW50IHNjcmlwdHMgaW50byAuZWdnIGZpbGUhCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oCiAgICAgICAgICAgIGVpX2NtZC5lZ2dfYmFzZSwgUGF0aE1ldGFkYXRhKGVpX2NtZC5lZ2dfYmFzZSwgZWlfY21kLmVnZ19pbmZvKSwKICAgICAgICAgICAgZWlfY21kLmVnZ19uYW1lLCBlaV9jbWQuZWdnX3ZlcnNpb24sCiAgICAgICAgKQogICAgICAgIGJzX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9zY3JpcHRzJykKICAgICAgICBleGVjX3BhcmFtID0gZ2V0YXR0cihic19jbWQsICdleGVjdXRhYmxlJywgTm9uZSkKICAgICAgICBid19jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiYmRpc3Rfd2luaW5zdCIpCiAgICAgICAgaXNfd2luaW5zdCA9IGdldGF0dHIoYndfY21kLCAnX2lzX3J1bm5pbmcnLCBGYWxzZSkKICAgICAgICB3cml0ZXIgPSBlaS5TY3JpcHRXcml0ZXIKICAgICAgICBpZiBpc193aW5pbnN0OgogICAgICAgICAgICBleGVjX3BhcmFtID0gInB5dGhvbi5leGUiCiAgICAgICAgICAgIHdyaXRlciA9IGVpLldpbmRvd3NTY3JpcHRXcml0ZXIKICAgICAgICBpZiBleGVjX3BhcmFtID09IHN5cy5leGVjdXRhYmxlOgogICAgICAgICAgICAjIEluIGNhc2UgdGhlIHBhdGggdG8gdGhlIFB5dGhvbiBleGVjdXRhYmxlIGNvbnRhaW5zIGEgc3BhY2UsIHdyYXAKICAgICAgICAgICAgIyBpdCBzbyBpdCdzIG5vdCBzcGxpdCB1cC4KICAgICAgICAgICAgZXhlY19wYXJhbSA9IFtleGVjX3BhcmFtXQogICAgICAgICMgcmVzb2x2ZSB0aGUgd3JpdGVyIHRvIHRoZSBlbnZpcm9ubWVudAogICAgICAgIHdyaXRlciA9IHdyaXRlci5iZXN0KCkKICAgICAgICBjbWQgPSB3cml0ZXIuY29tbWFuZF9zcGVjX2NsYXNzLmJlc3QoKS5mcm9tX3BhcmFtKGV4ZWNfcGFyYW0pCiAgICAgICAgZm9yIGFyZ3MgaW4gd3JpdGVyLmdldF9hcmdzKGRpc3QsIGNtZC5hc19oZWFkZXIoKSk6CiAgICAgICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KCphcmdzKQoKICAgIGRlZiB3cml0ZV9zY3JpcHQoc2VsZiwgc2NyaXB0X25hbWUsIGNvbnRlbnRzLCBtb2RlPSJ0IiwgKmlnbm9yZWQpOgogICAgICAgICIiIldyaXRlIGFuIGV4ZWN1dGFibGUgZmlsZSB0byB0aGUgc2NyaXB0cyBkaXJlY3RvcnkiIiIKICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IGNobW9kLCBjdXJyZW50X3VtYXNrCgogICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nICVzIHNjcmlwdCB0byAlcyIsIHNjcmlwdF9uYW1lLCBzZWxmLmluc3RhbGxfZGlyKQogICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBzY3JpcHRfbmFtZSkKICAgICAgICBzZWxmLm91dGZpbGVzLmFwcGVuZCh0YXJnZXQpCgogICAgICAgIG1hc2sgPSBjdXJyZW50X3VtYXNrKCkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgZiA9IG9wZW4odGFyZ2V0LCAidyIgKyBtb2RlKQogICAgICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgY2htb2QodGFyZ2V0LCAwbzc3NyAtIG1hc2spClBLAwQUAAAAAAAAACEAfXNgv3oTAAB6EwAAOAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9weTM2Y29tcGF0LnB5aW1wb3J0IG9zCmZyb20gZ2xvYiBpbXBvcnQgZ2xvYgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMuY29tbWFuZCBpbXBvcnQgc2Rpc3QKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBmaWx0ZXIKCgpjbGFzcyBzZGlzdF9hZGRfZGVmYXVsdHM6CiAgICAiIiIKICAgIE1peC1pbiBwcm92aWRpbmcgZm9yd2FyZC1jb21wYXRpYmlsaXR5IGZvciBmdW5jdGlvbmFsaXR5IGFzIGZvdW5kIGluCiAgICBkaXN0dXRpbHMgb24gUHl0aG9uIDMuNy4KCiAgICBEbyBub3QgZWRpdCB0aGUgY29kZSBpbiB0aGlzIGNsYXNzIGV4Y2VwdCB0byB1cGRhdGUgZnVuY3Rpb25hbGl0eQogICAgYXMgaW1wbGVtZW50ZWQgaW4gZGlzdHV0aWxzLiBJbnN0ZWFkLCBvdmVycmlkZSBpbiB0aGUgc3ViY2xhc3MuCiAgICAiIiIKCiAgICBkZWYgYWRkX2RlZmF1bHRzKHNlbGYpOgogICAgICAgICIiIkFkZCBhbGwgdGhlIGRlZmF1bHQgZmlsZXMgdG8gc2VsZi5maWxlbGlzdDoKICAgICAgICAgIC0gUkVBRE1FIG9yIFJFQURNRS50eHQKICAgICAgICAgIC0gc2V0dXAucHkKICAgICAgICAgIC0gdGVzdC90ZXN0Ki5weQogICAgICAgICAgLSBhbGwgcHVyZSBQeXRob24gbW9kdWxlcyBtZW50aW9uZWQgaW4gc2V0dXAgc2NyaXB0CiAgICAgICAgICAtIGFsbCBmaWxlcyBwb2ludGVkIGJ5IHBhY2thZ2VfZGF0YSAoYnVpbGRfcHkpCiAgICAgICAgICAtIGFsbCBmaWxlcyBkZWZpbmVkIGluIGRhdGFfZmlsZXMuCiAgICAgICAgICAtIGFsbCBmaWxlcyBkZWZpbmVkIGFzIHNjcmlwdHMuCiAgICAgICAgICAtIGFsbCBDIHNvdXJjZXMgbGlzdGVkIGFzIHBhcnQgb2YgZXh0ZW5zaW9ucyBvciBDIGxpYnJhcmllcwogICAgICAgICAgICBpbiB0aGUgc2V0dXAgc2NyaXB0IChkb2Vzbid0IGNhdGNoIEMgaGVhZGVycyEpCiAgICAgICAgV2FybnMgaWYgKFJFQURNRSBvciBSRUFETUUudHh0KSBvciBzZXR1cC5weSBhcmUgbWlzc2luZzsgZXZlcnl0aGluZwogICAgICAgIGVsc2UgaXMgb3B0aW9uYWwuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX3N0YW5kYXJkcygpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX29wdGlvbmFsKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfcHl0aG9uKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfZGF0YV9maWxlcygpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX2V4dCgpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX2NfbGlicygpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX3NjcmlwdHMoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfY3NfcGF0aF9leGlzdHMoZnNwYXRoKToKICAgICAgICAiIiIKICAgICAgICBDYXNlLXNlbnNpdGl2ZSBwYXRoIGV4aXN0ZW5jZSBjaGVjawoKICAgICAgICA+Pj4gc2Rpc3RfYWRkX2RlZmF1bHRzLl9jc19wYXRoX2V4aXN0cyhfX2ZpbGVfXykKICAgICAgICBUcnVlCiAgICAgICAgPj4+IHNkaXN0X2FkZF9kZWZhdWx0cy5fY3NfcGF0aF9leGlzdHMoX19maWxlX18udXBwZXIoKSkKICAgICAgICBGYWxzZQogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmc3BhdGgpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAjIG1ha2UgYWJzb2x1dGUgc28gd2UgYWx3YXlzIGhhdmUgYSBkaXJlY3RvcnkKICAgICAgICBhYnNwYXRoID0gb3MucGF0aC5hYnNwYXRoKGZzcGF0aCkKICAgICAgICBkaXJlY3RvcnksIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChhYnNwYXRoKQogICAgICAgIHJldHVybiBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19zdGFuZGFyZHMoc2VsZik6CiAgICAgICAgc3RhbmRhcmRzID0gW3NlbGYuUkVBRE1FUywgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0X25hbWVdCiAgICAgICAgZm9yIGZuIGluIHN0YW5kYXJkczoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmbiwgdHVwbGUpOgogICAgICAgICAgICAgICAgYWx0cyA9IGZuCiAgICAgICAgICAgICAgICBnb3RfaXQgPSBGYWxzZQogICAgICAgICAgICAgICAgZm9yIGZuIGluIGFsdHM6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fY3NfcGF0aF9leGlzdHMoZm4pOgogICAgICAgICAgICAgICAgICAgICAgICBnb3RfaXQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGZuKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgICAgIGlmIG5vdCBnb3RfaXQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKCJzdGFuZGFyZCBmaWxlIG5vdCBmb3VuZDogc2hvdWxkIGhhdmUgb25lIG9mICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCAnLmpvaW4oYWx0cykpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBzZWxmLl9jc19wYXRoX2V4aXN0cyhmbik6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoZm4pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYud2Fybigic3RhbmRhcmQgZmlsZSAnJXMnIG5vdCBmb3VuZCIgJSBmbikKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19vcHRpb25hbChzZWxmKToKICAgICAgICBvcHRpb25hbCA9IFsndGVzdC90ZXN0Ki5weScsICdzZXR1cC5jZmcnXQogICAgICAgIGZvciBwYXR0ZXJuIGluIG9wdGlvbmFsOgogICAgICAgICAgICBmaWxlcyA9IGZpbHRlcihvcy5wYXRoLmlzZmlsZSwgZ2xvYihwYXR0ZXJuKSkKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoZmlsZXMpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfcHl0aG9uKHNlbGYpOgogICAgICAgICMgYnVpbGRfcHkgaXMgdXNlZCB0byBnZXQ6CiAgICAgICAgIyAgLSBweXRob24gbW9kdWxlcwogICAgICAgICMgIC0gZmlsZXMgZGVmaW5lZCBpbiBwYWNrYWdlX2RhdGEKICAgICAgICBidWlsZF9weSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpCgogICAgICAgICMgZ2V0dGluZyBweXRob24gZmlsZXMKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfcHVyZV9tb2R1bGVzKCk6CiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX3B5LmdldF9zb3VyY2VfZmlsZXMoKSkKCiAgICAgICAgIyBnZXR0aW5nIHBhY2thZ2VfZGF0YSBmaWxlcwogICAgICAgICMgKGNvbXB1dGVkIGluIGJ1aWxkX3B5LmRhdGFfZmlsZXMgYnkgYnVpbGRfcHkuZmluYWxpemVfb3B0aW9ucykKICAgICAgICBmb3IgcGtnLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcyBpbiBidWlsZF9weS5kYXRhX2ZpbGVzOgogICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQob3MucGF0aC5qb2luKHNyY19kaXIsIGZpbGVuYW1lKSkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKHNlbGYpOgogICAgICAgICMgZ2V0dGluZyBkaXN0cmlidXRpb24uZGF0YV9maWxlcwogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19kYXRhX2ZpbGVzKCk6CiAgICAgICAgICAgIGZvciBpdGVtIGluIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXM6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIHN0cik6CiAgICAgICAgICAgICAgICAgICAgIyBwbGFpbiBmaWxlCiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGNvbnZlcnRfcGF0aChpdGVtKQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGl0ZW0pOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChpdGVtKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIGEgKGRpcm5hbWUsIGZpbGVuYW1lcykgdHVwbGUKICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBmaWxlbmFtZXMgPSBpdGVtCiAgICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgICAgICAgICBmID0gY29udmVydF9wYXRoKGYpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGYpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoZikKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19leHQoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6CiAgICAgICAgICAgIGJ1aWxkX2V4dCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9leHQnKQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9leHQuZ2V0X3NvdXJjZV9maWxlcygpKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX2NfbGlicyhzZWxmKToKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfY19saWJyYXJpZXMoKToKICAgICAgICAgICAgYnVpbGRfY2xpYiA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9jbGliJykKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfY2xpYi5nZXRfc291cmNlX2ZpbGVzKCkpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfc2NyaXB0cyhzZWxmKToKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfc2NyaXB0cygpOgogICAgICAgICAgICBidWlsZF9zY3JpcHRzID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3NjcmlwdHMnKQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9zY3JpcHRzLmdldF9zb3VyY2VfZmlsZXMoKSkKCgppZiBoYXNhdHRyKHNkaXN0LnNkaXN0LCAnX2FkZF9kZWZhdWx0c19zdGFuZGFyZHMnKToKICAgICMgZGlzYWJsZSB0aGUgZnVuY3Rpb25hbGl0eSBhbHJlYWR5IGF2YWlsYWJsZSB1cHN0cmVhbQogICAgY2xhc3Mgc2Rpc3RfYWRkX2RlZmF1bHRzOgogICAgICAgIHBhc3MKUEsDBBQAAAAAAAAAIQDN/62QDgEAAA4BAAA2AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3JlZ2lzdGVyLnB5aW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLnJlZ2lzdGVyIGFzIG9yaWcKCgpjbGFzcyByZWdpc3RlcihvcmlnLnJlZ2lzdGVyKToKICAgIF9fZG9jX18gPSBvcmlnLnJlZ2lzdGVyLl9fZG9jX18KCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2UgYXJlIHVzaW5nIHZhbGlkIGN1cnJlbnQgbmFtZS92ZXJzaW9uIGluZm8KICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgb3JpZy5yZWdpc3Rlci5ydW4oc2VsZikKUEsDBBQAAAAAAAAAIQAZytSkdAgAAHQIAAA0AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3JvdGF0ZS5weWZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKaW1wb3J0IG9zCmltcG9ydCBzaHV0aWwKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCgoKY2xhc3Mgcm90YXRlKENvbW1hbmQpOgogICAgIiIiRGVsZXRlIG9sZGVyIGRpc3RyaWJ1dGlvbnMiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJkZWxldGUgb2xkZXIgZGlzdHJpYnV0aW9ucywga2VlcGluZyBOIG5ld2VzdCBmaWxlcyIKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ21hdGNoPScsICdtJywgInBhdHRlcm5zIHRvIG1hdGNoIChyZXF1aXJlZCkiKSwKICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywgImRpcmVjdG9yeSB3aGVyZSB0aGUgZGlzdHJpYnV0aW9ucyBhcmUiKSwKICAgICAgICAoJ2tlZXA9JywgJ2snLCAibnVtYmVyIG9mIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbnMgdG8ga2VlcCIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IFtdCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLm1hdGNoID0gTm9uZQogICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5rZWVwID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIGlmIHNlbGYubWF0Y2ggaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IG9uZSBvciBtb3JlIChjb21tYS1zZXBhcmF0ZWQpIG1hdGNoIHBhdHRlcm5zICIKICAgICAgICAgICAgICAgICIoZS5nLiAnLnppcCcgb3IgJy5lZ2cnKSIKICAgICAgICAgICAgKQogICAgICAgIGlmIHNlbGYua2VlcCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiTXVzdCBzcGVjaWZ5IG51bWJlciBvZiBmaWxlcyB0byBrZWVwIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYua2VlcCA9IGludChzZWxmLmtlZXApCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCItLWtlZXAgbXVzdCBiZSBhbiBpbnRlZ2VyIikKICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYubWF0Y2gsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBzZWxmLm1hdGNoID0gWwogICAgICAgICAgICAgICAgY29udmVydF9wYXRoKHAuc3RyaXAoKSkgZm9yIHAgaW4gc2VsZi5tYXRjaC5zcGxpdCgnLCcpCiAgICAgICAgICAgIF0KICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYmRpc3QnLCAoJ2Rpc3RfZGlyJywgJ2Rpc3RfZGlyJykpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgZnJvbSBnbG9iIGltcG9ydCBnbG9iCgogICAgICAgIGZvciBwYXR0ZXJuIGluIHNlbGYubWF0Y2g6CiAgICAgICAgICAgIHBhdHRlcm4gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpICsgJyonICsgcGF0dGVybgogICAgICAgICAgICBmaWxlcyA9IGdsb2Iob3MucGF0aC5qb2luKHNlbGYuZGlzdF9kaXIsIHBhdHRlcm4pKQogICAgICAgICAgICBmaWxlcyA9IFsob3MucGF0aC5nZXRtdGltZShmKSwgZikgZm9yIGYgaW4gZmlsZXNdCiAgICAgICAgICAgIGZpbGVzLnNvcnQoKQogICAgICAgICAgICBmaWxlcy5yZXZlcnNlKCkKCiAgICAgICAgICAgIGxvZy5pbmZvKCIlZCBmaWxlKHMpIG1hdGNoaW5nICVzIiwgbGVuKGZpbGVzKSwgcGF0dGVybikKICAgICAgICAgICAgZmlsZXMgPSBmaWxlc1tzZWxmLmtlZXA6XQogICAgICAgICAgICBmb3IgKHQsIGYpIGluIGZpbGVzOgogICAgICAgICAgICAgICAgbG9nLmluZm8oIkRlbGV0aW5nICVzIiwgZikKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmKToKICAgICAgICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShmKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmKQpQSwMEFAAAAAAAAAAhAASB1jSSAgAAkgIAADYAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvc2F2ZW9wdHMucHlmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQgaW1wb3J0IGVkaXRfY29uZmlnLCBvcHRpb25fYmFzZQoKCmNsYXNzIHNhdmVvcHRzKG9wdGlvbl9iYXNlKToKICAgICIiIlNhdmUgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gYSBmaWxlIiIiCgogICAgZGVzY3JpcHRpb24gPSAic2F2ZSBzdXBwbGllZCBvcHRpb25zIHRvIHNldHVwLmNmZyBvciBvdGhlciBjb25maWcgZmlsZSIKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGRpc3QgPSBzZWxmLmRpc3RyaWJ1dGlvbgogICAgICAgIHNldHRpbmdzID0ge30KCiAgICAgICAgZm9yIGNtZCBpbiBkaXN0LmNvbW1hbmRfb3B0aW9uczoKCiAgICAgICAgICAgIGlmIGNtZCA9PSAnc2F2ZW9wdHMnOgogICAgICAgICAgICAgICAgY29udGludWUgICMgZG9uJ3Qgc2F2ZSBvdXIgb3duIG9wdGlvbnMhCgogICAgICAgICAgICBmb3Igb3B0LCAoc3JjLCB2YWwpIGluIGRpc3QuZ2V0X29wdGlvbl9kaWN0KGNtZCkuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIHNyYyA9PSAiY29tbWFuZCBsaW5lIjoKICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXRkZWZhdWx0KGNtZCwge30pW29wdF0gPSB2YWwKCiAgICAgICAgZWRpdF9jb25maWcoc2VsZi5maWxlbmFtZSwgc2V0dGluZ3MsIHNlbGYuZHJ5X3J1bikKUEsDBBQAAAAAAAAAIQC3H9FuNxoAADcaAAAzAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5ZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuc2Rpc3QgYXMgb3JpZwppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgaW8KaW1wb3J0IGNvbnRleHRsaWIKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKZnJvbSAucHkzNmNvbXBhdCBpbXBvcnQgc2Rpc3RfYWRkX2RlZmF1bHRzCgppbXBvcnQgcGtnX3Jlc291cmNlcwoKX2RlZmF1bHRfcmV2Y3RybCA9IGxpc3QKCgpkZWYgd2Fsa19yZXZjdHJsKGRpcm5hbWU9JycpOgogICAgIiIiRmluZCBhbGwgZmlsZXMgdW5kZXIgcmV2aXNpb24gY29udHJvbCIiIgogICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ3NldHVwdG9vbHMuZmlsZV9maW5kZXJzJyk6CiAgICAgICAgZm9yIGl0ZW0gaW4gZXAubG9hZCgpKGRpcm5hbWUpOgogICAgICAgICAgICB5aWVsZCBpdGVtCgoKY2xhc3Mgc2Rpc3Qoc2Rpc3RfYWRkX2RlZmF1bHRzLCBvcmlnLnNkaXN0KToKICAgICIiIlNtYXJ0IHNkaXN0IHRoYXQgZmluZHMgYW55dGhpbmcgc3VwcG9ydGVkIGJ5IHJldmlzaW9uIGNvbnRyb2wiIiIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdmb3JtYXRzPScsIE5vbmUsCiAgICAgICAgICJmb3JtYXRzIGZvciBzb3VyY2UgZGlzdHJpYnV0aW9uIChjb21tYS1zZXBhcmF0ZWQgbGlzdCkiKSwKICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKICAgICAgICAgImtlZXAgdGhlIGRpc3RyaWJ1dGlvbiB0cmVlIGFyb3VuZCBhZnRlciBjcmVhdGluZyAiICsKICAgICAgICAgImFyY2hpdmUgZmlsZShzKSIpLAogICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLAogICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlKHMpIGluICIKICAgICAgICAgIltkZWZhdWx0OiBkaXN0XSIpLAogICAgXQoKICAgIG5lZ2F0aXZlX29wdCA9IHt9CgogICAgUkVBRE1FX0VYVEVOU0lPTlMgPSBbJycsICcucnN0JywgJy50eHQnLCAnLm1kJ10KICAgIFJFQURNRVMgPSB0dXBsZSgnUkVBRE1FezB9Jy5mb3JtYXQoZXh0KSBmb3IgZXh0IGluIFJFQURNRV9FWFRFTlNJT05TKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgc2VsZi5maWxlbGlzdCA9IGVpX2NtZC5maWxlbGlzdAogICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKG9zLnBhdGguam9pbihlaV9jbWQuZWdnX2luZm8sICdTT1VSQ0VTLnR4dCcpKQogICAgICAgIHNlbGYuY2hlY2tfcmVhZG1lKCkKCiAgICAgICAgIyBSdW4gc3ViIGNvbW1hbmRzCiAgICAgICAgZm9yIGNtZF9uYW1lIGluIHNlbGYuZ2V0X3N1Yl9jb21tYW5kcygpOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKGNtZF9uYW1lKQoKICAgICAgICBzZWxmLm1ha2VfZGlzdHJpYnV0aW9uKCkKCiAgICAgICAgZGlzdF9maWxlcyA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICdkaXN0X2ZpbGVzJywgW10pCiAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5hcmNoaXZlX2ZpbGVzOgogICAgICAgICAgICBkYXRhID0gKCdzZGlzdCcsICcnLCBmaWxlKQogICAgICAgICAgICBpZiBkYXRhIG5vdCBpbiBkaXN0X2ZpbGVzOgogICAgICAgICAgICAgICAgZGlzdF9maWxlcy5hcHBlbmQoZGF0YSkKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuc2Rpc3QuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCgogICAgICAgIHNlbGYuX2RlZmF1bHRfdG9fZ3p0YXIoKQoKICAgIGRlZiBfZGVmYXVsdF90b19nenRhcihzZWxmKToKICAgICAgICAjIG9ubHkgbmVlZGVkIG9uIFB5dGhvbiBwcmlvciB0byAzLjYuCiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMywgNiwgMCwgJ2JldGEnLCAxKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5mb3JtYXRzID0gWydnenRhciddCgogICAgZGVmIG1ha2VfZGlzdHJpYnV0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFdvcmthcm91bmQgZm9yICM1MTYKICAgICAgICAiIiIKICAgICAgICB3aXRoIHNlbGYuX3JlbW92ZV9vc19saW5rKCk6CiAgICAgICAgICAgIG9yaWcuc2Rpc3QubWFrZV9kaXN0cmlidXRpb24oc2VsZikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIF9yZW1vdmVfb3NfbGluaygpOgogICAgICAgICIiIgogICAgICAgIEluIGEgY29udGV4dCwgcmVtb3ZlIGFuZCByZXN0b3JlIG9zLmxpbmsgaWYgaXQgZXhpc3RzCiAgICAgICAgIiIiCgogICAgICAgIGNsYXNzIE5vVmFsdWU6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgb3JpZ192YWwgPSBnZXRhdHRyKG9zLCAnbGluaycsIE5vVmFsdWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWwgb3MubGluawogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKICAgICAgICB0cnk6CiAgICAgICAgICAgIHlpZWxkCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgb3JpZ192YWwgaXMgbm90IE5vVmFsdWU6CiAgICAgICAgICAgICAgICBzZXRhdHRyKG9zLCAnbGluaycsIG9yaWdfdmFsKQoKICAgIGRlZiBfX3JlYWRfdGVtcGxhdGVfaGFjayhzZWxmKToKICAgICAgICAjIFRoaXMgZ3JvZHkgaGFjayBjbG9zZXMgdGhlIHRlbXBsYXRlIGZpbGUgKE1BTklGRVNULmluKSBpZiBhbgogICAgICAgICMgIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIHJlYWRfdGVtcGxhdGUuCiAgICAgICAgIyBEb2luZyBzbyBwcmV2ZW50cyBhbiBlcnJvciB3aGVuIGVhc3lfaW5zdGFsbCBhdHRlbXB0cyB0byBkZWxldGUgdGhlCiAgICAgICAgIyAgZmlsZS4KICAgICAgICB0cnk6CiAgICAgICAgICAgIG9yaWcuc2Rpc3QucmVhZF90ZW1wbGF0ZShzZWxmKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIF8sIF8sIHRiID0gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgdGIudGJfbmV4dC50Yl9mcmFtZS5mX2xvY2Fsc1sndGVtcGxhdGUnXS5jbG9zZSgpCiAgICAgICAgICAgIHJhaXNlCgogICAgIyBCZWdpbm5pbmcgd2l0aCBQeXRob24gMi43LjIsIDMuMS40LCBhbmQgMy4yLjEsIHRoaXMgbGVha3kgZmlsZSBoYW5kbGUKICAgICMgIGhhcyBiZWVuIGZpeGVkLCBzbyBvbmx5IG92ZXJyaWRlIHRoZSBtZXRob2QgaWYgd2UncmUgdXNpbmcgYW4gZWFybGllcgogICAgIyAgUHl0aG9uLgogICAgaGFzX2xlYWt5X2hhbmRsZSA9ICgKICAgICAgICBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDcsIDIpCiAgICAgICAgb3IgKDMsIDApIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMSwgNCkKICAgICAgICBvciAoMywgMikgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCAyLCAxKQogICAgKQogICAgaWYgaGFzX2xlYWt5X2hhbmRsZToKICAgICAgICByZWFkX3RlbXBsYXRlID0gX19yZWFkX3RlbXBsYXRlX2hhY2sKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19weXRob24oc2VsZik6CiAgICAgICAgIiIiZ2V0dGluZyBweXRob24gZmlsZXMiIiIKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfcHVyZV9tb2R1bGVzKCk6CiAgICAgICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfcHkuZ2V0X3NvdXJjZV9maWxlcygpKQogICAgICAgICAgICAjIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbmNvbXBhdGlibGUgd2l0aCBpbmNsdWRlX3BhY2thZ2VfZGF0YSwgYW5kCiAgICAgICAgICAgICMgd2lsbCBpbiBmYWN0IGNyZWF0ZSBhbiBpbmZpbml0ZSByZWN1cnNpb24gaWYgaW5jbHVkZV9wYWNrYWdlX2RhdGEKICAgICAgICAgICAgIyBpcyBUcnVlLiAgVXNlIG9mIGluY2x1ZGVfcGFja2FnZV9kYXRhIHdpbGwgaW1wbHkgdGhhdAogICAgICAgICAgICAjIGRpc3R1dGlscy1zdHlsZSBhdXRvbWF0aWMgaGFuZGxpbmcgb2YgcGFja2FnZV9kYXRhIGlzIGRpc2FibGVkCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5pbmNsdWRlX3BhY2thZ2VfZGF0YToKICAgICAgICAgICAgICAgIGZvciBfLCBzcmNfZGlyLCBfLCBmaWxlbmFtZXMgaW4gYnVpbGRfcHkuZGF0YV9maWxlczoKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChbb3MucGF0aC5qb2luKHNyY19kaXIsIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzXSkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgc2l4LlBZMjoKICAgICAgICAgICAgICAgIHNkaXN0X2FkZF9kZWZhdWx0cy5fYWRkX2RlZmF1bHRzX2RhdGFfZmlsZXMoc2VsZikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN1cGVyKCkuX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKCkKICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICBsb2cud2FybigiZGF0YV9maWxlcyBjb250YWlucyB1bmV4cGVjdGVkIG9iamVjdHMiKQoKICAgIGRlZiBjaGVja19yZWFkbWUoc2VsZik6CiAgICAgICAgZm9yIGYgaW4gc2VsZi5SRUFETUVTOgogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmKToKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYud2FybigKICAgICAgICAgICAgICAgICJzdGFuZGFyZCBmaWxlIG5vdCBmb3VuZDogc2hvdWxkIGhhdmUgb25lIG9mICIgKwogICAgICAgICAgICAgICAgJywgJy5qb2luKHNlbGYuUkVBRE1FUykKICAgICAgICAgICAgKQoKICAgIGRlZiBtYWtlX3JlbGVhc2VfdHJlZShzZWxmLCBiYXNlX2RpciwgZmlsZXMpOgogICAgICAgIG9yaWcuc2Rpc3QubWFrZV9yZWxlYXNlX3RyZWUoc2VsZiwgYmFzZV9kaXIsIGZpbGVzKQoKICAgICAgICAjIFNhdmUgYW55IGVnZ19pbmZvIGNvbW1hbmQgbGluZSBvcHRpb25zIHVzZWQgdG8gY3JlYXRlIHRoaXMgc2Rpc3QKICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKGJhc2VfZGlyLCAnc2V0dXAuY2ZnJykKICAgICAgICBpZiBoYXNhdHRyKG9zLCAnbGluaycpIGFuZCBvcy5wYXRoLmV4aXN0cyhkZXN0KToKICAgICAgICAgICAgIyB1bmxpbmsgYW5kIHJlLWNvcHksIHNpbmNlIGl0IG1pZ2h0IGJlIGhhcmQtbGlua2VkLCBhbmQKICAgICAgICAgICAgIyB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgc291cmNlIHZlcnNpb24KICAgICAgICAgICAgb3MudW5saW5rKGRlc3QpCiAgICAgICAgICAgIHNlbGYuY29weV9maWxlKCdzZXR1cC5jZmcnLCBkZXN0KQoKICAgICAgICBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKS5zYXZlX3ZlcnNpb25faW5mbyhkZXN0KQoKICAgIGRlZiBfbWFuaWZlc3RfaXNfbm90X2dlbmVyYXRlZChzZWxmKToKICAgICAgICAjIGNoZWNrIGZvciBzcGVjaWFsIGNvbW1lbnQgdXNlZCBpbiAyLjcuMSBhbmQgaGlnaGVyCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHNlbGYubWFuaWZlc3QpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgd2l0aCBpby5vcGVuKHNlbGYubWFuaWZlc3QsICdyYicpIGFzIGZwOgogICAgICAgICAgICBmaXJzdF9saW5lID0gZnAucmVhZGxpbmUoKQogICAgICAgIHJldHVybiAoZmlyc3RfbGluZSAhPQogICAgICAgICAgICAgICAgJyMgZmlsZSBHRU5FUkFURUQgYnkgZGlzdHV0aWxzLCBkbyBOT1QgZWRpdFxuJy5lbmNvZGUoKSkKCiAgICBkZWYgcmVhZF9tYW5pZmVzdChzZWxmKToKICAgICAgICAiIiJSZWFkIHRoZSBtYW5pZmVzdCBmaWxlIChuYW1lZCBieSAnc2VsZi5tYW5pZmVzdCcpIGFuZCB1c2UgaXQgdG8KICAgICAgICBmaWxsIGluICdzZWxmLmZpbGVsaXN0JywgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgc291cmNlCiAgICAgICAgZGlzdHJpYnV0aW9uLgogICAgICAgICIiIgogICAgICAgIGxvZy5pbmZvKCJyZWFkaW5nIG1hbmlmZXN0IGZpbGUgJyVzJyIsIHNlbGYubWFuaWZlc3QpCiAgICAgICAgbWFuaWZlc3QgPSBvcGVuKHNlbGYubWFuaWZlc3QsICdyYicpCiAgICAgICAgZm9yIGxpbmUgaW4gbWFuaWZlc3Q6CiAgICAgICAgICAgICMgVGhlIG1hbmlmZXN0IG11c3QgY29udGFpbiBVVEYtOC4gU2VlICMzMDMuCiAgICAgICAgICAgIGlmIHNpeC5QWTM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuZGVjb2RlKCdVVEYtOCcpCiAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCIlciBub3QgVVRGLTggZGVjb2RhYmxlIC0tIHNraXBwaW5nIiAlIGxpbmUpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIyBpZ25vcmUgY29tbWVudHMgYW5kIGJsYW5rIGxpbmVzCiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCcjJykgb3Igbm90IGxpbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChsaW5lKQogICAgICAgIG1hbmlmZXN0LmNsb3NlKCkKUEsDBBQAAAAAAAAAIQCbcMvH3RMAAN0TAAA0AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3NldG9wdC5weWZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKaW1wb3J0IGRpc3R1dGlscwppbXBvcnQgb3MKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBjb25maWdwYXJzZXIKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAoKX19hbGxfXyA9IFsnY29uZmlnX2ZpbGUnLCAnZWRpdF9jb25maWcnLCAnb3B0aW9uX2Jhc2UnLCAnc2V0b3B0J10KCgpkZWYgY29uZmlnX2ZpbGUoa2luZD0ibG9jYWwiKToKICAgICIiIkdldCB0aGUgZmlsZW5hbWUgb2YgdGhlIGRpc3R1dGlscywgbG9jYWwsIGdsb2JhbCwgb3IgcGVyLXVzZXIgY29uZmlnCgogICAgYGtpbmRgIG11c3QgYmUgb25lIG9mICJsb2NhbCIsICJnbG9iYWwiLCBvciAidXNlciIKICAgICIiIgogICAgaWYga2luZCA9PSAnbG9jYWwnOgogICAgICAgIHJldHVybiAnc2V0dXAuY2ZnJwogICAgaWYga2luZCA9PSAnZ2xvYmFsJzoKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKAogICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoZGlzdHV0aWxzLl9fZmlsZV9fKSwgJ2Rpc3R1dGlscy5jZmcnCiAgICAgICAgKQogICAgaWYga2luZCA9PSAndXNlcic6CiAgICAgICAgZG90ID0gb3MubmFtZSA9PSAncG9zaXgnIGFuZCAnLicgb3IgJycKICAgICAgICByZXR1cm4gb3MucGF0aC5leHBhbmR1c2VyKGNvbnZlcnRfcGF0aCgifi8lc3B5ZGlzdHV0aWxzLmNmZyIgJSBkb3QpKQogICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAiY29uZmlnX2ZpbGUoKSB0eXBlIG11c3QgYmUgJ2xvY2FsJywgJ2dsb2JhbCcsIG9yICd1c2VyJyIsIGtpbmQKICAgICkKCgpkZWYgZWRpdF9jb25maWcoZmlsZW5hbWUsIHNldHRpbmdzLCBkcnlfcnVuPUZhbHNlKToKICAgICIiIkVkaXQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW5jbHVkZSBgc2V0dGluZ3NgCgogICAgYHNldHRpbmdzYCBpcyBhIGRpY3Rpb25hcnkgb2YgZGljdGlvbmFyaWVzIG9yIGBgTm9uZWBgIHZhbHVlcywga2V5ZWQgYnkKICAgIGNvbW1hbmQvc2VjdGlvbiBuYW1lLiAgQSBgYE5vbmVgYCB2YWx1ZSBtZWFucyB0byBkZWxldGUgdGhlIGVudGlyZSBzZWN0aW9uLAogICAgd2hpbGUgYSBkaWN0aW9uYXJ5IGxpc3RzIHNldHRpbmdzIHRvIGJlIGNoYW5nZWQgb3IgZGVsZXRlZCBpbiB0aGF0IHNlY3Rpb24uCiAgICBBIHNldHRpbmcgb2YgYGBOb25lYGAgbWVhbnMgdG8gZGVsZXRlIHRoYXQgc2V0dGluZy4KICAgICIiIgogICAgbG9nLmRlYnVnKCJSZWFkaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSAlcyIsIGZpbGVuYW1lKQogICAgb3B0cyA9IGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIoKQogICAgb3B0cy5yZWFkKFtmaWxlbmFtZV0pCiAgICBmb3Igc2VjdGlvbiwgb3B0aW9ucyBpbiBzZXR0aW5ncy5pdGVtcygpOgogICAgICAgIGlmIG9wdGlvbnMgaXMgTm9uZToKICAgICAgICAgICAgbG9nLmluZm8oIkRlbGV0aW5nIHNlY3Rpb24gWyVzXSBmcm9tICVzIiwgc2VjdGlvbiwgZmlsZW5hbWUpCiAgICAgICAgICAgIG9wdHMucmVtb3ZlX3NlY3Rpb24oc2VjdGlvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBub3Qgb3B0cy5oYXNfc2VjdGlvbihzZWN0aW9uKToKICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIG5ldyBzZWN0aW9uIFslc10gdG8gJXMiLCBzZWN0aW9uLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIG9wdHMuYWRkX3NlY3Rpb24oc2VjdGlvbikKICAgICAgICAgICAgZm9yIG9wdGlvbiwgdmFsdWUgaW4gb3B0aW9ucy5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCiAgICAgICAgICAgICAgICAgICAgICAgICJEZWxldGluZyAlcy4lcyBmcm9tICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgb3B0aW9uLCBmaWxlbmFtZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBvcHRzLnJlbW92ZV9vcHRpb24oc2VjdGlvbiwgb3B0aW9uKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRzLm9wdGlvbnMoc2VjdGlvbik6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyBlbXB0eSBbJXNdIHNlY3Rpb24gZnJvbSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBvcHRzLnJlbW92ZV9zZWN0aW9uKHNlY3Rpb24pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAgICAgIlNldHRpbmcgJXMuJXMgdG8gJXIgaW4gJXMiLAogICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBvcHRpb24sIHZhbHVlLCBmaWxlbmFtZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBvcHRzLnNldChzZWN0aW9uLCBvcHRpb24sIHZhbHVlKQoKICAgIGxvZy5pbmZvKCJXcml0aW5nICVzIiwgZmlsZW5hbWUpCiAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3JykgYXMgZjoKICAgICAgICAgICAgb3B0cy53cml0ZShmKQoKCmNsYXNzIG9wdGlvbl9iYXNlKENvbW1hbmQpOgogICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29tbWFuZHMgdGhhdCBtZXNzIHdpdGggY29uZmlnIGZpbGVzIiIiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnZ2xvYmFsLWNvbmZpZycsICdnJywKICAgICAgICAgInNhdmUgb3B0aW9ucyB0byB0aGUgc2l0ZS13aWRlIGRpc3R1dGlscy5jZmcgZmlsZSIpLAogICAgICAgICgndXNlci1jb25maWcnLCAndScsCiAgICAgICAgICJzYXZlIG9wdGlvbnMgdG8gdGhlIGN1cnJlbnQgdXNlcidzIHB5ZGlzdHV0aWxzLmNmZyBmaWxlIiksCiAgICAgICAgKCdmaWxlbmFtZT0nLCAnZicsCiAgICAgICAgICJjb25maWd1cmF0aW9uIGZpbGUgdG8gdXNlIChkZWZhdWx0PXNldHVwLmNmZykiKSwKICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBbCiAgICAgICAgJ2dsb2JhbC1jb25maWcnLCAndXNlci1jb25maWcnLAogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5nbG9iYWxfY29uZmlnID0gTm9uZQogICAgICAgIHNlbGYudXNlcl9jb25maWcgPSBOb25lCiAgICAgICAgc2VsZi5maWxlbmFtZSA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBmaWxlbmFtZXMgPSBbXQogICAgICAgIGlmIHNlbGYuZ2xvYmFsX2NvbmZpZzoKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgnZ2xvYmFsJykpCiAgICAgICAgaWYgc2VsZi51c2VyX2NvbmZpZzoKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgndXNlcicpKQogICAgICAgIGlmIHNlbGYuZmlsZW5hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoc2VsZi5maWxlbmFtZSkKICAgICAgICBpZiBub3QgZmlsZW5hbWVzOgogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKGNvbmZpZ19maWxlKCdsb2NhbCcpKQogICAgICAgIGlmIGxlbihmaWxlbmFtZXMpID4gMToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IG9ubHkgb25lIGNvbmZpZ3VyYXRpb24gZmlsZSBvcHRpb24iLAogICAgICAgICAgICAgICAgZmlsZW5hbWVzCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmZpbGVuYW1lLCA9IGZpbGVuYW1lcwoKCmNsYXNzIHNldG9wdChvcHRpb25fYmFzZSk6CiAgICAiIiJTYXZlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGEgZmlsZSIiIgoKICAgIGRlc2NyaXB0aW9uID0gInNldCBhbiBvcHRpb24gaW4gc2V0dXAuY2ZnIG9yIGFub3RoZXIgY29uZmlnIGZpbGUiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnY29tbWFuZD0nLCAnYycsICdjb21tYW5kIHRvIHNldCBhbiBvcHRpb24gZm9yJyksCiAgICAgICAgKCdvcHRpb249JywgJ28nLCAnb3B0aW9uIHRvIHNldCcpLAogICAgICAgICgnc2V0LXZhbHVlPScsICdzJywgJ3ZhbHVlIG9mIHRoZSBvcHRpb24nKSwKICAgICAgICAoJ3JlbW92ZScsICdyJywgJ3JlbW92ZSAodW5zZXQpIHRoZSB2YWx1ZScpLAogICAgXSArIG9wdGlvbl9iYXNlLnVzZXJfb3B0aW9ucwoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IG9wdGlvbl9iYXNlLmJvb2xlYW5fb3B0aW9ucyArIFsncmVtb3ZlJ10KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9wdGlvbl9iYXNlLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuY29tbWFuZCA9IE5vbmUKICAgICAgICBzZWxmLm9wdGlvbiA9IE5vbmUKICAgICAgICBzZWxmLnNldF92YWx1ZSA9IE5vbmUKICAgICAgICBzZWxmLnJlbW92ZSA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcHRpb25fYmFzZS5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgaWYgc2VsZi5jb21tYW5kIGlzIE5vbmUgb3Igc2VsZi5vcHRpb24gaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk11c3Qgc3BlY2lmeSAtLWNvbW1hbmQgKmFuZCogLS1vcHRpb24iKQogICAgICAgIGlmIHNlbGYuc2V0X3ZhbHVlIGlzIE5vbmUgYW5kIG5vdCBzZWxmLnJlbW92ZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk11c3Qgc3BlY2lmeSAtLXNldC12YWx1ZSBvciAtLXJlbW92ZSIpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBlZGl0X2NvbmZpZygKICAgICAgICAgICAgc2VsZi5maWxlbmFtZSwgewogICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kOiB7c2VsZi5vcHRpb24ucmVwbGFjZSgnLScsICdfJyk6IHNlbGYuc2V0X3ZhbHVlfQogICAgICAgICAgICB9LAogICAgICAgICAgICBzZWxmLmRyeV9ydW4KICAgICAgICApClBLAwQUAAAAAAAAACEA3Rnhnv4jAAD+IwAAMgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC90ZXN0LnB5aW1wb3J0IG9zCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgc3lzCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHVuaXR0ZXN0CmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IsIERpc3R1dGlsc09wdGlvbkVycm9yCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdExvYWRlcgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAsIGZpbHRlcgoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAocmVzb3VyY2VfbGlzdGRpciwgcmVzb3VyY2VfZXhpc3RzLCBub3JtYWxpemVfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZ19zZXQsIF9uYW1lc3BhY2VfcGFja2FnZXMsIGV2YWx1YXRlX21hcmtlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIsIHJlcXVpcmUsIEVudHJ5UG9pbnQpCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAoKCmNsYXNzIFNjYW5uaW5nTG9hZGVyKFRlc3RMb2FkZXIpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBUZXN0TG9hZGVyLl9faW5pdF9fKHNlbGYpCiAgICAgICAgc2VsZi5fdmlzaXRlZCA9IHNldCgpCgogICAgZGVmIGxvYWRUZXN0c0Zyb21Nb2R1bGUoc2VsZiwgbW9kdWxlLCBwYXR0ZXJuPU5vbmUpOgogICAgICAgICIiIlJldHVybiBhIHN1aXRlIG9mIGFsbCB0ZXN0cyBjYXNlcyBjb250YWluZWQgaW4gdGhlIGdpdmVuIG1vZHVsZQoKICAgICAgICBJZiB0aGUgbW9kdWxlIGlzIGEgcGFja2FnZSwgbG9hZCB0ZXN0cyBmcm9tIGFsbCB0aGUgbW9kdWxlcyBpbiBpdC4KICAgICAgICBJZiB0aGUgbW9kdWxlIGhhcyBhbiBgYGFkZGl0aW9uYWxfdGVzdHNgYCBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgYWRkCiAgICAgICAgdGhlIHJldHVybiB2YWx1ZSB0byB0aGUgdGVzdHMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbW9kdWxlIGluIHNlbGYuX3Zpc2l0ZWQ6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgc2VsZi5fdmlzaXRlZC5hZGQobW9kdWxlKQoKICAgICAgICB0ZXN0cyA9IFtdCiAgICAgICAgdGVzdHMuYXBwZW5kKFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShzZWxmLCBtb2R1bGUpKQoKICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgImFkZGl0aW9uYWxfdGVzdHMiKToKICAgICAgICAgICAgdGVzdHMuYXBwZW5kKG1vZHVsZS5hZGRpdGlvbmFsX3Rlc3RzKCkpCgogICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKICAgICAgICAgICAgZm9yIGZpbGUgaW4gcmVzb3VyY2VfbGlzdGRpcihtb2R1bGUuX19uYW1lX18sICcnKToKICAgICAgICAgICAgICAgIGlmIGZpbGUuZW5kc3dpdGgoJy5weScpIGFuZCBmaWxlICE9ICdfX2luaXRfXy5weSc6CiAgICAgICAgICAgICAgICAgICAgc3VibW9kdWxlID0gbW9kdWxlLl9fbmFtZV9fICsgJy4nICsgZmlsZVs6LTNdCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIHJlc291cmNlX2V4aXN0cyhtb2R1bGUuX19uYW1lX18sIGZpbGUgKyAnL19faW5pdF9fLnB5Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1vZHVsZSA9IG1vZHVsZS5fX25hbWVfXyArICcuJyArIGZpbGUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgdGVzdHMuYXBwZW5kKHNlbGYubG9hZFRlc3RzRnJvbU5hbWUoc3VibW9kdWxlKSkKCiAgICAgICAgaWYgbGVuKHRlc3RzKSAhPSAxOgogICAgICAgICAgICByZXR1cm4gc2VsZi5zdWl0ZUNsYXNzKHRlc3RzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiB0ZXN0c1swXSAgIyBkb24ndCBjcmVhdGUgYSBuZXN0ZWQgc3VpdGUgZm9yIG9ubHkgb25lIHJldHVybgoKCiMgYWRhcHRlZCBmcm9tIGphcmFjby5jbGFzc2VzLnByb3BlcnRpZXM6Tm9uRGF0YVByb3BlcnR5CmNsYXNzIE5vbkRhdGFQcm9wZXJ0eShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZnZXQpOgogICAgICAgIHNlbGYuZmdldCA9IGZnZXQKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIG9ianR5cGU9Tm9uZSk6CiAgICAgICAgaWYgb2JqIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgcmV0dXJuIHNlbGYuZmdldChvYmopCgoKY2xhc3MgdGVzdChDb21tYW5kKToKICAgICIiIkNvbW1hbmQgdG8gcnVuIHVuaXQgdGVzdHMgYWZ0ZXIgaW4tcGxhY2UgYnVpbGQiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJydW4gdW5pdCB0ZXN0cyBhZnRlciBpbi1wbGFjZSBidWlsZCIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCd0ZXN0LW1vZHVsZT0nLCAnbScsICJSdW4gJ3Rlc3Rfc3VpdGUnIGluIHNwZWNpZmllZCBtb2R1bGUiKSwKICAgICAgICAoJ3Rlc3Qtc3VpdGU9JywgJ3MnLAogICAgICAgICAiUnVuIHNpbmdsZSB0ZXN0LCBjYXNlIG9yIHN1aXRlIChlLmcuICdtb2R1bGUudGVzdF9zdWl0ZScpIiksCiAgICAgICAgKCd0ZXN0LXJ1bm5lcj0nLCAncicsICJUZXN0IHJ1bm5lciB0byB1c2UiKSwKICAgIF0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYudGVzdF9zdWl0ZSA9IE5vbmUKICAgICAgICBzZWxmLnRlc3RfbW9kdWxlID0gTm9uZQogICAgICAgIHNlbGYudGVzdF9sb2FkZXIgPSBOb25lCiAgICAgICAgc2VsZi50ZXN0X3J1bm5lciA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKCiAgICAgICAgaWYgc2VsZi50ZXN0X3N1aXRlIGFuZCBzZWxmLnRlc3RfbW9kdWxlOgogICAgICAgICAgICBtc2cgPSAiWW91IG1heSBzcGVjaWZ5IGEgbW9kdWxlIG9yIGEgc3VpdGUsIGJ1dCBub3QgYm90aCIKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IobXNnKQoKICAgICAgICBpZiBzZWxmLnRlc3Rfc3VpdGUgaXMgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi50ZXN0X21vZHVsZSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi50ZXN0X3N1aXRlID0gc2VsZi5kaXN0cmlidXRpb24udGVzdF9zdWl0ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50ZXN0X3N1aXRlID0gc2VsZi50ZXN0X21vZHVsZSArICIudGVzdF9zdWl0ZSIKCiAgICAgICAgaWYgc2VsZi50ZXN0X2xvYWRlciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnRlc3RfbG9hZGVyID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3Rlc3RfbG9hZGVyJywgTm9uZSkKICAgICAgICBpZiBzZWxmLnRlc3RfbG9hZGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYudGVzdF9sb2FkZXIgPSAic2V0dXB0b29scy5jb21tYW5kLnRlc3Q6U2Nhbm5pbmdMb2FkZXIiCiAgICAgICAgaWYgc2VsZi50ZXN0X3J1bm5lciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnRlc3RfcnVubmVyID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3Rlc3RfcnVubmVyJywgTm9uZSkKCiAgICBATm9uRGF0YVByb3BlcnR5CiAgICBkZWYgdGVzdF9hcmdzKHNlbGYpOgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuX3Rlc3RfYXJncygpKQoKICAgIGRlZiBfdGVzdF9hcmdzKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLnRlc3Rfc3VpdGUgYW5kIHN5cy52ZXJzaW9uX2luZm8gPj0gKDIsIDcpOgogICAgICAgICAgICB5aWVsZCAnZGlzY292ZXInCiAgICAgICAgaWYgc2VsZi52ZXJib3NlOgogICAgICAgICAgICB5aWVsZCAnLS12ZXJib3NlJwogICAgICAgIGlmIHNlbGYudGVzdF9zdWl0ZToKICAgICAgICAgICAgeWllbGQgc2VsZi50ZXN0X3N1aXRlCgogICAgZGVmIHdpdGhfcHJvamVjdF9vbl9zeXNfcGF0aChzZWxmLCBmdW5jKToKICAgICAgICAiIiIKICAgICAgICBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBwcm9qZWN0X29uX3N5c19wYXRoIGNvbnRleHQuCiAgICAgICAgIiIiCiAgICAgICAgd2l0aCBzZWxmLnByb2plY3Rfb25fc3lzX3BhdGgoKToKICAgICAgICAgICAgZnVuYygpCgogICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKICAgIGRlZiBwcm9qZWN0X29uX3N5c19wYXRoKHNlbGYsIGluY2x1ZGVfZGlzdHM9W10pOgogICAgICAgIHdpdGhfMnRvMyA9IHNpeC5QWTMgYW5kIGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICd1c2VfMnRvMycsIEZhbHNlKQoKICAgICAgICBpZiB3aXRoXzJ0bzM6CiAgICAgICAgICAgICMgSWYgd2UgcnVuIDJ0bzMgd2UgY2FuIG5vdCBkbyB0aGlzIGlucGxhY2U6CgogICAgICAgICAgICAjIEVuc3VyZSBtZXRhZGF0YSBpcyB1cC10by1kYXRlCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX3B5JywgaW5wbGFjZT0wKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9weScpCiAgICAgICAgICAgIGJweV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiYnVpbGRfcHkiKQogICAgICAgICAgICBidWlsZF9wYXRoID0gbm9ybWFsaXplX3BhdGgoYnB5X2NtZC5idWlsZF9saWIpCgogICAgICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnZWdnX2luZm8nLCBlZ2dfYmFzZT1idWlsZF9wYXRoKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBXaXRob3V0IDJ0bzMgaW5wbGFjZSB3b3JrcyBmaW5lOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMgaW4tcGxhY2UKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfZXh0JywgaW5wbGFjZT0xKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQoKICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQoKICAgICAgICBvbGRfcGF0aCA9IHN5cy5wYXRoWzpdCiAgICAgICAgb2xkX21vZHVsZXMgPSBzeXMubW9kdWxlcy5jb3B5KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwcm9qZWN0X3BhdGggPSBub3JtYWxpemVfcGF0aChlaV9jbWQuZWdnX2Jhc2UpCiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwcm9qZWN0X3BhdGgpCiAgICAgICAgICAgIHdvcmtpbmdfc2V0Ll9faW5pdF9fKCkKICAgICAgICAgICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIobGFtYmRhIGRpc3Q6IGRpc3QuYWN0aXZhdGUoKSkKICAgICAgICAgICAgcmVxdWlyZSgnJXM9PSVzJyAlIChlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbikpCiAgICAgICAgICAgIHdpdGggc2VsZi5wYXRoc19vbl9weXRob25wYXRoKFtwcm9qZWN0X3BhdGhdKToKICAgICAgICAgICAgICAgIHlpZWxkCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc3lzLnBhdGhbOl0gPSBvbGRfcGF0aAogICAgICAgICAgICBzeXMubW9kdWxlcy5jbGVhcigpCiAgICAgICAgICAgIHN5cy5tb2R1bGVzLnVwZGF0ZShvbGRfbW9kdWxlcykKICAgICAgICAgICAgd29ya2luZ19zZXQuX19pbml0X18oKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgcGF0aHNfb25fcHl0aG9ucGF0aChwYXRocyk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIHRoZSBpbmRpY2F0ZWQgcGF0aHMgdG8gdGhlIGhlYWQgb2YgdGhlIFBZVEhPTlBBVEggZW52aXJvbm1lbnQKICAgICAgICB2YXJpYWJsZSBzbyB0aGF0IHN1YnByb2Nlc3NlcyB3aWxsIGFsc28gc2VlIHRoZSBwYWNrYWdlcyBhdAogICAgICAgIHRoZXNlIHBhdGhzLgoKICAgICAgICBEbyB0aGlzIGluIGEgY29udGV4dCB0aGF0IHJlc3RvcmVzIHRoZSB2YWx1ZSBvbiBleGl0LgogICAgICAgICIiIgogICAgICAgIG5vdGhpbmcgPSBvYmplY3QoKQogICAgICAgIG9yaWdfcHl0aG9ucGF0aCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywgbm90aGluZykKICAgICAgICBjdXJyZW50X3B5dGhvbnBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsICcnKQogICAgICAgIHRyeToKICAgICAgICAgICAgcHJlZml4ID0gb3MucGF0aHNlcC5qb2luKHBhdGhzKQogICAgICAgICAgICB0b19qb2luID0gZmlsdGVyKE5vbmUsIFtwcmVmaXgsIGN1cnJlbnRfcHl0aG9ucGF0aF0pCiAgICAgICAgICAgIG5ld19wYXRoID0gb3MucGF0aHNlcC5qb2luKHRvX2pvaW4pCiAgICAgICAgICAgIGlmIG5ld19wYXRoOgogICAgICAgICAgICAgICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gbmV3X3BhdGgKICAgICAgICAgICAgeWllbGQKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBpZiBvcmlnX3B5dGhvbnBhdGggaXMgbm90aGluZzoKICAgICAgICAgICAgICAgIG9zLmVudmlyb24ucG9wKCdQWVRIT05QQVRIJywgTm9uZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG9zLmVudmlyb25bJ1BZVEhPTlBBVEgnXSA9IG9yaWdfcHl0aG9ucGF0aAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBpbnN0YWxsX2Rpc3RzKGRpc3QpOgogICAgICAgICIiIgogICAgICAgIEluc3RhbGwgdGhlIHJlcXVpcmVtZW50cyBpbmRpY2F0ZWQgYnkgc2VsZi5kaXN0cmlidXRpb24gYW5kCiAgICAgICAgcmV0dXJuIGFuIGl0ZXJhYmxlIG9mIHRoZSBkaXN0cyB0aGF0IHdlcmUgYnVpbHQuCiAgICAgICAgIiIiCiAgICAgICAgaXJfZCA9IGRpc3QuZmV0Y2hfYnVpbGRfZWdncyhkaXN0Lmluc3RhbGxfcmVxdWlyZXMpCiAgICAgICAgdHJfZCA9IGRpc3QuZmV0Y2hfYnVpbGRfZWdncyhkaXN0LnRlc3RzX3JlcXVpcmUgb3IgW10pCiAgICAgICAgZXJfZCA9IGRpc3QuZmV0Y2hfYnVpbGRfZWdncygKICAgICAgICAgICAgdiBmb3IgaywgdiBpbiBkaXN0LmV4dHJhc19yZXF1aXJlLml0ZW1zKCkKICAgICAgICAgICAgaWYgay5zdGFydHN3aXRoKCc6JykgYW5kIGV2YWx1YXRlX21hcmtlcihrWzE6XSkKICAgICAgICApCiAgICAgICAgcmV0dXJuIGl0ZXJ0b29scy5jaGFpbihpcl9kLCB0cl9kLCBlcl9kKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgaW5zdGFsbGVkX2Rpc3RzID0gc2VsZi5pbnN0YWxsX2Rpc3RzKHNlbGYuZGlzdHJpYnV0aW9uKQoKICAgICAgICBjbWQgPSAnICcuam9pbihzZWxmLl9hcmd2KQogICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnc2tpcHBpbmcgIiVzIiAoZHJ5IHJ1biknICUgY21kKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5hbm5vdW5jZSgncnVubmluZyAiJXMiJyAlIGNtZCkKCiAgICAgICAgcGF0aHMgPSBtYXAob3BlcmF0b3IuYXR0cmdldHRlcignbG9jYXRpb24nKSwgaW5zdGFsbGVkX2Rpc3RzKQogICAgICAgIHdpdGggc2VsZi5wYXRoc19vbl9weXRob25wYXRoKHBhdGhzKToKICAgICAgICAgICAgd2l0aCBzZWxmLnByb2plY3Rfb25fc3lzX3BhdGgoKToKICAgICAgICAgICAgICAgIHNlbGYucnVuX3Rlc3RzKCkKCiAgICBkZWYgcnVuX3Rlc3RzKHNlbGYpOgogICAgICAgICMgUHVyZ2UgbW9kdWxlcyB1bmRlciB0ZXN0IGZyb20gc3lzLm1vZHVsZXMuIFRoZSB0ZXN0IGxvYWRlciB3aWxsCiAgICAgICAgIyByZS1pbXBvcnQgdGhlbSBmcm9tIHRoZSBidWlsZCBsb2NhdGlvbi4gUmVxdWlyZWQgd2hlbiAydG8zIGlzIHVzZWQKICAgICAgICAjIHdpdGggbmFtZXNwYWNlIHBhY2thZ2VzLgogICAgICAgIGlmIHNpeC5QWTMgYW5kIGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICd1c2VfMnRvMycsIEZhbHNlKToKICAgICAgICAgICAgbW9kdWxlID0gc2VsZi50ZXN0X3N1aXRlLnNwbGl0KCcuJylbMF0KICAgICAgICAgICAgaWYgbW9kdWxlIGluIF9uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgICAgICBkZWxfbW9kdWxlcyA9IFtdCiAgICAgICAgICAgICAgICBpZiBtb2R1bGUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgZGVsX21vZHVsZXMuYXBwZW5kKG1vZHVsZSkKICAgICAgICAgICAgICAgIG1vZHVsZSArPSAnLicKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aChtb2R1bGUpOgogICAgICAgICAgICAgICAgICAgICAgICBkZWxfbW9kdWxlcy5hcHBlbmQobmFtZSkKICAgICAgICAgICAgICAgIGxpc3QobWFwKHN5cy5tb2R1bGVzLl9fZGVsaXRlbV9fLCBkZWxfbW9kdWxlcykpCgogICAgICAgIHRlc3QgPSB1bml0dGVzdC5tYWluKAogICAgICAgICAgICBOb25lLCBOb25lLCBzZWxmLl9hcmd2LAogICAgICAgICAgICB0ZXN0TG9hZGVyPXNlbGYuX3Jlc29sdmVfYXNfZXAoc2VsZi50ZXN0X2xvYWRlciksCiAgICAgICAgICAgIHRlc3RSdW5uZXI9c2VsZi5fcmVzb2x2ZV9hc19lcChzZWxmLnRlc3RfcnVubmVyKSwKICAgICAgICAgICAgZXhpdD1GYWxzZSwKICAgICAgICApCiAgICAgICAgaWYgbm90IHRlc3QucmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKToKICAgICAgICAgICAgbXNnID0gJ1Rlc3QgZmFpbGVkOiAlcycgJSB0ZXN0LnJlc3VsdAogICAgICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLkVSUk9SKQogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihtc2cpCgogICAgQHByb3BlcnR5CiAgICBkZWYgX2FyZ3Yoc2VsZik6CiAgICAgICAgcmV0dXJuIFsndW5pdHRlc3QnXSArIHNlbGYudGVzdF9hcmdzCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZXNvbHZlX2FzX2VwKHZhbCk6CiAgICAgICAgIiIiCiAgICAgICAgTG9hZCB0aGUgaW5kaWNhdGVkIGF0dHJpYnV0ZSB2YWx1ZSwgY2FsbGVkLCBhcyBhIGFzIGlmIGl0IHdlcmUKICAgICAgICBzcGVjaWZpZWQgYXMgYW4gZW50cnkgcG9pbnQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgdmFsIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHBhcnNlZCA9IEVudHJ5UG9pbnQucGFyc2UoIng9IiArIHZhbCkKICAgICAgICByZXR1cm4gcGFyc2VkLnJlc29sdmUoKSgpClBLAwQUAAAAAAAAACEA2SSLZ5QEAACUBAAANAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHlpbXBvcnQgZ2V0cGFzcwpmcm9tIGRpc3R1dGlscy5jb21tYW5kIGltcG9ydCB1cGxvYWQgYXMgb3JpZwoKCmNsYXNzIHVwbG9hZChvcmlnLnVwbG9hZCk6CiAgICAiIiIKICAgIE92ZXJyaWRlIGRlZmF1bHQgdXBsb2FkIGJlaGF2aW9yIHRvIG9idGFpbiBwYXNzd29yZAogICAgaW4gYSB2YXJpZXR5IG9mIGRpZmZlcmVudCB3YXlzLgogICAgIiIiCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy51cGxvYWQuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYudXNlcm5hbWUgPSAoCiAgICAgICAgICAgIHNlbGYudXNlcm5hbWUgb3IKICAgICAgICAgICAgZ2V0cGFzcy5nZXR1c2VyKCkKICAgICAgICApCiAgICAgICAgIyBBdHRlbXB0IHRvIG9idGFpbiBwYXNzd29yZC4gU2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGF0IHRoZSBmaXJzdAogICAgICAgICMgc2lnbiBvZiBzdWNjZXNzLgogICAgICAgIHNlbGYucGFzc3dvcmQgPSAoCiAgICAgICAgICAgIHNlbGYucGFzc3dvcmQgb3IKICAgICAgICAgICAgc2VsZi5fbG9hZF9wYXNzd29yZF9mcm9tX2tleXJpbmcoKSBvcgogICAgICAgICAgICBzZWxmLl9wcm9tcHRfZm9yX3Bhc3N3b3JkKCkKICAgICAgICApCgogICAgZGVmIF9sb2FkX3Bhc3N3b3JkX2Zyb21fa2V5cmluZyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBBdHRlbXB0IHRvIGxvYWQgcGFzc3dvcmQgZnJvbSBrZXlyaW5nLiBTdXBwcmVzcyBFeGNlcHRpb25zLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAga2V5cmluZyA9IF9faW1wb3J0X18oJ2tleXJpbmcnKQogICAgICAgICAgICByZXR1cm4ga2V5cmluZy5nZXRfcGFzc3dvcmQoc2VsZi5yZXBvc2l0b3J5LCBzZWxmLnVzZXJuYW1lKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgX3Byb21wdF9mb3JfcGFzc3dvcmQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUHJvbXB0IGZvciBhIHBhc3N3b3JkIG9uIHRoZSB0dHkuIFN1cHByZXNzIEV4Y2VwdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gZ2V0cGFzcy5nZXRwYXNzKCkKICAgICAgICBleGNlcHQgKEV4Y2VwdGlvbiwgS2V5Ym9hcmRJbnRlcnJ1cHQpOgogICAgICAgICAgICBwYXNzClBLAwQUAAAAAAAAACEA8pfzxo8cAACPHAAAOQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWRfZG9jcy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiIiInVwbG9hZF9kb2NzCgpJbXBsZW1lbnRzIGEgRGlzdHV0aWxzICd1cGxvYWRfZG9jcycgc3ViY29tbWFuZCAodXBsb2FkIGRvY3VtZW50YXRpb24gdG8KUHlQSSdzIHB5dGhvbmhvc3RlZC5vcmcpLgoiIiIKCmZyb20gYmFzZTY0IGltcG9ydCBzdGFuZGFyZF9iNjRlbmNvZGUKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCmltcG9ydCBvcwppbXBvcnQgc29ja2V0CmltcG9ydCB6aXBmaWxlCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgc2h1dGlsCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IGZ1bmN0b29scwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBodHRwX2NsaWVudCwgdXJsbGliCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IGl0ZXJfZW50cnlfcG9pbnRzCmZyb20gLnVwbG9hZCBpbXBvcnQgdXBsb2FkCgoKZGVmIF9lbmNvZGUocyk6CiAgICBlcnJvcnMgPSAnc3Vycm9nYXRlZXNjYXBlJyBpZiBzaXguUFkzIGVsc2UgJ3N0cmljdCcKICAgIHJldHVybiBzLmVuY29kZSgndXRmLTgnLCBlcnJvcnMpCgoKY2xhc3MgdXBsb2FkX2RvY3ModXBsb2FkKToKICAgICMgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcmVwb3NpdG9yeSBhcyB1cGxvYWRfZG9jcyBpc24ndAogICAgIyBzdXBwb3J0ZWQgYnkgV2FyZWhvdXNlIChhbmQgd29uJ3QgYmUpLgogICAgREVGQVVMVF9SRVBPU0lUT1JZID0gJ2h0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGkvJwoKICAgIGRlc2NyaXB0aW9uID0gJ1VwbG9hZCBkb2N1bWVudGF0aW9uIHRvIFB5UEknCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgncmVwb3NpdG9yeT0nLCAncicsCiAgICAgICAgICJ1cmwgb2YgcmVwb3NpdG9yeSBbZGVmYXVsdDogJXNdIiAlIHVwbG9hZC5ERUZBVUxUX1JFUE9TSVRPUlkpLAogICAgICAgICgnc2hvdy1yZXNwb25zZScsIE5vbmUsCiAgICAgICAgICdkaXNwbGF5IGZ1bGwgcmVzcG9uc2UgdGV4dCBmcm9tIHNlcnZlcicpLAogICAgICAgICgndXBsb2FkLWRpcj0nLCBOb25lLCAnZGlyZWN0b3J5IHRvIHVwbG9hZCcpLAogICAgXQogICAgYm9vbGVhbl9vcHRpb25zID0gdXBsb2FkLmJvb2xlYW5fb3B0aW9ucwoKICAgIGRlZiBoYXNfc3BoaW54KHNlbGYpOgogICAgICAgIGlmIHNlbGYudXBsb2FkX2RpciBpcyBOb25lOgogICAgICAgICAgICBmb3IgZXAgaW4gaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5jb21tYW5kcycsICdidWlsZF9zcGhpbngnKToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgc3ViX2NvbW1hbmRzID0gWygnYnVpbGRfc3BoaW54JywgaGFzX3NwaGlueCldCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICB1cGxvYWQuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi51cGxvYWRfZGlyID0gTm9uZQogICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICB1cGxvYWQuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIGlmIHNlbGYudXBsb2FkX2RpciBpcyBOb25lOgogICAgICAgICAgICBpZiBzZWxmLmhhc19zcGhpbngoKToKICAgICAgICAgICAgICAgIGJ1aWxkX3NwaGlueCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9zcGhpbngnKQogICAgICAgICAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gYnVpbGRfc3BoaW54LmJ1aWxkZXJfdGFyZ2V0X2RpcgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYnVpbGQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQogICAgICAgICAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gb3MucGF0aC5qb2luKGJ1aWxkLmJ1aWxkX2Jhc2UsICdkb2NzJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmVuc3VyZV9kaXJuYW1lKCd1cGxvYWRfZGlyJykKICAgICAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gc2VsZi51cGxvYWRfZGlyCiAgICAgICAgaWYgJ3B5cGkucHl0aG9uLm9yZycgaW4gc2VsZi5yZXBvc2l0b3J5OgogICAgICAgICAgICBsb2cud2FybigiVXBsb2FkX2RvY3MgY29tbWFuZCBpcyBkZXByZWNhdGVkLiBVc2UgUlREIGluc3RlYWQuIikKICAgICAgICBzZWxmLmFubm91bmNlKCdVc2luZyB1cGxvYWQgZGlyZWN0b3J5ICVzJyAlIHNlbGYudGFyZ2V0X2RpcikKCiAgICBkZWYgY3JlYXRlX3ppcGZpbGUoc2VsZiwgZmlsZW5hbWUpOgogICAgICAgIHppcF9maWxlID0gemlwZmlsZS5aaXBGaWxlKGZpbGVuYW1lLCAidyIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLm1rcGF0aChzZWxmLnRhcmdldF9kaXIpICAjIGp1c3QgaW4gY2FzZQogICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhzZWxmLnRhcmdldF9kaXIpOgogICAgICAgICAgICAgICAgaWYgcm9vdCA9PSBzZWxmLnRhcmdldF9kaXIgYW5kIG5vdCBmaWxlczoKICAgICAgICAgICAgICAgICAgICB0bXBsID0gIm5vIGZpbGVzIGZvdW5kIGluIHVwbG9hZCBkaXJlY3RvcnkgJyVzJyIKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcih0bXBsICUgc2VsZi50YXJnZXRfZGlyKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICAgICAgZnVsbCA9IG9zLnBhdGguam9pbihyb290LCBuYW1lKQogICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlID0gcm9vdFtsZW4oc2VsZi50YXJnZXRfZGlyKTpdLmxzdHJpcChvcy5wYXRoLnNlcCkKICAgICAgICAgICAgICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKHJlbGF0aXZlLCBuYW1lKQogICAgICAgICAgICAgICAgICAgIHppcF9maWxlLndyaXRlKGZ1bGwsIGRlc3QpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgemlwX2ZpbGUuY2xvc2UoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIyBSdW4gc3ViIGNvbW1hbmRzCiAgICAgICAgZm9yIGNtZF9uYW1lIGluIHNlbGYuZ2V0X3N1Yl9jb21tYW5kcygpOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKGNtZF9uYW1lKQoKICAgICAgICB0bXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICAgICAgbmFtZSA9IHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhLmdldF9uYW1lKCkKICAgICAgICB6aXBfZmlsZSA9IG9zLnBhdGguam9pbih0bXBfZGlyLCAiJXMuemlwIiAlIG5hbWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmNyZWF0ZV96aXBmaWxlKHppcF9maWxlKQogICAgICAgICAgICBzZWxmLnVwbG9hZF9maWxlKHppcF9maWxlKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodG1wX2RpcikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2J1aWxkX3BhcnQoaXRlbSwgc2VwX2JvdW5kYXJ5KToKICAgICAgICBrZXksIHZhbHVlcyA9IGl0ZW0KICAgICAgICB0aXRsZSA9ICdcbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJXMiJyAlIGtleQogICAgICAgICMgaGFuZGxlIG11bHRpcGxlIGVudHJpZXMgZm9yIHRoZSBzYW1lIG5hbWUKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZXMsIGxpc3QpOgogICAgICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXQogICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKICAgICAgICAgICAgICAgIHRpdGxlICs9ICc7IGZpbGVuYW1lPSIlcyInICUgdmFsdWVbMF0KICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlID0gX2VuY29kZSh2YWx1ZSkKICAgICAgICAgICAgeWllbGQgc2VwX2JvdW5kYXJ5CiAgICAgICAgICAgIHlpZWxkIF9lbmNvZGUodGl0bGUpCiAgICAgICAgICAgIHlpZWxkIGIiXG5cbiIKICAgICAgICAgICAgeWllbGQgdmFsdWUKICAgICAgICAgICAgaWYgdmFsdWUgYW5kIHZhbHVlWy0xOl0gPT0gYidccic6CiAgICAgICAgICAgICAgICB5aWVsZCBiJ1xuJyAgIyB3cml0ZSBhbiBleHRyYSBuZXdsaW5lIChsdXJ2ZSBNYWNzKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9idWlsZF9tdWx0aXBhcnQoY2xzLCBkYXRhKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCB1cCB0aGUgTUlNRSBwYXlsb2FkIGZvciB0aGUgUE9TVCBkYXRhCiAgICAgICAgIiIiCiAgICAgICAgYm91bmRhcnkgPSBiJy0tLS0tLS0tLS0tLS0tR0hTS0ZKRExHRFM3NTQzRkpLTEZIUkU3NTY0Mjc1Njc0MzI1NCcKICAgICAgICBzZXBfYm91bmRhcnkgPSBiJ1xuLS0nICsgYm91bmRhcnkKICAgICAgICBlbmRfYm91bmRhcnkgPSBzZXBfYm91bmRhcnkgKyBiJy0tJwogICAgICAgIGVuZF9pdGVtcyA9IGVuZF9ib3VuZGFyeSwgYiJcbiIsCiAgICAgICAgYnVpbGRlciA9IGZ1bmN0b29scy5wYXJ0aWFsKAogICAgICAgICAgICBjbHMuX2J1aWxkX3BhcnQsCiAgICAgICAgICAgIHNlcF9ib3VuZGFyeT1zZXBfYm91bmRhcnksCiAgICAgICAgKQogICAgICAgIHBhcnRfZ3JvdXBzID0gbWFwKGJ1aWxkZXIsIGRhdGEuaXRlbXMoKSkKICAgICAgICBwYXJ0cyA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlKHBhcnRfZ3JvdXBzKQogICAgICAgIGJvZHlfaXRlbXMgPSBpdGVydG9vbHMuY2hhaW4ocGFydHMsIGVuZF9pdGVtcykKICAgICAgICBjb250ZW50X3R5cGUgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JXMnICUgYm91bmRhcnkuZGVjb2RlKCdhc2NpaScpCiAgICAgICAgcmV0dXJuIGInJy5qb2luKGJvZHlfaXRlbXMpLCBjb250ZW50X3R5cGUKCiAgICBkZWYgdXBsb2FkX2ZpbGUoc2VsZiwgZmlsZW5hbWUpOgogICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgY29udGVudCA9IGYucmVhZCgpCiAgICAgICAgbWV0YSA9IHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhCiAgICAgICAgZGF0YSA9IHsKICAgICAgICAgICAgJzphY3Rpb24nOiAnZG9jX3VwbG9hZCcsCiAgICAgICAgICAgICduYW1lJzogbWV0YS5nZXRfbmFtZSgpLAogICAgICAgICAgICAnY29udGVudCc6IChvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgY29udGVudCksCiAgICAgICAgfQogICAgICAgICMgc2V0IHVwIHRoZSBhdXRoZW50aWNhdGlvbgogICAgICAgIGNyZWRlbnRpYWxzID0gX2VuY29kZShzZWxmLnVzZXJuYW1lICsgJzonICsgc2VsZi5wYXNzd29yZCkKICAgICAgICBjcmVkZW50aWFscyA9IHN0YW5kYXJkX2I2NGVuY29kZShjcmVkZW50aWFscykKICAgICAgICBpZiBzaXguUFkzOgogICAgICAgICAgICBjcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzLmRlY29kZSgnYXNjaWknKQogICAgICAgIGF1dGggPSAiQmFzaWMgIiArIGNyZWRlbnRpYWxzCgogICAgICAgIGJvZHksIGN0ID0gc2VsZi5fYnVpbGRfbXVsdGlwYXJ0KGRhdGEpCgogICAgICAgIG1zZyA9ICJTdWJtaXR0aW5nIGRvY3VtZW50YXRpb24gdG8gJXMiICUgKHNlbGYucmVwb3NpdG9yeSkKICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLklORk8pCgogICAgICAgICMgYnVpbGQgdGhlIFJlcXVlc3QKICAgICAgICAjIFdlIGNhbid0IHVzZSB1cmxsaWIyIHNpbmNlIHdlIG5lZWQgdG8gc2VuZCB0aGUgQmFzaWMKICAgICAgICAjIGF1dGggcmlnaHQgd2l0aCB0aGUgZmlyc3QgcmVxdWVzdAogICAgICAgIHNjaGVtYSwgbmV0bG9jLCB1cmwsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50cyA9IFwKICAgICAgICAgICAgdXJsbGliLnBhcnNlLnVybHBhcnNlKHNlbGYucmVwb3NpdG9yeSkKICAgICAgICBhc3NlcnQgbm90IHBhcmFtcyBhbmQgbm90IHF1ZXJ5IGFuZCBub3QgZnJhZ21lbnRzCiAgICAgICAgaWYgc2NoZW1hID09ICdodHRwJzoKICAgICAgICAgICAgY29ubiA9IGh0dHBfY2xpZW50LkhUVFBDb25uZWN0aW9uKG5ldGxvYykKICAgICAgICBlbGlmIHNjaGVtYSA9PSAnaHR0cHMnOgogICAgICAgICAgICBjb25uID0gaHR0cF9jbGllbnQuSFRUUFNDb25uZWN0aW9uKG5ldGxvYykKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigidW5zdXBwb3J0ZWQgc2NoZW1hICIgKyBzY2hlbWEpCgogICAgICAgIGRhdGEgPSAnJwogICAgICAgIHRyeToKICAgICAgICAgICAgY29ubi5jb25uZWN0KCkKICAgICAgICAgICAgY29ubi5wdXRyZXF1ZXN0KCJQT1NUIiwgdXJsKQogICAgICAgICAgICBjb250ZW50X3R5cGUgPSBjdAogICAgICAgICAgICBjb25uLnB1dGhlYWRlcignQ29udGVudC10eXBlJywgY29udGVudF90eXBlKQogICAgICAgICAgICBjb25uLnB1dGhlYWRlcignQ29udGVudC1sZW5ndGgnLCBzdHIobGVuKGJvZHkpKSkKICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIoJ0F1dGhvcml6YXRpb24nLCBhdXRoKQogICAgICAgICAgICBjb25uLmVuZGhlYWRlcnMoKQogICAgICAgICAgICBjb25uLnNlbmQoYm9keSkKICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6CiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2Uoc3RyKGUpLCBsb2cuRVJST1IpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICByID0gY29ubi5nZXRyZXNwb25zZSgpCiAgICAgICAgaWYgci5zdGF0dXMgPT0gMjAwOgogICAgICAgICAgICBtc2cgPSAnU2VydmVyIHJlc3BvbnNlICglcyk6ICVzJyAlIChyLnN0YXR1cywgci5yZWFzb24pCiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UobXNnLCBsb2cuSU5GTykKICAgICAgICBlbGlmIHIuc3RhdHVzID09IDMwMToKICAgICAgICAgICAgbG9jYXRpb24gPSByLmdldGhlYWRlcignTG9jYXRpb24nKQogICAgICAgICAgICBpZiBsb2NhdGlvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgbG9jYXRpb24gPSAnaHR0cHM6Ly9weXRob25ob3N0ZWQub3JnLyVzLycgJSBtZXRhLmdldF9uYW1lKCkKICAgICAgICAgICAgbXNnID0gJ1VwbG9hZCBzdWNjZXNzZnVsLiBWaXNpdCAlcycgJSBsb2NhdGlvbgogICAgICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLklORk8pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbXNnID0gJ1VwbG9hZCBmYWlsZWQgKCVzKTogJXMnICUgKHIuc3RhdHVzLCByLnJlYXNvbikKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5FUlJPUikKICAgICAgICBpZiBzZWxmLnNob3dfcmVzcG9uc2U6CiAgICAgICAgICAgIHByaW50KCctJyAqIDc1LCByLnJlYWQoKSwgJy0nICogNzUpClBLAwQUAAAAAAAAACEAiUcQJLE/AACxPwAALAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29uZmlnLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIHVuaWNvZGVfbGl0ZXJhbHMKaW1wb3J0IGlvCmltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CmZyb20gZnVuY3Rvb2xzIGltcG9ydCBwYXJ0aWFsCmZyb20gaW1wb3J0bGliIGltcG9ydCBpbXBvcnRfbW9kdWxlCgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yLCBEaXN0dXRpbHNGaWxlRXJyb3IKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXggaW1wb3J0IHN0cmluZ190eXBlcwoKCmRlZiByZWFkX2NvbmZpZ3VyYXRpb24oCiAgICAgICAgZmlsZXBhdGgsIGZpbmRfb3RoZXJzPUZhbHNlLCBpZ25vcmVfb3B0aW9uX2Vycm9ycz1GYWxzZSk6CiAgICAiIiJSZWFkIGdpdmVuIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgcmV0dXJucyBvcHRpb25zIGZyb20gaXQgYXMgYSBkaWN0LgoKICAgIDpwYXJhbSBzdHJ8dW5pY29kZSBmaWxlcGF0aDogUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUKICAgICAgICB0byBnZXQgb3B0aW9ucyBmcm9tLgoKICAgIDpwYXJhbSBib29sIGZpbmRfb3RoZXJzOiBXaGV0aGVyIHRvIHNlYXJjaCBmb3Igb3RoZXIgY29uZmlndXJhdGlvbiBmaWxlcwogICAgICAgIHdoaWNoIGNvdWxkIGJlIG9uIGluIHZhcmlvdXMgcGxhY2VzLgoKICAgIDpwYXJhbSBib29sIGlnbm9yZV9vcHRpb25fZXJyb3JzOiBXaGV0aGVyIHRvIHNpbGVudGx5IGlnbm9yZQogICAgICAgIG9wdGlvbnMsIHZhbHVlcyBvZiB3aGljaCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgKGUuZy4gZHVlIHRvIGV4Y2VwdGlvbnMKICAgICAgICBpbiBkaXJlY3RpdmVzIHN1Y2ggYXMgZmlsZTosIGF0dHI6LCBldGMuKS4KICAgICAgICBJZiBGYWxzZSBleGNlcHRpb25zIGFyZSBwcm9wYWdhdGVkIGFzIGV4cGVjdGVkLgoKICAgIDpydHlwZTogZGljdAogICAgIiIiCiAgICBmcm9tIHNldHVwdG9vbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uLCBfRGlzdHJpYnV0aW9uCgogICAgZmlsZXBhdGggPSBvcy5wYXRoLmFic3BhdGgoZmlsZXBhdGgpCgogICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGZpbGVwYXRoKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoCiAgICAgICAgICAgICdDb25maWd1cmF0aW9uIGZpbGUgJXMgZG9lcyBub3QgZXhpc3QuJyAlIGZpbGVwYXRoKQoKICAgIGN1cnJlbnRfZGlyZWN0b3J5ID0gb3MuZ2V0Y3dkKCkKICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShmaWxlcGF0aCkpCgogICAgdHJ5OgogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oKQoKICAgICAgICBmaWxlbmFtZXMgPSBkaXN0LmZpbmRfY29uZmlnX2ZpbGVzKCkgaWYgZmluZF9vdGhlcnMgZWxzZSBbXQogICAgICAgIGlmIGZpbGVwYXRoIG5vdCBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoZmlsZXBhdGgpCgogICAgICAgIF9EaXN0cmlidXRpb24ucGFyc2VfY29uZmlnX2ZpbGVzKGRpc3QsIGZpbGVuYW1lcz1maWxlbmFtZXMpCgogICAgICAgIGhhbmRsZXJzID0gcGFyc2VfY29uZmlndXJhdGlvbigKICAgICAgICAgICAgZGlzdCwgZGlzdC5jb21tYW5kX29wdGlvbnMsCiAgICAgICAgICAgIGlnbm9yZV9vcHRpb25fZXJyb3JzPWlnbm9yZV9vcHRpb25fZXJyb3JzKQoKICAgIGZpbmFsbHk6CiAgICAgICAgb3MuY2hkaXIoY3VycmVudF9kaXJlY3RvcnkpCgogICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25fdG9fZGljdChoYW5kbGVycykKCgpkZWYgY29uZmlndXJhdGlvbl90b19kaWN0KGhhbmRsZXJzKToKICAgICIiIlJldHVybnMgY29uZmlndXJhdGlvbiBkYXRhIGdhdGhlcmVkIGJ5IGdpdmVuIGhhbmRsZXJzIGFzIGEgZGljdC4KCiAgICA6cGFyYW0gbGlzdFtDb25maWdIYW5kbGVyXSBoYW5kbGVyczogSGFuZGxlcnMgbGlzdCwKICAgICAgICB1c3VhbGx5IGZyb20gcGFyc2VfY29uZmlndXJhdGlvbigpCgogICAgOnJ0eXBlOiBkaWN0CiAgICAiIiIKICAgIGNvbmZpZ19kaWN0ID0gZGVmYXVsdGRpY3QoZGljdCkKCiAgICBmb3IgaGFuZGxlciBpbiBoYW5kbGVyczoKCiAgICAgICAgb2JqX2FsaWFzID0gaGFuZGxlci5zZWN0aW9uX3ByZWZpeAogICAgICAgIHRhcmdldF9vYmogPSBoYW5kbGVyLnRhcmdldF9vYmoKCiAgICAgICAgZm9yIG9wdGlvbiBpbiBoYW5kbGVyLnNldF9vcHRpb25zOgogICAgICAgICAgICBnZXR0ZXIgPSBnZXRhdHRyKHRhcmdldF9vYmosICdnZXRfJXMnICUgb3B0aW9uLCBOb25lKQoKICAgICAgICAgICAgaWYgZ2V0dGVyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIodGFyZ2V0X29iaiwgb3B0aW9uKQoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0dGVyKCkKCiAgICAgICAgICAgIGNvbmZpZ19kaWN0W29ial9hbGlhc11bb3B0aW9uXSA9IHZhbHVlCgogICAgcmV0dXJuIGNvbmZpZ19kaWN0CgoKZGVmIHBhcnNlX2NvbmZpZ3VyYXRpb24oCiAgICAgICAgZGlzdHJpYnV0aW9uLCBjb21tYW5kX29wdGlvbnMsIGlnbm9yZV9vcHRpb25fZXJyb3JzPUZhbHNlKToKICAgICIiIlBlcmZvcm1zIGFkZGl0aW9uYWwgcGFyc2luZyBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMKICAgIGZvciBhIGRpc3RyaWJ1dGlvbi4KCiAgICBSZXR1cm5zIGEgbGlzdCBvZiB1c2VkIG9wdGlvbiBoYW5kbGVycy4KCiAgICA6cGFyYW0gRGlzdHJpYnV0aW9uIGRpc3RyaWJ1dGlvbjoKICAgIDpwYXJhbSBkaWN0IGNvbW1hbmRfb3B0aW9uczoKICAgIDpwYXJhbSBib29sIGlnbm9yZV9vcHRpb25fZXJyb3JzOiBXaGV0aGVyIHRvIHNpbGVudGx5IGlnbm9yZQogICAgICAgIG9wdGlvbnMsIHZhbHVlcyBvZiB3aGljaCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgKGUuZy4gZHVlIHRvIGV4Y2VwdGlvbnMKICAgICAgICBpbiBkaXJlY3RpdmVzIHN1Y2ggYXMgZmlsZTosIGF0dHI6LCBldGMuKS4KICAgICAgICBJZiBGYWxzZSBleGNlcHRpb25zIGFyZSBwcm9wYWdhdGVkIGFzIGV4cGVjdGVkLgogICAgOnJ0eXBlOiBsaXN0CiAgICAiIiIKICAgIG1ldGEgPSBDb25maWdNZXRhZGF0YUhhbmRsZXIoCiAgICAgICAgZGlzdHJpYnV0aW9uLm1ldGFkYXRhLCBjb21tYW5kX29wdGlvbnMsIGlnbm9yZV9vcHRpb25fZXJyb3JzKQogICAgbWV0YS5wYXJzZSgpCgogICAgb3B0aW9ucyA9IENvbmZpZ09wdGlvbnNIYW5kbGVyKAogICAgICAgIGRpc3RyaWJ1dGlvbiwgY29tbWFuZF9vcHRpb25zLCBpZ25vcmVfb3B0aW9uX2Vycm9ycykKICAgIG9wdGlvbnMucGFyc2UoKQoKICAgIHJldHVybiBbbWV0YSwgb3B0aW9uc10KCgpjbGFzcyBDb25maWdIYW5kbGVyKG9iamVjdCk6CiAgICAiIiJIYW5kbGVzIG1ldGFkYXRhIHN1cHBsaWVkIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMuIiIiCgogICAgc2VjdGlvbl9wcmVmaXggPSBOb25lCiAgICAiIiJQcmVmaXggZm9yIGNvbmZpZyBzZWN0aW9ucyBoYW5kbGVkIGJ5IHRoaXMgaGFuZGxlci4KICAgIE11c3QgYmUgcHJvdmlkZWQgYnkgY2xhc3MgaGVpcnMuCgogICAgIiIiCgogICAgYWxpYXNlcyA9IHt9CiAgICAiIiJPcHRpb25zIGFsaWFzZXMuCiAgICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZhcmlvdXMgcGFja2FnZXMuIEUuZy46IGQydG8xIGFuZCBwYnIuCiAgICBOb3RlOiBgLWAgaW4ga2V5cyBpcyByZXBsYWNlZCB3aXRoIGBfYCBieSBjb25maWcgcGFyc2VyLgoKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJnZXRfb2JqLCBvcHRpb25zLCBpZ25vcmVfb3B0aW9uX2Vycm9ycz1GYWxzZSk6CiAgICAgICAgc2VjdGlvbnMgPSB7fQoKICAgICAgICBzZWN0aW9uX3ByZWZpeCA9IHNlbGYuc2VjdGlvbl9wcmVmaXgKICAgICAgICBmb3Igc2VjdGlvbl9uYW1lLCBzZWN0aW9uX29wdGlvbnMgaW4gb3B0aW9ucy5pdGVtcygpOgogICAgICAgICAgICBpZiBub3Qgc2VjdGlvbl9uYW1lLnN0YXJ0c3dpdGgoc2VjdGlvbl9wcmVmaXgpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHNlY3Rpb25fbmFtZSA9IHNlY3Rpb25fbmFtZS5yZXBsYWNlKHNlY3Rpb25fcHJlZml4LCAnJykuc3RyaXAoJy4nKQogICAgICAgICAgICBzZWN0aW9uc1tzZWN0aW9uX25hbWVdID0gc2VjdGlvbl9vcHRpb25zCgogICAgICAgIHNlbGYuaWdub3JlX29wdGlvbl9lcnJvcnMgPSBpZ25vcmVfb3B0aW9uX2Vycm9ycwogICAgICAgIHNlbGYudGFyZ2V0X29iaiA9IHRhcmdldF9vYmoKICAgICAgICBzZWxmLnNlY3Rpb25zID0gc2VjdGlvbnMKICAgICAgICBzZWxmLnNldF9vcHRpb25zID0gW10KCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXJzZXJzKHNlbGYpOgogICAgICAgICIiIk1ldGFkYXRhIGl0ZW0gbmFtZSB0byBwYXJzZXIgZnVuY3Rpb24gbWFwcGluZy4iIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAnJXMgbXVzdCBwcm92aWRlIC5wYXJzZXJzIHByb3BlcnR5JyAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBvcHRpb25fbmFtZSwgdmFsdWUpOgogICAgICAgIHVua25vd24gPSB0dXBsZSgpCiAgICAgICAgdGFyZ2V0X29iaiA9IHNlbGYudGFyZ2V0X29iagoKICAgICAgICAjIFRyYW5zbGF0ZSBhbGlhcyBpbnRvIHJlYWwgbmFtZS4KICAgICAgICBvcHRpb25fbmFtZSA9IHNlbGYuYWxpYXNlcy5nZXQob3B0aW9uX25hbWUsIG9wdGlvbl9uYW1lKQoKICAgICAgICBjdXJyZW50X3ZhbHVlID0gZ2V0YXR0cih0YXJnZXRfb2JqLCBvcHRpb25fbmFtZSwgdW5rbm93bikKCiAgICAgICAgaWYgY3VycmVudF92YWx1ZSBpcyB1bmtub3duOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcihvcHRpb25fbmFtZSkKCiAgICAgICAgaWYgY3VycmVudF92YWx1ZToKICAgICAgICAgICAgIyBBbHJlYWR5IGluaGFiaXRlZC4gU2tpcHBpbmcuCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBza2lwX29wdGlvbiA9IEZhbHNlCiAgICAgICAgcGFyc2VyID0gc2VsZi5wYXJzZXJzLmdldChvcHRpb25fbmFtZSkKICAgICAgICBpZiBwYXJzZXI6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VyKHZhbHVlKQoKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHNraXBfb3B0aW9uID0gVHJ1ZQogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaWdub3JlX29wdGlvbl9lcnJvcnM6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgaWYgc2tpcF9vcHRpb246CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZXR0ZXIgPSBnZXRhdHRyKHRhcmdldF9vYmosICdzZXRfJXMnICUgb3B0aW9uX25hbWUsIE5vbmUpCiAgICAgICAgaWYgc2V0dGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHNldGF0dHIodGFyZ2V0X29iaiwgb3B0aW9uX25hbWUsIHZhbHVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNldHRlcih2YWx1ZSkKCiAgICAgICAgc2VsZi5zZXRfb3B0aW9ucy5hcHBlbmQob3B0aW9uX25hbWUpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2xpc3QoY2xzLCB2YWx1ZSwgc2VwYXJhdG9yPScsJyk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBhIGxpc3QuCgogICAgICAgIFZhbHVlIGlzIHNwbGl0IGVpdGhlciBieSBzZXBhcmF0b3IgKGRlZmF1bHRzIHRvIGNvbW1hKSBvciBieSBsaW5lcy4KCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgIDpwYXJhbSBzZXBhcmF0b3I6IExpc3QgaXRlbXMgc2VwYXJhdG9yIGNoYXJhY3Rlci4KICAgICAgICA6cnR5cGU6IGxpc3QKICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KTogICMgX2dldF9wYXJzZXJfY29tcG91bmQgY2FzZQogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgaWYgJ1xuJyBpbiB2YWx1ZToKICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zcGxpdGxpbmVzKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KHNlcGFyYXRvcikKCiAgICAgICAgcmV0dXJuIFtjaHVuay5zdHJpcCgpIGZvciBjaHVuayBpbiB2YWx1ZSBpZiBjaHVuay5zdHJpcCgpXQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9kaWN0KGNscywgdmFsdWUpOgogICAgICAgICIiIlJlcHJlc2VudHMgdmFsdWUgYXMgYSBkaWN0LgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBkaWN0CiAgICAgICAgIiIiCiAgICAgICAgc2VwYXJhdG9yID0gJz0nCiAgICAgICAgcmVzdWx0ID0ge30KICAgICAgICBmb3IgbGluZSBpbiBjbHMuX3BhcnNlX2xpc3QodmFsdWUpOgogICAgICAgICAgICBrZXksIHNlcCwgdmFsID0gbGluZS5wYXJ0aXRpb24oc2VwYXJhdG9yKQogICAgICAgICAgICBpZiBzZXAgIT0gc2VwYXJhdG9yOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBwYXJzZSBvcHRpb24gdmFsdWUgdG8gZGljdDogJXMnICUgdmFsdWUpCiAgICAgICAgICAgIHJlc3VsdFtrZXkuc3RyaXAoKV0gPSB2YWwuc3RyaXAoKQoKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2Jvb2woY2xzLCB2YWx1ZSk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBib29sZWFuLgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBib29sCiAgICAgICAgIiIiCiAgICAgICAgdmFsdWUgPSB2YWx1ZS5sb3dlcigpCiAgICAgICAgcmV0dXJuIHZhbHVlIGluICgnMScsICd0cnVlJywgJ3llcycpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2ZpbGUoY2xzLCB2YWx1ZSk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBhIHN0cmluZywgYWxsb3dpbmcgaW5jbHVkaW5nIHRleHQKICAgICAgICBmcm9tIG5lYXJlc3QgZmlsZXMgdXNpbmcgYGZpbGU6YCBkaXJlY3RpdmUuCgogICAgICAgIERpcmVjdGl2ZSBpcyBzYW5kYm94ZWQgYW5kIHdvbid0IHJlYWNoIGFueXRoaW5nIG91dHNpZGUKICAgICAgICBkaXJlY3Rvcnkgd2l0aCBzZXR1cC5weS4KCiAgICAgICAgRXhhbXBsZXM6CiAgICAgICAgICAgIGZpbGU6IExJQ0VOU0UKICAgICAgICAgICAgZmlsZTogUkVBRE1FLnJzdCwgQ0hBTkdFTE9HLm1kLCBzcmMvZmlsZS50eHQKCiAgICAgICAgOnBhcmFtIHN0ciB2YWx1ZToKICAgICAgICA6cnR5cGU6IHN0cgogICAgICAgICIiIgogICAgICAgIGluY2x1ZGVfZGlyZWN0aXZlID0gJ2ZpbGU6JwoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIGlmIG5vdCB2YWx1ZS5zdGFydHN3aXRoKGluY2x1ZGVfZGlyZWN0aXZlKToKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIHNwZWMgPSB2YWx1ZVtsZW4oaW5jbHVkZV9kaXJlY3RpdmUpOl0KICAgICAgICBmaWxlcGF0aHMgPSAob3MucGF0aC5hYnNwYXRoKHBhdGguc3RyaXAoKSkgZm9yIHBhdGggaW4gc3BlYy5zcGxpdCgnLCcpKQogICAgICAgIHJldHVybiAnXG4nLmpvaW4oCiAgICAgICAgICAgIGNscy5fcmVhZF9maWxlKHBhdGgpCiAgICAgICAgICAgIGZvciBwYXRoIGluIGZpbGVwYXRocwogICAgICAgICAgICBpZiAoY2xzLl9hc3NlcnRfbG9jYWwocGF0aCkgb3IgVHJ1ZSkKICAgICAgICAgICAgYW5kIG9zLnBhdGguaXNmaWxlKHBhdGgpCiAgICAgICAgKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfYXNzZXJ0X2xvY2FsKGZpbGVwYXRoKToKICAgICAgICBpZiBub3QgZmlsZXBhdGguc3RhcnRzd2l0aChvcy5nZXRjd2QoKSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgJ2BmaWxlOmAgZGlyZWN0aXZlIGNhbiBub3QgYWNjZXNzICVzJyAlIGZpbGVwYXRoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcmVhZF9maWxlKGZpbGVwYXRoKToKICAgICAgICB3aXRoIGlvLm9wZW4oZmlsZXBhdGgsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgIHJldHVybiBmLnJlYWQoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9hdHRyKGNscywgdmFsdWUpOgogICAgICAgICIiIlJlcHJlc2VudHMgdmFsdWUgYXMgYSBtb2R1bGUgYXR0cmlidXRlLgoKICAgICAgICBFeGFtcGxlczoKICAgICAgICAgICAgYXR0cjogcGFja2FnZS5hdHRyCiAgICAgICAgICAgIGF0dHI6IHBhY2thZ2UubW9kdWxlLmF0dHIKCiAgICAgICAgOnBhcmFtIHN0ciB2YWx1ZToKICAgICAgICA6cnR5cGU6IHN0cgogICAgICAgICIiIgogICAgICAgIGF0dHJfZGlyZWN0aXZlID0gJ2F0dHI6JwogICAgICAgIGlmIG5vdCB2YWx1ZS5zdGFydHN3aXRoKGF0dHJfZGlyZWN0aXZlKToKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIGF0dHJzX3BhdGggPSB2YWx1ZS5yZXBsYWNlKGF0dHJfZGlyZWN0aXZlLCAnJykuc3RyaXAoKS5zcGxpdCgnLicpCiAgICAgICAgYXR0cl9uYW1lID0gYXR0cnNfcGF0aC5wb3AoKQoKICAgICAgICBtb2R1bGVfbmFtZSA9ICcuJy5qb2luKGF0dHJzX3BhdGgpCiAgICAgICAgbW9kdWxlX25hbWUgPSBtb2R1bGVfbmFtZSBvciAnX19pbml0X18nCgogICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5nZXRjd2QoKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1vZHVsZSA9IGltcG9ydF9tb2R1bGUobW9kdWxlX25hbWUpCiAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihtb2R1bGUsIGF0dHJfbmFtZSkKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc3lzLnBhdGggPSBzeXMucGF0aFsxOl0KCiAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2dldF9wYXJzZXJfY29tcG91bmQoY2xzLCAqcGFyc2VfbWV0aG9kcyk6CiAgICAgICAgIiIiUmV0dXJucyBwYXJzZXIgZnVuY3Rpb24gdG8gcmVwcmVzZW50cyB2YWx1ZSBhcyBhIGxpc3QuCgogICAgICAgIFBhcnNlcyBhIHZhbHVlIGFwcGx5aW5nIGdpdmVuIG1ldGhvZHMgb25lIGFmdGVyIGFub3RoZXIuCgogICAgICAgIDpwYXJhbSBwYXJzZV9tZXRob2RzOgogICAgICAgIDpydHlwZTogY2FsbGFibGUKICAgICAgICAiIiIKICAgICAgICBkZWYgcGFyc2UodmFsdWUpOgogICAgICAgICAgICBwYXJzZWQgPSB2YWx1ZQoKICAgICAgICAgICAgZm9yIG1ldGhvZCBpbiBwYXJzZV9tZXRob2RzOgogICAgICAgICAgICAgICAgcGFyc2VkID0gbWV0aG9kKHBhcnNlZCkKCiAgICAgICAgICAgIHJldHVybiBwYXJzZWQKCiAgICAgICAgcmV0dXJuIHBhcnNlCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX3NlY3Rpb25fdG9fZGljdChjbHMsIHNlY3Rpb25fb3B0aW9ucywgdmFsdWVzX3BhcnNlcj1Ob25lKToKICAgICAgICAiIiJQYXJzZXMgc2VjdGlvbiBvcHRpb25zIGludG8gYSBkaWN0aW9uYXJ5LgoKICAgICAgICBPcHRpb25hbGx5IGFwcGxpZXMgYSBnaXZlbiBwYXJzZXIgdG8gdmFsdWVzLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgOnBhcmFtIGNhbGxhYmxlIHZhbHVlc19wYXJzZXI6CiAgICAgICAgOnJ0eXBlOiBkaWN0CiAgICAgICAgIiIiCiAgICAgICAgdmFsdWUgPSB7fQogICAgICAgIHZhbHVlc19wYXJzZXIgPSB2YWx1ZXNfcGFyc2VyIG9yIChsYW1iZGEgdmFsOiB2YWwpCiAgICAgICAgZm9yIGtleSwgKF8sIHZhbCkgaW4gc2VjdGlvbl9vcHRpb25zLml0ZW1zKCk6CiAgICAgICAgICAgIHZhbHVlW2tleV0gPSB2YWx1ZXNfcGFyc2VyKHZhbCkKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbihzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIGZvciAobmFtZSwgKF8sIHZhbHVlKSkgaW4gc2VjdGlvbl9vcHRpb25zLml0ZW1zKCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSB2YWx1ZQoKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcGFzcyAgIyBLZWVwIHNpbGVudCBmb3IgYSBuZXcgb3B0aW9uIG1heSBhcHBlYXIgYW55dGltZS4KCiAgICBkZWYgcGFyc2Uoc2VsZik6CiAgICAgICAgIiIiUGFyc2VzIGNvbmZpZ3VyYXRpb24gZmlsZSBpdGVtcyBmcm9tIG9uZQogICAgICAgIG9yIG1vcmUgcmVsYXRlZCBzZWN0aW9ucy4KCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHNlY3Rpb25fbmFtZSwgc2VjdGlvbl9vcHRpb25zIGluIHNlbGYuc2VjdGlvbnMuaXRlbXMoKToKCiAgICAgICAgICAgIG1ldGhvZF9wb3N0Zml4ID0gJycKICAgICAgICAgICAgaWYgc2VjdGlvbl9uYW1lOiAgIyBbc2VjdGlvbi5vcHRpb25dIHZhcmlhbnQKICAgICAgICAgICAgICAgIG1ldGhvZF9wb3N0Zml4ID0gJ18lcycgJSBzZWN0aW9uX25hbWUKCiAgICAgICAgICAgIHNlY3Rpb25fcGFyc2VyX21ldGhvZCA9IGdldGF0dHIoCiAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgIyBEb3RzIGluIHNlY3Rpb24gbmFtZXMgYXJlIHRyYW5sc2F0ZWQgaW50byBkdW5kZXJzY29yZXMuCiAgICAgICAgICAgICAgICAoJ3BhcnNlX3NlY3Rpb24lcycgJSBtZXRob2RfcG9zdGZpeCkucmVwbGFjZSgnLicsICdfXycpLAogICAgICAgICAgICAgICAgTm9uZSkKCiAgICAgICAgICAgIGlmIHNlY3Rpb25fcGFyc2VyX21ldGhvZCBpcyBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ1Vuc3VwcG9ydGVkIGRpc3RyaWJ1dGlvbiBvcHRpb24gc2VjdGlvbjogWyVzLiVzXScgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VjdGlvbl9wcmVmaXgsIHNlY3Rpb25fbmFtZSkpCgogICAgICAgICAgICBzZWN0aW9uX3BhcnNlcl9tZXRob2Qoc2VjdGlvbl9vcHRpb25zKQoKCmNsYXNzIENvbmZpZ01ldGFkYXRhSGFuZGxlcihDb25maWdIYW5kbGVyKToKCiAgICBzZWN0aW9uX3ByZWZpeCA9ICdtZXRhZGF0YScKCiAgICBhbGlhc2VzID0gewogICAgICAgICdob21lX3BhZ2UnOiAndXJsJywKICAgICAgICAnc3VtbWFyeSc6ICdkZXNjcmlwdGlvbicsCiAgICAgICAgJ2NsYXNzaWZpZXInOiAnY2xhc3NpZmllcnMnLAogICAgICAgICdwbGF0Zm9ybSc6ICdwbGF0Zm9ybXMnLAogICAgfQoKICAgIHN0cmljdF9tb2RlID0gRmFsc2UKICAgICIiIldlIG5lZWQgdG8ga2VlcCBpdCBsb29zZSwgdG8gYmUgcGFydGlhbGx5IGNvbXBhdGlibGUgd2l0aAogICAgYHBicmAgYW5kIGBkMnRvMWAgcGFja2FnZXMgd2hpY2ggYWxzbyB1c2VzIGBtZXRhZGF0YWAgc2VjdGlvbi4KCiAgICAiIiIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXJzZXJzKHNlbGYpOgogICAgICAgICIiIk1ldGFkYXRhIGl0ZW0gbmFtZSB0byBwYXJzZXIgZnVuY3Rpb24gbWFwcGluZy4iIiIKICAgICAgICBwYXJzZV9saXN0ID0gc2VsZi5fcGFyc2VfbGlzdAogICAgICAgIHBhcnNlX2ZpbGUgPSBzZWxmLl9wYXJzZV9maWxlCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICdwbGF0Zm9ybXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAna2V5d29yZHMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAncHJvdmlkZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAncmVxdWlyZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnb2Jzb2xldGVzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2NsYXNzaWZpZXJzJzogc2VsZi5fZ2V0X3BhcnNlcl9jb21wb3VuZChwYXJzZV9maWxlLCBwYXJzZV9saXN0KSwKICAgICAgICAgICAgJ2xpY2Vuc2UnOiBwYXJzZV9maWxlLAogICAgICAgICAgICAnZGVzY3JpcHRpb24nOiBwYXJzZV9maWxlLAogICAgICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbic6IHBhcnNlX2ZpbGUsCiAgICAgICAgICAgICd2ZXJzaW9uJzogc2VsZi5fcGFyc2VfdmVyc2lvbiwKICAgICAgICB9CgogICAgZGVmIF9wYXJzZV92ZXJzaW9uKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiJQYXJzZXMgYHZlcnNpb25gIG9wdGlvbiB2YWx1ZS4KCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgIDpydHlwZTogc3RyCgogICAgICAgICIiIgogICAgICAgIHZlcnNpb24gPSBzZWxmLl9wYXJzZV9hdHRyKHZhbHVlKQoKICAgICAgICBpZiBjYWxsYWJsZSh2ZXJzaW9uKToKICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24oKQoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBpZiBoYXNhdHRyKHZlcnNpb24sICdfX2l0ZXJfXycpOgogICAgICAgICAgICAgICAgdmVyc2lvbiA9ICcuJy5qb2luKG1hcChzdHIsIHZlcnNpb24pKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmVyc2lvbiA9ICclcycgJSB2ZXJzaW9uCgogICAgICAgIHJldHVybiB2ZXJzaW9uCgoKY2xhc3MgQ29uZmlnT3B0aW9uc0hhbmRsZXIoQ29uZmlnSGFuZGxlcik6CgogICAgc2VjdGlvbl9wcmVmaXggPSAnb3B0aW9ucycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXJzZXJzKHNlbGYpOgogICAgICAgICIiIk1ldGFkYXRhIGl0ZW0gbmFtZSB0byBwYXJzZXIgZnVuY3Rpb24gbWFwcGluZy4iIiIKICAgICAgICBwYXJzZV9saXN0ID0gc2VsZi5fcGFyc2VfbGlzdAogICAgICAgIHBhcnNlX2xpc3Rfc2VtaWNvbG9uID0gcGFydGlhbChzZWxmLl9wYXJzZV9saXN0LCBzZXBhcmF0b3I9JzsnKQogICAgICAgIHBhcnNlX2Jvb2wgPSBzZWxmLl9wYXJzZV9ib29sCiAgICAgICAgcGFyc2VfZGljdCA9IHNlbGYuX3BhcnNlX2RpY3QKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJ3ppcF9zYWZlJzogcGFyc2VfYm9vbCwKICAgICAgICAgICAgJ3VzZV8ydG8zJzogcGFyc2VfYm9vbCwKICAgICAgICAgICAgJ2luY2x1ZGVfcGFja2FnZV9kYXRhJzogcGFyc2VfYm9vbCwKICAgICAgICAgICAgJ3BhY2thZ2VfZGlyJzogcGFyc2VfZGljdCwKICAgICAgICAgICAgJ3VzZV8ydG8zX2ZpeGVycyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICd1c2VfMnRvM19leGNsdWRlX2ZpeGVycyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdjb252ZXJ0XzJ0bzNfZG9jdGVzdHMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnc2NyaXB0cyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdlYWdlcl9yZXNvdXJjZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnZGVwZW5kZW5jeV9saW5rcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICduYW1lc3BhY2VfcGFja2FnZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnaW5zdGFsbF9yZXF1aXJlcyc6IHBhcnNlX2xpc3Rfc2VtaWNvbG9uLAogICAgICAgICAgICAnc2V0dXBfcmVxdWlyZXMnOiBwYXJzZV9saXN0X3NlbWljb2xvbiwKICAgICAgICAgICAgJ3Rlc3RzX3JlcXVpcmUnOiBwYXJzZV9saXN0X3NlbWljb2xvbiwKICAgICAgICAgICAgJ3BhY2thZ2VzJzogc2VsZi5fcGFyc2VfcGFja2FnZXMsCiAgICAgICAgICAgICdlbnRyeV9wb2ludHMnOiBzZWxmLl9wYXJzZV9maWxlLAogICAgICAgICAgICAncHlfbW9kdWxlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgfQoKICAgIGRlZiBfcGFyc2VfcGFja2FnZXMoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIlBhcnNlcyBgcGFja2FnZXNgIG9wdGlvbiB2YWx1ZS4KCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgIDpydHlwZTogbGlzdAogICAgICAgICIiIgogICAgICAgIGZpbmRfZGlyZWN0aXZlID0gJ2ZpbmQ6JwoKICAgICAgICBpZiBub3QgdmFsdWUuc3RhcnRzd2l0aChmaW5kX2RpcmVjdGl2ZSk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZV9saXN0KHZhbHVlKQoKICAgICAgICAjIFJlYWQgZnVuY3Rpb24gYXJndW1lbnRzIGZyb20gYSBkZWRpY2F0ZWQgc2VjdGlvbi4KICAgICAgICBmaW5kX2t3YXJncyA9IHNlbGYucGFyc2Vfc2VjdGlvbl9wYWNrYWdlc19fZmluZCgKICAgICAgICAgICAgc2VsZi5zZWN0aW9ucy5nZXQoJ3BhY2thZ2VzLmZpbmQnLCB7fSkpCgogICAgICAgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgZmluZF9wYWNrYWdlcwoKICAgICAgICByZXR1cm4gZmluZF9wYWNrYWdlcygqKmZpbmRfa3dhcmdzKQoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX3BhY2thZ2VzX19maW5kKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBwYWNrYWdlcy5maW5kYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgVG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIF9wYXJzZV9wYWNrYWdlcygpLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgc2VjdGlvbl9kYXRhID0gc2VsZi5fcGFyc2Vfc2VjdGlvbl90b19kaWN0KAogICAgICAgICAgICBzZWN0aW9uX29wdGlvbnMsIHNlbGYuX3BhcnNlX2xpc3QpCgogICAgICAgIHZhbGlkX2tleXMgPSBbJ3doZXJlJywgJ2luY2x1ZGUnLCAnZXhjbHVkZSddCgogICAgICAgIGZpbmRfa3dhcmdzID0gZGljdCgKICAgICAgICAgICAgWyhrLCB2KSBmb3IgaywgdiBpbiBzZWN0aW9uX2RhdGEuaXRlbXMoKSBpZiBrIGluIHZhbGlkX2tleXMgYW5kIHZdKQoKICAgICAgICB3aGVyZSA9IGZpbmRfa3dhcmdzLmdldCgnd2hlcmUnKQogICAgICAgIGlmIHdoZXJlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmaW5kX2t3YXJnc1snd2hlcmUnXSA9IHdoZXJlWzBdICAjIGNhc3QgbGlzdCB0byBzaW5nbGUgdmFsCgogICAgICAgIHJldHVybiBmaW5kX2t3YXJncwoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX2VudHJ5X3BvaW50cyhzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBgZW50cnlfcG9pbnRzYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIHBhcnNlZCA9IHNlbGYuX3BhcnNlX3NlY3Rpb25fdG9fZGljdChzZWN0aW9uX29wdGlvbnMsIHNlbGYuX3BhcnNlX2xpc3QpCiAgICAgICAgc2VsZlsnZW50cnlfcG9pbnRzJ10gPSBwYXJzZWQKCiAgICBkZWYgX3BhcnNlX3BhY2thZ2VfZGF0YShzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgIHBhcnNlZCA9IHNlbGYuX3BhcnNlX3NlY3Rpb25fdG9fZGljdChzZWN0aW9uX29wdGlvbnMsIHNlbGYuX3BhcnNlX2xpc3QpCgogICAgICAgIHJvb3QgPSBwYXJzZWQuZ2V0KCcqJykKICAgICAgICBpZiByb290OgogICAgICAgICAgICBwYXJzZWRbJyddID0gcm9vdAogICAgICAgICAgICBkZWwgcGFyc2VkWycqJ10KCiAgICAgICAgcmV0dXJuIHBhcnNlZAoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX3BhY2thZ2VfZGF0YShzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBgcGFja2FnZV9kYXRhYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIHNlbGZbJ3BhY2thZ2VfZGF0YSddID0gc2VsZi5fcGFyc2VfcGFja2FnZV9kYXRhKHNlY3Rpb25fb3B0aW9ucykKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbl9leGNsdWRlX3BhY2thZ2VfZGF0YShzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBgZXhjbHVkZV9wYWNrYWdlX2RhdGFgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgc2VsZlsnZXhjbHVkZV9wYWNrYWdlX2RhdGEnXSA9IHNlbGYuX3BhcnNlX3BhY2thZ2VfZGF0YSgKICAgICAgICAgICAgc2VjdGlvbl9vcHRpb25zKQoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX2V4dHJhc19yZXF1aXJlKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBleHRyYXNfcmVxdWlyZWAgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBwYXJzZV9saXN0ID0gcGFydGlhbChzZWxmLl9wYXJzZV9saXN0LCBzZXBhcmF0b3I9JzsnKQogICAgICAgIHNlbGZbJ2V4dHJhc19yZXF1aXJlJ10gPSBzZWxmLl9wYXJzZV9zZWN0aW9uX3RvX2RpY3QoCiAgICAgICAgICAgIHNlY3Rpb25fb3B0aW9ucywgcGFyc2VfbGlzdCkKUEsDBBQAAAAAAAAAIQAaIgQypwMAAKcDAAAuAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9kZXBfdXRpbC5weWZyb20gZGlzdHV0aWxzLmRlcF91dGlsIGltcG9ydCBuZXdlcl9ncm91cAoKIyB5ZXMsIHRoaXMgaXMgd2FzIGFsbW9zdCBlbnRpcmVseSBjb3B5LXBhc3RlZCBmcm9tCiMgJ25ld2VyX3BhaXJ3aXNlKCknLCB0aGlzIGlzIGp1c3QgYW5vdGhlciBjb252ZW5pZW5jZQojIGZ1bmN0aW9uLgpkZWYgbmV3ZXJfcGFpcndpc2VfZ3JvdXAoc291cmNlc19ncm91cHMsIHRhcmdldHMpOgogICAgIiIiV2FsayBib3RoIGFyZ3VtZW50cyBpbiBwYXJhbGxlbCwgdGVzdGluZyBpZiBlYWNoIHNvdXJjZSBncm91cCBpcyBuZXdlcgogICAgdGhhbiBpdHMgY29ycmVzcG9uZGluZyB0YXJnZXQuIFJldHVybnMgYSBwYWlyIG9mIGxpc3RzIChzb3VyY2VzX2dyb3VwcywKICAgIHRhcmdldHMpIHdoZXJlIHNvdXJjZXMgaXMgbmV3ZXIgdGhhbiB0YXJnZXQsIGFjY29yZGluZyB0byB0aGUgc2VtYW50aWNzCiAgICBvZiAnbmV3ZXJfZ3JvdXAoKScuCiAgICAiIiIKICAgIGlmIGxlbihzb3VyY2VzX2dyb3VwcykgIT0gbGVuKHRhcmdldHMpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIidzb3VyY2VzX2dyb3VwJyBhbmQgJ3RhcmdldHMnIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoIikKCiAgICAjIGJ1aWxkIGEgcGFpciBvZiBsaXN0cyAoc291cmNlc19ncm91cHMsIHRhcmdldHMpIHdoZXJlIHNvdXJjZSBpcyBuZXdlcgogICAgbl9zb3VyY2VzID0gW10KICAgIG5fdGFyZ2V0cyA9IFtdCiAgICBmb3IgaSBpbiByYW5nZShsZW4oc291cmNlc19ncm91cHMpKToKICAgICAgICBpZiBuZXdlcl9ncm91cChzb3VyY2VzX2dyb3Vwc1tpXSwgdGFyZ2V0c1tpXSk6CiAgICAgICAgICAgIG5fc291cmNlcy5hcHBlbmQoc291cmNlc19ncm91cHNbaV0pCiAgICAgICAgICAgIG5fdGFyZ2V0cy5hcHBlbmQodGFyZ2V0c1tpXSkKCiAgICByZXR1cm4gbl9zb3VyY2VzLCBuX3RhcmdldHMKUEsDBBQAAAAAAAAAIQBbKS1qzRYAAM0WAAAtAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9kZXBlbmRzLnB5aW1wb3J0IHN5cwppbXBvcnQgaW1wCmltcG9ydCBtYXJzaGFsCmZyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IFN0cmljdFZlcnNpb24KZnJvbSBpbXAgaW1wb3J0IFBLR19ESVJFQ1RPUlksIFBZX0NPTVBJTEVELCBQWV9TT1VSQ0UsIFBZX0ZST1pFTgoKZnJvbSAucHkzM2NvbXBhdCBpbXBvcnQgQnl0ZWNvZGUKCgpfX2FsbF9fID0gWwogICAgJ1JlcXVpcmUnLCAnZmluZF9tb2R1bGUnLCAnZ2V0X21vZHVsZV9jb25zdGFudCcsICdleHRyYWN0X2NvbnN0YW50JwpdCgoKY2xhc3MgUmVxdWlyZToKICAgICIiIkEgcHJlcmVxdWlzaXRlIHRvIGJ1aWxkaW5nIG9yIGluc3RhbGxpbmcgYSBkaXN0cmlidXRpb24iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcmVxdWVzdGVkX3ZlcnNpb24sIG1vZHVsZSwgaG9tZXBhZ2U9JycsCiAgICAgICAgICAgIGF0dHJpYnV0ZT1Ob25lLCBmb3JtYXQ9Tm9uZSk6CgogICAgICAgIGlmIGZvcm1hdCBpcyBOb25lIGFuZCByZXF1ZXN0ZWRfdmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9ybWF0ID0gU3RyaWN0VmVyc2lvbgoKICAgICAgICBpZiBmb3JtYXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJlcXVlc3RlZF92ZXJzaW9uID0gZm9ybWF0KHJlcXVlc3RlZF92ZXJzaW9uKQogICAgICAgICAgICBpZiBhdHRyaWJ1dGUgaXMgTm9uZToKICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICdfX3ZlcnNpb25fXycKCiAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUobG9jYWxzKCkpCiAgICAgICAgZGVsIHNlbGYuc2VsZgoKICAgIGRlZiBmdWxsX25hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGZ1bGwgcGFja2FnZS9kaXN0cmlidXRpb24gbmFtZSwgdy92ZXJzaW9uIiIiCiAgICAgICAgaWYgc2VsZi5yZXF1ZXN0ZWRfdmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnJlcXVlc3RlZF92ZXJzaW9uKQogICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICBkZWYgdmVyc2lvbl9vayhzZWxmLCB2ZXJzaW9uKToKICAgICAgICAiIiJJcyAndmVyc2lvbicgc3VmZmljaWVudGx5IHVwLXRvLWRhdGU/IiIiCiAgICAgICAgcmV0dXJuIHNlbGYuYXR0cmlidXRlIGlzIE5vbmUgb3Igc2VsZi5mb3JtYXQgaXMgTm9uZSBvciBcCiAgICAgICAgICAgIHN0cih2ZXJzaW9uKSAhPSAidW5rbm93biIgYW5kIHZlcnNpb24gPj0gc2VsZi5yZXF1ZXN0ZWRfdmVyc2lvbgoKICAgIGRlZiBnZXRfdmVyc2lvbihzZWxmLCBwYXRocz1Ob25lLCBkZWZhdWx0PSJ1bmtub3duIik6CiAgICAgICAgIiIiR2V0IHZlcnNpb24gbnVtYmVyIG9mIGluc3RhbGxlZCBtb2R1bGUsICdOb25lJywgb3IgJ2RlZmF1bHQnCgogICAgICAgIFNlYXJjaCAncGF0aHMnIGZvciBtb2R1bGUuICBJZiBub3QgZm91bmQsIHJldHVybiAnTm9uZScuICBJZiBmb3VuZCwKICAgICAgICByZXR1cm4gdGhlIGV4dHJhY3RlZCB2ZXJzaW9uIGF0dHJpYnV0ZSwgb3IgJ2RlZmF1bHQnIGlmIG5vIHZlcnNpb24KICAgICAgICBhdHRyaWJ1dGUgd2FzIHNwZWNpZmllZCwgb3IgdGhlIHZhbHVlIGNhbm5vdCBiZSBkZXRlcm1pbmVkIHdpdGhvdXQKICAgICAgICBpbXBvcnRpbmcgdGhlIG1vZHVsZS4gIFRoZSB2ZXJzaW9uIGlzIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlCiAgICAgICAgcmVxdWlyZW1lbnQncyB2ZXJzaW9uIGZvcm1hdCAoaWYgYW55KSwgdW5sZXNzIGl0IGlzICdOb25lJyBvciB0aGUKICAgICAgICBzdXBwbGllZCAnZGVmYXVsdCcuCiAgICAgICAgIiIiCgogICAgICAgIGlmIHNlbGYuYXR0cmlidXRlIGlzIE5vbmU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGYsIHAsIGkgPSBmaW5kX21vZHVsZShzZWxmLm1vZHVsZSwgcGF0aHMpCiAgICAgICAgICAgICAgICBpZiBmOgogICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgdiA9IGdldF9tb2R1bGVfY29uc3RhbnQoc2VsZi5tb2R1bGUsIHNlbGYuYXR0cmlidXRlLCBkZWZhdWx0LCBwYXRocykKCiAgICAgICAgaWYgdiBpcyBub3QgTm9uZSBhbmQgdiBpcyBub3QgZGVmYXVsdCBhbmQgc2VsZi5mb3JtYXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmZvcm1hdCh2KQoKICAgICAgICByZXR1cm4gdgoKICAgIGRlZiBpc19wcmVzZW50KHNlbGYsIHBhdGhzPU5vbmUpOgogICAgICAgICIiIlJldHVybiB0cnVlIGlmIGRlcGVuZGVuY3kgaXMgcHJlc2VudCBvbiAncGF0aHMnIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X3ZlcnNpb24ocGF0aHMpIGlzIG5vdCBOb25lCgogICAgZGVmIGlzX2N1cnJlbnQoc2VsZiwgcGF0aHM9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgZGVwZW5kZW5jeSBpcyBwcmVzZW50IGFuZCB1cC10by1kYXRlIG9uICdwYXRocyciIiIKICAgICAgICB2ZXJzaW9uID0gc2VsZi5nZXRfdmVyc2lvbihwYXRocykKICAgICAgICBpZiB2ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBzZWxmLnZlcnNpb25fb2sodmVyc2lvbikKCgpkZWYgZmluZF9tb2R1bGUobW9kdWxlLCBwYXRocz1Ob25lKToKICAgICIiIkp1c3QgbGlrZSAnaW1wLmZpbmRfbW9kdWxlKCknLCBidXQgd2l0aCBwYWNrYWdlIHN1cHBvcnQiIiIKCiAgICBwYXJ0cyA9IG1vZHVsZS5zcGxpdCgnLicpCgogICAgd2hpbGUgcGFydHM6CiAgICAgICAgcGFydCA9IHBhcnRzLnBvcCgwKQogICAgICAgIGYsIHBhdGgsIChzdWZmaXgsIG1vZGUsIGtpbmQpID0gaW5mbyA9IGltcC5maW5kX21vZHVsZShwYXJ0LCBwYXRocykKCiAgICAgICAgaWYga2luZCA9PSBQS0dfRElSRUNUT1JZOgogICAgICAgICAgICBwYXJ0cyA9IHBhcnRzIG9yIFsnX19pbml0X18nXQogICAgICAgICAgICBwYXRocyA9IFtwYXRoXQoKICAgICAgICBlbGlmIHBhcnRzOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ2FuJ3QgZmluZCAlciBpbiAlcyIgJSAocGFydHMsIG1vZHVsZSkpCgogICAgcmV0dXJuIGluZm8KCgpkZWYgZ2V0X21vZHVsZV9jb25zdGFudChtb2R1bGUsIHN5bWJvbCwgZGVmYXVsdD0tMSwgcGF0aHM9Tm9uZSk6CiAgICAiIiJGaW5kICdtb2R1bGUnIGJ5IHNlYXJjaGluZyAncGF0aHMnLCBhbmQgZXh0cmFjdCAnc3ltYm9sJwoKICAgIFJldHVybiAnTm9uZScgaWYgJ21vZHVsZScgZG9lcyBub3QgZXhpc3Qgb24gJ3BhdGhzJywgb3IgaXQgZG9lcyBub3QgZGVmaW5lCiAgICAnc3ltYm9sJy4gIElmIHRoZSBtb2R1bGUgZGVmaW5lcyAnc3ltYm9sJyBhcyBhIGNvbnN0YW50LCByZXR1cm4gdGhlCiAgICBjb25zdGFudC4gIE90aGVyd2lzZSwgcmV0dXJuICdkZWZhdWx0Jy4iIiIKCiAgICB0cnk6CiAgICAgICAgZiwgcGF0aCwgKHN1ZmZpeCwgbW9kZSwga2luZCkgPSBmaW5kX21vZHVsZShtb2R1bGUsIHBhdGhzKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICMgTW9kdWxlIGRvZXNuJ3QgZXhpc3QKICAgICAgICByZXR1cm4gTm9uZQoKICAgIHRyeToKICAgICAgICBpZiBraW5kID09IFBZX0NPTVBJTEVEOgogICAgICAgICAgICBmLnJlYWQoOCkgICMgc2tpcCBtYWdpYyAmIGRhdGUKICAgICAgICAgICAgY29kZSA9IG1hcnNoYWwubG9hZChmKQogICAgICAgIGVsaWYga2luZCA9PSBQWV9GUk9aRU46CiAgICAgICAgICAgIGNvZGUgPSBpbXAuZ2V0X2Zyb3plbl9vYmplY3QobW9kdWxlKQogICAgICAgIGVsaWYga2luZCA9PSBQWV9TT1VSQ0U6CiAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGYucmVhZCgpLCBwYXRoLCAnZXhlYycpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBOb3Qgc29tZXRoaW5nIHdlIGNhbiBwYXJzZTsgd2UnbGwgaGF2ZSB0byBpbXBvcnQgaXQuICA6KAogICAgICAgICAgICBpZiBtb2R1bGUgbm90IGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICAgICAgaW1wLmxvYWRfbW9kdWxlKG1vZHVsZSwgZiwgcGF0aCwgKHN1ZmZpeCwgbW9kZSwga2luZCkpCiAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHN5cy5tb2R1bGVzW21vZHVsZV0sIHN5bWJvbCwgTm9uZSkKCiAgICBmaW5hbGx5OgogICAgICAgIGlmIGY6CiAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgIHJldHVybiBleHRyYWN0X2NvbnN0YW50KGNvZGUsIHN5bWJvbCwgZGVmYXVsdCkKCgpkZWYgZXh0cmFjdF9jb25zdGFudChjb2RlLCBzeW1ib2wsIGRlZmF1bHQ9LTEpOgogICAgIiIiRXh0cmFjdCB0aGUgY29uc3RhbnQgdmFsdWUgb2YgJ3N5bWJvbCcgZnJvbSAnY29kZScKCiAgICBJZiB0aGUgbmFtZSAnc3ltYm9sJyBpcyBib3VuZCB0byBhIGNvbnN0YW50IHZhbHVlIGJ5IHRoZSBQeXRob24gY29kZQogICAgb2JqZWN0ICdjb2RlJywgcmV0dXJuIHRoYXQgdmFsdWUuICBJZiAnc3ltYm9sJyBpcyBib3VuZCB0byBhbiBleHByZXNzaW9uLAogICAgcmV0dXJuICdkZWZhdWx0Jy4gIE90aGVyd2lzZSwgcmV0dXJuICdOb25lJy4KCiAgICBSZXR1cm4gdmFsdWUgaXMgYmFzZWQgb24gdGhlIGZpcnN0IGFzc2lnbm1lbnQgdG8gJ3N5bWJvbCcuICAnc3ltYm9sJyBtdXN0CiAgICBiZSBhIGdsb2JhbCwgb3IgYXQgbGVhc3QgYSBub24tImZhc3QiIGxvY2FsIGluIHRoZSBjb2RlIGJsb2NrLiAgVGhhdCBpcywKICAgIG9ubHkgJ1NUT1JFX05BTUUnIGFuZCAnU1RPUkVfR0xPQkFMJyBvcGNvZGVzIGFyZSBjaGVja2VkLCBhbmQgJ3N5bWJvbCcKICAgIG11c3QgYmUgcHJlc2VudCBpbiAnY29kZS5jb19uYW1lcycuCiAgICAiIiIKICAgIGlmIHN5bWJvbCBub3QgaW4gY29kZS5jb19uYW1lczoKICAgICAgICAjIG5hbWUncyBub3QgdGhlcmUsIGNhbid0IHBvc3NpYmx5IGJlIGFuIGFzc2lnbm1lbnQKICAgICAgICByZXR1cm4gTm9uZQoKICAgIG5hbWVfaWR4ID0gbGlzdChjb2RlLmNvX25hbWVzKS5pbmRleChzeW1ib2wpCgogICAgU1RPUkVfTkFNRSA9IDkwCiAgICBTVE9SRV9HTE9CQUwgPSA5NwogICAgTE9BRF9DT05TVCA9IDEwMAoKICAgIGNvbnN0ID0gZGVmYXVsdAoKICAgIGZvciBieXRlX2NvZGUgaW4gQnl0ZWNvZGUoY29kZSk6CiAgICAgICAgb3AgPSBieXRlX2NvZGUub3Bjb2RlCiAgICAgICAgYXJnID0gYnl0ZV9jb2RlLmFyZwoKICAgICAgICBpZiBvcCA9PSBMT0FEX0NPTlNUOgogICAgICAgICAgICBjb25zdCA9IGNvZGUuY29fY29uc3RzW2FyZ10KICAgICAgICBlbGlmIGFyZyA9PSBuYW1lX2lkeCBhbmQgKG9wID09IFNUT1JFX05BTUUgb3Igb3AgPT0gU1RPUkVfR0xPQkFMKToKICAgICAgICAgICAgcmV0dXJuIGNvbnN0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29uc3QgPSBkZWZhdWx0CgoKZGVmIF91cGRhdGVfZ2xvYmFscygpOgogICAgIiIiCiAgICBQYXRjaCB0aGUgZ2xvYmFscyB0byByZW1vdmUgdGhlIG9iamVjdHMgbm90IGF2YWlsYWJsZSBvbiBzb21lIHBsYXRmb3Jtcy4KCiAgICBYWFggaXQnZCBiZSBiZXR0ZXIgdG8gdGVzdCBhc3NlcnRpb25zIGFib3V0IGJ5dGVjb2RlIGluc3RlYWQuCiAgICAiIiIKCiAgICBpZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKSBhbmQgc3lzLnBsYXRmb3JtICE9ICdjbGknOgogICAgICAgIHJldHVybgogICAgaW5jb21wYXRpYmxlID0gJ2V4dHJhY3RfY29uc3RhbnQnLCAnZ2V0X21vZHVsZV9jb25zdGFudCcKICAgIGZvciBuYW1lIGluIGluY29tcGF0aWJsZToKICAgICAgICBkZWwgZ2xvYmFscygpW25hbWVdCiAgICAgICAgX19hbGxfXy5yZW1vdmUobmFtZSkKCgpfdXBkYXRlX2dsb2JhbHMoKQpQSwMEFAAAAAAAAAAhACV0hwWQnQAAkJ0AACoAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2Rpc3QucHlfX2FsbF9fID0gWydEaXN0cmlidXRpb24nXQoKaW1wb3J0IHJlCmltcG9ydCBvcwppbXBvcnQgd2FybmluZ3MKaW1wb3J0IG51bWJlcnMKaW1wb3J0IGRpc3R1dGlscy5sb2cKaW1wb3J0IGRpc3R1dGlscy5jb3JlCmltcG9ydCBkaXN0dXRpbHMuY21kCmltcG9ydCBkaXN0dXRpbHMuZGlzdAppbXBvcnQgaXRlcnRvb2xzCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKAogICAgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIERpc3R1dGlsc1NldHVwRXJyb3IsCikKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgcmZjODIyX2VzY2FwZQoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAsIGZpbHRlciwgZmlsdGVyZmFsc2UKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybiBpbXBvcnQgcGFja2FnaW5nCgpmcm9tIHNldHVwdG9vbHMuZGVwZW5kcyBpbXBvcnQgUmVxdWlyZQpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHdpbmRvd3Nfc3VwcG9ydApmcm9tIHNldHVwdG9vbHMubW9ua2V5IGltcG9ydCBnZXRfdW5wYXRjaGVkCmZyb20gc2V0dXB0b29scy5jb25maWcgaW1wb3J0IHBhcnNlX2NvbmZpZ3VyYXRpb24KaW1wb3J0IHBrZ19yZXNvdXJjZXMKZnJvbSAucHkzNmNvbXBhdCBpbXBvcnQgRGlzdHJpYnV0aW9uX3BhcnNlX2NvbmZpZ19maWxlcwoKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLnNwZWNpZmllcnMnKQpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcudmVyc2lvbicpCgoKZGVmIF9nZXRfdW5wYXRjaGVkKGNscyk6CiAgICB3YXJuaW5ncy53YXJuKCJEbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIiwgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgcmV0dXJuIGdldF91bnBhdGNoZWQoY2xzKQoKCiMgQmFzZWQgb24gUHl0aG9uIDMuNSB2ZXJzaW9uCmRlZiB3cml0ZV9wa2dfZmlsZShzZWxmLCBmaWxlKToKICAgICIiIldyaXRlIHRoZSBQS0ctSU5GTyBmb3JtYXQgZGF0YSB0byBhIGZpbGUgb2JqZWN0LgogICAgIiIiCiAgICB2ZXJzaW9uID0gJzEuMCcKICAgIGlmIChzZWxmLnByb3ZpZGVzIG9yIHNlbGYucmVxdWlyZXMgb3Igc2VsZi5vYnNvbGV0ZXMgb3IKICAgICAgICAgICAgc2VsZi5jbGFzc2lmaWVycyBvciBzZWxmLmRvd25sb2FkX3VybCk6CiAgICAgICAgdmVyc2lvbiA9ICcxLjEnCiAgICAjIFNldHVwdG9vbHMgc3BlY2lmaWMgZm9yIFBFUCAzNDUKICAgIGlmIGhhc2F0dHIoc2VsZiwgJ3B5dGhvbl9yZXF1aXJlcycpOgogICAgICAgIHZlcnNpb24gPSAnMS4yJwoKICAgIGZpbGUud3JpdGUoJ01ldGFkYXRhLVZlcnNpb246ICVzXG4nICUgdmVyc2lvbikKICAgIGZpbGUud3JpdGUoJ05hbWU6ICVzXG4nICUgc2VsZi5nZXRfbmFtZSgpKQogICAgZmlsZS53cml0ZSgnVmVyc2lvbjogJXNcbicgJSBzZWxmLmdldF92ZXJzaW9uKCkpCiAgICBmaWxlLndyaXRlKCdTdW1tYXJ5OiAlc1xuJyAlIHNlbGYuZ2V0X2Rlc2NyaXB0aW9uKCkpCiAgICBmaWxlLndyaXRlKCdIb21lLXBhZ2U6ICVzXG4nICUgc2VsZi5nZXRfdXJsKCkpCiAgICBmaWxlLndyaXRlKCdBdXRob3I6ICVzXG4nICUgc2VsZi5nZXRfY29udGFjdCgpKQogICAgZmlsZS53cml0ZSgnQXV0aG9yLWVtYWlsOiAlc1xuJyAlIHNlbGYuZ2V0X2NvbnRhY3RfZW1haWwoKSkKICAgIGZpbGUud3JpdGUoJ0xpY2Vuc2U6ICVzXG4nICUgc2VsZi5nZXRfbGljZW5zZSgpKQogICAgaWYgc2VsZi5kb3dubG9hZF91cmw6CiAgICAgICAgZmlsZS53cml0ZSgnRG93bmxvYWQtVVJMOiAlc1xuJyAlIHNlbGYuZG93bmxvYWRfdXJsKQoKICAgIGxvbmdfZGVzY19jb250ZW50X3R5cGUgPSBnZXRhdHRyKAogICAgICAgIHNlbGYsCiAgICAgICAgJ2xvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlJywKICAgICAgICBOb25lCiAgICApIG9yICdVTktOT1dOJwogICAgZmlsZS53cml0ZSgnRGVzY3JpcHRpb24tQ29udGVudC1UeXBlOiAlc1xuJyAlIGxvbmdfZGVzY19jb250ZW50X3R5cGUpCgogICAgbG9uZ19kZXNjID0gcmZjODIyX2VzY2FwZShzZWxmLmdldF9sb25nX2Rlc2NyaXB0aW9uKCkpCiAgICBmaWxlLndyaXRlKCdEZXNjcmlwdGlvbjogJXNcbicgJSBsb25nX2Rlc2MpCgogICAga2V5d29yZHMgPSAnLCcuam9pbihzZWxmLmdldF9rZXl3b3JkcygpKQogICAgaWYga2V5d29yZHM6CiAgICAgICAgZmlsZS53cml0ZSgnS2V5d29yZHM6ICVzXG4nICUga2V5d29yZHMpCgogICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnUGxhdGZvcm0nLCBzZWxmLmdldF9wbGF0Zm9ybXMoKSkKICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ0NsYXNzaWZpZXInLCBzZWxmLmdldF9jbGFzc2lmaWVycygpKQoKICAgICMgUEVQIDMxNAogICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnUmVxdWlyZXMnLCBzZWxmLmdldF9yZXF1aXJlcygpKQogICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnUHJvdmlkZXMnLCBzZWxmLmdldF9wcm92aWRlcygpKQogICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnT2Jzb2xldGVzJywgc2VsZi5nZXRfb2Jzb2xldGVzKCkpCgogICAgIyBTZXR1cHRvb2xzIHNwZWNpZmljIGZvciBQRVAgMzQ1CiAgICBpZiBoYXNhdHRyKHNlbGYsICdweXRob25fcmVxdWlyZXMnKToKICAgICAgICBmaWxlLndyaXRlKCdSZXF1aXJlcy1QeXRob246ICVzXG4nICUgc2VsZi5weXRob25fcmVxdWlyZXMpCgoKIyBmcm9tIFB5dGhvbiAzLjQKZGVmIHdyaXRlX3BrZ19pbmZvKHNlbGYsIGJhc2VfZGlyKToKICAgICIiIldyaXRlIHRoZSBQS0ctSU5GTyBmaWxlIGludG8gdGhlIHJlbGVhc2UgdHJlZS4KICAgICIiIgogICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihiYXNlX2RpciwgJ1BLRy1JTkZPJyksICd3JywKICAgICAgICAgICAgICBlbmNvZGluZz0nVVRGLTgnKSBhcyBwa2dfaW5mbzoKICAgICAgICBzZWxmLndyaXRlX3BrZ19maWxlKHBrZ19pbmZvKQoKCnNlcXVlbmNlID0gdHVwbGUsIGxpc3QKCgpkZWYgY2hlY2tfaW1wb3J0YWJsZShkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICB0cnk6CiAgICAgICAgZXAgPSBwa2dfcmVzb3VyY2VzLkVudHJ5UG9pbnQucGFyc2UoJ3g9JyArIHZhbHVlKQogICAgICAgIGFzc2VydCBub3QgZXAuZXh0cmFzCiAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IsIEFzc2VydGlvbkVycm9yKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAiJXIgbXVzdCBiZSBpbXBvcnRhYmxlICdtb2R1bGU6YXR0cnMnIHN0cmluZyAoZ290ICVyKSIKICAgICAgICAgICAgJSAoYXR0ciwgdmFsdWUpCiAgICAgICAgKQoKCmRlZiBhc3NlcnRfc3RyaW5nX2xpc3QoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgdmFsdWUgaXMgYSBzdHJpbmcgbGlzdCBvciBOb25lIiIiCiAgICB0cnk6CiAgICAgICAgYXNzZXJ0ICcnLmpvaW4odmFsdWUpICE9IHZhbHVlCiAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IsIEFzc2VydGlvbkVycm9yKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAiJXIgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncyAoZ290ICVyKSIgJSAoYXR0ciwgdmFsdWUpCiAgICAgICAgKQoKCmRlZiBjaGVja19uc3AoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgbmFtZXNwYWNlIHBhY2thZ2VzIGFyZSB2YWxpZCIiIgogICAgbnNfcGFja2FnZXMgPSB2YWx1ZQogICAgYXNzZXJ0X3N0cmluZ19saXN0KGRpc3QsIGF0dHIsIG5zX3BhY2thZ2VzKQogICAgZm9yIG5zcCBpbiBuc19wYWNrYWdlczoKICAgICAgICBpZiBub3QgZGlzdC5oYXNfY29udGVudHNfZm9yKG5zcCk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiRGlzdHJpYnV0aW9uIGNvbnRhaW5zIG5vIG1vZHVsZXMgb3IgcGFja2FnZXMgZm9yICIgKwogICAgICAgICAgICAgICAgIm5hbWVzcGFjZSBwYWNrYWdlICVyIiAlIG5zcAogICAgICAgICAgICApCiAgICAgICAgcGFyZW50LCBzZXAsIGNoaWxkID0gbnNwLnJwYXJ0aXRpb24oJy4nKQogICAgICAgIGlmIHBhcmVudCBhbmQgcGFyZW50IG5vdCBpbiBuc19wYWNrYWdlczoKICAgICAgICAgICAgZGlzdHV0aWxzLmxvZy53YXJuKAogICAgICAgICAgICAgICAgIldBUk5JTkc6ICVyIGlzIGRlY2xhcmVkIGFzIGEgcGFja2FnZSBuYW1lc3BhY2UsIGJ1dCAlciIKICAgICAgICAgICAgICAgICIgaXMgbm90OiBwbGVhc2UgY29ycmVjdCB0aGlzIGluIHNldHVwLnB5IiwgbnNwLCBwYXJlbnQKICAgICAgICAgICAgKQoKCmRlZiBjaGVja19leHRyYXMoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgZXh0cmFzX3JlcXVpcmUgbWFwcGluZyBpcyB2YWxpZCIiIgogICAgdHJ5OgogICAgICAgIGxpc3QoaXRlcnRvb2xzLnN0YXJtYXAoX2NoZWNrX2V4dHJhLCB2YWx1ZS5pdGVtcygpKSkKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgIidleHRyYXNfcmVxdWlyZScgbXVzdCBiZSBhIGRpY3Rpb25hcnkgd2hvc2UgdmFsdWVzIGFyZSAiCiAgICAgICAgICAgICJzdHJpbmdzIG9yIGxpc3RzIG9mIHN0cmluZ3MgY29udGFpbmluZyB2YWxpZCBwcm9qZWN0L3ZlcnNpb24gIgogICAgICAgICAgICAicmVxdWlyZW1lbnQgc3BlY2lmaWVycy4iCiAgICAgICAgKQoKCmRlZiBfY2hlY2tfZXh0cmEoZXh0cmEsIHJlcXMpOgogICAgbmFtZSwgc2VwLCBtYXJrZXIgPSBleHRyYS5wYXJ0aXRpb24oJzonKQogICAgaWYgbWFya2VyIGFuZCBwa2dfcmVzb3VyY2VzLmludmFsaWRfbWFya2VyKG1hcmtlcik6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigiSW52YWxpZCBlbnZpcm9ubWVudCBtYXJrZXI6ICIgKyBtYXJrZXIpCiAgICBsaXN0KHBrZ19yZXNvdXJjZXMucGFyc2VfcmVxdWlyZW1lbnRzKHJlcXMpKQoKCmRlZiBhc3NlcnRfYm9vbChkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCB2YWx1ZSBpcyBUcnVlLCBGYWxzZSwgMCwgb3IgMSIiIgogICAgaWYgYm9vbCh2YWx1ZSkgIT0gdmFsdWU6CiAgICAgICAgdG1wbCA9ICJ7YXR0ciFyfSBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZSAoZ290IHt2YWx1ZSFyfSkiCiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcih0bXBsLmZvcm1hdChhdHRyPWF0dHIsIHZhbHVlPXZhbHVlKSkKCgpkZWYgY2hlY2tfcmVxdWlyZW1lbnRzKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IGluc3RhbGxfcmVxdWlyZXMgaXMgYSB2YWxpZCByZXF1aXJlbWVudHMgbGlzdCIiIgogICAgdHJ5OgogICAgICAgIGxpc3QocGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHModmFsdWUpKQogICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChkaWN0LCBzZXQpKToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJVbm9yZGVyZWQgdHlwZXMgYXJlIG5vdCBhbGxvd2VkIikKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKSBhcyBlcnJvcjoKICAgICAgICB0bXBsID0gKAogICAgICAgICAgICAie2F0dHIhcn0gbXVzdCBiZSBhIHN0cmluZyBvciBsaXN0IG9mIHN0cmluZ3MgIgogICAgICAgICAgICAiY29udGFpbmluZyB2YWxpZCBwcm9qZWN0L3ZlcnNpb24gcmVxdWlyZW1lbnQgc3BlY2lmaWVyczsge2Vycm9yfSIKICAgICAgICApCiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcih0bXBsLmZvcm1hdChhdHRyPWF0dHIsIGVycm9yPWVycm9yKSkKCgpkZWYgY2hlY2tfc3BlY2lmaWVyKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIGEgdmFsaWQgdmVyc2lvbiBzcGVjaWZpZXIiIiIKICAgIHRyeToKICAgICAgICBwYWNrYWdpbmcuc3BlY2lmaWVycy5TcGVjaWZpZXJTZXQodmFsdWUpCiAgICBleGNlcHQgcGFja2FnaW5nLnNwZWNpZmllcnMuSW52YWxpZFNwZWNpZmllciBhcyBlcnJvcjoKICAgICAgICB0bXBsID0gKAogICAgICAgICAgICAie2F0dHIhcn0gbXVzdCBiZSBhIHN0cmluZyAiCiAgICAgICAgICAgICJjb250YWluaW5nIHZhbGlkIHZlcnNpb24gc3BlY2lmaWVyczsge2Vycm9yfSIKICAgICAgICApCiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcih0bXBsLmZvcm1hdChhdHRyPWF0dHIsIGVycm9yPWVycm9yKSkKCgpkZWYgY2hlY2tfZW50cnlfcG9pbnRzKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IGVudHJ5X3BvaW50cyBtYXAgaXMgcGFyc2VhYmxlIiIiCiAgICB0cnk6CiAgICAgICAgcGtnX3Jlc291cmNlcy5FbnRyeVBvaW50LnBhcnNlX21hcCh2YWx1ZSkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcihlKQoKCmRlZiBjaGVja190ZXN0X3N1aXRlKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKCJ0ZXN0X3N1aXRlIG11c3QgYmUgYSBzdHJpbmciKQoKCmRlZiBjaGVja19wYWNrYWdlX2RhdGEoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgdmFsdWUgaXMgYSBkaWN0aW9uYXJ5IG9mIHBhY2thZ2UgbmFtZXMgdG8gZ2xvYiBsaXN0cyIiIgogICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CiAgICAgICAgZm9yIGssIHYgaW4gdmFsdWUuaXRlbXMoKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoaywgc3RyKToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGl0ZXIodikKICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuCiAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgIGF0dHIgKyAiIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgcGFja2FnZSBuYW1lcyB0byBsaXN0cyBvZiAiCiAgICAgICAgIndpbGRjYXJkIHBhdHRlcm5zIgogICAgKQoKCmRlZiBjaGVja19wYWNrYWdlcyhkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICBmb3IgcGtnbmFtZSBpbiB2YWx1ZToKICAgICAgICBpZiBub3QgcmUubWF0Y2gocidcdysoXC5cdyspKicsIHBrZ25hbWUpOgogICAgICAgICAgICBkaXN0dXRpbHMubG9nLndhcm4oCiAgICAgICAgICAgICAgICAiV0FSTklORzogJXIgbm90IGEgdmFsaWQgcGFja2FnZSBuYW1lOyBwbGVhc2UgdXNlIG9ubHkgIgogICAgICAgICAgICAgICAgIi4tc2VwYXJhdGVkIHBhY2thZ2UgbmFtZXMgaW4gc2V0dXAucHkiLCBwa2duYW1lCiAgICAgICAgICAgICkKCgpfRGlzdHJpYnV0aW9uID0gZ2V0X3VucGF0Y2hlZChkaXN0dXRpbHMuY29yZS5EaXN0cmlidXRpb24pCgoKY2xhc3MgRGlzdHJpYnV0aW9uKERpc3RyaWJ1dGlvbl9wYXJzZV9jb25maWdfZmlsZXMsIF9EaXN0cmlidXRpb24pOgogICAgIiIiRGlzdHJpYnV0aW9uIHdpdGggc3VwcG9ydCBmb3IgZmVhdHVyZXMsIHRlc3RzLCBhbmQgcGFja2FnZSBkYXRhCgogICAgVGhpcyBpcyBhbiBlbmhhbmNlZCB2ZXJzaW9uIG9mICdkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24nIHRoYXQKICAgIGVmZmVjdGl2ZWx5IGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgb3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgdG8gJ3NldHVwKCknOgoKICAgICAnaW5zdGFsbF9yZXF1aXJlcycgLS0gYSBzdHJpbmcgb3Igc2VxdWVuY2Ugb2Ygc3RyaW5ncyBzcGVjaWZ5aW5nIHByb2plY3QKICAgICAgICB2ZXJzaW9ucyB0aGF0IHRoZSBkaXN0cmlidXRpb24gcmVxdWlyZXMgd2hlbiBpbnN0YWxsZWQsIGluIHRoZSBmb3JtYXQKICAgICAgICB1c2VkIGJ5ICdwa2dfcmVzb3VyY2VzLnJlcXVpcmUoKScuICBUaGV5IHdpbGwgYmUgaW5zdGFsbGVkCiAgICAgICAgYXV0b21hdGljYWxseSB3aGVuIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZC4gIElmIHlvdSB3aXNoIHRvIHVzZQogICAgICAgIHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgaW4gUHlQSSwgb3Igd2FudCB0byBnaXZlIHlvdXIgdXNlcnMgYW4KICAgICAgICBhbHRlcm5hdGUgZG93bmxvYWQgbG9jYXRpb24sIHlvdSBjYW4gYWRkIGEgJ2ZpbmRfbGlua3MnIG9wdGlvbiB0byB0aGUKICAgICAgICAnW2Vhc3lfaW5zdGFsbF0nIHNlY3Rpb24gb2YgeW91ciBwcm9qZWN0J3MgJ3NldHVwLmNmZycgZmlsZSwgYW5kIHRoZW4KICAgICAgICBzZXR1cHRvb2xzIHdpbGwgc2NhbiB0aGUgbGlzdGVkIHdlYiBwYWdlcyBmb3IgbGlua3MgdGhhdCBzYXRpc2Z5IHRoZQogICAgICAgIHJlcXVpcmVtZW50cy4KCiAgICAgJ2V4dHJhc19yZXF1aXJlJyAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBuYW1lcyBvZiBvcHRpb25hbCAiZXh0cmFzIiB0byB0aGUKICAgICAgICBhZGRpdGlvbmFsIHJlcXVpcmVtZW50KHMpIHRoYXQgdXNpbmcgdGhvc2UgZXh0cmFzIGluY3Vycy4gRm9yIGV4YW1wbGUsCiAgICAgICAgdGhpczo6CgogICAgICAgICAgICBleHRyYXNfcmVxdWlyZSA9IGRpY3QocmVTVCA9IFsiZG9jdXRpbHM+PTAuMyIsICJyZVNUZWRpdCJdKQoKICAgICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYW4gZXh0cmEKICAgICAgICBjYXBhYmlsaXR5IGNhbGxlZCAicmVTVCIsIGJ1dCBpdCBjYW4gb25seSBiZSB1c2VkIGlmIGRvY3V0aWxzIGFuZAogICAgICAgIHJlU1RlZGl0IGFyZSBpbnN0YWxsZWQuICBJZiB0aGUgdXNlciBpbnN0YWxscyB5b3VyIHBhY2thZ2UgdXNpbmcKICAgICAgICBFYXN5SW5zdGFsbCBhbmQgcmVxdWVzdHMgb25lIG9mIHlvdXIgZXh0cmFzLCB0aGUgY29ycmVzcG9uZGluZwogICAgICAgIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIHdpbGwgYmUgaW5zdGFsbGVkIGlmIG5lZWRlZC4KCiAgICAgJ2ZlYXR1cmVzJyAqKmRlcHJlY2F0ZWQqKiAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBvcHRpb24gbmFtZXMgdG8KICAgICAgICAnc2V0dXB0b29scy5GZWF0dXJlJwogICAgICAgIG9iamVjdHMuICBGZWF0dXJlcyBhcmUgYSBwb3J0aW9uIG9mIHRoZSBkaXN0cmlidXRpb24gdGhhdCBjYW4gYmUKICAgICAgICBpbmNsdWRlZCBvciBleGNsdWRlZCBiYXNlZCBvbiB1c2VyIG9wdGlvbnMsIGludGVyLWZlYXR1cmUgZGVwZW5kZW5jaWVzLAogICAgICAgIGFuZCBhdmFpbGFiaWxpdHkgb24gdGhlIGN1cnJlbnQgc3lzdGVtLiAgRXhjbHVkZWQgZmVhdHVyZXMgYXJlIG9taXR0ZWQKICAgICAgICBmcm9tIGFsbCBzZXR1cCBjb21tYW5kcywgaW5jbHVkaW5nIHNvdXJjZSBhbmQgYmluYXJ5IGRpc3RyaWJ1dGlvbnMsIHNvCiAgICAgICAgeW91IGNhbiBjcmVhdGUgbXVsdGlwbGUgZGlzdHJpYnV0aW9ucyBmcm9tIHRoZSBzYW1lIHNvdXJjZSB0cmVlLgogICAgICAgIEZlYXR1cmUgbmFtZXMgc2hvdWxkIGJlIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVycywgZXhjZXB0IHRoYXQgdGhleSBtYXkKICAgICAgICBjb250YWluIHRoZSAnLScgKG1pbnVzKSBzaWduLiAgRmVhdHVyZXMgY2FuIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkCiAgICAgICAgdmlhIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyAnLS13aXRoLVgnIGFuZCAnLS13aXRob3V0LVgnLCB3aGVyZSAnWCcgaXMKICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZS4gIFdoZXRoZXIgYSBmZWF0dXJlIGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQsIGFuZAogICAgICAgIHdoZXRoZXIgeW91IGFyZSBhbGxvd2VkIHRvIGNvbnRyb2wgdGhpcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGlzCiAgICAgICAgZGV0ZXJtaW5lZCBieSB0aGUgRmVhdHVyZSBvYmplY3QuICBTZWUgdGhlICdGZWF0dXJlJyBjbGFzcyBmb3IgbW9yZQogICAgICAgIGluZm9ybWF0aW9uLgoKICAgICAndGVzdF9zdWl0ZScgLS0gdGhlIG5hbWUgb2YgYSB0ZXN0IHN1aXRlIHRvIHJ1biBmb3IgdGhlICd0ZXN0JyBjb21tYW5kLgogICAgICAgIElmIHRoZSB1c2VyIHJ1bnMgJ3B5dGhvbiBzZXR1cC5weSB0ZXN0JywgdGhlIHBhY2thZ2Ugd2lsbCBiZSBpbnN0YWxsZWQsCiAgICAgICAgYW5kIHRoZSBuYW1lZCB0ZXN0IHN1aXRlIHdpbGwgYmUgcnVuLiAgVGhlIGZvcm1hdCBpcyB0aGUgc2FtZSBhcwogICAgICAgIHdvdWxkIGJlIHVzZWQgb24gYSAndW5pdHRlc3QucHknIGNvbW1hbmQgbGluZS4gIFRoYXQgaXMsIGl0IGlzIHRoZQogICAgICAgIGRvdHRlZCBuYW1lIG9mIGFuIG9iamVjdCB0byBpbXBvcnQgYW5kIGNhbGwgdG8gZ2VuZXJhdGUgYSB0ZXN0IHN1aXRlLgoKICAgICAncGFja2FnZV9kYXRhJyAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBwYWNrYWdlIG5hbWVzIHRvIGxpc3RzIG9mIGZpbGVuYW1lcwogICAgICAgIG9yIGdsb2JzIHRvIHVzZSB0byBmaW5kIGRhdGEgZmlsZXMgY29udGFpbmVkIGluIHRoZSBuYW1lZCBwYWNrYWdlcy4KICAgICAgICBJZiB0aGUgZGljdGlvbmFyeSBoYXMgZmlsZW5hbWVzIG9yIGdsb2JzIGxpc3RlZCB1bmRlciAnIiInICh0aGUgZW1wdHkKICAgICAgICBzdHJpbmcpLCB0aG9zZSBuYW1lcyB3aWxsIGJlIHNlYXJjaGVkIGZvciBpbiBldmVyeSBwYWNrYWdlLCBpbiBhZGRpdGlvbgogICAgICAgIHRvIGFueSBuYW1lcyBmb3IgdGhlIHNwZWNpZmljIHBhY2thZ2UuICBEYXRhIGZpbGVzIGZvdW5kIHVzaW5nIHRoZXNlCiAgICAgICAgbmFtZXMvZ2xvYnMgd2lsbCBiZSBpbnN0YWxsZWQgYWxvbmcgd2l0aCB0aGUgcGFja2FnZSwgaW4gdGhlIHNhbWUKICAgICAgICBsb2NhdGlvbiBhcyB0aGUgcGFja2FnZS4gIE5vdGUgdGhhdCBnbG9icyBhcmUgYWxsb3dlZCB0byByZWZlcmVuY2UKICAgICAgICB0aGUgY29udGVudHMgb2Ygbm9uLXBhY2thZ2Ugc3ViZGlyZWN0b3JpZXMsIGFzIGxvbmcgYXMgeW91IHVzZSAnLycgYXMKICAgICAgICBhIHBhdGggc2VwYXJhdG9yLiAgKEdsb2JzIGFyZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0bwogICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIHBhdGhzIGF0IHJ1bnRpbWUuKQoKICAgIEluIGFkZGl0aW9uIHRvIHRoZXNlIG5ldyBrZXl3b3JkcywgdGhpcyBjbGFzcyBhbHNvIGhhcyBzZXZlcmFsIG5ldyBtZXRob2RzCiAgICBmb3IgbWFuaXB1bGF0aW5nIHRoZSBkaXN0cmlidXRpb24ncyBjb250ZW50cy4gIEZvciBleGFtcGxlLCB0aGUgJ2luY2x1ZGUoKScKICAgIGFuZCAnZXhjbHVkZSgpJyBtZXRob2RzIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGluLXBsYWNlIGFkZCBhbmQgc3VidHJhY3QKICAgIGNvbW1hbmRzIHRoYXQgYWRkIG9yIHJlbW92ZSBwYWNrYWdlcywgbW9kdWxlcywgZXh0ZW5zaW9ucywgYW5kIHNvIG9uIGZyb20KICAgIHRoZSBkaXN0cmlidXRpb24uICBUaGV5IGFyZSB1c2VkIGJ5IHRoZSBmZWF0dXJlIHN1YnN5c3RlbSB0byBjb25maWd1cmUgdGhlCiAgICBkaXN0cmlidXRpb24gZm9yIHRoZSBpbmNsdWRlZCBhbmQgZXhjbHVkZWQgZmVhdHVyZXMuCiAgICAiIiIKCiAgICBfcGF0Y2hlZF9kaXN0ID0gTm9uZQoKICAgIGRlZiBwYXRjaF9taXNzaW5nX3BrZ19pbmZvKHNlbGYsIGF0dHJzKToKICAgICAgICAjIEZha2UgdXAgYSByZXBsYWNlbWVudCBmb3IgdGhlIGRhdGEgdGhhdCB3b3VsZCBub3JtYWxseSBjb21lIGZyb20KICAgICAgICAjIFBLRy1JTkZPLCBidXQgd2hpY2ggbWlnaHQgbm90IHlldCBiZSBidWlsdCBpZiB0aGlzIGlzIGEgZnJlc2gKICAgICAgICAjIGNoZWNrb3V0LgogICAgICAgICMKICAgICAgICBpZiBub3QgYXR0cnMgb3IgJ25hbWUnIG5vdCBpbiBhdHRycyBvciAndmVyc2lvbicgbm90IGluIGF0dHJzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBrZXkgPSBwa2dfcmVzb3VyY2VzLnNhZmVfbmFtZShzdHIoYXR0cnNbJ25hbWUnXSkpLmxvd2VyKCkKICAgICAgICBkaXN0ID0gcGtnX3Jlc291cmNlcy53b3JraW5nX3NldC5ieV9rZXkuZ2V0KGtleSkKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lIGFuZCBub3QgZGlzdC5oYXNfbWV0YWRhdGEoJ1BLRy1JTkZPJyk6CiAgICAgICAgICAgIGRpc3QuX3ZlcnNpb24gPSBwa2dfcmVzb3VyY2VzLnNhZmVfdmVyc2lvbihzdHIoYXR0cnNbJ3ZlcnNpb24nXSkpCiAgICAgICAgICAgIHNlbGYuX3BhdGNoZWRfZGlzdCA9IGRpc3QKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYXR0cnM9Tm9uZSk6CiAgICAgICAgaGF2ZV9wYWNrYWdlX2RhdGEgPSBoYXNhdHRyKHNlbGYsICJwYWNrYWdlX2RhdGEiKQogICAgICAgIGlmIG5vdCBoYXZlX3BhY2thZ2VfZGF0YToKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEgPSB7fQogICAgICAgIGF0dHJzID0gYXR0cnMgb3Ige30KICAgICAgICBpZiAnZmVhdHVyZXMnIGluIGF0dHJzIG9yICdyZXF1aXJlX2ZlYXR1cmVzJyBpbiBhdHRyczoKICAgICAgICAgICAgRmVhdHVyZS53YXJuX2RlcHJlY2F0ZWQoKQogICAgICAgIHNlbGYucmVxdWlyZV9mZWF0dXJlcyA9IFtdCiAgICAgICAgc2VsZi5mZWF0dXJlcyA9IHt9CiAgICAgICAgc2VsZi5kaXN0X2ZpbGVzID0gW10KICAgICAgICBzZWxmLnNyY19yb290ID0gYXR0cnMucG9wKCJzcmNfcm9vdCIsIE5vbmUpCiAgICAgICAgc2VsZi5wYXRjaF9taXNzaW5nX3BrZ19pbmZvKGF0dHJzKQogICAgICAgIHNlbGYubG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGUgPSBhdHRycy5nZXQoCiAgICAgICAgICAgICdsb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZScKICAgICAgICApCiAgICAgICAgc2VsZi5kZXBlbmRlbmN5X2xpbmtzID0gYXR0cnMucG9wKCdkZXBlbmRlbmN5X2xpbmtzJywgW10pCiAgICAgICAgc2VsZi5zZXR1cF9yZXF1aXJlcyA9IGF0dHJzLnBvcCgnc2V0dXBfcmVxdWlyZXMnLCBbXSkKICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLnNldHVwX2tleXdvcmRzJyk6CiAgICAgICAgICAgIHZhcnMoc2VsZikuc2V0ZGVmYXVsdChlcC5uYW1lLCBOb25lKQogICAgICAgIF9EaXN0cmlidXRpb24uX19pbml0X18oc2VsZiwgYXR0cnMpCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLm1ldGFkYXRhLnZlcnNpb24sIG51bWJlcnMuTnVtYmVyKToKICAgICAgICAgICAgIyBTb21lIHBlb3BsZSBhcHBhcmVudGx5IHRha2UgInZlcnNpb24gbnVtYmVyIiB0b28gbGl0ZXJhbGx5IDopCiAgICAgICAgICAgIHNlbGYubWV0YWRhdGEudmVyc2lvbiA9IHN0cihzZWxmLm1ldGFkYXRhLnZlcnNpb24pCgogICAgICAgIGlmIHNlbGYubWV0YWRhdGEudmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdmVyID0gcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbihzZWxmLm1ldGFkYXRhLnZlcnNpb24pCiAgICAgICAgICAgICAgICBub3JtYWxpemVkX3ZlcnNpb24gPSBzdHIodmVyKQogICAgICAgICAgICAgICAgaWYgc2VsZi5tZXRhZGF0YS52ZXJzaW9uICE9IG5vcm1hbGl6ZWRfdmVyc2lvbjoKICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgICAgICAgICAiTm9ybWFsaXppbmcgJyVzJyB0byAnJXMnIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGEudmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBzZWxmLm1ldGFkYXRhLnZlcnNpb24gPSBub3JtYWxpemVkX3ZlcnNpb24KICAgICAgICAgICAgZXhjZXB0IChwYWNrYWdpbmcudmVyc2lvbi5JbnZhbGlkVmVyc2lvbiwgVHlwZUVycm9yKToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAgICAgIlRoZSB2ZXJzaW9uIHNwZWNpZmllZCAoJXIpIGlzIGFuIGludmFsaWQgdmVyc2lvbiwgdGhpcyAiCiAgICAgICAgICAgICAgICAgICAgIm1heSBub3Qgd29yayBhcyBleHBlY3RlZCB3aXRoIG5ld2VyIHZlcnNpb25zIG9mICIKICAgICAgICAgICAgICAgICAgICAic2V0dXB0b29scywgcGlwLCBhbmQgUHlQSS4gUGxlYXNlIHNlZSBQRVAgNDQwIGZvciBtb3JlICIKICAgICAgICAgICAgICAgICAgICAiZGV0YWlscy4iICUgc2VsZi5tZXRhZGF0YS52ZXJzaW9uCiAgICAgICAgICAgICAgICApCiAgICAgICAgc2VsZi5fZmluYWxpemVfcmVxdWlyZXMoKQoKICAgIGRlZiBfZmluYWxpemVfcmVxdWlyZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2V0IGBtZXRhZGF0YS5weXRob25fcmVxdWlyZXNgIGFuZCBmaXggZW52aXJvbm1lbnQgbWFya2VycwogICAgICAgIGluIGBpbnN0YWxsX3JlcXVpcmVzYCBhbmQgYGV4dHJhc19yZXF1aXJlYC4KICAgICAgICAiIiIKICAgICAgICBpZiBnZXRhdHRyKHNlbGYsICdweXRob25fcmVxdWlyZXMnLCBOb25lKToKICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS5weXRob25fcmVxdWlyZXMgPSBzZWxmLnB5dGhvbl9yZXF1aXJlcwogICAgICAgIHNlbGYuX2NvbnZlcnRfZXh0cmFzX3JlcXVpcmVtZW50cygpCiAgICAgICAgc2VsZi5fbW92ZV9pbnN0YWxsX3JlcXVpcmVtZW50c19tYXJrZXJzKCkKCiAgICBkZWYgX2NvbnZlcnRfZXh0cmFzX3JlcXVpcmVtZW50cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDb252ZXJ0IHJlcXVpcmVtZW50cyBpbiBgZXh0cmFzX3JlcXVpcmVgIG9mIHRoZSBmb3JtCiAgICAgICAgYCJleHRyYSI6IFsiYmFyYmF6cXV1eDsge21hcmtlcn0iXWAgdG8KICAgICAgICBgImV4dHJhOnttYXJrZXJ9IjogWyJiYXJiYXpxdXV4Il1gLgogICAgICAgICIiIgogICAgICAgIHNwZWNfZXh0X3JlcXMgPSBnZXRhdHRyKHNlbGYsICdleHRyYXNfcmVxdWlyZScsIE5vbmUpIG9yIHt9CiAgICAgICAgc2VsZi5fdG1wX2V4dHJhc19yZXF1aXJlID0gZGVmYXVsdGRpY3QobGlzdCkKICAgICAgICBmb3Igc2VjdGlvbiwgdiBpbiBzcGVjX2V4dF9yZXFzLml0ZW1zKCk6CiAgICAgICAgICAgICMgRG8gbm90IHN0cmlwIGVtcHR5IHNlY3Rpb25zLgogICAgICAgICAgICBzZWxmLl90bXBfZXh0cmFzX3JlcXVpcmVbc2VjdGlvbl0KICAgICAgICAgICAgZm9yIHIgaW4gcGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHModik6CiAgICAgICAgICAgICAgICBzdWZmaXggPSBzZWxmLl9zdWZmaXhfZm9yKHIpCiAgICAgICAgICAgICAgICBzZWxmLl90bXBfZXh0cmFzX3JlcXVpcmVbc2VjdGlvbiArIHN1ZmZpeF0uYXBwZW5kKHIpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9zdWZmaXhfZm9yKHJlcSk6CiAgICAgICAgIiIiCiAgICAgICAgRm9yIGEgcmVxdWlyZW1lbnQsIHJldHVybiB0aGUgJ2V4dHJhc19yZXF1aXJlJyBzdWZmaXggZm9yCiAgICAgICAgdGhhdCByZXF1aXJlbWVudC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gJzonICsgc3RyKHJlcS5tYXJrZXIpIGlmIHJlcS5tYXJrZXIgZWxzZSAnJwoKICAgIGRlZiBfbW92ZV9pbnN0YWxsX3JlcXVpcmVtZW50c19tYXJrZXJzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1vdmUgcmVxdWlyZW1lbnRzIGluIGBpbnN0YWxsX3JlcXVpcmVzYCB0aGF0IGFyZSB1c2luZyBlbnZpcm9ubWVudAogICAgICAgIG1hcmtlcnMgYGV4dHJhc19yZXF1aXJlYC4KICAgICAgICAiIiIKCiAgICAgICAgIyBkaXZpZGUgdGhlIGluc3RhbGxfcmVxdWlyZXMgaW50byB0d28gc2V0cywgc2ltcGxlIG9uZXMgc3RpbGwKICAgICAgICAjIGhhbmRsZWQgYnkgaW5zdGFsbF9yZXF1aXJlcyBhbmQgbW9yZSBjb21wbGV4IG9uZXMgaGFuZGxlZAogICAgICAgICMgYnkgZXh0cmFzX3JlcXVpcmUuCgogICAgICAgIGRlZiBpc19zaW1wbGVfcmVxKHJlcSk6CiAgICAgICAgICAgIHJldHVybiBub3QgcmVxLm1hcmtlcgoKICAgICAgICBzcGVjX2luc3RfcmVxcyA9IGdldGF0dHIoc2VsZiwgJ2luc3RhbGxfcmVxdWlyZXMnLCBOb25lKSBvciAoKQogICAgICAgIGluc3RfcmVxcyA9IGxpc3QocGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHMoc3BlY19pbnN0X3JlcXMpKQogICAgICAgIHNpbXBsZV9yZXFzID0gZmlsdGVyKGlzX3NpbXBsZV9yZXEsIGluc3RfcmVxcykKICAgICAgICBjb21wbGV4X3JlcXMgPSBmaWx0ZXJmYWxzZShpc19zaW1wbGVfcmVxLCBpbnN0X3JlcXMpCiAgICAgICAgc2VsZi5pbnN0YWxsX3JlcXVpcmVzID0gbGlzdChtYXAoc3RyLCBzaW1wbGVfcmVxcykpCgogICAgICAgIGZvciByIGluIGNvbXBsZXhfcmVxczoKICAgICAgICAgICAgc2VsZi5fdG1wX2V4dHJhc19yZXF1aXJlWyc6JyArIHN0cihyLm1hcmtlcildLmFwcGVuZChyKQogICAgICAgIHNlbGYuZXh0cmFzX3JlcXVpcmUgPSBkaWN0KAogICAgICAgICAgICAoaywgW3N0cihyKSBmb3IgciBpbiBtYXAoc2VsZi5fY2xlYW5fcmVxLCB2KV0pCiAgICAgICAgICAgIGZvciBrLCB2IGluIHNlbGYuX3RtcF9leHRyYXNfcmVxdWlyZS5pdGVtcygpCiAgICAgICAgKQoKICAgIGRlZiBfY2xlYW5fcmVxKHNlbGYsIHJlcSk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYSBSZXF1aXJlbWVudCwgcmVtb3ZlIGVudmlyb25tZW50IG1hcmtlcnMgYW5kIHJldHVybiBpdC4KICAgICAgICAiIiIKICAgICAgICByZXEubWFya2VyID0gTm9uZQogICAgICAgIHJldHVybiByZXEKCiAgICBkZWYgcGFyc2VfY29uZmlnX2ZpbGVzKHNlbGYsIGZpbGVuYW1lcz1Ob25lLCBpZ25vcmVfb3B0aW9uX2Vycm9ycz1GYWxzZSk6CiAgICAgICAgIiIiUGFyc2VzIGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSB2YXJpb3VzIGxldmVscwogICAgICAgIGFuZCBsb2FkcyBjb25maWd1cmF0aW9uLgoKICAgICAgICAiIiIKICAgICAgICBfRGlzdHJpYnV0aW9uLnBhcnNlX2NvbmZpZ19maWxlcyhzZWxmLCBmaWxlbmFtZXM9ZmlsZW5hbWVzKQoKICAgICAgICBwYXJzZV9jb25maWd1cmF0aW9uKHNlbGYsIHNlbGYuY29tbWFuZF9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlX29wdGlvbl9lcnJvcnM9aWdub3JlX29wdGlvbl9lcnJvcnMpCiAgICAgICAgc2VsZi5fZmluYWxpemVfcmVxdWlyZXMoKQoKICAgIGRlZiBwYXJzZV9jb21tYW5kX2xpbmUoc2VsZik6CiAgICAgICAgIiIiUHJvY2VzcyBmZWF0dXJlcyBhZnRlciBwYXJzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zIiIiCiAgICAgICAgcmVzdWx0ID0gX0Rpc3RyaWJ1dGlvbi5wYXJzZV9jb21tYW5kX2xpbmUoc2VsZikKICAgICAgICBpZiBzZWxmLmZlYXR1cmVzOgogICAgICAgICAgICBzZWxmLl9maW5hbGl6ZV9mZWF0dXJlcygpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfZmVhdHVyZV9hdHRybmFtZShzZWxmLCBuYW1lKToKICAgICAgICAiIiJDb252ZXJ0IGZlYXR1cmUgbmFtZSB0byBjb3JyZXNwb25kaW5nIG9wdGlvbiBhdHRyaWJ1dGUgbmFtZSIiIgogICAgICAgIHJldHVybiAnd2l0aF8nICsgbmFtZS5yZXBsYWNlKCctJywgJ18nKQoKICAgIGRlZiBmZXRjaF9idWlsZF9lZ2dzKHNlbGYsIHJlcXVpcmVzKToKICAgICAgICAiIiJSZXNvbHZlIHByZS1zZXR1cCByZXF1aXJlbWVudHMiIiIKICAgICAgICByZXNvbHZlZF9kaXN0cyA9IHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQucmVzb2x2ZSgKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHMocmVxdWlyZXMpLAogICAgICAgICAgICBpbnN0YWxsZXI9c2VsZi5mZXRjaF9idWlsZF9lZ2csCiAgICAgICAgICAgIHJlcGxhY2VfY29uZmxpY3Rpbmc9VHJ1ZSwKICAgICAgICApCiAgICAgICAgZm9yIGRpc3QgaW4gcmVzb2x2ZWRfZGlzdHM6CiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQuYWRkKGRpc3QsIHJlcGxhY2U9VHJ1ZSkKICAgICAgICByZXR1cm4gcmVzb2x2ZWRfZGlzdHMKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBfRGlzdHJpYnV0aW9uLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBpZiBzZWxmLmZlYXR1cmVzOgogICAgICAgICAgICBzZWxmLl9zZXRfZ2xvYmFsX29wdHNfZnJvbV9mZWF0dXJlcygpCgogICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHMnKToKICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHNlbGYsIGVwLm5hbWUsIE5vbmUpCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZXAucmVxdWlyZShpbnN0YWxsZXI9c2VsZi5mZXRjaF9idWlsZF9lZ2cpCiAgICAgICAgICAgICAgICBlcC5sb2FkKCkoc2VsZiwgZXAubmFtZSwgdmFsdWUpCiAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAnY29udmVydF8ydG8zX2RvY3Rlc3RzJywgTm9uZSk6CiAgICAgICAgICAgICMgWFhYIG1heSBjb252ZXJ0IHRvIHNldCBoZXJlIHdoZW4gd2UgY2FuIHJlbHkgb24gc2V0IGJlaW5nIGJ1aWx0aW4KICAgICAgICAgICAgc2VsZi5jb252ZXJ0XzJ0bzNfZG9jdGVzdHMgPSBbCiAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgocCkKICAgICAgICAgICAgICAgIGZvciBwIGluIHNlbGYuY29udmVydF8ydG8zX2RvY3Rlc3RzCiAgICAgICAgICAgIF0KICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmNvbnZlcnRfMnRvM19kb2N0ZXN0cyA9IFtdCgogICAgZGVmIGdldF9lZ2dfY2FjaGVfZGlyKHNlbGYpOgogICAgICAgIGVnZ19jYWNoZV9kaXIgPSBvcy5wYXRoLmpvaW4ob3MuY3VyZGlyLCAnLmVnZ3MnKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhlZ2dfY2FjaGVfZGlyKToKICAgICAgICAgICAgb3MubWtkaXIoZWdnX2NhY2hlX2RpcikKICAgICAgICAgICAgd2luZG93c19zdXBwb3J0LmhpZGVfZmlsZShlZ2dfY2FjaGVfZGlyKQogICAgICAgICAgICByZWFkbWVfdHh0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKGVnZ19jYWNoZV9kaXIsICdSRUFETUUudHh0JykKICAgICAgICAgICAgd2l0aCBvcGVuKHJlYWRtZV90eHRfZmlsZW5hbWUsICd3JykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoJ1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGVnZ3MgdGhhdCB3ZXJlIGRvd25sb2FkZWQgJwogICAgICAgICAgICAgICAgICAgICAgICAnYnkgc2V0dXB0b29scyB0byBidWlsZCwgdGVzdCwgYW5kIHJ1biBwbHVnLWlucy5cblxuJykKICAgICAgICAgICAgICAgIGYud3JpdGUoJ1RoaXMgZGlyZWN0b3J5IGNhY2hlcyB0aG9zZSBlZ2dzIHRvIHByZXZlbnQgJwogICAgICAgICAgICAgICAgICAgICAgICAncmVwZWF0ZWQgZG93bmxvYWRzLlxuXG4nKQogICAgICAgICAgICAgICAgZi53cml0ZSgnSG93ZXZlciwgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhpcyBkaXJlY3RvcnkuXG5cbicpCgogICAgICAgIHJldHVybiBlZ2dfY2FjaGVfZGlyCgogICAgZGVmIGZldGNoX2J1aWxkX2VnZyhzZWxmLCByZXEpOgogICAgICAgICIiIkZldGNoIGFuIGVnZyBuZWVkZWQgZm9yIGJ1aWxkaW5nIiIiCiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBlYXN5X2luc3RhbGwKICAgICAgICBkaXN0ID0gc2VsZi5fX2NsYXNzX18oeydzY3JpcHRfYXJncyc6IFsnZWFzeV9pbnN0YWxsJ119KQogICAgICAgIG9wdHMgPSBkaXN0LmdldF9vcHRpb25fZGljdCgnZWFzeV9pbnN0YWxsJykKICAgICAgICBvcHRzLmNsZWFyKCkKICAgICAgICBvcHRzLnVwZGF0ZSgKICAgICAgICAgICAgKGssIHYpCiAgICAgICAgICAgIGZvciBrLCB2IGluIHNlbGYuZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKS5pdGVtcygpCiAgICAgICAgICAgIGlmIGsgaW4gKAogICAgICAgICAgICAgICAgIyBkb24ndCB1c2UgYW55IG90aGVyIHNldHRpbmdzCiAgICAgICAgICAgICAgICAnZmluZF9saW5rcycsICdzaXRlX2RpcnMnLCAnaW5kZXhfdXJsJywKICAgICAgICAgICAgICAgICdvcHRpbWl6ZScsICdzaXRlX2RpcnMnLCAnYWxsb3dfaG9zdHMnLAogICAgICAgICkpCiAgICAgICAgaWYgc2VsZi5kZXBlbmRlbmN5X2xpbmtzOgogICAgICAgICAgICBsaW5rcyA9IHNlbGYuZGVwZW5kZW5jeV9saW5rc1s6XQogICAgICAgICAgICBpZiAnZmluZF9saW5rcycgaW4gb3B0czoKICAgICAgICAgICAgICAgIGxpbmtzID0gb3B0c1snZmluZF9saW5rcyddWzFdICsgbGlua3MKICAgICAgICAgICAgb3B0c1snZmluZF9saW5rcyddID0gKCdzZXR1cCcsIGxpbmtzKQogICAgICAgIGluc3RhbGxfZGlyID0gc2VsZi5nZXRfZWdnX2NhY2hlX2RpcigpCiAgICAgICAgY21kID0gZWFzeV9pbnN0YWxsKAogICAgICAgICAgICBkaXN0LCBhcmdzPVsieCJdLCBpbnN0YWxsX2Rpcj1pbnN0YWxsX2RpciwKICAgICAgICAgICAgZXhjbHVkZV9zY3JpcHRzPVRydWUsCiAgICAgICAgICAgIGFsd2F5c19jb3B5PUZhbHNlLCBidWlsZF9kaXJlY3Rvcnk9Tm9uZSwgZWRpdGFibGU9RmFsc2UsCiAgICAgICAgICAgIHVwZ3JhZGU9RmFsc2UsIG11bHRpX3ZlcnNpb249VHJ1ZSwgbm9fcmVwb3J0PVRydWUsIHVzZXI9RmFsc2UKICAgICAgICApCiAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQogICAgICAgIHJldHVybiBjbWQuZWFzeV9pbnN0YWxsKHJlcSkKCiAgICBkZWYgX3NldF9nbG9iYWxfb3B0c19mcm9tX2ZlYXR1cmVzKHNlbGYpOgogICAgICAgICIiIkFkZCAtLXdpdGgtWC8tLXdpdGhvdXQtWCBvcHRpb25zIGJhc2VkIG9uIG9wdGlvbmFsIGZlYXR1cmVzIiIiCgogICAgICAgIGdvID0gW10KICAgICAgICBubyA9IHNlbGYubmVnYXRpdmVfb3B0LmNvcHkoKQoKICAgICAgICBmb3IgbmFtZSwgZmVhdHVyZSBpbiBzZWxmLmZlYXR1cmVzLml0ZW1zKCk6CiAgICAgICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsIE5vbmUpCiAgICAgICAgICAgIGZlYXR1cmUudmFsaWRhdGUoc2VsZikKCiAgICAgICAgICAgIGlmIGZlYXR1cmUub3B0aW9uYWw6CiAgICAgICAgICAgICAgICBkZXNjciA9IGZlYXR1cmUuZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgIGluY2RlZiA9ICcgKGRlZmF1bHQpJwogICAgICAgICAgICAgICAgZXhjZGVmID0gJycKICAgICAgICAgICAgICAgIGlmIG5vdCBmZWF0dXJlLmluY2x1ZGVfYnlfZGVmYXVsdCgpOgogICAgICAgICAgICAgICAgICAgIGV4Y2RlZiwgaW5jZGVmID0gaW5jZGVmLCBleGNkZWYKCiAgICAgICAgICAgICAgICBuZXcgPSAoCiAgICAgICAgICAgICAgICAgICAgKCd3aXRoLScgKyBuYW1lLCBOb25lLCAnaW5jbHVkZSAnICsgZGVzY3IgKyBpbmNkZWYpLAogICAgICAgICAgICAgICAgICAgICgnd2l0aG91dC0nICsgbmFtZSwgTm9uZSwgJ2V4Y2x1ZGUgJyArIGRlc2NyICsgZXhjZGVmKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGdvLmV4dGVuZChuZXcpCiAgICAgICAgICAgICAgICBub1snd2l0aG91dC0nICsgbmFtZV0gPSAnd2l0aC0nICsgbmFtZQoKICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25zID0gc2VsZi5mZWF0dXJlX29wdGlvbnMgPSBnbyArIHNlbGYuZ2xvYmFsX29wdGlvbnMKICAgICAgICBzZWxmLm5lZ2F0aXZlX29wdCA9IHNlbGYuZmVhdHVyZV9uZWdvcHQgPSBubwoKICAgIGRlZiBfZmluYWxpemVfZmVhdHVyZXMoc2VsZik6CiAgICAgICAgIiIiQWRkL3JlbW92ZSBmZWF0dXJlcyBhbmQgcmVzb2x2ZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGVtIiIiCgogICAgICAgICMgRmlyc3QsIGZsYWcgYWxsIHRoZSBlbmFibGVkIGl0ZW1zIChhbmQgdGh1cyB0aGVpciBkZXBlbmRlbmNpZXMpCiAgICAgICAgZm9yIG5hbWUsIGZlYXR1cmUgaW4gc2VsZi5mZWF0dXJlcy5pdGVtcygpOgogICAgICAgICAgICBlbmFibGVkID0gc2VsZi5mZWF0dXJlX2lzX2luY2x1ZGVkKG5hbWUpCiAgICAgICAgICAgIGlmIGVuYWJsZWQgb3IgKGVuYWJsZWQgaXMgTm9uZSBhbmQgZmVhdHVyZS5pbmNsdWRlX2J5X2RlZmF1bHQoKSk6CiAgICAgICAgICAgICAgICBmZWF0dXJlLmluY2x1ZGVfaW4oc2VsZikKICAgICAgICAgICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsIDEpCgogICAgICAgICMgVGhlbiBkaXNhYmxlIHRoZSByZXN0LCBzbyB0aGF0IG9mZi1ieS1kZWZhdWx0IGZlYXR1cmVzIGRvbid0CiAgICAgICAgIyBnZXQgZmxhZ2dlZCBhcyBlcnJvcnMgd2hlbiB0aGV5J3JlIHJlcXVpcmVkIGJ5IGFuIGVuYWJsZWQgZmVhdHVyZQogICAgICAgIGZvciBuYW1lLCBmZWF0dXJlIGluIHNlbGYuZmVhdHVyZXMuaXRlbXMoKToKICAgICAgICAgICAgaWYgbm90IHNlbGYuZmVhdHVyZV9pc19pbmNsdWRlZChuYW1lKToKICAgICAgICAgICAgICAgIGZlYXR1cmUuZXhjbHVkZV9mcm9tKHNlbGYpCiAgICAgICAgICAgICAgICBzZWxmLl9zZXRfZmVhdHVyZShuYW1lLCAwKQoKICAgIGRlZiBnZXRfY29tbWFuZF9jbGFzcyhzZWxmLCBjb21tYW5kKToKICAgICAgICAiIiJQbHVnZ2FibGUgdmVyc2lvbiBvZiBnZXRfY29tbWFuZF9jbGFzcygpIiIiCiAgICAgICAgaWYgY29tbWFuZCBpbiBzZWxmLmNtZGNsYXNzOgogICAgICAgICAgICByZXR1cm4gc2VsZi5jbWRjbGFzc1tjb21tYW5kXQoKICAgICAgICBlcHMgPSBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuY29tbWFuZHMnLCBjb21tYW5kKQogICAgICAgIGZvciBlcCBpbiBlcHM6CiAgICAgICAgICAgIGVwLnJlcXVpcmUoaW5zdGFsbGVyPXNlbGYuZmV0Y2hfYnVpbGRfZWdnKQogICAgICAgICAgICBzZWxmLmNtZGNsYXNzW2NvbW1hbmRdID0gY21kY2xhc3MgPSBlcC5sb2FkKCkKICAgICAgICAgICAgcmV0dXJuIGNtZGNsYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfY2xhc3Moc2VsZiwgY29tbWFuZCkKCiAgICBkZWYgcHJpbnRfY29tbWFuZHMoc2VsZik6CiAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5jb21tYW5kcycpOgogICAgICAgICAgICBpZiBlcC5uYW1lIG5vdCBpbiBzZWxmLmNtZGNsYXNzOgogICAgICAgICAgICAgICAgIyBkb24ndCByZXF1aXJlIGV4dHJhcyBhcyB0aGUgY29tbWFuZHMgd29uJ3QgYmUgaW52b2tlZAogICAgICAgICAgICAgICAgY21kY2xhc3MgPSBlcC5yZXNvbHZlKCkKICAgICAgICAgICAgICAgIHNlbGYuY21kY2xhc3NbZXAubmFtZV0gPSBjbWRjbGFzcwogICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLnByaW50X2NvbW1hbmRzKHNlbGYpCgogICAgZGVmIGdldF9jb21tYW5kX2xpc3Qoc2VsZik6CiAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5jb21tYW5kcycpOgogICAgICAgICAgICBpZiBlcC5uYW1lIG5vdCBpbiBzZWxmLmNtZGNsYXNzOgogICAgICAgICAgICAgICAgIyBkb24ndCByZXF1aXJlIGV4dHJhcyBhcyB0aGUgY29tbWFuZHMgd29uJ3QgYmUgaW52b2tlZAogICAgICAgICAgICAgICAgY21kY2xhc3MgPSBlcC5yZXNvbHZlKCkKICAgICAgICAgICAgICAgIHNlbGYuY21kY2xhc3NbZXAubmFtZV0gPSBjbWRjbGFzcwogICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX2xpc3Qoc2VsZikKCiAgICBkZWYgX3NldF9mZWF0dXJlKHNlbGYsIG5hbWUsIHN0YXR1cyk6CiAgICAgICAgIiIiU2V0IGZlYXR1cmUncyBpbmNsdXNpb24gc3RhdHVzIiIiCiAgICAgICAgc2V0YXR0cihzZWxmLCBzZWxmLl9mZWF0dXJlX2F0dHJuYW1lKG5hbWUpLCBzdGF0dXMpCgogICAgZGVmIGZlYXR1cmVfaXNfaW5jbHVkZWQoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIDEgaWYgZmVhdHVyZSBpcyBpbmNsdWRlZCwgMCBpZiBleGNsdWRlZCwgJ05vbmUnIGlmIHVua25vd24iIiIKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBzZWxmLl9mZWF0dXJlX2F0dHJuYW1lKG5hbWUpKQoKICAgIGRlZiBpbmNsdWRlX2ZlYXR1cmUoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiUmVxdWVzdCBpbmNsdXNpb24gb2YgZmVhdHVyZSBuYW1lZCAnbmFtZSciIiIKCiAgICAgICAgaWYgc2VsZi5mZWF0dXJlX2lzX2luY2x1ZGVkKG5hbWUpID09IDA6CiAgICAgICAgICAgIGRlc2NyID0gc2VsZi5mZWF0dXJlc1tuYW1lXS5kZXNjcmlwdGlvbgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgIGRlc2NyICsgIiBpcyByZXF1aXJlZCwgYnV0IHdhcyBleGNsdWRlZCBvciBpcyBub3QgYXZhaWxhYmxlIgogICAgICAgICAgICApCiAgICAgICAgc2VsZi5mZWF0dXJlc1tuYW1lXS5pbmNsdWRlX2luKHNlbGYpCiAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwgMSkKCiAgICBkZWYgaW5jbHVkZShzZWxmLCAqKmF0dHJzKToKICAgICAgICAiIiJBZGQgaXRlbXMgdG8gZGlzdHJpYnV0aW9uIHRoYXQgYXJlIG5hbWVkIGluIGtleXdvcmQgYXJndW1lbnRzCgogICAgICAgIEZvciBleGFtcGxlLCAnZGlzdC5leGNsdWRlKHB5X21vZHVsZXM9WyJ4Il0pJyB3b3VsZCBhZGQgJ3gnIHRvCiAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbidzICdweV9tb2R1bGVzJyBhdHRyaWJ1dGUsIGlmIGl0IHdhcyBub3QgYWxyZWFkeQogICAgICAgIHRoZXJlLgoKICAgICAgICBDdXJyZW50bHksIHRoaXMgbWV0aG9kIG9ubHkgc3VwcG9ydHMgaW5jbHVzaW9uIGZvciBhdHRyaWJ1dGVzIHRoYXQgYXJlCiAgICAgICAgbGlzdHMgb3IgdHVwbGVzLiAgSWYgeW91IG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIGFkZGluZyB0byBvdGhlcgogICAgICAgIGF0dHJpYnV0ZXMgaW4gdGhpcyBvciBhIHN1YmNsYXNzLCB5b3UgY2FuIGFkZCBhbiAnX2luY2x1ZGVfWCcgbWV0aG9kLAogICAgICAgIHdoZXJlICdYJyBpcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiAgVGhlIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoCiAgICAgICAgdGhlIHZhbHVlIHBhc3NlZCB0byAnaW5jbHVkZSgpJy4gIFNvLCAnZGlzdC5pbmNsdWRlKGZvbz17ImJhciI6ImJheiJ9KScKICAgICAgICB3aWxsIHRyeSB0byBjYWxsICdkaXN0Ll9pbmNsdWRlX2Zvbyh7ImJhciI6ImJheiJ9KScsIHdoaWNoIGNhbiB0aGVuCiAgICAgICAgaGFuZGxlIHdoYXRldmVyIHNwZWNpYWwgaW5jbHVzaW9uIGxvZ2ljIGlzIG5lZWRlZC4KICAgICAgICAiIiIKICAgICAgICBmb3IgaywgdiBpbiBhdHRycy5pdGVtcygpOgogICAgICAgICAgICBpbmNsdWRlID0gZ2V0YXR0cihzZWxmLCAnX2luY2x1ZGVfJyArIGssIE5vbmUpCiAgICAgICAgICAgIGlmIGluY2x1ZGU6CiAgICAgICAgICAgICAgICBpbmNsdWRlKHYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9pbmNsdWRlX21pc2MoaywgdikKCiAgICBkZWYgZXhjbHVkZV9wYWNrYWdlKHNlbGYsIHBhY2thZ2UpOgogICAgICAgICIiIlJlbW92ZSBwYWNrYWdlcywgbW9kdWxlcywgYW5kIGV4dGVuc2lvbnMgaW4gbmFtZWQgcGFja2FnZSIiIgoKICAgICAgICBwZnggPSBwYWNrYWdlICsgJy4nCiAgICAgICAgaWYgc2VsZi5wYWNrYWdlczoKICAgICAgICAgICAgc2VsZi5wYWNrYWdlcyA9IFsKICAgICAgICAgICAgICAgIHAgZm9yIHAgaW4gc2VsZi5wYWNrYWdlcwogICAgICAgICAgICAgICAgaWYgcCAhPSBwYWNrYWdlIGFuZCBub3QgcC5zdGFydHN3aXRoKHBmeCkKICAgICAgICAgICAgXQoKICAgICAgICBpZiBzZWxmLnB5X21vZHVsZXM6CiAgICAgICAgICAgIHNlbGYucHlfbW9kdWxlcyA9IFsKICAgICAgICAgICAgICAgIHAgZm9yIHAgaW4gc2VsZi5weV9tb2R1bGVzCiAgICAgICAgICAgICAgICBpZiBwICE9IHBhY2thZ2UgYW5kIG5vdCBwLnN0YXJ0c3dpdGgocGZ4KQogICAgICAgICAgICBdCgogICAgICAgIGlmIHNlbGYuZXh0X21vZHVsZXM6CiAgICAgICAgICAgIHNlbGYuZXh0X21vZHVsZXMgPSBbCiAgICAgICAgICAgICAgICBwIGZvciBwIGluIHNlbGYuZXh0X21vZHVsZXMKICAgICAgICAgICAgICAgIGlmIHAubmFtZSAhPSBwYWNrYWdlIGFuZCBub3QgcC5uYW1lLnN0YXJ0c3dpdGgocGZ4KQogICAgICAgICAgICBdCgogICAgZGVmIGhhc19jb250ZW50c19mb3Ioc2VsZiwgcGFja2FnZSk6CiAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgJ2V4Y2x1ZGVfcGFja2FnZShwYWNrYWdlKScgd291bGQgZG8gc29tZXRoaW5nIiIiCgogICAgICAgIHBmeCA9IHBhY2thZ2UgKyAnLicKCiAgICAgICAgZm9yIHAgaW4gc2VsZi5pdGVyX2Rpc3RyaWJ1dGlvbl9uYW1lcygpOgogICAgICAgICAgICBpZiBwID09IHBhY2thZ2Ugb3IgcC5zdGFydHN3aXRoKHBmeCk6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfZXhjbHVkZV9taXNjKHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICAiIiJIYW5kbGUgJ2V4Y2x1ZGUoKScgZm9yIGxpc3QvdHVwbGUgYXR0cnMgd2l0aG91dCBhIHNwZWNpYWwgaGFuZGxlciIiIgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzZXF1ZW5jZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiJXM6IHNldHRpbmcgbXVzdCBiZSBhIGxpc3Qgb3IgdHVwbGUgKCVyKSIgJSAobmFtZSwgdmFsdWUpCiAgICAgICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9sZCA9IGdldGF0dHIoc2VsZiwgbmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiJXM6IE5vIHN1Y2ggZGlzdHJpYnV0aW9uIHNldHRpbmciICUgbmFtZQogICAgICAgICAgICApCiAgICAgICAgaWYgb2xkIGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShvbGQsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgIG5hbWUgKyAiOiB0aGlzIHNldHRpbmcgY2Fubm90IGJlIGNoYW5nZWQgdmlhIGluY2x1ZGUvZXhjbHVkZSIKICAgICAgICAgICAgKQogICAgICAgIGVsaWYgb2xkOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIFtpdGVtIGZvciBpdGVtIGluIG9sZCBpZiBpdGVtIG5vdCBpbiB2YWx1ZV0pCgogICAgZGVmIF9pbmNsdWRlX21pc2Moc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgICIiIkhhbmRsZSAnaW5jbHVkZSgpJyBmb3IgbGlzdC90dXBsZSBhdHRycyB3aXRob3V0IGEgc3BlY2lhbCBoYW5kbGVyIiIiCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzZXF1ZW5jZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiJXM6IHNldHRpbmcgbXVzdCBiZSBhIGxpc3QgKCVyKSIgJSAobmFtZSwgdmFsdWUpCiAgICAgICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9sZCA9IGdldGF0dHIoc2VsZiwgbmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiJXM6IE5vIHN1Y2ggZGlzdHJpYnV0aW9uIHNldHRpbmciICUgbmFtZQogICAgICAgICAgICApCiAgICAgICAgaWYgb2xkIGlzIE5vbmU6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgdmFsdWUpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvbGQsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgIG5hbWUgKyAiOiB0aGlzIHNldHRpbmcgY2Fubm90IGJlIGNoYW5nZWQgdmlhIGluY2x1ZGUvZXhjbHVkZSIKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ldyA9IFtpdGVtIGZvciBpdGVtIGluIHZhbHVlIGlmIGl0ZW0gbm90IGluIG9sZF0KICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBvbGQgKyBuZXcpCgogICAgZGVmIGV4Y2x1ZGUoc2VsZiwgKiphdHRycyk6CiAgICAgICAgIiIiUmVtb3ZlIGl0ZW1zIGZyb20gZGlzdHJpYnV0aW9uIHRoYXQgYXJlIG5hbWVkIGluIGtleXdvcmQgYXJndW1lbnRzCgogICAgICAgIEZvciBleGFtcGxlLCAnZGlzdC5leGNsdWRlKHB5X21vZHVsZXM9WyJ4Il0pJyB3b3VsZCByZW1vdmUgJ3gnIGZyb20KICAgICAgICB0aGUgZGlzdHJpYnV0aW9uJ3MgJ3B5X21vZHVsZXMnIGF0dHJpYnV0ZS4gIEV4Y2x1ZGluZyBwYWNrYWdlcyB1c2VzCiAgICAgICAgdGhlICdleGNsdWRlX3BhY2thZ2UoKScgbWV0aG9kLCBzbyBhbGwgb2YgdGhlIHBhY2thZ2UncyBjb250YWluZWQKICAgICAgICBwYWNrYWdlcywgbW9kdWxlcywgYW5kIGV4dGVuc2lvbnMgYXJlIGFsc28gZXhjbHVkZWQuCgogICAgICAgIEN1cnJlbnRseSwgdGhpcyBtZXRob2Qgb25seSBzdXBwb3J0cyBleGNsdXNpb24gZnJvbSBhdHRyaWJ1dGVzIHRoYXQgYXJlCiAgICAgICAgbGlzdHMgb3IgdHVwbGVzLiAgSWYgeW91IG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIGV4Y2x1ZGluZyBmcm9tIG90aGVyCiAgICAgICAgYXR0cmlidXRlcyBpbiB0aGlzIG9yIGEgc3ViY2xhc3MsIHlvdSBjYW4gYWRkIGFuICdfZXhjbHVkZV9YJyBtZXRob2QsCiAgICAgICAgd2hlcmUgJ1gnIGlzIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICBUaGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGgKICAgICAgICB0aGUgdmFsdWUgcGFzc2VkIHRvICdleGNsdWRlKCknLiAgU28sICdkaXN0LmV4Y2x1ZGUoZm9vPXsiYmFyIjoiYmF6In0pJwogICAgICAgIHdpbGwgdHJ5IHRvIGNhbGwgJ2Rpc3QuX2V4Y2x1ZGVfZm9vKHsiYmFyIjoiYmF6In0pJywgd2hpY2ggY2FuIHRoZW4KICAgICAgICBoYW5kbGUgd2hhdGV2ZXIgc3BlY2lhbCBleGNsdXNpb24gbG9naWMgaXMgbmVlZGVkLgogICAgICAgICIiIgogICAgICAgIGZvciBrLCB2IGluIGF0dHJzLml0ZW1zKCk6CiAgICAgICAgICAgIGV4Y2x1ZGUgPSBnZXRhdHRyKHNlbGYsICdfZXhjbHVkZV8nICsgaywgTm9uZSkKICAgICAgICAgICAgaWYgZXhjbHVkZToKICAgICAgICAgICAgICAgIGV4Y2x1ZGUodikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2V4Y2x1ZGVfbWlzYyhrLCB2KQoKICAgIGRlZiBfZXhjbHVkZV9wYWNrYWdlcyhzZWxmLCBwYWNrYWdlcyk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGFja2FnZXMsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICJwYWNrYWdlczogc2V0dGluZyBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZSAoJXIpIiAlIChwYWNrYWdlcywpCiAgICAgICAgICAgICkKICAgICAgICBsaXN0KG1hcChzZWxmLmV4Y2x1ZGVfcGFja2FnZSwgcGFja2FnZXMpKQoKICAgIGRlZiBfcGFyc2VfY29tbWFuZF9vcHRzKHNlbGYsIHBhcnNlciwgYXJncyk6CiAgICAgICAgIyBSZW1vdmUgLS13aXRoLVgvLS13aXRob3V0LVggb3B0aW9ucyB3aGVuIHByb2Nlc3NpbmcgY29tbWFuZCBhcmdzCiAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9ucyA9IHNlbGYuX19jbGFzc19fLmdsb2JhbF9vcHRpb25zCiAgICAgICAgc2VsZi5uZWdhdGl2ZV9vcHQgPSBzZWxmLl9fY2xhc3NfXy5uZWdhdGl2ZV9vcHQKCiAgICAgICAgIyBGaXJzdCwgZXhwYW5kIGFueSBhbGlhc2VzCiAgICAgICAgY29tbWFuZCA9IGFyZ3NbMF0KICAgICAgICBhbGlhc2VzID0gc2VsZi5nZXRfb3B0aW9uX2RpY3QoJ2FsaWFzZXMnKQogICAgICAgIHdoaWxlIGNvbW1hbmQgaW4gYWxpYXNlczoKICAgICAgICAgICAgc3JjLCBhbGlhcyA9IGFsaWFzZXNbY29tbWFuZF0KICAgICAgICAgICAgZGVsIGFsaWFzZXNbY29tbWFuZF0gICMgZW5zdXJlIGVhY2ggYWxpYXMgY2FuIGV4cGFuZCBvbmx5IG9uY2UhCiAgICAgICAgICAgIGltcG9ydCBzaGxleAogICAgICAgICAgICBhcmdzWzoxXSA9IHNobGV4LnNwbGl0KGFsaWFzLCBUcnVlKQogICAgICAgICAgICBjb21tYW5kID0gYXJnc1swXQoKICAgICAgICBuYXJncyA9IF9EaXN0cmlidXRpb24uX3BhcnNlX2NvbW1hbmRfb3B0cyhzZWxmLCBwYXJzZXIsIGFyZ3MpCgogICAgICAgICMgSGFuZGxlIGNvbW1hbmRzIHRoYXQgd2FudCB0byBjb25zdW1lIGFsbCByZW1haW5pbmcgYXJndW1lbnRzCiAgICAgICAgY21kX2NsYXNzID0gc2VsZi5nZXRfY29tbWFuZF9jbGFzcyhjb21tYW5kKQogICAgICAgIGlmIGdldGF0dHIoY21kX2NsYXNzLCAnY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMnLCBOb25lKToKICAgICAgICAgICAgc2VsZi5nZXRfb3B0aW9uX2RpY3QoY29tbWFuZClbJ2FyZ3MnXSA9ICgiY29tbWFuZCBsaW5lIiwgbmFyZ3MpCiAgICAgICAgICAgIGlmIG5hcmdzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJldHVybiBuYXJncwoKICAgIGRlZiBnZXRfY21kbGluZV9vcHRpb25zKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhICd7Y21kOiB7b3B0OnZhbH19JyBtYXAgb2YgYWxsIGNvbW1hbmQtbGluZSBvcHRpb25zCgogICAgICAgIE9wdGlvbiBuYW1lcyBhcmUgYWxsIGxvbmcsIGJ1dCBkbyBub3QgaW5jbHVkZSB0aGUgbGVhZGluZyAnLS0nLCBhbmQKICAgICAgICBjb250YWluIGRhc2hlcyByYXRoZXIgdGhhbiB1bmRlcnNjb3Jlcy4gIElmIHRoZSBvcHRpb24gZG9lc24ndCB0YWtlCiAgICAgICAgYW4gYXJndW1lbnQgKGUuZy4gJy0tcXVpZXQnKSwgdGhlICd2YWwnIGlzICdOb25lJy4KCiAgICAgICAgTm90ZSB0aGF0IG9wdGlvbnMgcHJvdmlkZWQgYnkgY29uZmlnIGZpbGVzIGFyZSBpbnRlbnRpb25hbGx5IGV4Y2x1ZGVkLgogICAgICAgICIiIgoKICAgICAgICBkID0ge30KCiAgICAgICAgZm9yIGNtZCwgb3B0cyBpbiBzZWxmLmNvbW1hbmRfb3B0aW9ucy5pdGVtcygpOgoKICAgICAgICAgICAgZm9yIG9wdCwgKHNyYywgdmFsKSBpbiBvcHRzLml0ZW1zKCk6CgogICAgICAgICAgICAgICAgaWYgc3JjICE9ICJjb21tYW5kIGxpbmUiOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgb3B0ID0gb3B0LnJlcGxhY2UoJ18nLCAnLScpCgogICAgICAgICAgICAgICAgaWYgdmFsID09IDA6CiAgICAgICAgICAgICAgICAgICAgY21kb2JqID0gc2VsZi5nZXRfY29tbWFuZF9vYmooY21kKQogICAgICAgICAgICAgICAgICAgIG5lZ19vcHQgPSBzZWxmLm5lZ2F0aXZlX29wdC5jb3B5KCkKICAgICAgICAgICAgICAgICAgICBuZWdfb3B0LnVwZGF0ZShnZXRhdHRyKGNtZG9iaiwgJ25lZ2F0aXZlX29wdCcsIHt9KSkKICAgICAgICAgICAgICAgICAgICBmb3IgbmVnLCBwb3MgaW4gbmVnX29wdC5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBwb3MgPT0gb3B0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0ID0gbmVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJTaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgaGVyZSIpCgogICAgICAgICAgICAgICAgZWxpZiB2YWwgPT0gMToKICAgICAgICAgICAgICAgICAgICB2YWwgPSBOb25lCgogICAgICAgICAgICAgICAgZC5zZXRkZWZhdWx0KGNtZCwge30pW29wdF0gPSB2YWwKCiAgICAgICAgcmV0dXJuIGQKCiAgICBkZWYgaXRlcl9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiWWllbGQgYWxsIHBhY2thZ2VzLCBtb2R1bGVzLCBhbmQgZXh0ZW5zaW9uIG5hbWVzIGluIGRpc3RyaWJ1dGlvbiIiIgoKICAgICAgICBmb3IgcGtnIGluIHNlbGYucGFja2FnZXMgb3IgKCk6CiAgICAgICAgICAgIHlpZWxkIHBrZwoKICAgICAgICBmb3IgbW9kdWxlIGluIHNlbGYucHlfbW9kdWxlcyBvciAoKToKICAgICAgICAgICAgeWllbGQgbW9kdWxlCgogICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRfbW9kdWxlcyBvciAoKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIHR1cGxlKToKICAgICAgICAgICAgICAgIG5hbWUsIGJ1aWxkaW5mbyA9IGV4dAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbmFtZSA9IGV4dC5uYW1lCiAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJ21vZHVsZScpOgogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVbOi02XQogICAgICAgICAgICB5aWVsZCBuYW1lCgogICAgZGVmIGhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKToKICAgICAgICAiIiJJZiB0aGVyZSB3ZXJlIGFueSBub24tZ2xvYmFsICJkaXNwbGF5LW9ubHkiIG9wdGlvbnMKICAgICAgICAoLS1oZWxwLWNvbW1hbmRzIG9yIHRoZSBtZXRhZGF0YSBkaXNwbGF5IG9wdGlvbnMpIG9uIHRoZSBjb21tYW5kCiAgICAgICAgbGluZSwgZGlzcGxheSB0aGUgcmVxdWVzdGVkIGluZm8gYW5kIHJldHVybiB0cnVlOyBlbHNlIHJldHVybgogICAgICAgIGZhbHNlLgogICAgICAgICIiIgogICAgICAgIGltcG9ydCBzeXMKCiAgICAgICAgaWYgc2l4LlBZMiBvciBzZWxmLmhlbHBfY29tbWFuZHM6CiAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKQoKICAgICAgICAjIFN0ZG91dCBtYXkgYmUgU3RyaW5nSU8gKGUuZy4gaW4gdGVzdHMpCiAgICAgICAgaW1wb3J0IGlvCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3lzLnN0ZG91dCwgaW8uVGV4dElPV3JhcHBlcik6CiAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKQoKICAgICAgICAjIERvbid0IHdyYXAgc3Rkb3V0IGlmIHV0Zi04IGlzIGFscmVhZHkgdGhlIGVuY29kaW5nLiBQcm92aWRlcwogICAgICAgICMgIHdvcmthcm91bmQgZm9yICMzMzQuCiAgICAgICAgaWYgc3lzLnN0ZG91dC5lbmNvZGluZy5sb3dlcigpIGluICgndXRmLTgnLCAndXRmOCcpOgogICAgICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5oYW5kbGVfZGlzcGxheV9vcHRpb25zKHNlbGYsIG9wdGlvbl9vcmRlcikKCiAgICAgICAgIyBQcmludCBtZXRhZGF0YSBpbiBVVEYtOCBubyBtYXR0ZXIgdGhlIHBsYXRmb3JtCiAgICAgICAgZW5jb2RpbmcgPSBzeXMuc3Rkb3V0LmVuY29kaW5nCiAgICAgICAgZXJyb3JzID0gc3lzLnN0ZG91dC5lcnJvcnMKICAgICAgICBuZXdsaW5lID0gc3lzLnBsYXRmb3JtICE9ICd3aW4zMicgYW5kICdcbicgb3IgTm9uZQogICAgICAgIGxpbmVfYnVmZmVyaW5nID0gc3lzLnN0ZG91dC5saW5lX2J1ZmZlcmluZwoKICAgICAgICBzeXMuc3Rkb3V0ID0gaW8uVGV4dElPV3JhcHBlcigKICAgICAgICAgICAgc3lzLnN0ZG91dC5kZXRhY2goKSwgJ3V0Zi04JywgZXJyb3JzLCBuZXdsaW5lLCBsaW5lX2J1ZmZlcmluZykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBpby5UZXh0SU9XcmFwcGVyKAogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5kZXRhY2goKSwgZW5jb2RpbmcsIGVycm9ycywgbmV3bGluZSwgbGluZV9idWZmZXJpbmcpCgoKY2xhc3MgRmVhdHVyZToKICAgICIiIgogICAgKipkZXByZWNhdGVkKiogLS0gVGhlIGBGZWF0dXJlYCBmYWNpbGl0eSB3YXMgbmV2ZXIgY29tcGxldGVseSBpbXBsZW1lbnRlZAogICAgb3Igc3VwcG9ydGVkLCBgaGFzIHJlcG9ydGVkIGlzc3VlcwogICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzU4PmBfIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4KICAgIGEgZnV0dXJlIHZlcnNpb24uCgogICAgQSBzdWJzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbiB0aGF0IGNhbiBiZSBleGNsdWRlZCBpZiB1bm5lZWRlZC93YW50ZWQKCiAgICBGZWF0dXJlcyBhcmUgY3JlYXRlZCB1c2luZyB0aGVzZSBrZXl3b3JkIGFyZ3VtZW50czoKCiAgICAgICdkZXNjcmlwdGlvbicgLS0gYSBzaG9ydCwgaHVtYW4gcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUsIHRvCiAgICAgICAgIGJlIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMsIGFuZCBvcHRpb24gaGVscCBtZXNzYWdlcy4KCiAgICAgICdzdGFuZGFyZCcgLS0gaWYgdHJ1ZSwgdGhlIGZlYXR1cmUgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdCBpZiBpdCBpcwogICAgICAgICBhdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgc3lzdGVtLiAgT3RoZXJ3aXNlLCB0aGUgZmVhdHVyZSBpcyBvbmx5CiAgICAgICAgIGluY2x1ZGVkIGlmIHJlcXVlc3RlZCB2aWEgYSBjb21tYW5kIGxpbmUgJy0td2l0aC1YJyBvcHRpb24sIG9yIGlmCiAgICAgICAgIGFub3RoZXIgaW5jbHVkZWQgZmVhdHVyZSByZXF1aXJlcyBpdC4gIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgJ0ZhbHNlJy4KCiAgICAgICdhdmFpbGFibGUnIC0tIGlmIHRydWUsIHRoZSBmZWF0dXJlIGlzIGF2YWlsYWJsZSBmb3IgaW5zdGFsbGF0aW9uIG9uIHRoZQogICAgICAgICBjdXJyZW50IHN5c3RlbS4gIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgJ1RydWUnLgoKICAgICAgJ29wdGlvbmFsJyAtLSBpZiB0cnVlLCB0aGUgZmVhdHVyZSdzIGluY2x1c2lvbiBjYW4gYmUgY29udHJvbGxlZCBmcm9tIHRoZQogICAgICAgICBjb21tYW5kIGxpbmUsIHVzaW5nIHRoZSAnLS13aXRoLVgnIG9yICctLXdpdGhvdXQtWCcgb3B0aW9ucy4gIElmCiAgICAgICAgIGZhbHNlLCB0aGUgZmVhdHVyZSdzIGluY2x1c2lvbiBzdGF0dXMgaXMgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LAogICAgICAgICBiYXNlZCBvbiAnYXZhaWxhYmlsZScsICdzdGFuZGFyZCcsIGFuZCB3aGV0aGVyIGFueSBvdGhlciBmZWF0dXJlCiAgICAgICAgIHJlcXVpcmVzIGl0LiAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAnVHJ1ZScuCgogICAgICAncmVxdWlyZV9mZWF0dXJlcycgLS0gYSBzdHJpbmcgb3Igc2VxdWVuY2Ugb2Ygc3RyaW5ncyBuYW1pbmcgZmVhdHVyZXMKICAgICAgICAgdGhhdCBzaG91bGQgYWxzbyBiZSBpbmNsdWRlZCBpZiB0aGlzIGZlYXR1cmUgaXMgaW5jbHVkZWQuICBEZWZhdWx0cyB0bwogICAgICAgICBlbXB0eSBsaXN0LiAgTWF5IGFsc28gY29udGFpbiAnUmVxdWlyZScgb2JqZWN0cyB0aGF0IHNob3VsZCBiZQogICAgICAgICBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIGRpc3RyaWJ1dGlvbi4KCiAgICAgICdyZW1vdmUnIC0tIGEgc3RyaW5nIG9yIGxpc3Qgb2Ygc3RyaW5ncyBuYW1pbmcgcGFja2FnZXMgdG8gYmUgcmVtb3ZlZAogICAgICAgICBmcm9tIHRoZSBkaXN0cmlidXRpb24gaWYgdGhpcyBmZWF0dXJlIGlzICpub3QqIGluY2x1ZGVkLiAgSWYgdGhlCiAgICAgICAgIGZlYXR1cmUgKmlzKiBpbmNsdWRlZCwgdGhpcyBhcmd1bWVudCBpcyBpZ25vcmVkLiAgVGhpcyBhcmd1bWVudCBleGlzdHMKICAgICAgICAgdG8gc3VwcG9ydCByZW1vdmluZyBmZWF0dXJlcyB0aGF0ICJjcm9zc2N1dCIgYSBkaXN0cmlidXRpb24sIHN1Y2ggYXMKICAgICAgICAgZGVmaW5pbmcgYSAndGVzdHMnIGZlYXR1cmUgdGhhdCByZW1vdmVzIGFsbCB0aGUgJ3Rlc3RzJyBzdWJwYWNrYWdlcwogICAgICAgICBwcm92aWRlZCBieSBvdGhlciBmZWF0dXJlcy4gIFRoZSBkZWZhdWx0IGZvciB0aGlzIGFyZ3VtZW50IGlzIGFuIGVtcHR5CiAgICAgICAgIGxpc3QuICAoTm90ZTogdGhlIG5hbWVkIHBhY2thZ2Uocykgb3IgbW9kdWxlcyBtdXN0IGV4aXN0IGluIHRoZSBiYXNlCiAgICAgICAgIGRpc3RyaWJ1dGlvbiB3aGVuIHRoZSAnc2V0dXAoKScgZnVuY3Rpb24gaXMgaW5pdGlhbGx5IGNhbGxlZC4pCgogICAgICBvdGhlciBrZXl3b3JkcyAtLSBhbnkgb3RoZXIga2V5d29yZCBhcmd1bWVudHMgYXJlIHNhdmVkLCBhbmQgcGFzc2VkIHRvCiAgICAgICAgIHRoZSBkaXN0cmlidXRpb24ncyAnaW5jbHVkZSgpJyBhbmQgJ2V4Y2x1ZGUoKScgbWV0aG9kcyB3aGVuIHRoZQogICAgICAgICBmZWF0dXJlIGlzIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLCByZXNwZWN0aXZlbHkuICBTbywgZm9yIGV4YW1wbGUsIHlvdQogICAgICAgICBjb3VsZCBwYXNzICdwYWNrYWdlcz1bImEiLCJiIl0nIHRvIGNhdXNlIHBhY2thZ2VzICdhJyBhbmQgJ2InIHRvIGJlCiAgICAgICAgIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIGFzIGFwcHJvcHJpYXRlLgoKICAgIEEgZmVhdHVyZSBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lICdyZXF1aXJlcycsICdyZW1vdmUnLCBvciBvdGhlcgogICAga2V5d29yZCBhcmd1bWVudC4gIE90aGVyd2lzZSwgaXQgY2FuJ3QgYWZmZWN0IHRoZSBkaXN0cmlidXRpb24gaW4gYW55IHdheS4KICAgIE5vdGUgYWxzbyB0aGF0IHlvdSBjYW4gc3ViY2xhc3MgJ0ZlYXR1cmUnIHRvIGNyZWF0ZSB5b3VyIG93biBzcGVjaWFsaXplZAogICAgZmVhdHVyZSB0eXBlcyB0aGF0IG1vZGlmeSB0aGUgZGlzdHJpYnV0aW9uIGluIG90aGVyIHdheXMgd2hlbiBpbmNsdWRlZCBvcgogICAgZXhjbHVkZWQuICBTZWUgdGhlIGRvY3N0cmluZ3MgZm9yIHRoZSB2YXJpb3VzIG1ldGhvZHMgaGVyZSBmb3IgbW9yZSBkZXRhaWwuCiAgICBBc2lkZSBmcm9tIHRoZSBtZXRob2RzLCB0aGUgb25seSBmZWF0dXJlIGF0dHJpYnV0ZXMgdGhhdCBkaXN0cmlidXRpb25zIGxvb2sKICAgIGF0IGFyZSAnZGVzY3JpcHRpb24nIGFuZCAnb3B0aW9uYWwnLgogICAgIiIiCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHdhcm5fZGVwcmVjYXRlZCgpOgogICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgIkZlYXR1cmVzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgIgogICAgICAgICAgICAidmVyc2lvbi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzY1LiIKICAgICAgICApCiAgICAgICAgd2FybmluZ3Mud2Fybihtc2csIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0zKQoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICAgICAgc2VsZiwgZGVzY3JpcHRpb24sIHN0YW5kYXJkPUZhbHNlLCBhdmFpbGFibGU9VHJ1ZSwKICAgICAgICAgICAgb3B0aW9uYWw9VHJ1ZSwgcmVxdWlyZV9mZWF0dXJlcz0oKSwgcmVtb3ZlPSgpLCAqKmV4dHJhcyk6CiAgICAgICAgc2VsZi53YXJuX2RlcHJlY2F0ZWQoKQoKICAgICAgICBzZWxmLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24KICAgICAgICBzZWxmLnN0YW5kYXJkID0gc3RhbmRhcmQKICAgICAgICBzZWxmLmF2YWlsYWJsZSA9IGF2YWlsYWJsZQogICAgICAgIHNlbGYub3B0aW9uYWwgPSBvcHRpb25hbAogICAgICAgIGlmIGlzaW5zdGFuY2UocmVxdWlyZV9mZWF0dXJlcywgKHN0ciwgUmVxdWlyZSkpOgogICAgICAgICAgICByZXF1aXJlX2ZlYXR1cmVzID0gcmVxdWlyZV9mZWF0dXJlcywKCiAgICAgICAgc2VsZi5yZXF1aXJlX2ZlYXR1cmVzID0gWwogICAgICAgICAgICByIGZvciByIGluIHJlcXVpcmVfZmVhdHVyZXMgaWYgaXNpbnN0YW5jZShyLCBzdHIpCiAgICAgICAgXQogICAgICAgIGVyID0gW3IgZm9yIHIgaW4gcmVxdWlyZV9mZWF0dXJlcyBpZiBub3QgaXNpbnN0YW5jZShyLCBzdHIpXQogICAgICAgIGlmIGVyOgogICAgICAgICAgICBleHRyYXNbJ3JlcXVpcmVfZmVhdHVyZXMnXSA9IGVyCgogICAgICAgIGlmIGlzaW5zdGFuY2UocmVtb3ZlLCBzdHIpOgogICAgICAgICAgICByZW1vdmUgPSByZW1vdmUsCiAgICAgICAgc2VsZi5yZW1vdmUgPSByZW1vdmUKICAgICAgICBzZWxmLmV4dHJhcyA9IGV4dHJhcwoKICAgICAgICBpZiBub3QgcmVtb3ZlIGFuZCBub3QgcmVxdWlyZV9mZWF0dXJlcyBhbmQgbm90IGV4dHJhczoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICJGZWF0dXJlICVzOiBtdXN0IGRlZmluZSAncmVxdWlyZV9mZWF0dXJlcycsICdyZW1vdmUnLCBvciAiCiAgICAgICAgICAgICAgICAiYXQgbGVhc3Qgb25lIG9mICdwYWNrYWdlcycsICdweV9tb2R1bGVzJywgZXRjLiIKICAgICAgICAgICAgKQoKICAgIGRlZiBpbmNsdWRlX2J5X2RlZmF1bHQoc2VsZik6CiAgICAgICAgIiIiU2hvdWxkIHRoaXMgZmVhdHVyZSBiZSBpbmNsdWRlZCBieSBkZWZhdWx0PyIiIgogICAgICAgIHJldHVybiBzZWxmLmF2YWlsYWJsZSBhbmQgc2VsZi5zdGFuZGFyZAoKICAgIGRlZiBpbmNsdWRlX2luKHNlbGYsIGRpc3QpOgogICAgICAgICIiIkVuc3VyZSBmZWF0dXJlIGFuZCBpdHMgcmVxdWlyZW1lbnRzIGFyZSBpbmNsdWRlZCBpbiBkaXN0cmlidXRpb24KCiAgICAgICAgWW91IG1heSBvdmVycmlkZSB0aGlzIGluIGEgc3ViY2xhc3MgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgb24KICAgICAgICB0aGUgZGlzdHJpYnV0aW9uLiAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UKICAgICAgICBwZXIgZmVhdHVyZSwgYW5kIHNvIHNob3VsZCBiZSBpZGVtcG90ZW50LgoKICAgICAgICAiIiIKCiAgICAgICAgaWYgbm90IHNlbGYuYXZhaWxhYmxlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKAogICAgICAgICAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiArICIgaXMgcmVxdWlyZWQsICIKICAgICAgICAgICAgICAgICJidXQgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtIgogICAgICAgICAgICApCgogICAgICAgIGRpc3QuaW5jbHVkZSgqKnNlbGYuZXh0cmFzKQoKICAgICAgICBmb3IgZiBpbiBzZWxmLnJlcXVpcmVfZmVhdHVyZXM6CiAgICAgICAgICAgIGRpc3QuaW5jbHVkZV9mZWF0dXJlKGYpCgogICAgZGVmIGV4Y2x1ZGVfZnJvbShzZWxmLCBkaXN0KToKICAgICAgICAiIiJFbnN1cmUgZmVhdHVyZSBpcyBleGNsdWRlZCBmcm9tIGRpc3RyaWJ1dGlvbgoKICAgICAgICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgaW4gYSBzdWJjbGFzcyB0byBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyBvbgogICAgICAgIHRoZSBkaXN0cmlidXRpb24uICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgcGVyCiAgICAgICAgZmVhdHVyZSwgYW5kIG9ubHkgYWZ0ZXIgYWxsIGluY2x1ZGVkIGZlYXR1cmVzIGhhdmUgYmVlbiBhc2tlZCB0bwogICAgICAgIGluY2x1ZGUgdGhlbXNlbHZlcy4KICAgICAgICAiIiIKCiAgICAgICAgZGlzdC5leGNsdWRlKCoqc2VsZi5leHRyYXMpCgogICAgICAgIGlmIHNlbGYucmVtb3ZlOgogICAgICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnJlbW92ZToKICAgICAgICAgICAgICAgIGRpc3QuZXhjbHVkZV9wYWNrYWdlKGl0ZW0pCgogICAgZGVmIHZhbGlkYXRlKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlZlcmlmeSB0aGF0IGZlYXR1cmUgbWFrZXMgc2Vuc2UgaW4gY29udGV4dCBvZiBkaXN0cmlidXRpb24KCiAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBkaXN0cmlidXRpb24ganVzdCBiZWZvcmUgaXQgcGFyc2VzIGl0cwogICAgICAgIGNvbW1hbmQgbGluZS4gIEl0IGNoZWNrcyB0byBlbnN1cmUgdGhhdCB0aGUgJ3JlbW92ZScgYXR0cmlidXRlLCBpZiBhbnksCiAgICAgICAgY29udGFpbnMgb25seSB2YWxpZCBwYWNrYWdlL21vZHVsZSBuYW1lcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBiYXNlCiAgICAgICAgZGlzdHJpYnV0aW9uIHdoZW4gJ3NldHVwKCknIGlzIGNhbGxlZC4gIFlvdSBtYXkgb3ZlcnJpZGUgaXQgaW4gYQogICAgICAgIHN1YmNsYXNzIHRvIHBlcmZvcm0gYW55IG90aGVyIHJlcXVpcmVkIHZhbGlkYXRpb24gb2YgdGhlIGZlYXR1cmUKICAgICAgICBhZ2FpbnN0IGEgdGFyZ2V0IGRpc3RyaWJ1dGlvbi4KICAgICAgICAiIiIKCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5yZW1vdmU6CiAgICAgICAgICAgIGlmIG5vdCBkaXN0Lmhhc19jb250ZW50c19mb3IoaXRlbSk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICIlcyB3YW50cyB0byBiZSBhYmxlIHRvIHJlbW92ZSAlcywgYnV0IHRoZSBkaXN0cmlidXRpb24iCiAgICAgICAgICAgICAgICAgICAgIiBkb2Vzbid0IGNvbnRhaW4gYW55IHBhY2thZ2VzIG9yIG1vZHVsZXMgdW5kZXIgJXMiCiAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5kZXNjcmlwdGlvbiwgaXRlbSwgaXRlbSkKICAgICAgICAgICAgICAgICkKUEsDBBQAAAAAAAAAIQC5qpHuwQYAAMEGAAAvAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9leHRlbnNpb24ucHlpbXBvcnQgcmUKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgZGlzdHV0aWxzLmNvcmUKaW1wb3J0IGRpc3R1dGlscy5lcnJvcnMKaW1wb3J0IGRpc3R1dGlscy5leHRlbnNpb24KCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAKCmZyb20gLm1vbmtleSBpbXBvcnQgZ2V0X3VucGF0Y2hlZAoKCmRlZiBfaGF2ZV9jeXRob24oKToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgQ3l0aG9uIGNhbiBiZSBpbXBvcnRlZC4KICAgICIiIgogICAgY3l0aG9uX2ltcGwgPSAnQ3l0aG9uLkRpc3R1dGlscy5idWlsZF9leHQnCiAgICB0cnk6CiAgICAgICAgIyBmcm9tIChjeXRob25faW1wbCkgaW1wb3J0IGJ1aWxkX2V4dAogICAgICAgIF9faW1wb3J0X18oY3l0aG9uX2ltcGwsIGZyb21saXN0PVsnYnVpbGRfZXh0J10pLmJ1aWxkX2V4dAogICAgICAgIHJldHVybiBUcnVlCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHBhc3MKICAgIHJldHVybiBGYWxzZQoKCiMgZm9yIGNvbXBhdGliaWxpdHkKaGF2ZV9weXJleCA9IF9oYXZlX2N5dGhvbgoKX0V4dGVuc2lvbiA9IGdldF91bnBhdGNoZWQoZGlzdHV0aWxzLmNvcmUuRXh0ZW5zaW9uKQoKCmNsYXNzIEV4dGVuc2lvbihfRXh0ZW5zaW9uKToKICAgICIiIkV4dGVuc2lvbiB0aGF0IHVzZXMgJy5jJyBmaWxlcyBpbiBwbGFjZSBvZiAnLnB5eCcgZmlsZXMiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgc291cmNlcywgKmFyZ3MsICoqa3cpOgogICAgICAgICMgVGhlICphcmdzIGlzIG5lZWRlZCBmb3IgY29tcGF0aWJpbGl0eSBhcyBjYWxscyBtYXkgdXNlIHBvc2l0aW9uYWwKICAgICAgICAjIGFyZ3VtZW50cy4gcHlfbGltaXRlZF9hcGkgbWF5IGJlIHNldCBvbmx5IHZpYSBrZXl3b3JkLgogICAgICAgIHNlbGYucHlfbGltaXRlZF9hcGkgPSBrdy5wb3AoInB5X2xpbWl0ZWRfYXBpIiwgRmFsc2UpCiAgICAgICAgX0V4dGVuc2lvbi5fX2luaXRfXyhzZWxmLCBuYW1lLCBzb3VyY2VzLCAqYXJncywgKiprdykKCiAgICBkZWYgX2NvbnZlcnRfcHl4X3NvdXJjZXNfdG9fbGFuZyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXBsYWNlIHNvdXJjZXMgd2l0aCAucHl4IGV4dGVuc2lvbnMgdG8gc291cmNlcyB3aXRoIHRoZSB0YXJnZXQKICAgICAgICBsYW5ndWFnZSBleHRlbnNpb24uIFRoaXMgbWVjaGFuaXNtIGFsbG93cyBsYW5ndWFnZSBhdXRob3JzIHRvIHN1cHBseQogICAgICAgIHByZS1jb252ZXJ0ZWQgc291cmNlcyBidXQgdG8gcHJlZmVyIHRoZSAucHl4IHNvdXJjZXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgX2hhdmVfY3l0aG9uKCk6CiAgICAgICAgICAgICMgdGhlIGJ1aWxkIGhhcyBDeXRob24sIHNvIGFsbG93IGl0IHRvIGNvbXBpbGUgdGhlIC5weXggZmlsZXMKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbGFuZyA9IHNlbGYubGFuZ3VhZ2Ugb3IgJycKICAgICAgICB0YXJnZXRfZXh0ID0gJy5jcHAnIGlmIGxhbmcubG93ZXIoKSA9PSAnYysrJyBlbHNlICcuYycKICAgICAgICBzdWIgPSBmdW5jdG9vbHMucGFydGlhbChyZS5zdWIsICcucHl4JCcsIHRhcmdldF9leHQpCiAgICAgICAgc2VsZi5zb3VyY2VzID0gbGlzdChtYXAoc3ViLCBzZWxmLnNvdXJjZXMpKQoKCmNsYXNzIExpYnJhcnkoRXh0ZW5zaW9uKToKICAgICIiIkp1c3QgbGlrZSBhIHJlZ3VsYXIgRXh0ZW5zaW9uLCBidXQgYnVpbHQgYXMgYSBsaWJyYXJ5IGluc3RlYWQiIiIKUEsDBBQAAAAAAAAAIQDQintlgwAAAIMAAAA1AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9leHRlcm4vX19pbml0X18ucHlmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBWZW5kb3JJbXBvcnRlcgoKbmFtZXMgPSAnc2l4JywKVmVuZG9ySW1wb3J0ZXIoX19uYW1lX18sIG5hbWVzLCAncGtnX3Jlc291cmNlcy5fdmVuZG9yJykuaW5zdGFsbCgpClBLAwQUAAAAAAAAACEABOrBvUoMAABKDAAAKwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ2xpYmMucHkjIFRoaXMgZmlsZSBvcmlnaW5hbGx5IGZyb20gcGlwOgojIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9ibG9iLzhmNGYxNWE1YTk1ZDdkNWI1MTFjZWFlZTllZDI2MTE3NmMxODE5NzAvc3JjL3BpcC9faW50ZXJuYWwvdXRpbHMvZ2xpYmMucHkKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBjdHlwZXMKaW1wb3J0IHJlCmltcG9ydCB3YXJuaW5ncwoKCmRlZiBnbGliY192ZXJzaW9uX3N0cmluZygpOgogICAgIlJldHVybnMgZ2xpYmMgdmVyc2lvbiBzdHJpbmcsIG9yIE5vbmUgaWYgbm90IHVzaW5nIGdsaWJjLiIKCiAgICAjIGN0eXBlcy5DRExMKE5vbmUpIGludGVybmFsbHkgY2FsbHMgZGxvcGVuKE5VTEwpLCBhbmQgYXMgdGhlIGRsb3BlbgogICAgIyBtYW5wYWdlIHNheXMsICJJZiBmaWxlbmFtZSBpcyBOVUxMLCB0aGVuIHRoZSByZXR1cm5lZCBoYW5kbGUgaXMgZm9yIHRoZQogICAgIyBtYWluIHByb2dyYW0iLiBUaGlzIHdheSB3ZSBjYW4gbGV0IHRoZSBsaW5rZXIgZG8gdGhlIHdvcmsgdG8gZmlndXJlIG91dAogICAgIyB3aGljaCBsaWJjIG91ciBwcm9jZXNzIGlzIGFjdHVhbGx5IHVzaW5nLgogICAgcHJvY2Vzc19uYW1lc3BhY2UgPSBjdHlwZXMuQ0RMTChOb25lKQogICAgdHJ5OgogICAgICAgIGdudV9nZXRfbGliY192ZXJzaW9uID0gcHJvY2Vzc19uYW1lc3BhY2UuZ251X2dldF9saWJjX3ZlcnNpb24KICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAjIFN5bWJvbCBkb2Vzbid0IGV4aXN0IC0+IHRoZXJlZm9yZSwgd2UgYXJlIG5vdCBsaW5rZWQgdG8KICAgICAgICAjIGdsaWJjLgogICAgICAgIHJldHVybiBOb25lCgogICAgIyBDYWxsIGdudV9nZXRfbGliY192ZXJzaW9uLCB3aGljaCByZXR1cm5zIGEgc3RyaW5nIGxpa2UgIjIuNSIKICAgIGdudV9nZXRfbGliY192ZXJzaW9uLnJlc3R5cGUgPSBjdHlwZXMuY19jaGFyX3AKICAgIHZlcnNpb25fc3RyID0gZ251X2dldF9saWJjX3ZlcnNpb24oKQogICAgIyBweTIgLyBweTMgY29tcGF0aWJpbGl0eToKICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb25fc3RyLCBzdHIpOgogICAgICAgIHZlcnNpb25fc3RyID0gdmVyc2lvbl9zdHIuZGVjb2RlKCJhc2NpaSIpCgogICAgcmV0dXJuIHZlcnNpb25fc3RyCgoKIyBTZXBhcmF0ZWQgb3V0IGZyb20gaGF2ZV9jb21wYXRpYmxlX2dsaWJjIGZvciBlYXNpZXIgdW5pdCB0ZXN0aW5nCmRlZiBjaGVja19nbGliY192ZXJzaW9uKHZlcnNpb25fc3RyLCByZXF1aXJlZF9tYWpvciwgbWluaW11bV9taW5vcik6CiAgICAjIFBhcnNlIHN0cmluZyBhbmQgY2hlY2sgYWdhaW5zdCByZXF1ZXN0ZWQgdmVyc2lvbi4KICAgICMKICAgICMgV2UgdXNlIGEgcmVnZXhwIGluc3RlYWQgb2Ygc3RyLnNwbGl0IGJlY2F1c2Ugd2Ugd2FudCB0byBkaXNjYXJkIGFueQogICAgIyByYW5kb20ganVuayB0aGF0IG1pZ2h0IGNvbWUgYWZ0ZXIgdGhlIG1pbm9yIHZlcnNpb24gLS0gdGhpcyBtaWdodCBoYXBwZW4KICAgICMgaW4gcGF0Y2hlZC9mb3JrZWQgdmVyc2lvbnMgb2YgZ2xpYmMgKGUuZy4gTGluYXJvJ3MgdmVyc2lvbiBvZiBnbGliYwogICAgIyB1c2VzIHZlcnNpb24gc3RyaW5ncyBsaWtlICIyLjIwLTIwMTQuMTEiKS4gU2VlIGdoLTM1ODguCiAgICBtID0gcmUubWF0Y2gociIoP1A8bWFqb3I+WzAtOV0rKVwuKD9QPG1pbm9yPlswLTldKykiLCB2ZXJzaW9uX3N0cikKICAgIGlmIG5vdCBtOgogICAgICAgIHdhcm5pbmdzLndhcm4oIkV4cGVjdGVkIGdsaWJjIHZlcnNpb24gd2l0aCAyIGNvbXBvbmVudHMgbWFqb3IubWlub3IsIgogICAgICAgICAgICAgICAgICAgICAgIiBnb3Q6ICVzIiAlIHZlcnNpb25fc3RyLCBSdW50aW1lV2FybmluZykKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiAoaW50KG0uZ3JvdXAoIm1ham9yIikpID09IHJlcXVpcmVkX21ham9yIGFuZAogICAgICAgICAgICBpbnQobS5ncm91cCgibWlub3IiKSkgPj0gbWluaW11bV9taW5vcikKCgpkZWYgaGF2ZV9jb21wYXRpYmxlX2dsaWJjKHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKToKICAgIHZlcnNpb25fc3RyID0gZ2xpYmNfdmVyc2lvbl9zdHJpbmcoKQogICAgaWYgdmVyc2lvbl9zdHIgaXMgTm9uZToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBjaGVja19nbGliY192ZXJzaW9uKHZlcnNpb25fc3RyLCByZXF1aXJlZF9tYWpvciwgbWluaW11bV9taW5vcikKCgojIHBsYXRmb3JtLmxpYmNfdmVyIHJlZ3VsYXJseSByZXR1cm5zIGNvbXBsZXRlbHkgbm9uc2Vuc2ljYWwgZ2xpYmMKIyB2ZXJzaW9ucy4gRS5nLiBvbiBteSBjb21wdXRlciwgcGxhdGZvcm0gc2F5czoKIwojICAgfiQgcHl0aG9uMi43IC1jICdpbXBvcnQgcGxhdGZvcm07IHByaW50KHBsYXRmb3JtLmxpYmNfdmVyKCkpJwojICAgKCdnbGliYycsICcyLjcnKQojICAgfiQgcHl0aG9uMy41IC1jICdpbXBvcnQgcGxhdGZvcm07IHByaW50KHBsYXRmb3JtLmxpYmNfdmVyKCkpJwojICAgKCdnbGliYycsICcyLjknKQojCiMgQnV0IHRoZSB0cnV0aCBpczoKIwojICAgfiQgbGRkIC0tdmVyc2lvbgojICAgbGRkIChEZWJpYW4gR0xJQkMgMi4yMi0xMSkgMi4yMgojCiMgVGhpcyBpcyB1bmZvcnR1bmF0ZSwgYmVjYXVzZSBpdCBtZWFucyB0aGF0IHRoZSBsaW5laGF1bCBkYXRhIG9uIGxpYmMKIyB2ZXJzaW9ucyB0aGF0IHdhcyBnZW5lcmF0ZWQgYnkgcGlwIDguMS4yIGFuZCBlYXJsaWVyIGlzIHVzZWxlc3MgYW5kCiMgbWlzbGVhZGluZy4gU29sdXRpb246IGluc3RlYWQgb2YgdXNpbmcgcGxhdGZvcm0sIHVzZSBvdXIgY29kZSB0aGF0IGFjdHVhbGx5CiMgd29ya3MuCmRlZiBsaWJjX3ZlcigpOgogICAgIiIiVHJ5IHRvIGRldGVybWluZSB0aGUgZ2xpYmMgdmVyc2lvbgoKICAgIFJldHVybnMgYSB0dXBsZSBvZiBzdHJpbmdzIChsaWIsIHZlcnNpb24pIHdoaWNoIGRlZmF1bHQgdG8gZW1wdHkgc3RyaW5ncwogICAgaW4gY2FzZSB0aGUgbG9va3VwIGZhaWxzLgogICAgIiIiCiAgICBnbGliY192ZXJzaW9uID0gZ2xpYmNfdmVyc2lvbl9zdHJpbmcoKQogICAgaWYgZ2xpYmNfdmVyc2lvbiBpcyBOb25lOgogICAgICAgIHJldHVybiAoIiIsICIiKQogICAgZWxzZToKICAgICAgICByZXR1cm4gKCJnbGliYyIsIGdsaWJjX3ZlcnNpb24pClBLAwQUAAAAAAAAACEAvF2hOVcUAABXFAAAKgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ2xvYi5weSIiIgpGaWxlbmFtZSBnbG9iYmluZyB1dGlsaXR5LiBNb3N0bHkgYSBjb3B5IG9mIGBnbG9iYCBmcm9tIFB5dGhvbiAzLjUuCgpDaGFuZ2VzIGluY2x1ZGU6CiAqIGB5aWVsZCBmcm9tYCBhbmQgUEVQMzEwMiBgKmAgcmVtb3ZlZC4KICogYGJ5dGVzYCBjaGFuZ2VkIHRvIGBzaXguYmluYXJ5X3R5cGVgLgogKiBIaWRkZW4gZmlsZXMgYXJlIG5vdCBpZ25vcmVkLgoiIiIKCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IGZubWF0Y2gKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXggaW1wb3J0IGJpbmFyeV90eXBlCgpfX2FsbF9fID0gWyJnbG9iIiwgImlnbG9iIiwgImVzY2FwZSJdCgoKZGVmIGdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZT1GYWxzZSk6CiAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHBhdGhzIG1hdGNoaW5nIGEgcGF0aG5hbWUgcGF0dGVybi4KCiAgICBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBzaW1wbGUgc2hlbGwtc3R5bGUgd2lsZGNhcmRzIGEgbGEKICAgIGZubWF0Y2guIEhvd2V2ZXIsIHVubGlrZSBmbm1hdGNoLCBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCBhCiAgICBkb3QgYXJlIHNwZWNpYWwgY2FzZXMgdGhhdCBhcmUgbm90IG1hdGNoZWQgYnkgJyonIGFuZCAnPycKICAgIHBhdHRlcm5zLgoKICAgIElmIHJlY3Vyc2l2ZSBpcyB0cnVlLCB0aGUgcGF0dGVybiAnKionIHdpbGwgbWF0Y2ggYW55IGZpbGVzIGFuZAogICAgemVybyBvciBtb3JlIGRpcmVjdG9yaWVzIGFuZCBzdWJkaXJlY3Rvcmllcy4KICAgICIiIgogICAgcmV0dXJuIGxpc3QoaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZT1yZWN1cnNpdmUpKQoKCmRlZiBpZ2xvYihwYXRobmFtZSwgcmVjdXJzaXZlPUZhbHNlKToKICAgICIiIlJldHVybiBhbiBpdGVyYXRvciB3aGljaCB5aWVsZHMgdGhlIHBhdGhzIG1hdGNoaW5nIGEgcGF0aG5hbWUgcGF0dGVybi4KCiAgICBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBzaW1wbGUgc2hlbGwtc3R5bGUgd2lsZGNhcmRzIGEgbGEKICAgIGZubWF0Y2guIEhvd2V2ZXIsIHVubGlrZSBmbm1hdGNoLCBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCBhCiAgICBkb3QgYXJlIHNwZWNpYWwgY2FzZXMgdGhhdCBhcmUgbm90IG1hdGNoZWQgYnkgJyonIGFuZCAnPycKICAgIHBhdHRlcm5zLgoKICAgIElmIHJlY3Vyc2l2ZSBpcyB0cnVlLCB0aGUgcGF0dGVybiAnKionIHdpbGwgbWF0Y2ggYW55IGZpbGVzIGFuZAogICAgemVybyBvciBtb3JlIGRpcmVjdG9yaWVzIGFuZCBzdWJkaXJlY3Rvcmllcy4KICAgICIiIgogICAgaXQgPSBfaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZSkKICAgIGlmIHJlY3Vyc2l2ZSBhbmQgX2lzcmVjdXJzaXZlKHBhdGhuYW1lKToKICAgICAgICBzID0gbmV4dChpdCkgICMgc2tpcCBlbXB0eSBzdHJpbmcKICAgICAgICBhc3NlcnQgbm90IHMKICAgIHJldHVybiBpdAoKCmRlZiBfaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZSk6CiAgICBkaXJuYW1lLCBiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aG5hbWUpCiAgICBpZiBub3QgaGFzX21hZ2ljKHBhdGhuYW1lKToKICAgICAgICBpZiBiYXNlbmFtZToKICAgICAgICAgICAgaWYgb3MucGF0aC5sZXhpc3RzKHBhdGhuYW1lKToKICAgICAgICAgICAgICAgIHlpZWxkIHBhdGhuYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBQYXR0ZXJucyBlbmRpbmcgd2l0aCBhIHNsYXNoIHNob3VsZCBtYXRjaCBvbmx5IGRpcmVjdG9yaWVzCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCBwYXRobmFtZQogICAgICAgIHJldHVybgogICAgaWYgbm90IGRpcm5hbWU6CiAgICAgICAgaWYgcmVjdXJzaXZlIGFuZCBfaXNyZWN1cnNpdmUoYmFzZW5hbWUpOgogICAgICAgICAgICBmb3IgeCBpbiBnbG9iMihkaXJuYW1lLCBiYXNlbmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCB4CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIHggaW4gZ2xvYjEoZGlybmFtZSwgYmFzZW5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgeAogICAgICAgIHJldHVybgogICAgIyBgb3MucGF0aC5zcGxpdCgpYCByZXR1cm5zIHRoZSBhcmd1bWVudCBpdHNlbGYgYXMgYSBkaXJuYW1lIGlmIGl0IGlzIGEKICAgICMgZHJpdmUgb3IgVU5DIHBhdGguICBQcmV2ZW50IGFuIGluZmluaXRlIHJlY3Vyc2lvbiBpZiBhIGRyaXZlIG9yIFVOQyBwYXRoCiAgICAjIGNvbnRhaW5zIG1hZ2ljIGNoYXJhY3RlcnMgKGkuZS4gcidcXD9cQzonKS4KICAgIGlmIGRpcm5hbWUgIT0gcGF0aG5hbWUgYW5kIGhhc19tYWdpYyhkaXJuYW1lKToKICAgICAgICBkaXJzID0gX2lnbG9iKGRpcm5hbWUsIHJlY3Vyc2l2ZSkKICAgIGVsc2U6CiAgICAgICAgZGlycyA9IFtkaXJuYW1lXQogICAgaWYgaGFzX21hZ2ljKGJhc2VuYW1lKToKICAgICAgICBpZiByZWN1cnNpdmUgYW5kIF9pc3JlY3Vyc2l2ZShiYXNlbmFtZSk6CiAgICAgICAgICAgIGdsb2JfaW5fZGlyID0gZ2xvYjIKICAgICAgICBlbHNlOgogICAgICAgICAgICBnbG9iX2luX2RpciA9IGdsb2IxCiAgICBlbHNlOgogICAgICAgIGdsb2JfaW5fZGlyID0gZ2xvYjAKICAgIGZvciBkaXJuYW1lIGluIGRpcnM6CiAgICAgICAgZm9yIG5hbWUgaW4gZ2xvYl9pbl9kaXIoZGlybmFtZSwgYmFzZW5hbWUpOgogICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkKCgojIFRoZXNlIDIgaGVscGVyIGZ1bmN0aW9ucyBub24tcmVjdXJzaXZlbHkgZ2xvYiBpbnNpZGUgYSBsaXRlcmFsIGRpcmVjdG9yeS4KIyBUaGV5IHJldHVybiBhIGxpc3Qgb2YgYmFzZW5hbWVzLiBgZ2xvYjFgIGFjY2VwdHMgYSBwYXR0ZXJuIHdoaWxlIGBnbG9iMGAKIyB0YWtlcyBhIGxpdGVyYWwgYmFzZW5hbWUgKHNvIGl0IG9ubHkgaGFzIHRvIGNoZWNrIGZvciBpdHMgZXhpc3RlbmNlKS4KCgpkZWYgZ2xvYjEoZGlybmFtZSwgcGF0dGVybik6CiAgICBpZiBub3QgZGlybmFtZToKICAgICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIGJpbmFyeV90eXBlKToKICAgICAgICAgICAgZGlybmFtZSA9IG9zLmN1cmRpci5lbmNvZGUoJ0FTQ0lJJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyCiAgICB0cnk6CiAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICByZXR1cm4gW10KICAgIHJldHVybiBmbm1hdGNoLmZpbHRlcihuYW1lcywgcGF0dGVybikKCgpkZWYgZ2xvYjAoZGlybmFtZSwgYmFzZW5hbWUpOgogICAgaWYgbm90IGJhc2VuYW1lOgogICAgICAgICMgYG9zLnBhdGguc3BsaXQoKWAgcmV0dXJucyBhbiBlbXB0eSBiYXNlbmFtZSBmb3IgcGF0aHMgZW5kaW5nIHdpdGggYQogICAgICAgICMgZGlyZWN0b3J5IHNlcGFyYXRvci4gICdxKngvJyBzaG91bGQgbWF0Y2ggb25seSBkaXJlY3Rvcmllcy4KICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICByZXR1cm4gW2Jhc2VuYW1lXQogICAgZWxzZToKICAgICAgICBpZiBvcy5wYXRoLmxleGlzdHMob3MucGF0aC5qb2luKGRpcm5hbWUsIGJhc2VuYW1lKSk6CiAgICAgICAgICAgIHJldHVybiBbYmFzZW5hbWVdCiAgICByZXR1cm4gW10KCgojIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5IHlpZWxkcyByZWxhdGl2ZSBwYXRobmFtZXMgaW5zaWRlIGEgbGl0ZXJhbAojIGRpcmVjdG9yeS4KCgpkZWYgZ2xvYjIoZGlybmFtZSwgcGF0dGVybik6CiAgICBhc3NlcnQgX2lzcmVjdXJzaXZlKHBhdHRlcm4pCiAgICB5aWVsZCBwYXR0ZXJuWzowXQogICAgZm9yIHggaW4gX3JsaXN0ZGlyKGRpcm5hbWUpOgogICAgICAgIHlpZWxkIHgKCgojIFJlY3Vyc2l2ZWx5IHlpZWxkcyByZWxhdGl2ZSBwYXRobmFtZXMgaW5zaWRlIGEgbGl0ZXJhbCBkaXJlY3RvcnkuCmRlZiBfcmxpc3RkaXIoZGlybmFtZSk6CiAgICBpZiBub3QgZGlybmFtZToKICAgICAgICBpZiBpc2luc3RhbmNlKGRpcm5hbWUsIGJpbmFyeV90eXBlKToKICAgICAgICAgICAgZGlybmFtZSA9IGJpbmFyeV90eXBlKG9zLmN1cmRpciwgJ0FTQ0lJJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyCiAgICB0cnk6CiAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCiAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgcmV0dXJuCiAgICBmb3IgeCBpbiBuYW1lczoKICAgICAgICB5aWVsZCB4CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXJuYW1lLCB4KSBpZiBkaXJuYW1lIGVsc2UgeAogICAgICAgIGZvciB5IGluIF9ybGlzdGRpcihwYXRoKToKICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHgsIHkpCgoKbWFnaWNfY2hlY2sgPSByZS5jb21waWxlKCcoWyo/W10pJykKbWFnaWNfY2hlY2tfYnl0ZXMgPSByZS5jb21waWxlKGInKFsqP1tdKScpCgoKZGVmIGhhc19tYWdpYyhzKToKICAgIGlmIGlzaW5zdGFuY2UocywgYmluYXJ5X3R5cGUpOgogICAgICAgIG1hdGNoID0gbWFnaWNfY2hlY2tfYnl0ZXMuc2VhcmNoKHMpCiAgICBlbHNlOgogICAgICAgIG1hdGNoID0gbWFnaWNfY2hlY2suc2VhcmNoKHMpCiAgICByZXR1cm4gbWF0Y2ggaXMgbm90IE5vbmUKCgpkZWYgX2lzcmVjdXJzaXZlKHBhdHRlcm4pOgogICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBiaW5hcnlfdHlwZSk6CiAgICAgICAgcmV0dXJuIHBhdHRlcm4gPT0gYicqKicKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHBhdHRlcm4gPT0gJyoqJwoKCmRlZiBlc2NhcGUocGF0aG5hbWUpOgogICAgIiIiRXNjYXBlIGFsbCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAgICAiIiIKICAgICMgRXNjYXBpbmcgaXMgZG9uZSBieSB3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zP3//+nMCAAAibXo/f//6cEIAACA+ip1JoPHBIm93P3//4t//Dv+ib3o/f//D42iCAAAg43o/f///+mWCAAAi4Xo/f//a8AKD77KjUQI0ImF6P3//+l7CAAAgPpJdFWA+mh0RID6bHQYgPp3D4VjCAAAgY3w/f//AAgAAOlUCAAAgDtsdRZDgY3w/f//ABAAAImdxP3//+k5CAAAg43w/f//EOktCAAAg43w/f//IOkhCAAAigM8NnUdgHsBNHUXQ0OBjfD9//8AgAAAiZ3E/f//6f4HAAA8M3UdgHsBMnUXQ0OBpfD9////f///iZ3E/f//6d0HAAA8ZA+E1QcAADxpD4TNBwAAPG8PhMUHAAA8dQ+EvQcAADx4D4S1BwAAPFgPhK0HAACJtZT9//+NhaT9//9QD7bCUIm1yP3//+gIPQAAWYXAioXv/f//WXQii420/f//jbXY/f//6KT7//+KA0OJncT9//+EwA+EpPz//4uNtP3//4212P3//+iC+///6U0HAAAPvsKD+GQPj+gBAAAPhHkCAACD+FMPj/IAAAAPhIAAAACD6EF0EEhIdFhISHQISEgPhZIFAACAwiDHhZD9//8BAAAAiJXv/f//g43w/f//QDm16P3//42d9P3//7gAAgAAiZ3k/f//iYWg/f//D41IAgAAx4Xo/f//BgAAAOmlAgAA94Xw/f//MAgAAA+FmAAAAIGN8P3//wAIAADpiQAAAPeF8P3//zAIAAB1CoGN8P3//wAIAACLjej9//+D+f91Bbn///9/g8cE94Xw/f//EAgAAIm93P3//4t//Im95P3//w+EsQQAADv+dQuhlBJBAImF5P3//4uF5P3//8eFyP3//wEAAADpfwQAAIPoWA+E2gIAAEhIdHkrwQ+EJ////0hID4WeBAAAg8cE94Xw/f//EAgAAIm93P3//3QwD7dH/FBoAAIAAI2F9P3//1CNheD9//9Q6Es7AACDxBCFwHQfx4XA/f//AQAAAOsTikf8iIX0/f//x4Xg/f//AQAAAI2F9P3//4mF5P3//+k1BAAAiweDxwSJvdz9//87xnQ7i0gEO850NPeF8P3//wAIAAAPvwCJjeT9//90FJkrwtH4x4XI/f//AQAAAOnwAwAAibXI/f//6eUDAAChkBJBAImF5P3//1DowjgAAFnpzgMAAIP4cA+P+wEA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1er//1mFwA+EnQIAAIsG9kQHBIAPhJACAADoi9b//4tAbDPJOUgUjYUc5f//D5TBUIsG/zQHiY0g5f///xXg4EAAhcAPhGACAAAzyTmNIOX//3QIhNsPhFACAAD/FdzgQACLnTTl//+JhRzl//8zwImFPOX//zlFEA+GQgUAAImFROX//4qFJ+X//4TAD4VnAQAAiguLtSjl//8zwID5Cg+UwImFIOX//4sGA8eDeDgAdBWKUDSIVfSITfWDYDgAagKNRfRQ60sPvsFQ6Nfs//9ZhcB0OouNNOX//yvLA00QM8BAO8gPhqUBAABqAo2FQOX//1NQ6DwoAACDxAyD+P8PhLEEAABD/4VE5f//6xtqAVONhUDl//9Q6BgoAACDxAyD+P8PhI0EAAAzwFBQagWNTfRRagGNjUDl//9RUP+1HOX//0P/hUTl////FbDgQACL8IX2D4RcBAAAagCNhTzl//9QVo1F9FCLhSjl//+LAP80B/8VmOBAAIXAD4QpBAAAi4VE5f//i40w5f//A8E5tTzl//+JhTjl//8PjBUEAACDvSDl//8AD4TNAAAAagCNhTzl//9QagGNRfRQi4Uo5f//iwDGRfQN/zQH/xWY4EAAhcAPhNADAACDvTzl//8BD4zPAwAA/4Uw5f///4U45f//6YMAAAA8AXQEPAJ1IQ+3MzPJZoP+Cg+UwUNDg4VE5f//Aom1QOX//4mNIOX//zwBdAQ8AnVS/7VA5f//6CUlAABZZjuFQOX//w+FaAMAAIOFOOX//wKDvSDl//8AdClqDVhQiYVA5f//6PgkAABZZjuFQOX//w+FOwMAAP+FOOX///+FMOX//4tFEDmFROX//w+C+f3//+knAwAAiw6KE/+FOOX//4hUDzSLDolEDzjpDgMAADPJiwYDx/ZABIAPhL8CAACLhTTl//+JjUDl//+E2w+FygAAAImFPOX//zlNEA+GIAMAAOsGi7Uo5f//i4085f//g6VE5f//ACuNNOX//42FSOX//ztNEHM5i5U85f///4U85f//ihJBgPoKdRD/hTDl///GAA1A/4VE5f//iBBA/4VE5f//gb1E5f///xMAAHLCi9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EQgIAAIuFLOX//wGFOOX//zvDD4w6AgAAi4U85f//K4U05f//O0UQD4JM////6SACAACJhUTl//+A+wIPhdEAAAA5TRAPhk0CAADrBou1KOX//4uNROX//4OlPOX//wArjTTl//+NhUjl//87TRBzRouVROX//4OFROX//wIPtxJBQWaD+gp1FoOFMOX//wJqDVtmiRhAQIOFPOX//wKDhTzl//8CZokQQECBvTzl///+EwAAcrWL2I2FSOX//yvYagCNhSzl//9QU42FSOX//1CLBv80B/8VmOBAAIXAD4RiAQAAi4Us5f//AYU45f//O8MPjFoBAACLhUTl//8rhTTl//87RRAPgj/////pQAEAADlNEA+GfAEAAIuNROX//4OlPOX//wArjTTl//9qAo2FSPn//147TRBzPIuVROX//w+3EgG1ROX//wPOZoP6CnUOag1bZokYA8YBtTzl//8BtTzl//9miRADxoG9POX//6gGAAByvzP2VlZoVQ0AAI2N8Ov//1GNjUj5//8rwZkrwtH4UIvBUFZo6f0AAP8VsOBAAIvYO94PhJcAAABqAI2FLOX//1CLwyvGUI2ENfDr//9Qi4Uo5f//iwD/NAf/FZjgQACFwHQMA7Us5f//O95/y+sM/xVc4EAAiYVA5f//O95/XIuFROX//yuFNOX//4mFOOX//ztFEA+CCv///+s/agCNjSzl//9R/3UQ/7U05f///zD/FZjgQACFwHQVi4Us5f//g6VA5f//AImFOOX//+sM/xVc4EAAiYVA5f//g7045f//AHVsg71A5f//AHQtagVeObVA5f//dRTosrb//8cACQAAAOi6tv//iTDrP/+1QOX//+i+tv//Wesxi7Uo5f//iwb2RAcEQHQPi4U05f//gDgadQQzwOsk6HK2///HABwAAADoerb//4MgAIPI/+sMi4U45f//K4Uw5f//X1uLTfwzzV7o2J3//8nDahBo8PdAAOiEtv//i0UIg/j+dRvoPrb//4MgAOgjtv//xwAJAAAAg8j/6Z0AAAAz/zvHfAg7BZAqQQByIegVtv//iTjo+7X//8cACQAAAFdXV1dX6IO1//+DxBTryYvIwfkFjRyNoCpBAIvwg+YfweYGiwsPvkwxBIPhAXS/UOg5JAAAWYl9/IsD9kQwBAF0Fv91EP91DP91COgu+P//g8QMiUXk6xbomLX//8cACQAAAOigtf//iTiDTeT/x0X8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VVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+fwA9AAAARW5jb2RlUG9pbnRlcgAAAEsARQBSAE4ARQBMADMAMgAuAEQATABMAAAAAABEZWNvZGVQb2ludGVyAAAARmxzRnJlZQBGbHNTZXRWYWx1ZQBGbHNHZXRWYWx1ZQBGbHNBbGxvYwAAAABydW50aW1lIGVycm9yIAAADQoAAFRMT1NTIGVycm9yDQoAAABTSU5HIGVycm9yDQoAAAAARE9NQUlOIGVycm9yDQoAAFI2MDM0DQpBbiBhcHBsaWNhdGlvbiBoYXMgbWFkZSBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGluY29ycmVjdGx5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAAAAAABSNjAzMw0KLSBBdHRlbXB0IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAFI2MDE4DQotIHVuZXhwZWN0ZWQgaGVhcCBlcnJvcg0KAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAFI2MDA4DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGFyZ3VtZW50cw0KAAAAUjYwMDINCi0gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBub3QgbG9hZGVkDQoAAAAATWljcm9zb2Z0IFZpc3VhbCBDKysgUnVudGltZSBMaWJyYXJ5AAAAAAoKAAAuLi4APHByb2dyYW0gbmFtZSB1bmtub3duPgAAUnVudGltZSBFcnJvciEKClByb2dyYW06IAAAAAAAAAAFAADACwAAAAAAAAAdAADABAAAAAAAAACWAADABAAAAAAAAACNAADACAAAAAAAAACOAADACAAAAAAAAACPAADACAAAAAAAAACQAADACAAAAAAAAACRAADACAAAAAAAAACSAADACAAAAAAAAACTAADACAAAAAAAAAAGgICGgIGAAAAQA4aAhoKAFAUFRUVFhYWFBQAAMDCAUICIAAgAKCc4UFeAAAcANzAwUFCIAAAAICiAiICAAAAAYGhgaGhoCAgHeHBwd3BwCAgAAAgACAAHCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgAGgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAA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0PRAAAMAAAAAOAAAsGkAAKCZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAANwYQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAvCNAAAAAAAD+////AAAAAIj///8AAAAA/v////olQAD+JUAA/v///8AlQADUJUAA/v///wAAAACM////AAAAAP7///9oNUAAbDVAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAATO0AAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAOE7QAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAaz1AAAAAAAAAAAAANz1AAP7///8AAAAA1P///wAAAAD+////AAAAAPA+QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAI0BAAAAAAAD+////AAAAANT///8AAAAA/v///01BQABpQUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAF1HQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAK0tAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAACbTkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAN1QQAD+////AAAAAOxQQAD+////AAAAANj///8AAAAA/v///wAAAACfUkAA/v///wAAAACrUkAA/v///wAAAADU////AAAAAP7///8AAAAAZVlAAAAAAAD+////AAAAANj///8AAAAA/v///wtbQAAfW0AAAAAAAP7///8AAAAA2P///wAAAAD+////XVtAAGFbQAAAAAAA/v///wAAAADA////AAAAAP7///8AAAAAuF5AAAAAAAD+////AAAAAND///8AAAAA/v///0hfQABfX0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAALlqQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAymxAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADOeUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAN6BQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAv4JAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAC0lUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAE2YQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA5KFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABbpkAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAACGoQAAAAAAAAAAAAF2nQAD+////AAAAAND///8AAAAA/v///wAAAADcrkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAPjCQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAm8pAAFz5AAAAAAAAAAAAABYAAQAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAACc+gAAuPoAAM76AADk+gAA9voAAA77AAAk+wAAPPsAAFT7AABo+wAAcPsAAIL7AACQ+wAAovsAALT7AADG+wAA1vsAAOT7AAD8+wAAEPwAACT8AABA/AAAXvwAAHL8AACC/AAAjvwAAJr8AACm/AAAvvwAANb8AADg/AAA7PwAAP78AAAM/QAAGP0AACb9AAAw/QAAQP0AAFb9AABi/QAAcv0AAJr9AAC0/QAAzP0AAOb9AAD8/QAAFv4AACT+AAAy/gAATP4AAFz+AABy/gAAjP4AAJj+AACm/gAAtv4AAMb+AADY/gAA7P4AAPz+AAAS/wAAIv8AADT/AABG/wAAWP8AAGr/AAB2/wAAhP8AAJT/AACq/wAAuv8AAMr/AADY/wAA6v8AAPz/AAAkAAEAMAABAEAAAQBSAAEAAAAAAFIBR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AADGAUdldEV4aXRDb2RlUHJvY2VzcwAAbgRXYWl0Rm9yU2luZ2xlT2JqZWN0AJUAQ3JlYXRlUHJvY2Vzc0EAAK8DU2V0Q29uc29sZUN0cmxIYW5kbGVyAPUBR2V0TW9kdWxlRmlsZU5hbWVBAADaAEVudGVyQ3JpdGljYWxTZWN0aW9uAAD0AkxlYXZlQ3JpdGljYWxTZWN0aW9uAAD6AUdldE1vZHVsZUhhbmRsZVcAACsEU2xlZXAAIgJHZXRQcm9jQWRkcmVzcwAABQFFeGl0UHJvY2VzcwBwAUdldENvbW1hbmRMaW5lQQA8AkdldFN0YXJ0dXBJbmZvQQDwA1NldEhhbmRsZUNvdW50AAA+AkdldFN0ZEhhbmRsZQAA2AFHZXRGaWxlVHlwZQC/AERlbGV0ZUNyaXRpY2FsU2VjdGlvbgA3BFRlcm1pbmF0ZVByb2Nlc3MAAKoBR2V0Q3VycmVudFByb2Nlc3MASARVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAB8EU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANYCSXNEZWJ1Z2dlclByZXNlbnQA5wFHZXRMYXN0RXJyb3IAAKYCSGVhcEZyZWUAAKICSGVhcEFsbG9jAFwBR2V0Q1BJbmZvAMUCSW50ZXJsb2NrZWRJbmNyZW1lbnQAAMECSW50ZXJsb2NrZWREZWNyZW1lbnQAAFMBR2V0QUNQAAAUAkdldE9FTUNQAADgAklzVmFsaWRDb2RlUGFnZQA+BFRsc0dldFZhbHVlADwEVGxzQWxsb2MAAD8EVGxzU2V0VmFsdWUAPQRUbHNGcmVlAPQDU2V0TGFzdEVycm9yAACuAUdldEN1cnJlbnRUaHJlYWRJZAAAlwRXcml0ZUZpbGUA9gJMb2FkTGlicmFyeUEAALoCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudABLAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NBAMABR2V0RW52aXJvbm1lbnRTdHJpbmdzAEwBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAhARXaWRlQ2hhclRvTXVsdGlCeXRlAMIBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAApAJIZWFwQ3JlYXRlAABhBFZpcnR1YWxGcmVlAFkDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKsBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAJoDUnRsVW53aW5kAKkCSGVhcFJlQWxsb2MAXgRWaXJ0dWFsQWxsb2MAAIQBR2V0Q29uc29sZUNQAACWAUdldENvbnNvbGVNb2RlAABCAUZsdXNoRmlsZUJ1ZmZlcnMAAOYCTENNYXBTdHJpbmdBAAAfA011bHRpQnl0ZVRvV2lkZUNoYXIA6AJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5m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cmVjdGx5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAAAAAABSNjAzMw0KLSBBdHRlbXB0IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAAAAAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAAAAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoAAAAAAAAAAAAAAAAADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAAAAAABSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAAAAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG5vdCBsb2FkZWQNCgAAAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBSdW50aW1lIExpYnJhcnkAAAAACgoAAC4uLgA8cHJvZ3JhbSBuYW1lIHVua25vd24+AABSdW50aW1lIEVycm9yIQoKUHJvZ3JhbTogAAAAAAAAAAUAAMALAAAAAAAAAAAAAAAdAADABAAAAAAAAAAAAAAAlgAAwAQAAAAAAAAAAAAAAI0AAMAIAAAAAAAAAAAAAACOAADACAAAAAAAAAAAAAAAjwAAwAgAAAAAAAAAAAAAAJAAAMAIAAAAAAAAAAAAAACRAADACAAAAAAAAAAAAAAAkgAAwAgAAAAAAAAAAAAAAJMAAMAIAAAAAAAAAAAAAAAGgICGgIGAAAAQA4aAhoKAFAUFRUVFhYWFBQAAMDCAUICIAAgAKCc4UFeAAAcANzAwUFCIAAAAICiAiICAAAAAYGhgaGhoCAgHeHBwd3BwCAgAAAgACAAHCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgAGgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAYEBgQGBAYEBgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBEAAQABAAEAAQABAAggGCAYIBggGCAYIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECARAAEAAQABAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAg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AKsBR2V0Q3VycmVudFByb2Nlc3MATARVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAACMEU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANACSXNEZWJ1Z2dlclByZXNlbnQAnwNSdGxWaXJ0dWFsVW53aW5kAACYA1J0bExvb2t1cEZ1bmN0aW9uRW50cnkAAJEDUnRsQ2FwdHVyZUNvbnRleHQA5wFHZXRMYXN0RXJyb3IAAKYCSGVhcEZyZWUAAKICSGVhcEFsbG9jAF0BR2V0Q1BJbmZvAFQBR2V0QUNQAAAUAkdldE9FTUNQAADaAklzVmFsaWRDb2RlUGFnZQDXAEVuY29kZVBvaW50ZXIAuQBEZWNvZGVQb2ludGVyAEABRmxzR2V0VmFsdWUAQQFGbHNTZXRWYWx1ZQA/AUZsc0ZyZWUA+ANTZXRMYXN0RXJyb3IAAK8BR2V0Q3VycmVudFRocmVhZElkAAA+AUZsc0FsbG9jAACbBFdyaXRlRmlsZQDwAkxvYWRMaWJyYXJ5QQAAugJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AEwBRnJlZUVudmlyb25tZW50U3RyaW5nc0EAwQFHZXRFbnZpcm9ubWVudFN0cmluZ3MATQFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwCIBFdpZGVDaGFyVG9NdWx0aUJ5dGUAwwFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACqAkhlYXBTZXRJbmZvcm1hdGlvbgAApAJIZWFwQ3JlYXRlAABTA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACsAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCpAkhlYXBSZUFsbG9jAIUBR2V0Q29uc29sZUNQAACXAUdldENvbnNvbGVNb2RlAABDAUZsdXNoRmlsZUJ1ZmZlcnMAAOACTENNYXBTdHJpbmdBAAAZA011bHRpQnl0ZVRvV2lkZUNoYXIA4gJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5mb0EAAOwDU2V0RmlsZVBvaW50ZXIAAKsCSGVhcFNpemUA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AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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aAAAZAsBACBoAACZaAAAmAcBAJxoAADLaQAAvAkBAMxpAACbawAA/AsBAJxrAACSbAAAGAwBAJRsAABGbgAAKAwBAEhuAACUbgAAQAwBAJRuAABHbwAASAwBAGBvAACEbwAAWAwBAMRvAAAzcAAAPA8BADRwAAB5cAAAfAcBAHxwAADDcAAAfAcBAKBxAACwcwAAYAwBALBzAADEcwAAPA8BAMxzAACCdAAAoBABAIR0AABXdQAAoBABAFh1AADydQAAcAwBAPR1AAB9dgAAgAwBAIB2AAD2dgAAlAwBAPh2AABWfgAAuAwBAFh+AACJfwAA3AwBAIx/AACfgAAADA0BAKCAAABagQAANA0BAGSBAAALhAAAQA0BAAyEAABJiQAAWA0BAEyJAADiiQAAgA0BAOSJAABOjAAAkA0BAFCMAADZjAAAuA0BACSQAAAOkgAAyA0BABCSAABYkgAADAkBAFiSAADtkgAAyA0BAPCSAAB5kwAAfBABAHyTAABRlAAAfBABAFSUAADFlAAAfBABAGiWAAD9lgAAmAcBAACXAAA3mAAA0A0BADiYAACLmAAAaA4BAIyYAACAmgAAAA4BAICaAADQmgAAPA8BANCaAAAWmwAAPA8BACSbAADFmwAAGA4BAMibAABKngAAIA4BAEyeAAB8ngAAPA8BAHyeAAA4nwAAmAcBADifAABQoAAAPA4BAFCgAACHoAAAaA4BAIigAACcoQAAcA4BAJyhAAANowAA8BABACCjAADPowAAYAgBANCjAAB8pAAAiA4BAHykAAAApQAAPA8BAAClAACmpQAAmA4BANClAADspwAAyA4BAOynAAA/qAAACA8BAECoAADFqgAAGA8BAByrAAAtrAAA8BABADCsAACLrAAAPA8BAIysAADHrAAARA8BAMisAAADrQAAZAsBAAStAAClrQAAoBABAKitAADbrgAATA8BANyuAABMsAAAeA8BAEywAABbsQAAhA8BAGSxAABWsgAAmA8BAFiyAAAytwAAqA8BADS3AAC9twAAuA0BAMC3AADVuAAAuA0BANi4AACIvAAAyA8BAIi8AAD3vAAAcAwBAPi8AADuvQAA4A8BACS+AAB3vgAAPA8BAHi+AAD3xQAA8A8BAPjFAABqxwAACBABAGzHAABqzwAAOBABAGzPAABZ0AAAWBABAFzQAADx0AAAfBABAPTQAAB10wAAZAcBAHjTAAAQ1QAAhBABABDVAACm1QAAoBABAKjVAAB21gAAsBABAHjWAAC31gAAPA8BALjWAACD2QAAuBABAITZAABg3gAA0BABAGDeAADw3gAAfBABAPDeAADd3wAA4A8BAOjfAACr4QAA8BABAPDhAAA+4gAAgA4BAEDiAABY4gAAjAwBAFjiAAB64gAA1AcBAHriAACW4gAA1AcBAJbiAACv4gAA1AcBAK/iAADV4gAA1AcBAN/iAAD44gAA1AcBAPjiAAAU4wAA1AcBABTjAAAt4wAA1AcBAC3jAABG4wAA1AcBAEbjAABf4wAA1AcBAGbjAAB/4wAA1AcBAH/jAACT4wAA1AcBAKDjAADB4wAA1AcBAMHjAADd4wAAjAwBAN3jAAD/4wAA1AcBAP/jAAAX5AAAjAwBABfkAAAu5AAAjAwBAC7kAABF5AAAjAwBAEXkAABe5AAA1AcBAF7kAAB35AAA1AcBAH7kAACX5AAA1AcBAJfkAACw5AAAjAwBALDkAAD85AAAUBABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBLAwQUAAAAAAAAACEAEPn8KQAAAQAAAAEAKgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ3VpLmV4ZU1akAADAAAABAAAAP//AAC4AAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAAAOH7oOALQJzSG4AUzNIVRoaXMgcHJvZ3JhbSBjYW5ub3QgYmUgcnVuIGluIERPUyBtb2RlLg0NCiQAAAAAAAAA5FPA2KAyrougMq6LoDKui4f01YujMq6LoDKvi/syrosdfTiLpDKui75gKouEMq6LvmA7i7Iyrou+YC2L0TKui75gP4uhMq6LUmljaKAyrosAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQRQAATAEDAAGxi1EAAAAAAAAAAOAAAwELAQkAAMoAAABOAAAAAAAAEyYAAAAQAAAA4AAAAABAAAAQAAAAAgAABQAAAAAAAAAFAAAAAAAAAABAAQAABAAAAAAAAAIAAIAAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAADT5AAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIj0AABAAAAAAAAAAAAAAAAA4AAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAA7ckAAAAQAAAAygAAAAQAAAAAAAAAAAAAAAAAACAAAGAucmRhdGEAAGggAAAA4AAAACIAAADOAAAAAAAAAAAAAAAAAABAAABALmRhdGEAAADEKwAAABABAAAQAAAA8AAAAAAAAAAAAAAAAAAAQAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRi0QkCI1QAYoIQITJdflTVVYrwleL6I1ELQNqAVDoeAoAAIPECDP/M9uJRCQQxgAijXABhe1+V+sGjZsAAAAAi0wkGIoECzxcdQNH6yA8InUahf9+EFdqXFbogQoAAIPEDAP3M//GBlxG6wIz/4tUJBiKBBOIBkNGO918w4X/fg5XalxW6FYKAACDxAwD94tEJBBfxgYixkYBAF5dW1nDgewMBAAAoYASQQAzxImEJAgEAABWi7QkGAQAAFeLvCQYBAAAigeLz4TAdBONZCQAQTwvdQTGQf9cigGEwHXxjYQkDAEAAFCNjCQQAgAAUY1UJBRSjUQkFFBX6JcNAACDxBSAfCQIAA+FpAAAAIB8JAxcD4SZAAAAjYwkDAEAAFGNlCQQAgAAUo1EJBRQjUwkFFFW6F4NAACNRCQgg8QUjVABighAhMl1+SvCgHwEC1yNRAQLdQpIgDhcdBWNZCQAjVQkDDvCcgnGAABIgDhcde9qAFeNRCQUUI1MJBRRjZQkHAMAAFLo+QoAAGoBaAQBAADoBAkAAIvwaAQBAACNhCQsAwAAUFbotAkAAIPEKOsdagFoBAEAAOjeCAAAaAQBAACL8FdW6JUJAACDxBSLjCQQBAAAX4vGXjPM6AINAACBxAwEAADDzMzMzMzMzMzMg+wIU1VWV4t8JByLx41QAYoIQITJdfkrwmoEUOiKCAAAi2wkKDPbiUQkHIldAIk4D74HUIv3iVwkHOiaDQAAg8QMhcB0Eg++TwFHUeiIDQAAg8QEhcB17ooPR4hMJByEyXRnD77RUuhtDQAAg8QEhcB0B4N8JBAAdEyKRCQcPFx1A0Pr0zwidRn2wwF1EjPAOUQkEMZEJBwAD5TAiUQkENH7hdt0EFNqXFboQQgAAIPEDAPzM9uAfCQcAHSbikwkHIgORuuSikwkHIXbdBRTalxW6BkIAACKTCQog8QMA/Mz24tUJBTGBgD/RQCLRQBGiTSChMl0Nw++F1Lo2QwAAIPEBIXAdBIPvkcBR1DoxwwAAIPEBIXAde6APwAPhTb///+LRCQUX15dW4PECMNfXl2LwluDxAjDzMzMzMzMzMyDfCQEAHUSoQAgQQCFwHQJagBQ/xUA4EAAuAEAAADDzIPsWDPAakRQiUQkDIlEJBCJRCQUiUQkGI1EJBxQx0QkDAAAAADoZgcAAIPEDGoBaDATQADHRCQcRAAAAP8VEOBAAItEJFyNTCQEUY1UJBhSagBqAGoAagFqAGoAUGoA/xUM4EAAhcB1HGio4UAA6CMFAACDwEBQ6P4DAACDxAgzwIPEWMOLVCQEi0wkDGr/UokNACBBAP8VCOBAAItMJASNBCRQUf8VBOBAAIXAdQdogOFAAOu4iwQkg8RYw8zMzFNVVleLfCQUi8eNUAGNSQCKCECEyXX5i1wkHCvCuQEAAAA72Y1wAn4tjaQkAAAAAItEJBiLBIiNeAGNmwAAAACKEECE0nX5K8dBO8uNdAYBfN6LfCQUagFW6C0GAABXi+hoyOFAAFXoewsAAIvHg8QUjVABighAhMl1+SvCvgEAAAA73ov4fjqLTCQYixSxUo0EL2jE4UAAUOhJCwAAi0wkJIsEsYPEDI1QAesDjUkAighAhMl1+SvCRjvzjXwHAXzGX16LxV1bw8zMzMzMzMyB7BgCAAChgBJBADPEiYQkFAIAAIuEJCACAABoAAEAAI1MJBhRagCJRCQU/xUU4EAAjUQkFI1QAYoIQITJdfkrwo1EBBSNVCQUO8J2FI1JAIA4LnQMxgAASI1MJBQ7wXfvxgAAjUQkFEiNpCQAAAAAikgBQITJdfiLFSjiQACLDSziQACJEIsVMOJAAIlIBFaJUAiNRCQYagBQ6KK0AACL8IPECIP+/3U0jUwkGFFoGOJAAOhOAwAAg8BAUOgpAgAAg8QMjUYDXouMJBQCAAAzzOgsCQAAgcQYAgAAw1doAAEAAI2UJCABAABSVug0rAAAVo28BCwBAADoQ4sAAI2EJCwBAACDxBBIjaQkAAAAAEA7x3MQigiEyXQKgPkKdAWA+Q1162oCxgAAjYQkIAEAAGgU4kAAUOhYCgAAg8QMhcB0M4sNBOJAAIsVCOJAAKEM4kAAiYwkHAEAAIoNEOJAAImUJCABAACJhCQkAQAAiIwkKAEAAI1UJAhSjYQkIgEAAFDoiPv//4swjUwkJFFWiUQkKOgn+v//i/iDxBCJfCQMhf91C1Zo4OFAAOm4AAAAU4tcJAxVi6wkLAIAAI0EK4lEJBxAagRQ6O0DAACL8FeJdCQc6Eb5//+JBr8BAAAAg8QMg8YEO99+H+sDjUkAi1QkIIsEulDoI/n//4kGR4PEBIPGBDv7fOaNTCQkUegM+f//iQa/AQAAAIPEBIPGBDvvfhqLVCQYiwS6UOju+P//iQZHg8QEg8YEO/185oO8JDQCAAAAXccGAAAAAFt0RYtMJAiLdCQMUVbotKQAAIPECFZozOFAAOiYAQAAg8BAUOhzAAAAg8QMX7gCAAAAXouMJBQCAAAzzOhzBwAAgcQYAgAAw4tUJBSLRCQIi0wkDFJQUeiG/P//UOjA+///i4wkLAIAAIPEEF9eM8zoPwcAAIHEGAIAAMPMzMzMzMyhECBBAIsNDCBBAGoBUFHoHP3//4PEDMIQAGoMaPD0QADoxh8AADP2iXXkM8CLXQg73g+VwDvGdSDoYh8AAMcAFgAAAFZWVlZW6OoeAACDxBSDyP/pzQAAADPAOXUMD5XAO8Z01IldCFPonwEAAFmJdfz2QwxAdXdT6FEdAABZg/j/dBuD+P50FovQwfoFi8iD4R/B4QYDDJWgKkEA6wW5mBJBAPZBJH91KYP4/3QZg/j+dBSLyMH5BYPgH8HgBgMEjaAqQQDrBbiYEkEA9kAkgHQc6MgeAADHABYAAABWVlZWVuhQHgAAg8QUg03k/zl15HUjU+hzDQAAi/iNRRBQVv91DFPo2Q4AAIlF5FNX6PUNAACDxBzHRfz+////6AkAAACLReToBh8AAMP/dQjoTAEAAFnDuAAQQQDDocA7QQBWahRehcB1B7gAAgAA6wY7xn0Hi8ajwDtBAGoEUOi+IAAAWVmjvCtBAIXAdR5qBFaJNcA7QQDopSAAAFlZo7wrQQCFwHUFahpYXsMz0rkAEEEA6wWhvCtBAIkMAoPBIIPCBIH5gBJBAHzqav5eM9K5EBBBAFeLwsH4BYsEhaAqQQCL+oPnH8HnBosEB4P4/3QIO8Z0BIXAdQKJMYPBIEKB+XAQQQB8zl8zwF7D6NIjAACAPTAgQQAAdAXomyEAAP81vCtBAOgCIQAAWcOL/1WL7FaLdQi4ABBBADvwciKB/mASQQB3GovOK8jB+QWDwRBR6BIlAACBTgwAgAAAWesKg8YgVv8VGOBAAF5dw4v/VYvsi0UIg/gUfRaDwBBQ6OUkAACLRQyBSAwAgAAAWV3Di0UMg8AgUP8VGOBAAF3Di/9Vi+yLRQi5ABBBADvBch89YBJBAHcYgWAM/3///yvBwfgFg8AQUOjCIwAAWV3Dg8AgUP8VHOBAAF3Di/9Vi+yLTQiD+RSLRQx9E4FgDP9///+DwRBR6JMjAABZXcODwCBQ/xUc4EAAXcOL/1WL7FGDZfwAVo1F/FD/dQz/dQjodyQAAIvwg8QMhfZ1GDlF/HQT6IgcAACFwHQK6H8cAACLTfyJCIvGXsnDzMzMzMyLVCQMi0wkBIXSdGkzwIpEJAiEwHUWgfoAAQAAcg6DPYgqQQAAdAXplSUAAFeL+YP6BHIx99mD4QN0DCvRiAeDxwGD6QF19ovIweAIA8GLyMHgEAPBi8qD4gPB6QJ0BvOrhdJ0CogHg8cBg+oBdfaLRCQIX8OLRCQEw8zMzMzMzItMJAxXhckPhJIAAABWU4vZi3QkFPfGAwAAAIt8JBB1C8HpAg+FhQAAAOsnigaDxgGIB4PHAYPpAXQrhMB0L/fGAwAAAHXli9nB6QJ1YYPjA3QTigaDxgGIB4PHAYTAdDeD6wF17YtEJBBbXl/D98cDAAAAdBaIB4PHAYPpAQ+EmAAAAPfHAwAAAHXqi9nB6QJ1dIgHg8cBg+sBdfZbXotEJAhfw4kXg8cEg+kBdJ+6//7+fosGA9CD8P8zwosWg8YEqQABAYF03ITSdCyE9nQe98IAAP8AdAz3wgAAAP91xIkX6xiB4v//AACJF+sOgeL/AAAAiRfrBDPSiReDxwQzwIPpAXQMM8CJB4PHBIPpAXX2g+MDD4V3////i0QkEFteX8OL/1WL7P91GP91FP91EP91DGr//3UI6FAlAACDxBhdw4v/VYvsUVFTM9tWV4ld+DldCHR9i00MO8t1BzldEHVx6wU5XRB0ajldFHUHOV0YdWDrBTldGHRZOV0cdQc5XSB1T+sFOV0gdEg5XSR1PjldKHU+i3UIM8BAOB50BkhGO8N39oA+OnU1O8t0GoN9EAMPgvUAAABqAv91CGr/UehVJgAAg8QQRol1COsXOV0odcLHRfgBAAAA6c4AAAA7y3QCiBmLdQgz/4ld/DgedFUPvgZQ6AgmAABZhcB0A0brFooGPC90DTxcdAk8LnUIiXX86wONfgFGOB511Dv7dCU5XRR0G4vHK0UIOUUYdn1Q/3UIav//dRTo3CUAAIPEEIl9COsJi0UUO8N0AogYi0X8O8N0SjtFCHJFOV0cdBkrRQg5RSB2RVD/dQhq//91HOikJQAAg8QQOV0kD4SrAAAAK3X8OXUodiNW/3X8av//dSTogiUAAIPEEOmNAAAAOV0cdH8rdQg5dSB3ZotFDDvDdAc5XRB2AogYi0UUO8N0BzldGHYCiBiLRRw7w3QHOV0gdgKIGItFJDvDdAc5XSh2AogY6AQZAAA5XQh1FmoWXlNTU1NTiTDoiBgAAIPEFIvG6yo5Xfh15WoiWYkIi8HrHFb/dQhq//91HOj5JAAAg8QQi0UkO8N0AogYM8BfXlvJw4v/VYvsi00Y99kbybgAAQAAI8hR/3UYi00U99kbySPIUYtNEP91FPfZG8kjyItFDFH/dRD32BvAg+ADUP91DP91COjH/f//g8QkXcM7DYASQQB1AvPD6agkAACL/1WL7ItFCFaL8cZGDACFwHVj6GUyAACJRgiLSGyJDotIaIlOBIsOOw1wG0EAdBKLDYwaQQCFSHB1B+gALwAAiQaLRgQ7BZAZQQB0FotGCIsNjBpBAIVIcHUI6HQnAACJRgSLRgj2QHACdRSDSHACxkYMAesKiwiJDotABIlGBIvGXl3CBACL/1WL7IPsEP91DI1N8Ohm////i0Xwg7isAAAAAX4TjUXwUGoI/3UI6J80AACDxAzrEIuAyAAAAItNCA+3BEiD4AiAffwAdAeLTfiDYXD9ycOL/1WL7IM96CRBAAB1EotFCIsNYBtBAA+3BEGD4Ahdw2oA/3UI6IX///9ZWV3Di/9Vi+yD7CBTM9s5XQx1HehEFwAAU1NTU1PHABYAAADozBYAAIPEFIPI/+tNi0UIO8N03FaJReiJReCNRRBQU/91DI1F4FDHReT///9/x0XsQgAAAOhCBwAAg8QQ/03ki/B4B4tF4IgY6wyNReBQU+iQNAAAWVmLxl5bycOL/1WL7FGDZfwAU4tdEIXbdQczwOmaAAAAV4P7BHJ1jXv8hf92botNDItFCIoQg8AEg8EEhNJ0UjpR/HVNilD9hNJ0PDpR/XU3ilD+hNJ0JjpR/nUhilD/hNJ0EDpR/3ULg0X8BDl9/HLC6z8PtkD/D7ZJ/+tGD7ZA/g+2Sf7rPA+2QP0Ptkn96zIPtkD8D7ZJ/Osoi00Mi0UI6w+KEITSdBQ6EXUQQEH/Rfw5Xfxy7DPAX1vJww+2AA+2CSvB6/KL/1WL7Fe/6AMAAFf/FSTgQAD/dQj/FSDgQACBx+gDAACB/2DqAAB3BIXAdN5fXcOL/1WL7OidNgAA/3UI6Oo0AAD/NYgSQQDooS0AAGj/AAAA/9CDxAxdw4v/VYvsaETiQAD/FSDgQACFwHQVaDTiQABQ/xUo4EAAhcB0Bf91CP/QXcOL/1WL7P91COjI////Wf91CP8VLOBAAMxqCOgiHQAAWcNqCOg/HAAAWcOL/1WL7FaL8OsLiwaFwHQC/9CDxgQ7dQhy8F5dw4v/VYvsVot1CDPA6w+FwHUQiw6FyXQC/9GDxgQ7dQxy7F5dw4v/VYvsgz20K0EAAHQZaLQrQQDoRTgAAFmFwHQK/3UI/xW0K0EAWeh/NwAAaGDhQABoSOFAAOih////WVmFwHVCaKhZQADo/TYAALhA4UAAxwQkROFAAOhj////gz24K0EAAFl0G2i4K0EA6O03AABZhcB0DGoAagJqAP8VuCtBADPAXcNqGGgQ9UAA6OgUAABqCOg+HAAAWYNl/AAz20M5HTggQQAPhMUAAACJHTQgQQCKRRCiMCBBAIN9DAAPhZ0AAAD/NawrQQDoMCwAAFmL+Il92IX/dHj/NagrQQDoGywAAFmL8Il13Il95Il14IPuBIl13Dv3clfo9ysAADkGdO0793JK/zbo8SsAAIv46OErAACJBv/X/zWsK0EA6NsrAACL+P81qCtBAOjOKwAAg8QMOX3kdQU5ReB0Dol95Il92IlF4IvwiXXci33Y659ocOFAALhk4UAA6F/+//9ZaHjhQAC4dOFAAOhP/v//WcdF/P7////oHwAAAIN9EAB1KIkdOCBBAGoI6GwaAABZ/3UI6Pz9//8z20ODfRAAdAhqCOhTGgAAWcPoDhQAAMOL/1WL7GoAagD/dQjow/7//4PEDF3Di/9Vi+xqAGoB/3UI6K3+//+DxAxdw2oBagBqAOid/v//g8QMw2oBagFqAOiO/v//g8QMw4v/VujzKgAAi/BW6Fk7AABW6OQ6AABW6HcRAABW6Mk6AABW6LQ6AABW6Jw4AABW6DU3AABW6B43AABo6iNAAOhFKgAAg8Qko4gSQQBew4v/VYvsgz1EIEEAAXUF6IwzAAD/dQjo2TEAAGj/AAAA6Cf9//9ZWV3DalhoMPVAAOj7EgAAM/aJdfyNRZhQ/xU04EAAav5fiX38uE1aAABmOQUAAEAAdTihPABAAIG4AABAAFBFAAB1J7kLAQAAZjmIGABAAHUZg7h0AEAADnYQM8k5sOgAQAAPlcGJTeTrA4l15DPbQ1Pozz8AAFmFwHUIahzoWP///1nonS0AAIXAdQhqEOhH////WehXNAAAiV386PgNAACFwH0IahvoJvz//1n/FTDgQACjoCtBAOhRPgAAozwgQQDojD0AAIXAfQhqCOgA/P//WegDOwAAhcB9CGoJ6O/7//9ZU+in/P//WTvGdAdQ6N37//9Z6IE6AACEXcR0Bg+3TcjrA2oKWVFQVmgAAEAA6Ajy//+JReA5deR1BlDoHv7//+hF/v//iX386zWLReyLCIsJiU3cUFHotzUAAFlZw4tl6ItF3IlF4IN95AB1BlDoAf7//+gh/v//x0X8/v///4tF4OsTM8BAw4tl6MdF/P7///+4/wAAAOjPEQAAw+jvPgAA6Xj+//+L/1WL7FaLdQhW6FMPAABQ6Gs/AABZWYXAdHzoqfL//4PAIDvwdQQzwOsP6Jny//+DwEA78HVgM8BA/wUEIEEA90YMDAEAAHVOU1eNPIVIIEEAgz8AuwAQAAB1IFPoDRMAAFmJB4XAdRONRhRqAolGCIkGWIlGGIlGBOsNiz+JfgiJPoleGIleBIFODAIRAAAzwF9AW+sCM8BeXcOL/1WL7IN9CAB0J1aLdQz3RgwAEAAAdBlW6BMVAACBZgz/7v//g2YYAIMmAINmCABZXl3D9kEMQHQGg3kIAHQk/0kEeAuLEYgC/wEPtsDrDA++wFFQ6OktAABZWYP4/3UDCQbD/wbDi/9Vi+xWi/DrE4tNEIpFCP9NDOi1////gz7/dAaDfQwAf+deXcOL/1WL7PZHDEBTVovwi9l0MoN/CAB1LItFCAEG6yuKA/9NCIvP6H3///9Dgz7/dRPo1Q8AAIM4KnUPi8+wP+hk////g30IAH/VXltdw4v/VYvsgex4AgAAoYASQQAzxYlF/FOLXQxWi3UIM8BXi30U/3UQjY2k/f//ibW0/f//ib3c/f//iYW4/f//iYXw/f//iYXM/f//iYXo/f//iYXQ/f//iYXA/f//iYXI/f//6Pf2//+F9nU16E0PAADHABYAAAAzwFBQUFBQ6NMOAACDxBSAvbD9//8AdAqLhaz9//+DYHD9g8j/6cgKAAD2RgxAdV5W6EANAABZupgSQQCD+P90G4P4/nQWi8iD4R+L8MH+BcHhBgMMtaAqQQDrAovK9kEkf3WRg/j/dBmD+P50FIvIg+AfwfkFweAGAwSNoCpBAOsCi8L2QCSAD4Vn////M8k72Q+EXf///4oTiY3Y/f//iY3g/f//iY28/f//iJXv/f//hNIPhB8KAABDg73Y/f//AImdxP3//w+MCwoAAIrCLCA8WHcRD77CD76AWOJAAIPgDzP26wQz9jPAD76EwXjiQABqB8H4BFmJhZT9//87wQ+HrQkAAP8khQszQACDjej9////ibWQ/f//ibXA/f//ibXM/f//ibXQ/f//ibXw/f//ibXI/f//6XYJAAAPvsKD6CB0SoPoA3Q2g+gIdCVISHQVg+gDD4VXCQAAg43w/f//COlLCQAAg43w/f//BOk/CQAAg43w/f//AekzCQAAgY3w/f//gAAAAOkkCQAAg43w/f//AukYCQAAgPoqdSyDxwSJvdz9//+Lf/w7/om9zP3//w+N+QgAAION8P3//wT3ncz9///p5wgAAIuFzP3//2vACg++yo1ECNCJhcz9///pzAgAAIm16P3//+nBCAAAgPoqdSaDxwSJvdz9//+Lf/w7/om96P3//w+NoggAAION6P3////plggAAIuF6P3//2vACg++yo1ECNCJhej9///pewgAAID6SXRVgPpodESA+mx0GID6dw+FYwgAAIGN8P3//wAIAADpVAgAAIA7bHUWQ4GN8P3//wAQAACJncT9///pOQgAAION8P3//xDpLQgAAION8P3//yDpIQgAAIoDPDZ1HYB7ATR1F0NDgY3w/f//AIAAAImdxP3//+n+BwAAPDN1HYB7ATJ1F0NDgaXw/f///3///4mdxP3//+ndBwAAPGQPhNUHAAA8aQ+EzQcAADxvD4TFBwAAPHUPhL0HAAA8eA+EtQcAADxYD4StBwAAibWU/f//jYWk/f//UA+2wlCJtcj9///oCD0AAFmFwIqF7/3//1l0IouNtP3//4212P3//+ik+///igNDiZ3E/f//hMAPhKT8//+LjbT9//+Ntdj9///ogvv//+lNBwAAD77Cg/hkD4/oAQAAD4R5AgAAg/hTD4/yAAAAD4SAAAAAg+hBdBBISHRYSEh0CEhID4WSBQAAgMIgx4WQ/f//AQAAAIiV7/3//4ON8P3//0A5tej9//+NnfT9//+4AAIAAImd5P3//4mFoP3//w+NSAIAAMeF6P3//wYAAADppQIAAPeF8P3//zAIAAAPhZgAAACBjfD9//8ACAAA6YkAAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJvdz9//+Lf/yJveT9//8PhLEEAAA7/nULoZQSQQCJheT9//+LheT9///Hhcj9//8BAAAA6X8EAACD6FgPhNoCAABISHR5K8EPhCf///9ISA+FngQAAIPHBPeF8P3//xAIAACJvdz9//90MA+3R/xQaAACAACNhfT9//9QjYXg/f//UOhLOwAAg8QQhcB0H8eFwP3//wEAAADrE4pH/IiF9P3//8eF4P3//wEAAACNhfT9//+JheT9///pNQQAAIsHg8cEib3c/f//O8Z0O4tIBDvOdDT3hfD9//8ACAAAD78AiY3k/f//dBSZK8LR+MeFyP3//wEAAADp8AMAAIm1yP3//+nlAwAAoZASQQCJheT9//9Q6MI4AABZ6c4DAACD+HAPj/sBAAAPhOMBAACD+GUPjLwDAACD+GcPjjT+//+D+Gl0cYP4bnQog/hvD4WgAwAA9oXw/f//gMeF4P3//wgAAAB0YYGN8P3//wACAADrVYs3g8cEib3c/f//6Do4AACFwA+EL/r///aF8P3//yB0DGaLhdj9//9miQbrCIuF2P3//4kGx4XA/f//AQAAAOmmBAAAg43w/f//QMeF4P3//woAAACLjfD9///3wQCAAAAPhKkBAACLB4tXBIPHCOnVAQAAdRGA+md1ZceF6P3//wEAAADrWTmF6P3//34GiYXo/f//gb3o/f//owAAAH4/i7Xo/f//gcZdAQAAVugiCwAAipXv/f//WYmFvP3//4XAdBCJheT9//+JtaD9//+L2OsKx4Xo/f//owAAADP2iweDxwiJhYj9//+LR/yJhYz9//+NhaT9//9Q/7WQ/f//D77C/7Xo/f//ib3c/f//UP+1oP3//42FiP3//1NQ/zVYHEEA6EEgAABZ/9CLvfD9//+DxByB54AAAAB0IDm16P3//3UYjYWk/f//UFP/NWQcQQDoEiAAAFn/0FlZgL3v/f//Z3UcO/51GI2FpP3//1BT/zVgHEEA6O0fAABZ/9BZWYA7LXURgY3w/f//AAEAAEOJneT9//9T6QP+///Hhej9//8IAAAAiY24/f//6ySD6HMPhLb8//9ISA+Eif7//4PoAw+FtgEAAMeFuP3//ycAAAD2hfD9//+Ax4Xg/f//EAAAAA+Eaf7//4qFuP3//wRRxoXU/f//MIiF1f3//8eF0P3//wIAAADpRf7///fBABAAAA+FS/7//4PHBPbBIHQYib3c/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om93P3///bBQHQbO9Z/F3wEO8ZzEffYg9IA99qBjfD9//8AAQAA94Xw/f//AJAAAIvai/h1AjPbg73o/f//AH0Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LxwvDdQYhhdD9//+NdfOLhej9////jej9//+FwH8Gi8cLw3Qti4Xg/f//mVJQU1fo5DcAAIPBMIP5OYmdoP3//4v4i9p+BgONuP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF4P3//4m15P3//3RhhcB0B4vOgDkwdFb/jeT9//+LjeT9///GATBA6z5JZjkwdAZAQDvOdfQrheT9///R+OsoO/51C6GQEkEAiYXk/f//i4Xk/f//6wdJgDgAdAVAO8519SuF5P3//4mF4P3//4O9wP3//wAPhVwBAACLhfD9//+oQHQyqQABAAB0CcaF1P3//y3rGKgBdAnGhdT9//8r6wuoAnQRxoXU/f//IMeF0P3//wEAAACLncz9//8rneD9//8rndD9///2hfD9//8MdRf/tbT9//+Nhdj9//9TaiDocPX//4PEDP+10P3//4u9tP3//42F2P3//42N1P3//+h29f//9oXw/f//CFl0G/aF8P3//wR1EldTajCNhdj9///oLvX//4PEDIO9yP3//wCLheD9//90ZoXAfmKLteT9//+JhaD9//8Ptwb/jaD9//9QagaNRfRQjYWY/f//RlBG6OU1AACDxBCFwHUoOYWY/f//dCD/tZj9//+Nhdj9//+NTfTo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5f//UFaNRfRQi4Uo5f//iwD/NAf/FZjgQACFwA+EKQQAAIuFROX//4uNMOX//wPBObU85f//iYU45f//D4wVBAAAg70g5f//AA+EzQAAAGoAjYU85f//UGoBjUX0UIuFKOX//4sAxkX0Df80B/8VmOBAAIXAD4TQAwAAg7085f//AQ+MzwMAAP+FMOX///+FOOX//+mDAAAAPAF0BDwCdSEPtzMzyWaD/goPlMFDQ4OFROX//wKJtUDl//+JjSDl//88AXQEPAJ1Uv+1QOX//+glJQAAWWY7hUDl//8PhWgDAACDhTjl//8Cg70g5f//AHQpag1YUImFQOX//+j4JAAAWWY7hUDl//8PhTsDAAD/hTjl////hTDl//+LRRA5hUTl//8Pgvn9///pJwMAAIsOihP/hTjl//+IVA80iw6JRA846Q4DAAAzyYsGA8f2QASAD4S/AgAAi4U05f//iY1A5f//hNsPhcoAAACJhTzl//85TRAPhiADAADrBou1KOX//4uNPOX//4OlROX//wArjTTl//+NhUjl//87TRBzOYuVPOX///+FPOX//4oSQYD6CnUQ/4Uw5f//xgANQP+FROX//4gQQP+FROX//4G9ROX///8TAABywovYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhEICAACLhSzl//8BhTjl//87ww+MOgIAAIuFPOX//yuFNOX//ztFEA+CTP///+kgAgAAiYVE5f//gPsCD4XRAAAAOU0QD4ZNAgAA6waLtSjl//+LjUTl//+DpTzl//8AK4005f//jYVI5f//O00Qc0aLlUTl//+DhUTl//8CD7cSQUFmg/oKdRaDhTDl//8Cag1bZokYQECDhTzl//8Cg4U85f//AmaJEEBAgb085f///hMAAHK1i9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EYgEAAIuFLOX//wGFOOX//zvDD4xaAQAAi4VE5f//K4U05f//O0UQD4I/////6UABAAA5TRAPhnwBAACLjUTl//+DpTzl//8AK4005f//agKNhUj5//9eO00QczyLlUTl//8PtxIBtUTl//8DzmaD+gp1DmoNW2aJGAPGAbU85f//AbU85f//ZokQA8aBvTzl//+oBgAAcr8z9lZWaFUNAACNjfDr//9RjY1I+f//K8GZK8LR+FCLwVBWaOn9AAD/FbDgQACL2DveD4SXAAAAagCNhSzl//9Qi8MrxlCNhDXw6///UIuFKOX//4sA/zQH/xWY4EAAhcB0DAO1LOX//zvef8vrDP8VXOBAAImFQOX//zvef1yLhUTl//8rhTTl//+JhTjl//87RRAPggr////rP2oAjY0s5f//Uf91EP+1NOX///8w/xWY4EAAhcB0FYuFLOX//4OlQOX//wCJhTjl///rDP8VXOBAAImFQOX//4O9OOX//wB1bIO9QOX//wB0LWoFXjm1QOX//3UU6LK2///HAAkAAADourb//4kw6z//tUDl///ovrb//1nrMYu1KOX//4sG9kQHBEB0D4uFNOX//4A4GnUEM8DrJOhytv//xwAcAAAA6Hq2//+DIACDyP/rDIuFOOX//yuFMOX//19bi038M81e6Nid///Jw2oQaPD3QADohLb//4tFCIP4/nUb6D62//+DIADoI7b//8cACQAAAIPI/+mdAAAAM/87x3wIOwWQKkEAciHoFbb//4k46Pu1///HAAkAAABXV1dXV+iDtf//g8QU68mLyMH5BY0cjaAqQQCL8IPmH8HmBosLD75MMQSD4QF0v1DoOSQAAFmJffyLA/ZEMAQBdBb/dRD/dQz/dQjoLvj//4PEDIlF5OsW6Ji1///HAAkAAADooLX//4k4g03k/8dF/P7////oCQAAAItF5OgEtv//w/91COiDJAAAWcNqEGgQ+EAA6Ki1//+LRQiD+P51E+hPtf//xwAJAAAAg8j/6aoAAAAz2zvDfAg7BZAqQQByGugutf//xwAJAAAAU1NTU1PotrT//4PEFOvQi8jB+QWNPI2gKkEAi/CD5h/B5gaLDw++TA4Eg+EBdMZQ6GwjAABZiV38iwf2RAYEAXQx/3UI6OAiAABZUP8V5OBAAIXAdQv/FVzgQACJReTrA4ld5Dld5HQZ6M20//+LTeSJCOiwtP//xwAJAAAAg03k/8dF/P7////oCQAAAItF5Ogjtf//w/91COiiIwAAWcOL/1WL7IPsEFMz2zldCHUc6HK0//9TU1NTU8cAFgAAAOj6s///g8QUM8DralaLdQw783Ua6E60//9TU1NTU8cAFgAAAOjWs///g8QU6wU5dQhyBDPA6z7/dRCNTfDoxpv//4tN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/3UY/9aL+Dv7D4SrAAAAfjyB//D//393NI1EPwg9AAQAAHcT6NIfAACLxDvDdBzHAMzMAADrEVDoUOD//1k7w3QJxwDd3QAAg8AIi9iF23RpjQQ/UGoAU+hOkP//g8QMV1P/dRD/dQxqAf91GP/WhcB0Ef91FFBT/3UI/xX44EAAiUX4U+jJ+v//i0X4Wet1M/Y5XRx1CIsHi0AUiUUcOV0YdQiLB4tABIlFGP91HOhBHQAAWYP4/3UEM8DrRztFGHQeU1ONTRBR/3UMUP91GOhpHQAAi/CDxBg783TciXUM/3UU/3UQ/3UM/3UI/3Uc/xX04EAAi/g783QHVuiGr///WYvHjWXsX15bi038M83omJP//8nDi/9Vi+yD7BD/dQiNTfDokpP///91JI1N8P91IP91HP91GP91FP91EP91DOgW/v//g8QcgH38AHQHi034g2Fw/cnDi/9Vi+xWi3UIhfYPhIEBAAD/dgToFq////92COgOr////3YM6Aav////dhDo/q7///92FOj2rv///3YY6O6u////Nujnrv///3Yg6N+u////diTo167///92KOjPrv///3Ys6Meu////djDov67///92NOi3rv///3Yc6K+u////djjop67///92POifrv//g8RA/3ZA6JSu////dkTojK7///92SOiErv///3ZM6Hyu////dlDodK7///92VOhsrv///3ZY6GSu////dlzoXK7///92YOhUrv///3Zk6Eyu////dmjoRK7///92bOg8rv///3Zw6DSu////dnToLK7///92eOgkrv///3Z86Byu//+DxED/toAAAADoDq7///+2hAAAAOgDrv///7aIAAAA6Pit////towAAADo7a3///+2kAAAAOjirf///7aUAAAA6Net////tpgAAADozK3///+2nAAAAOjBrf///7agAAAA6Lat////tqQAAADoq63///+2qAAAAOigrf//g8QsXl3Di/9Vi+xWi3UIhfZ0NYsGOwVIHUEAdAdQ6H2t//9Zi0YEOwVMHUEAdAdQ6Gut//9Zi3YIOzVQHUEAdAdW6Fmt//9ZXl3Di/9Vi+xWi3UIhfZ0fotGDDsFVB1BAHQHUOg3rf//WYtGEDsFWB1BAHQHUOglrf//WYtGFDsFXB1BAHQHUOgTrf//WYtGGDsFYB1BAHQHUOgB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ciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgBSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxvYWRlZA0KAAAAAE1pY3Jvc29mdCBWaXN1YWwgQysrIFJ1bnRpbWUgTGlicmFyeQAAAAAKCgAALi4uADxwcm9ncmFtIG5hbWUgdW5rbm93bj4AAFJ1bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAAAAAAABQAAwAsAAAAAAAAAHQAAwAQAAAAAAAAAlgAAwAQAAAAAAAAAjQAAwAgAAAAAAAAAjgAAwAgAAAAAAAAAjwAAwAgAAAAAAAAAkAAAwAgAAAAAAAAAkQAAwAgAAAAAAAAAkgAAwAgAAAAAAAAAkwAAwAgAAAAAAAAABoCAhoCBgAAAEAOGgIaCgBQFBUVFRYWFhQUAADAwgFCAiAAIACgnOFBXgAAHADcwMFBQiAAAACAogIiAgAAAAGBoYGhoaAgIB3hwcHdwcAgIAAAIAAgABwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIABoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQGBAYEBgQGBAYEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAEAAQABAAEAAQAIIBggGCAYIBggGCAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEQABAAEAAQACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABQAFAAQABAAEAAQABAAFAAQABAAEAAQABAAEAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBEAABAQEBAQEBAQEBAQEBAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECARAAAgECAQIBAgECAQIBAgECAQEBAAAAAICBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlae3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/0hIOm1tOnNzAAAAAGRkZGQsIE1NTU0gZGQsIHl5eXkATU0vZGQveXkAAAAAUE0AAEFNAABEZWNlbWJlcgAAAABOb3ZlbWJlcgAAAABPY3RvYmVyAFNlcHRlbWJlcgAAAEF1Z3VzdAAASnVseQAAAABKdW5lAAAAAEFwcmlsAAAATWFyY2gAAABGZWJydWFyeQAAAABKYW51YXJ5AERlYwBOb3YAT2N0AFNlcABBdWcASnVsAEp1bgBNYXkAQXByAE1hcgBGZWIASmFuAFNhdHVyZGF5AAAAAEZyaWRheQAAVGh1cnNkYXkAAAAAV2VkbmVzZGF5AAAAVHVlc2RheQBNb25kYXkAAFN1bmRheQAAU2F0AEZyaQBUaHUAV2VkAFR1ZQBNb24AU3VuAEdldFByb2Nlc3NXaW5kb3dTdGF0aW9uAEdldFVzZXJPYmplY3RJbmZvcm1hdGlvbkEAAABHZXRMYXN0QWN0aXZlUG9wdXAAAEdldEFjdGl2ZVdpbmRvdwBNZXNzYWdlQm94QQBVU0VSMzIuRExMAABTdW5Nb25UdWVXZWRUaHVGcmlTYXQAAABKYW5GZWJNYXJBcHJNYXlKdW5KdWxBdWdTZXBPY3ROb3ZEZWMAAAAAQ09OT1VUJAAuY29tAAAAAC5leGUAAAAALmJhdAAAAAAuY21kAAAAAC5cAABTeXN0ZW1Sb290AAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBJBAND0QAADAAAAADgAALBpAACgmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADcGEAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAALwjQAAAAAAA/v///wAAAACI////AAAAAP7////6JUAA/iVAAP7////AJUAA1CVAAP7///8AAAAAjP///wAAAAD+////aDVAAGw1QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAEztAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADhO0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAGs9QAAAAAAAAAAAADc9QAD+////AAAAANT///8AAAAA/v///wAAAADwPkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAACNAQAAAAAAA/v///wAAAADU////AAAAAP7///9NQUAAaUFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABdR0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAACtLQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAm05AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADdUEAA/v///wAAAADsUEAA/v///wAAAADY////AAAAAP7///8AAAAAn1JAAP7///8AAAAAq1JAAP7///8AAAAA1P///wAAAAD+////AAAAAGVZQAAAAAAA/v///wAAAADY////AAAAAP7///8LW0AAH1tAAAAAAAD+////AAAAANj///8AAAAA/v///11bQABhW0AAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAALheQAAAAAAA/v///wAAAADQ////AAAAAP7///9IX0AAX19AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAC5akAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAMpsQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAznlAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADegUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAL+CQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAtJVAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABNmEAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAOShQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAW6ZAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAAAhqEAAAAAAAAAAAABdp0AA/v///wAAAADQ////AAAAAP7///8AAAAA3K5AAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAD4wkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAJvKQABc+QAAAAAAAAAAAAAWAAEAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnPoAALj6AADO+gAA5PoAAPb6AAAO+wAAJPsAADz7AABU+wAAaPsAAHD7AACC+wAAkPsAAKL7AAC0+wAAxvsAANb7AADk+wAA/PsAABD8AAAk/AAAQPwAAF78AABy/AAAgvwAAI78AACa/AAApvwAAL78AADW/AAA4PwAAOz8AAD+/AAADP0AABj9AAAm/QAAMP0AAED9AABW/QAAYv0AAHL9AACa/QAAtP0AAMz9AADm/QAA/P0AABb+AAAk/gAAMv4AAEz+AABc/gAAcv4AAIz+AACY/gAApv4AALb+AADG/gAA2P4AAOz+AAD8/gAAEv8AACL/AAA0/wAARv8AAFj/AABq/wAAdv8AAIT/AACU/wAAqv8AALr/AADK/wAA2P8AAOr/AAD8/wAAJAABADAAAQBAAAEAUgABAAAAAABSAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAxgFHZXRFeGl0Q29kZVByb2Nlc3MAAG4EV2FpdEZvclNpbmdsZU9iamVjdACVAENyZWF0ZVByb2Nlc3NBAACvA1NldENvbnNvbGVDdHJsSGFuZGxlcgD1AUdldE1vZHVsZUZpbGVOYW1lQQAA2gBFbnRlckNyaXRpY2FsU2VjdGlvbgAA9AJMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA+gFHZXRNb2R1bGVIYW5kbGVXAAArBFNsZWVwACICR2V0UHJvY0FkZHJlc3MAAAUBRXhpdFByb2Nlc3MAcAFHZXRDb21tYW5kTGluZUEAPAJHZXRTdGFydHVwSW5mb0EA8ANTZXRIYW5kbGVDb3VudAAAPgJHZXRTdGRIYW5kbGUAANgBR2V0RmlsZVR5cGUAvwBEZWxldGVDcml0aWNhbFNlY3Rpb24ANwRUZXJtaW5hdGVQcm9jZXNzAACqAUdldEN1cnJlbnRQcm9jZXNzAEgEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAfBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgDWAklzRGVidWdnZXJQcmVzZW50AOcBR2V0TGFzdEVycm9yAACmAkhlYXBGcmVlAACiAkhlYXBBbGxvYwBcAUdldENQSW5mbwDFAkludGVybG9ja2VkSW5jcmVtZW50AADBAkludGVybG9ja2VkRGVjcmVtZW50AABTAUdldEFDUAAAFAJHZXRPRU1DUAAA4AJJc1ZhbGlkQ29kZVBhZ2UAPgRUbHNHZXRWYWx1ZQA8BFRsc0FsbG9jAAA/BFRsc1NldFZhbHVlAD0EVGxzRnJlZQD0A1NldExhc3RFcnJvcgAArgFHZXRDdXJyZW50VGhyZWFkSWQAAJcEV3JpdGVGaWxlAPYCTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQASwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDAAUdldEVudmlyb25tZW50U3RyaW5ncwBMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIQEV2lkZUNoYXJUb011bHRpQnl0ZQDCAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKQCSGVhcENyZWF0ZQAAYQRWaXJ0dWFsRnJlZQBZA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACrAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCaA1J0bFVud2luZACpAkhlYXBSZUFsbG9jAF4EVmlydHVhbEFsbG9jAACEAUdldENvbnNvbGVDUAAAlgFHZXRDb25zb2xlTW9kZQAAQgFGbHVzaEZpbGVCdWZmZXJzAADmAkxDTWFwU3RyaW5nQQAAHwNNdWx0aUJ5dGVUb1dpZGVDaGFyAOgCTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdldExvY2FsZUluZm9BAADnA1NldEZpbGVQb2ludGVyAACrAkhlYXBTaXplAABEAENsb3NlSGFuZGxlAIwEV3JpdGVDb25zb2xlQQCaAUdldENvbnNvbGVPdXRwdXRDUAAAlgRXcml0ZUNvbnNvbGVXAAYEU2V0U3RkSGFuZGxlAAB5AENyZWF0ZUZpbGVBAFMAQ29tcGFyZVN0cmluZ0EAAFYAQ29tcGFyZVN0cmluZ1cAANgDU2V0RW52aXJvbm1lbnRWYXJpYWJsZUEAS0VSTkVMMzIuZGxsAABuA1JlYWRGaWxlAADVA1NldEVuZE9mRmlsZQAAJgJHZXRQcm9jZXNzSGVhcAAAygFHZXRGaWxlQXR0cmlidXRlc0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMArQQAAAAAAwCtBAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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eSIiIgpMYXVuY2ggdGhlIFB5dGhvbiBzY3JpcHQgb24gdGhlIGNvbW1hbmQgbGluZSBhZnRlcgpzZXR1cHRvb2xzIGlzIGJvb3RzdHJhcHBlZCB2aWEgaW1wb3J0LgoiIiIKCiMgTm90ZSB0aGF0IHNldHVwdG9vbHMgZ2V0cyBpbXBvcnRlZCBpbXBsaWNpdGx5IGJ5IHRoZQojIGludm9jYXRpb24gb2YgdGhpcyBzY3JpcHQgdXNpbmcgcHl0aG9uIC1tIHNldHVwdG9vbHMubGF1bmNoCgppbXBvcnQgdG9rZW5pemUKaW1wb3J0IHN5cwoKCmRlZiBydW4oKToKICAgICIiIgogICAgUnVuIHRoZSBzY3JpcHQgaW4gc3lzLmFyZ3ZbMV0gYXMgaWYgaXQgaGFkCiAgICBiZWVuIGludm9rZWQgbmF0dXJhbGx5LgogICAgIiIiCiAgICBfX2J1aWx0aW5zX18KICAgIHNjcmlwdF9uYW1lID0gc3lzLmFyZ3ZbMV0KICAgIG5hbWVzcGFjZSA9IGRpY3QoCiAgICAgICAgX19maWxlX189c2NyaXB0X25hbWUsCiAgICAgICAgX19uYW1lX189J19fbWFpbl9fJywKICAgICAgICBfX2RvY19fPU5vbmUsCiAgICApCiAgICBzeXMuYXJndls6XSA9IHN5cy5hcmd2WzE6XQoKICAgIG9wZW5fID0gZ2V0YXR0cih0b2tlbml6ZSwgJ29wZW4nLCBvcGVuKQogICAgc2NyaXB0ID0gb3Blbl8oc2NyaXB0X25hbWUpLnJlYWQoKQogICAgbm9ybV9zY3JpcHQgPSBzY3JpcHQucmVwbGFjZSgnXFxyXFxuJywgJ1xcbicpCiAgICBjb2RlID0gY29tcGlsZShub3JtX3NjcmlwdCwgc2NyaXB0X25hbWUsICdleGVjJykKICAgIGV4ZWMoY29kZSwgbmFtZXNwYWNlKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBydW4oKQpQSwMEFAAAAAAAAAAhAIdR66LdBwAA3QcAADAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2xpYjJ0bzNfZXgucHkiIiIKQ3VzdG9taXplZCBNaXhpbjJ0bzMgc3VwcG9ydDoKCiAtIGFkZHMgc3VwcG9ydCBmb3IgY29udmVydGluZyBkb2N0ZXN0cwoKClRoaXMgbW9kdWxlIHJhaXNlcyBhbiBJbXBvcnRFcnJvciBvbiBQeXRob24gMi4KIiIiCgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBNaXhpbjJ0bzMgYXMgX01peGluMnRvMwpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gbGliMnRvMy5yZWZhY3RvciBpbXBvcnQgUmVmYWN0b3JpbmdUb29sLCBnZXRfZml4ZXJzX2Zyb21fcGFja2FnZQoKaW1wb3J0IHNldHVwdG9vbHMKCgpjbGFzcyBEaXN0dXRpbHNSZWZhY3RvcmluZ1Rvb2woUmVmYWN0b3JpbmdUb29sKToKICAgIGRlZiBsb2dfZXJyb3Ioc2VsZiwgbXNnLCAqYXJncywgKiprdyk6CiAgICAgICAgbG9nLmVycm9yKG1zZywgKmFyZ3MpCgogICAgZGVmIGxvZ19tZXNzYWdlKHNlbGYsIG1zZywgKmFyZ3MpOgogICAgICAgIGxvZy5pbmZvKG1zZywgKmFyZ3MpCgogICAgZGVmIGxvZ19kZWJ1ZyhzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cuZGVidWcobXNnLCAqYXJncykKCgpjbGFzcyBNaXhpbjJ0bzMoX01peGluMnRvMyk6CiAgICBkZWYgcnVuXzJ0bzMoc2VsZiwgZmlsZXMsIGRvY3Rlc3RzPUZhbHNlKToKICAgICAgICAjIFNlZSBvZiB0aGUgZGlzdHJpYnV0aW9uIG9wdGlvbiBoYXMgYmVlbiBzZXQsIG90aGVyd2lzZSBjaGVjayB0aGUKICAgICAgICAjIHNldHVwdG9vbHMgZGVmYXVsdC4KICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi51c2VfMnRvMyBpcyBub3QgVHJ1ZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgbm90IGZpbGVzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBsb2cuaW5mbygiRml4aW5nICIgKyAiICIuam9pbihmaWxlcykpCiAgICAgICAgc2VsZi5fX2J1aWxkX2ZpeGVyX25hbWVzKCkKICAgICAgICBzZWxmLl9fZXhjbHVkZV9maXhlcnMoKQogICAgICAgIGlmIGRvY3Rlc3RzOgogICAgICAgICAgICBpZiBzZXR1cHRvb2xzLnJ1bl8ydG8zX29uX2RvY3Rlc3RzOgogICAgICAgICAgICAgICAgciA9IERpc3R1dGlsc1JlZmFjdG9yaW5nVG9vbChzZWxmLmZpeGVyX25hbWVzKQogICAgICAgICAgICAgICAgci5yZWZhY3RvcihmaWxlcywgd3JpdGU9VHJ1ZSwgZG9jdGVzdHNfb25seT1UcnVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9NaXhpbjJ0bzMucnVuXzJ0bzMoc2VsZiwgZmlsZXMpCgogICAgZGVmIF9fYnVpbGRfZml4ZXJfbmFtZXMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5maXhlcl9uYW1lczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5maXhlcl9uYW1lcyA9IFtdCiAgICAgICAgZm9yIHAgaW4gc2V0dXB0b29scy5saWIydG8zX2ZpeGVyX3BhY2thZ2VzOgogICAgICAgICAgICBzZWxmLmZpeGVyX25hbWVzLmV4dGVuZChnZXRfZml4ZXJzX2Zyb21fcGFja2FnZShwKSkKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi51c2VfMnRvM19maXhlcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvciBwIGluIHNlbGYuZGlzdHJpYnV0aW9uLnVzZV8ydG8zX2ZpeGVyczoKICAgICAgICAgICAgICAgIHNlbGYuZml4ZXJfbmFtZXMuZXh0ZW5kKGdldF9maXhlcnNfZnJvbV9wYWNrYWdlKHApKQoKICAgIGRlZiBfX2V4Y2x1ZGVfZml4ZXJzKHNlbGYpOgogICAgICAgIGV4Y2x1ZGVkX2ZpeGVycyA9IGdldGF0dHIoc2VsZiwgJ2V4Y2x1ZGVfZml4ZXJzJywgW10pCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24udXNlXzJ0bzNfZXhjbHVkZV9maXhlcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGV4Y2x1ZGVkX2ZpeGVycy5leHRlbmQoc2VsZi5kaXN0cmlidXRpb24udXNlXzJ0bzNfZXhjbHVkZV9maXhlcnMpCiAgICAgICAgZm9yIGZpeGVyX25hbWUgaW4gZXhjbHVkZWRfZml4ZXJzOgogICAgICAgICAgICBpZiBmaXhlcl9uYW1lIGluIHNlbGYuZml4ZXJfbmFtZXM6CiAgICAgICAgICAgICAgICBzZWxmLmZpeGVyX25hbWVzLnJlbW92ZShmaXhlcl9uYW1lKQpQSwMEFAAAAAAAAAAhAI1Dcl6dFgAAnRYAACwAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL21vbmtleS5weSIiIgpNb25rZXkgcGF0Y2hpbmcgb2YgZGlzdHV0aWxzLgoiIiIKCmltcG9ydCBzeXMKaW1wb3J0IGRpc3R1dGlscy5maWxlbGlzdAppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHR5cGVzCmltcG9ydCBmdW5jdG9vbHMKZnJvbSBpbXBvcnRsaWIgaW1wb3J0IGltcG9ydF9tb2R1bGUKaW1wb3J0IGluc3BlY3QKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKaW1wb3J0IHNldHVwdG9vbHMKCl9fYWxsX18gPSBbXQoiIiIKRXZlcnl0aGluZyBpcyBwcml2YXRlLiBDb250YWN0IHRoZSBwcm9qZWN0IHRlYW0KaWYgeW91IHRoaW5rIHlvdSBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KIiIiCgoKZGVmIF9nZXRfbXJvKGNscyk6CiAgICAiIiIKICAgIFJldHVybnMgdGhlIGJhc2VzIGNsYXNzZXMgZm9yIGNscyBzb3J0ZWQgYnkgdGhlIE1STy4KCiAgICBXb3JrcyBhcm91bmQgYW4gaXNzdWUgb24gSnl0aG9uIHdoZXJlIGluc3BlY3QuZ2V0bXJvIHdpbGwgbm90IHJldHVybiBhbGwKICAgIGJhc2UgY2xhc3NlcyBpZiBtdWx0aXBsZSBjbGFzc2VzIHNoYXJlIHRoZSBzYW1lIG5hbWUuIEluc3RlYWQsIHRoaXMKICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgdHVwbGUgY29udGFpbmluZyB0aGUgY2xhc3MgaXRzZWxmLCBhbmQgdGhlIGNvbnRlbnRzCiAgICBvZiBjbHMuX19iYXNlc19fLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvMTAyNC4KICAgICIiIgogICAgaWYgcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCkgPT0gIkp5dGhvbiI6CiAgICAgICAgcmV0dXJuIChjbHMsKSArIGNscy5fX2Jhc2VzX18KICAgIHJldHVybiBpbnNwZWN0LmdldG1ybyhjbHMpCgoKZGVmIGdldF91bnBhdGNoZWQoaXRlbSk6CiAgICBsb29rdXAgPSAoCiAgICAgICAgZ2V0X3VucGF0Y2hlZF9jbGFzcyBpZiBpc2luc3RhbmNlKGl0ZW0sIHNpeC5jbGFzc190eXBlcykgZWxzZQogICAgICAgIGdldF91bnBhdGNoZWRfZnVuY3Rpb24gaWYgaXNpbnN0YW5jZShpdGVtLCB0eXBlcy5GdW5jdGlvblR5cGUpIGVsc2UKICAgICAgICBsYW1iZGEgaXRlbTogTm9uZQogICAgKQogICAgcmV0dXJuIGxvb2t1cChpdGVtKQoKCmRlZiBnZXRfdW5wYXRjaGVkX2NsYXNzKGNscyk6CiAgICAiIiJQcm90ZWN0IGFnYWluc3QgcmUtcGF0Y2hpbmcgdGhlIGRpc3R1dGlscyBpZiByZWxvYWRlZAoKICAgIEFsc28gZW5zdXJlcyB0aGF0IG5vIG90aGVyIGRpc3R1dGlscyBleHRlbnNpb24gbW9ua2V5cGF0Y2hlZCB0aGUgZGlzdHV0aWxzCiAgICBmaXJzdC4KICAgICIiIgogICAgZXh0ZXJuYWxfYmFzZXMgPSAoCiAgICAgICAgY2xzCiAgICAgICAgZm9yIGNscyBpbiBfZ2V0X21ybyhjbHMpCiAgICAgICAgaWYgbm90IGNscy5fX21vZHVsZV9fLnN0YXJ0c3dpdGgoJ3NldHVwdG9vbHMnKQogICAgKQogICAgYmFzZSA9IG5leHQoZXh0ZXJuYWxfYmFzZXMpCiAgICBpZiBub3QgYmFzZS5fX21vZHVsZV9fLnN0YXJ0c3dpdGgoJ2Rpc3R1dGlscycpOgogICAgICAgIG1zZyA9ICJkaXN0dXRpbHMgaGFzIGFscmVhZHkgYmVlbiBwYXRjaGVkIGJ5ICVyIiAlIGNscwogICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKG1zZykKICAgIHJldHVybiBiYXNlCgoKZGVmIHBhdGNoX2FsbCgpOgogICAgIyB3ZSBjYW4ndCBwYXRjaCBkaXN0dXRpbHMuY21kLCBhbGFzCiAgICBkaXN0dXRpbHMuY29yZS5Db21tYW5kID0gc2V0dXB0b29scy5Db21tYW5kCgogICAgaGFzX2lzc3VlXzEyODg1ID0gc3lzLnZlcnNpb25faW5mbyA8PSAoMywgNSwgMykKCiAgICBpZiBoYXNfaXNzdWVfMTI4ODU6CiAgICAgICAgIyBmaXggZmluZGFsbCBidWcgaW4gZGlzdHV0aWxzIChodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTI4ODUpCiAgICAgICAgZGlzdHV0aWxzLmZpbGVsaXN0LmZpbmRhbGwgPSBzZXR1cHRvb2xzLmZpbmRhbGwKCiAgICBuZWVkc193YXJlaG91c2UgPSAoCiAgICAgICAgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3LCAxMykKICAgICAgICBvcgogICAgICAgICgzLCAwKSA8IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMywgNykKICAgICAgICBvcgogICAgICAgICgzLCA0KSA8IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgNCwgNikKICAgICAgICBvcgogICAgICAgICgzLCA1KSA8IHN5cy52ZXJzaW9uX2luZm8gPD0gKDMsIDUsIDMpCiAgICApCgogICAgaWYgbmVlZHNfd2FyZWhvdXNlOgogICAgICAgIHdhcmVob3VzZSA9ICdodHRwczovL3VwbG9hZC5weXBpLm9yZy9sZWdhY3kvJwogICAgICAgIGRpc3R1dGlscy5jb25maWcuUHlQSVJDQ29tbWFuZC5ERUZBVUxUX1JFUE9TSVRPUlkgPSB3YXJlaG91c2UKCiAgICBfcGF0Y2hfZGlzdHJpYnV0aW9uX21ldGFkYXRhX3dyaXRlX3BrZ19maWxlKCkKICAgIF9wYXRjaF9kaXN0cmlidXRpb25fbWV0YWRhdGFfd3JpdGVfcGtnX2luZm8oKQoKICAgICMgSW5zdGFsbCBEaXN0cmlidXRpb24gdGhyb3VnaG91dCB0aGUgZGlzdHV0aWxzCiAgICBmb3IgbW9kdWxlIGluIGRpc3R1dGlscy5kaXN0LCBkaXN0dXRpbHMuY29yZSwgZGlzdHV0aWxzLmNtZDoKICAgICAgICBtb2R1bGUuRGlzdHJpYnV0aW9uID0gc2V0dXB0b29scy5kaXN0LkRpc3RyaWJ1dGlvbgoKICAgICMgSW5zdGFsbCB0aGUgcGF0Y2hlZCBFeHRlbnNpb24KICAgIGRpc3R1dGlscy5jb3JlLkV4dGVuc2lvbiA9IHNldHVwdG9vbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbgogICAgZGlzdHV0aWxzLmV4dGVuc2lvbi5FeHRlbnNpb24gPSBzZXR1cHRvb2xzLmV4dGVuc2lvbi5FeHRlbnNpb24KICAgIGlmICdkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQnIGluIHN5cy5tb2R1bGVzOgogICAgICAgIHN5cy5tb2R1bGVzWydkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQnXS5FeHRlbnNpb24gPSAoCiAgICAgICAgICAgIHNldHVwdG9vbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbgogICAgICAgICkKCiAgICBwYXRjaF9mb3JfbXN2Y19zcGVjaWFsaXplZF9jb21waWxlcigpCgoKZGVmIF9wYXRjaF9kaXN0cmlidXRpb25fbWV0YWRhdGFfd3JpdGVfcGtnX2ZpbGUoKToKICAgICIiIlBhdGNoIHdyaXRlX3BrZ19maWxlIHRvIGFsc28gd3JpdGUgUmVxdWlyZXMtUHl0aG9uL1JlcXVpcmVzLUV4dGVybmFsIiIiCiAgICBkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb25NZXRhZGF0YS53cml0ZV9wa2dfZmlsZSA9ICgKICAgICAgICBzZXR1cHRvb2xzLmRpc3Qud3JpdGVfcGtnX2ZpbGUKICAgICkKCgpkZWYgX3BhdGNoX2Rpc3RyaWJ1dGlvbl9tZXRhZGF0YV93cml0ZV9wa2dfaW5mbygpOgogICAgIiIiCiAgICBXb3JrYXJvdW5kIGlzc3VlICMxOTcgLSBQeXRob24gMyBwcmlvciB0byAzLjIuMiB1c2VzIGFuIGVudmlyb25tZW50LWxvY2FsCiAgICBlbmNvZGluZyB0byBzYXZlIHRoZSBwa2dfaW5mby4gTW9ua2V5LXBhdGNoIGl0cyB3cml0ZV9wa2dfaW5mbyBtZXRob2QgdG8KICAgIGNvcnJlY3QgdGhpcyB1bmRlc2lyYWJsZSBiZWhhdmlvci4KICAgICIiIgogICAgZW52aXJvbm1lbnRfbG9jYWwgPSAoMywpIDw9IHN5cy52ZXJzaW9uX2luZm9bOjNdIDwgKDMsIDIsIDIpCiAgICBpZiBub3QgZW52aXJvbm1lbnRfbG9jYWw6CiAgICAgICAgcmV0dXJuCgogICAgZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uTWV0YWRhdGEud3JpdGVfcGtnX2luZm8gPSAoCiAgICAgICAgc2V0dXB0b29scy5kaXN0LndyaXRlX3BrZ19pbmZvCiAgICApCgoKZGVmIHBhdGNoX2Z1bmMocmVwbGFjZW1lbnQsIHRhcmdldF9tb2QsIGZ1bmNfbmFtZSk6CiAgICAiIiIKICAgIFBhdGNoIGZ1bmNfbmFtZSBpbiB0YXJnZXRfbW9kIHdpdGggcmVwbGFjZW1lbnQKCiAgICBJbXBvcnRhbnQgLSBvcmlnaW5hbCBtdXN0IGJlIHJlc29sdmVkIGJ5IG5hbWUgdG8gYXZvaWQKICAgIHBhdGNoaW5nIGFuIGFscmVhZHkgcGF0Y2hlZCBmdW5jdGlvbi4KICAgICIiIgogICAgb3JpZ2luYWwgPSBnZXRhdHRyKHRhcmdldF9tb2QsIGZ1bmNfbmFtZSkKCiAgICAjIHNldCB0aGUgJ3VucGF0Y2hlZCcgYXR0cmlidXRlIG9uIHRoZSByZXBsYWNlbWVudCB0bwogICAgIyBwb2ludCB0byB0aGUgb3JpZ2luYWwuCiAgICB2YXJzKHJlcGxhY2VtZW50KS5zZXRkZWZhdWx0KCd1bnBhdGNoZWQnLCBvcmlnaW5hbCkKCiAgICAjIHJlcGxhY2UgdGhlIGZ1bmN0aW9uIGluIHRoZSBvcmlnaW5hbCBtb2R1bGUKICAgIHNldGF0dHIodGFyZ2V0X21vZCwgZnVuY19uYW1lLCByZXBsYWNlbWVudCkKCgpkZWYgZ2V0X3VucGF0Y2hlZF9mdW5jdGlvbihjYW5kaWRhdGUpOgogICAgcmV0dXJuIGdldGF0dHIoY2FuZGlkYXRlLCAndW5wYXRjaGVkJykKCgpkZWYgcGF0Y2hfZm9yX21zdmNfc3BlY2lhbGl6ZWRfY29tcGlsZXIoKToKICAgICIiIgogICAgUGF0Y2ggZnVuY3Rpb25zIGluIGRpc3R1dGlscyB0byB1c2Ugc3RhbmRhbG9uZSBNaWNyb3NvZnQgVmlzdWFsIEMrKwogICAgY29tcGlsZXJzLgogICAgIiIiCiAgICAjIGltcG9ydCBsYXRlIHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydHMgb24gUHl0aG9uIDwgMy41CiAgICBtc3ZjID0gaW1wb3J0X21vZHVsZSgnc2V0dXB0b29scy5tc3ZjJykKCiAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CiAgICAgICAgIyBDb21waWxlcnMgb25seSBhdmFpbGFibGVzIG9uIE1pY3Jvc29mdCBXaW5kb3dzCiAgICAgICAgcmV0dXJuCgogICAgZGVmIHBhdGNoX3BhcmFtcyhtb2RfbmFtZSwgZnVuY19uYW1lKToKICAgICAgICAiIiIKICAgICAgICBQcmVwYXJlIHRoZSBwYXJhbWV0ZXJzIGZvciBwYXRjaF9mdW5jIHRvIHBhdGNoIGluZGljYXRlZCBmdW5jdGlvbi4KICAgICAgICAiIiIKICAgICAgICByZXBsX3ByZWZpeCA9ICdtc3ZjOV8nIGlmICdtc3ZjOScgaW4gbW9kX25hbWUgZWxzZSAnbXN2YzE0XycKICAgICAgICByZXBsX25hbWUgPSByZXBsX3ByZWZpeCArIGZ1bmNfbmFtZS5sc3RyaXAoJ18nKQogICAgICAgIHJlcGwgPSBnZXRhdHRyKG1zdmMsIHJlcGxfbmFtZSkKICAgICAgICBtb2QgPSBpbXBvcnRfbW9kdWxlKG1vZF9uYW1lKQogICAgICAgIGlmIG5vdCBoYXNhdHRyKG1vZCwgZnVuY19uYW1lKToKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoZnVuY19uYW1lKQogICAgICAgIHJldHVybiByZXBsLCBtb2QsIGZ1bmNfbmFtZQoKICAgICMgUHl0aG9uIDIuNyB0byAzLjQKICAgIG1zdmM5ID0gZnVuY3Rvb2xzLnBhcnRpYWwocGF0Y2hfcGFyYW1zLCAnZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXInKQoKICAgICMgUHl0aG9uIDMuNSsKICAgIG1zdmMxNCA9IGZ1bmN0b29scy5wYXJ0aWFsKHBhdGNoX3BhcmFtcywgJ2Rpc3R1dGlscy5fbXN2Y2NvbXBpbGVyJykKCiAgICB0cnk6CiAgICAgICAgIyBQYXRjaCBkaXN0dXRpbHMubXN2Yzljb21waWxlcgogICAgICAgIHBhdGNoX2Z1bmMoKm1zdmM5KCdmaW5kX3ZjdmFyc2FsbCcpKQogICAgICAgIHBhdGNoX2Z1bmMoKm1zdmM5KCdxdWVyeV92Y3ZhcnNhbGwnKSkKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzCgogICAgdHJ5OgogICAgICAgICMgUGF0Y2ggZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXIuX2dldF92Y19lbnYKICAgICAgICBwYXRjaF9mdW5jKCptc3ZjMTQoJ19nZXRfdmNfZW52JykpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICAjIFBhdGNoIGRpc3R1dGlscy5fbXN2Y2NvbXBpbGVyLmdlbl9saWJfb3B0aW9ucyBmb3IgTnVtcHkKICAgICAgICBwYXRjaF9mdW5jKCptc3ZjMTQoJ2dlbl9saWJfb3B0aW9ucycpKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHBhc3MKUEsDBBQAAAAAAAAAIQCCw5TmtJ8AALSfAAAqAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9tc3ZjLnB5IiIiCkltcHJvdmVkIHN1cHBvcnQgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIGNvbXBpbGVycy4KCktub3duIHN1cHBvcnRlZCBjb21waWxlcnM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk1pY3Jvc29mdCBWaXN1YWwgQysrIDkuMDoKICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIENvbXBpbGVyIGZvciBQeXRob24gMi43ICh4ODYsIGFtZDY0KQogICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDYuMSAoeDg2LCB4NjQsIGlhNjQpCiAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgNy4wICh4ODYsIHg2NCwgaWE2NCkKCk1pY3Jvc29mdCBWaXN1YWwgQysrIDEwLjA6CiAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgNy4xICh4ODYsIHg2NCwgaWE2NCkKCk1pY3Jvc29mdCBWaXN1YWwgQysrIDE0LjA6CiAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBCdWlsZCBUb29scyAyMDE1ICh4ODYsIHg2NCwgYXJtKQogICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAxNyAoeDg2LCB4NjQsIGFybSwgYXJtNjQpCiAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBCdWlsZCBUb29scyAyMDE3ICh4ODYsIHg2NCwgYXJtLCBhcm02NCkKIiIiCgppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgZGlzdHV0aWxzLmVycm9ycwpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy52ZXJzaW9uIGltcG9ydCBMZWdhY3lWZXJzaW9uCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgZmlsdGVyZmFsc2UKCmZyb20gLm1vbmtleSBpbXBvcnQgZ2V0X3VucGF0Y2hlZAoKaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgogICAgZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IHdpbnJlZwogICAgc2FmZV9lbnYgPSBvcy5lbnZpcm9uCmVsc2U6CiAgICAiIiIKICAgIE1vY2sgd2lucmVnIGFuZCBlbnZpcm9uIHNvIHRoZSBtb2R1bGUgY2FuIGJlIGltcG9ydGVkCiAgICBvbiB0aGlzIHBsYXRmb3JtLgogICAgIiIiCgogICAgY2xhc3Mgd2lucmVnOgogICAgICAgIEhLRVlfVVNFUlMgPSBOb25lCiAgICAgICAgSEtFWV9DVVJSRU5UX1VTRVIgPSBOb25lCiAgICAgICAgSEtFWV9MT0NBTF9NQUNISU5FID0gTm9uZQogICAgICAgIEhLRVlfQ0xBU1NFU19ST09UID0gTm9uZQoKICAgIHNhZmVfZW52ID0gZGljdCgpCgpfbXN2Yzlfc3VwcHJlc3NfZXJyb3JzID0gKAogICAgIyBtc3ZjOWNvbXBpbGVyIGlzbid0IGF2YWlsYWJsZSBvbiBzb21lIHBsYXRmb3JtcwogICAgSW1wb3J0RXJyb3IsCiAgICAKICAgICMgbXN2Yzljb21waWxlciByYWlzZXMgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciBpbiBzb21lCiAgICAjIGVudmlyb25tZW50cy4gU2VlICMxMTE4LgogICAgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yLAopCgp0cnk6CiAgICBmcm9tIGRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyIGltcG9ydCBSZWcKZXhjZXB0IF9tc3ZjOV9zdXBwcmVzc19lcnJvcnM6CiAgICBwYXNzCgoKZGVmIG1zdmM5X2ZpbmRfdmN2YXJzYWxsKHZlcnNpb24pOgogICAgIiIiCiAgICBQYXRjaGVkICJkaXN0dXRpbHMubXN2Yzljb21waWxlci5maW5kX3ZjdmFyc2FsbCIgdG8gdXNlIHRoZSBzdGFuZGFsb25lCiAgICBjb21waWxlciBidWlsZCBmb3IgUHl0aG9uIChWQ0ZvclB5dGhvbikuIEZhbGwgYmFjayB0byBvcmlnaW5hbCBiZWhhdmlvcgogICAgd2hlbiB0aGUgc3RhbmRhbG9uZSBjb21waWxlciBpcyBub3QgYXZhaWxhYmxlLgoKICAgIFJlZGlyZWN0IHRoZSBwYXRoIG9mICJ2Y3ZhcnNhbGwuYmF0Ii4KCiAgICBLbm93biBzdXBwb3J0ZWQgY29tcGlsZXJzCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyA5LjA6CiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgQ29tcGlsZXIgZm9yIFB5dGhvbiAyLjcgKHg4NiwgYW1kNjQpCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgdmVyc2lvbjogZmxvYXQKICAgICAgICBSZXF1aXJlZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgoKICAgIFJldHVybgogICAgLS0tLS0tCiAgICB2Y3ZhcnNhbGwuYmF0IHBhdGg6IHN0cgogICAgIiIiCiAgICBWQ19CQVNFID0gcidTb2Z0d2FyZVwlc01pY3Jvc29mdFxEZXZEaXZcVkNGb3JQeXRob25cJTAuMWYnCiAgICBrZXkgPSBWQ19CQVNFICUgKCcnLCB2ZXJzaW9uKQogICAgdHJ5OgogICAgICAgICMgUGVyLXVzZXIgaW5zdGFsbHMgcmVnaXN0ZXIgdGhlIGNvbXBpbGVyIHBhdGggaGVyZQogICAgICAgIHByb2R1Y3RkaXIgPSBSZWcuZ2V0X3ZhbHVlKGtleSwgImluc3RhbGxkaXIiKQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBBbGwtdXNlciBpbnN0YWxscyBvbiBhIDY0LWJpdCBzeXN0ZW0gcmVnaXN0ZXIgaGVyZQogICAgICAgICAgICBrZXkgPSBWQ19CQVNFICUgKCdXb3c2NDMyTm9kZVxcJywgdmVyc2lvbikKICAgICAgICAgICAgcHJvZHVjdGRpciA9IFJlZy5nZXRfdmFsdWUoa2V5LCAiaW5zdGFsbGRpciIpCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBwcm9kdWN0ZGlyID0gTm9uZQoKICAgIGlmIHByb2R1Y3RkaXI6CiAgICAgICAgdmN2YXJzYWxsID0gb3MucGF0aC5vcy5wYXRoLmpvaW4ocHJvZHVjdGRpciwgInZjdmFyc2FsbC5iYXQiKQogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHZjdmFyc2FsbCk6CiAgICAgICAgICAgIHJldHVybiB2Y3ZhcnNhbGwKCiAgICByZXR1cm4gZ2V0X3VucGF0Y2hlZChtc3ZjOV9maW5kX3ZjdmFyc2FsbCkodmVyc2lvbikKCgpkZWYgbXN2YzlfcXVlcnlfdmN2YXJzYWxsKHZlciwgYXJjaD0neDg2JywgKmFyZ3MsICoqa3dhcmdzKToKICAgICIiIgogICAgUGF0Y2hlZCAiZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIucXVlcnlfdmN2YXJzYWxsIiBmb3Igc3VwcG9ydCBleHRyYQogICAgY29tcGlsZXJzLgoKICAgIFNldCBlbnZpcm9ubWVudCB3aXRob3V0IHVzZSBvZiAidmN2YXJzYWxsLmJhdCIuCgogICAgS25vd24gc3VwcG9ydGVkIGNvbXBpbGVycwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgOS4wOgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIENvbXBpbGVyIGZvciBQeXRob24gMi43ICh4ODYsIGFtZDY0KQogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyA2LjEgKHg4NiwgeDY0LCBpYTY0KQogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyA3LjAgKHg4NiwgeDY0LCBpYTY0KQoKICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIDEwLjA6CiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMSAoeDg2LCB4NjQsIGlhNjQpCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgdmVyOiBmbG9hdAogICAgICAgIFJlcXVpcmVkIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24uCiAgICBhcmNoOiBzdHIKICAgICAgICBUYXJnZXQgYXJjaGl0ZWN0dXJlLgoKICAgIFJldHVybgogICAgLS0tLS0tCiAgICBlbnZpcm9ubWVudDogZGljdAogICAgIiIiCiAgICAjIFRyeSB0byBnZXQgZW52aXJvbmVtZW50IGZyb20gdmN2YXJzYWxsLmJhdCAoQ2xhc3NpY2FsIHdheSkKICAgIHRyeToKICAgICAgICBvcmlnID0gZ2V0X3VucGF0Y2hlZChtc3ZjOV9xdWVyeV92Y3ZhcnNhbGwpCiAgICAgICAgcmV0dXJuIG9yaWcodmVyLCBhcmNoLCAqYXJncywgKiprd2FyZ3MpCiAgICBleGNlcHQgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yOgogICAgICAgICMgUGFzcyBlcnJvciBpZiBWY3ZhcnNhbGwuYmF0IGlzIG1pc3NpbmcKICAgICAgICBwYXNzCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAjIFBhc3MgZXJyb3IgaWYgZW52aXJvbm1lbnQgbm90IHNldCBhZnRlciBleGVjdXRpbmcgdmN2YXJzYWxsLmJhdAogICAgICAgIHBhc3MKCiAgICAjIElmIGVycm9yLCB0cnkgdG8gc2V0IGVudmlyb25tZW50IGRpcmVjdGx5CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIEVudmlyb25tZW50SW5mbyhhcmNoLCB2ZXIpLnJldHVybl9lbnYoKQogICAgZXhjZXB0IGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvciBhcyBleGM6CiAgICAgICAgX2F1Z21lbnRfZXhjZXB0aW9uKGV4YywgdmVyLCBhcmNoKQogICAgICAgIHJhaXNlCgoKZGVmIG1zdmMxNF9nZXRfdmNfZW52KHBsYXRfc3BlYyk6CiAgICAiIiIKICAgIFBhdGNoZWQgImRpc3R1dGlscy5fbXN2Y2NvbXBpbGVyLl9nZXRfdmNfZW52IiBmb3Igc3VwcG9ydCBleHRyYQogICAgY29tcGlsZXJzLgoKICAgIFNldCBlbnZpcm9ubWVudCB3aXRob3V0IHVzZSBvZiAidmN2YXJzYWxsLmJhdCIuCgogICAgS25vd24gc3VwcG9ydGVkIGNvbXBpbGVycwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgMTQuMDoKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBCdWlsZCBUb29scyAyMDE1ICh4ODYsIHg2NCwgYXJtKQogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDIwMTcgKHg4NiwgeDY0LCBhcm0sIGFybTY0KQogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIEJ1aWxkIFRvb2xzIDIwMTcgKHg4NiwgeDY0LCBhcm0sIGFybTY0KQoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHBsYXRfc3BlYzogc3RyCiAgICAgICAgVGFyZ2V0IGFyY2hpdGVjdHVyZS4KCiAgICBSZXR1cm4KICAgIC0tLS0tLQogICAgZW52aXJvbm1lbnQ6IGRpY3QKICAgICIiIgogICAgIyBUcnkgdG8gZ2V0IGVudmlyb25tZW50IGZyb20gdmN2YXJzYWxsLmJhdCAoQ2xhc3NpY2FsIHdheSkKICAgIHRyeToKICAgICAgICByZXR1cm4gZ2V0X3VucGF0Y2hlZChtc3ZjMTRfZ2V0X3ZjX2VudikocGxhdF9zcGVjKQogICAgZXhjZXB0IGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcjoKICAgICAgICAjIFBhc3MgZXJyb3IgVmN2YXJzYWxsLmJhdCBpcyBtaXNzaW5nCiAgICAgICAgcGFzcwoKICAgICMgSWYgZXJyb3IsIHRyeSB0byBzZXQgZW52aXJvbm1lbnQgZGlyZWN0bHkKICAgIHRyeToKICAgICAgICByZXR1cm4gRW52aXJvbm1lbnRJbmZvKHBsYXRfc3BlYywgdmNfbWluX3Zlcj0xNC4wKS5yZXR1cm5fZW52KCkKICAgIGV4Y2VwdCBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IgYXMgZXhjOgogICAgICAgIF9hdWdtZW50X2V4Y2VwdGlvbihleGMsIDE0LjApCiAgICAgICAgcmFpc2UKCgpkZWYgbXN2YzE0X2dlbl9saWJfb3B0aW9ucygqYXJncywgKiprd2FyZ3MpOgogICAgIiIiCiAgICBQYXRjaGVkICJkaXN0dXRpbHMuX21zdmNjb21waWxlci5nZW5fbGliX29wdGlvbnMiIGZvciBmaXgKICAgIGNvbXBhdGliaWxpdHkgYmV0d2VlbiAibnVtcHkuZGlzdHV0aWxzIiBhbmQgImRpc3R1dGlscy5fbXN2Y2NvbXBpbGVyIgogICAgKGZvciBOdW1weSA8IDEuMTEuMikKICAgICIiIgogICAgaWYgIm51bXB5LmRpc3R1dGlscyIgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgaW1wb3J0IG51bXB5IGFzIG5wCiAgICAgICAgaWYgTGVnYWN5VmVyc2lvbihucC5fX3ZlcnNpb25fXykgPCBMZWdhY3lWZXJzaW9uKCcxLjExLjInKToKICAgICAgICAgICAgcmV0dXJuIG5wLmRpc3R1dGlscy5jY29tcGlsZXIuZ2VuX2xpYl9vcHRpb25zKCphcmdzLCAqKmt3YXJncykKICAgIHJldHVybiBnZXRfdW5wYXRjaGVkKG1zdmMxNF9nZW5fbGliX29wdGlvbnMpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgX2F1Z21lbnRfZXhjZXB0aW9uKGV4YywgdmVyc2lvbiwgYXJjaD0nJyk6CiAgICAiIiIKICAgIEFkZCBkZXRhaWxzIHRvIHRoZSBleGNlcHRpb24gbWVzc2FnZSB0byBoZWxwIGd1aWRlIHRoZSB1c2VyCiAgICBhcyB0byB3aGF0IGFjdGlvbiB3aWxsIHJlc29sdmUgaXQuCiAgICAiIiIKICAgICMgRXJyb3IgaWYgTVNWQysrIGRpcmVjdG9yeSBub3QgZm91bmQgb3IgZW52aXJvbm1lbnQgbm90IHNldAogICAgbWVzc2FnZSA9IGV4Yy5hcmdzWzBdCgogICAgaWYgInZjdmFyc2FsbCIgaW4gbWVzc2FnZS5sb3dlcigpIG9yICJ2aXN1YWwgYyIgaW4gbWVzc2FnZS5sb3dlcigpOgogICAgICAgICMgU3BlY2lhbCBlcnJvciBtZXNzYWdlIGlmIE1TVkMrKyBub3QgaW5zdGFsbGVkCiAgICAgICAgdG1wbCA9ICdNaWNyb3NvZnQgVmlzdWFsIEMrKyB7dmVyc2lvbjowLjFmfSBpcyByZXF1aXJlZC4nCiAgICAgICAgbWVzc2FnZSA9IHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgbXNkb3dubG9hZCA9ICd3d3cubWljcm9zb2Z0LmNvbS9kb3dubG9hZC9kZXRhaWxzLmFzcHg/aWQ9JWQnCiAgICAgICAgaWYgdmVyc2lvbiA9PSA5LjA6CiAgICAgICAgICAgIGlmIGFyY2gubG93ZXIoKS5maW5kKCdpYTY0JykgPiAtMToKICAgICAgICAgICAgICAgICMgRm9yIFZDKysgOS4wLCBpZiBJQTY0IHN1cHBvcnQgaXMgbmVlZGVkLCByZWRpcmVjdCB1c2VyCiAgICAgICAgICAgICAgICAjIHRvIFdpbmRvd3MgU0RLIDcuMAogICAgICAgICAgICAgICAgbWVzc2FnZSArPSAnIEdldCBpdCB3aXRoICJNaWNyb3NvZnQgV2luZG93cyBTREsgNy4wIjogJwogICAgICAgICAgICAgICAgbWVzc2FnZSArPSBtc2Rvd25sb2FkICUgMzEzOAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBGb3IgVkMrKyA5LjAgcmVkaXJlY3QgdXNlciB0byBWYysrIGZvciBQeXRob24gMi43IDoKICAgICAgICAgICAgICAgICMgVGhpcyByZWRpcmVjdGlvbiBsaW5rIGlzIG1haW50YWluZWQgYnkgTWljcm9zb2Z0LgogICAgICAgICAgICAgICAgIyBDb250YWN0IHZzcHl0aG9uQG1pY3Jvc29mdC5jb20gaWYgaXQgbmVlZHMgdXBkYXRpbmcuCiAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICcgR2V0IGl0IGZyb20gaHR0cDovL2FrYS5tcy92Y3B5dGhvbjI3JwogICAgICAgIGVsaWYgdmVyc2lvbiA9PSAxMC4wOgogICAgICAgICAgICAjIEZvciBWQysrIDEwLjAgUmVkaXJlY3QgdXNlciB0byBXaW5kb3dzIFNESyA3LjEKICAgICAgICAgICAgbWVzc2FnZSArPSAnIEdldCBpdCB3aXRoICJNaWNyb3NvZnQgV2luZG93cyBTREsgNy4xIjogJwogICAgICAgICAgICBtZXNzYWdlICs9IG1zZG93bmxvYWQgJSA4Mjc5CiAgICAgICAgZWxpZiB2ZXJzaW9uID49IDE0LjA6CiAgICAgICAgICAgICMgRm9yIFZDKysgMTQuMCBSZWRpcmVjdCB1c2VyIHRvIFZpc3VhbCBDKysgQnVpbGQgVG9vbHMKICAgICAgICAgICAgbWVzc2FnZSArPSAoJyBHZXQgaXQgd2l0aCAiTWljcm9zb2Z0IFZpc3VhbCBDKysgQnVpbGQgVG9vbHMiOiAnCiAgICAgICAgICAgICAgICAgICAgICAgIHInaHR0cDovL2xhbmRpbmdodWIudmlzdWFsc3R1ZGlvLmNvbS8nCiAgICAgICAgICAgICAgICAgICAgICAgICd2aXN1YWwtY3BwLWJ1aWxkLXRvb2xzJykKCiAgICBleGMuYXJncyA9IChtZXNzYWdlLCApCgoKY2xhc3MgUGxhdGZvcm1JbmZvOgogICAgIiIiCiAgICBDdXJyZW50IGFuZCBUYXJnZXQgQXJjaGl0ZWN0dXJlcyBpbmZvcm1hdGlvbnMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYXJjaDogc3RyCiAgICAgICAgVGFyZ2V0IGFyY2hpdGVjdHVyZS4KICAgICIiIgogICAgY3VycmVudF9jcHUgPSBzYWZlX2Vudi5nZXQoJ3Byb2Nlc3Nvcl9hcmNoaXRlY3R1cmUnLCAnJykubG93ZXIoKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmNoKToKICAgICAgICBzZWxmLmFyY2ggPSBhcmNoLmxvd2VyKCkucmVwbGFjZSgneDY0JywgJ2FtZDY0JykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB0YXJnZXRfY3B1KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyY2hbc2VsZi5hcmNoLmZpbmQoJ18nKSArIDE6XQoKICAgIGRlZiB0YXJnZXRfaXNfeDg2KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnRhcmdldF9jcHUgPT0gJ3g4NicKCiAgICBkZWYgY3VycmVudF9pc194ODYoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuY3VycmVudF9jcHUgPT0gJ3g4NicKCiAgICBkZWYgY3VycmVudF9kaXIoc2VsZiwgaGlkZXg4Nj1GYWxzZSwgeDY0PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBDdXJyZW50IHBsYXRmb3JtIHNwZWNpZmljIHN1YmZvbGRlci4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBoaWRleDg2OiBib29sCiAgICAgICAgICAgIHJldHVybiAnJyBhbmQgbm90ICdceDg2JyBpZiBhcmNoaXRlY3R1cmUgaXMgeDg2LgogICAgICAgIHg2NDogYm9vbAogICAgICAgICAgICByZXR1cm4gJ1x4NjQnIGFuZCBub3QgJ1xhbWQ2NCcgaWYgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdWJmb2xkZXI6IHN0cgogICAgICAgICAgICAnXHRhcmdldCcsIG9yICcnIChzZWUgaGlkZXg4NiBwYXJhbWV0ZXIpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJycgaWYgKHNlbGYuY3VycmVudF9jcHUgPT0gJ3g4NicgYW5kIGhpZGV4ODYpIGVsc2UKICAgICAgICAgICAgcidceDY0JyBpZiAoc2VsZi5jdXJyZW50X2NwdSA9PSAnYW1kNjQnIGFuZCB4NjQpIGVsc2UKICAgICAgICAgICAgcidcJXMnICUgc2VsZi5jdXJyZW50X2NwdQogICAgICAgICkKCiAgICBkZWYgdGFyZ2V0X2RpcihzZWxmLCBoaWRleDg2PUZhbHNlLCB4NjQ9RmFsc2UpOgogICAgICAgIHIiIiIKICAgICAgICBUYXJnZXQgcGxhdGZvcm0gc3BlY2lmaWMgc3ViZm9sZGVyLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGhpZGV4ODY6IGJvb2wKICAgICAgICAgICAgcmV0dXJuICcnIGFuZCBub3QgJ1x4ODYnIGlmIGFyY2hpdGVjdHVyZSBpcyB4ODYuCiAgICAgICAgeDY0OiBib29sCiAgICAgICAgICAgIHJldHVybiAnXHg2NCcgYW5kIG5vdCAnXGFtZDY0JyBpZiBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN1YmZvbGRlcjogc3RyCiAgICAgICAgICAgICdcY3VycmVudCcsIG9yICcnIChzZWUgaGlkZXg4NiBwYXJhbWV0ZXIpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJycgaWYgKHNlbGYudGFyZ2V0X2NwdSA9PSAneDg2JyBhbmQgaGlkZXg4NikgZWxzZQogICAgICAgICAgICByJ1x4NjQnIGlmIChzZWxmLnRhcmdldF9jcHUgPT0gJ2FtZDY0JyBhbmQgeDY0KSBlbHNlCiAgICAgICAgICAgIHInXCVzJyAlIHNlbGYudGFyZ2V0X2NwdQogICAgICAgICkKCiAgICBkZWYgY3Jvc3NfZGlyKHNlbGYsIGZvcmNleDg2PUZhbHNlKToKICAgICAgICByIiIiCiAgICAgICAgQ3Jvc3MgcGxhdGZvcm0gc3BlY2lmaWMgc3ViZm9sZGVyLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGZvcmNleDg2OiBib29sCiAgICAgICAgICAgIFVzZSAneDg2JyBhcyBjdXJyZW50IGFyY2hpdGVjdHVyZSBldmVuIGlmIGN1cnJlbnQgYWNyaXRlY3R1cmUgaXMKICAgICAgICAgICAgbm90IHg4Ni4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3ViZm9sZGVyOiBzdHIKICAgICAgICAgICAgJycgaWYgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBjdXJyZW50IGFyY2hpdGVjdHVyZSwKICAgICAgICAgICAgJ1xjdXJyZW50X3RhcmdldCcgaWYgbm90LgogICAgICAgICIiIgogICAgICAgIGN1cnJlbnQgPSAneDg2JyBpZiBmb3JjZXg4NiBlbHNlIHNlbGYuY3VycmVudF9jcHUKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAnJyBpZiBzZWxmLnRhcmdldF9jcHUgPT0gY3VycmVudCBlbHNlCiAgICAgICAgICAgIHNlbGYudGFyZ2V0X2RpcigpLnJlcGxhY2UoJ1xcJywgJ1xcJXNfJyAlIGN1cnJlbnQpCiAgICAgICAgKQoKCmNsYXNzIFJlZ2lzdHJ5SW5mbzoKICAgICIiIgogICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gcmVsYXRlZCByZWdpc3RyeSBpbmZvcm1hdGlvbnMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgcGxhdGZvcm1faW5mbzogUGxhdGZvcm1JbmZvCiAgICAgICAgIlBsYXRmb3JtSW5mbyIgaW5zdGFuY2UuCiAgICAiIiIKICAgIEhLRVlTID0gKHdpbnJlZy5IS0VZX1VTRVJTLAogICAgICAgICAgICAgd2lucmVnLkhLRVlfQ1VSUkVOVF9VU0VSLAogICAgICAgICAgICAgd2lucmVnLkhLRVlfTE9DQUxfTUFDSElORSwKICAgICAgICAgICAgIHdpbnJlZy5IS0VZX0NMQVNTRVNfUk9PVCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm1faW5mbyk6CiAgICAgICAgc2VsZi5waSA9IHBsYXRmb3JtX2luZm8KCiAgICBAcHJvcGVydHkKICAgIGRlZiB2aXN1YWxzdHVkaW8oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gcm9vdCByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICdWaXN1YWxTdHVkaW8nCgogICAgQHByb3BlcnR5CiAgICBkZWYgc3hzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFN4UyByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLnZpc3VhbHN0dWRpbywgJ1N4UycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgVkM3IHJlZ2lzdHJ5IGtleS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuc3hzLCAnVkM3JykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBWUzcgcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5zeHMsICdWUzcnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZjX2Zvcl9weXRob24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgZm9yIFB5dGhvbiByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHInRGV2RGl2XFZDRm9yUHl0aG9uJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG1pY3Jvc29mdF9zZGsoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFNESyByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICdNaWNyb3NvZnQgU0RLcycKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aW5kb3dzX3NkayhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cy9QbGF0Zm9ybSBTREsgcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5taWNyb3NvZnRfc2RrLCAnV2luZG93cycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbmV0Znhfc2RrKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayBTREsgcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5taWNyb3NvZnRfc2RrLCAnTkVURlhTREsnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpbmRvd3Nfa2l0c19yb290cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBLaXRzIFJvb3RzIHJlZ2lzdHJ5IGtleS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gcidXaW5kb3dzIEtpdHNcSW5zdGFsbGVkIFJvb3RzJwoKICAgIGRlZiBtaWNyb3NvZnQoc2VsZiwga2V5LCB4ODY9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBrZXkgaW4gTWljcm9zb2Z0IHNvZnR3YXJlIHJlZ2lzdHJ5LgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGtleTogc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleSBwYXRoIHdoZXJlIGxvb2suCiAgICAgICAgeDg2OiBzdHIKICAgICAgICAgICAgRm9yY2UgeDg2IHNvZnR3YXJlIHJlZ2lzdHJ5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHI6IHZhbHVlCiAgICAgICAgIiIiCiAgICAgICAgbm9kZTY0ID0gJycgaWYgc2VsZi5waS5jdXJyZW50X2lzX3g4NigpIG9yIHg4NiBlbHNlICdXb3c2NDMyTm9kZScKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKCdTb2Z0d2FyZScsIG5vZGU2NCwgJ01pY3Jvc29mdCcsIGtleSkKCiAgICBkZWYgbG9va3VwKHNlbGYsIGtleSwgbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgTG9vayBmb3IgdmFsdWVzIGluIHJlZ2lzdHJ5IGluIE1pY3Jvc29mdCBzb2Z0d2FyZSByZWdpc3RyeS4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBrZXk6IHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkgcGF0aCB3aGVyZSBsb29rLgogICAgICAgIG5hbWU6IHN0cgogICAgICAgICAgICBWYWx1ZSBuYW1lIHRvIGZpbmQuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cjogdmFsdWUKICAgICAgICAiIiIKICAgICAgICBLRVlfUkVBRCA9IHdpbnJlZy5LRVlfUkVBRAogICAgICAgIG9wZW5rZXkgPSB3aW5yZWcuT3BlbktleQogICAgICAgIG1zID0gc2VsZi5taWNyb3NvZnQKICAgICAgICBmb3IgaGtleSBpbiBzZWxmLkhLRVlTOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBia2V5ID0gb3BlbmtleShoa2V5LCBtcyhrZXkpLCAwLCBLRVlfUkVBRCkKICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBpLmN1cnJlbnRfaXNfeDg2KCk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBia2V5ID0gb3BlbmtleShoa2V5LCBtcyhrZXksIFRydWUpLCAwLCBLRVlfUkVBRCkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gd2lucmVnLlF1ZXJ5VmFsdWVFeChia2V5LCBuYW1lKVswXQogICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgcGFzcwoKCmNsYXNzIFN5c3RlbUluZm86CiAgICAiIiIKICAgIE1pY3Jvc29mdCBXaW5kb3dzIGFuZCBWaXN1YWwgU3R1ZGlvIHJlbGF0ZWQgc3lzdGVtIGlub3JtYXRpb25zLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHJlZ2lzdHJ5X2luZm86IFJlZ2lzdHJ5SW5mbwogICAgICAgICJSZWdpc3RyeUluZm8iIGluc3RhbmNlLgogICAgdmNfdmVyOiBmbG9hdAogICAgICAgIFJlcXVpcmVkIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24uCiAgICAiIiIKCiAgICAjIFZhcmlhYmxlcyBhbmQgcHJvcGVydGllcyBpbiB0aGlzIGNsYXNzIHVzZSBvcmlnaW5hbHMgQ2FtZWxDYXNlIHZhcmlhYmxlcwogICAgIyBuYW1lcyBmcm9tIE1pY3Jvc29mdCBzb3VyY2UgZmlsZXMgZm9yIG1vcmUgZWFzeSBjb21wYXJhaXNvbi4KICAgIFdpbkRpciA9IHNhZmVfZW52LmdldCgnV2luRGlyJywgJycpCiAgICBQcm9ncmFtRmlsZXMgPSBzYWZlX2Vudi5nZXQoJ1Byb2dyYW1GaWxlcycsICcnKQogICAgUHJvZ3JhbUZpbGVzeDg2ID0gc2FmZV9lbnYuZ2V0KCdQcm9ncmFtRmlsZXMoeDg2KScsIFByb2dyYW1GaWxlcykKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVnaXN0cnlfaW5mbywgdmNfdmVyPU5vbmUpOgogICAgICAgIHNlbGYucmkgPSByZWdpc3RyeV9pbmZvCiAgICAgICAgc2VsZi5waSA9IHNlbGYucmkucGkKICAgICAgICBzZWxmLnZjX3ZlciA9IHZjX3ZlciBvciBzZWxmLl9maW5kX2xhdGVzdF9hdmFpbGFibGVfdmNfdmVyKCkKCiAgICBkZWYgX2ZpbmRfbGF0ZXN0X2F2YWlsYWJsZV92Y192ZXIoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5maW5kX2F2YWlsYWJsZV92Y192ZXJzKClbLTFdCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgIGVyciA9ICdObyBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uIGZvdW5kJwogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IoZXJyKQoKICAgIGRlZiBmaW5kX2F2YWlsYWJsZV92Y192ZXJzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEZpbmQgYWxsIGF2YWlsYWJsZSBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9ucy4KICAgICAgICAiIiIKICAgICAgICBtcyA9IHNlbGYucmkubWljcm9zb2Z0CiAgICAgICAgdmNrZXlzID0gKHNlbGYucmkudmMsIHNlbGYucmkudmNfZm9yX3B5dGhvbiwgc2VsZi5yaS52cykKICAgICAgICB2Y192ZXJzID0gW10KICAgICAgICBmb3IgaGtleSBpbiBzZWxmLnJpLkhLRVlTOgogICAgICAgICAgICBmb3Iga2V5IGluIHZja2V5czoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBia2V5ID0gd2lucmVnLk9wZW5LZXkoaGtleSwgbXMoa2V5KSwgMCwgd2lucmVnLktFWV9SRUFEKQogICAgICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgc3Via2V5cywgdmFsdWVzLCBfID0gd2lucmVnLlF1ZXJ5SW5mb0tleShia2V5KQogICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UodmFsdWVzKToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHZlciA9IGZsb2F0KHdpbnJlZy5FbnVtVmFsdWUoYmtleSwgaSlbMF0pCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZlciBub3QgaW4gdmNfdmVyczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjX3ZlcnMuYXBwZW5kKHZlcikKICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3Via2V5cyk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICB2ZXIgPSBmbG9hdCh3aW5yZWcuRW51bUtleShia2V5LCBpKSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmVyIG5vdCBpbiB2Y192ZXJzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmNfdmVycy5hcHBlbmQodmVyKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHNvcnRlZCh2Y192ZXJzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZTSW5zdGFsbERpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgIyBEZWZhdWx0IHBhdGgKICAgICAgICBuYW1lID0gJ01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvICUwLjFmJyAlIHNlbGYudmNfdmVyCiAgICAgICAgZGVmYXVsdCA9IG9zLnBhdGguam9pbihzZWxmLlByb2dyYW1GaWxlc3g4NiwgbmFtZSkKCiAgICAgICAgIyBUcnkgdG8gZ2V0IHBhdGggZnJvbSByZWdpc3RyeSwgaWYgZmFpbCB1c2UgZGVmYXVsdCBwYXRoCiAgICAgICAgcmV0dXJuIHNlbGYucmkubG9va3VwKHNlbGYucmkudnMsICclMC4xZicgJSBzZWxmLnZjX3Zlcikgb3IgZGVmYXVsdAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDSW5zdGFsbERpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5WU0luc3RhbGxEaXIKCiAgICAgICAgZ3Vlc3NfdmMgPSBzZWxmLl9ndWVzc192YygpIG9yIHNlbGYuX2d1ZXNzX3ZjX2xlZ2FjeSgpCgogICAgICAgICMgVHJ5IHRvIGdldCAiVkMrKyBmb3IgUHl0aG9uIiBwYXRoIGZyb20gcmVnaXN0cnkgYXMgZGVmYXVsdCBwYXRoCiAgICAgICAgcmVnX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5yaS52Y19mb3JfcHl0aG9uLCAnJTAuMWYnICUgc2VsZi52Y192ZXIpCiAgICAgICAgcHl0aG9uX3ZjID0gc2VsZi5yaS5sb29rdXAocmVnX3BhdGgsICdpbnN0YWxsZGlyJykKICAgICAgICBkZWZhdWx0X3ZjID0gb3MucGF0aC5qb2luKHB5dGhvbl92YywgJ1ZDJykgaWYgcHl0aG9uX3ZjIGVsc2UgZ3Vlc3NfdmMKCiAgICAgICAgIyBUcnkgdG8gZ2V0IHBhdGggZnJvbSByZWdpc3RyeSwgaWYgZmFpbCB1c2UgZGVmYXVsdCBwYXRoCiAgICAgICAgcGF0aCA9IHNlbGYucmkubG9va3VwKHNlbGYucmkudmMsICclMC4xZicgJSBzZWxmLnZjX3Zlcikgb3IgZGVmYXVsdF92YwoKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICAgICAgbXNnID0gJ01pY3Jvc29mdCBWaXN1YWwgQysrIGRpcmVjdG9yeSBub3QgZm91bmQnCiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihtc2cpCgogICAgICAgIHJldHVybiBwYXRoCgogICAgZGVmIF9ndWVzc192YyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBMb2NhdGUgVmlzdWFsIEMgZm9yIDIwMTcKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8PSAxNC4wOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZGVmYXVsdCA9IHInVkNcVG9vbHNcTVNWQycKICAgICAgICBndWVzc192YyA9IG9zLnBhdGguam9pbihzZWxmLlZTSW5zdGFsbERpciwgZGVmYXVsdCkKICAgICAgICAjIFN1YmRpciB3aXRoIFZDIGV4YWN0IHZlcnNpb24gYXMgbmFtZQogICAgICAgIHRyeToKICAgICAgICAgICAgdmNfZXhhY3RfdmVyID0gb3MubGlzdGRpcihndWVzc192YylbLTFdCiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZ3Vlc3NfdmMsIHZjX2V4YWN0X3ZlcikKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IsIEluZGV4RXJyb3IpOgogICAgICAgICAgICBwYXNzCgogICAgZGVmIF9ndWVzc192Y19sZWdhY3koc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTG9jYXRlIFZpc3VhbCBDIGZvciB2ZXJzaW9ucyBwcmlvciB0byAyMDE3CiAgICAgICAgIiIiCiAgICAgICAgZGVmYXVsdCA9IHInTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gJTAuMWZcVkMnICUgc2VsZi52Y192ZXIKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuUHJvZ3JhbUZpbGVzeDg2LCBkZWZhdWx0KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFdpbmRvd3NTZGtWZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyB2ZXJzaW9ucyBmb3Igc3BlY2lmaWVkIE1TVkMrKyB2ZXJzaW9uLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDw9IDkuMDoKICAgICAgICAgICAgcmV0dXJuICgnNy4wJywgJzYuMScsICc2LjBhJykKICAgICAgICBlbGlmIHNlbGYudmNfdmVyID09IDEwLjA6CiAgICAgICAgICAgIHJldHVybiAoJzcuMScsICc3LjBhJykKICAgICAgICBlbGlmIHNlbGYudmNfdmVyID09IDExLjA6CiAgICAgICAgICAgIHJldHVybiAoJzguMCcsICc4LjBhJykKICAgICAgICBlbGlmIHNlbGYudmNfdmVyID09IDEyLjA6CiAgICAgICAgICAgIHJldHVybiAoJzguMScsICc4LjFhJykKICAgICAgICBlbGlmIHNlbGYudmNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIHJldHVybiAoJzEwLjAnLCAnOC4xJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBXaW5kb3dzU2RrTGFzdFZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIGxhc3QgdmVyc2lvbgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl91c2VfbGFzdF9kaXJfbmFtZShvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIHNlbGYuV2luZG93c1Nka0RpciwgJ2xpYicpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFdpbmRvd3NTZGtEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICBzZGtkaXIgPSAnJwogICAgICAgIGZvciB2ZXIgaW4gc2VsZi5XaW5kb3dzU2RrVmVyc2lvbjoKICAgICAgICAgICAgIyBUcnkgdG8gZ2V0IGl0IGZyb20gcmVnaXN0cnkKICAgICAgICAgICAgbG9jID0gb3MucGF0aC5qb2luKHNlbGYucmkud2luZG93c19zZGssICd2JXMnICUgdmVyKQogICAgICAgICAgICBzZGtkaXIgPSBzZWxmLnJpLmxvb2t1cChsb2MsICdpbnN0YWxsYXRpb25mb2xkZXInKQogICAgICAgICAgICBpZiBzZGtkaXI6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIG5vdCBzZGtkaXIgb3Igbm90IG9zLnBhdGguaXNkaXIoc2RrZGlyKToKICAgICAgICAgICAgIyBUcnkgdG8gZ2V0ICJWQysrIGZvciBQeXRob24iIHZlcnNpb24gZnJvbSByZWdpc3RyeQogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYucmkudmNfZm9yX3B5dGhvbiwgJyUwLjFmJyAlIHNlbGYudmNfdmVyKQogICAgICAgICAgICBpbnN0YWxsX2Jhc2UgPSBzZWxmLnJpLmxvb2t1cChwYXRoLCAnaW5zdGFsbGRpcicpCiAgICAgICAgICAgIGlmIGluc3RhbGxfYmFzZToKICAgICAgICAgICAgICAgIHNka2RpciA9IG9zLnBhdGguam9pbihpbnN0YWxsX2Jhc2UsICdXaW5TREsnKQogICAgICAgIGlmIG5vdCBzZGtkaXIgb3Igbm90IG9zLnBhdGguaXNkaXIoc2RrZGlyKToKICAgICAgICAgICAgIyBJZiBmYWlsLCB1c2UgZGVmYXVsdCBuZXcgcGF0aAogICAgICAgICAgICBmb3IgdmVyIGluIHNlbGYuV2luZG93c1Nka1ZlcnNpb246CiAgICAgICAgICAgICAgICBpbnR2ZXIgPSB2ZXJbOnZlci5yZmluZCgnLicpXQogICAgICAgICAgICAgICAgcGF0aCA9IHInTWljcm9zb2Z0IFNES3NcV2luZG93cyBLaXRzXCVzJyAlIChpbnR2ZXIpCiAgICAgICAgICAgICAgICBkID0gb3MucGF0aC5qb2luKHNlbGYuUHJvZ3JhbUZpbGVzLCBwYXRoKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkKToKICAgICAgICAgICAgICAgICAgICBzZGtkaXIgPSBkCiAgICAgICAgaWYgbm90IHNka2RpciBvciBub3Qgb3MucGF0aC5pc2RpcihzZGtkaXIpOgogICAgICAgICAgICAjIElmIGZhaWwsIHVzZSBkZWZhdWx0IG9sZCBwYXRoCiAgICAgICAgICAgIGZvciB2ZXIgaW4gc2VsZi5XaW5kb3dzU2RrVmVyc2lvbjoKICAgICAgICAgICAgICAgIHBhdGggPSByJ01pY3Jvc29mdCBTREtzXFdpbmRvd3NcdiVzJyAlIHZlcgogICAgICAgICAgICAgICAgZCA9IG9zLnBhdGguam9pbihzZWxmLlByb2dyYW1GaWxlcywgcGF0aCkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZCk6CiAgICAgICAgICAgICAgICAgICAgc2RrZGlyID0gZAogICAgICAgIGlmIG5vdCBzZGtkaXI6CiAgICAgICAgICAgICMgSWYgZmFpbCwgdXNlIFBsYXRmb3JtIFNESwogICAgICAgICAgICBzZGtkaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5WQ0luc3RhbGxEaXIsICdQbGF0Zm9ybVNESycpCiAgICAgICAgcmV0dXJuIHNka2RpcgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFdpbmRvd3NTREtFeGVjdXRhYmxlUGF0aChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgZXhlY3V0YWJsZSBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgIyBGaW5kIFdpblNESyBOZXRGeCBUb29scyByZWdpc3RyeSBkaXIgbmFtZQogICAgICAgIGlmIHNlbGYudmNfdmVyIDw9IDExLjA6CiAgICAgICAgICAgIG5ldGZ4dmVyID0gMzUKICAgICAgICAgICAgYXJjaCA9ICcnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmV0Znh2ZXIgPSA0MAogICAgICAgICAgICBoaWRleDg2ID0gVHJ1ZSBpZiBzZWxmLnZjX3ZlciA8PSAxMi4wIGVsc2UgRmFsc2UKICAgICAgICAgICAgYXJjaCA9IHNlbGYucGkuY3VycmVudF9kaXIoeDY0PVRydWUsIGhpZGV4ODY9aGlkZXg4NikKICAgICAgICBmeCA9ICdXaW5TREstTmV0RnglZFRvb2xzJXMnICUgKG5ldGZ4dmVyLCBhcmNoLnJlcGxhY2UoJ1xcJywgJy0nKSkKCiAgICAgICAgIyBsaXN0ZSBhbGwgcG9zc2libGVzIHJlZ2lzdHJ5IHBhdGhzCiAgICAgICAgcmVncGF0aHMgPSBbXQogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIGZvciB2ZXIgaW4gc2VsZi5OZXRGeFNka1ZlcnNpb246CiAgICAgICAgICAgICAgICByZWdwYXRocyArPSBbb3MucGF0aC5qb2luKHNlbGYucmkubmV0Znhfc2RrLCB2ZXIsIGZ4KV0KCiAgICAgICAgZm9yIHZlciBpbiBzZWxmLldpbmRvd3NTZGtWZXJzaW9uOgogICAgICAgICAgICByZWdwYXRocyArPSBbb3MucGF0aC5qb2luKHNlbGYucmkud2luZG93c19zZGssICd2JXNBJyAlIHZlciwgZngpXQoKICAgICAgICAjIFJldHVybiBpbnN0YWxsYXRpb24gZm9sZGVyIGZyb20gdGhlIG1vcmUgcmVjZW50IHBhdGgKICAgICAgICBmb3IgcGF0aCBpbiByZWdwYXRoczoKICAgICAgICAgICAgZXhlY3BhdGggPSBzZWxmLnJpLmxvb2t1cChwYXRoLCAnaW5zdGFsbGF0aW9uZm9sZGVyJykKICAgICAgICAgICAgaWYgZXhlY3BhdGg6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiBleGVjcGF0aAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZTaGFycEluc3RhbGxEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBGIyBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgcGF0aCA9IHInJTAuMWZcU2V0dXBcRiMnICUgc2VsZi52Y192ZXIKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYucmkudmlzdWFsc3R1ZGlvLCBwYXRoKQogICAgICAgIHJldHVybiBzZWxmLnJpLmxvb2t1cChwYXRoLCAncHJvZHVjdGRpcicpIG9yICcnCgogICAgQHByb3BlcnR5CiAgICBkZWYgVW5pdmVyc2FsQ1JUU2RrRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBVbml2ZXJzYWwgQ1JUIFNESyBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgIyBTZXQgS2l0IFJvb3RzIHZlcnNpb25zIGZvciBzcGVjaWZpZWQgTVNWQysrIHZlcnNpb24KICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNC4wOgogICAgICAgICAgICB2ZXJzID0gKCcxMCcsICc4MScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdmVycyA9ICgpCgogICAgICAgICMgRmluZCBwYXRoIG9mIHRoZSBtb3JlIHJlY2VudCBLaXQKICAgICAgICBmb3IgdmVyIGluIHZlcnM6CiAgICAgICAgICAgIHNka2RpciA9IHNlbGYucmkubG9va3VwKHNlbGYucmkud2luZG93c19raXRzX3Jvb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAna2l0c3Jvb3QlcycgJSB2ZXIpCiAgICAgICAgICAgIGlmIHNka2RpcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHNka2RpciBvciAnJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFVuaXZlcnNhbENSVFNka0xhc3RWZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBVbml2ZXJzYWwgQyBSdW50aW1lIFNESyBsYXN0IHZlcnNpb24KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fdXNlX2xhc3RfZGlyX25hbWUob3MucGF0aC5qb2luKAogICAgICAgICAgICBzZWxmLlVuaXZlcnNhbENSVFNka0RpciwgJ2xpYicpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE5ldEZ4U2RrVmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgU0RLIHZlcnNpb25zLgogICAgICAgICIiIgogICAgICAgICMgU2V0IEZ4U2RrIHZlcnNpb25zIGZvciBzcGVjaWZpZWQgTVNWQysrIHZlcnNpb24KICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNC4wOgogICAgICAgICAgICByZXR1cm4gKCc0LjYuMScsICc0LjYnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE5ldEZ4U2RrRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayBTREsgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgIGZvciB2ZXIgaW4gc2VsZi5OZXRGeFNka1ZlcnNpb246CiAgICAgICAgICAgIGxvYyA9IG9zLnBhdGguam9pbihzZWxmLnJpLm5ldGZ4X3NkaywgdmVyKQogICAgICAgICAgICBzZGtkaXIgPSBzZWxmLnJpLmxvb2t1cChsb2MsICdraXRzaW5zdGFsbGF0aW9uZm9sZGVyJykKICAgICAgICAgICAgaWYgc2RrZGlyOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gc2RrZGlyIG9yICcnCgogICAgQHByb3BlcnR5CiAgICBkZWYgRnJhbWV3b3JrRGlyMzIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIDMyYml0IGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICAjIERlZmF1bHQgcGF0aAogICAgICAgIGd1ZXNzX2Z3ID0gb3MucGF0aC5qb2luKHNlbGYuV2luRGlyLCByJ01pY3Jvc29mdC5ORVRcRnJhbWV3b3JrJykKCiAgICAgICAgIyBUcnkgdG8gZ2V0IHBhdGggZnJvbSByZWdpc3RyeSwgaWYgZmFpbCB1c2UgZGVmYXVsdCBwYXRoCiAgICAgICAgcmV0dXJuIHNlbGYucmkubG9va3VwKHNlbGYucmkudmMsICdmcmFtZXdvcmtkaXIzMicpIG9yIGd1ZXNzX2Z3CgogICAgQHByb3BlcnR5CiAgICBkZWYgRnJhbWV3b3JrRGlyNjQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIDY0Yml0IGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICAjIERlZmF1bHQgcGF0aAogICAgICAgIGd1ZXNzX2Z3ID0gb3MucGF0aC5qb2luKHNlbGYuV2luRGlyLCByJ01pY3Jvc29mdC5ORVRcRnJhbWV3b3JrNjQnKQoKICAgICAgICAjIFRyeSB0byBnZXQgcGF0aCBmcm9tIHJlZ2lzdHJ5LCBpZiBmYWlsIHVzZSBkZWZhdWx0IHBhdGgKICAgICAgICByZXR1cm4gc2VsZi5yaS5sb29rdXAoc2VsZi5yaS52YywgJ2ZyYW1ld29ya2RpcjY0Jykgb3IgZ3Vlc3NfZncKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGcmFtZXdvcmtWZXJzaW9uMzIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIDMyYml0IHZlcnNpb25zLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9maW5kX2RvdF9uZXRfdmVyc2lvbnMoMzIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgRnJhbWV3b3JrVmVyc2lvbjY0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayA2NGJpdCB2ZXJzaW9ucy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9kb3RfbmV0X3ZlcnNpb25zKDY0KQoKICAgIGRlZiBfZmluZF9kb3RfbmV0X3ZlcnNpb25zKHNlbGYsIGJpdHMpOgogICAgICAgICIiIgogICAgICAgIEZpbmQgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIHZlcnNpb25zLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGJpdHM6IGludAogICAgICAgICAgICBQbGF0Zm9ybSBudW1iZXIgb2YgYml0czogMzIgb3IgNjQuCiAgICAgICAgIiIiCiAgICAgICAgIyBGaW5kIGFjdHVhbCAuTkVUIHZlcnNpb24gaW4gcmVnaXN0cnkKICAgICAgICByZWdfdmVyID0gc2VsZi5yaS5sb29rdXAoc2VsZi5yaS52YywgJ2ZyYW1ld29ya3ZlciVkJyAlIGJpdHMpCiAgICAgICAgZG90X25ldF9kaXIgPSBnZXRhdHRyKHNlbGYsICdGcmFtZXdvcmtEaXIlZCcgJSBiaXRzKQogICAgICAgIHZlciA9IHJlZ192ZXIgb3Igc2VsZi5fdXNlX2xhc3RfZGlyX25hbWUoZG90X25ldF9kaXIsICd2Jykgb3IgJycKCiAgICAgICAgIyBTZXQgLk5FVCB2ZXJzaW9ucyBmb3Igc3BlY2lmaWVkIE1TVkMrKyB2ZXJzaW9uCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTIuMDoKICAgICAgICAgICAgZnJhbWV3b3JrdmVyID0gKHZlciwgJ3Y0LjAnKQogICAgICAgIGVsaWYgc2VsZi52Y192ZXIgPj0gMTAuMDoKICAgICAgICAgICAgZnJhbWV3b3JrdmVyID0gKCd2NC4wLjMwMzE5JyBpZiB2ZXIubG93ZXIoKVs6Ml0gIT0gJ3Y0JyBlbHNlIHZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2My41JykKICAgICAgICBlbGlmIHNlbGYudmNfdmVyID09IDkuMDoKICAgICAgICAgICAgZnJhbWV3b3JrdmVyID0gKCd2My41JywgJ3YyLjAuNTA3MjcnKQogICAgICAgIGlmIHNlbGYudmNfdmVyID09IDguMDoKICAgICAgICAgICAgZnJhbWV3b3JrdmVyID0gKCd2My4wJywgJ3YyLjAuNTA3MjcnKQogICAgICAgIHJldHVybiBmcmFtZXdvcmt2ZXIKCiAgICBkZWYgX3VzZV9sYXN0X2Rpcl9uYW1lKHNlbGYsIHBhdGgsIHByZWZpeD0nJyk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIG5hbWUgb2YgdGhlIGxhc3QgZGlyIGluIHBhdGggb3IgJycgaWYgbm8gZGlyIGZvdW5kLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIHBhdGg6IHN0cgogICAgICAgICAgICBVc2UgZGlycyBpbiB0aGlzIHBhdGgKICAgICAgICBwcmVmaXg6IHN0cgogICAgICAgICAgICBVc2Ugb25seSBkaXJzIHN0YXJ0aW5ncyBieSB0aGlzIHByZWZpeAogICAgICAgICIiIgogICAgICAgIG1hdGNoaW5nX2RpcnMgPSAoCiAgICAgICAgICAgIGRpcl9uYW1lCiAgICAgICAgICAgIGZvciBkaXJfbmFtZSBpbiByZXZlcnNlZChvcy5saXN0ZGlyKHBhdGgpKQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoLCBkaXJfbmFtZSkpIGFuZAogICAgICAgICAgICBkaXJfbmFtZS5zdGFydHN3aXRoKHByZWZpeCkKICAgICAgICApCiAgICAgICAgcmV0dXJuIG5leHQobWF0Y2hpbmdfZGlycywgTm9uZSkgb3IgJycKCgpjbGFzcyBFbnZpcm9ubWVudEluZm86CiAgICAiIiIKICAgIFJldHVybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHNwZWNpZmllZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uCiAgICBhbmQgcGxhdGZvcm0gOiBMaWIsIEluY2x1ZGUsIFBhdGggYW5kIGxpYnBhdGguCgogICAgVGhpcyBmdW5jdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysgOS4wIHRvIDE0LjAuCgogICAgU2NyaXB0IGNyZWF0ZWQgYnkgYW5hbHlzaW5nIE1pY3Jvc29mdCBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uIGZpbGVzIGxpa2UKICAgICJ2Y3ZhcnNbLi4uXS5iYXQiLCAiU2V0RW52LkNtZCIsICJ2Y2J1aWxkdG9vbHMuYmF0IiwgLi4uCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYXJjaDogc3RyCiAgICAgICAgVGFyZ2V0IGFyY2hpdGVjdHVyZS4KICAgIHZjX3ZlcjogZmxvYXQKICAgICAgICBSZXF1aXJlZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLiBJZiBub3Qgc2V0LCBhdXRvZGV0ZWN0IHRoZSBsYXN0CiAgICAgICAgdmVyc2lvbi4KICAgIHZjX21pbl92ZXI6IGZsb2F0CiAgICAgICAgTWluaW11bSBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgogICAgIiIiCgogICAgIyBWYXJpYWJsZXMgYW5kIHByb3BlcnRpZXMgaW4gdGhpcyBjbGFzcyB1c2Ugb3JpZ2luYWxzIENhbWVsQ2FzZSB2YXJpYWJsZXMKICAgICMgbmFtZXMgZnJvbSBNaWNyb3NvZnQgc291cmNlIGZpbGVzIGZvciBtb3JlIGVhc3kgY29tcGFyYWlzb24uCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyY2gsIHZjX3Zlcj1Ob25lLCB2Y19taW5fdmVyPTApOgogICAgICAgIHNlbGYucGkgPSBQbGF0Zm9ybUluZm8oYXJjaCkKICAgICAgICBzZWxmLnJpID0gUmVnaXN0cnlJbmZvKHNlbGYucGkpCiAgICAgICAgc2VsZi5zaSA9IFN5c3RlbUluZm8oc2VsZi5yaSwgdmNfdmVyKQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IHZjX21pbl92ZXI6CiAgICAgICAgICAgIGVyciA9ICdObyBzdWl0YWJsZSBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uIGZvdW5kJwogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IoZXJyKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZjX3ZlcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnNpLnZjX3ZlcgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZTVG9vbHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gVG9vbHMKICAgICAgICAiIiIKICAgICAgICBwYXRocyA9IFtyJ0NvbW1vbjdcSURFJywgcidDb21tb243XFRvb2xzJ10KCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmN1cnJlbnRfZGlyKGhpZGV4ODY9VHJ1ZSwgeDY0PVRydWUpCiAgICAgICAgICAgIHBhdGhzICs9IFtyJ0NvbW1vbjdcSURFXENvbW1vbkV4dGVuc2lvbnNcTWljcm9zb2Z0XFRlc3RXaW5kb3cnXQogICAgICAgICAgICBwYXRocyArPSBbcidUZWFtIFRvb2xzXFBlcmZvcm1hbmNlIFRvb2xzJ10KICAgICAgICAgICAgcGF0aHMgKz0gW3InVGVhbSBUb29sc1xQZXJmb3JtYW5jZSBUb29scyVzJyAlIGFyY2hfc3ViZGlyXQoKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLlZTSW5zdGFsbERpciwgcGF0aCkgZm9yIHBhdGggaW4gcGF0aHNdCgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNJbmNsdWRlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAmIE1pY3Jvc29mdCBGb3VuZGF0aW9uIENsYXNzIEluY2x1ZGVzCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5WQ0luc3RhbGxEaXIsICdJbmNsdWRlJyksCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5zaS5WQ0luc3RhbGxEaXIsIHInQVRMTUZDXEluY2x1ZGUnKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ0xpYnJhcmllcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAmIE1pY3Jvc29mdCBGb3VuZGF0aW9uIENsYXNzIExpYnJhcmllcwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE1LjA6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKGhpZGV4ODY9VHJ1ZSkKICAgICAgICBwYXRocyA9IFsnTGliJXMnICUgYXJjaF9zdWJkaXIsIHInQVRMTUZDXExpYiVzJyAlIGFyY2hfc3ViZGlyXQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNC4wOgogICAgICAgICAgICBwYXRocyArPSBbcidMaWJcc3RvcmUlcycgJSBhcmNoX3N1YmRpcl0KCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5WQ0luc3RhbGxEaXIsIHBhdGgpIGZvciBwYXRoIGluIHBhdGhzXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDU3RvcmVSZWZzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIHN0b3JlIHJlZmVyZW5jZXMgTGlicmFyaWVzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxNC4wOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLlZDSW5zdGFsbERpciwgcidMaWJcc3RvcmVccmVmZXJlbmNlcycpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDVG9vbHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgVG9vbHMKICAgICAgICAiIiIKICAgICAgICBzaSA9IHNlbGYuc2kKICAgICAgICB0b29scyA9IFtvcy5wYXRoLmpvaW4oc2kuVkNJbnN0YWxsRGlyLCAnVkNQYWNrYWdlcycpXQoKICAgICAgICBmb3JjZXg4NiA9IFRydWUgaWYgc2VsZi52Y192ZXIgPD0gMTAuMCBlbHNlIEZhbHNlCiAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmNyb3NzX2Rpcihmb3JjZXg4NikKICAgICAgICBpZiBhcmNoX3N1YmRpcjoKICAgICAgICAgICAgdG9vbHMgKz0gW29zLnBhdGguam9pbihzaS5WQ0luc3RhbGxEaXIsICdCaW4lcycgJSBhcmNoX3N1YmRpcildCgogICAgICAgIGlmIHNlbGYudmNfdmVyID09IDE0LjA6CiAgICAgICAgICAgIHBhdGggPSAnQmluJXMnICUgc2VsZi5waS5jdXJyZW50X2RpcihoaWRleDg2PVRydWUpCiAgICAgICAgICAgIHRvb2xzICs9IFtvcy5wYXRoLmpvaW4oc2kuVkNJbnN0YWxsRGlyLCBwYXRoKV0KCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA+PSAxNS4wOgogICAgICAgICAgICBob3N0X2RpciA9IChyJ2JpblxIb3N0WDg2JXMnIGlmIHNlbGYucGkuY3VycmVudF9pc194ODYoKSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHInYmluXEhvc3RYNjQlcycpCiAgICAgICAgICAgIHRvb2xzICs9IFtvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICBzaS5WQ0luc3RhbGxEaXIsIGhvc3RfZGlyICUgc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKSldCgogICAgICAgICAgICBpZiBzZWxmLnBpLmN1cnJlbnRfY3B1ICE9IHNlbGYucGkudGFyZ2V0X2NwdToKICAgICAgICAgICAgICAgIHRvb2xzICs9IFtvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgc2kuVkNJbnN0YWxsRGlyLCBob3N0X2RpciAlIHNlbGYucGkuY3VycmVudF9kaXIoeDY0PVRydWUpKV0KCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdG9vbHMgKz0gW29zLnBhdGguam9pbihzaS5WQ0luc3RhbGxEaXIsICdCaW4nKV0KCiAgICAgICAgcmV0dXJuIHRvb2xzCgogICAgQHByb3BlcnR5CiAgICBkZWYgT1NMaWJyYXJpZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIExpYnJhcmllcwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDw9IDEwLjA6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKGhpZGV4ODY9VHJ1ZSwgeDY0PVRydWUpCiAgICAgICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ0xpYiVzJyAlIGFyY2hfc3ViZGlyKV0KCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpCiAgICAgICAgICAgIGxpYiA9IG9zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdsaWInKQogICAgICAgICAgICBsaWJ2ZXIgPSBzZWxmLl9zZGtfc3ViZGlyCiAgICAgICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKGxpYiwgJyVzdW0lcycgJSAobGlidmVyICwgYXJjaF9zdWJkaXIpKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBPU0luY2x1ZGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBJbmNsdWRlCiAgICAgICAgIiIiCiAgICAgICAgaW5jbHVkZSA9IG9zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdpbmNsdWRlJykKCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPD0gMTAuMDoKICAgICAgICAgICAgcmV0dXJuIFtpbmNsdWRlLCBvcy5wYXRoLmpvaW4oaW5jbHVkZSwgJ2dsJyldCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE0LjA6CiAgICAgICAgICAgICAgICBzZGt2ZXIgPSBzZWxmLl9zZGtfc3ViZGlyCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZGt2ZXIgPSAnJwogICAgICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihpbmNsdWRlLCAnJXNzaGFyZWQnICUgc2RrdmVyKSwKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oaW5jbHVkZSwgJyVzdW0nICUgc2RrdmVyKSwKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oaW5jbHVkZSwgJyVzd2lucnQnICUgc2RrdmVyKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBPU0xpYnBhdGgoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIExpYnJhcmllcyBQYXRocwogICAgICAgICIiIgogICAgICAgIHJlZiA9IG9zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdSZWZlcmVuY2VzJykKICAgICAgICBsaWJwYXRoID0gW10KCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPD0gOS4wOgogICAgICAgICAgICBsaWJwYXRoICs9IHNlbGYuT1NMaWJyYXJpZXMKCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTEuMDoKICAgICAgICAgICAgbGlicGF0aCArPSBbb3MucGF0aC5qb2luKHJlZiwgcidDb21tb25Db25maWd1cmF0aW9uXE5ldXRyYWwnKV0KCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgbGlicGF0aCArPSBbCiAgICAgICAgICAgICAgICByZWYsCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnVW5pb25NZXRhZGF0YScpLAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgIHJlZiwKICAgICAgICAgICAgICAgICAgICAnV2luZG93cy5Gb3VuZGF0aW9uLlVuaXZlcnNhbEFwaUNvbnRyYWN0JywKICAgICAgICAgICAgICAgICAgICAnMS4wLjAuMCcsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgIHJlZiwKICAgICAgICAgICAgICAgICAgICAnV2luZG93cy5Gb3VuZGF0aW9uLkZvdW5kYXRpb25Db250cmFjdCcsCiAgICAgICAgICAgICAgICAgICAgJzEuMC4wLjAnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICByZWYsCiAgICAgICAgICAgICAgICAgICAgJ1dpbmRvd3MuTmV0d29ya2luZy5Db25uZWN0aXZpdHkuV3dhbkNvbnRyYWN0JywKICAgICAgICAgICAgICAgICAgICAnMS4wLjAuMCcsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgIHNlbGYuc2kuV2luZG93c1Nka0RpciwKICAgICAgICAgICAgICAgICAgICAnRXh0ZW5zaW9uU0RLcycsCiAgICAgICAgICAgICAgICAgICAgJ01pY3Jvc29mdC5WQ0xpYnMnLAogICAgICAgICAgICAgICAgICAgICclMC4xZicgJSBzZWxmLnZjX3ZlciwKICAgICAgICAgICAgICAgICAgICAnUmVmZXJlbmNlcycsCiAgICAgICAgICAgICAgICAgICAgJ0NvbW1vbkNvbmZpZ3VyYXRpb24nLAogICAgICAgICAgICAgICAgICAgICduZXV0cmFsJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIF0KICAgICAgICByZXR1cm4gbGlicGF0aAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFNka1Rvb2xzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBUb29scwogICAgICAgICIiIgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuX3Nka190b29scygpKQoKICAgIGRlZiBfc2RrX3Rvb2xzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBUb29scyBwYXRocyBnZW5lcmF0b3IKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDE1LjA6CiAgICAgICAgICAgIGJpbl9kaXIgPSAnQmluJyBpZiBzZWxmLnZjX3ZlciA8PSAxMS4wIGVsc2UgcidCaW5ceDg2JwogICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCBiaW5fZGlyKQoKICAgICAgICBpZiBub3Qgc2VsZi5waS5jdXJyZW50X2lzX3g4NigpOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3VycmVudF9kaXIoeDY0PVRydWUpCiAgICAgICAgICAgIHBhdGggPSAnQmluJXMnICUgYXJjaF9zdWJkaXIKICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgcGF0aCkKCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPT0gMTAuMCBvciBzZWxmLnZjX3ZlciA9PSAxMS4wOgogICAgICAgICAgICBpZiBzZWxmLnBpLnRhcmdldF9pc194ODYoKToKICAgICAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gJycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jdXJyZW50X2RpcihoaWRleDg2PVRydWUsIHg2ND1UcnVlKQogICAgICAgICAgICBwYXRoID0gcidCaW5cTkVURlggNC4wIFRvb2xzJXMnICUgYXJjaF9zdWJkaXIKICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgcGF0aCkKCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA+PSAxNS4wOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ0JpbicpCiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jdXJyZW50X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICAgICAgc2RrdmVyID0gc2VsZi5zaS5XaW5kb3dzU2RrTGFzdFZlcnNpb24KICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHBhdGgsICclcyVzJyAlIChzZGt2ZXIsIGFyY2hfc3ViZGlyKSkKCiAgICAgICAgaWYgc2VsZi5zaS5XaW5kb3dzU0RLRXhlY3V0YWJsZVBhdGg6CiAgICAgICAgICAgIHlpZWxkIHNlbGYuc2kuV2luZG93c1NES0V4ZWN1dGFibGVQYXRoCgogICAgQHByb3BlcnR5CiAgICBkZWYgX3Nka19zdWJkaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIHZlcnNpb24gc3ViZGlyCiAgICAgICAgIiIiCiAgICAgICAgdWNydHZlciA9IHNlbGYuc2kuV2luZG93c1Nka0xhc3RWZXJzaW9uCiAgICAgICAgcmV0dXJuICgnJXNcXCcgJSB1Y3J0dmVyKSBpZiB1Y3J0dmVyIGVsc2UgJycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBTZGtTZXR1cChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgU2V0dXAKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA+IDkuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ1NldHVwJyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgRnhUb29scyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgVG9vbHMKICAgICAgICAiIiIKICAgICAgICBwaSA9IHNlbGYucGkKICAgICAgICBzaSA9IHNlbGYuc2kKCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPD0gMTAuMDoKICAgICAgICAgICAgaW5jbHVkZTMyID0gVHJ1ZQogICAgICAgICAgICBpbmNsdWRlNjQgPSBub3QgcGkudGFyZ2V0X2lzX3g4NigpIGFuZCBub3QgcGkuY3VycmVudF9pc194ODYoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGluY2x1ZGUzMiA9IHBpLnRhcmdldF9pc194ODYoKSBvciBwaS5jdXJyZW50X2lzX3g4NigpCiAgICAgICAgICAgIGluY2x1ZGU2NCA9IHBpLmN1cnJlbnRfY3B1ID09ICdhbWQ2NCcgb3IgcGkudGFyZ2V0X2NwdSA9PSAnYW1kNjQnCgogICAgICAgIHRvb2xzID0gW10KICAgICAgICBpZiBpbmNsdWRlMzI6CiAgICAgICAgICAgIHRvb2xzICs9IFtvcy5wYXRoLmpvaW4oc2kuRnJhbWV3b3JrRGlyMzIsIHZlcikKICAgICAgICAgICAgICAgICAgICAgIGZvciB2ZXIgaW4gc2kuRnJhbWV3b3JrVmVyc2lvbjMyXQogICAgICAgIGlmIGluY2x1ZGU2NDoKICAgICAgICAgICAgdG9vbHMgKz0gW29zLnBhdGguam9pbihzaS5GcmFtZXdvcmtEaXI2NCwgdmVyKQogICAgICAgICAgICAgICAgICAgICAgZm9yIHZlciBpbiBzaS5GcmFtZXdvcmtWZXJzaW9uNjRdCiAgICAgICAgcmV0dXJuIHRvb2xzCgogICAgQHByb3BlcnR5CiAgICBkZWYgTmV0RnhTREtMaWJyYXJpZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5OZXQgRnJhbWV3b3JrIFNESyBMaWJyYXJpZXMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDE0LjAgb3Igbm90IHNlbGYuc2kuTmV0RnhTZGtEaXI6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLk5ldEZ4U2RrRGlyLCByJ2xpYlx1bSVzJyAlIGFyY2hfc3ViZGlyKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBOZXRGeFNES0luY2x1ZGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTmV0IEZyYW1ld29yayBTREsgSW5jbHVkZXMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDE0LjAgb3Igbm90IHNlbGYuc2kuTmV0RnhTZGtEaXI6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLk5ldEZ4U2RrRGlyLCByJ2luY2x1ZGVcdW0nKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWc1REYihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBUZWFtIFN5c3RlbSBEYXRhYmFzZQogICAgICAgICIiIgogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuVlNJbnN0YWxsRGlyLCByJ1ZTVFNEQlxEZXBsb3knKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBNU0J1aWxkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBCdWlsZCBFbmdpbmUKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDEyLjA6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIGVsaWYgc2VsZi52Y192ZXIgPCAxNS4wOgogICAgICAgICAgICBiYXNlX3BhdGggPSBzZWxmLnNpLlByb2dyYW1GaWxlc3g4NgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3VycmVudF9kaXIoaGlkZXg4Nj1UcnVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJhc2VfcGF0aCA9IHNlbGYuc2kuVlNJbnN0YWxsRGlyCiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gJycKCiAgICAgICAgcGF0aCA9IHInTVNCdWlsZFwlMC4xZlxiaW4lcycgJSAoc2VsZi52Y192ZXIsIGFyY2hfc3ViZGlyKQogICAgICAgIGJ1aWxkID0gW29zLnBhdGguam9pbihiYXNlX3BhdGgsIHBhdGgpXQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNS4wOgogICAgICAgICAgICAjIEFkZCBSb3NseW4gQyMgJiBWaXN1YWwgQmFzaWMgQ29tcGlsZXIKICAgICAgICAgICAgYnVpbGQgKz0gW29zLnBhdGguam9pbihiYXNlX3BhdGgsIHBhdGgsICdSb3NseW4nKV0KCiAgICAgICAgcmV0dXJuIGJ1aWxkCgogICAgQHByb3BlcnR5CiAgICBkZWYgSFRNTEhlbHBXb3Jrc2hvcChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgSFRNTCBIZWxwIFdvcmtzaG9wCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxMS4wOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5Qcm9ncmFtRmlsZXN4ODYsICdIVE1MIEhlbHAgV29ya3Nob3AnKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBVQ1JUTGlicmFyaWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBVbml2ZXJzYWwgQyBSdW50aW1lIFNESyBMaWJyYXJpZXMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDE0LjA6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICBsaWIgPSBvcy5wYXRoLmpvaW4oc2VsZi5zaS5Vbml2ZXJzYWxDUlRTZGtEaXIsICdsaWInKQogICAgICAgIHVjcnR2ZXIgPSBzZWxmLl91Y3J0X3N1YmRpcgogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKGxpYiwgJyVzdWNydCVzJyAlICh1Y3J0dmVyLCBhcmNoX3N1YmRpcikpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFVDUlRJbmNsdWRlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVW5pdmVyc2FsIEMgUnVudGltZSBTREsgSW5jbHVkZQogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTQuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIGluY2x1ZGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5zaS5Vbml2ZXJzYWxDUlRTZGtEaXIsICdpbmNsdWRlJykKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihpbmNsdWRlLCAnJXN1Y3J0JyAlIHNlbGYuX3VjcnRfc3ViZGlyKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBfdWNydF9zdWJkaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFVuaXZlcnNhbCBDIFJ1bnRpbWUgU0RLIHZlcnNpb24gc3ViZGlyCiAgICAgICAgIiIiCiAgICAgICAgdWNydHZlciA9IHNlbGYuc2kuVW5pdmVyc2FsQ1JUU2RrTGFzdFZlcnNpb24KICAgICAgICByZXR1cm4gKCclc1xcJyAlIHVjcnR2ZXIpIGlmIHVjcnR2ZXIgZWxzZSAnJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZTaGFycChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEYjCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxMS4wIGFuZCBzZWxmLnZjX3ZlciA+IDEyLjA6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXR1cm4gc2VsZi5zaS5GU2hhcnBJbnN0YWxsRGlyCgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNSdW50aW1lUmVkaXN0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIHJ1bnRpbWUgcmVkaXN0cmlidWFibGUgZGxsCiAgICAgICAgIiIiCiAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxNToKICAgICAgICAgICAgcmVkaXN0X3BhdGggPSBzZWxmLnNpLlZDSW5zdGFsbERpcgogICAgICAgICAgICB2Y3J1bnRpbWUgPSAncmVkaXN0JXNcXE1pY3Jvc29mdC5WQyVkMC5DUlRcXHZjcnVudGltZSVkMC5kbGwnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVkaXN0X3BhdGggPSBzZWxmLnNpLlZDSW5zdGFsbERpci5yZXBsYWNlKCdcXFRvb2xzJywgJ1xcUmVkaXN0JykKICAgICAgICAgICAgdmNydW50aW1lID0gJ29uZWNvcmUlc1xcTWljcm9zb2Z0LlZDJWQwLkNSVFxcdmNydW50aW1lJWQwLmRsbCcKCiAgICAgICAgIyBWaXN1YWwgU3R1ZGlvIDIwMTcgIGlzIHN0aWxsIFZpc3VhbCBDKysgMTQuMAogICAgICAgIGRsbF92ZXIgPSAxNC4wIGlmIHNlbGYudmNfdmVyID09IDE1IGVsc2Ugc2VsZi52Y192ZXIKCiAgICAgICAgdmNydW50aW1lID0gdmNydW50aW1lICUgKGFyY2hfc3ViZGlyLCBzZWxmLnZjX3ZlciwgZGxsX3ZlcikKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHJlZGlzdF9wYXRoLCB2Y3J1bnRpbWUpCgogICAgZGVmIHJldHVybl9lbnYoc2VsZiwgZXhpc3RzPVRydWUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBlbnZpcm9ubWVudCBkaWN0LgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGV4aXN0czogYm9vbAogICAgICAgICAgICBJdCBUcnVlLCBvbmx5IHJldHVybiBleGlzdGluZyBwYXRocy4KICAgICAgICAiIiIKICAgICAgICBlbnYgPSBkaWN0KAogICAgICAgICAgICBpbmNsdWRlPXNlbGYuX2J1aWxkX3BhdGhzKCdpbmNsdWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5WQ0luY2x1ZGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk9TSW5jbHVkZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVUNSVEluY2x1ZGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk5ldEZ4U0RLSW5jbHVkZXNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyksCiAgICAgICAgICAgIGxpYj1zZWxmLl9idWlsZF9wYXRocygnbGliJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLlZDTGlicmFyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuT1NMaWJyYXJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5GeFRvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVUNSVExpYnJhcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk5ldEZ4U0RLTGlicmFyaWVzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyksCiAgICAgICAgICAgIGxpYnBhdGg9c2VsZi5fYnVpbGRfcGF0aHMoJ2xpYnBhdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLlZDTGlicmFyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkZ4VG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVkNTdG9yZVJlZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuT1NMaWJwYXRoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMpLAogICAgICAgICAgICBwYXRoPXNlbGYuX2J1aWxkX3BhdGhzKCdwYXRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5WQ1Rvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlZTVG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVnNURGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuU2RrVG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuU2RrU2V0dXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRnhUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5NU0J1aWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkhUTUxIZWxwV29ya3Nob3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRlNoYXJwXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMpLAogICAgICAgICkKICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNCBhbmQgb3MucGF0aC5pc2ZpbGUoc2VsZi5WQ1J1bnRpbWVSZWRpc3QpOgogICAgICAgICAgICBlbnZbJ3B5X3ZjcnVudGltZV9yZWRpc3QnXSA9IHNlbGYuVkNSdW50aW1lUmVkaXN0CiAgICAgICAgcmV0dXJuIGVudgoKICAgIGRlZiBfYnVpbGRfcGF0aHMoc2VsZiwgbmFtZSwgc3BlY19wYXRoX2xpc3RzLCBleGlzdHMpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgYW5kIHNwZWNpZmllZCBwYXRocywKICAgICAgICByZXR1cm4gYSBwYXRoc2VwLXNlcGFyYXRlZCBzdHJpbmcgb2YgcGF0aHMgY29udGFpbmluZwogICAgICAgIHVuaXF1ZSwgZXh0YW50LCBkaXJlY3RvcmllcyBmcm9tIHRob3NlIHBhdGhzIGFuZCBmcm9tCiAgICAgICAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLiBSYWlzZSBhbiBlcnJvciBpZiBubyBwYXRocwogICAgICAgIGFyZSByZXNvbHZlZC4KICAgICAgICAiIiIKICAgICAgICAjIGZsYXR0ZW4gc3BlY19wYXRoX2xpc3RzCiAgICAgICAgc3BlY19wYXRocyA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlKHNwZWNfcGF0aF9saXN0cykKICAgICAgICBlbnZfcGF0aHMgPSBzYWZlX2Vudi5nZXQobmFtZSwgJycpLnNwbGl0KG9zLnBhdGhzZXApCiAgICAgICAgcGF0aHMgPSBpdGVydG9vbHMuY2hhaW4oc3BlY19wYXRocywgZW52X3BhdGhzKQogICAgICAgIGV4dGFudF9wYXRocyA9IGxpc3QoZmlsdGVyKG9zLnBhdGguaXNkaXIsIHBhdGhzKSkgaWYgZXhpc3RzIGVsc2UgcGF0aHMKICAgICAgICBpZiBub3QgZXh0YW50X3BhdGhzOgogICAgICAgICAgICBtc2cgPSAiJXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgZW1wdHkiICUgbmFtZS51cHBlcigpCiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihtc2cpCiAgICAgICAgdW5pcXVlX3BhdGhzID0gc2VsZi5fdW5pcXVlX2V2ZXJzZWVuKGV4dGFudF9wYXRocykKICAgICAgICByZXR1cm4gb3MucGF0aHNlcC5qb2luKHVuaXF1ZV9wYXRocykKCiAgICAjIGZyb20gUHl0aG9uIGRvY3MKICAgIGRlZiBfdW5pcXVlX2V2ZXJzZWVuKHNlbGYsIGl0ZXJhYmxlLCBrZXk9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgTGlzdCB1bmlxdWUgZWxlbWVudHMsIHByZXNlcnZpbmcgb3JkZXIuCiAgICAgICAgUmVtZW1iZXIgYWxsIGVsZW1lbnRzIGV2ZXIgc2Vlbi4KCiAgICAgICAgX3VuaXF1ZV9ldmVyc2VlbignQUFBQUJCQkNDREFBQkJCJykgLS0+IEEgQiBDIEQKCiAgICAgICAgX3VuaXF1ZV9ldmVyc2VlbignQUJCQ2NBRCcsIHN0ci5sb3dlcikgLS0+IEEgQiBDIEQKICAgICAgICAiIiIKICAgICAgICBzZWVuID0gc2V0KCkKICAgICAgICBzZWVuX2FkZCA9IHNlZW4uYWRkCiAgICAgICAgaWYga2V5IGlzIE5vbmU6CiAgICAgICAgICAgIGZvciBlbGVtZW50IGluIGZpbHRlcmZhbHNlKHNlZW4uX19jb250YWluc19fLCBpdGVyYWJsZSk6CiAgICAgICAgICAgICAgICBzZWVuX2FkZChlbGVtZW50KQogICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvciBlbGVtZW50IGluIGl0ZXJhYmxlOgogICAgICAgICAgICAgICAgayA9IGtleShlbGVtZW50KQogICAgICAgICAgICAgICAgaWYgayBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICBzZWVuX2FkZChrKQogICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKUEsDBBQAAAAAAAAAIQBjC+PWfwwAAH8MAAAwAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9uYW1lc3BhY2VzLnB5aW1wb3J0IG9zCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKaW1wb3J0IGl0ZXJ0b29scwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcAoKCmZsYXR0ZW4gPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZQoKCmNsYXNzIEluc3RhbGxlcjoKCiAgICBuc3BrZ19leHQgPSAnLW5zcGtnLnB0aCcKCiAgICBkZWYgaW5zdGFsbF9uYW1lc3BhY2VzKHNlbGYpOgogICAgICAgIG5zcCA9IHNlbGYuX2dldF9hbGxfbnNfcGFja2FnZXMoKQogICAgICAgIGlmIG5vdCBuc3A6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGZpbGVuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KHNlbGYuX2dldF90YXJnZXQoKSkKICAgICAgICBmaWxlbmFtZSArPSBzZWxmLm5zcGtnX2V4dAogICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQoZmlsZW5hbWUpCiAgICAgICAgbG9nLmluZm8oIkluc3RhbGxpbmcgJXMiLCBmaWxlbmFtZSkKICAgICAgICBsaW5lcyA9IG1hcChzZWxmLl9nZW5fbnNwa2dfbGluZSwgbnNwKQoKICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICMgYWx3YXlzIGdlbmVyYXRlIHRoZSBsaW5lcywgZXZlbiBpbiBkcnkgcnVuCiAgICAgICAgICAgIGxpc3QobGluZXMpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3dCcpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGVsaW5lcyhsaW5lcykKCiAgICBkZWYgdW5pbnN0YWxsX25hbWVzcGFjZXMoc2VsZik6CiAgICAgICAgZmlsZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2VsZi5fZ2V0X3RhcmdldCgpKQogICAgICAgIGZpbGVuYW1lICs9IHNlbGYubnNwa2dfZXh0CiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nICVzIiwgZmlsZW5hbWUpCiAgICAgICAgb3MucmVtb3ZlKGZpbGVuYW1lKQoKICAgIGRlZiBfZ2V0X3RhcmdldChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50YXJnZXQKCiAgICBfbnNwa2dfdG1wbCA9ICgKICAgICAgICAiaW1wb3J0IHN5cywgdHlwZXMsIG9zIiwKICAgICAgICAiaGFzX21mcyA9IHN5cy52ZXJzaW9uX2luZm8gPiAoMywgNSkiLAogICAgICAgICJwID0gb3MucGF0aC5qb2luKCUocm9vdClzLCAqJShwdGgpcikiLAogICAgICAgICJpbXBvcnRsaWIgPSBoYXNfbWZzIGFuZCBfX2ltcG9ydF9fKCdpbXBvcnRsaWIudXRpbCcpIiwKICAgICAgICAiaGFzX21mcyBhbmQgX19pbXBvcnRfXygnaW1wb3J0bGliLm1hY2hpbmVyeScpIiwKICAgICAgICAibSA9IGhhc19tZnMgYW5kICIKICAgICAgICAgICAgInN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJShwa2cpciwgIgogICAgICAgICAgICAgICAgImltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWMoIgogICAgICAgICAgICAgICAgICAgICJpbXBvcnRsaWIubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9zcGVjKCUocGtnKXIsICIKICAgICAgICAgICAgICAgICAgICAgICAgIltvcy5wYXRoLmRpcm5hbWUocCldKSkpIiwKICAgICAgICAibSA9IG0gb3IgIgogICAgICAgICAgICAic3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCglKHBrZylyLCB0eXBlcy5Nb2R1bGVUeXBlKCUocGtnKXIpKSIsCiAgICAgICAgIm1wID0gKG0gb3IgW10pIGFuZCBtLl9fZGljdF9fLnNldGRlZmF1bHQoJ19fcGF0aF9fJyxbXSkiLAogICAgICAgICIocCBub3QgaW4gbXApIGFuZCBtcC5hcHBlbmQocCkiLAogICAgKQogICAgImxpbmVzIGZvciB0aGUgbmFtZXNwYWNlIGluc3RhbGxlciIKCiAgICBfbnNwa2dfdG1wbF9tdWx0aSA9ICgKICAgICAgICAnbSBhbmQgc2V0YXR0cihzeXMubW9kdWxlc1slKHBhcmVudClyXSwgJShjaGlsZClyLCBtKScsCiAgICApCiAgICAiYWRkaXRpb25hbCBsaW5lKHMpIHdoZW4gYSBwYXJlbnQgcGFja2FnZSBpcyBpbmRpY2F0ZWQiCgogICAgZGVmIF9nZXRfcm9vdChzZWxmKToKICAgICAgICByZXR1cm4gInN5cy5fZ2V0ZnJhbWUoMSkuZl9sb2NhbHNbJ3NpdGVkaXInXSIKCiAgICBkZWYgX2dlbl9uc3BrZ19saW5lKHNlbGYsIHBrZyk6CiAgICAgICAgIyBlbnN1cmUgcGtnIGlzIG5vdCBhIHVuaWNvZGUgc3RyaW5nIHVuZGVyIFB5dGhvbiAyLjcKICAgICAgICBwa2cgPSBzdHIocGtnKQogICAgICAgIHB0aCA9IHR1cGxlKHBrZy5zcGxpdCgnLicpKQogICAgICAgIHJvb3QgPSBzZWxmLl9nZXRfcm9vdCgpCiAgICAgICAgdG1wbF9saW5lcyA9IHNlbGYuX25zcGtnX3RtcGwKICAgICAgICBwYXJlbnQsIHNlcCwgY2hpbGQgPSBwa2cucnBhcnRpdGlvbignLicpCiAgICAgICAgaWYgcGFyZW50OgogICAgICAgICAgICB0bXBsX2xpbmVzICs9IHNlbGYuX25zcGtnX3RtcGxfbXVsdGkKICAgICAgICByZXR1cm4gJzsnLmpvaW4odG1wbF9saW5lcykgJSBsb2NhbHMoKSArICdcbicKCiAgICBkZWYgX2dldF9hbGxfbnNfcGFja2FnZXMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHNvcnRlZCBsaXN0IG9mIGFsbCBwYWNrYWdlIG5hbWVzcGFjZXMiIiIKICAgICAgICBwa2dzID0gc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzIG9yIFtdCiAgICAgICAgcmV0dXJuIHNvcnRlZChmbGF0dGVuKG1hcChzZWxmLl9wa2dfbmFtZXMsIHBrZ3MpKSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3BrZ19uYW1lcyhwa2cpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGEgbmFtZXNwYWNlIHBhY2thZ2UsIHlpZWxkIHRoZSBjb21wb25lbnRzIG9mIHRoYXQKICAgICAgICBwYWNrYWdlLgoKICAgICAgICA+Pj4gbmFtZXMgPSBJbnN0YWxsZXIuX3BrZ19uYW1lcygnYS5iLmMnKQogICAgICAgID4+PiBzZXQobmFtZXMpID09IHNldChbJ2EnLCAnYS5iJywgJ2EuYi5jJ10pCiAgICAgICAgVHJ1ZQogICAgICAgICIiIgogICAgICAgIHBhcnRzID0gcGtnLnNwbGl0KCcuJykKICAgICAgICB3aGlsZSBwYXJ0czoKICAgICAgICAgICAgeWllbGQgJy4nLmpvaW4ocGFydHMpCiAgICAgICAgICAgIHBhcnRzLnBvcCgpCgoKY2xhc3MgRGV2ZWxvcEluc3RhbGxlcihJbnN0YWxsZXIpOgogICAgZGVmIF9nZXRfcm9vdChzZWxmKToKICAgICAgICByZXR1cm4gcmVwcihzdHIoc2VsZi5lZ2dfcGF0aCkpCgogICAgZGVmIF9nZXRfdGFyZ2V0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmVnZ19saW5rClBLAwQUAAAAAAAAACEAibATzjueAAA7ngAAMwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcGFja2FnZV9pbmRleC5weSIiIlB5UEkgYW5kIGRpcmVjdCBwYWNrYWdlIGRvd25sb2FkaW5nIiIiCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc2h1dGlsCmltcG9ydCBzb2NrZXQKaW1wb3J0IGJhc2U2NAppbXBvcnQgaGFzaGxpYgppbXBvcnQgaXRlcnRvb2xzCmZyb20gZnVuY3Rvb2xzIGltcG9ydCB3cmFwcwoKdHJ5OgogICAgZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHNwbGl0dXNlcgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIHVybGxpYjIgaW1wb3J0IHNwbGl0dXNlcgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWIsIGh0dHBfY2xpZW50LCBjb25maWdwYXJzZXIsIG1hcAoKaW1wb3J0IHNldHVwdG9vbHMKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAoCiAgICBDSEVDS09VVF9ESVNULCBEaXN0cmlidXRpb24sIEJJTkFSWV9ESVNULCBub3JtYWxpemVfcGF0aCwgU09VUkNFX0RJU1QsCiAgICBFbnZpcm9ubWVudCwgZmluZF9kaXN0cmlidXRpb25zLCBzYWZlX25hbWUsIHNhZmVfdmVyc2lvbiwKICAgIHRvX2ZpbGVuYW1lLCBSZXF1aXJlbWVudCwgREVWRUxPUF9ESVNULCBFR0dfRElTVCwKKQpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNzbF9zdXBwb3J0CmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgpmcm9tIGZubWF0Y2ggaW1wb3J0IHRyYW5zbGF0ZQpmcm9tIHNldHVwdG9vbHMucHkyN2NvbXBhdCBpbXBvcnQgZ2V0X2FsbF9oZWFkZXJzCmZyb20gc2V0dXB0b29scy53aGVlbCBpbXBvcnQgV2hlZWwKCkVHR19GUkFHTUVOVCA9IHJlLmNvbXBpbGUocideZWdnPShbLUEtWmEtejAtOV8uKyFdKykkJykKSFJFRiA9IHJlLmNvbXBpbGUoIiIiaHJlZlxccyo9XFxzKlsnIl0/KFteJyI+IF0rKSIiIiwgcmUuSSkKIyB0aGlzIGlzIGhlcmUgdG8gZml4IGVtYWNzJyBjcnVkZHkgYnJva2VuIHN5bnRheCBoaWdobGlnaHRpbmcKUFlQSV9NRDUgPSByZS5jb21waWxlKAogICAgJzxhIGhyZWY9IihbXiIjXSspIj4oW148XSspPC9hPlxuXFxzK1xcKDxhICg/OnRpdGxlPSJNRDUgaGFzaCJcblxccyspJwogICAgJ2hyZWY9IlteP10rXFw/OmFjdGlvbj1zaG93X21kNSZhbXA7ZGlnZXN0PShbMC05YS1mXXszMn0pIj5tZDU8L2E+XFwpJwopClVSTF9TQ0hFTUUgPSByZS5jb21waWxlKCcoWy0rLmEtejAtOV17Mix9KTonLCByZS5JKS5tYXRjaApFWFRFTlNJT05TID0gIi50YXIuZ3ogLnRhci5iejIgLnRhciAuemlwIC50Z3oiLnNwbGl0KCkKCl9fYWxsX18gPSBbCiAgICAnUGFja2FnZUluZGV4JywgJ2Rpc3Ryb3NfZm9yX3VybCcsICdwYXJzZV9iZGlzdF93aW5pbnN0JywKICAgICdpbnRlcnByZXRfZGlzdHJvX25hbWUnLApdCgpfU09DS0VUX1RJTUVPVVQgPSAxNQoKX3RtcGwgPSAic2V0dXB0b29scy97c2V0dXB0b29scy5fX3ZlcnNpb25fX30gUHl0aG9uLXVybGxpYi97cHlfbWFqb3J9Igp1c2VyX2FnZW50ID0gX3RtcGwuZm9ybWF0KHB5X21ham9yPXN5cy52ZXJzaW9uWzozXSwgc2V0dXB0b29scz1zZXR1cHRvb2xzKQoKCmRlZiBwYXJzZV9yZXF1aXJlbWVudF9hcmcoc3BlYyk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIFJlcXVpcmVtZW50LnBhcnNlKHNwZWMpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgIk5vdCBhIFVSTCwgZXhpc3RpbmcgZmlsZSwgb3IgcmVxdWlyZW1lbnQgc3BlYzogJXIiICUgKHNwZWMsKQogICAgICAgICkKCgpkZWYgcGFyc2VfYmRpc3Rfd2luaW5zdChuYW1lKToKICAgICIiIlJldHVybiAoYmFzZSxweXZlcnNpb24pIG9yIChOb25lLE5vbmUpIGZvciBwb3NzaWJsZSAuZXhlIG5hbWUiIiIKCiAgICBsb3dlciA9IG5hbWUubG93ZXIoKQogICAgYmFzZSwgcHlfdmVyLCBwbGF0ID0gTm9uZSwgTm9uZSwgTm9uZQoKICAgIGlmIGxvd2VyLmVuZHN3aXRoKCcuZXhlJyk6CiAgICAgICAgaWYgbG93ZXIuZW5kc3dpdGgoJy53aW4zMi5leGUnKToKICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0xMF0KICAgICAgICAgICAgcGxhdCA9ICd3aW4zMicKICAgICAgICBlbGlmIGxvd2VyLnN0YXJ0c3dpdGgoJy53aW4zMi1weScsIC0xNik6CiAgICAgICAgICAgIHB5X3ZlciA9IG5hbWVbLTc6LTRdCiAgICAgICAgICAgIGJhc2UgPSBuYW1lWzotMTZdCiAgICAgICAgICAgIHBsYXQgPSAnd2luMzInCiAgICAgICAgZWxpZiBsb3dlci5lbmRzd2l0aCgnLndpbi1hbWQ2NC5leGUnKToKICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0xNF0KICAgICAgICAgICAgcGxhdCA9ICd3aW4tYW1kNjQnCiAgICAgICAgZWxpZiBsb3dlci5zdGFydHN3aXRoKCcud2luLWFtZDY0LXB5JywgLTIwKToKICAgICAgICAgICAgcHlfdmVyID0gbmFtZVstNzotNF0KICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0yMF0KICAgICAgICAgICAgcGxhdCA9ICd3aW4tYW1kNjQnCiAgICByZXR1cm4gYmFzZSwgcHlfdmVyLCBwbGF0CgoKZGVmIGVnZ19pbmZvX2Zvcl91cmwodXJsKToKICAgIHBhcnRzID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHVybCkKICAgIHNjaGVtZSwgc2VydmVyLCBwYXRoLCBwYXJhbWV0ZXJzLCBxdWVyeSwgZnJhZ21lbnQgPSBwYXJ0cwogICAgYmFzZSA9IHVybGxpYi5wYXJzZS51bnF1b3RlKHBhdGguc3BsaXQoJy8nKVstMV0pCiAgICBpZiBzZXJ2ZXIgPT0gJ3NvdXJjZWZvcmdlLm5ldCcgYW5kIGJhc2UgPT0gJ2Rvd25sb2FkJzogICMgWFhYIFl1Y2sKICAgICAgICBiYXNlID0gdXJsbGliLnBhcnNlLnVucXVvdGUocGF0aC5zcGxpdCgnLycpWy0yXSkKICAgIGlmICcjJyBpbiBiYXNlOgogICAgICAgIGJhc2UsIGZyYWdtZW50ID0gYmFzZS5zcGxpdCgnIycsIDEpCiAgICByZXR1cm4gYmFzZSwgZnJhZ21lbnQKCgpkZWYgZGlzdHJvc19mb3JfdXJsKHVybCwgbWV0YWRhdGE9Tm9uZSk6CiAgICAiIiJZaWVsZCBlZ2cgb3Igc291cmNlIGRpc3RyaWJ1dGlvbiBvYmplY3RzIHRoYXQgbWlnaHQgYmUgZm91bmQgYXQgYSBVUkwiIiIKICAgIGJhc2UsIGZyYWdtZW50ID0gZWdnX2luZm9fZm9yX3VybCh1cmwpCiAgICBmb3IgZGlzdCBpbiBkaXN0cm9zX2Zvcl9sb2NhdGlvbih1cmwsIGJhc2UsIG1ldGFkYXRhKToKICAgICAgICB5aWVsZCBkaXN0CiAgICBpZiBmcmFnbWVudDoKICAgICAgICBtYXRjaCA9IEVHR19GUkFHTUVOVC5tYXRjaChmcmFnbWVudCkKICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKAogICAgICAgICAgICAgICAgdXJsLCBtYXRjaC5ncm91cCgxKSwgbWV0YWRhdGEsIHByZWNlZGVuY2U9Q0hFQ0tPVVRfRElTVAogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgeWllbGQgZGlzdAoKCmRlZiBkaXN0cm9zX2Zvcl9sb2NhdGlvbihsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhPU5vbmUpOgogICAgIiIiWWllbGQgZWdnIG9yIHNvdXJjZSBkaXN0cmlidXRpb24gb2JqZWN0cyBiYXNlZCBvbiBiYXNlbmFtZSIiIgogICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5lZ2cuemlwJyk6CiAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVs6LTRdICAjIHN0cmlwIHRoZSAuemlwCiAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aCgnLmVnZycpIGFuZCAnLScgaW4gYmFzZW5hbWU6CiAgICAgICAgIyBvbmx5IG9uZSwgdW5hbWJpZ3VvdXMgaW50ZXJwcmV0YXRpb24KICAgICAgICByZXR1cm4gW0Rpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEpXQogICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy53aGwnKSBhbmQgJy0nIGluIGJhc2VuYW1lOgogICAgICAgIHdoZWVsID0gV2hlZWwoYmFzZW5hbWUpCiAgICAgICAgaWYgbm90IHdoZWVsLmlzX2NvbXBhdGlibGUoKToKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgcmV0dXJuIFtEaXN0cmlidXRpb24oCiAgICAgICAgICAgIGxvY2F0aW9uPWxvY2F0aW9uLAogICAgICAgICAgICBwcm9qZWN0X25hbWU9d2hlZWwucHJvamVjdF9uYW1lLAogICAgICAgICAgICB2ZXJzaW9uPXdoZWVsLnZlcnNpb24sCiAgICAgICAgICAgICMgSW5jcmVhc2UgcHJpb3JpdHkgb3ZlciBlZ2dzLgogICAgICAgICAgICBwcmVjZWRlbmNlPUVHR19ESVNUICsgMSwKICAgICAgICApXQogICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5leGUnKToKICAgICAgICB3aW5fYmFzZSwgcHlfdmVyLCBwbGF0Zm9ybSA9IHBhcnNlX2JkaXN0X3dpbmluc3QoYmFzZW5hbWUpCiAgICAgICAgaWYgd2luX2Jhc2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBpbnRlcnByZXRfZGlzdHJvX25hbWUoCiAgICAgICAgICAgICAgICBsb2NhdGlvbiwgd2luX2Jhc2UsIG1ldGFkYXRhLCBweV92ZXIsIEJJTkFSWV9ESVNULCBwbGF0Zm9ybQogICAgICAgICAgICApCiAgICAjIFRyeSBzb3VyY2UgZGlzdHJvIGV4dGVuc2lvbnMgKC56aXAsIC50Z3osIGV0Yy4pCiAgICAjCiAgICBmb3IgZXh0IGluIEVYVEVOU0lPTlM6CiAgICAgICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoZXh0KToKICAgICAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVs6LWxlbihleHQpXQogICAgICAgICAgICByZXR1cm4gaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEpCiAgICByZXR1cm4gW10gICMgbm8gZXh0ZW5zaW9uIG1hdGNoZWQKCgpkZWYgZGlzdHJvc19mb3JfZmlsZW5hbWUoZmlsZW5hbWUsIG1ldGFkYXRhPU5vbmUpOgogICAgIiIiWWllbGQgcG9zc2libGUgZWdnIG9yIHNvdXJjZSBkaXN0cmlidXRpb24gb2JqZWN0cyBiYXNlZCBvbiBhIGZpbGVuYW1lIiIiCiAgICByZXR1cm4gZGlzdHJvc19mb3JfbG9jYXRpb24oCiAgICAgICAgbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgbWV0YWRhdGEKICAgICkKCgpkZWYgaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKAogICAgICAgIGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEsIHB5X3ZlcnNpb249Tm9uZSwgcHJlY2VkZW5jZT1TT1VSQ0VfRElTVCwKICAgICAgICBwbGF0Zm9ybT1Ob25lCik6CiAgICAiIiJHZW5lcmF0ZSBhbHRlcm5hdGl2ZSBpbnRlcnByZXRhdGlvbnMgb2YgYSBzb3VyY2UgZGlzdHJvIG5hbWUKCiAgICBOb3RlOiBpZiBgbG9jYXRpb25gIGlzIGEgZmlsZXN5c3RlbSBmaWxlbmFtZSwgeW91IHNob3VsZCBjYWxsCiAgICBgYHBrZ19yZXNvdXJjZXMubm9ybWFsaXplX3BhdGgoKWBgIG9uIGl0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMKICAgIHJvdXRpbmUhCiAgICAiIiIKICAgICMgR2VuZXJhdGUgYWx0ZXJuYXRpdmUgaW50ZXJwcmV0YXRpb25zIG9mIGEgc291cmNlIGRpc3RybyBuYW1lCiAgICAjIEJlY2F1c2Ugc29tZSBwYWNrYWdlcyBhcmUgYW1iaWd1b3VzIGFzIHRvIG5hbWUvdmVyc2lvbnMgc3BsaXQKICAgICMgZS5nLiAiYWRucy1weXRob24tMS4xLjAiLCAiZWdlbml4LW14LWNvbW1lcmNpYWwiLCBldGMuCiAgICAjIFNvLCB3ZSBnZW5lcmF0ZSBlYWNoIHBvc3NpYmxlIGludGVyZXByZXRhdGlvbiAoZS5nLiAiYWRucywgcHl0aG9uLTEuMS4wIgogICAgIyAiYWRucy1weXRob24sIDEuMS4wIiwgYW5kICJhZG5zLXB5dGhvbi0xLjEuMCwgbm8gdmVyc2lvbiIpLiAgSW4gcHJhY3RpY2UsCiAgICAjIHRoZSBzcHVyaW91cyBpbnRlcnByZXRhdGlvbnMgc2hvdWxkIGJlIGlnbm9yZWQsIGJlY2F1c2UgaW4gdGhlIGV2ZW50CiAgICAjIHRoZXJlJ3MgYWxzbyBhbiAiYWRucyIgcGFja2FnZSwgdGhlIHNwdXJpb3VzICJweXRob24tMS4xLjAiIHZlcnNpb24gd2lsbAogICAgIyBjb21wYXJlIGxvd2VyIHRoYW4gYW55IG51bWVyaWMgdmVyc2lvbiBudW1iZXIsIGFuZCBpcyB0aGVyZWZvcmUgdW5saWtlbHkKICAgICMgdG8gbWF0Y2ggYSByZXF1ZXN0IGZvciBpdC4gIEl0J3Mgc3RpbGwgYSBwb3RlbnRpYWwgcHJvYmxlbSwgdGhvdWdoLCBhbmQKICAgICMgaW4gdGhlIGxvbmcgcnVuIFB5UEkgYW5kIHRoZSBkaXN0dXRpbHMgc2hvdWxkIGdvIGZvciAic2FmZSIgbmFtZXMgYW5kCiAgICAjIHZlcnNpb25zIGluIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIG5hbWVzIChzZGlzdCBhbmQgYmRpc3QpLgoKICAgIHBhcnRzID0gYmFzZW5hbWUuc3BsaXQoJy0nKQogICAgaWYgbm90IHB5X3ZlcnNpb24gYW5kIGFueShyZS5tYXRjaChyJ3B5XGRcLlxkJCcsIHApIGZvciBwIGluIHBhcnRzWzI6XSk6CiAgICAgICAgIyBpdCBpcyBhIGJkaXN0X2R1bWIsIG5vdCBhbiBzZGlzdCAtLSBiYWlsIG91dAogICAgICAgIHJldHVybgoKICAgIGZvciBwIGluIHJhbmdlKDEsIGxlbihwYXJ0cykgKyAxKToKICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24oCiAgICAgICAgICAgIGxvY2F0aW9uLCBtZXRhZGF0YSwgJy0nLmpvaW4ocGFydHNbOnBdKSwgJy0nLmpvaW4ocGFydHNbcDpdKSwKICAgICAgICAgICAgcHlfdmVyc2lvbj1weV92ZXJzaW9uLCBwcmVjZWRlbmNlPXByZWNlZGVuY2UsCiAgICAgICAgICAgIHBsYXRmb3JtPXBsYXRmb3JtCiAgICAgICAgKQoKCiMgRnJvbSBQeXRob24gMi43IGRvY3MKZGVmIHVuaXF1ZV9ldmVyc2VlbihpdGVyYWJsZSwga2V5PU5vbmUpOgogICAgIkxpc3QgdW5pcXVlIGVsZW1lbnRzLCBwcmVzZXJ2aW5nIG9yZGVyLiBSZW1lbWJlciBhbGwgZWxlbWVudHMgZXZlciBzZWVuLiIKICAgICMgdW5pcXVlX2V2ZXJzZWVuKCdBQUFBQkJCQ0NEQUFCQkInKSAtLT4gQSBCIEMgRAogICAgIyB1bmlxdWVfZXZlcnNlZW4oJ0FCQkNjQUQnLCBzdHIubG93ZXIpIC0tPiBBIEIgQyBECiAgICBzZWVuID0gc2V0KCkKICAgIHNlZW5fYWRkID0gc2Vlbi5hZGQKICAgIGlmIGtleSBpcyBOb25lOgogICAgICAgIGZvciBlbGVtZW50IGluIHNpeC5tb3Zlcy5maWx0ZXJmYWxzZShzZWVuLl9fY29udGFpbnNfXywgaXRlcmFibGUpOgogICAgICAgICAgICBzZWVuX2FkZChlbGVtZW50KQogICAgICAgICAgICB5aWVsZCBlbGVtZW50CiAgICBlbHNlOgogICAgICAgIGZvciBlbGVtZW50IGluIGl0ZXJhYmxlOgogICAgICAgICAgICBrID0ga2V5KGVsZW1lbnQpCiAgICAgICAgICAgIGlmIGsgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICBzZWVuX2FkZChrKQogICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudAoKCmRlZiB1bmlxdWVfdmFsdWVzKGZ1bmMpOgogICAgIiIiCiAgICBXcmFwIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGFuIGl0ZXJhYmxlIHN1Y2ggdGhhdCB0aGUgcmVzdWx0aW5nIGl0ZXJhYmxlCiAgICBvbmx5IGV2ZXIgeWllbGRzIHVuaXF1ZSBpdGVtcy4KICAgICIiIgoKICAgIEB3cmFwcyhmdW5jKQogICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICByZXR1cm4gdW5pcXVlX2V2ZXJzZWVuKGZ1bmMoKmFyZ3MsICoqa3dhcmdzKSkKCiAgICByZXR1cm4gd3JhcHBlcgoKClJFTCA9IHJlLmNvbXBpbGUociIiIjwoW14+XSpcc3JlbFxzKj1ccypbJyJdPyhbXiciPl0rKVtePl0qKT4iIiIsIHJlLkkpCiMgdGhpcyBsaW5lIGlzIGhlcmUgdG8gZml4IGVtYWNzJyBjcnVkZHkgYnJva2VuIHN5bnRheCBoaWdobGlnaHRpbmcKCgpAdW5pcXVlX3ZhbHVlcwpkZWYgZmluZF9leHRlcm5hbF9saW5rcyh1cmwsIHBhZ2UpOgogICAgIiIiRmluZCByZWw9ImhvbWVwYWdlIiBhbmQgcmVsPSJkb3dubG9hZCIgbGlua3MgaW4gYHBhZ2VgLCB5aWVsZGluZyBVUkxzIiIiCgogICAgZm9yIG1hdGNoIGluIFJFTC5maW5kaXRlcihwYWdlKToKICAgICAgICB0YWcsIHJlbCA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgcmVscyA9IHNldChtYXAoc3RyLnN0cmlwLCByZWwubG93ZXIoKS5zcGxpdCgnLCcpKSkKICAgICAgICBpZiAnaG9tZXBhZ2UnIGluIHJlbHMgb3IgJ2Rvd25sb2FkJyBpbiByZWxzOgogICAgICAgICAgICBmb3IgbWF0Y2ggaW4gSFJFRi5maW5kaXRlcih0YWcpOgogICAgICAgICAgICAgICAgeWllbGQgdXJsbGliLnBhcnNlLnVybGpvaW4odXJsLCBodG1sZGVjb2RlKG1hdGNoLmdyb3VwKDEpKSkKCiAgICBmb3IgdGFnIGluICgiPHRoPkhvbWUgUGFnZSIsICI8dGg+RG93bmxvYWQgVVJMIik6CiAgICAgICAgcG9zID0gcGFnZS5maW5kKHRhZykKICAgICAgICBpZiBwb3MgIT0gLTE6CiAgICAgICAgICAgIG1hdGNoID0gSFJFRi5zZWFyY2gocGFnZSwgcG9zKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIHlpZWxkIHVybGxpYi5wYXJzZS51cmxqb2luKHVybCwgaHRtbGRlY29kZShtYXRjaC5ncm91cCgxKSkpCgoKY2xhc3MgQ29udGVudENoZWNrZXIob2JqZWN0KToKICAgICIiIgogICAgQSBudWxsIGNvbnRlbnQgY2hlY2tlciB0aGF0IGRlZmluZXMgdGhlIGludGVyZmFjZSBmb3IgY2hlY2tpbmcgY29udGVudAogICAgIiIiCgogICAgZGVmIGZlZWQoc2VsZiwgYmxvY2spOgogICAgICAgICIiIgogICAgICAgIEZlZWQgYSBibG9jayBvZiBkYXRhIHRvIHRoZSBoYXNoLgogICAgICAgICIiIgogICAgICAgIHJldHVybgoKICAgIGRlZiBpc192YWxpZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayB0aGUgaGFzaC4gUmV0dXJuIEZhbHNlIGlmIHZhbGlkYXRpb24gZmFpbHMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmVwb3J0KHNlbGYsIHJlcG9ydGVyLCB0ZW1wbGF0ZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsbCByZXBvcnRlciB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGVja2VyIChoYXNoIG5hbWUpCiAgICAgICAgc3Vic3RpdHV0ZWQgaW50byB0aGUgdGVtcGxhdGUuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuCgoKY2xhc3MgSGFzaENoZWNrZXIoQ29udGVudENoZWNrZXIpOgogICAgcGF0dGVybiA9IHJlLmNvbXBpbGUoCiAgICAgICAgcicoP1A8aGFzaF9uYW1lPnNoYTF8c2hhMjI0fHNoYTM4NHxzaGEyNTZ8c2hhNTEyfG1kNSk9JwogICAgICAgIHInKD9QPGV4cGVjdGVkPlthLWYwLTldKyknCiAgICApCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhhc2hfbmFtZSwgZXhwZWN0ZWQpOgogICAgICAgIHNlbGYuaGFzaF9uYW1lID0gaGFzaF9uYW1lCiAgICAgICAgc2VsZi5oYXNoID0gaGFzaGxpYi5uZXcoaGFzaF9uYW1lKQogICAgICAgIHNlbGYuZXhwZWN0ZWQgPSBleHBlY3RlZAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fdXJsKGNscywgdXJsKToKICAgICAgICAiQ29uc3RydWN0IGEgKHBvc3NpYmx5IG51bGwpIENvbnRlbnRDaGVja2VyIGZyb20gYSBVUkwiCiAgICAgICAgZnJhZ21lbnQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKVstMV0KICAgICAgICBpZiBub3QgZnJhZ21lbnQ6CiAgICAgICAgICAgIHJldHVybiBDb250ZW50Q2hlY2tlcigpCiAgICAgICAgbWF0Y2ggPSBjbHMucGF0dGVybi5zZWFyY2goZnJhZ21lbnQpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByZXR1cm4gQ29udGVudENoZWNrZXIoKQogICAgICAgIHJldHVybiBjbHMoKiptYXRjaC5ncm91cGRpY3QoKSkKCiAgICBkZWYgZmVlZChzZWxmLCBibG9jayk6CiAgICAgICAgc2VsZi5oYXNoLnVwZGF0ZShibG9jaykKCiAgICBkZWYgaXNfdmFsaWQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaC5oZXhkaWdlc3QoKSA9PSBzZWxmLmV4cGVjdGVkCgogICAgZGVmIHJlcG9ydChzZWxmLCByZXBvcnRlciwgdGVtcGxhdGUpOgogICAgICAgIG1zZyA9IHRlbXBsYXRlICUgc2VsZi5oYXNoX25hbWUKICAgICAgICByZXR1cm4gcmVwb3J0ZXIobXNnKQoKCmNsYXNzIFBhY2thZ2VJbmRleChFbnZpcm9ubWVudCk6CiAgICAiIiJBIGRpc3RyaWJ1dGlvbiBpbmRleCB0aGF0IHNjYW5zIHdlYiBwYWdlcyBmb3IgZG93bmxvYWQgVVJMcyIiIgoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICAgICAgc2VsZiwgaW5kZXhfdXJsPSJodHRwczovL3B5cGkucHl0aG9uLm9yZy9zaW1wbGUiLCBob3N0cz0oJyonLCksCiAgICAgICAgICAgIGNhX2J1bmRsZT1Ob25lLCB2ZXJpZnlfc3NsPVRydWUsICphcmdzLCAqKmt3CiAgICApOgogICAgICAgIEVudmlyb25tZW50Ll9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KQogICAgICAgIHNlbGYuaW5kZXhfdXJsID0gaW5kZXhfdXJsICsgIi8iIFs6bm90IGluZGV4X3VybC5lbmRzd2l0aCgnLycpXQogICAgICAgIHNlbGYuc2Nhbm5lZF91cmxzID0ge30KICAgICAgICBzZWxmLmZldGNoZWRfdXJscyA9IHt9CiAgICAgICAgc2VsZi5wYWNrYWdlX3BhZ2VzID0ge30KICAgICAgICBzZWxmLmFsbG93cyA9IHJlLmNvbXBpbGUoJ3wnLmpvaW4obWFwKHRyYW5zbGF0ZSwgaG9zdHMpKSkubWF0Y2gKICAgICAgICBzZWxmLnRvX3NjYW4gPSBbXQogICAgICAgIHVzZV9zc2wgPSAoCiAgICAgICAgICAgIHZlcmlmeV9zc2wKICAgICAgICAgICAgYW5kIHNzbF9zdXBwb3J0LmlzX2F2YWlsYWJsZQogICAgICAgICAgICBhbmQgKGNhX2J1bmRsZSBvciBzc2xfc3VwcG9ydC5maW5kX2NhX2J1bmRsZSgpKQogICAgICAgICkKICAgICAgICBpZiB1c2Vfc3NsOgogICAgICAgICAgICBzZWxmLm9wZW5lciA9IHNzbF9zdXBwb3J0Lm9wZW5lcl9mb3IoY2FfYnVuZGxlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYub3BlbmVyID0gdXJsbGliLnJlcXVlc3QudXJsb3BlbgoKICAgIGRlZiBwcm9jZXNzX3VybChzZWxmLCB1cmwsIHJldHJpZXZlPUZhbHNlKToKICAgICAgICAiIiJFdmFsdWF0ZSBhIFVSTCBhcyBhIHBvc3NpYmxlIGRvd25sb2FkLCBhbmQgbWF5YmUgcmV0cmlldmUgaXQiIiIKICAgICAgICBpZiB1cmwgaW4gc2VsZi5zY2FubmVkX3VybHMgYW5kIG5vdCByZXRyaWV2ZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5zY2FubmVkX3VybHNbdXJsXSA9IFRydWUKICAgICAgICBpZiBub3QgVVJMX1NDSEVNRSh1cmwpOgogICAgICAgICAgICBzZWxmLnByb2Nlc3NfZmlsZW5hbWUodXJsKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXN0cyA9IGxpc3QoZGlzdHJvc19mb3JfdXJsKHVybCkpCiAgICAgICAgICAgIGlmIGRpc3RzOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYudXJsX29rKHVybCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnKCJGb3VuZCBsaW5rOiAlcyIsIHVybCkKCiAgICAgICAgaWYgZGlzdHMgb3Igbm90IHJldHJpZXZlIG9yIHVybCBpbiBzZWxmLmZldGNoZWRfdXJsczoKICAgICAgICAgICAgbGlzdChtYXAoc2VsZi5hZGQsIGRpc3RzKSkKICAgICAgICAgICAgcmV0dXJuICAjIGRvbid0IG5lZWQgdGhlIGFjdHVhbCBwYWdlCgogICAgICAgIGlmIG5vdCBzZWxmLnVybF9vayh1cmwpOgogICAgICAgICAgICBzZWxmLmZldGNoZWRfdXJsc1t1cmxdID0gVHJ1ZQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5pbmZvKCJSZWFkaW5nICVzIiwgdXJsKQogICAgICAgIHNlbGYuZmV0Y2hlZF91cmxzW3VybF0gPSBUcnVlICAjIHByZXZlbnQgbXVsdGlwbGUgZmV0Y2ggYXR0ZW1wdHMKICAgICAgICB0bXBsID0gIkRvd25sb2FkIGVycm9yIG9uICVzOiAlJXMgLS0gU29tZSBwYWNrYWdlcyBtYXkgbm90IGJlIGZvdW5kISIKICAgICAgICBmID0gc2VsZi5vcGVuX3VybCh1cmwsIHRtcGwgJSB1cmwpCiAgICAgICAgaWYgZiBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmZldGNoZWRfdXJsc1tmLnVybF0gPSBUcnVlCiAgICAgICAgaWYgJ2h0bWwnIG5vdCBpbiBmLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnLCAnJykubG93ZXIoKToKICAgICAgICAgICAgZi5jbG9zZSgpICAjIG5vdCBodG1sLCB3ZSBjYW4ndCBwcm9jZXNzIGl0CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBiYXNlID0gZi51cmwgICMgaGFuZGxlIHJlZGlyZWN0cwogICAgICAgIHBhZ2UgPSBmLnJlYWQoKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhZ2UsIHN0cik6CiAgICAgICAgICAgICMgSW4gUHl0aG9uIDMgYW5kIGdvdCBieXRlcyBidXQgd2FudCBzdHIuCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZiwgdXJsbGliLmVycm9yLkhUVFBFcnJvcik6CiAgICAgICAgICAgICAgICAjIEVycm9ycyBoYXZlIG5vIGNoYXJzZXQsIGFzc3VtZSBsYXRpbjE6CiAgICAgICAgICAgICAgICBjaGFyc2V0ID0gJ2xhdGluLTEnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjaGFyc2V0ID0gZi5oZWFkZXJzLmdldF9wYXJhbSgnY2hhcnNldCcpIG9yICdsYXRpbi0xJwogICAgICAgICAgICBwYWdlID0gcGFnZS5kZWNvZGUoY2hhcnNldCwgImlnbm9yZSIpCiAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgZm9yIG1hdGNoIGluIEhSRUYuZmluZGl0ZXIocGFnZSk6CiAgICAgICAgICAgIGxpbmsgPSB1cmxsaWIucGFyc2UudXJsam9pbihiYXNlLCBodG1sZGVjb2RlKG1hdGNoLmdyb3VwKDEpKSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3VybChsaW5rKQogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKHNlbGYuaW5kZXhfdXJsKSBhbmQgZ2V0YXR0cihmLCAnY29kZScsIE5vbmUpICE9IDQwNDoKICAgICAgICAgICAgcGFnZSA9IHNlbGYucHJvY2Vzc19pbmRleCh1cmwsIHBhZ2UpCgogICAgZGVmIHByb2Nlc3NfZmlsZW5hbWUoc2VsZiwgZm4sIG5lc3RlZD1GYWxzZSk6CiAgICAgICAgIyBwcm9jZXNzIGZpbGVuYW1lcyBvciBkaXJlY3RvcmllcwogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmbik6CiAgICAgICAgICAgIHNlbGYud2FybigiTm90IGZvdW5kOiAlcyIsIGZuKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmbikgYW5kIG5vdCBuZXN0ZWQ6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKGZuKQogICAgICAgICAgICBmb3IgaXRlbSBpbiBvcy5saXN0ZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2ZpbGVuYW1lKG9zLnBhdGguam9pbihwYXRoLCBpdGVtKSwgVHJ1ZSkKCiAgICAgICAgZGlzdHMgPSBkaXN0cm9zX2Zvcl9maWxlbmFtZShmbikKICAgICAgICBpZiBkaXN0czoKICAgICAgICAgICAgc2VsZi5kZWJ1ZygiRm91bmQ6ICVzIiwgZm4pCiAgICAgICAgICAgIGxpc3QobWFwKHNlbGYuYWRkLCBkaXN0cykpCgogICAgZGVmIHVybF9vayhzZWxmLCB1cmwsIGZhdGFsPUZhbHNlKToKICAgICAgICBzID0gVVJMX1NDSEVNRSh1cmwpCiAgICAgICAgaXNfZmlsZSA9IHMgYW5kIHMuZ3JvdXAoMSkubG93ZXIoKSA9PSAnZmlsZScKICAgICAgICBpZiBpc19maWxlIG9yIHNlbGYuYWxsb3dzKHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpWzFdKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICJcbk5vdGU6IEJ5cGFzc2luZyAlcyAoZGlzYWxsb3dlZCBob3N0OyBzZWUgIgogICAgICAgICAgICAiaHR0cDovL2JpdC5seS8yaHJJbW5ZIGZvciBkZXRhaWxzKS5cbiIpCiAgICAgICAgaWYgZmF0YWw6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZyAlIHVybCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLndhcm4obXNnLCB1cmwpCgogICAgZGVmIHNjYW5fZWdnX2xpbmtzKHNlbGYsIHNlYXJjaF9wYXRoKToKICAgICAgICBkaXJzID0gZmlsdGVyKG9zLnBhdGguaXNkaXIsIHNlYXJjaF9wYXRoKQogICAgICAgIGVnZ19saW5rcyA9ICgKICAgICAgICAgICAgKHBhdGgsIGVudHJ5KQogICAgICAgICAgICBmb3IgcGF0aCBpbiBkaXJzCiAgICAgICAgICAgIGZvciBlbnRyeSBpbiBvcy5saXN0ZGlyKHBhdGgpCiAgICAgICAgICAgIGlmIGVudHJ5LmVuZHN3aXRoKCcuZWdnLWxpbmsnKQogICAgICAgICkKICAgICAgICBsaXN0KGl0ZXJ0b29scy5zdGFybWFwKHNlbGYuc2Nhbl9lZ2dfbGluaywgZWdnX2xpbmtzKSkKCiAgICBkZWYgc2Nhbl9lZ2dfbGluayhzZWxmLCBwYXRoLCBlbnRyeSk6CiAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihwYXRoLCBlbnRyeSkpIGFzIHJhd19saW5lczoKICAgICAgICAgICAgIyBmaWx0ZXIgbm9uLWVtcHR5IGxpbmVzCiAgICAgICAgICAgIGxpbmVzID0gbGlzdChmaWx0ZXIoTm9uZSwgbWFwKHN0ci5zdHJpcCwgcmF3X2xpbmVzKSkpCgogICAgICAgIGlmIGxlbihsaW5lcykgIT0gMjoKICAgICAgICAgICAgIyBmb3JtYXQgaXMgbm90IHJlY29nbml6ZWQ7IHB1bnQKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGVnZ19wYXRoLCBzZXR1cF9wYXRoID0gbGluZXMKCiAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKG9zLnBhdGguam9pbihwYXRoLCBlZ2dfcGF0aCkpOgogICAgICAgICAgICBkaXN0LmxvY2F0aW9uID0gb3MucGF0aC5qb2luKHBhdGgsICpsaW5lcykKICAgICAgICAgICAgZGlzdC5wcmVjZWRlbmNlID0gU09VUkNFX0RJU1QKICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKCiAgICBkZWYgcHJvY2Vzc19pbmRleChzZWxmLCB1cmwsIHBhZ2UpOgogICAgICAgICIiIlByb2Nlc3MgdGhlIGNvbnRlbnRzIG9mIGEgUHlQSSBwYWdlIiIiCgogICAgICAgIGRlZiBzY2FuKGxpbmspOgogICAgICAgICAgICAjIFByb2Nlc3MgYSBVUkwgdG8gc2VlIGlmIGl0J3MgZm9yIGEgcGFja2FnZSBwYWdlCiAgICAgICAgICAgIGlmIGxpbmsuc3RhcnRzd2l0aChzZWxmLmluZGV4X3VybCk6CiAgICAgICAgICAgICAgICBwYXJ0cyA9IGxpc3QobWFwKAogICAgICAgICAgICAgICAgICAgIHVybGxpYi5wYXJzZS51bnF1b3RlLCBsaW5rW2xlbihzZWxmLmluZGV4X3VybCk6XS5zcGxpdCgnLycpCiAgICAgICAgICAgICAgICApKQogICAgICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAyIGFuZCAnIycgbm90IGluIHBhcnRzWzFdOgogICAgICAgICAgICAgICAgICAgICMgaXQncyBhIHBhY2thZ2UgcGFnZSwgc2FuaXRpemUgYW5kIGluZGV4IGl0CiAgICAgICAgICAgICAgICAgICAgcGtnID0gc2FmZV9uYW1lKHBhcnRzWzBdKQogICAgICAgICAgICAgICAgICAgIHZlciA9IHNhZmVfdmVyc2lvbihwYXJ0c1sxXSkKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VfcGFnZXMuc2V0ZGVmYXVsdChwa2cubG93ZXIoKSwge30pW2xpbmtdID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0b19maWxlbmFtZShwa2cpLCB0b19maWxlbmFtZSh2ZXIpCiAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCgogICAgICAgICMgcHJvY2VzcyBhbiBpbmRleCBwYWdlIGludG8gdGhlIHBhY2thZ2UtcGFnZSBpbmRleAogICAgICAgIGZvciBtYXRjaCBpbiBIUkVGLmZpbmRpdGVyKHBhZ2UpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzY2FuKHVybGxpYi5wYXJzZS51cmxqb2luKHVybCwgaHRtbGRlY29kZShtYXRjaC5ncm91cCgxKSkpKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgcGtnLCB2ZXIgPSBzY2FuKHVybCkgICMgZW5zdXJlIHRoaXMgcGFnZSBpcyBpbiB0aGUgcGFnZSBpbmRleAogICAgICAgIGlmIHBrZzoKICAgICAgICAgICAgIyBwcm9jZXNzIGluZGl2aWR1YWwgcGFja2FnZSBwYWdlCiAgICAgICAgICAgIGZvciBuZXdfdXJsIGluIGZpbmRfZXh0ZXJuYWxfbGlua3ModXJsLCBwYWdlKToKICAgICAgICAgICAgICAgICMgUHJvY2VzcyB0aGUgZm91bmQgVVJMCiAgICAgICAgICAgICAgICBiYXNlLCBmcmFnID0gZWdnX2luZm9fZm9yX3VybChuZXdfdXJsKQogICAgICAgICAgICAgICAgaWYgYmFzZS5lbmRzd2l0aCgnLnB5JykgYW5kIG5vdCBmcmFnOgogICAgICAgICAgICAgICAgICAgIGlmIHZlcjoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3VybCArPSAnI2VnZz0lcy0lcycgJSAocGtnLCB2ZXIpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZWVkX3ZlcnNpb25faW5mbyh1cmwpCiAgICAgICAgICAgICAgICBzZWxmLnNjYW5fdXJsKG5ld191cmwpCgogICAgICAgICAgICByZXR1cm4gUFlQSV9NRDUuc3ViKAogICAgICAgICAgICAgICAgbGFtYmRhIG06ICc8YSBocmVmPSIlcyNtZDU9JXMiPiVzPC9hPicgJSBtLmdyb3VwKDEsIDMsIDIpLCBwYWdlCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIiIgICMgbm8gc2Vuc2UgZG91YmxlLXNjYW5uaW5nIG5vbi1wYWNrYWdlIHBhZ2VzCgogICAgZGVmIG5lZWRfdmVyc2lvbl9pbmZvKHNlbGYsIHVybCk6CiAgICAgICAgc2VsZi5zY2FuX2FsbCgKICAgICAgICAgICAgIlBhZ2UgYXQgJXMgbGlua3MgdG8gLnB5IGZpbGUocykgd2l0aG91dCB2ZXJzaW9uIGluZm87IGFuIGluZGV4ICIKICAgICAgICAgICAgInNjYW4gaXMgcmVxdWlyZWQuIiwgdXJsCiAgICAgICAgKQoKICAgIGRlZiBzY2FuX2FsbChzZWxmLCBtc2c9Tm9uZSwgKmFyZ3MpOgogICAgICAgIGlmIHNlbGYuaW5kZXhfdXJsIG5vdCBpbiBzZWxmLmZldGNoZWRfdXJsczoKICAgICAgICAgICAgaWYgbXNnOgogICAgICAgICAgICAgICAgc2VsZi53YXJuKG1zZywgKmFyZ3MpCiAgICAgICAgICAgIHNlbGYuaW5mbygKICAgICAgICAgICAgICAgICJTY2FubmluZyBpbmRleCBvZiBhbGwgcGFja2FnZXMgKHRoaXMgbWF5IHRha2UgYSB3aGlsZSkiCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsKQoKICAgIGRlZiBmaW5kX3BhY2thZ2VzKHNlbGYsIHJlcXVpcmVtZW50KToKICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsICsgcmVxdWlyZW1lbnQudW5zYWZlX25hbWUgKyAnLycpCgogICAgICAgIGlmIG5vdCBzZWxmLnBhY2thZ2VfcGFnZXMuZ2V0KHJlcXVpcmVtZW50LmtleSk6CiAgICAgICAgICAgICMgRmFsbCBiYWNrIHRvIHNhZmUgdmVyc2lvbiBvZiB0aGUgbmFtZQogICAgICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsICsgcmVxdWlyZW1lbnQucHJvamVjdF9uYW1lICsgJy8nKQoKICAgICAgICBpZiBub3Qgc2VsZi5wYWNrYWdlX3BhZ2VzLmdldChyZXF1aXJlbWVudC5rZXkpOgogICAgICAgICAgICAjIFdlIGNvdWxkbid0IGZpbmQgdGhlIHRhcmdldCBwYWNrYWdlLCBzbyBzZWFyY2ggdGhlIGluZGV4IHBhZ2UgdG9vCiAgICAgICAgICAgIHNlbGYubm90X2ZvdW5kX2luX2luZGV4KHJlcXVpcmVtZW50KQoKICAgICAgICBmb3IgdXJsIGluIGxpc3Qoc2VsZi5wYWNrYWdlX3BhZ2VzLmdldChyZXF1aXJlbWVudC5rZXksICgpKSk6CiAgICAgICAgICAgICMgc2NhbiBlYWNoIHBhZ2UgdGhhdCBtaWdodCBiZSByZWxhdGVkIHRvIHRoZSBkZXNpcmVkIHBhY2thZ2UKICAgICAgICAgICAgc2VsZi5zY2FuX3VybCh1cmwpCgogICAgZGVmIG9idGFpbihzZWxmLCByZXF1aXJlbWVudCwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgIHNlbGYucHJlc2NhbigpCiAgICAgICAgc2VsZi5maW5kX3BhY2thZ2VzKHJlcXVpcmVtZW50KQogICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxdWlyZW1lbnQua2V5XToKICAgICAgICAgICAgaWYgZGlzdCBpbiByZXF1aXJlbWVudDoKICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgICAgIHNlbGYuZGVidWcoIiVzIGRvZXMgbm90IG1hdGNoICVzIiwgcmVxdWlyZW1lbnQsIGRpc3QpCiAgICAgICAgcmV0dXJuIHN1cGVyKFBhY2thZ2VJbmRleCwgc2VsZikub2J0YWluKHJlcXVpcmVtZW50LCBpbnN0YWxsZXIpCgogICAgZGVmIGNoZWNrX2hhc2goc2VsZiwgY2hlY2tlciwgZmlsZW5hbWUsIHRmcCk6CiAgICAgICAgIiIiCiAgICAgICAgY2hlY2tlciBpcyBhIENvbnRlbnRDaGVja2VyCiAgICAgICAgIiIiCiAgICAgICAgY2hlY2tlci5yZXBvcnQoCiAgICAgICAgICAgIHNlbGYuZGVidWcsCiAgICAgICAgICAgICJWYWxpZGF0aW5nICUlcyBjaGVja3N1bSBmb3IgJXMiICUgZmlsZW5hbWUpCiAgICAgICAgaWYgbm90IGNoZWNrZXIuaXNfdmFsaWQoKToKICAgICAgICAgICAgdGZwLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICIlcyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgJXM7ICIKICAgICAgICAgICAgICAgICJwb3NzaWJsZSBkb3dubG9hZCBwcm9ibGVtPyIKICAgICAgICAgICAgICAgICUgKGNoZWNrZXIuaGFzaC5uYW1lLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKICAgICAgICAgICAgKQoKICAgIGRlZiBhZGRfZmluZF9saW5rcyhzZWxmLCB1cmxzKToKICAgICAgICAiIiJBZGQgYHVybHNgIHRvIHRoZSBsaXN0IHRoYXQgd2lsbCBiZSBwcmVzY2FubmVkIGZvciBzZWFyY2hlcyIiIgogICAgICAgIGZvciB1cmwgaW4gdXJsczoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgc2VsZi50b19zY2FuIGlzIE5vbmUgICMgaWYgd2UgaGF2ZSBhbHJlYWR5ICJnb25lIG9ubGluZSIKICAgICAgICAgICAgICAgIG9yIG5vdCBVUkxfU0NIRU1FKHVybCkgICMgb3IgaXQncyBhIGxvY2FsIGZpbGUvZGlyZWN0b3J5CiAgICAgICAgICAgICAgICBvciB1cmwuc3RhcnRzd2l0aCgnZmlsZTonKQogICAgICAgICAgICAgICAgb3IgbGlzdChkaXN0cm9zX2Zvcl91cmwodXJsKSkgICMgb3IgYSBkaXJlY3QgcGFja2FnZSBsaW5rCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAjIHRoZW4gZ28gYWhlYWQgYW5kIHByb2Nlc3MgaXQgbm93CiAgICAgICAgICAgICAgICBzZWxmLnNjYW5fdXJsKHVybCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlLCBkZWZlciByZXRyaWV2YWwgdGlsbCBsYXRlcgogICAgICAgICAgICAgICAgc2VsZi50b19zY2FuLmFwcGVuZCh1cmwpCgogICAgZGVmIHByZXNjYW4oc2VsZik6CiAgICAgICAgIiIiU2NhbiB1cmxzIHNjaGVkdWxlZCBmb3IgcHJlc2Nhbm5pbmcgKGUuZy4gLS1maW5kLWxpbmtzKSIiIgogICAgICAgIGlmIHNlbGYudG9fc2NhbjoKICAgICAgICAgICAgbGlzdChtYXAoc2VsZi5zY2FuX3VybCwgc2VsZi50b19zY2FuKSkKICAgICAgICBzZWxmLnRvX3NjYW4gPSBOb25lICAjIGZyb20gbm93IG9uLCBnbyBhaGVhZCBhbmQgcHJvY2VzcyBpbW1lZGlhdGVseQoKICAgIGRlZiBub3RfZm91bmRfaW5faW5kZXgoc2VsZiwgcmVxdWlyZW1lbnQpOgogICAgICAgIGlmIHNlbGZbcmVxdWlyZW1lbnQua2V5XTogICMgd2UndmUgc2VlbiBhdCBsZWFzdCBvbmUgZGlzdHJvCiAgICAgICAgICAgIG1ldGgsIG1zZyA9IHNlbGYuaW5mbywgIkNvdWxkbid0IHJldHJpZXZlIGluZGV4IHBhZ2UgZm9yICVyIgogICAgICAgIGVsc2U6ICAjIG5vIGRpc3Ryb3Mgc2VlbiBmb3IgdGhpcyBuYW1lLCBtaWdodCBiZSBtaXNzcGVsbGVkCiAgICAgICAgICAgIG1ldGgsIG1zZyA9ICgKICAgICAgICAgICAgICAgIHNlbGYud2FybiwKICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGluZGV4IHBhZ2UgZm9yICVyIChtYXliZSBtaXNzcGVsbGVkPykiKQogICAgICAgIG1ldGgobXNnLCByZXF1aXJlbWVudC51bnNhZmVfbmFtZSkKICAgICAgICBzZWxmLnNjYW5fYWxsKCkKCiAgICBkZWYgZG93bmxvYWQoc2VsZiwgc3BlYywgdG1wZGlyKToKICAgICAgICAiIiJMb2NhdGUgYW5kL29yIGRvd25sb2FkIGBzcGVjYCB0byBgdG1wZGlyYCwgcmV0dXJuaW5nIGEgbG9jYWwgcGF0aAoKICAgICAgICBgc3BlY2AgbWF5IGJlIGEgYGBSZXF1aXJlbWVudGBgIG9iamVjdCwgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhIFVSTCwKICAgICAgICBhbiBleGlzdGluZyBsb2NhbCBmaWxlbmFtZSwgb3IgYSBwcm9qZWN0L3ZlcnNpb24gcmVxdWlyZW1lbnQgc3BlYwogICAgICAgIChpLmUuIHRoZSBzdHJpbmcgZm9ybSBvZiBhIGBgUmVxdWlyZW1lbnRgYCBvYmplY3QpLiAgSWYgaXQgaXMgdGhlIFVSTAogICAgICAgIG9mIGEgLnB5IGZpbGUgd2l0aCBhbiB1bmFtYmlndW91cyBgYCNlZ2c9bmFtZS12ZXJzaW9uYGAgdGFnIChpLmUuLCBvbmUKICAgICAgICB0aGF0IGVzY2FwZXMgYGAtYGAgYXMgYGBfYGAgdGhyb3VnaG91dCksIGEgdHJpdmlhbCBgYHNldHVwLnB5YGAgaXMKICAgICAgICBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYWxvbmdzaWRlIHRoZSBkb3dubG9hZGVkIGZpbGUuCgogICAgICAgIElmIGBzcGVjYCBpcyBhIGBgUmVxdWlyZW1lbnRgYCBvYmplY3Qgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhCiAgICAgICAgcHJvamVjdC92ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWMsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGxvY2F0aW9uIG9mCiAgICAgICAgYSBtYXRjaGluZyBkaXN0cmlidXRpb24gKHBvc3NpYmx5IGFmdGVyIGRvd25sb2FkaW5nIGl0IHRvIGB0bXBkaXJgKS4KICAgICAgICBJZiBgc3BlY2AgaXMgYSBsb2NhbGx5IGV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5IG5hbWUsIGl0IGlzIHNpbXBseQogICAgICAgIHJldHVybmVkIHVuY2hhbmdlZC4gIElmIGBzcGVjYCBpcyBhIFVSTCwgaXQgaXMgZG93bmxvYWRlZCB0byBhIHN1YnBhdGgKICAgICAgICBvZiBgdG1wZGlyYCwgYW5kIHRoZSBsb2NhbCBmaWxlbmFtZSBpcyByZXR1cm5lZC4gIFZhcmlvdXMgZXJyb3JzIG1heSBiZQogICAgICAgIHJhaXNlZCBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBkb3dubG9hZGluZy4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzcGVjLCBSZXF1aXJlbWVudCk6CiAgICAgICAgICAgIHNjaGVtZSA9IFVSTF9TQ0hFTUUoc3BlYykKICAgICAgICAgICAgaWYgc2NoZW1lOgogICAgICAgICAgICAgICAgIyBJdCdzIGEgdXJsLCBkb3dubG9hZCBpdCB0byB0bXBkaXIKICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5fZG93bmxvYWRfdXJsKHNjaGVtZS5ncm91cCgxKSwgc3BlYywgdG1wZGlyKQogICAgICAgICAgICAgICAgYmFzZSwgZnJhZ21lbnQgPSBlZ2dfaW5mb19mb3JfdXJsKHNwZWMpCiAgICAgICAgICAgICAgICBpZiBiYXNlLmVuZHN3aXRoKCcucHknKToKICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZ2VuX3NldHVwKGZvdW5kLCBmcmFnbWVudCwgdG1wZGlyKQogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc3BlYyk6CiAgICAgICAgICAgICAgICAjIEV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5LCBqdXN0IHJldHVybiBpdAogICAgICAgICAgICAgICAgcmV0dXJuIHNwZWMKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNwZWMgPSBwYXJzZV9yZXF1aXJlbWVudF9hcmcoc3BlYykKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLmZldGNoX2Rpc3RyaWJ1dGlvbihzcGVjLCB0bXBkaXIpLCAnbG9jYXRpb24nLCBOb25lKQoKICAgIGRlZiBmZXRjaF9kaXN0cmlidXRpb24oCiAgICAgICAgICAgIHNlbGYsIHJlcXVpcmVtZW50LCB0bXBkaXIsIGZvcmNlX3NjYW49RmFsc2UsIHNvdXJjZT1GYWxzZSwKICAgICAgICAgICAgZGV2ZWxvcF9vaz1GYWxzZSwgbG9jYWxfaW5kZXg9Tm9uZSk6CiAgICAgICAgIiIiT2J0YWluIGEgZGlzdHJpYnV0aW9uIHN1aXRhYmxlIGZvciBmdWxmaWxsaW5nIGByZXF1aXJlbWVudGAKCiAgICAgICAgYHJlcXVpcmVtZW50YCBtdXN0IGJlIGEgYGBwa2dfcmVzb3VyY2VzLlJlcXVpcmVtZW50YGAgaW5zdGFuY2UuCiAgICAgICAgSWYgbmVjZXNzYXJ5LCBvciBpZiB0aGUgYGZvcmNlX3NjYW5gIGZsYWcgaXMgc2V0LCB0aGUgcmVxdWlyZW1lbnQgaXMKICAgICAgICBzZWFyY2hlZCBmb3IgaW4gdGhlIChvbmxpbmUpIHBhY2thZ2UgaW5kZXggYXMgd2VsbCBhcyB0aGUgbG9jYWxseQogICAgICAgIGluc3RhbGxlZCBwYWNrYWdlcy4gIElmIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIGByZXF1aXJlbWVudGAgaXMgZm91bmQsCiAgICAgICAgdGhlIHJldHVybmVkIGRpc3RyaWJ1dGlvbidzIGBgbG9jYXRpb25gYCBpcyB0aGUgdmFsdWUgeW91IHdvdWxkIGhhdmUKICAgICAgICBnb3R0ZW4gZnJvbSBjYWxsaW5nIHRoZSBgYGRvd25sb2FkKClgYCBtZXRob2Qgd2l0aCB0aGUgbWF0Y2hpbmcKICAgICAgICBkaXN0cmlidXRpb24ncyBVUkwgb3IgZmlsZW5hbWUuICBJZiBubyBtYXRjaGluZyBkaXN0cmlidXRpb24gaXMgZm91bmQsCiAgICAgICAgYGBOb25lYGAgaXMgcmV0dXJuZWQuCgogICAgICAgIElmIHRoZSBgc291cmNlYCBmbGFnIGlzIHNldCwgb25seSBzb3VyY2UgZGlzdHJpYnV0aW9ucyBhbmQgc291cmNlCiAgICAgICAgY2hlY2tvdXQgbGlua3Mgd2lsbCBiZSBjb25zaWRlcmVkLiAgVW5sZXNzIHRoZSBgZGV2ZWxvcF9va2AgZmxhZyBpcwogICAgICAgIHNldCwgZGV2ZWxvcG1lbnQgYW5kIHN5c3RlbSBlZ2dzIChpLmUuLCB0aG9zZSB1c2luZyB0aGUgYGAuZWdnLWluZm9gYAogICAgICAgIGZvcm1hdCkgd2lsbCBiZSBpZ25vcmVkLgogICAgICAgICIiIgogICAgICAgICMgcHJvY2VzcyBhIFJlcXVpcmVtZW50CiAgICAgICAgc2VsZi5pbmZvKCJTZWFyY2hpbmcgZm9yICVzIiwgcmVxdWlyZW1lbnQpCiAgICAgICAgc2tpcHBlZCA9IHt9CiAgICAgICAgZGlzdCA9IE5vbmUKCiAgICAgICAgZGVmIGZpbmQocmVxLCBlbnY9Tm9uZSk6CiAgICAgICAgICAgIGlmIGVudiBpcyBOb25lOgogICAgICAgICAgICAgICAgZW52ID0gc2VsZgogICAgICAgICAgICAjIEZpbmQgYSBtYXRjaGluZyBkaXN0cmlidXRpb247IG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UKCiAgICAgICAgICAgIGZvciBkaXN0IGluIGVudltyZXEua2V5XToKCiAgICAgICAgICAgICAgICBpZiBkaXN0LnByZWNlZGVuY2UgPT0gREVWRUxPUF9ESVNUIGFuZCBub3QgZGV2ZWxvcF9vazoKICAgICAgICAgICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiBza2lwcGVkOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgZGV2ZWxvcG1lbnQgb3Igc3lzdGVtIGVnZzogJXMiLCBkaXN0LAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWRbZGlzdF0gPSAxCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICB0ZXN0ID0gKAogICAgICAgICAgICAgICAgICAgIGRpc3QgaW4gcmVxCiAgICAgICAgICAgICAgICAgICAgYW5kIChkaXN0LnByZWNlZGVuY2UgPD0gU09VUkNFX0RJU1Qgb3Igbm90IHNvdXJjZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIHRlc3Q6CiAgICAgICAgICAgICAgICAgICAgbG9jID0gc2VsZi5kb3dubG9hZChkaXN0LmxvY2F0aW9uLCB0bXBkaXIpCiAgICAgICAgICAgICAgICAgICAgZGlzdC5kb3dubG9hZF9sb2NhdGlvbiA9IGxvYwogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpc3QuZG93bmxvYWRfbG9jYXRpb24pOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAoKICAgICAgICBpZiBmb3JjZV9zY2FuOgogICAgICAgICAgICBzZWxmLnByZXNjYW4oKQogICAgICAgICAgICBzZWxmLmZpbmRfcGFja2FnZXMocmVxdWlyZW1lbnQpCiAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50KQoKICAgICAgICBpZiBub3QgZGlzdCBhbmQgbG9jYWxfaW5kZXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50LCBsb2NhbF9pbmRleCkKCiAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICBpZiBzZWxmLnRvX3NjYW4gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLnByZXNjYW4oKQogICAgICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCkKCiAgICAgICAgaWYgZGlzdCBpcyBOb25lIGFuZCBub3QgZm9yY2Vfc2NhbjoKICAgICAgICAgICAgc2VsZi5maW5kX3BhY2thZ2VzKHJlcXVpcmVtZW50KQogICAgICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCkKCiAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLndhcm4oCiAgICAgICAgICAgICAgICAiTm8gbG9jYWwgcGFja2FnZXMgb3Igd29ya2luZyBkb3dubG9hZCBsaW5rcyBmb3VuZCBmb3IgJXMlcyIsCiAgICAgICAgICAgICAgICAoc291cmNlIGFuZCAiYSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9mICIgb3IgIiIpLAogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQsCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmluZm8oIkJlc3QgbWF0Y2g6ICVzIiwgZGlzdCkKICAgICAgICAgICAgcmV0dXJuIGRpc3QuY2xvbmUobG9jYXRpb249ZGlzdC5kb3dubG9hZF9sb2NhdGlvbikKCiAgICBkZWYgZmV0Y2goc2VsZiwgcmVxdWlyZW1lbnQsIHRtcGRpciwgZm9yY2Vfc2Nhbj1GYWxzZSwgc291cmNlPUZhbHNlKToKICAgICAgICAiIiJPYnRhaW4gYSBmaWxlIHN1aXRhYmxlIGZvciBmdWxmaWxsaW5nIGByZXF1aXJlbWVudGAKCiAgICAgICAgREVQUkVDQVRFRDsgdXNlIHRoZSBgYGZldGNoX2Rpc3RyaWJ1dGlvbigpYGAgbWV0aG9kIG5vdyBpbnN0ZWFkLiAgRm9yCiAgICAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhpcyByb3V0aW5lIGlzIGlkZW50aWNhbCBidXQgcmV0dXJucyB0aGUKICAgICAgICBgYGxvY2F0aW9uYGAgb2YgdGhlIGRvd25sb2FkZWQgZGlzdHJpYnV0aW9uIGluc3RlYWQgb2YgYSBkaXN0cmlidXRpb24KICAgICAgICBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgZGlzdCA9IHNlbGYuZmV0Y2hfZGlzdHJpYnV0aW9uKHJlcXVpcmVtZW50LCB0bXBkaXIsIGZvcmNlX3NjYW4sIHNvdXJjZSkKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZGlzdC5sb2NhdGlvbgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGdlbl9zZXR1cChzZWxmLCBmaWxlbmFtZSwgZnJhZ21lbnQsIHRtcGRpcik6CiAgICAgICAgbWF0Y2ggPSBFR0dfRlJBR01FTlQubWF0Y2goZnJhZ21lbnQpCiAgICAgICAgZGlzdHMgPSBtYXRjaCBhbmQgWwogICAgICAgICAgICBkIGZvciBkIGluCiAgICAgICAgICAgIGludGVycHJldF9kaXN0cm9fbmFtZShmaWxlbmFtZSwgbWF0Y2guZ3JvdXAoMSksIE5vbmUpIGlmIGQudmVyc2lvbgogICAgICAgIF0gb3IgW10KCiAgICAgICAgaWYgbGVuKGRpc3RzKSA9PSAxOiAgIyB1bmFtYmlndW91cyBgYCNlZ2dgYCBmcmFnbWVudAogICAgICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCgogICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZmlsZSBoYXMgYmVlbiBkb3dubG9hZGVkIHRvIHRoZSB0ZW1wIGRpci4KICAgICAgICAgICAgaWYgb3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKSAhPSB0bXBkaXI6CiAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBiYXNlbmFtZSkKICAgICAgICAgICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgc2FtZWZpbGUKICAgICAgICAgICAgICAgIGlmIG5vdCBzYW1lZmlsZShmaWxlbmFtZSwgZHN0KToKICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weTIoZmlsZW5hbWUsIGRzdCkKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGRzdAoKICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbih0bXBkaXIsICdzZXR1cC5weScpLCAndycpIGFzIGZpbGU6CiAgICAgICAgICAgICAgICBmaWxlLndyaXRlKAogICAgICAgICAgICAgICAgICAgICJmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwXG4iCiAgICAgICAgICAgICAgICAgICAgInNldHVwKG5hbWU9JXIsIHZlcnNpb249JXIsIHB5X21vZHVsZXM9WyVyXSlcbiIKICAgICAgICAgICAgICAgICAgICAlICgKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHNbMF0ucHJvamVjdF9uYW1lLCBkaXN0c1swXS52ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKVswXQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgICAgIGVsaWYgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IHVuYW1iaWd1b3VzbHkgaW50ZXJwcmV0IHByb2plY3QvdmVyc2lvbiBpZGVudGlmaWVyICVyOyAiCiAgICAgICAgICAgICAgICAiYW55IGRhc2hlcyBpbiB0aGUgbmFtZSBvciB2ZXJzaW9uIHNob3VsZCBiZSBlc2NhcGVkIHVzaW5nICIKICAgICAgICAgICAgICAgICJ1bmRlcnNjb3Jlcy4gJXIiICUgKGZyYWdtZW50LCBkaXN0cykKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IHByb2Nlc3MgcGxhaW4gLnB5IGZpbGVzIHdpdGhvdXQgYW4gJyNlZ2c9bmFtZS12ZXJzaW9uJyIKICAgICAgICAgICAgICAgICIgc3VmZml4IHRvIGVuYWJsZSBhdXRvbWF0aWMgc2V0dXAgc2NyaXB0IGdlbmVyYXRpb24uIgogICAgICAgICAgICApCgogICAgZGxfYmxvY2tzaXplID0gODE5MgoKICAgIGRlZiBfZG93bmxvYWRfdG8oc2VsZiwgdXJsLCBmaWxlbmFtZSk6CiAgICAgICAgc2VsZi5pbmZvKCJEb3dubG9hZGluZyAlcyIsIHVybCkKICAgICAgICAjIERvd25sb2FkIHRoZSBmaWxlCiAgICAgICAgZnAgPSBOb25lCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjaGVja2VyID0gSGFzaENoZWNrZXIuZnJvbV91cmwodXJsKQogICAgICAgICAgICBmcCA9IHNlbGYub3Blbl91cmwodXJsKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZwLCB1cmxsaWIuZXJyb3IuSFRUUEVycm9yKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICJDYW4ndCBkb3dubG9hZCAlczogJXMgJXMiICUgKHVybCwgZnAuY29kZSwgZnAubXNnKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBoZWFkZXJzID0gZnAuaW5mbygpCiAgICAgICAgICAgIGJsb2NrbnVtID0gMAogICAgICAgICAgICBicyA9IHNlbGYuZGxfYmxvY2tzaXplCiAgICAgICAgICAgIHNpemUgPSAtMQogICAgICAgICAgICBpZiAiY29udGVudC1sZW5ndGgiIGluIGhlYWRlcnM6CiAgICAgICAgICAgICAgICAjIFNvbWUgc2VydmVycyByZXR1cm4gbXVsdGlwbGUgQ29udGVudC1MZW5ndGggaGVhZGVycyA6KAogICAgICAgICAgICAgICAgc2l6ZXMgPSBnZXRfYWxsX2hlYWRlcnMoaGVhZGVycywgJ0NvbnRlbnQtTGVuZ3RoJykKICAgICAgICAgICAgICAgIHNpemUgPSBtYXgobWFwKGludCwgc2l6ZXMpKQogICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRob29rKHVybCwgZmlsZW5hbWUsIGJsb2NrbnVtLCBicywgc2l6ZSkKICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAnd2InKSBhcyB0ZnA6CiAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgIGJsb2NrID0gZnAucmVhZChicykKICAgICAgICAgICAgICAgICAgICBpZiBibG9jazoKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlci5mZWVkKGJsb2NrKQogICAgICAgICAgICAgICAgICAgICAgICB0ZnAud3JpdGUoYmxvY2spCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrbnVtICs9IDEKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRob29rKHVybCwgZmlsZW5hbWUsIGJsb2NrbnVtLCBicywgc2l6ZSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgc2VsZi5jaGVja19oYXNoKGNoZWNrZXIsIGZpbGVuYW1lLCB0ZnApCiAgICAgICAgICAgIHJldHVybiBoZWFkZXJzCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgZnA6CiAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCgogICAgZGVmIHJlcG9ydGhvb2soc2VsZiwgdXJsLCBmaWxlbmFtZSwgYmxvY2tudW0sIGJsa3NpemUsIHNpemUpOgogICAgICAgIHBhc3MgICMgbm8tb3AKCiAgICBkZWYgb3Blbl91cmwoc2VsZiwgdXJsLCB3YXJuaW5nPU5vbmUpOgogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKCdmaWxlOicpOgogICAgICAgICAgICByZXR1cm4gbG9jYWxfb3Blbih1cmwpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gb3Blbl93aXRoX2F1dGgodXJsLCBzZWxmLm9wZW5lcikKICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIGh0dHBfY2xpZW50LkludmFsaWRVUkwpIGFzIHY6CiAgICAgICAgICAgIG1zZyA9ICcgJy5qb2luKFtzdHIoYXJnKSBmb3IgYXJnIGluIHYuYXJnc10pCiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgbXNnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoJyVzICVzJyAlICh1cmwsIG1zZykpCiAgICAgICAgZXhjZXB0IHVybGxpYi5lcnJvci5IVFRQRXJyb3IgYXMgdjoKICAgICAgICAgICAgcmV0dXJuIHYKICAgICAgICBleGNlcHQgdXJsbGliLmVycm9yLlVSTEVycm9yIGFzIHY6CiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgdi5yZWFzb24pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigiRG93bmxvYWQgZXJyb3IgZm9yICVzOiAlcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHVybCwgdi5yZWFzb24pKQogICAgICAgIGV4Y2VwdCBodHRwX2NsaWVudC5CYWRTdGF0dXNMaW5lIGFzIHY6CiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgdi5saW5lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJyVzIHJldHVybmVkIGEgYmFkIHN0YXR1cyBsaW5lLiBUaGUgc2VydmVyIG1pZ2h0IGJlICcKICAgICAgICAgICAgICAgICAgICAnZG93biwgJXMnICUKICAgICAgICAgICAgICAgICAgICAodXJsLCB2LmxpbmUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IChodHRwX2NsaWVudC5IVFRQRXhjZXB0aW9uLCBzb2NrZXQuZXJyb3IpIGFzIHY6CiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgdikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJEb3dubG9hZCBlcnJvciBmb3IgJXM6ICVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodXJsLCB2KSkKCiAgICBkZWYgX2Rvd25sb2FkX3VybChzZWxmLCBzY2hlbWUsIHVybCwgdG1wZGlyKToKICAgICAgICAjIERldGVybWluZSBkb3dubG9hZCBmaWxlbmFtZQogICAgICAgICMKICAgICAgICBuYW1lLCBmcmFnbWVudCA9IGVnZ19pbmZvX2Zvcl91cmwodXJsKQogICAgICAgIGlmIG5hbWU6CiAgICAgICAgICAgIHdoaWxlICcuLicgaW4gbmFtZToKICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy4uJywgJy4nKS5yZXBsYWNlKCdcXCcsICdfJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBuYW1lID0gIl9fZG93bmxvYWRlZF9fIiAgIyBkZWZhdWx0IGlmIFVSTCBoYXMgbm8gcGF0aCBjb250ZW50cwoKICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcuZWdnLnppcCcpOgogICAgICAgICAgICBuYW1lID0gbmFtZVs6LTRdICAjIHN0cmlwIHRoZSBleHRyYSAuemlwIGJlZm9yZSBkb3dubG9hZAoKICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIsIG5hbWUpCgogICAgICAgICMgRG93bmxvYWQgdGhlIGZpbGUKICAgICAgICAjCiAgICAgICAgaWYgc2NoZW1lID09ICdzdm4nIG9yIHNjaGVtZS5zdGFydHN3aXRoKCdzdm4rJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9zdm4odXJsLCBmaWxlbmFtZSkKICAgICAgICBlbGlmIHNjaGVtZSA9PSAnZ2l0JyBvciBzY2hlbWUuc3RhcnRzd2l0aCgnZ2l0KycpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfZ2l0KHVybCwgZmlsZW5hbWUpCiAgICAgICAgZWxpZiBzY2hlbWUuc3RhcnRzd2l0aCgnaGcrJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9oZyh1cmwsIGZpbGVuYW1lKQogICAgICAgIGVsaWYgc2NoZW1lID09ICdmaWxlJzoKICAgICAgICAgICAgcmV0dXJuIHVybGxpYi5yZXF1ZXN0LnVybDJwYXRobmFtZSh1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKVsyXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnVybF9vayh1cmwsIFRydWUpICAjIHJhaXNlcyBlcnJvciBpZiBub3QgYWxsb3dlZAogICAgICAgICAgICByZXR1cm4gc2VsZi5fYXR0ZW1wdF9kb3dubG9hZCh1cmwsIGZpbGVuYW1lKQoKICAgIGRlZiBzY2FuX3VybChzZWxmLCB1cmwpOgogICAgICAgIHNlbGYucHJvY2Vzc191cmwodXJsLCBUcnVlKQoKICAgIGRlZiBfYXR0ZW1wdF9kb3dubG9hZChzZWxmLCB1cmwsIGZpbGVuYW1lKToKICAgICAgICBoZWFkZXJzID0gc2VsZi5fZG93bmxvYWRfdG8odXJsLCBmaWxlbmFtZSkKICAgICAgICBpZiAnaHRtbCcgaW4gaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScsICcnKS5sb3dlcigpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfaHRtbCh1cmwsIGhlYWRlcnMsIGZpbGVuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBfZG93bmxvYWRfaHRtbChzZWxmLCB1cmwsIGhlYWRlcnMsIGZpbGVuYW1lKToKICAgICAgICBmaWxlID0gb3BlbihmaWxlbmFtZSkKICAgICAgICBmb3IgbGluZSBpbiBmaWxlOgogICAgICAgICAgICBpZiBsaW5lLnN0cmlwKCk6CiAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBhIHN1YnZlcnNpb24gaW5kZXggcGFnZQogICAgICAgICAgICAgICAgaWYgcmUuc2VhcmNoKHInPHRpdGxlPihbXi0gXSsgLSApP1JldmlzaW9uIFxkKzonLCBsaW5lKToKICAgICAgICAgICAgICAgICAgICAjIGl0J3MgYSBzdWJ2ZXJzaW9uIGluZGV4IHBhZ2U6CiAgICAgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9zdm4odXJsLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIGJyZWFrICAjIG5vdCBhbiBpbmRleCBwYWdlCiAgICAgICAgZmlsZS5jbG9zZSgpCiAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJVbmV4cGVjdGVkIEhUTUwgcGFnZSBmb3VuZCBhdCAiICsgdXJsKQoKICAgIGRlZiBfZG93bmxvYWRfc3ZuKHNlbGYsIHVybCwgZmlsZW5hbWUpOgogICAgICAgIHVybCA9IHVybC5zcGxpdCgnIycsIDEpWzBdICAjIHJlbW92ZSBhbnkgZnJhZ21lbnQgZm9yIHN2bidzIHNha2UKICAgICAgICBjcmVkcyA9ICcnCiAgICAgICAgaWYgdXJsLmxvd2VyKCkuc3RhcnRzd2l0aCgnc3ZuOicpIGFuZCAnQCcgaW4gdXJsOgogICAgICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcCwgcSwgZiA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpCiAgICAgICAgICAgIGlmIG5vdCBuZXRsb2MgYW5kIHBhdGguc3RhcnRzd2l0aCgnLy8nKSBhbmQgJy8nIGluIHBhdGhbMjpdOgogICAgICAgICAgICAgICAgbmV0bG9jLCBwYXRoID0gcGF0aFsyOl0uc3BsaXQoJy8nLCAxKQogICAgICAgICAgICAgICAgYXV0aCwgaG9zdCA9IHNwbGl0dXNlcihuZXRsb2MpCiAgICAgICAgICAgICAgICBpZiBhdXRoOgogICAgICAgICAgICAgICAgICAgIGlmICc6JyBpbiBhdXRoOgogICAgICAgICAgICAgICAgICAgICAgICB1c2VyLCBwdyA9IGF1dGguc3BsaXQoJzonLCAxKQogICAgICAgICAgICAgICAgICAgICAgICBjcmVkcyA9ICIgLS11c2VybmFtZT0lcyAtLXBhc3N3b3JkPSVzIiAlICh1c2VyLCBwdykKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjcmVkcyA9ICIgLS11c2VybmFtZT0iICsgYXV0aAogICAgICAgICAgICAgICAgICAgIG5ldGxvYyA9IGhvc3QKICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IHNjaGVtZSwgbmV0bG9jLCB1cmwsIHAsIHEsIGYKICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmxsaWIucGFyc2UudXJsdW5wYXJzZShwYXJ0cykKICAgICAgICBzZWxmLmluZm8oIkRvaW5nIHN1YnZlcnNpb24gY2hlY2tvdXQgZnJvbSAlcyB0byAlcyIsIHVybCwgZmlsZW5hbWUpCiAgICAgICAgb3Muc3lzdGVtKCJzdm4gY2hlY2tvdXQlcyAtcSAlcyAlcyIgJSAoY3JlZHMsIHVybCwgZmlsZW5hbWUpKQogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfdmNzX3NwbGl0X3Jldl9mcm9tX3VybCh1cmwsIHBvcF9wcmVmaXg9RmFsc2UpOgogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZyA9IHVybGxpYi5wYXJzZS51cmxzcGxpdCh1cmwpCgogICAgICAgIHNjaGVtZSA9IHNjaGVtZS5zcGxpdCgnKycsIDEpWy0xXQoKICAgICAgICAjIFNvbWUgZnJhZ21lbnQgaWRlbnRpZmljYXRpb24gZmFpbHMKICAgICAgICBwYXRoID0gcGF0aC5zcGxpdCgnIycsIDEpWzBdCgogICAgICAgIHJldiA9IE5vbmUKICAgICAgICBpZiAnQCcgaW4gcGF0aDoKICAgICAgICAgICAgcGF0aCwgcmV2ID0gcGF0aC5yc3BsaXQoJ0AnLCAxKQoKICAgICAgICAjIEFsc28sIGRpc2NhcmQgZnJhZ21lbnQKICAgICAgICB1cmwgPSB1cmxsaWIucGFyc2UudXJsdW5zcGxpdCgoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCAnJykpCgogICAgICAgIHJldHVybiB1cmwsIHJldgoKICAgIGRlZiBfZG93bmxvYWRfZ2l0KHNlbGYsIHVybCwgZmlsZW5hbWUpOgogICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3BsaXQoJyMnLCAxKVswXQogICAgICAgIHVybCwgcmV2ID0gc2VsZi5fdmNzX3NwbGl0X3Jldl9mcm9tX3VybCh1cmwsIHBvcF9wcmVmaXg9VHJ1ZSkKCiAgICAgICAgc2VsZi5pbmZvKCJEb2luZyBnaXQgY2xvbmUgZnJvbSAlcyB0byAlcyIsIHVybCwgZmlsZW5hbWUpCiAgICAgICAgb3Muc3lzdGVtKCJnaXQgY2xvbmUgLS1xdWlldCAlcyAlcyIgJSAodXJsLCBmaWxlbmFtZSkpCgogICAgICAgIGlmIHJldiBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5pbmZvKCJDaGVja2luZyBvdXQgJXMiLCByZXYpCiAgICAgICAgICAgIG9zLnN5c3RlbSgiKGNkICVzICYmIGdpdCBjaGVja291dCAtLXF1aWV0ICVzKSIgJSAoCiAgICAgICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgICAgIHJldiwKICAgICAgICAgICAgKSkKCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIF9kb3dubG9hZF9oZyhzZWxmLCB1cmwsIGZpbGVuYW1lKToKICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnNwbGl0KCcjJywgMSlbMF0KICAgICAgICB1cmwsIHJldiA9IHNlbGYuX3Zjc19zcGxpdF9yZXZfZnJvbV91cmwodXJsLCBwb3BfcHJlZml4PVRydWUpCgogICAgICAgIHNlbGYuaW5mbygiRG9pbmcgaGcgY2xvbmUgZnJvbSAlcyB0byAlcyIsIHVybCwgZmlsZW5hbWUpCiAgICAgICAgb3Muc3lzdGVtKCJoZyBjbG9uZSAtLXF1aWV0ICVzICVzIiAlICh1cmwsIGZpbGVuYW1lKSkKCiAgICAgICAgaWYgcmV2IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmluZm8oIlVwZGF0aW5nIHRvICVzIiwgcmV2KQogICAgICAgICAgICBvcy5zeXN0ZW0oIihjZCAlcyAmJiBoZyB1cCAtQyAtciAlcyAtcSkiICUgKAogICAgICAgICAgICAgICAgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICByZXYsCiAgICAgICAgICAgICkpCgogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBkZWJ1ZyhzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cuZGVidWcobXNnLCAqYXJncykKCiAgICBkZWYgaW5mbyhzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cuaW5mbyhtc2csICphcmdzKQoKICAgIGRlZiB3YXJuKHNlbGYsIG1zZywgKmFyZ3MpOgogICAgICAgIGxvZy53YXJuKG1zZywgKmFyZ3MpCgoKIyBUaGlzIHBhdHRlcm4gbWF0Y2hlcyBhIGNoYXJhY3RlciBlbnRpdHkgcmVmZXJlbmNlIChhIGRlY2ltYWwgbnVtZXJpYwojIHJlZmVyZW5jZXMsIGEgaGV4YWRlY2ltYWwgbnVtZXJpYyByZWZlcmVuY2UsIG9yIGEgbmFtZWQgcmVmZXJlbmNlKS4KZW50aXR5X3N1YiA9IHJlLmNvbXBpbGUocicmKCMoXGQrfHhbXGRhLWZBLUZdKyl8W1x3LjotXSspOz8nKS5zdWIKCgpkZWYgdWNocihjKToKICAgIGlmIG5vdCBpc2luc3RhbmNlKGMsIGludCk6CiAgICAgICAgcmV0dXJuIGMKICAgIGlmIGMgPiAyNTU6CiAgICAgICAgcmV0dXJuIHNpeC51bmljaHIoYykKICAgIHJldHVybiBjaHIoYykKCgpkZWYgZGVjb2RlX2VudGl0eShtYXRjaCk6CiAgICB3aGF0ID0gbWF0Y2guZ3JvdXAoMSkKICAgIGlmIHdoYXQuc3RhcnRzd2l0aCgnI3gnKToKICAgICAgICB3aGF0ID0gaW50KHdoYXRbMjpdLCAxNikKICAgIGVsaWYgd2hhdC5zdGFydHN3aXRoKCcjJyk6CiAgICAgICAgd2hhdCA9IGludCh3aGF0WzE6XSkKICAgIGVsc2U6CiAgICAgICAgd2hhdCA9IHNpeC5tb3Zlcy5odG1sX2VudGl0aWVzLm5hbWUyY29kZXBvaW50LmdldCh3aGF0LCBtYXRjaC5ncm91cCgwKSkKICAgIHJldHVybiB1Y2hyKHdoYXQpCgoKZGVmIGh0bWxkZWNvZGUodGV4dCk6CiAgICAiIiJEZWNvZGUgSFRNTCBlbnRpdGllcyBpbiB0aGUgZ2l2ZW4gdGV4dC4iIiIKICAgIHJldHVybiBlbnRpdHlfc3ViKGRlY29kZV9lbnRpdHksIHRleHQpCgoKZGVmIHNvY2tldF90aW1lb3V0KHRpbWVvdXQ9MTUpOgogICAgZGVmIF9zb2NrZXRfdGltZW91dChmdW5jKToKICAgICAgICBkZWYgX3NvY2tldF90aW1lb3V0KCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIG9sZF90aW1lb3V0ID0gc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkKICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChvbGRfdGltZW91dCkKCiAgICAgICAgcmV0dXJuIF9zb2NrZXRfdGltZW91dAoKICAgIHJldHVybiBfc29ja2V0X3RpbWVvdXQKCgpkZWYgX2VuY29kZV9hdXRoKGF1dGgpOgogICAgIiIiCiAgICBBIGZ1bmN0aW9uIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLTMuMyB0aGF0IHdpbGwgZW5jb2RlCiAgICBhdXRoIGZyb20gYSBVUkwgc3VpdGFibGUgZm9yIGFuIEhUVFAgaGVhZGVyLgogICAgPj4+IHN0cihfZW5jb2RlX2F1dGgoJ3VzZXJuYW1lJTNBcGFzc3dvcmQnKSkKICAgICdkWE5sY201aGJXVTZjR0Z6YzNkdmNtUT0nCgogICAgTG9uZyBhdXRoIHN0cmluZ3Mgc2hvdWxkIG5vdCBjYXVzZSBhIG5ld2xpbmUgdG8gYmUgaW5zZXJ0ZWQuCiAgICA+Pj4gbG9uZ19hdXRoID0gJ3VzZXJuYW1lOicgKyAncGFzc3dvcmQnKjEwCiAgICA+Pj4gY2hyKDEwKSBpbiBzdHIoX2VuY29kZV9hdXRoKGxvbmdfYXV0aCkpCiAgICBGYWxzZQogICAgIiIiCiAgICBhdXRoX3MgPSB1cmxsaWIucGFyc2UudW5xdW90ZShhdXRoKQogICAgIyBjb252ZXJ0IHRvIGJ5dGVzCiAgICBhdXRoX2J5dGVzID0gYXV0aF9zLmVuY29kZSgpCiAgICAjIHVzZSB0aGUgbGVnYWN5IGludGVyZmFjZSBmb3IgUHl0aG9uIDIuMyBzdXBwb3J0CiAgICBlbmNvZGVkX2J5dGVzID0gYmFzZTY0LmVuY29kZXN0cmluZyhhdXRoX2J5dGVzKQogICAgIyBjb252ZXJ0IGJhY2sgdG8gYSBzdHJpbmcKICAgIGVuY29kZWQgPSBlbmNvZGVkX2J5dGVzLmRlY29kZSgpCiAgICAjIHN0cmlwIHRoZSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4KICAgIHJldHVybiBlbmNvZGVkLnJlcGxhY2UoJ1xuJywgJycpCgoKY2xhc3MgQ3JlZGVudGlhbChvYmplY3QpOgogICAgIiIiCiAgICBBIHVzZXJuYW1lL3Bhc3N3b3JkIHBhaXIuIFVzZSBsaWtlIGEgbmFtZWR0dXBsZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1c2VybmFtZSwgcGFzc3dvcmQpOgogICAgICAgIHNlbGYudXNlcm5hbWUgPSB1c2VybmFtZQogICAgICAgIHNlbGYucGFzc3dvcmQgPSBwYXNzd29yZAoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICB5aWVsZCBzZWxmLnVzZXJuYW1lCiAgICAgICAgeWllbGQgc2VsZi5wYXNzd29yZAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJSh1c2VybmFtZSlzOiUocGFzc3dvcmQpcycgJSB2YXJzKHNlbGYpCgoKY2xhc3MgUHlQSUNvbmZpZyhjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBMb2FkIGZyb20gfi8ucHlwaXJjCiAgICAgICAgIiIiCiAgICAgICAgZGVmYXVsdHMgPSBkaWN0LmZyb21rZXlzKFsndXNlcm5hbWUnLCAncGFzc3dvcmQnLCAncmVwb3NpdG9yeSddLCAnJykKICAgICAgICBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyLl9faW5pdF9fKHNlbGYsIGRlZmF1bHRzKQoKICAgICAgICByYyA9IG9zLnBhdGguam9pbihvcy5wYXRoLmV4cGFuZHVzZXIoJ34nKSwgJy5weXBpcmMnKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJjKToKICAgICAgICAgICAgc2VsZi5yZWFkKHJjKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNyZWRzX2J5X3JlcG9zaXRvcnkoc2VsZik6CiAgICAgICAgc2VjdGlvbnNfd2l0aF9yZXBvc2l0b3JpZXMgPSBbCiAgICAgICAgICAgIHNlY3Rpb24gZm9yIHNlY3Rpb24gaW4gc2VsZi5zZWN0aW9ucygpCiAgICAgICAgICAgIGlmIHNlbGYuZ2V0KHNlY3Rpb24sICdyZXBvc2l0b3J5Jykuc3RyaXAoKQogICAgICAgIF0KCiAgICAgICAgcmV0dXJuIGRpY3QobWFwKHNlbGYuX2dldF9yZXBvX2NyZWQsIHNlY3Rpb25zX3dpdGhfcmVwb3NpdG9yaWVzKSkKCiAgICBkZWYgX2dldF9yZXBvX2NyZWQoc2VsZiwgc2VjdGlvbik6CiAgICAgICAgcmVwbyA9IHNlbGYuZ2V0KHNlY3Rpb24sICdyZXBvc2l0b3J5Jykuc3RyaXAoKQogICAgICAgIHJldHVybiByZXBvLCBDcmVkZW50aWFsKAogICAgICAgICAgICBzZWxmLmdldChzZWN0aW9uLCAndXNlcm5hbWUnKS5zdHJpcCgpLAogICAgICAgICAgICBzZWxmLmdldChzZWN0aW9uLCAncGFzc3dvcmQnKS5zdHJpcCgpLAogICAgICAgICkKCiAgICBkZWYgZmluZF9jcmVkZW50aWFsKHNlbGYsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgSWYgdGhlIFVSTCBpbmRpY2F0ZWQgYXBwZWFycyB0byBiZSBhIHJlcG9zaXRvcnkgZGVmaW5lZCBpbiB0aGlzCiAgICAgICAgY29uZmlnLCByZXR1cm4gdGhlIGNyZWRlbnRpYWwgZm9yIHRoYXQgcmVwb3NpdG9yeS4KICAgICAgICAiIiIKICAgICAgICBmb3IgcmVwb3NpdG9yeSwgY3JlZCBpbiBzZWxmLmNyZWRzX2J5X3JlcG9zaXRvcnkuaXRlbXMoKToKICAgICAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgocmVwb3NpdG9yeSk6CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlZAoKCmRlZiBvcGVuX3dpdGhfYXV0aCh1cmwsIG9wZW5lcj11cmxsaWIucmVxdWVzdC51cmxvcGVuKToKICAgICIiIk9wZW4gYSB1cmxsaWIyIHJlcXVlc3QsIGhhbmRsaW5nIEhUVFAgYXV0aGVudGljYXRpb24iIiIKCiAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZyA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpCgogICAgIyBEb3VibGUgc2NoZW1lIGRvZXMgbm90IHJhaXNlIG9uIE1hYyBPUyBYIGFzIHJldmVhbGVkIGJ5IGEKICAgICMgZmFpbGluZyB0ZXN0LiBXZSB3b3VsZCBleHBlY3QgIm5vbm51bWVyaWMgcG9ydCIuIFJlZnMgIzIwLgogICAgaWYgbmV0bG9jLmVuZHN3aXRoKCc6Jyk6CiAgICAgICAgcmFpc2UgaHR0cF9jbGllbnQuSW52YWxpZFVSTCgibm9ubnVtZXJpYyBwb3J0OiAnJyIpCgogICAgaWYgc2NoZW1lIGluICgnaHR0cCcsICdodHRwcycpOgogICAgICAgIGF1dGgsIGhvc3QgPSBzcGxpdHVzZXIobmV0bG9jKQogICAgZWxzZToKICAgICAgICBhdXRoID0gTm9uZQoKICAgIGlmIG5vdCBhdXRoOgogICAgICAgIGNyZWQgPSBQeVBJQ29uZmlnKCkuZmluZF9jcmVkZW50aWFsKHVybCkKICAgICAgICBpZiBjcmVkOgogICAgICAgICAgICBhdXRoID0gc3RyKGNyZWQpCiAgICAgICAgICAgIGluZm8gPSBjcmVkLnVzZXJuYW1lLCB1cmwKICAgICAgICAgICAgbG9nLmluZm8oJ0F1dGhlbnRpY2F0aW5nIGFzICVzIGZvciAlcyAoZnJvbSAucHlwaXJjKScsICppbmZvKQoKICAgIGlmIGF1dGg6CiAgICAgICAgYXV0aCA9ICJCYXNpYyAiICsgX2VuY29kZV9hdXRoKGF1dGgpCiAgICAgICAgcGFydHMgPSBzY2hlbWUsIGhvc3QsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWcKICAgICAgICBuZXdfdXJsID0gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFydHMpCiAgICAgICAgcmVxdWVzdCA9IHVybGxpYi5yZXF1ZXN0LlJlcXVlc3QobmV3X3VybCkKICAgICAgICByZXF1ZXN0LmFkZF9oZWFkZXIoIkF1dGhvcml6YXRpb24iLCBhdXRoKQogICAgZWxzZToKICAgICAgICByZXF1ZXN0ID0gdXJsbGliLnJlcXVlc3QuUmVxdWVzdCh1cmwpCgogICAgcmVxdWVzdC5hZGRfaGVhZGVyKCdVc2VyLUFnZW50JywgdXNlcl9hZ2VudCkKICAgIGZwID0gb3BlbmVyKHJlcXVlc3QpCgogICAgaWYgYXV0aDoKICAgICAgICAjIFB1dCBhdXRoZW50aWNhdGlvbiBpbmZvIGJhY2sgaW50byByZXF1ZXN0IFVSTCBpZiBzYW1lIGhvc3QsCiAgICAgICAgIyBzbyB0aGF0IGxpbmtzIGZvdW5kIG9uIHRoZSBwYWdlIHdpbGwgd29yawogICAgICAgIHMyLCBoMiwgcGF0aDIsIHBhcmFtMiwgcXVlcnkyLCBmcmFnMiA9IHVybGxpYi5wYXJzZS51cmxwYXJzZShmcC51cmwpCiAgICAgICAgaWYgczIgPT0gc2NoZW1lIGFuZCBoMiA9PSBob3N0OgogICAgICAgICAgICBwYXJ0cyA9IHMyLCBuZXRsb2MsIHBhdGgyLCBwYXJhbTIsIHF1ZXJ5MiwgZnJhZzIKICAgICAgICAgICAgZnAudXJsID0gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFydHMpCgogICAgcmV0dXJuIGZwCgoKIyBhZGRpbmcgYSB0aW1lb3V0IHRvIGF2b2lkIGZyZWV6aW5nIHBhY2thZ2VfaW5kZXgKb3Blbl93aXRoX2F1dGggPSBzb2NrZXRfdGltZW91dChfU09DS0VUX1RJTUVPVVQpKG9wZW5fd2l0aF9hdXRoKQoKCmRlZiBmaXhfc2ZfdXJsKHVybCk6CiAgICByZXR1cm4gdXJsICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKCgpkZWYgbG9jYWxfb3Blbih1cmwpOgogICAgIiIiUmVhZCBhIGxvY2FsIHBhdGgsIHdpdGggc3BlY2lhbCBzdXBwb3J0IGZvciBkaXJlY3RvcmllcyIiIgogICAgc2NoZW1lLCBzZXJ2ZXIsIHBhdGgsIHBhcmFtLCBxdWVyeSwgZnJhZyA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpCiAgICBmaWxlbmFtZSA9IHVybGxpYi5yZXF1ZXN0LnVybDJwYXRobmFtZShwYXRoKQogICAgaWYgb3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpOgogICAgICAgIHJldHVybiB1cmxsaWIucmVxdWVzdC51cmxvcGVuKHVybCkKICAgIGVsaWYgcGF0aC5lbmRzd2l0aCgnLycpIGFuZCBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKICAgICAgICBmaWxlcyA9IFtdCiAgICAgICAgZm9yIGYgaW4gb3MubGlzdGRpcihmaWxlbmFtZSk6CiAgICAgICAgICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKGZpbGVuYW1lLCBmKQogICAgICAgICAgICBpZiBmID09ICdpbmRleC5odG1sJzoKICAgICAgICAgICAgICAgIHdpdGggb3BlbihmaWxlcGF0aCwgJ3InKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICBib2R5ID0gZnAucmVhZCgpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZmlsZXBhdGgpOgogICAgICAgICAgICAgICAgZiArPSAnLycKICAgICAgICAgICAgZmlsZXMuYXBwZW5kKCc8YSBocmVmPSJ7bmFtZX0iPntuYW1lfTwvYT4nLmZvcm1hdChuYW1lPWYpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRtcGwgPSAoCiAgICAgICAgICAgICAgICAiPGh0bWw+PGhlYWQ+PHRpdGxlPnt1cmx9PC90aXRsZT4iCiAgICAgICAgICAgICAgICAiPC9oZWFkPjxib2R5PntmaWxlc308L2JvZHk+PC9odG1sPiIpCiAgICAgICAgICAgIGJvZHkgPSB0bXBsLmZvcm1hdCh1cmw9dXJsLCBmaWxlcz0nXG4nLmpvaW4oZmlsZXMpKQogICAgICAgIHN0YXR1cywgbWVzc2FnZSA9IDIwMCwgIk9LIgogICAgZWxzZToKICAgICAgICBzdGF0dXMsIG1lc3NhZ2UsIGJvZHkgPSA0MDQsICJQYXRoIG5vdCBmb3VuZCIsICJOb3QgZm91bmQiCgogICAgaGVhZGVycyA9IHsnY29udGVudC10eXBlJzogJ3RleHQvaHRtbCd9CiAgICBib2R5X3N0cmVhbSA9IHNpeC5TdHJpbmdJTyhib2R5KQogICAgcmV0dXJuIHVybGxpYi5lcnJvci5IVFRQRXJyb3IodXJsLCBzdGF0dXMsIG1lc3NhZ2UsIGhlYWRlcnMsIGJvZHlfc3RyZWFtKQpQSwMEFAAAAAAAAAAhAOXm6L6CKgAAgioAADAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3BlcDQyNXRhZ3MucHkjIFRoaXMgZmlsZSBvcmlnaW5hbGx5IGZyb20gcGlwOgojIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9ibG9iLzhmNGYxNWE1YTk1ZDdkNWI1MTFjZWFlZTllZDI2MTE3NmMxODE5NzAvc3JjL3BpcC9faW50ZXJuYWwvcGVwNDI1dGFncy5weQoiIiJHZW5lcmF0ZSBhbmQgd29yayB3aXRoIFBFUCA0MjUgQ29tcGF0aWJpbGl0eSBUYWdzLiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGRpc3R1dGlscy51dGlsCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgc3lzY29uZmlnCmltcG9ydCB3YXJuaW5ncwpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAoKZnJvbSAuIGltcG9ydCBnbGliYwoKX29zeF9hcmNoX3BhdCA9IHJlLmNvbXBpbGUocicoLispXyhcZCspXyhcZCspXyguKyknKQoKCmRlZiBnZXRfY29uZmlnX3Zhcih2YXIpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIodmFyKQogICAgZXhjZXB0IElPRXJyb3IgYXMgZTogICMgSXNzdWUgIzEwNzQKICAgICAgICB3YXJuaW5ncy53YXJuKCJ7fSIuZm9ybWF0KGUpLCBSdW50aW1lV2FybmluZykKICAgICAgICByZXR1cm4gTm9uZQoKCmRlZiBnZXRfYWJicl9pbXBsKCk6CiAgICAiIiJSZXR1cm4gYWJicmV2aWF0ZWQgaW1wbGVtZW50YXRpb24gbmFtZS4iIiIKICAgIGlmIGhhc2F0dHIoc3lzLCAncHlweV92ZXJzaW9uX2luZm8nKToKICAgICAgICBweWltcGwgPSAncHAnCiAgICBlbGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICAgICAgcHlpbXBsID0gJ2p5JwogICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gJ2NsaSc6CiAgICAgICAgcHlpbXBsID0gJ2lwJwogICAgZWxzZToKICAgICAgICBweWltcGwgPSAnY3AnCiAgICByZXR1cm4gcHlpbXBsCgoKZGVmIGdldF9pbXBsX3ZlcigpOgogICAgIiIiUmV0dXJuIGltcGxlbWVudGF0aW9uIHZlcnNpb24uIiIiCiAgICBpbXBsX3ZlciA9IGdldF9jb25maWdfdmFyKCJweV92ZXJzaW9uX25vZG90IikKICAgIGlmIG5vdCBpbXBsX3ZlciBvciBnZXRfYWJicl9pbXBsKCkgPT0gJ3BwJzoKICAgICAgICBpbXBsX3ZlciA9ICcnLmpvaW4obWFwKHN0ciwgZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCkpKQogICAgcmV0dXJuIGltcGxfdmVyCgoKZGVmIGdldF9pbXBsX3ZlcnNpb25faW5mbygpOgogICAgIiIiUmV0dXJuIHN5cy52ZXJzaW9uX2luZm8tbGlrZSB0dXBsZSBmb3IgdXNlIGluIGRlY3JlbWVudGluZyB0aGUgbWlub3IKICAgIHZlcnNpb24uIiIiCiAgICBpZiBnZXRfYWJicl9pbXBsKCkgPT0gJ3BwJzoKICAgICAgICAjIGFzIHBlciBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzI4ODIKICAgICAgICByZXR1cm4gKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy5weXB5X3ZlcnNpb25faW5mby5tYWpvciwKICAgICAgICAgICAgICAgIHN5cy5weXB5X3ZlcnNpb25faW5mby5taW5vcikKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0KCgpkZWYgZ2V0X2ltcGxfdGFnKCk6CiAgICAiIiIKICAgIFJldHVybnMgdGhlIFRhZyBmb3IgdGhpcyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KICAgICIiIgogICAgcmV0dXJuICJ7fXt9Ii5mb3JtYXQoZ2V0X2FiYnJfaW1wbCgpLCBnZXRfaW1wbF92ZXIoKSkKCgpkZWYgZ2V0X2ZsYWcodmFyLCBmYWxsYmFjaywgZXhwZWN0ZWQ9VHJ1ZSwgd2Fybj1UcnVlKToKICAgICIiIlVzZSBhIGZhbGxiYWNrIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgU09BQkkgZmxhZ3MgaWYgdGhlIG5lZWRlZCBjb25maWcKICAgIHZhciBpcyB1bnNldCBvciB1bmF2YWlsYWJsZS4iIiIKICAgIHZhbCA9IGdldF9jb25maWdfdmFyKHZhcikKICAgIGlmIHZhbCBpcyBOb25lOgogICAgICAgIGlmIHdhcm46CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNvbmZpZyB2YXJpYWJsZSAnezB9JyBpcyB1bnNldCwgUHl0aG9uIEFCSSB0YWcgbWF5ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiYmUgaW5jb3JyZWN0Ii5mb3JtYXQodmFyKSwgUnVudGltZVdhcm5pbmcsIDIpCiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCkKICAgIHJldHVybiB2YWwgPT0gZXhwZWN0ZWQKCgpkZWYgZ2V0X2FiaV90YWcoKToKICAgICIiIlJldHVybiB0aGUgQUJJIHRhZyBiYXNlZCBvbiBTT0FCSSAoaWYgYXZhaWxhYmxlKSBvciBlbXVsYXRlIFNPQUJJCiAgICAoQ1B5dGhvbiAyLCBQeVB5KS4iIiIKICAgIHNvYWJpID0gZ2V0X2NvbmZpZ192YXIoJ1NPQUJJJykKICAgIGltcGwgPSBnZXRfYWJicl9pbXBsKCkKICAgIGlmIG5vdCBzb2FiaSBhbmQgaW1wbCBpbiB7J2NwJywgJ3BwJ30gYW5kIGhhc2F0dHIoc3lzLCAnbWF4dW5pY29kZScpOgogICAgICAgIGQgPSAnJwogICAgICAgIG0gPSAnJwogICAgICAgIHUgPSAnJwogICAgICAgIGlmIGdldF9mbGFnKCdQeV9ERUJVRycsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBoYXNhdHRyKHN5cywgJ2dldHRvdGFscmVmY291bnQnKSwKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcpKToKICAgICAgICAgICAgZCA9ICdkJwogICAgICAgIGlmIGdldF9mbGFnKCdXSVRIX1BZTUFMTE9DJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IGltcGwgPT0gJ2NwJywKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcpKToKICAgICAgICAgICAgbSA9ICdtJwogICAgICAgIGlmIGdldF9mbGFnKCdQeV9VTklDT0RFX1NJWkUnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogc3lzLm1heHVuaWNvZGUgPT0gMHgxMGZmZmYsCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9NCwKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKSkpIFwKICAgICAgICAgICAgICAgIGFuZCBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMpOgogICAgICAgICAgICB1ID0gJ3UnCiAgICAgICAgYWJpID0gJyVzJXMlcyVzJXMnICUgKGltcGwsIGdldF9pbXBsX3ZlcigpLCBkLCBtLCB1KQogICAgZWxpZiBzb2FiaSBhbmQgc29hYmkuc3RhcnRzd2l0aCgnY3B5dGhvbi0nKToKICAgICAgICBhYmkgPSAnY3AnICsgc29hYmkuc3BsaXQoJy0nKVsxXQogICAgZWxpZiBzb2FiaToKICAgICAgICBhYmkgPSBzb2FiaS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgZWxzZToKICAgICAgICBhYmkgPSBOb25lCiAgICByZXR1cm4gYWJpCgoKZGVmIF9pc19ydW5uaW5nXzMyYml0KCk6CiAgICByZXR1cm4gc3lzLm1heHNpemUgPT0gMjE0NzQ4MzY0NwoKCmRlZiBnZXRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiBvdXIgcGxhdGZvcm0gbmFtZSAnd2luMzInLCAnbGludXhfeDg2XzY0JyIiIgogICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgogICAgICAgICMgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkgcmV0dXJucyB0aGUgcmVsZWFzZSBiYXNlZCBvbiB0aGUgdmFsdWUKICAgICAgICAjIG9mIE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBvbiB3aGljaCBQeXRob24gd2FzIGJ1aWx0LCB3aGljaCBtYXkKICAgICAgICAjIGJlIHNpZ25pZmljYW50bHkgb2xkZXIgdGhhbiB0aGUgdXNlcidzIGN1cnJlbnQgbWFjaGluZS4KICAgICAgICByZWxlYXNlLCBfLCBtYWNoaW5lID0gcGxhdGZvcm0ubWFjX3ZlcigpCiAgICAgICAgc3BsaXRfdmVyID0gcmVsZWFzZS5zcGxpdCgnLicpCgogICAgICAgIGlmIG1hY2hpbmUgPT0gIng4Nl82NCIgYW5kIF9pc19ydW5uaW5nXzMyYml0KCk6CiAgICAgICAgICAgIG1hY2hpbmUgPSAiaTM4NiIKICAgICAgICBlbGlmIG1hY2hpbmUgPT0gInBwYzY0IiBhbmQgX2lzX3J1bm5pbmdfMzJiaXQoKToKICAgICAgICAgICAgbWFjaGluZSA9ICJwcGMiCgogICAgICAgIHJldHVybiAnbWFjb3N4X3t9X3t9X3t9Jy5mb3JtYXQoc3BsaXRfdmVyWzBdLCBzcGxpdF92ZXJbMV0sIG1hY2hpbmUpCgogICAgIyBYWFggcmVtb3ZlIGRpc3R1dGlscyBkZXBlbmRlbmN5CiAgICByZXN1bHQgPSBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgaWYgcmVzdWx0ID09ICJsaW51eF94ODZfNjQiIGFuZCBfaXNfcnVubmluZ18zMmJpdCgpOgogICAgICAgICMgMzIgYml0IFB5dGhvbiBwcm9ncmFtIChydW5uaW5nIG9uIGEgNjQgYml0IExpbnV4KTogcGlwIHNob3VsZCBvbmx5CiAgICAgICAgIyBpbnN0YWxsIGFuZCBydW4gMzIgYml0IGNvbXBpbGVkIGV4dGVuc2lvbnMgaW4gdGhhdCBjYXNlLgogICAgICAgIHJlc3VsdCA9ICJsaW51eF9pNjg2IgoKICAgIHJldHVybiByZXN1bHQKCgpkZWYgaXNfbWFueWxpbnV4MV9jb21wYXRpYmxlKCk6CiAgICAjIE9ubHkgTGludXgsIGFuZCBvbmx5IHg4Ni02NCAvIGk2ODYKICAgIGlmIGdldF9wbGF0Zm9ybSgpIG5vdCBpbiB7ImxpbnV4X3g4Nl82NCIsICJsaW51eF9pNjg2In06CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgIyBDaGVjayBmb3IgcHJlc2VuY2Ugb2YgX21hbnlsaW51eCBtb2R1bGUKICAgIHRyeToKICAgICAgICBpbXBvcnQgX21hbnlsaW51eAogICAgICAgIHJldHVybiBib29sKF9tYW55bGludXgubWFueWxpbnV4MV9jb21wYXRpYmxlKQogICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgICAgICMgRmFsbCB0aHJvdWdoIHRvIGhldXJpc3RpYyBjaGVjayBiZWxvdwogICAgICAgIHBhc3MKCiAgICAjIENoZWNrIGdsaWJjIHZlcnNpb24uIENlbnRPUyA1IHVzZXMgZ2xpYmMgMi41LgogICAgcmV0dXJuIGdsaWJjLmhhdmVfY29tcGF0aWJsZV9nbGliYygyLCA1KQoKCmRlZiBnZXRfZGFyd2luX2FyY2hlcyhtYWpvciwgbWlub3IsIG1hY2hpbmUpOgogICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBzdXBwb3J0ZWQgYXJjaGVzIChpbmNsdWRpbmcgZ3JvdXAgYXJjaGVzKSBmb3IKICAgIHRoZSBnaXZlbiBtYWpvciwgbWlub3IgYW5kIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIG9mIGFuIG1hY09TIG1hY2hpbmUuCiAgICAiIiIKICAgIGFyY2hlcyA9IFtdCgogICAgZGVmIF9zdXBwb3J0c19hcmNoKG1ham9yLCBtaW5vciwgYXJjaCk6CiAgICAgICAgIyBMb29raW5nIGF0IHRoZSBhcHBsaWNhdGlvbiBzdXBwb3J0IGZvciBtYWNPUyB2ZXJzaW9ucyBpbiB0aGUgY2hhcnQKICAgICAgICAjIHByb3ZpZGVkIGJ5IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09TX1gjVmVyc2lvbnMgaXQgYXBwZWFycwogICAgICAgICMgb3VyIHRpbWVsaW5lIGxvb2tzIHJvdWdobHkgbGlrZToKICAgICAgICAjCiAgICAgICAgIyAxMC4wIC0gSW50cm9kdWNlcyBwcGMgc3VwcG9ydC4KICAgICAgICAjIDEwLjQgLSBJbnRyb2R1Y2VzIHBwYzY0LCBpMzg2LCBhbmQgeDg2XzY0IHN1cHBvcnQsIGhvd2V2ZXIgdGhlIHBwYzY0CiAgICAgICAgIyAgICAgICAgYW5kIHg4Nl82NCBzdXBwb3J0IGlzIENMSSBvbmx5LCBhbmQgY2Fubm90IGJlIHVzZWQgZm9yIEdVSQogICAgICAgICMgICAgICAgIGFwcGxpY2F0aW9ucy4KICAgICAgICAjIDEwLjUgLSBFeHRlbmRzIHBwYzY0IGFuZCB4ODZfNjQgc3VwcG9ydCB0byBjb3ZlciBHVUkgYXBwbGljYXRpb25zLgogICAgICAgICMgMTAuNiAtIERyb3BzIHN1cHBvcnQgZm9yIHBwYzY0CiAgICAgICAgIyAxMC43IC0gRHJvcHMgc3VwcG9ydCBmb3IgcHBjCiAgICAgICAgIwogICAgICAgICMgR2l2ZW4gdGhhdCB3ZSBkbyBub3Qga25vdyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGEgQ0xJIG9yIGEgR1VJCiAgICAgICAgIyBhcHBsaWNhdGlvbiwgd2UgbXVzdCBiZSBjb25zZXJ2YXRpdmUgYW5kIGFzc3VtZSBpdCBtaWdodCBiZSBhIEdVSQogICAgICAgICMgYXBwbGljYXRpb24gYW5kIGJlaGF2ZSBhcyBpZiBwcGM2NCBhbmQgeDg2XzY0IHN1cHBvcnQgZGlkIG5vdCBvY2N1cgogICAgICAgICMgdW50aWwgMTAuNS4KICAgICAgICAjCiAgICAgICAgIyBOb3RlOiBUaGUgYWJvdmUgaW5mb3JtYXRpb24gaXMgdGFrZW4gZnJvbSB0aGUgIkFwcGxpY2F0aW9uIHN1cHBvcnQiCiAgICAgICAgIyAgICAgICBjb2x1bW4gaW4gdGhlIGNoYXJ0IG5vdCB0aGUgIlByb2Nlc3NvciBzdXBwb3J0IiBzaW5jZSBJIGJlbGlldmUKICAgICAgICAjICAgICAgIHRoYXQgd2UgY2FyZSBhYm91dCB3aGF0IGluc3RydWN0aW9uIHNldHMgYW4gYXBwbGljYXRpb24gY2FuIHVzZQogICAgICAgICMgICAgICAgbm90IHdoaWNoIHByb2Nlc3NvcnMgdGhlIE9TIHN1cHBvcnRzLgogICAgICAgIGlmIGFyY2ggPT0gJ3BwYyc6CiAgICAgICAgICAgIHJldHVybiAobWFqb3IsIG1pbm9yKSA8PSAoMTAsIDUpCiAgICAgICAgaWYgYXJjaCA9PSAncHBjNjQnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPT0gKDEwLCA1KQogICAgICAgIGlmIGFyY2ggPT0gJ2kzODYnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPj0gKDEwLCA0KQogICAgICAgIGlmIGFyY2ggPT0gJ3g4Nl82NCc6CiAgICAgICAgICAgIHJldHVybiAobWFqb3IsIG1pbm9yKSA+PSAoMTAsIDUpCiAgICAgICAgaWYgYXJjaCBpbiBncm91cHM6CiAgICAgICAgICAgIGZvciBnYXJjaCBpbiBncm91cHNbYXJjaF06CiAgICAgICAgICAgICAgICBpZiBfc3VwcG9ydHNfYXJjaChtYWpvciwgbWlub3IsIGdhcmNoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGdyb3VwcyA9IE9yZGVyZWREaWN0KFsKICAgICAgICAoImZhdCIsICgiaTM4NiIsICJwcGMiKSksCiAgICAgICAgKCJpbnRlbCIsICgieDg2XzY0IiwgImkzODYiKSksCiAgICAgICAgKCJmYXQ2NCIsICgieDg2XzY0IiwgInBwYzY0IikpLAogICAgICAgICgiZmF0MzIiLCAoIng4Nl82NCIsICJpMzg2IiwgInBwYyIpKSwKICAgIF0pCgogICAgaWYgX3N1cHBvcnRzX2FyY2gobWFqb3IsIG1pbm9yLCBtYWNoaW5lKToKICAgICAgICBhcmNoZXMuYXBwZW5kKG1hY2hpbmUpCgogICAgZm9yIGdhcmNoIGluIGdyb3VwczoKICAgICAgICBpZiBtYWNoaW5lIGluIGdyb3Vwc1tnYXJjaF0gYW5kIF9zdXBwb3J0c19hcmNoKG1ham9yLCBtaW5vciwgZ2FyY2gpOgogICAgICAgICAgICBhcmNoZXMuYXBwZW5kKGdhcmNoKQoKICAgIGFyY2hlcy5hcHBlbmQoJ3VuaXZlcnNhbCcpCgogICAgcmV0dXJuIGFyY2hlcwoKCmRlZiBnZXRfc3VwcG9ydGVkKHZlcnNpb25zPU5vbmUsIG5vYXJjaD1GYWxzZSwgcGxhdGZvcm09Tm9uZSwKICAgICAgICAgICAgICAgICAgaW1wbD1Ob25lLCBhYmk9Tm9uZSk6CiAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHN1cHBvcnRlZCB0YWdzIGZvciBlYWNoIHZlcnNpb24gc3BlY2lmaWVkIGluCiAgICBgdmVyc2lvbnNgLgoKICAgIDpwYXJhbSB2ZXJzaW9uczogYSBsaXN0IG9mIHN0cmluZyB2ZXJzaW9ucywgb2YgdGhlIGZvcm0gWyIzMyIsICIzMiJdLAogICAgICAgIG9yIE5vbmUuIFRoZSBmaXJzdCB2ZXJzaW9uIHdpbGwgYmUgYXNzdW1lZCB0byBzdXBwb3J0IG91ciBBQkkuCiAgICA6cGFyYW0gcGxhdGZvcm06IHNwZWNpZnkgdGhlIGV4YWN0IHBsYXRmb3JtIHlvdSB3YW50IHZhbGlkCiAgICAgICAgdGFncyBmb3IsIG9yIE5vbmUuIElmIE5vbmUsIHVzZSB0aGUgbG9jYWwgc3lzdGVtIHBsYXRmb3JtLgogICAgOnBhcmFtIGltcGw6IHNwZWNpZnkgdGhlIGV4YWN0IGltcGxlbWVudGF0aW9uIHlvdSB3YW50IHZhbGlkCiAgICAgICAgdGFncyBmb3IsIG9yIE5vbmUuIElmIE5vbmUsIHVzZSB0aGUgbG9jYWwgaW50ZXJwcmV0ZXIgaW1wbC4KICAgIDpwYXJhbSBhYmk6IHNwZWNpZnkgdGhlIGV4YWN0IGFiaSB5b3Ugd2FudCB2YWxpZAogICAgICAgIHRhZ3MgZm9yLCBvciBOb25lLiBJZiBOb25lLCB1c2UgdGhlIGxvY2FsIGludGVycHJldGVyIGFiaS4KICAgICIiIgogICAgc3VwcG9ydGVkID0gW10KCiAgICAjIFZlcnNpb25zIG11c3QgYmUgZ2l2ZW4gd2l0aCByZXNwZWN0IHRvIHRoZSBwcmVmZXJlbmNlCiAgICBpZiB2ZXJzaW9ucyBpcyBOb25lOgogICAgICAgIHZlcnNpb25zID0gW10KICAgICAgICB2ZXJzaW9uX2luZm8gPSBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKQogICAgICAgIG1ham9yID0gdmVyc2lvbl9pbmZvWzotMV0KICAgICAgICAjIFN1cHBvcnQgYWxsIHByZXZpb3VzIG1pbm9yIFB5dGhvbiB2ZXJzaW9ucy4KICAgICAgICBmb3IgbWlub3IgaW4gcmFuZ2UodmVyc2lvbl9pbmZvWy0xXSwgLTEsIC0xKToKICAgICAgICAgICAgdmVyc2lvbnMuYXBwZW5kKCcnLmpvaW4obWFwKHN0ciwgbWFqb3IgKyAobWlub3IsKSkpKQoKICAgIGltcGwgPSBpbXBsIG9yIGdldF9hYmJyX2ltcGwoKQoKICAgIGFiaXMgPSBbXQoKICAgIGFiaSA9IGFiaSBvciBnZXRfYWJpX3RhZygpCiAgICBpZiBhYmk6CiAgICAgICAgYWJpc1swOjBdID0gW2FiaV0KCiAgICBhYmkzcyA9IHNldCgpCiAgICBpbXBvcnQgaW1wCiAgICBmb3Igc3VmZml4IGluIGltcC5nZXRfc3VmZml4ZXMoKToKICAgICAgICBpZiBzdWZmaXhbMF0uc3RhcnRzd2l0aCgnLmFiaScpOgogICAgICAgICAgICBhYmkzcy5hZGQoc3VmZml4WzBdLnNwbGl0KCcuJywgMilbMV0pCgogICAgYWJpcy5leHRlbmQoc29ydGVkKGxpc3QoYWJpM3MpKSkKCiAgICBhYmlzLmFwcGVuZCgnbm9uZScpCgogICAgaWYgbm90IG5vYXJjaDoKICAgICAgICBhcmNoID0gcGxhdGZvcm0gb3IgZ2V0X3BsYXRmb3JtKCkKICAgICAgICBpZiBhcmNoLnN0YXJ0c3dpdGgoJ21hY29zeCcpOgogICAgICAgICAgICAjIHN1cHBvcnQgbWFjb3N4LTEwLjYtaW50ZWwgb24gbWFjb3N4LTEwLjkteDg2XzY0CiAgICAgICAgICAgIG1hdGNoID0gX29zeF9hcmNoX3BhdC5tYXRjaChhcmNoKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIG5hbWUsIG1ham9yLCBtaW5vciwgYWN0dWFsX2FyY2ggPSBtYXRjaC5ncm91cHMoKQogICAgICAgICAgICAgICAgdHBsID0gJ3t9X3t9XyVpXyVzJy5mb3JtYXQobmFtZSwgbWFqb3IpCiAgICAgICAgICAgICAgICBhcmNoZXMgPSBbXQogICAgICAgICAgICAgICAgZm9yIG0gaW4gcmV2ZXJzZWQocmFuZ2UoaW50KG1pbm9yKSArIDEpKToKICAgICAgICAgICAgICAgICAgICBmb3IgYSBpbiBnZXRfZGFyd2luX2FyY2hlcyhpbnQobWFqb3IpLCBtLCBhY3R1YWxfYXJjaCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hlcy5hcHBlbmQodHBsICUgKG0sIGEpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBhcmNoIHBhdHRlcm4gZGlkbid0IG1hdGNoICg/ISkKICAgICAgICAgICAgICAgIGFyY2hlcyA9IFthcmNoXQogICAgICAgIGVsaWYgcGxhdGZvcm0gaXMgTm9uZSBhbmQgaXNfbWFueWxpbnV4MV9jb21wYXRpYmxlKCk6CiAgICAgICAgICAgIGFyY2hlcyA9IFthcmNoLnJlcGxhY2UoJ2xpbnV4JywgJ21hbnlsaW51eDEnKSwgYXJjaF0KICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmNoZXMgPSBbYXJjaF0KCiAgICAgICAgIyBDdXJyZW50IHZlcnNpb24sIGN1cnJlbnQgQVBJIChidWlsdCBzcGVjaWZpY2FsbHkgZm9yIG91ciBQeXRob24pOgogICAgICAgIGZvciBhYmkgaW4gYWJpczoKICAgICAgICAgICAgZm9yIGFyY2ggaW4gYXJjaGVzOgogICAgICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb25zWzBdKSwgYWJpLCBhcmNoKSkKCiAgICAgICAgIyBhYmkzIG1vZHVsZXMgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb24gb2YgUHl0aG9uCiAgICAgICAgZm9yIHZlcnNpb24gaW4gdmVyc2lvbnNbMTpdOgogICAgICAgICAgICAjIGFiaTMgd2FzIGludHJvZHVjZWQgaW4gUHl0aG9uIDMuMgogICAgICAgICAgICBpZiB2ZXJzaW9uIGluIHsnMzEnLCAnMzAnfToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGZvciBhYmkgaW4gYWJpM3M6ICAgIyBlbXB0eSBzZXQgaWYgbm90IFB5dGhvbiAzCiAgICAgICAgICAgICAgICBmb3IgYXJjaCBpbiBhcmNoZXM6CiAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoIiVzJXMiICUgKGltcGwsIHZlcnNpb24pLCBhYmksIGFyY2gpKQoKICAgICAgICAjIEhhcyBiaW5hcmllcywgZG9lcyBub3QgdXNlIHRoZSBQeXRob24gQVBJOgogICAgICAgIGZvciBhcmNoIGluIGFyY2hlczoKICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb25zWzBdWzBdKSwgJ25vbmUnLCBhcmNoKSkKCiAgICAjIE5vIGFiaSAvIGFyY2gsIGJ1dCByZXF1aXJlcyBvdXIgaW1wbGVtZW50YXRpb246CiAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF0pLCAnbm9uZScsICdhbnknKSkKICAgICMgVGFnZ2VkIHNwZWNpZmljYWxseSBhcyBiZWluZyBjcm9zcy12ZXJzaW9uIGNvbXBhdGlibGUKICAgICMgKHdpdGgganVzdCB0aGUgbWFqb3IgdmVyc2lvbiBzcGVjaWZpZWQpCiAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF1bMF0pLCAnbm9uZScsICdhbnknKSkKCiAgICAjIE5vIGFiaSAvIGFyY2gsIGdlbmVyaWMgUHl0aG9uCiAgICBmb3IgaSwgdmVyc2lvbiBpbiBlbnVtZXJhdGUodmVyc2lvbnMpOgogICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uLCksICdub25lJywgJ2FueScpKQogICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb25bMF0pLCAnbm9uZScsICdhbnknKSkKCiAgICByZXR1cm4gc3VwcG9ydGVkCgoKaW1wbGVtZW50YXRpb25fdGFnID0gZ2V0X2ltcGxfdGFnKCkKUEsDBBQAAAAAAAAAIQCyZqdXGAIAABgCAAAwAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9weTI3Y29tcGF0LnB5IiIiCkNvbXBhdGliaWxpdHkgU3VwcG9ydCBmb3IgUHl0aG9uIDIuNyBhbmQgZWFybGllcgoiIiIKCmltcG9ydCBwbGF0Zm9ybQoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CgoKZGVmIGdldF9hbGxfaGVhZGVycyhtZXNzYWdlLCBrZXkpOgogICAgIiIiCiAgICBHaXZlbiBhbiBIVFRQTWVzc2FnZSwgcmV0dXJuIGFsbCBoZWFkZXJzIG1hdGNoaW5nIGEgZ2l2ZW4ga2V5LgogICAgIiIiCiAgICByZXR1cm4gbWVzc2FnZS5nZXRfYWxsKGtleSkKCgppZiBzaXguUFkyOgogICAgZGVmIGdldF9hbGxfaGVhZGVycyhtZXNzYWdlLCBrZXkpOgogICAgICAgIHJldHVybiBtZXNzYWdlLmdldGhlYWRlcnMoa2V5KQoKCmxpbnV4X3B5Ml9hc2NpaSA9ICgKICAgIHBsYXRmb3JtLnN5c3RlbSgpID09ICdMaW51eCcgYW5kCiAgICBzaXguUFkyCikKCnJtdHJlZV9zYWZlID0gc3RyIGlmIGxpbnV4X3B5Ml9hc2NpaSBlbHNlIGxhbWJkYSB4OiB4CiIiIldvcmthcm91bmQgZm9yIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyNDY3MiIiIgpQSwMEFAAAAAAAAAAhANC5SFqoBAAAqAQAADAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3B5MzFjb21wYXQucHlfX2FsbF9fID0gWydnZXRfY29uZmlnX3ZhcnMnLCAnZ2V0X3BhdGgnXQoKdHJ5OgogICAgIyBQeXRob24gMi43IG9yID49My4yCiAgICBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X2NvbmZpZ192YXJzLCBnZXRfcGF0aApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9jb25maWdfdmFycywgZ2V0X3B5dGhvbl9saWIKCiAgICBkZWYgZ2V0X3BhdGgobmFtZSk6CiAgICAgICAgaWYgbmFtZSBub3QgaW4gKCdwbGF0bGliJywgJ3B1cmVsaWInKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTmFtZSBtdXN0IGJlIHB1cmVsaWIgb3IgcGxhdGxpYiIpCiAgICAgICAgcmV0dXJuIGdldF9weXRob25fbGliKG5hbWUgPT0gJ3BsYXRsaWInKQoKCnRyeToKICAgICMgUHl0aG9uID49My4yCiAgICBmcm9tIHRlbXBmaWxlIGltcG9ydCBUZW1wb3JhcnlEaXJlY3RvcnkKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IHNodXRpbAogICAgaW1wb3J0IHRlbXBmaWxlCgogICAgY2xhc3MgVGVtcG9yYXJ5RGlyZWN0b3J5KG9iamVjdCk6CiAgICAgICAgIiIiCiAgICAgICAgVmVyeSBzaW1wbGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBjb250ZXh0IG1hbmFnZXIuCiAgICAgICAgV2lsbCB0cnkgdG8gZGVsZXRlIGFmdGVyd2FyZCwgYnV0IHdpbGwgYWxzbyBpZ25vcmUgT1MgYW5kIHNpbWlsYXIKICAgICAgICBlcnJvcnMgb24gZGVsZXRpb24uCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc2VsZi5uYW1lID0gTm9uZSAgIyBIYW5kbGUgbWtkdGVtcCByYWlzaW5nIGFuIGV4Y2VwdGlvbgogICAgICAgICAgICBzZWxmLm5hbWUgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKCiAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjdHlwZSwgZXhjdmFsdWUsIGV4Y3RyYWNlKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLm5hbWUsIFRydWUpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOiAgIyByZW1vdmFsIGVycm9ycyBhcmUgbm90IHRoZSBvbmx5IHBvc3NpYmxlCiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIHNlbGYubmFtZSA9IE5vbmUKUEsDBBQAAAAAAAAAIQDJYZLA5gMAAOYDAAAwAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9weTMzY29tcGF0LnB5aW1wb3J0IGRpcwppbXBvcnQgYXJyYXkKaW1wb3J0IGNvbGxlY3Rpb25zCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCgpPcEFyZyA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ09wQXJnJywgJ29wY29kZSBhcmcnKQoKCmNsYXNzIEJ5dGVjb2RlX2NvbXBhdChvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvZGUpOgogICAgICAgIHNlbGYuY29kZSA9IGNvZGUKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiWWllbGQgJyhvcCxhcmcpJyBwYWlyIGZvciBlYWNoIG9wZXJhdGlvbiBpbiBjb2RlIG9iamVjdCAnY29kZSciIiIKCiAgICAgICAgYnl0ZXMgPSBhcnJheS5hcnJheSgnYicsIHNlbGYuY29kZS5jb19jb2RlKQogICAgICAgIGVvZiA9IGxlbihzZWxmLmNvZGUuY29fY29kZSkKCiAgICAgICAgcHRyID0gMAogICAgICAgIGV4dGVuZGVkX2FyZyA9IDAKCiAgICAgICAgd2hpbGUgcHRyIDwgZW9mOgoKICAgICAgICAgICAgb3AgPSBieXRlc1twdHJdCgogICAgICAgICAgICBpZiBvcCA+PSBkaXMuSEFWRV9BUkdVTUVOVDoKCiAgICAgICAgICAgICAgICBhcmcgPSBieXRlc1twdHIgKyAxXSArIGJ5dGVzW3B0ciArIDJdICogMjU2ICsgZXh0ZW5kZWRfYXJnCiAgICAgICAgICAgICAgICBwdHIgKz0gMwoKICAgICAgICAgICAgICAgIGlmIG9wID09IGRpcy5FWFRFTkRFRF9BUkc6CiAgICAgICAgICAgICAgICAgICAgbG9uZ190eXBlID0gc2l4LmludGVnZXJfdHlwZXNbLTFdCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfYXJnID0gYXJnICogbG9uZ190eXBlKDY1NTM2KQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXJnID0gTm9uZQogICAgICAgICAgICAgICAgcHRyICs9IDEKCiAgICAgICAgICAgIHlpZWxkIE9wQXJnKG9wLCBhcmcpCgoKQnl0ZWNvZGUgPSBnZXRhdHRyKGRpcywgJ0J5dGVjb2RlJywgQnl0ZWNvZGVfY29tcGF0KQpQSwMEFAAAAAAAAAAhAIUZmgtLCwAASwsAADAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3B5MzZjb21wYXQucHlpbXBvcnQgc3lzCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgc3RydG9ib29sCmZyb20gZGlzdHV0aWxzLmRlYnVnIGltcG9ydCBERUJVRwoKCmNsYXNzIERpc3RyaWJ1dGlvbl9wYXJzZV9jb25maWdfZmlsZXM6CiAgICAiIiIKICAgIE1peC1pbiBwcm92aWRpbmcgZm9yd2FyZC1jb21wYXRpYmlsaXR5IGZvciBmdW5jdGlvbmFsaXR5IHRvIGJlCiAgICBpbmNsdWRlZCBieSBkZWZhdWx0IG9uIFB5dGhvbiAzLjcuCgogICAgRG8gbm90IGVkaXQgdGhlIGNvZGUgaW4gdGhpcyBjbGFzcyBleGNlcHQgdG8gdXBkYXRlIGZ1bmN0aW9uYWxpdHkKICAgIGFzIGltcGxlbWVudGVkIGluIGRpc3R1dGlscy4KICAgICIiIgogICAgZGVmIHBhcnNlX2NvbmZpZ19maWxlcyhzZWxmLCBmaWxlbmFtZXM9Tm9uZSk6CiAgICAgICAgZnJvbSBjb25maWdwYXJzZXIgaW1wb3J0IENvbmZpZ1BhcnNlcgoKICAgICAgICAjIElnbm9yZSBpbnN0YWxsIGRpcmVjdG9yeSBvcHRpb25zIGlmIHdlIGhhdmUgYSB2ZW52CiAgICAgICAgaWYgc3lzLnByZWZpeCAhPSBzeXMuYmFzZV9wcmVmaXg6CiAgICAgICAgICAgIGlnbm9yZV9vcHRpb25zID0gWwogICAgICAgICAgICAgICAgJ2luc3RhbGwtYmFzZScsICdpbnN0YWxsLXBsYXRiYXNlJywgJ2luc3RhbGwtbGliJywKICAgICAgICAgICAgICAgICdpbnN0YWxsLXBsYXRsaWInLCAnaW5zdGFsbC1wdXJlbGliJywgJ2luc3RhbGwtaGVhZGVycycsCiAgICAgICAgICAgICAgICAnaW5zdGFsbC1zY3JpcHRzJywgJ2luc3RhbGwtZGF0YScsICdwcmVmaXgnLCAnZXhlYy1wcmVmaXgnLAogICAgICAgICAgICAgICAgJ2hvbWUnLCAndXNlcicsICdyb290J10KICAgICAgICBlbHNlOgogICAgICAgICAgICBpZ25vcmVfb3B0aW9ucyA9IFtdCgogICAgICAgIGlnbm9yZV9vcHRpb25zID0gZnJvemVuc2V0KGlnbm9yZV9vcHRpb25zKQoKICAgICAgICBpZiBmaWxlbmFtZXMgaXMgTm9uZToKICAgICAgICAgICAgZmlsZW5hbWVzID0gc2VsZi5maW5kX2NvbmZpZ19maWxlcygpCgogICAgICAgIGlmIERFQlVHOgogICAgICAgICAgICBzZWxmLmFubm91bmNlKCJEaXN0cmlidXRpb24ucGFyc2VfY29uZmlnX2ZpbGVzKCk6IikKCiAgICAgICAgcGFyc2VyID0gQ29uZmlnUGFyc2VyKGludGVycG9sYXRpb249Tm9uZSkKICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICBpZiBERUJVRzoKICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoIiAgcmVhZGluZyAlcyIgJSBmaWxlbmFtZSkKICAgICAgICAgICAgcGFyc2VyLnJlYWQoZmlsZW5hbWUpCiAgICAgICAgICAgIGZvciBzZWN0aW9uIGluIHBhcnNlci5zZWN0aW9ucygpOgogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHBhcnNlci5vcHRpb25zKHNlY3Rpb24pCiAgICAgICAgICAgICAgICBvcHRfZGljdCA9IHNlbGYuZ2V0X29wdGlvbl9kaWN0KHNlY3Rpb24pCgogICAgICAgICAgICAgICAgZm9yIG9wdCBpbiBvcHRpb25zOgogICAgICAgICAgICAgICAgICAgIGlmIG9wdCAhPSAnX19uYW1lX18nIGFuZCBvcHQgbm90IGluIGlnbm9yZV9vcHRpb25zOgogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBwYXJzZXIuZ2V0KHNlY3Rpb24sb3B0KQogICAgICAgICAgICAgICAgICAgICAgICBvcHQgPSBvcHQucmVwbGFjZSgnLScsICdfJykKICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RpY3Rbb3B0XSA9IChmaWxlbmFtZSwgdmFsKQoKICAgICAgICAgICAgIyBNYWtlIHRoZSBDb25maWdQYXJzZXIgZm9yZ2V0IGV2ZXJ5dGhpbmcgKHNvIHdlIHJldGFpbgogICAgICAgICAgICAjIHRoZSBvcmlnaW5hbCBmaWxlbmFtZXMgdGhhdCBvcHRpb25zIGNvbWUgZnJvbSkKICAgICAgICAgICAgcGFyc2VyLl9faW5pdF9fKCkKCiAgICAgICAgIyBJZiB0aGVyZSB3YXMgYSAiZ2xvYmFsIiBzZWN0aW9uIGluIHRoZSBjb25maWcgZmlsZSwgdXNlIGl0CiAgICAgICAgIyB0byBzZXQgRGlzdHJpYnV0aW9uIG9wdGlvbnMuCgogICAgICAgIGlmICdnbG9iYWwnIGluIHNlbGYuY29tbWFuZF9vcHRpb25zOgogICAgICAgICAgICBmb3IgKG9wdCwgKHNyYywgdmFsKSkgaW4gc2VsZi5jb21tYW5kX29wdGlvbnNbJ2dsb2JhbCddLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBhbGlhcyA9IHNlbGYubmVnYXRpdmVfb3B0LmdldChvcHQpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaWYgYWxpYXM6CiAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYWxpYXMsIG5vdCBzdHJ0b2Jvb2wodmFsKSkKICAgICAgICAgICAgICAgICAgICBlbGlmIG9wdCBpbiAoJ3ZlcmJvc2UnLCAnZHJ5X3J1bicpOiAjIHVnaCEKICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBvcHQsIHN0cnRvYm9vbCh2YWwpKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgb3B0LCB2YWwpCiAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBtc2c6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IobXNnKQoKCmlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywpOgogICAgIyBQeXRob24gMiBiZWhhdmlvciBpcyBzdWZmaWNpZW50CiAgICBjbGFzcyBEaXN0cmlidXRpb25fcGFyc2VfY29uZmlnX2ZpbGVzOgogICAgICAgIHBhc3MKCgppZiBGYWxzZToKICAgICMgV2hlbiB1cGRhdGVkIGJlaGF2aW9yIGlzIGF2YWlsYWJsZSB1cHN0cmVhbSwKICAgICMgZGlzYWJsZSBvdmVycmlkZSBoZXJlLgogICAgY2xhc3MgRGlzdHJpYnV0aW9uX3BhcnNlX2NvbmZpZ19maWxlczoKICAgICAgICBwYXNzClBLAwQUAAAAAAAAACEAjFOaY8Q3AADENwAALQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc2FuZGJveC5weWltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgcGlja2xlCmltcG9ydCB0ZXh0d3JhcAoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBidWlsdGlucywgbWFwCgppbXBvcnQgcGtnX3Jlc291cmNlcy5weTMxY29tcGF0CgppZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgaW1wb3J0IG9yZy5weXRob24ubW9kdWxlcy5wb3NpeC5Qb3NpeE1vZHVsZSBhcyBfb3MKZWxzZToKICAgIF9vcyA9IHN5cy5tb2R1bGVzW29zLm5hbWVdCnRyeToKICAgIF9maWxlID0gZmlsZQpleGNlcHQgTmFtZUVycm9yOgogICAgX2ZpbGUgPSBOb25lCl9vcGVuID0gb3Blbgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgd29ya2luZ19zZXQKCgpfX2FsbF9fID0gWwogICAgIkFic3RyYWN0U2FuZGJveCIsICJEaXJlY3RvcnlTYW5kYm94IiwgIlNhbmRib3hWaW9sYXRpb24iLCAicnVuX3NldHVwIiwKXQoKCmRlZiBfZXhlY2ZpbGUoZmlsZW5hbWUsIGdsb2JhbHMsIGxvY2Fscz1Ob25lKToKICAgICIiIgogICAgUHl0aG9uIDMgaW1wbGVtZW50YXRpb24gb2YgZXhlY2ZpbGUuCiAgICAiIiIKICAgIG1vZGUgPSAncmInCiAgICB3aXRoIG9wZW4oZmlsZW5hbWUsIG1vZGUpIGFzIHN0cmVhbToKICAgICAgICBzY3JpcHQgPSBzdHJlYW0ucmVhZCgpCiAgICBpZiBsb2NhbHMgaXMgTm9uZToKICAgICAgICBsb2NhbHMgPSBnbG9iYWxzCiAgICBjb2RlID0gY29tcGlsZShzY3JpcHQsIGZpbGVuYW1lLCAnZXhlYycpCiAgICBleGVjKGNvZGUsIGdsb2JhbHMsIGxvY2FscykKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2F2ZV9hcmd2KHJlcGw9Tm9uZSk6CiAgICBzYXZlZCA9IHN5cy5hcmd2WzpdCiAgICBpZiByZXBsIGlzIG5vdCBOb25lOgogICAgICAgIHN5cy5hcmd2WzpdID0gcmVwbAogICAgdHJ5OgogICAgICAgIHlpZWxkIHNhdmVkCiAgICBmaW5hbGx5OgogICAgICAgIHN5cy5hcmd2WzpdID0gc2F2ZWQKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2F2ZV9wYXRoKCk6CiAgICBzYXZlZCA9IHN5cy5wYXRoWzpdCiAgICB0cnk6CiAgICAgICAgeWllbGQgc2F2ZWQKICAgIGZpbmFsbHk6CiAgICAgICAgc3lzLnBhdGhbOl0gPSBzYXZlZAoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBvdmVycmlkZV90ZW1wKHJlcGxhY2VtZW50KToKICAgICIiIgogICAgTW9ua2V5LXBhdGNoIHRlbXBmaWxlLnRlbXBkaXIgd2l0aCByZXBsYWNlbWVudCwgZW5zdXJpbmcgaXQgZXhpc3RzCiAgICAiIiIKICAgIHBrZ19yZXNvdXJjZXMucHkzMWNvbXBhdC5tYWtlZGlycyhyZXBsYWNlbWVudCwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICBzYXZlZCA9IHRlbXBmaWxlLnRlbXBkaXIKCiAgICB0ZW1wZmlsZS50ZW1wZGlyID0gcmVwbGFjZW1lbnQKCiAgICB0cnk6CiAgICAgICAgeWllbGQKICAgIGZpbmFsbHk6CiAgICAgICAgdGVtcGZpbGUudGVtcGRpciA9IHNhdmVkCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHB1c2hkKHRhcmdldCk6CiAgICBzYXZlZCA9IG9zLmdldGN3ZCgpCiAgICBvcy5jaGRpcih0YXJnZXQpCiAgICB0cnk6CiAgICAgICAgeWllbGQgc2F2ZWQKICAgIGZpbmFsbHk6CiAgICAgICAgb3MuY2hkaXIoc2F2ZWQpCgoKY2xhc3MgVW5waWNrbGVhYmxlRXhjZXB0aW9uKEV4Y2VwdGlvbik6CiAgICAiIiIKICAgIEFuIGV4Y2VwdGlvbiByZXByZXNlbnRpbmcgYW5vdGhlciBFeGNlcHRpb24gdGhhdCBjb3VsZCBub3QgYmUgcGlja2xlZC4KICAgICIiIgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBkdW1wKHR5cGUsIGV4Yyk6CiAgICAgICAgIiIiCiAgICAgICAgQWx3YXlzIHJldHVybiBhIGR1bXBlZCAocGlja2xlZCkgdHlwZSBhbmQgZXhjLiBJZiBleGMgY2FuJ3QgYmUgcGlja2xlZCwKICAgICAgICB3cmFwIGl0IGluIFVucGlja2xlYWJsZUV4Y2VwdGlvbiBmaXJzdC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBwaWNrbGUuZHVtcHModHlwZSksIHBpY2tsZS5kdW1wcyhleGMpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgIyBnZXQgVW5waWNrbGVhYmxlRXhjZXB0aW9uIGluc2lkZSB0aGUgc2FuZGJveAogICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuc2FuZGJveCBpbXBvcnQgVW5waWNrbGVhYmxlRXhjZXB0aW9uIGFzIGNscwogICAgICAgICAgICByZXR1cm4gY2xzLmR1bXAoY2xzLCBjbHMocmVwcihleGMpKSkKCgpjbGFzcyBFeGNlcHRpb25TYXZlcjoKICAgICIiIgogICAgQSBDb250ZXh0IE1hbmFnZXIgdGhhdCB3aWxsIHNhdmUgYW4gZXhjZXB0aW9uLCBzZXJpYWxpemVkLCBhbmQgcmVzdG9yZSBpdAogICAgbGF0ZXIuCiAgICAiIiIKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIGV4YywgdGIpOgogICAgICAgIGlmIG5vdCBleGM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIGR1bXAgdGhlIGV4Y2VwdGlvbgogICAgICAgIHNlbGYuX3NhdmVkID0gVW5waWNrbGVhYmxlRXhjZXB0aW9uLmR1bXAodHlwZSwgZXhjKQogICAgICAgIHNlbGYuX3RiID0gdGIKCiAgICAgICAgIyBzdXBwcmVzcyB0aGUgZXhjZXB0aW9uCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmVzdW1lKHNlbGYpOgogICAgICAgICJyZXN0b3JlIGFuZCByZS1yYWlzZSBhbnkgZXhjZXB0aW9uIgoKICAgICAgICBpZiAnX3NhdmVkJyBub3QgaW4gdmFycyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHR5cGUsIGV4YyA9IG1hcChwaWNrbGUubG9hZHMsIHNlbGYuX3NhdmVkKQogICAgICAgIHNpeC5yZXJhaXNlKHR5cGUsIGV4Yywgc2VsZi5fdGIpCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNhdmVfbW9kdWxlcygpOgogICAgIiIiCiAgICBDb250ZXh0IGluIHdoaWNoIGltcG9ydGVkIG1vZHVsZXMgYXJlIHNhdmVkLgoKICAgIFRyYW5zbGF0ZXMgZXhjZXB0aW9ucyBpbnRlcm5hbCB0byB0aGUgY29udGV4dCBpbnRvIHRoZSBlcXVpdmFsZW50IGV4Y2VwdGlvbgogICAgb3V0c2lkZSB0aGUgY29udGV4dC4KICAgICIiIgogICAgc2F2ZWQgPSBzeXMubW9kdWxlcy5jb3B5KCkKICAgIHdpdGggRXhjZXB0aW9uU2F2ZXIoKSBhcyBzYXZlZF9leGM6CiAgICAgICAgeWllbGQgc2F2ZWQKCiAgICBzeXMubW9kdWxlcy51cGRhdGUoc2F2ZWQpCiAgICAjIHJlbW92ZSBhbnkgbW9kdWxlcyBpbXBvcnRlZCBzaW5jZQogICAgZGVsX21vZHVsZXMgPSAoCiAgICAgICAgbW9kX25hbWUgZm9yIG1vZF9uYW1lIGluIHN5cy5tb2R1bGVzCiAgICAgICAgaWYgbW9kX25hbWUgbm90IGluIHNhdmVkCiAgICAgICAgIyBleGNsdWRlIGFueSBlbmNvZGluZ3MgbW9kdWxlcy4gU2VlICMyODUKICAgICAgICBhbmQgbm90IG1vZF9uYW1lLnN0YXJ0c3dpdGgoJ2VuY29kaW5ncy4nKQogICAgKQogICAgX2NsZWFyX21vZHVsZXMoZGVsX21vZHVsZXMpCgogICAgc2F2ZWRfZXhjLnJlc3VtZSgpCgoKZGVmIF9jbGVhcl9tb2R1bGVzKG1vZHVsZV9uYW1lcyk6CiAgICBmb3IgbW9kX25hbWUgaW4gbGlzdChtb2R1bGVfbmFtZXMpOgogICAgICAgIGRlbCBzeXMubW9kdWxlc1ttb2RfbmFtZV0KCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2F2ZV9wa2dfcmVzb3VyY2VzX3N0YXRlKCk6CiAgICBzYXZlZCA9IHBrZ19yZXNvdXJjZXMuX19nZXRzdGF0ZV9fKCkKICAgIHRyeToKICAgICAgICB5aWVsZCBzYXZlZAogICAgZmluYWxseToKICAgICAgICBwa2dfcmVzb3VyY2VzLl9fc2V0c3RhdGVfXyhzYXZlZCkKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2V0dXBfY29udGV4dChzZXR1cF9kaXIpOgogICAgdGVtcF9kaXIgPSBvcy5wYXRoLmpvaW4oc2V0dXBfZGlyLCAndGVtcCcpCiAgICB3aXRoIHNhdmVfcGtnX3Jlc291cmNlc19zdGF0ZSgpOgogICAgICAgIHdpdGggc2F2ZV9tb2R1bGVzKCk6CiAgICAgICAgICAgIGhpZGVfc2V0dXB0b29scygpCiAgICAgICAgICAgIHdpdGggc2F2ZV9wYXRoKCk6CiAgICAgICAgICAgICAgICB3aXRoIHNhdmVfYXJndigpOgogICAgICAgICAgICAgICAgICAgIHdpdGggb3ZlcnJpZGVfdGVtcCh0ZW1wX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggcHVzaGQoc2V0dXBfZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZW5zdXJlIHNldHVwdG9vbHMgY29tbWFuZHMgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pbXBvcnRfXygnc2V0dXB0b29scycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZAoKCmRlZiBfbmVlZHNfaGlkaW5nKG1vZF9uYW1lKToKICAgICIiIgogICAgPj4+IF9uZWVkc19oaWRpbmcoJ3NldHVwdG9vbHMnKQogICAgVHJ1ZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ3BrZ19yZXNvdXJjZXMnKQogICAgVHJ1ZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ3NldHVwdG9vbHNfcGx1Z2luJykKICAgIEZhbHNlCiAgICA+Pj4gX25lZWRzX2hpZGluZygnc2V0dXB0b29scy5fX2luaXRfXycpCiAgICBUcnVlCiAgICA+Pj4gX25lZWRzX2hpZGluZygnZGlzdHV0aWxzJykKICAgIFRydWUKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdvcycpCiAgICBGYWxzZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ0N5dGhvbicpCiAgICBUcnVlCiAgICAiIiIKICAgIHBhdHRlcm4gPSByZS5jb21waWxlKHInKHNldHVwdG9vbHN8cGtnX3Jlc291cmNlc3xkaXN0dXRpbHN8Q3l0aG9uKShcLnwkKScpCiAgICByZXR1cm4gYm9vbChwYXR0ZXJuLm1hdGNoKG1vZF9uYW1lKSkKCgpkZWYgaGlkZV9zZXR1cHRvb2xzKCk6CiAgICAiIiIKICAgIFJlbW92ZSByZWZlcmVuY2VzIHRvIHNldHVwdG9vbHMnIG1vZHVsZXMgZnJvbSBzeXMubW9kdWxlcyB0byBhbGxvdyB0aGUKICAgIGludm9jYXRpb24gdG8gaW1wb3J0IHRoZSBtb3N0IGFwcHJvcHJpYXRlIHNldHVwdG9vbHMuIFRoaXMgdGVjaG5pcXVlIGlzCiAgICBuZWNlc3NhcnkgdG8gYXZvaWQgaXNzdWVzIHN1Y2ggYXMgIzMxNSB3aGVyZSBzZXR1cHRvb2xzIHVwZ3JhZGluZyBpdHNlbGYKICAgIHdvdWxkIGZhaWwgdG8gZmluZCBhIGZ1bmN0aW9uIGRlY2xhcmVkIGluIHRoZSBtZXRhZGF0YS4KICAgICIiIgogICAgbW9kdWxlcyA9IGZpbHRlcihfbmVlZHNfaGlkaW5nLCBzeXMubW9kdWxlcykKICAgIF9jbGVhcl9tb2R1bGVzKG1vZHVsZXMpCgoKZGVmIHJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIGFyZ3MpOgogICAgIiIiUnVuIGEgZGlzdHV0aWxzIHNldHVwIHNjcmlwdCwgc2FuZGJveGVkIGluIGl0cyBkaXJlY3RvcnkiIiIKICAgIHNldHVwX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KSkKICAgIHdpdGggc2V0dXBfY29udGV4dChzZXR1cF9kaXIpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc3lzLmFyZ3ZbOl0gPSBbc2V0dXBfc2NyaXB0XSArIGxpc3QoYXJncykKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHNldHVwX2RpcikKICAgICAgICAgICAgIyByZXNldCB0byBpbmNsdWRlIHNldHVwIGRpciwgdy9jbGVhbiBjYWxsYmFjayBsaXN0CiAgICAgICAgICAgIHdvcmtpbmdfc2V0Ll9faW5pdF9fKCkKICAgICAgICAgICAgd29ya2luZ19zZXQuY2FsbGJhY2tzLmFwcGVuZChsYW1iZGEgZGlzdDogZGlzdC5hY3RpdmF0ZSgpKQoKICAgICAgICAgICAgIyBfX2ZpbGVfXyBzaG91bGQgYmUgYSBieXRlIHN0cmluZyBvbiBQeXRob24gMiAoIzcxMikKICAgICAgICAgICAgZHVuZGVyX2ZpbGUgPSAoCiAgICAgICAgICAgICAgICBzZXR1cF9zY3JpcHQKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2V0dXBfc2NyaXB0LCBzdHIpIGVsc2UKICAgICAgICAgICAgICAgIHNldHVwX3NjcmlwdC5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQogICAgICAgICAgICApCgogICAgICAgICAgICB3aXRoIERpcmVjdG9yeVNhbmRib3goc2V0dXBfZGlyKToKICAgICAgICAgICAgICAgIG5zID0gZGljdChfX2ZpbGVfXz1kdW5kZXJfZmlsZSwgX19uYW1lX189J19fbWFpbl9fJykKICAgICAgICAgICAgICAgIF9leGVjZmlsZShzZXR1cF9zY3JpcHQsIG5zKQogICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0IGFzIHY6CiAgICAgICAgICAgIGlmIHYuYXJncyBhbmQgdi5hcmdzWzBdOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgIyBOb3JtYWwgZXhpdCwganVzdCByZXR1cm4KCgpjbGFzcyBBYnN0cmFjdFNhbmRib3g6CiAgICAiIiJXcmFwICdvcycgbW9kdWxlIGFuZCAnb3BlbigpJyBidWlsdGluIGZvciB2aXJ0dWFsaXppbmcgc2V0dXAgc2NyaXB0cyIiIgoKICAgIF9hY3RpdmUgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9hdHRycyA9IFsKICAgICAgICAgICAgbmFtZSBmb3IgbmFtZSBpbiBkaXIoX29zKQogICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJykgYW5kIGhhc2F0dHIoc2VsZiwgbmFtZSkKICAgICAgICBdCgogICAgZGVmIF9jb3B5KHNlbGYsIHNvdXJjZSk6CiAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5fYXR0cnM6CiAgICAgICAgICAgIHNldGF0dHIob3MsIG5hbWUsIGdldGF0dHIoc291cmNlLCBuYW1lKSkKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHNlbGYuX2NvcHkoc2VsZikKICAgICAgICBpZiBfZmlsZToKICAgICAgICAgICAgYnVpbHRpbnMuZmlsZSA9IHNlbGYuX2ZpbGUKICAgICAgICBidWlsdGlucy5vcGVuID0gc2VsZi5fb3BlbgogICAgICAgIHNlbGYuX2FjdGl2ZSA9IFRydWUKCiAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKICAgICAgICBzZWxmLl9hY3RpdmUgPSBGYWxzZQogICAgICAgIGlmIF9maWxlOgogICAgICAgICAgICBidWlsdGlucy5maWxlID0gX2ZpbGUKICAgICAgICBidWlsdGlucy5vcGVuID0gX29wZW4KICAgICAgICBzZWxmLl9jb3B5KF9vcykKCiAgICBkZWYgcnVuKHNlbGYsIGZ1bmMpOgogICAgICAgICIiIlJ1biAnZnVuYycgdW5kZXIgb3Mgc2FuZGJveGluZyIiIgogICAgICAgIHdpdGggc2VsZjoKICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKQoKICAgIGRlZiBfbWtfZHVhbF9wYXRoX3dyYXBwZXIobmFtZSk6CiAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKF9vcywgbmFtZSkKCiAgICAgICAgZGVmIHdyYXAoc2VsZiwgc3JjLCBkc3QsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlOgogICAgICAgICAgICAgICAgc3JjLCBkc3QgPSBzZWxmLl9yZW1hcF9wYWlyKG5hbWUsIHNyYywgZHN0LCAqYXJncywgKiprdykKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsKHNyYywgZHN0LCAqYXJncywgKiprdykKCiAgICAgICAgcmV0dXJuIHdyYXAKCiAgICBmb3IgbmFtZSBpbiBbInJlbmFtZSIsICJsaW5rIiwgInN5bWxpbmsiXToKICAgICAgICBpZiBoYXNhdHRyKF9vcywgbmFtZSk6CiAgICAgICAgICAgIGxvY2FscygpW25hbWVdID0gX21rX2R1YWxfcGF0aF93cmFwcGVyKG5hbWUpCgogICAgZGVmIF9ta19zaW5nbGVfcGF0aF93cmFwcGVyKG5hbWUsIG9yaWdpbmFsPU5vbmUpOgogICAgICAgIG9yaWdpbmFsID0gb3JpZ2luYWwgb3IgZ2V0YXR0cihfb3MsIG5hbWUpCgogICAgICAgIGRlZiB3cmFwKHNlbGYsIHBhdGgsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlOgogICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYuX3JlbWFwX2lucHV0KG5hbWUsIHBhdGgsICphcmdzLCAqKmt3KQogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwocGF0aCwgKmFyZ3MsICoqa3cpCgogICAgICAgIHJldHVybiB3cmFwCgogICAgaWYgX2ZpbGU6CiAgICAgICAgX2ZpbGUgPSBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcignZmlsZScsIF9maWxlKQogICAgX29wZW4gPSBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcignb3BlbicsIF9vcGVuKQogICAgZm9yIG5hbWUgaW4gWwogICAgICAgICJzdGF0IiwgImxpc3RkaXIiLCAiY2hkaXIiLCAib3BlbiIsICJjaG1vZCIsICJjaG93biIsICJta2RpciIsCiAgICAgICAgInJlbW92ZSIsICJ1bmxpbmsiLCAicm1kaXIiLCAidXRpbWUiLCAibGNob3duIiwgImNocm9vdCIsICJsc3RhdCIsCiAgICAgICAgInN0YXJ0ZmlsZSIsICJta2ZpZm8iLCAibWtub2QiLCAicGF0aGNvbmYiLCAiYWNjZXNzIgogICAgXToKICAgICAgICBpZiBoYXNhdHRyKF9vcywgbmFtZSk6CiAgICAgICAgICAgIGxvY2FscygpW25hbWVdID0gX21rX3NpbmdsZV9wYXRoX3dyYXBwZXIobmFtZSkKCiAgICBkZWYgX21rX3NpbmdsZV93aXRoX3JldHVybihuYW1lKToKICAgICAgICBvcmlnaW5hbCA9IGdldGF0dHIoX29zLCBuYW1lKQoKICAgICAgICBkZWYgd3JhcChzZWxmLCBwYXRoLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLl9yZW1hcF9pbnB1dChuYW1lLCBwYXRoLCAqYXJncywgKiprdykKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZW1hcF9vdXRwdXQobmFtZSwgb3JpZ2luYWwocGF0aCwgKmFyZ3MsICoqa3cpKQogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwocGF0aCwgKmFyZ3MsICoqa3cpCgogICAgICAgIHJldHVybiB3cmFwCgogICAgZm9yIG5hbWUgaW4gWydyZWFkbGluaycsICd0ZW1wbmFtJ106CiAgICAgICAgaWYgaGFzYXR0cihfb3MsIG5hbWUpOgogICAgICAgICAgICBsb2NhbHMoKVtuYW1lXSA9IF9ta19zaW5nbGVfd2l0aF9yZXR1cm4obmFtZSkKCiAgICBkZWYgX21rX3F1ZXJ5KG5hbWUpOgogICAgICAgIG9yaWdpbmFsID0gZ2V0YXR0cihfb3MsIG5hbWUpCgogICAgICAgIGRlZiB3cmFwKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgcmV0dmFsID0gb3JpZ2luYWwoKmFyZ3MsICoqa3cpCiAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZW1hcF9vdXRwdXQobmFtZSwgcmV0dmFsKQogICAgICAgICAgICByZXR1cm4gcmV0dmFsCgogICAgICAgIHJldHVybiB3cmFwCgogICAgZm9yIG5hbWUgaW4gWydnZXRjd2QnLCAndG1wbmFtJ106CiAgICAgICAgaWYgaGFzYXR0cihfb3MsIG5hbWUpOgogICAgICAgICAgICBsb2NhbHMoKVtuYW1lXSA9IF9ta19xdWVyeShuYW1lKQoKICAgIGRlZiBfdmFsaWRhdGVfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICAiIiJDYWxsZWQgdG8gcmVtYXAgb3IgdmFsaWRhdGUgYW55IHBhdGgsIHdoZXRoZXIgaW5wdXQgb3Igb3V0cHV0IiIiCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX3JlbWFwX2lucHV0KHNlbGYsIG9wZXJhdGlvbiwgcGF0aCwgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBpbnB1dHMiIiIKICAgICAgICByZXR1cm4gc2VsZi5fdmFsaWRhdGVfcGF0aChwYXRoKQoKICAgIGRlZiBfcmVtYXBfb3V0cHV0KHNlbGYsIG9wZXJhdGlvbiwgcGF0aCk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIG91dHB1dHMiIiIKICAgICAgICByZXR1cm4gc2VsZi5fdmFsaWRhdGVfcGF0aChwYXRoKQoKICAgIGRlZiBfcmVtYXBfcGFpcihzZWxmLCBvcGVyYXRpb24sIHNyYywgZHN0LCAqYXJncywgKiprdyk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIHBhaXJzIGxpa2UgcmVuYW1lLCBsaW5rLCBhbmQgc3ltbGluayBvcGVyYXRpb25zIiIiCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5fcmVtYXBfaW5wdXQob3BlcmF0aW9uICsgJy1mcm9tJywgc3JjLCAqYXJncywgKiprdyksCiAgICAgICAgICAgIHNlbGYuX3JlbWFwX2lucHV0KG9wZXJhdGlvbiArICctdG8nLCBkc3QsICphcmdzLCAqKmt3KQogICAgICAgICkKCgppZiBoYXNhdHRyKG9zLCAnZGV2bnVsbCcpOgogICAgX0VYQ0VQVElPTlMgPSBbb3MuZGV2bnVsbCxdCmVsc2U6CiAgICBfRVhDRVBUSU9OUyA9IFtdCgoKY2xhc3MgRGlyZWN0b3J5U2FuZGJveChBYnN0cmFjdFNhbmRib3gpOgogICAgIiIiUmVzdHJpY3Qgb3BlcmF0aW9ucyB0byBhIHNpbmdsZSBzdWJkaXJlY3RvcnkgLSBwc2V1ZG8tY2hyb290IiIiCgogICAgd3JpdGVfb3BzID0gZGljdC5mcm9ta2V5cyhbCiAgICAgICAgIm9wZW4iLCAiY2htb2QiLCAiY2hvd24iLCAibWtkaXIiLCAicmVtb3ZlIiwgInVubGluayIsICJybWRpciIsCiAgICAgICAgInV0aW1lIiwgImxjaG93biIsICJjaHJvb3QiLCAibWtmaWZvIiwgIm1rbm9kIiwgInRlbXBuYW0iLAogICAgXSkKCiAgICBfZXhjZXB0aW9uX3BhdHRlcm5zID0gWwogICAgICAgICMgQWxsb3cgbGliMnRvMyB0byBhdHRlbXB0IHRvIHNhdmUgYSBwaWNrbGVkIGdyYW1tYXIgb2JqZWN0ICgjMTIxKQogICAgICAgIHInLipsaWIydG8zLipcLnBpY2tsZSQnLAogICAgXQogICAgImV4ZW1wdCB3cml0aW5nIHRvIHBhdGhzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4iCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNhbmRib3gsIGV4Y2VwdGlvbnM9X0VYQ0VQVElPTlMpOgogICAgICAgIHNlbGYuX3NhbmRib3ggPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoc2FuZGJveCkpCiAgICAgICAgc2VsZi5fcHJlZml4ID0gb3MucGF0aC5qb2luKHNlbGYuX3NhbmRib3gsICcnKQogICAgICAgIHNlbGYuX2V4Y2VwdGlvbnMgPSBbCiAgICAgICAgICAgIG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChwYXRoKSkKICAgICAgICAgICAgZm9yIHBhdGggaW4gZXhjZXB0aW9ucwogICAgICAgIF0KICAgICAgICBBYnN0cmFjdFNhbmRib3guX19pbml0X18oc2VsZikKCiAgICBkZWYgX3Zpb2xhdGlvbihzZWxmLCBvcGVyYXRpb24sICphcmdzLCAqKmt3KToKICAgICAgICBmcm9tIHNldHVwdG9vbHMuc2FuZGJveCBpbXBvcnQgU2FuZGJveFZpb2xhdGlvbgogICAgICAgIHJhaXNlIFNhbmRib3hWaW9sYXRpb24ob3BlcmF0aW9uLCBhcmdzLCBrdykKCiAgICBpZiBfZmlsZToKCiAgICAgICAgZGVmIF9maWxlKHNlbGYsIHBhdGgsIG1vZGU9J3InLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIGlmIG1vZGUgbm90IGluICgncicsICdydCcsICdyYicsICdyVScsICdVJykgYW5kIG5vdCBzZWxmLl9vayhwYXRoKToKICAgICAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbigiZmlsZSIsIHBhdGgsIG1vZGUsICphcmdzLCAqKmt3KQogICAgICAgICAgICByZXR1cm4gX2ZpbGUocGF0aCwgbW9kZSwgKmFyZ3MsICoqa3cpCgogICAgZGVmIF9vcGVuKHNlbGYsIHBhdGgsIG1vZGU9J3InLCAqYXJncywgKiprdyk6CiAgICAgICAgaWYgbW9kZSBub3QgaW4gKCdyJywgJ3J0JywgJ3JiJywgJ3JVJywgJ1UnKSBhbmQgbm90IHNlbGYuX29rKHBhdGgpOgogICAgICAgICAgICBzZWxmLl92aW9sYXRpb24oIm9wZW4iLCBwYXRoLCBtb2RlLCAqYXJncywgKiprdykKICAgICAgICByZXR1cm4gX29wZW4ocGF0aCwgbW9kZSwgKmFyZ3MsICoqa3cpCgogICAgZGVmIHRtcG5hbShzZWxmKToKICAgICAgICBzZWxmLl92aW9sYXRpb24oInRtcG5hbSIpCgogICAgZGVmIF9vayhzZWxmLCBwYXRoKToKICAgICAgICBhY3RpdmUgPSBzZWxmLl9hY3RpdmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX2FjdGl2ZSA9IEZhbHNlCiAgICAgICAgICAgIHJlYWxwYXRoID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKHBhdGgpKQogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgc2VsZi5fZXhlbXB0ZWQocmVhbHBhdGgpCiAgICAgICAgICAgICAgICBvciByZWFscGF0aCA9PSBzZWxmLl9zYW5kYm94CiAgICAgICAgICAgICAgICBvciByZWFscGF0aC5zdGFydHN3aXRoKHNlbGYuX3ByZWZpeCkKICAgICAgICAgICAgKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuX2FjdGl2ZSA9IGFjdGl2ZQoKICAgIGRlZiBfZXhlbXB0ZWQoc2VsZiwgZmlsZXBhdGgpOgogICAgICAgIHN0YXJ0X21hdGNoZXMgPSAoCiAgICAgICAgICAgIGZpbGVwYXRoLnN0YXJ0c3dpdGgoZXhjZXB0aW9uKQogICAgICAgICAgICBmb3IgZXhjZXB0aW9uIGluIHNlbGYuX2V4Y2VwdGlvbnMKICAgICAgICApCiAgICAgICAgcGF0dGVybl9tYXRjaGVzID0gKAogICAgICAgICAgICByZS5tYXRjaChwYXR0ZXJuLCBmaWxlcGF0aCkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gc2VsZi5fZXhjZXB0aW9uX3BhdHRlcm5zCiAgICAgICAgKQogICAgICAgIGNhbmRpZGF0ZXMgPSBpdGVydG9vbHMuY2hhaW4oc3RhcnRfbWF0Y2hlcywgcGF0dGVybl9tYXRjaGVzKQogICAgICAgIHJldHVybiBhbnkoY2FuZGlkYXRlcykKCiAgICBkZWYgX3JlbWFwX2lucHV0KHNlbGYsIG9wZXJhdGlvbiwgcGF0aCwgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBpbnB1dHMiIiIKICAgICAgICBpZiBvcGVyYXRpb24gaW4gc2VsZi53cml0ZV9vcHMgYW5kIG5vdCBzZWxmLl9vayhwYXRoKToKICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKG9wZXJhdGlvbiwgb3MucGF0aC5yZWFscGF0aChwYXRoKSwgKmFyZ3MsICoqa3cpCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX3JlbWFwX3BhaXIoc2VsZiwgb3BlcmF0aW9uLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBwYWlycyBsaWtlIHJlbmFtZSwgbGluaywgYW5kIHN5bWxpbmsgb3BlcmF0aW9ucyIiIgogICAgICAgIGlmIG5vdCBzZWxmLl9vayhzcmMpIG9yIG5vdCBzZWxmLl9vayhkc3QpOgogICAgICAgICAgICBzZWxmLl92aW9sYXRpb24ob3BlcmF0aW9uLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpCiAgICAgICAgcmV0dXJuIChzcmMsIGRzdCkKCiAgICBkZWYgb3BlbihzZWxmLCBmaWxlLCBmbGFncywgbW9kZT0wbzc3NywgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgbG93LWxldmVsIG9zLm9wZW4oKSIiIgogICAgICAgIGlmIGZsYWdzICYgV1JJVEVfRkxBR1MgYW5kIG5vdCBzZWxmLl9vayhmaWxlKToKICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKCJvcy5vcGVuIiwgZmlsZSwgZmxhZ3MsIG1vZGUsICphcmdzLCAqKmt3KQogICAgICAgIHJldHVybiBfb3Mub3BlbihmaWxlLCBmbGFncywgbW9kZSwgKmFyZ3MsICoqa3cpCgoKV1JJVEVfRkxBR1MgPSBmdW5jdG9vbHMucmVkdWNlKAogICAgb3BlcmF0b3Iub3JfLCBbZ2V0YXR0cihfb3MsIGEsIDApIGZvciBhIGluCiAgICAgICAgIk9fV1JPTkxZIE9fUkRXUiBPX0FQUEVORCBPX0NSRUFUIE9fVFJVTkMgT19URU1QT1JBUlkiLnNwbGl0KCldCikKCgpjbGFzcyBTYW5kYm94VmlvbGF0aW9uKERpc3R1dGlsc0Vycm9yKToKICAgICIiIkEgc2V0dXAgc2NyaXB0IGF0dGVtcHRlZCB0byBtb2RpZnkgdGhlIGZpbGVzeXN0ZW0gb3V0c2lkZSB0aGUgc2FuZGJveCIiIgoKICAgIHRtcGwgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgU2FuZGJveFZpb2xhdGlvbjoge2NtZH17YXJncyFyfSB7a3dhcmdzfQoKICAgICAgICBUaGUgcGFja2FnZSBzZXR1cCBzY3JpcHQgaGFzIGF0dGVtcHRlZCB0byBtb2RpZnkgZmlsZXMgb24geW91ciBzeXN0ZW0KICAgICAgICB0aGF0IGFyZSBub3Qgd2l0aGluIHRoZSBFYXN5SW5zdGFsbCBidWlsZCBhcmVhLCBhbmQgaGFzIGJlZW4gYWJvcnRlZC4KCiAgICAgICAgVGhpcyBwYWNrYWdlIGNhbm5vdCBiZSBzYWZlbHkgaW5zdGFsbGVkIGJ5IEVhc3lJbnN0YWxsLCBhbmQgbWF5IG5vdAogICAgICAgIHN1cHBvcnQgYWx0ZXJuYXRlIGluc3RhbGxhdGlvbiBsb2NhdGlvbnMgZXZlbiBpZiB5b3UgcnVuIGl0cyBzZXR1cAogICAgICAgIHNjcmlwdCBieSBoYW5kLiAgUGxlYXNlIGluZm9ybSB0aGUgcGFja2FnZSdzIGF1dGhvciBhbmQgdGhlIEVhc3lJbnN0YWxsCiAgICAgICAgbWFpbnRhaW5lcnMgdG8gZmluZCBvdXQgaWYgYSBmaXggb3Igd29ya2Fyb3VuZCBpcyBhdmFpbGFibGUuCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIGNtZCwgYXJncywga3dhcmdzID0gc2VsZi5hcmdzCiAgICAgICAgcmV0dXJuIHNlbGYudG1wbC5mb3JtYXQoKipsb2NhbHMoKSkKUEsDBBQAAAAAAAAAIQCoM7S+igAAAIoAAAAuAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9zY3JpcHQudG1wbCMgRUFTWS1JTlNUQUxMLVNDUklQVDogJShzcGVjKXIsJShzY3JpcHRfbmFtZSlyCl9fcmVxdWlyZXNfXyA9ICUoc3BlYylyCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMnKS5ydW5fc2NyaXB0KCUoc3BlYylyLCAlKHNjcmlwdF9uYW1lKXIpClBLAwQUAAAAAAAAACEAAsGU4wMJAAADCQAAMAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc2l0ZS1wYXRjaC5weWRlZiBfX2Jvb3QoKToKICAgIGltcG9ydCBzeXMKICAgIGltcG9ydCBvcwogICAgUFlUSE9OUEFUSCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJykKICAgIGlmIFBZVEhPTlBBVEggaXMgTm9uZSBvciAoc3lzLnBsYXRmb3JtID09ICd3aW4zMicgYW5kIG5vdCBQWVRIT05QQVRIKToKICAgICAgICBQWVRIT05QQVRIID0gW10KICAgIGVsc2U6CiAgICAgICAgUFlUSE9OUEFUSCA9IFBZVEhPTlBBVEguc3BsaXQob3MucGF0aHNlcCkKCiAgICBwaWMgPSBnZXRhdHRyKHN5cywgJ3BhdGhfaW1wb3J0ZXJfY2FjaGUnLCB7fSkKICAgIHN0ZHBhdGggPSBzeXMucGF0aFtsZW4oUFlUSE9OUEFUSCk6XQogICAgbXlkaXIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCgogICAgZm9yIGl0ZW0gaW4gc3RkcGF0aDoKICAgICAgICBpZiBpdGVtID09IG15ZGlyIG9yIG5vdCBpdGVtOgogICAgICAgICAgICBjb250aW51ZSAgIyBza2lwIGlmIGN1cnJlbnQgZGlyLiBvbiBXaW5kb3dzLCBvciBteSBvd24gZGlyZWN0b3J5CiAgICAgICAgaW1wb3J0ZXIgPSBwaWMuZ2V0KGl0ZW0pCiAgICAgICAgaWYgaW1wb3J0ZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxvYWRlciA9IGltcG9ydGVyLmZpbmRfbW9kdWxlKCdzaXRlJykKICAgICAgICAgICAgaWYgbG9hZGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBhY3R1YWxseSByZWxvYWQgdGhlIGN1cnJlbnQgbW9kdWxlCiAgICAgICAgICAgICAgICBsb2FkZXIubG9hZF9tb2R1bGUoJ3NpdGUnKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgaW1wICAjIEF2b2lkIGltcG9ydCBsb29wIGluIFB5dGhvbiA+PSAzLjMKICAgICAgICAgICAgICAgIHN0cmVhbSwgcGF0aCwgZGVzY3IgPSBpbXAuZmluZF9tb2R1bGUoJ3NpdGUnLCBbaXRlbV0pCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIHN0cmVhbSBpcyBOb25lOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBhY3R1YWxseSByZWxvYWQgdGhlIGN1cnJlbnQgbW9kdWxlCiAgICAgICAgICAgICAgICBpbXAubG9hZF9tb2R1bGUoJ3NpdGUnLCBzdHJlYW0sIHBhdGgsIGRlc2NyKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCkKICAgICAgICAgICAgYnJlYWsKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkNvdWxkbid0IGZpbmQgdGhlIHJlYWwgJ3NpdGUnIG1vZHVsZSIpCgogICAga25vd25fcGF0aHMgPSBkaWN0KFsobWFrZXBhdGgoaXRlbSlbMV0sIDEpIGZvciBpdGVtIGluIHN5cy5wYXRoXSkgICMgMi4yIGNvbXAKCiAgICBvbGRwb3MgPSBnZXRhdHRyKHN5cywgJ19fZWdnaW5zZXJ0JywgMCkgICMgc2F2ZSBvbGQgaW5zZXJ0aW9uIHBvc2l0aW9uCiAgICBzeXMuX19lZ2dpbnNlcnQgPSAwICAjIGFuZCByZXNldCB0aGUgY3VycmVudCBvbmUKCiAgICBmb3IgaXRlbSBpbiBQWVRIT05QQVRIOgogICAgICAgIGFkZHNpdGVkaXIoaXRlbSkKCiAgICBzeXMuX19lZ2dpbnNlcnQgKz0gb2xkcG9zICAjIHJlc3RvcmUgZWZmZWN0aXZlIG9sZCBwb3NpdGlvbgoKICAgIGQsIG5kID0gbWFrZXBhdGgoc3RkcGF0aFswXSkKICAgIGluc2VydF9hdCA9IE5vbmUKICAgIG5ld19wYXRoID0gW10KCiAgICBmb3IgaXRlbSBpbiBzeXMucGF0aDoKICAgICAgICBwLCBucCA9IG1ha2VwYXRoKGl0ZW0pCgogICAgICAgIGlmIG5wID09IG5kIGFuZCBpbnNlcnRfYXQgaXMgTm9uZToKICAgICAgICAgICAgIyBXZSd2ZSBoaXQgdGhlIGZpcnN0ICdzeXN0ZW0nIHBhdGggZW50cnksIHNvIGFkZGVkIGVudHJpZXMgZ28gaGVyZQogICAgICAgICAgICBpbnNlcnRfYXQgPSBsZW4obmV3X3BhdGgpCgogICAgICAgIGlmIG5wIGluIGtub3duX3BhdGhzIG9yIGluc2VydF9hdCBpcyBOb25lOgogICAgICAgICAgICBuZXdfcGF0aC5hcHBlbmQoaXRlbSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIG5ldyBwYXRoIGFmdGVyIHRoZSBpbnNlcnQgcG9pbnQsIGJhY2staW5zZXJ0IGl0CiAgICAgICAgICAgIG5ld19wYXRoLmluc2VydChpbnNlcnRfYXQsIGl0ZW0pCiAgICAgICAgICAgIGluc2VydF9hdCArPSAxCgogICAgc3lzLnBhdGhbOl0gPSBuZXdfcGF0aAoKCmlmIF9fbmFtZV9fID09ICdzaXRlJzoKICAgIF9fYm9vdCgpCiAgICBkZWwgX19ib290ClBLAwQUAAAAAAAAACEAiJtbTiwhAAAsIQAAMQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc3NsX3N1cHBvcnQucHlpbXBvcnQgb3MKaW1wb3J0IHNvY2tldAppbXBvcnQgYXRleGl0CmltcG9ydCByZQppbXBvcnQgZnVuY3Rvb2xzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliLCBodHRwX2NsaWVudCwgbWFwLCBmaWx0ZXIKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgUmVzb2x1dGlvbkVycm9yLCBFeHRyYWN0aW9uRXJyb3IKCnRyeToKICAgIGltcG9ydCBzc2wKZXhjZXB0IEltcG9ydEVycm9yOgogICAgc3NsID0gTm9uZQoKX19hbGxfXyA9IFsKICAgICdWZXJpZnlpbmdIVFRQU0hhbmRsZXInLCAnZmluZF9jYV9idW5kbGUnLCAnaXNfYXZhaWxhYmxlJywgJ2NlcnRfcGF0aHMnLAogICAgJ29wZW5lcl9mb3InCl0KCmNlcnRfcGF0aHMgPSAiIiIKL2V0Yy9wa2kvdGxzL2NlcnRzL2NhLWJ1bmRsZS5jcnQKL2V0Yy9zc2wvY2VydHMvY2EtY2VydGlmaWNhdGVzLmNydAovdXNyL3NoYXJlL3NzbC9jZXJ0cy9jYS1idW5kbGUuY3J0Ci91c3IvbG9jYWwvc2hhcmUvY2VydHMvY2Etcm9vdC5jcnQKL2V0Yy9zc2wvY2VydC5wZW0KL1N5c3RlbS9MaWJyYXJ5L09wZW5TU0wvY2VydHMvY2VydC5wZW0KL3Vzci9sb2NhbC9zaGFyZS9jZXJ0cy9jYS1yb290LW5zcy5jcnQKL2V0Yy9zc2wvY2EtYnVuZGxlLnBlbQoiIiIuc3RyaXAoKS5zcGxpdCgpCgp0cnk6CiAgICBIVFRQU0hhbmRsZXIgPSB1cmxsaWIucmVxdWVzdC5IVFRQU0hhbmRsZXIKICAgIEhUVFBTQ29ubmVjdGlvbiA9IGh0dHBfY2xpZW50LkhUVFBTQ29ubmVjdGlvbgpleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICBIVFRQU0hhbmRsZXIgPSBIVFRQU0Nvbm5lY3Rpb24gPSBvYmplY3QKCmlzX2F2YWlsYWJsZSA9IHNzbCBpcyBub3QgTm9uZSBhbmQgb2JqZWN0IG5vdCBpbiAoSFRUUFNIYW5kbGVyLCBIVFRQU0Nvbm5lY3Rpb24pCgoKdHJ5OgogICAgZnJvbSBzc2wgaW1wb3J0IENlcnRpZmljYXRlRXJyb3IsIG1hdGNoX2hvc3RuYW1lCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHRyeToKICAgICAgICBmcm9tIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IENlcnRpZmljYXRlRXJyb3IKICAgICAgICBmcm9tIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IG1hdGNoX2hvc3RuYW1lCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgQ2VydGlmaWNhdGVFcnJvciA9IE5vbmUKICAgICAgICBtYXRjaF9ob3N0bmFtZSA9IE5vbmUKCmlmIG5vdCBDZXJ0aWZpY2F0ZUVycm9yOgoKICAgIGNsYXNzIENlcnRpZmljYXRlRXJyb3IoVmFsdWVFcnJvcik6CiAgICAgICAgcGFzcwoKCmlmIG5vdCBtYXRjaF9ob3N0bmFtZToKCiAgICBkZWYgX2Ruc25hbWVfbWF0Y2goZG4sIGhvc3RuYW1lLCBtYXhfd2lsZGNhcmRzPTEpOgogICAgICAgICIiIk1hdGNoaW5nIGFjY29yZGluZyB0byBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMwoKICAgICAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MTI1I3NlY3Rpb24tNi40LjMKICAgICAgICAiIiIKICAgICAgICBwYXRzID0gW10KICAgICAgICBpZiBub3QgZG46CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFBvcnRlZCBmcm9tIHB5dGhvbjMtc3ludGF4OgogICAgICAgICMgbGVmdG1vc3QsICpyZW1haW5kZXIgPSBkbi5zcGxpdChyJy4nKQogICAgICAgIHBhcnRzID0gZG4uc3BsaXQocicuJykKICAgICAgICBsZWZ0bW9zdCA9IHBhcnRzWzBdCiAgICAgICAgcmVtYWluZGVyID0gcGFydHNbMTpdCgogICAgICAgIHdpbGRjYXJkcyA9IGxlZnRtb3N0LmNvdW50KCcqJykKICAgICAgICBpZiB3aWxkY2FyZHMgPiBtYXhfd2lsZGNhcmRzOgogICAgICAgICAgICAjIElzc3VlICMxNzk4MDogYXZvaWQgZGVuaWFscyBvZiBzZXJ2aWNlIGJ5IHJlZnVzaW5nIG1vcmUKICAgICAgICAgICAgIyB0aGFuIG9uZSB3aWxkY2FyZCBwZXIgZnJhZ21lbnQuICBBIHN1cnZleSBvZiBlc3RhYmxpc2hlZAogICAgICAgICAgICAjIHBvbGljeSBhbW9uZyBTU0wgaW1wbGVtZW50YXRpb25zIHNob3dlZCBpdCB0byBiZSBhCiAgICAgICAgICAgICMgcmVhc29uYWJsZSBjaG9pY2UuCiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoCiAgICAgICAgICAgICAgICAidG9vIG1hbnkgd2lsZGNhcmRzIGluIGNlcnRpZmljYXRlIEROUyBuYW1lOiAiICsgcmVwcihkbikpCgogICAgICAgICMgc3BlZWQgdXAgY29tbW9uIGNhc2Ugdy9vIHdpbGRjYXJkcwogICAgICAgIGlmIG5vdCB3aWxkY2FyZHM6CiAgICAgICAgICAgIHJldHVybiBkbi5sb3dlcigpID09IGhvc3RuYW1lLmxvd2VyKCkKCiAgICAgICAgIyBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMywgc3ViaXRlbSAxLgogICAgICAgICMgVGhlIGNsaWVudCBTSE9VTEQgTk9UIGF0dGVtcHQgdG8gbWF0Y2ggYSBwcmVzZW50ZWQgaWRlbnRpZmllciBpbiB3aGljaAogICAgICAgICMgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciBjb21wcmlzZXMgYSBsYWJlbCBvdGhlciB0aGFuIHRoZSBsZWZ0LW1vc3QgbGFiZWwuCiAgICAgICAgaWYgbGVmdG1vc3QgPT0gJyonOgogICAgICAgICAgICAjIFdoZW4gJyonIGlzIGEgZnJhZ21lbnQgYnkgaXRzZWxmLCBpdCBtYXRjaGVzIGEgbm9uLWVtcHR5IGRvdGxlc3MKICAgICAgICAgICAgIyBmcmFnbWVudC4KICAgICAgICAgICAgcGF0cy5hcHBlbmQoJ1teLl0rJykKICAgICAgICBlbGlmIGxlZnRtb3N0LnN0YXJ0c3dpdGgoJ3huLS0nKSBvciBob3N0bmFtZS5zdGFydHN3aXRoKCd4bi0tJyk6CiAgICAgICAgICAgICMgUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMsIHN1Yml0ZW0gMy4KICAgICAgICAgICAgIyBUaGUgY2xpZW50IFNIT1VMRCBOT1QgYXR0ZW1wdCB0byBtYXRjaCBhIHByZXNlbnRlZCBpZGVudGlmaWVyCiAgICAgICAgICAgICMgd2hlcmUgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciBpcyBlbWJlZGRlZCB3aXRoaW4gYW4gQS1sYWJlbCBvcgogICAgICAgICAgICAjIFUtbGFiZWwgb2YgYW4gaW50ZXJuYXRpb25hbGl6ZWQgZG9tYWluIG5hbWUuCiAgICAgICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShsZWZ0bW9zdCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBPdGhlcndpc2UsICcqJyBtYXRjaGVzIGFueSBkb3RsZXNzIHN0cmluZywgZS5nLiB3d3cqCiAgICAgICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShsZWZ0bW9zdCkucmVwbGFjZShyJ1wqJywgJ1teLl0qJykpCgogICAgICAgICMgYWRkIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzLCBpZ25vcmUgYW55IHdpbGRjYXJkcwogICAgICAgIGZvciBmcmFnIGluIHJlbWFpbmRlcjoKICAgICAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGZyYWcpKQoKICAgICAgICBwYXQgPSByZS5jb21waWxlKHInXEEnICsgcidcLicuam9pbihwYXRzKSArIHInXFonLCByZS5JR05PUkVDQVNFKQogICAgICAgIHJldHVybiBwYXQubWF0Y2goaG9zdG5hbWUpCgogICAgZGVmIG1hdGNoX2hvc3RuYW1lKGNlcnQsIGhvc3RuYW1lKToKICAgICAgICAiIiJWZXJpZnkgdGhhdCAqY2VydCogKGluIGRlY29kZWQgZm9ybWF0IGFzIHJldHVybmVkIGJ5CiAgICAgICAgU1NMU29ja2V0LmdldHBlZXJjZXJ0KCkpIG1hdGNoZXMgdGhlICpob3N0bmFtZSouICBSRkMgMjgxOCBhbmQgUkZDIDYxMjUKICAgICAgICBydWxlcyBhcmUgZm9sbG93ZWQsIGJ1dCBJUCBhZGRyZXNzZXMgYXJlIG5vdCBhY2NlcHRlZCBmb3IgKmhvc3RuYW1lKi4KCiAgICAgICAgQ2VydGlmaWNhdGVFcnJvciBpcyByYWlzZWQgb24gZmFpbHVyZS4gT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uCiAgICAgICAgcmV0dXJucyBub3RoaW5nLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBjZXJ0OgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJlbXB0eSBvciBubyBjZXJ0aWZpY2F0ZSIpCiAgICAgICAgZG5zbmFtZXMgPSBbXQogICAgICAgIHNhbiA9IGNlcnQuZ2V0KCdzdWJqZWN0QWx0TmFtZScsICgpKQogICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNhbjoKICAgICAgICAgICAgaWYga2V5ID09ICdETlMnOgogICAgICAgICAgICAgICAgaWYgX2Ruc25hbWVfbWF0Y2godmFsdWUsIGhvc3RuYW1lKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgICAgICBpZiBub3QgZG5zbmFtZXM6CiAgICAgICAgICAgICMgVGhlIHN1YmplY3QgaXMgb25seSBjaGVja2VkIHdoZW4gdGhlcmUgaXMgbm8gZE5TTmFtZSBlbnRyeQogICAgICAgICAgICAjIGluIHN1YmplY3RBbHROYW1lCiAgICAgICAgICAgIGZvciBzdWIgaW4gY2VydC5nZXQoJ3N1YmplY3QnLCAoKSk6CiAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzdWI6CiAgICAgICAgICAgICAgICAgICAgIyBYWFggYWNjb3JkaW5nIHRvIFJGQyAyODE4LCB0aGUgbW9zdCBzcGVjaWZpYyBDb21tb24gTmFtZQogICAgICAgICAgICAgICAgICAgICMgbXVzdCBiZSB1c2VkLgogICAgICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnY29tbW9uTmFtZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIF9kbnNuYW1lX21hdGNoKHZhbHVlLCBob3N0bmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgICAgIGlmIGxlbihkbnNuYW1lcykgPiAxOgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJob3N0bmFtZSAlciAiCiAgICAgICAgICAgICAgICAiZG9lc24ndCBtYXRjaCBlaXRoZXIgb2YgJXMiCiAgICAgICAgICAgICAgICAlIChob3N0bmFtZSwgJywgJy5qb2luKG1hcChyZXByLCBkbnNuYW1lcykpKSkKICAgICAgICBlbGlmIGxlbihkbnNuYW1lcykgPT0gMToKICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigiaG9zdG5hbWUgJXIgIgogICAgICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggJXIiCiAgICAgICAgICAgICAgICAlIChob3N0bmFtZSwgZG5zbmFtZXNbMF0pKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoIm5vIGFwcHJvcHJpYXRlIGNvbW1vbk5hbWUgb3IgIgogICAgICAgICAgICAgICAgInN1YmplY3RBbHROYW1lIGZpZWxkcyB3ZXJlIGZvdW5kIikKCgpjbGFzcyBWZXJpZnlpbmdIVFRQU0hhbmRsZXIoSFRUUFNIYW5kbGVyKToKICAgICIiIlNpbXBsZSB2ZXJpZnlpbmcgaGFuZGxlcjogbm8gYXV0aCwgc3ViY2xhc3NlcywgdGltZW91dHMsIGV0Yy4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY2FfYnVuZGxlKToKICAgICAgICBzZWxmLmNhX2J1bmRsZSA9IGNhX2J1bmRsZQogICAgICAgIEhUVFBTSGFuZGxlci5fX2luaXRfXyhzZWxmKQoKICAgIGRlZiBodHRwc19vcGVuKHNlbGYsIHJlcSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZG9fb3BlbigKICAgICAgICAgICAgbGFtYmRhIGhvc3QsICoqa3c6IFZlcmlmeWluZ0hUVFBTQ29ubihob3N0LCBzZWxmLmNhX2J1bmRsZSwgKiprdyksIHJlcQogICAgICAgICkKCgpjbGFzcyBWZXJpZnlpbmdIVFRQU0Nvbm4oSFRUUFNDb25uZWN0aW9uKToKICAgICIiIlNpbXBsZSB2ZXJpZnlpbmcgY29ubmVjdGlvbjogbm8gYXV0aCwgc3ViY2xhc3NlcywgdGltZW91dHMsIGV0Yy4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgY2FfYnVuZGxlLCAqKmt3KToKICAgICAgICBIVFRQU0Nvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgaG9zdCwgKiprdykKICAgICAgICBzZWxmLmNhX2J1bmRsZSA9IGNhX2J1bmRsZQoKICAgIGRlZiBjb25uZWN0KHNlbGYpOgogICAgICAgIHNvY2sgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oCiAgICAgICAgICAgIChzZWxmLmhvc3QsIHNlbGYucG9ydCksIGdldGF0dHIoc2VsZiwgJ3NvdXJjZV9hZGRyZXNzJywgTm9uZSkKICAgICAgICApCgogICAgICAgICMgSGFuZGxlIHRoZSBzb2NrZXQgaWYgYSAocHJveHkpIHR1bm5lbCBpcyBwcmVzZW50CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnX3R1bm5lbCcpIGFuZCBnZXRhdHRyKHNlbGYsICdfdHVubmVsX2hvc3QnLCBOb25lKToKICAgICAgICAgICAgc2VsZi5zb2NrID0gc29jawogICAgICAgICAgICBzZWxmLl90dW5uZWwoKQogICAgICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU3Nzc2OiBQeXRob24+PTMuNC4xIGFuZCA+PTIuNy43CiAgICAgICAgICAgICMgY2hhbmdlIHNlbGYuaG9zdCB0byBtZWFuIHRoZSBwcm94eSBzZXJ2ZXIgaG9zdCB3aGVuIHR1bm5lbGluZyBpcwogICAgICAgICAgICAjIGJlaW5nIHVzZWQuIEFkYXB0LCBzaW5jZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgZGVzdGluYXRpb24KICAgICAgICAgICAgIyBob3N0IGZvciB0aGUgbWF0Y2hfaG9zdG5hbWUoKSBjb21wYXJpc29uLgogICAgICAgICAgICBhY3R1YWxfaG9zdCA9IHNlbGYuX3R1bm5lbF9ob3N0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgYWN0dWFsX2hvc3QgPSBzZWxmLmhvc3QKCiAgICAgICAgaWYgaGFzYXR0cihzc2wsICdjcmVhdGVfZGVmYXVsdF9jb250ZXh0Jyk6CiAgICAgICAgICAgIGN0eCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KGNhZmlsZT1zZWxmLmNhX2J1bmRsZSkKICAgICAgICAgICAgc2VsZi5zb2NrID0gY3R4LndyYXBfc29ja2V0KHNvY2ssIHNlcnZlcl9ob3N0bmFtZT1hY3R1YWxfaG9zdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFRoaXMgaXMgZm9yIHB5dGhvbiA8IDIuNy45IGFuZCA8IDMuND8KICAgICAgICAgICAgc2VsZi5zb2NrID0gc3NsLndyYXBfc29ja2V0KAogICAgICAgICAgICAgICAgc29jaywgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1zZWxmLmNhX2J1bmRsZQogICAgICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBtYXRjaF9ob3N0bmFtZShzZWxmLnNvY2suZ2V0cGVlcmNlcnQoKSwgYWN0dWFsX2hvc3QpCiAgICAgICAgZXhjZXB0IENlcnRpZmljYXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuc29jay5zaHV0ZG93bihzb2NrZXQuU0hVVF9SRFdSKQogICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQogICAgICAgICAgICByYWlzZQoKCmRlZiBvcGVuZXJfZm9yKGNhX2J1bmRsZT1Ob25lKToKICAgICIiIkdldCBhIHVybG9wZW4oKSByZXBsYWNlbWVudCB0aGF0IHVzZXMgY2FfYnVuZGxlIGZvciB2ZXJpZmljYXRpb24iIiIKICAgIHJldHVybiB1cmxsaWIucmVxdWVzdC5idWlsZF9vcGVuZXIoCiAgICAgICAgVmVyaWZ5aW5nSFRUUFNIYW5kbGVyKGNhX2J1bmRsZSBvciBmaW5kX2NhX2J1bmRsZSgpKQogICAgKS5vcGVuCgoKIyBmcm9tIGphcmFjby5mdW5jdG9vbHMKZGVmIG9uY2UoZnVuYyk6CiAgICBAZnVuY3Rvb2xzLndyYXBzKGZ1bmMpCiAgICBkZWYgd3JhcHBlcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKGZ1bmMsICdhbHdheXNfcmV0dXJucycpOgogICAgICAgICAgICBmdW5jLmFsd2F5c19yZXR1cm5zID0gZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIGZ1bmMuYWx3YXlzX3JldHVybnMKICAgIHJldHVybiB3cmFwcGVyCgoKQG9uY2UKZGVmIGdldF93aW5fY2VydGZpbGUoKToKICAgIHRyeToKICAgICAgICBpbXBvcnQgd2luY2VydHN0b3JlCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBjbGFzcyBDZXJ0RmlsZSh3aW5jZXJ0c3RvcmUuQ2VydEZpbGUpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc3VwZXIoQ2VydEZpbGUsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICAgICAgYXRleGl0LnJlZ2lzdGVyKHNlbGYuY2xvc2UpCgogICAgICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc3VwZXIoQ2VydEZpbGUsIHNlbGYpLmNsb3NlKCkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgX3dpbmNlcnRzID0gQ2VydEZpbGUoKQogICAgX3dpbmNlcnRzLmFkZHN0b3JlKCdDQScpCiAgICBfd2luY2VydHMuYWRkc3RvcmUoJ1JPT1QnKQogICAgcmV0dXJuIF93aW5jZXJ0cy5uYW1lCgoKZGVmIGZpbmRfY2FfYnVuZGxlKCk6CiAgICAiIiJSZXR1cm4gYW4gZXhpc3RpbmcgQ0EgYnVuZGxlIHBhdGgsIG9yIE5vbmUiIiIKICAgIGV4dGFudF9jZXJ0X3BhdGhzID0gZmlsdGVyKG9zLnBhdGguaXNmaWxlLCBjZXJ0X3BhdGhzKQogICAgcmV0dXJuICgKICAgICAgICBnZXRfd2luX2NlcnRmaWxlKCkKICAgICAgICBvciBuZXh0KGV4dGFudF9jZXJ0X3BhdGhzLCBOb25lKQogICAgICAgIG9yIF9jZXJ0aWZpX3doZXJlKCkKICAgICkKCgpkZWYgX2NlcnRpZmlfd2hlcmUoKToKICAgIHRyeToKICAgICAgICByZXR1cm4gX19pbXBvcnRfXygnY2VydGlmaScpLndoZXJlKCkKICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIFJlc29sdXRpb25FcnJvciwgRXh0cmFjdGlvbkVycm9yKToKICAgICAgICBwYXNzClBLAwQUAAAAAAAAACEAmkLXmuQDAADkAwAAMwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvdW5pY29kZV91dGlscy5weWltcG9ydCB1bmljb2RlZGF0YQppbXBvcnQgc3lzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCgojIEhGUyBQbHVzIHVzZXMgZGVjb21wb3NlZCBVVEYtOApkZWYgZGVjb21wb3NlKHBhdGgpOgogICAgaWYgaXNpbnN0YW5jZShwYXRoLCBzaXgudGV4dF90eXBlKToKICAgICAgICByZXR1cm4gdW5pY29kZWRhdGEubm9ybWFsaXplKCdORkQnLCBwYXRoKQogICAgdHJ5OgogICAgICAgIHBhdGggPSBwYXRoLmRlY29kZSgndXRmLTgnKQogICAgICAgIHBhdGggPSB1bmljb2RlZGF0YS5ub3JtYWxpemUoJ05GRCcsIHBhdGgpCiAgICAgICAgcGF0aCA9IHBhdGguZW5jb2RlKCd1dGYtOCcpCiAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgIHBhc3MgICMgTm90IFVURi04CiAgICByZXR1cm4gcGF0aAoKCmRlZiBmaWxlc3lzX2RlY29kZShwYXRoKToKICAgICIiIgogICAgRW5zdXJlIHRoYXQgdGhlIGdpdmVuIHBhdGggaXMgZGVjb2RlZCwKICAgIE5PTkUgd2hlbiBubyBleHBlY3RlZCBlbmNvZGluZyB3b3JrcwogICAgIiIiCgogICAgaWYgaXNpbnN0YW5jZShwYXRoLCBzaXgudGV4dF90eXBlKToKICAgICAgICByZXR1cm4gcGF0aAoKICAgIGZzX2VuYyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSBvciAndXRmLTgnCiAgICBjYW5kaWRhdGVzID0gZnNfZW5jLCAndXRmLTgnCgogICAgZm9yIGVuYyBpbiBjYW5kaWRhdGVzOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHBhdGguZGVjb2RlKGVuYykKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICBjb250aW51ZQoKCmRlZiB0cnlfZW5jb2RlKHN0cmluZywgZW5jKToKICAgICJ0dXJuIHVuaWNvZGUgZW5jb2RpbmcgaW50byBhIGZ1bmN0aW9uYWwgcm91dGluZSIKICAgIHRyeToKICAgICAgICByZXR1cm4gc3RyaW5nLmVuY29kZShlbmMpCiAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgIHJldHVybiBOb25lClBLAwQUAAAAAAAAACEASLFMYpAAAACQAAAALQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvdmVyc2lvbi5weWltcG9ydCBwa2dfcmVzb3VyY2VzCgp0cnk6CiAgICBfX3ZlcnNpb25fXyA9IHBrZ19yZXNvdXJjZXMuZ2V0X2Rpc3RyaWJ1dGlvbignc2V0dXB0b29scycpLnZlcnNpb24KZXhjZXB0IEV4Y2VwdGlvbjoKICAgIF9fdmVyc2lvbl9fID0gJ3Vua25vd24nClBLAwQUAAAAAAAAACEAcB0I80EcAABBHAAAKwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvd2hlZWwucHknJydXaGVlbHMgc3VwcG9ydC4nJycKCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQppbXBvcnQgZW1haWwKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCB6aXBmaWxlCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IERpc3RyaWJ1dGlvbiwgUGF0aE1ldGFkYXRhLCBwYXJzZV92ZXJzaW9uCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4uc2l4IGltcG9ydCBQWTMKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBEaXN0cmlidXRpb24gYXMgU2V0dXB0b29sc0Rpc3RyaWJ1dGlvbgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHBlcDQyNXRhZ3MKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm8gaW1wb3J0IHdyaXRlX3JlcXVpcmVtZW50cwoKCldIRUVMX05BTUUgPSByZS5jb21waWxlKAogICAgciIiIl4oP1A8cHJvamVjdF9uYW1lPi4rPyktKD9QPHZlcnNpb24+XGQuKj8pCiAgICAoKC0oP1A8YnVpbGQ+XGQuKj8pKT8tKD9QPHB5X3ZlcnNpb24+Lis/KS0oP1A8YWJpPi4rPyktKD9QPHBsYXRmb3JtPi4rPykKICAgIClcLndobCQiIiIsCnJlLlZFUkJPU0UpLm1hdGNoCgpOQU1FU1BBQ0VfUEFDS0FHRV9JTklUID0gJycnXAp0cnk6CiAgICBfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzJykuZGVjbGFyZV9uYW1lc3BhY2UoX19uYW1lX18pCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIF9fcGF0aF9fID0gX19pbXBvcnRfXygncGtndXRpbCcpLmV4dGVuZF9wYXRoKF9fcGF0aF9fLCBfX25hbWVfXykKJycnCgoKZGVmIHVucGFjayhzcmNfZGlyLCBkc3RfZGlyKToKICAgICcnJ01vdmUgZXZlcnl0aGluZyB1bmRlciBgc3JjX2RpcmAgdG8gYGRzdF9kaXJgLCBhbmQgZGVsZXRlIHRoZSBmb3JtZXIuJycnCiAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKHNyY19kaXIpOgogICAgICAgIHN1YmRpciA9IG9zLnBhdGgucmVscGF0aChkaXJwYXRoLCBzcmNfZGlyKQogICAgICAgIGZvciBmIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGYpCiAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihkc3RfZGlyLCBzdWJkaXIsIGYpCiAgICAgICAgICAgIG9zLnJlbmFtZXMoc3JjLCBkc3QpCiAgICAgICAgZm9yIG4sIGQgaW4gcmV2ZXJzZWQobGlzdChlbnVtZXJhdGUoZGlybmFtZXMpKSk6CiAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBkKQogICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZHN0X2Rpciwgc3ViZGlyLCBkKQogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZHN0KToKICAgICAgICAgICAgICAgICMgRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGluIGRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgIyByZW5hbWUgaXQgYW5kIHBydW5lIGl0IGZyb20gb3Mud2FsayBsaXN0LgogICAgICAgICAgICAgICAgb3MucmVuYW1lcyhzcmMsIGRzdCkKICAgICAgICAgICAgICAgIGRlbCBkaXJuYW1lc1tuXQogICAgIyBDbGVhbnVwLgogICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhzcmNfZGlyLCB0b3Bkb3duPVRydWUpOgogICAgICAgIGFzc2VydCBub3QgZmlsZW5hbWVzCiAgICAgICAgb3Mucm1kaXIoZGlycGF0aCkKCgpjbGFzcyBXaGVlbChvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgbWF0Y2ggPSBXSEVFTF9OQU1FKG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKQogICAgICAgIGlmIG1hdGNoIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ludmFsaWQgd2hlZWwgbmFtZTogJXInICUgZmlsZW5hbWUpCiAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgZm9yIGssIHYgaW4gbWF0Y2guZ3JvdXBkaWN0KCkuaXRlbXMoKToKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrLCB2KQoKICAgIGRlZiB0YWdzKHNlbGYpOgogICAgICAgICcnJ0xpc3QgdGFncyAocHlfdmVyc2lvbiwgYWJpLCBwbGF0Zm9ybSkgc3VwcG9ydGVkIGJ5IHRoaXMgd2hlZWwuJycnCiAgICAgICAgcmV0dXJuIGl0ZXJ0b29scy5wcm9kdWN0KHNlbGYucHlfdmVyc2lvbi5zcGxpdCgnLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFiaS5zcGxpdCgnLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBsYXRmb3JtLnNwbGl0KCcuJykpCgogICAgZGVmIGlzX2NvbXBhdGlibGUoc2VsZik6CiAgICAgICAgJycnSXMgdGhlIHdoZWVsIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBwbGF0Zm9ybT8nJycKICAgICAgICBzdXBwb3J0ZWRfdGFncyA9IHBlcDQyNXRhZ3MuZ2V0X3N1cHBvcnRlZCgpCiAgICAgICAgcmV0dXJuIG5leHQoKFRydWUgZm9yIHQgaW4gc2VsZi50YWdzKCkgaWYgdCBpbiBzdXBwb3J0ZWRfdGFncyksIEZhbHNlKQoKICAgIGRlZiBlZ2dfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBwcm9qZWN0X25hbWU9c2VsZi5wcm9qZWN0X25hbWUsIHZlcnNpb249c2VsZi52ZXJzaW9uLAogICAgICAgICAgICBwbGF0Zm9ybT0oTm9uZSBpZiBzZWxmLnBsYXRmb3JtID09ICdhbnknIGVsc2UgZ2V0X3BsYXRmb3JtKCkpLAogICAgICAgICkuZWdnX25hbWUoKSArICcuZWdnJwoKICAgIGRlZiBpbnN0YWxsX2FzX2VnZyhzZWxmLCBkZXN0aW5hdGlvbl9lZ2dkaXIpOgogICAgICAgICcnJ0luc3RhbGwgd2hlZWwgYXMgYW4gZWdnIGRpcmVjdG9yeS4nJycKICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShzZWxmLmZpbGVuYW1lKSBhcyB6ZjoKICAgICAgICAgICAgZGlzdF9iYXNlbmFtZSA9ICclcy0lcycgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICAgICAgZGlzdF9pbmZvID0gJyVzLmRpc3QtaW5mbycgJSBkaXN0X2Jhc2VuYW1lCiAgICAgICAgICAgIGRpc3RfZGF0YSA9ICclcy5kYXRhJyAlIGRpc3RfYmFzZW5hbWUKICAgICAgICAgICAgZGVmIGdldF9tZXRhZGF0YShuYW1lKToKICAgICAgICAgICAgICAgIHdpdGggemYub3BlbignJXMvJXMnICUgKGRpc3RfaW5mbywgbmFtZSkpIGFzIGZwOgogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZnAucmVhZCgpLmRlY29kZSgndXRmLTgnKSBpZiBQWTMgZWxzZSBmcC5yZWFkKCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1haWwucGFyc2VyLlBhcnNlcigpLnBhcnNlc3RyKHZhbHVlKQogICAgICAgICAgICB3aGVlbF9tZXRhZGF0YSA9IGdldF9tZXRhZGF0YSgnV0hFRUwnKQogICAgICAgICAgICBkaXN0X21ldGFkYXRhID0gZ2V0X21ldGFkYXRhKCdNRVRBREFUQScpCiAgICAgICAgICAgICMgQ2hlY2sgd2hlZWwgZm9ybWF0IHZlcnNpb24gaXMgc3VwcG9ydGVkLgogICAgICAgICAgICB3aGVlbF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbih3aGVlbF9tZXRhZGF0YS5nZXQoJ1doZWVsLVZlcnNpb24nKSkKICAgICAgICAgICAgaWYgbm90IHBhcnNlX3ZlcnNpb24oJzEuMCcpIDw9IHdoZWVsX3ZlcnNpb24gPCBwYXJzZV92ZXJzaW9uKCcyLjBkZXYwJyk6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd1bnN1cHBvcnRlZCB3aGVlbCBmb3JtYXQgdmVyc2lvbjogJXMnICUgd2hlZWxfdmVyc2lvbikKICAgICAgICAgICAgIyBFeHRyYWN0IHRvIHRhcmdldCBkaXJlY3RvcnkuCiAgICAgICAgICAgIG9zLm1rZGlyKGRlc3RpbmF0aW9uX2VnZ2RpcikKICAgICAgICAgICAgemYuZXh0cmFjdGFsbChkZXN0aW5hdGlvbl9lZ2dkaXIpCiAgICAgICAgICAgICMgQ29udmVydCBtZXRhZGF0YS4KICAgICAgICAgICAgZGlzdF9pbmZvID0gb3MucGF0aC5qb2luKGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9pbmZvKQogICAgICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24oCiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfaW5mbywKICAgICAgICAgICAgICAgIG1ldGFkYXRhPVBhdGhNZXRhZGF0YShkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfaW5mbykKICAgICAgICAgICAgKQogICAgICAgICAgICAjIE5vdGU6IHdlIG5lZWQgdG8gZXZhbHVhdGUgYW5kIHN0cmlwIG1hcmtlcnMgbm93LAogICAgICAgICAgICAjIGFzIHdlIGNhbid0IGVhc2lseSBjb252ZXJ0IGJhY2sgZnJvbSB0aGUgc3ludGF4OgogICAgICAgICAgICAjIGZvb2JhcjsgImxpbnV4IiBpbiBzeXNfcGxhdGZvcm0gYW5kIGV4dHJhID09ICd0ZXN0JwogICAgICAgICAgICBkZWYgcmF3X3JlcShyZXEpOgogICAgICAgICAgICAgICAgcmVxLm1hcmtlciA9IE5vbmUKICAgICAgICAgICAgICAgIHJldHVybiBzdHIocmVxKQogICAgICAgICAgICBpbnN0YWxsX3JlcXVpcmVzID0gbGlzdChzb3J0ZWQobWFwKHJhd19yZXEsIGRpc3QucmVxdWlyZXMoKSkpKQogICAgICAgICAgICBleHRyYXNfcmVxdWlyZSA9IHsKICAgICAgICAgICAgICAgIGV4dHJhOiBsaXN0KHNvcnRlZCgKICAgICAgICAgICAgICAgICAgICByZXEKICAgICAgICAgICAgICAgICAgICBmb3IgcmVxIGluIG1hcChyYXdfcmVxLCBkaXN0LnJlcXVpcmVzKChleHRyYSwpKSkKICAgICAgICAgICAgICAgICAgICBpZiByZXEgbm90IGluIGluc3RhbGxfcmVxdWlyZXMKICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgICAgICBmb3IgZXh0cmEgaW4gZGlzdC5leHRyYXMKICAgICAgICAgICAgfQogICAgICAgICAgICBlZ2dfaW5mbyA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsICdFR0ctSU5GTycpCiAgICAgICAgICAgIG9zLnJlbmFtZShkaXN0X2luZm8sIGVnZ19pbmZvKQogICAgICAgICAgICBvcy5yZW5hbWUob3MucGF0aC5qb2luKGVnZ19pbmZvLCAnTUVUQURBVEEnKSwKICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ1BLRy1JTkZPJykpCiAgICAgICAgICAgIHNldHVwX2Rpc3QgPSBTZXR1cHRvb2xzRGlzdHJpYnV0aW9uKGF0dHJzPWRpY3QoCiAgICAgICAgICAgICAgICBpbnN0YWxsX3JlcXVpcmVzPWluc3RhbGxfcmVxdWlyZXMsCiAgICAgICAgICAgICAgICBleHRyYXNfcmVxdWlyZT1leHRyYXNfcmVxdWlyZSwKICAgICAgICAgICAgKSkKICAgICAgICAgICAgd3JpdGVfcmVxdWlyZW1lbnRzKHNldHVwX2Rpc3QuZ2V0X2NvbW1hbmRfb2JqKCdlZ2dfaW5mbycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgb3MucGF0aC5qb2luKGVnZ19pbmZvLCAncmVxdWlyZXMudHh0JykpCiAgICAgICAgICAgICMgTW92ZSBkYXRhIGVudHJpZXMgdG8gdGhlaXIgY29ycmVjdCBsb2NhdGlvbi4KICAgICAgICAgICAgZGlzdF9kYXRhID0gb3MucGF0aC5qb2luKGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9kYXRhKQogICAgICAgICAgICBkaXN0X2RhdGFfc2NyaXB0cyA9IG9zLnBhdGguam9pbihkaXN0X2RhdGEsICdzY3JpcHRzJykKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGlzdF9kYXRhX3NjcmlwdHMpOgogICAgICAgICAgICAgICAgZWdnX2luZm9fc2NyaXB0cyA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFR0ctSU5GTycsICdzY3JpcHRzJykKICAgICAgICAgICAgICAgIG9zLm1rZGlyKGVnZ19pbmZvX3NjcmlwdHMpCiAgICAgICAgICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihkaXN0X2RhdGFfc2NyaXB0cyk6CiAgICAgICAgICAgICAgICAgICAgIyBSZW1vdmUgYnl0ZWNvZGUsIGFzIGl0J3Mgbm90IHByb3Blcmx5IGhhbmRsZWQKICAgICAgICAgICAgICAgICAgICAjIGR1cmluZyBlYXN5X2luc3RhbGwgc2NyaXB0cyBpbnN0YWxsIHBoYXNlLgogICAgICAgICAgICAgICAgICAgIGlmIGVudHJ5LmVuZHN3aXRoKCcucHljJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4oZGlzdF9kYXRhX3NjcmlwdHMsIGVudHJ5KSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvcy5yZW5hbWUob3MucGF0aC5qb2luKGRpc3RfZGF0YV9zY3JpcHRzLCBlbnRyeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZWdnX2luZm9fc2NyaXB0cywgZW50cnkpKQogICAgICAgICAgICAgICAgb3Mucm1kaXIoZGlzdF9kYXRhX3NjcmlwdHMpCiAgICAgICAgICAgIGZvciBzdWJkaXIgaW4gZmlsdGVyKG9zLnBhdGguZXhpc3RzLCAoCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGlzdF9kYXRhLCBkKQogICAgICAgICAgICAgICAgZm9yIGQgaW4gKCdkYXRhJywgJ2hlYWRlcnMnLCAncHVyZWxpYicsICdwbGF0bGliJykKICAgICAgICAgICAgKSk6CiAgICAgICAgICAgICAgICB1bnBhY2soc3ViZGlyLCBkZXN0aW5hdGlvbl9lZ2dkaXIpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpc3RfZGF0YSk6CiAgICAgICAgICAgICAgICBvcy5ybWRpcihkaXN0X2RhdGEpCiAgICAgICAgICAgICMgRml4IG5hbWVzcGFjZSBwYWNrYWdlcy4KICAgICAgICAgICAgbmFtZXNwYWNlX3BhY2thZ2VzID0gb3MucGF0aC5qb2luKGVnZ19pbmZvLCAnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG5hbWVzcGFjZV9wYWNrYWdlcyk6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4obmFtZXNwYWNlX3BhY2thZ2VzKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VfcGFja2FnZXMgPSBmcC5yZWFkKCkuc3BsaXQoKQogICAgICAgICAgICAgICAgZm9yIG1vZCBpbiBuYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgICAgICAgICAgbW9kX2RpciA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsICptb2Quc3BsaXQoJy4nKSkKICAgICAgICAgICAgICAgICAgICBtb2RfaW5pdCA9IG9zLnBhdGguam9pbihtb2RfZGlyLCAnX19pbml0X18ucHknKQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG1vZF9kaXIpIGFuZCBub3Qgb3MucGF0aC5leGlzdHMobW9kX2luaXQpOgogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4obW9kX2luaXQsICd3JykgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcC53cml0ZShOQU1FU1BBQ0VfUEFDS0FHRV9JTklUKQpQSwMEFAAAAAAAAAAhAPnL7g3KAgAAygIAADUAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3dpbmRvd3Nfc3VwcG9ydC5weWltcG9ydCBwbGF0Zm9ybQppbXBvcnQgY3R5cGVzCgoKZGVmIHdpbmRvd3Nfb25seShmdW5jKToKICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpICE9ICdXaW5kb3dzJzoKICAgICAgICByZXR1cm4gbGFtYmRhICphcmdzLCAqKmt3YXJnczogTm9uZQogICAgcmV0dXJuIGZ1bmMKCgpAd2luZG93c19vbmx5CmRlZiBoaWRlX2ZpbGUocGF0aCk6CiAgICAiIiIKICAgIFNldCB0aGUgaGlkZGVuIGF0dHJpYnV0ZSBvbiBhIGZpbGUgb3IgZGlyZWN0b3J5LgoKICAgIEZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTYyMjEzMy8KCiAgICBgcGF0aGAgbXVzdCBiZSB0ZXh0LgogICAgIiIiCiAgICBfX2ltcG9ydF9fKCdjdHlwZXMud2ludHlwZXMnKQogICAgU2V0RmlsZUF0dHJpYnV0ZXMgPSBjdHlwZXMud2luZGxsLmtlcm5lbDMyLlNldEZpbGVBdHRyaWJ1dGVzVwogICAgU2V0RmlsZUF0dHJpYnV0ZXMuYXJndHlwZXMgPSBjdHlwZXMud2ludHlwZXMuTFBXU1RSLCBjdHlwZXMud2ludHlwZXMuRFdPUkQKICAgIFNldEZpbGVBdHRyaWJ1dGVzLnJlc3R5cGUgPSBjdHlwZXMud2ludHlwZXMuQk9PTAoKICAgIEZJTEVfQVRUUklCVVRFX0hJRERFTiA9IDB4MDIKCiAgICByZXQgPSBTZXRGaWxlQXR0cmlidXRlcyhwYXRoLCBGSUxFX0FUVFJJQlVURV9ISURERU4pCiAgICBpZiBub3QgcmV0OgogICAgICAgIHJhaXNlIGN0eXBlcy5XaW5FcnJvcigpClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAEgAAAHN1YnBhci9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAGgAAAHN1YnBhci9ydW50aW1lL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQCPoHM8ty4AALcuAAAZAAAAc3VicGFyL3J1bnRpbWUvc3VwcG9ydC5weSMgQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIwojIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAojIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiIiIlJ1bnRpbWUgc3VwcG9ydCBjb2RlIGZvciBleGVjdXRhYmxlcyBjcmVhdGVkIGJ5IFN1YnBhci4KCjEuIFRoaXJkLXBhcnR5IG1vZHVsZXMgcmVxdWlyZSBzb21lIFBZVEhPTlBBVEggbWFuaXB1bGF0aW9uLgoKMi4gUHl0aG9uIGNhbiBuYXRpdmVseSBpbXBvcnQgcHl0aG9uIG1vZHVsZXMgZnJvbSBhIHppcCBhcmNoaXZlLCBidXQKICAgQyBleHRlbnNpb24gbW9kdWxlcyByZXF1aXJlIHNvbWUgaGVscC4KCjMuIFJlc291cmNlcyBzdG9yZWQgaW4gYSAucGFyIGZpbGUgbWF5IG5lZWQgdG8gYmUgZXhwb3NlZCBhcyBPUy1sZXZlbAogICBmaWxlcyBpbnN0ZWFkIG9mIFB5dGhvbiBGaWxlIG9iamVjdHMuCgpXZSBob29rIGludG8gdGhlIHBrZ19yZXNvdXJjZXMgbW9kdWxlLCBpZiBwcmVzZW50LCB0byBhY2hpZXZlIDIgYW5kIDMuCgpMaW1pdGF0aW9uczoKCkEuIFJldHJpZXZpbmcgcmVzb3VyY2VzIGZyb20gcGFja2FnZXMKCkl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBkbyB0aGlzOgogICAgZm4gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCdteXBhY2thZ2UnLCAnbXlmaWxlJykKQnV0IGluc3RlYWQgb25lIG11c3QgZG8KICAgIGZuID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgKICAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnQucGFyc2Uuc3BlYygnbXlwYWNrYWdlJyksCiAgICAgICAgICAgICAnbXlmaWxlJykKCkIuIEV4dHJhY3Rpb24gZGlyCgpZb3Ugc2hvdWxkIGV4cGxpY2l0bHkgc2V0IHRoZSBkZWZhdWx0IGV4dHJhY3Rpb24gZGlyZWN0b3J5LCB2aWEKYHBrZ19yZXNvdXJjZXMuc2V0X2V4dHJhY3Rpb25fcGF0aChteV9kaXJlY3RvcnkpYCwgc2luY2UgdGhlIGRlZmF1bHQKaXMgbm90IHNhZmUuICBGb3IgZXhhbXBsZToKCiAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIHBrZ19yZXNvdXJjZXMuc2V0X2V4dHJhY3Rpb24odG1wZGlyKQoKWW91IHNob3VsZCBhcnJhbmdlIGZvciB0aGF0IGRpcmVjdG9yeSB0byBiZSBkZWxldGVkIGF0IHNvbWUgcG9pbnQuCk5vdGUgdGhhdCBwa2dfcmVzb3VyY2VzLmNsZWFudXBfcmVzb3VyY2VzKCkgaXMgYW4gdW5pbXBsZW1lbnRlZCBuby1vcCwKc28gdXNlIHNvbWV0aGluZyBlbHNlLiAgRm9yIGV4YW1wbGU6CgogICAgYXRleGl0LnJlZ2lzdGVyKGxhbWJkYTogc2h1dGlsLnJtdHJlZSh0bXBkaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkpCgoiIiIKCmltcG9ydCBhdGV4aXQKaW1wb3J0IG9zCmltcG9ydCBwa2d1dGlsCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCB6aXBmaWxlCmltcG9ydCB6aXBpbXBvcnQKCgpkZWYgX2xvZyhtc2cpOgogICAgIiIiUHJpbnQgYSBkZWJ1Z2dpbmcgbWVzc2FnZSBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgcHl0aG9uIC12diBvdXRwdXQiIiIKICAgIGlmIHN5cy5mbGFncy52ZXJib3NlOgogICAgICAgIHN5cy5zdGRlcnIud3JpdGUobXNnKQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1xuJykKCgpkZWYgX2ZpbmRfYXJjaGl2ZSgpOgogICAgIiIiRmluZCB0aGUgcGF0aCB0byB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyAucGFyIGZpbGUKCiAgICBXZSBkb24ndCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgcHJlZml4IGlzIG5vbi1lbXB0eS4KICAgICIiIgogICAgbWFpbiA9IHN5cy5tb2R1bGVzLmdldCgnX19tYWluX18nKQogICAgaWYgbm90IG1haW46CiAgICAgICAgX2xvZygnIyBfX21haW5fXyBtb2R1bGUgbm90IGZvdW5kJykKICAgICAgICByZXR1cm4gTm9uZQogICAgbWFpbl9sb2FkZXIgPSBnZXRhdHRyKG1haW4sICdfX2xvYWRlcl9fJykKICAgIGlmIG5vdCBtYWluX2xvYWRlcjoKICAgICAgICBfbG9nKCcjIF9fbWFpbl9fLl9fbG9hZGVyX18gbm90IHNldCcpCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHByZWZpeCA9IGdldGF0dHIobWFpbl9sb2FkZXIsICdwcmVmaXgnKQogICAgaWYgcHJlZml4ICE9ICcnOgogICAgICAgIF9sb2coJyMgdW5leHBlY3RlZCBwcmVmaXggZm9yIF9fbWFpbl9fLl9fbG9hZGVyX18gaXMgJXMnICUKICAgICAgICAgICAgIG1haW5fbG9hZGVyLnByZWZpeCkKICAgICAgICByZXR1cm4gTm9uZQogICAgYXJjaGl2ZV9wYXRoID0gZ2V0YXR0cihtYWluX2xvYWRlciwgJ2FyY2hpdmUnKQogICAgaWYgbm90IGFyY2hpdmVfcGF0aDoKICAgICAgICBfbG9nKCcjIG1pc3NpbmcgYXJjaGl2ZSBmb3IgX19tYWluX18uX19sb2FkZXJfXycpCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHJldHVybiBhcmNoaXZlX3BhdGgKCgpkZWYgX2V4dHJhY3RfZmlsZXMoYXJjaGl2ZV9wYXRoKToKICAgICIiIkV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIHRoaXMgLnBhciBmaWxlIHRvIGRpc2suCgogICAgVGhpcyBjcmVhdGVzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYW5kIHJlZ2lzdGVycyBhbiBhdGV4aXQKICAgIGhhbmRsZXIgdG8gY2xlYW4gdGhhdCBkaXJlY3Rvcnkgb24gcHJvZ3JhbSBleGl0LiAgRXh0cmFjdGlvbiBhbmQKICAgIGNsZWFudXAgd2lsbCBwb3RlbnRpYWxseSB1c2Ugc2lnbmlmaWNhbnQgdGltZSBhbmQgZGlzayBzcGFjZS4KCiAgICBSZXR1cm5zOgogICAgICAgIERpcmVjdG9yeSB3aGVyZSBjb250ZW50cyB3ZXJlIGV4dHJhY3RlZCB0by4KICAgICIiIgogICAgZXh0cmFjdF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKCiAgICBkZWYgX2V4dHJhY3RfZmlsZXNfY2xlYW51cCgpOgogICAgICAgIHNodXRpbC5ybXRyZWUoZXh0cmFjdF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKICAgIGF0ZXhpdC5yZWdpc3RlcihfZXh0cmFjdF9maWxlc19jbGVhbnVwKQogICAgX2xvZygnIyBleHRyYWN0aW5nICVzIHRvICVzJyAlIChhcmNoaXZlX3BhdGgsIGV4dHJhY3RfZGlyKSkKCiAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZShhcmNoaXZlX3BhdGgsIG1vZGU9J3InKQogICAgemlwX2ZpbGUuZXh0cmFjdGFsbChleHRyYWN0X2RpcikKICAgIHppcF9maWxlLmNsb3NlKCkKCiAgICByZXR1cm4gZXh0cmFjdF9kaXIKCgpkZWYgX3ZlcnNpb25fY2hlY2tfcGtnX3Jlc291cmNlcyhwa2dfcmVzb3VyY2VzKToKICAgICIiIkNoZWNrIHRoYXQgcGtnX3Jlc291cmNlcyBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkLiIiIgogICAgIyBDaGVjayB0aGF0IHBrZ19yZXNvdXJjZXMgaXMgbmV3IGVub3VnaC4KICAgICMKICAgICMgRGV0ZXJtaW5pbmcgdGhlIHZlcnNpb24gb2YgYW4gYXJiaXRyYXJpbHkgb2xkIHZlcnNpb24gb2YKICAgICMgcGtnX3Jlc291cmNlcyBpcyB0b3VnaCwgc2luY2UgaXQgZG9lc24ndCBoYXZlIGEgdmVyc2lvbiBsaXRlcmFsLAogICAgIyBhbmQgdGhlIGFjY29tcGFueWluZyBzZXR1cHRvb2xzIHBhY2thZ2UgY29tcHV0ZXMgaXRzIHZlcnNpb24KICAgICMgZHluYW1pY2FsbHkgZnJvbSBtZXRhZGF0YSB0aGF0IG1pZ2h0IG5vdCBleGlzdC4gIEFsc28gc2V0dXB0b29scwogICAgIyBtaWdodCBub3QgZXhpc3QsIGVzcGVjaWFsbHkgaW4gdGhlIGNhc2Ugb2YgdGhlIHBpcC12ZW5kb3JlZCBjb3B5CiAgICAjIG9mIHBrZ19yZXNvdXJjZXMuCiAgICAjCiAgICAjIFdlIGRvIGEgZmVhdHVyZSBkZXRlY3Rpb24gaW5zdGVhZC4gIFdlIGV4YW1pbmUKICAgICMgcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0LmFkZCwgYW5kIHNlZSBpZiBpdCBoYXMgYXQgbGVhc3QgdGhlCiAgICAjIHRoaXJkIGRlZmF1bHQgYXJndW1lbnQgKCdyZXBsYWNlJykuCiAgICB0cnk6CiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICAgICAgICAgIGRlZmF1bHRzID0gcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0LmFkZC5pbV9mdW5jLmZ1bmNfZGVmYXVsdHMKICAgICAgICBlbHNlOgogICAgICAgICAgICBkZWZhdWx0cyA9IHBrZ19yZXNvdXJjZXMuV29ya2luZ1NldC5hZGQuX19kZWZhdWx0c19fCiAgICAgICAgcmV0dXJuIGxlbihkZWZhdWx0cykgPj0gMwogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHJldHVybiBGYWxzZQoKCmRlZiBfc2V0dXBfcGtnX3Jlc291cmNlcyhwa2dfcmVzb3VyY2VzX25hbWUpOgogICAgIiIiU2V0dXAgaG9va3MgaW50byB0aGUgYHBrZ19yZXNvdXJjZXNgIG1vZHVsZQoKICAgIFRoaXMgZW5hYmxlcyB0aGUgcGtnX3Jlc291cmNlcyBtb2R1bGUgdG8gZmluZCBtZXRhZGF0YSBmcm9tIHdoZWVscwogICAgdGhhdCBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gdGhpcyAucGFyIGZpbGUuCgogICAgVGhlIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBoZXJlIGFyZSBzY29wZWQgdG8gdGhpcyBmdW5jdGlvbiwgc2luY2UKICAgIHdlIG1pZ2h0IGhhdmUgbXVsdGl0cGxlIHBrZ19yZXNvdXJjZXMgbW9kdWxlcywgb3Igbm9uZS4KICAgICIiIgoKICAgIHRyeToKICAgICAgICBfX2ltcG9ydF9fKHBrZ19yZXNvdXJjZXNfbmFtZSkKICAgICAgICBwa2dfcmVzb3VyY2VzID0gc3lzLm1vZHVsZXMuZ2V0KHBrZ19yZXNvdXJjZXNfbmFtZSkKICAgICAgICBpZiBwa2dfcmVzb3VyY2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICMgU2tpcCBzZXR1cAogICAgICAgIHJldHVybgoKICAgIGlmIG5vdCBfdmVyc2lvbl9jaGVja19wa2dfcmVzb3VyY2VzKHBrZ19yZXNvdXJjZXMpOgogICAgICAgICMgU2tpcCBzZXR1cAogICAgICAgIHJldHVybgoKICAgIGNsYXNzIERpc3RJbmZvTWV0YWRhdGEocGtnX3Jlc291cmNlcy5FZ2dNZXRhZGF0YSk6CiAgICAgICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIHppcCBmaWxlcyBjb250YWluaW5nIC5kaXN0LWluZm8KCiAgICAgICAgSW4gZmluZF9kaXN0X2luZm9faW5femlwKCksIHdlIGNhbGwKICAgICAgICBtZXRhZGF0YS5yZXNvdXJjZV9saXN0ZGlyKGRpcmVjdG9yeV9uYW1lKS4gIEhvd2V2ZXIsIGl0IGRvZXNuJ3QKICAgICAgICB3b3JrIHdpdGggRWdnTWV0YWRhdGEsIGJlY2F1c2UgX3ppcGluZm9fbmFtZSgpIGV4cGVjdHMgdGhlCiAgICAgICAgZGlyZWN0b3J5IG5hbWUgdG8gZW5kIHdpdGggYSAvLCBidXQgbWV0YWRhdGEuX2xpc3RkaXIoKSB3aGljaAogICAgICAgIGV4cGVjdHMgdGhlIGRpcmVjdG9yeSB0byBfbm90XyBlbmQgd2l0aCBhIC8uCgogICAgICAgIFRoZXJlZm9yZSB0aGlzIGNsYXNzIGV4aXN0cy4KICAgICAgICAiIiIKCiAgICAgICAgZGVmIF96aXBpbmZvX25hbWUoc2VsZiwgZnNwYXRoKToKICAgICAgICAgICAgIiIiT3ZlcnJpZGVzIEVnZ01ldGFkYXRhLl96aXBpbmZvX25hbWUiIiIKICAgICAgICAgICAgIyBDb252ZXJ0IGEgdmlydHVhbCBmaWxlbmFtZSAoZnVsbCBwYXRoIHRvIGZpbGUpIGludG8gYQogICAgICAgICAgICAjIHppcGZpbGUgc3VicGF0aCB1c2FibGUgd2l0aCB0aGUgemlwaW1wb3J0IGRpcmVjdG9yeQogICAgICAgICAgICAjIGNhY2hlIGZvciBvdXIgdGFyZ2V0IGFyY2hpdmUKICAgICAgICAgICAgZnNwYXRoID0gZnNwYXRoLnJzdHJpcChvcy5zZXApCiAgICAgICAgICAgIGlmIGZzcGF0aCA9PSBzZWxmLmxvYWRlci5hcmNoaXZlOgogICAgICAgICAgICAgICAgcmV0dXJuICcnCiAgICAgICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuemlwX3ByZSk6CiAgICAgICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLnppcF9wcmUpOl0KICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VicGF0aCBvZiAlcyIgJSAoZnNwYXRoLCBzZWxmLnppcF9wcmUpCiAgICAgICAgICAgICkKCiAgICAgICAgZGVmIF9wYXJ0cyhzZWxmLCB6aXBfcGF0aCk6CiAgICAgICAgICAgICIiIk92ZXJyaWRlcyBFZ2dNZXRhZGF0YS5fcGFydHMiIiIKICAgICAgICAgICAgIyBDb252ZXJ0IGEgemlwZmlsZSBzdWJwYXRoIGludG8gYW4gZWdnLXJlbGF0aXZlIHBhdGggcGFydAogICAgICAgICAgICAjIGxpc3QuCiAgICAgICAgICAgIGZzcGF0aCA9IHNlbGYuemlwX3ByZSArIHppcF9wYXRoCiAgICAgICAgICAgIGlmIGZzcGF0aCA9PSBzZWxmLmVnZ19yb290OgogICAgICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuZWdnX3Jvb3QgKyBvcy5zZXApOgogICAgICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi5lZ2dfcm9vdCkgKyAxOl0uc3BsaXQob3Muc2VwKQogICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuZWdnX3Jvb3QpCiAgICAgICAgICAgICkKCiAgICBkZWYgZmluZF9kaXN0X2luZm9faW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgICAgICIiIkZpbmQgZGlzdC1pbmZvIHN0eWxlIG1ldGFkYXRhIGluIHppcCBmaWxlcy4KCiAgICAgICAgaW1wb3J0ZXI6IFBFUCAzMDItc3R5bGUgSW1wb3J0ZXIgb2JqZWN0CiAgICAgICAgcGF0aF9pdGVtIChzdHIpOiBmaWxlbmFtZSBvciBwc2V1ZG8tZmlsZW5hbWUgbGlrZToKICAgICAgICAgICAgL3Vzci9zb21lZGlycy9tYWluLnBhcgogICAgICAgICAgICBvcgogICAgICAgICAgICAvdXNyL3NvbWVkaXJzL21haW4ucGFyL3B5cGlfX3BvcnRwaWNrZXJfMV8yXzAKICAgICAgICBvbmx5IChib29sKTogV2UgaWdub3JlIHRoZSBgb25seWAgZmxhZyBiZWNhdXNlIGl0J3Mgbm90IGNsZWFyCiAgICAgICAgICAgIHdoYXQgaXQgc2hvdWxkIGFjdHVhbGx5IGRvIGluIHRoaXMgY2FzZS4KCiAgICAgICAgWWllbGRzIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIG9iamVjdHMKICAgICAgICAiIiIKICAgICAgICBtZXRhZGF0YSA9IERpc3RJbmZvTWV0YWRhdGEoaW1wb3J0ZXIpCiAgICAgICAgZm9yIHN1Yml0ZW0gaW4gbWV0YWRhdGEucmVzb3VyY2VfbGlzdGRpcignLycpOgogICAgICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzdWJpdGVtKQogICAgICAgICAgICBpZiBleHQubG93ZXIoKSA9PSAnLmRpc3QtaW5mbyc6CiAgICAgICAgICAgICAgICAjIFBhcnNlIGRpc3RyaWJ1dGlvbiBuYW1lCiAgICAgICAgICAgICAgICBtYXRjaCA9IHBrZ19yZXNvdXJjZXMuRUdHX05BTUUoYmFzZW5hbWUpCiAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUgPSAndW5rbm93bicKICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSA9IG1hdGNoLmdyb3VwKCduYW1lJykKICAgICAgICAgICAgICAgICMgQ3JlYXRlIG1ldGFkYXRhIG9iamVjdAogICAgICAgICAgICAgICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHN1Yml0ZW0pCiAgICAgICAgICAgICAgICBzdWJtZXRhID0gRGlzdEluZm9NZXRhZGF0YSgKICAgICAgICAgICAgICAgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIocGF0aF9pdGVtKSkKICAgICAgICAgICAgICAgICMgT3ZlcnJpZGUgcGtnX3Jlc291cmNlcyBkZWZhdWx0cyB0byBhdm9pZAogICAgICAgICAgICAgICAgIyAicmVzb3VyY2VfZmlsZW5hbWUoKSBvbmx5IHN1cHBvcnRlZCBmb3IgLmVnZywgbm90CiAgICAgICAgICAgICAgICAjIC56aXAiIG1lc3NhZ2UKICAgICAgICAgICAgICAgIHN1Ym1ldGEuZWdnX25hbWUgPSBwcm9qZWN0X25hbWUKICAgICAgICAgICAgICAgIHN1Ym1ldGEuZWdnX2luZm8gPSBzdWJwYXRoCiAgICAgICAgICAgICAgICBzdWJtZXRhLmVnZ19yb290ID0gcGF0aF9pdGVtCiAgICAgICAgICAgICAgICBkaXN0ID0gcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIHN1Yml0ZW0sIHN1Ym1ldGEpCiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CgogICAgZGVmIGZpbmRfZWdnc19hbmRfZGlzdF9pbmZvX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICAgICAiIiJDaGFpbiB0b2dldGhlciBvdXIgZmluZGVyIGFuZCB0aGUgc3RhbmRhcmQgcGtnX3Jlc291cmNlcyBmaW5kZXIKCiAgICAgICAgRm9yIHNpbXBsaWNpdHksIGFuZCBzaW5jZSBwa2dfcmVzb3VyY2VzIGRvZXNuJ3QgcHJvdmlkZSBhIHB1YmxpYwogICAgICAgIGludGVyZmFjZSB0byBkbyBzbywgd2UgaGFyZGNvZGUgdGhlIGNoYWluaW5nIChmaW5kX2VnZ3NfaW5femlwKS4KICAgICAgICAiIiIKICAgICAgICAjIE91ciBmaW5kZXIKICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RfaW5mb19pbl96aXAoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seSk6CiAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICAjIFRoZSBzdGFuZGFyZCBwa2dfcmVzb3VyY2VzIGZpbmRlcgogICAgICAgIGZvciBkaXN0IGluIHBrZ19yZXNvdXJjZXMuZmluZF9lZ2dzX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5KToKICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgIHJldHVybgoKICAgICMgVGhpcyBvdmVyd3JpdGVzIHRoZSBleGlzdGluZyByZWdpc3RlcmVkIGZpbmRlci4KICAgIHBrZ19yZXNvdXJjZXMucmVnaXN0ZXJfZmluZGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfZWdnc19hbmRfZGlzdF9pbmZvX2luX3ppcCkKCiAgICAjIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBXb3JraW5nU2V0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgYW5kCiAgICAjIHRoZXJlIGlzIG5vIHB1YmxpYyBpbnRlcmZhY2UgdG8gZWFzaWx5IHJlZnJlc2gvcmVsb2FkIGl0IHRoYXQKICAgICMgZG9lc24ndCBhbHNvIGhhdmUgYSAiRG9uJ3QgdXNlIHRoaXMiIHdhcm5pbmcuICBTbyB3ZSBtYW51YWxseQogICAgIyBhZGQganVzdCB0aGUgZW50cmllcyB3ZSBrbm93IGFib3V0IHRvIHRoZSBleGlzdGluZyBXb3JraW5nU2V0LgogICAgZm9yIGVudHJ5IGluIHN5cy5wYXRoOgogICAgICAgIGltcG9ydGVyID0gcGtndXRpbC5nZXRfaW1wb3J0ZXIoZW50cnkpCiAgICAgICAgaWYgaXNpbnN0YW5jZShpbXBvcnRlciwgemlwaW1wb3J0LnppcGltcG9ydGVyKToKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0X2luZm9faW5femlwKGltcG9ydGVyLCBlbnRyeSwgb25seT1UcnVlKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGlzdC5fcHJvdmlkZXIsIERpc3RJbmZvTWV0YWRhdGEpOgogICAgICAgICAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQuYWRkKGRpc3QsIGVudHJ5LCBpbnNlcnQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZT1UcnVlKQoKCmRlZiBfaW5pdGlhbGl6ZV9pbXBvcnRfcGF0aChpbXBvcnRfcm9vdHMsIGltcG9ydF9wcmVmaXgpOgogICAgIiIiQWRkIGV4dHJhIGVudHJpZXMgdG8gUFlUSE9OUEFUSCBzbyB0aGF0IG1vZHVsZXMgY2FuIGJlIGltcG9ydGVkLiIiIgogICAgIyBXZSB0cnkgdG8gbWF0Y2ggdG8gb3JkZXIgb2YgQmF6ZWwncyBzdHViCiAgICBmdWxsX3Jvb3RzID0gWwogICAgICAgIG9zLnBhdGguam9pbihpbXBvcnRfcHJlZml4LCBpbXBvcnRfcm9vdCkKICAgICAgICBmb3IgaW1wb3J0X3Jvb3QgaW4gaW1wb3J0X3Jvb3RzXQogICAgc3lzLnBhdGhbMToxXSA9IGZ1bGxfcm9vdHMKICAgIF9sb2coJyMgYWRkaW5nICVzIHRvIHN5cy5wYXRoJyAlIGZ1bGxfcm9vdHMpCgoKZGVmIHNldHVwKGltcG9ydF9yb290cywgemlwX3NhZmUpOgogICAgIiIiSW5pdGlhbGl6ZSBzdWJwYXIgcnVuLXRpbWUgc3VwcG9ydAoKICAgIEFyZ3M6CiAgICAgIGltcG9ydF9yb290IChsaXN0KTogc3ViZGlycyBpbnNpZGUgLnBhciBmaWxlIHRvIGFkZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgaW1wb3J0IHBhdGggYXQgcnVudGltZS4KICAgICAgemlwX3NhZmUgKGJvb2wpOiBJZiBGYWxzZSwgZXh0cmFjdCB0aGUgLnBhciBmaWxlIGNvbnRlbnRzIHRvIGEKICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhbmQgaW1wb3J0IGV2ZXJ5dGhpbmcgZnJvbQogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZGlyZWN0b3J5LgoKICAgIFJldHVybnM6CiAgICAgIFRydWUgaWYgc2V0dXAgd2FzIHN1Y2Nlc3NmdWwsIGVsc2UgRmFsc2UKICAgICIiIgogICAgYXJjaGl2ZV9wYXRoID0gX2ZpbmRfYXJjaGl2ZSgpCiAgICBpZiBub3QgYXJjaGl2ZV9wYXRoOgogICAgICAgIHdhcm5pbmdzLndhcm4oJ0ZhaWxlZCB0byBpbml0aWFsaXplIC5wYXIgZmlsZSBydW50aW1lIHN1cHBvcnQnLAogICAgICAgICAgICAgICAgICAgICAgVXNlcldhcm5pbmcpCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBpZiBvcy5wYXRoLmFic3BhdGgoc3lzLnBhdGhbMF0pICE9IG9zLnBhdGguYWJzcGF0aChhcmNoaXZlX3BhdGgpOgogICAgICAgIHdhcm5pbmdzLndhcm4oJ0ZhaWxlZCB0byBpbml0aWFsaXplIC5wYXIgZmlsZSBydW50aW1lIHN1cHBvcnQuICcgKwogICAgICAgICAgICAgICAgICAgICAgJ2FyY2hpdmVfcGF0aCB3YXMgJXIsIHN5cy5wYXRoIHdhcyAlcicgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV9wYXRoLCBzeXMucGF0aCksCiAgICAgICAgICAgICAgICAgICAgICBVc2VyV2FybmluZykKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAjIEV4dHJhY3QgZmlsZXMgdG8gZGlzayBpZiBuZWNlc3NhcnkKICAgIGlmIG5vdCB6aXBfc2FmZToKICAgICAgICBleHRyYWN0X2RpciA9IF9leHRyYWN0X2ZpbGVzKGFyY2hpdmVfcGF0aCkKICAgICAgICAjIHN5cy5wYXRoWzBdIGlzIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRpbmcgLnBhciBmaWxlLiAgUG9pbnQKICAgICAgICAjIGl0IHRvIHRoZSBleHRyYWN0IGRpcmVjdG9yeSBpbnN0ZWFkLCBzbyB0aGF0IFB5dGhvbiBzZWFyY2hlcwogICAgICAgICMgdGhlcmUgZm9yIGltcG9ydHMuCiAgICAgICAgc3lzLnBhdGhbMF0gPSBleHRyYWN0X2RpcgogICAgICAgIGltcG9ydF9wcmVmaXggPSBleHRyYWN0X2RpcgogICAgZWxzZTogICMgSW1wb3J0IGRpcmVjdGx5IGZyb20gLnBhciBmaWxlCiAgICAgICAgZXh0cmFjdF9kaXIgPSBOb25lCiAgICAgICAgaW1wb3J0X3ByZWZpeCA9IGFyY2hpdmVfcGF0aAoKICAgICMgSW5pdGlhbGl6ZSBpbXBvcnQgcGF0aAogICAgX2luaXRpYWxpemVfaW1wb3J0X3BhdGgoaW1wb3J0X3Jvb3RzLCBpbXBvcnRfcHJlZml4KQoKICAgICMgQWRkIGhvb2sgZm9yIHBhY2thZ2UgbWV0YWRhdGEKICAgIF9zZXR1cF9wa2dfcmVzb3VyY2VzKCdwa2dfcmVzb3VyY2VzJykKICAgIF9zZXR1cF9wa2dfcmVzb3VyY2VzKCdwaXAuX3ZlbmRvci5wa2dfcmVzb3VyY2VzJykKCiAgICByZXR1cm4gVHJ1ZQpQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAAWAAAAX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAwkoNq9cWAADXFgAACwAAAAAAAAAAAAAAAAA/AAAAX19tYWluX18ucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAALgAAAAAAAAAAAAAAAAA/FwAAaW9fYmF6ZWxfcnVsZXNfcHl0aG9uL3J1bGVzX3B5dGhvbi9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAcadZf5hUAAOYVAAApAAAAAAAAAAAAAAAAAIsXAABpb19iYXplbF9ydWxlc19weXRob24vcnVsZXNfcHl0aG9uL3dobC5weVBLAQIUAxQAAAAAAAAAIQBQ41yFlhoAAJYaAAAqAAAAAAAAAAAAAAAAALgtAABpb19iYXplbF9ydWxlc19weXRob24vcnVsZXNfcHl0aG9uL3dobHRvb2xQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAACWSAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAXE+6RX4AAAB+AAAAJwAAAAAAAAAAAAAAAADXSAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvZWFzeV9pbnN0YWxsLnB5UEsBAhQDFAAAAAAAAAAhABdEnikHngEAB54BADEAAAAAAAAAAAAAAAAAmkkAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAOQAAAAAAAAAAAAAAAADw5wEAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAEOrsCZmVwAAZlcAADgAAAAAAAAAAAAAAAAAR+gBAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9hcHBkaXJzLnB5UEsBAhQDFAAAAAAAAAAhADwpWMbQAgAA0AIAAEQAAAAAAAAAAAAAAAAAA0ACAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19hYm91dF9fLnB5UEsBAhQDFAAAAAAAAAAhAIF2lsoBAgAAAQIAAEMAAAAAAAAAAAAAAAAANUMCAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA5mlK41wDAABcAwAAQgAAAAAAAAAAAAAAAACXRQIAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAPr9pBKIBQAAiAUAAEYAAAAAAAAAAAAAAAAAU0kCAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHlQSwECFAMUAAAAAAAAACEAMPgT3DggAAA4IAAAQgAAAAAAAAAAAAAAAAA/TwIAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5UEsBAhQDFAAAAAAAAAAhAKWGHdsDEQAAAxEAAEcAAAAAAAAAAAAAAAAA128CAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5UEsBAhQDFAAAAAAAAAAhAHxFg4x5bQAAeW0AAEUAAAAAAAAAAAAAAAAAP4ECAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weVBLAQIUAxQAAAAAAAAAIQDF6icPpQEAAKUBAABAAAAAAAAAAAAAAAAAABvvAgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhAA7vxqEkLQAAJC0AAEIAAAAAAAAAAAAAAAAAHvECAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weVBLAQIUAxQAAAAAAAAAIQB4KBTD64EDAOuBAwA6AAAAAAAAAAAAAAAAAKIeAwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcHlwYXJzaW5nLnB5UEsBAhQDFAAAAAAAAAAhAJlYTVqSdQAAknUAADQAAAAAAAAAAAAAAAAA5aAGAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9zaXgucHlQSwECFAMUAAAAAAAAACEAddjxebcJAAC3CQAAOAAAAAAAAAAAAAAAAADJFgcAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9leHRlcm4vX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAx0d9MlgCAABYAgAAMwAAAAAAAAAAAAAAAADWIAcAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9weTMxY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAH/UulyOBQAAjgUAAEMAAAAAAAAAAAAAAAAAfyMHAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9ERVNDUklQVElPTi5yc3RQSwECFAMUAAAAAAAAACEAUNerBzYEAAA2BAAAPwAAAAAAAAAAAAAAAABuKQcAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL0xJQ0VOU0UudHh0UEsBAhQDFAAAAAAAAAAhAPEMkP/uCgAA7goAADwAAAAAAAAAAAAAAAAAAS4HAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9NRVRBREFUQVBLAQIUAxQAAAAAAAAAIQBcrCangx4AAIMeAAA6AAAAAAAAAAAAAAAAAEk5BwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vUkVDT1JEUEsBAhQDFAAAAAAAAAAhAPbd0r5uAAAAbgAAADkAAAAAAAAAAAAAAAAAJFgHAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9XSEVFTFBLAQIUAxQAAAAAAAAAIQA32V/d7wAAAO8AAABIAAAAAAAAAAAAAAAAAOlYBwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vZGVwZW5kZW5jeV9saW5rcy50eHRQSwECFAMUAAAAAAAAACEA0TWOjq4LAACuCwAARAAAAAAAAAAAAAAAAAA+WgcAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHRQSwECFAMUAAAAAAAAACEA+9Yg9SUTAAAlEwAAQQAAAAAAAAAAAAAAAABOZgcAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL21ldGFkYXRhLmpzb25QSwECFAMUAAAAAAAAACEAMFwBkSYAAAAmAAAAQQAAAAAAAAAAAAAAAADSeQcAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHRQSwECFAMUAAAAAAAAACEAkwbXMgEAAAABAAAAPAAAAAAAAAAAAAAAAABXegcAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL3ppcC1zYWZlUEsBAhQDFAAAAAAAAAAhACMLSgNEFgAARBYAAC4AAAAAAAAAAAAAAAAAsnoHAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEApYdlUcAZAADAGQAAMgAAAAAAAAAAAAAAAABCkQcAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9hcmNoaXZlX3V0aWwucHlQSwECFAMUAAAAAAAAACEAH+I9HCcWAAAnFgAAMAAAAAAAAAAAAAAAAABSqwcAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9idWlsZF9tZXRhLnB5UEsBAhQDFAAAAAAAAAAhAPWGemkAAAEAAAABAC0AAAAAAAAAAAAAAAAAx8EHAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY2xpLTMyLmV4ZVBLAQIUAxQAAAAAAAAAIQBicM7bACQBAAAkAQAtAAAAAAAAAAAAAAAAABLCCABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NsaS02NC5leGVQSwECFAMUAAAAAAAAACEA9YZ6aQAAAQAAAAEAKgAAAAAAAAAAAAAAAABd5gkAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jbGkuZXhlUEsBAhQDFAAAAAAAAAAhAEGcFlJSAgAAUgIAADYAAAAAAAAAAAAAAAAApeYKAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBQ+CPyegkAAHoJAAAzAAAAAAAAAAAAAAAAAEvpCgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYWxpYXMucHlQSwECFAMUAAAAAAAAACEAScwroVtGAABbRgAANwAAAAAAAAAAAAAAAAAW8woAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X2VnZy5weVBLAQIUAxQAAAAAAAAAIQDr0nQW5AUAAOQFAAA3AAAAAAAAAAAAAAAAAMY5CwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfcnBtLnB5UEsBAhQDFAAAAAAAAAAhACCMdRR9AgAAfQIAADsAAAAAAAAAAAAAAAAA/z8LAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5UEsBAhQDFAAAAAAAAAAhACcajRuEEQAAhBEAADgAAAAAAAAAAAAAAAAA1UILAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9jbGliLnB5UEsBAhQDFAAAAAAAAAAhAJGlaef5MgAA+TIAADcAAAAAAAAAAAAAAAAAr1QLAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9leHQucHlQSwECFAMUAAAAAAAAACEAQEZC3HwlAAB8JQAANgAAAAAAAAAAAAAAAAD9hwsAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX3B5LnB5UEsBAhQDFAAAAAAAAAAhAEBcO/9uHwAAbh8AADUAAAAAAAAAAAAAAAAAza0LAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9kZXZlbG9wLnB5UEsBAhQDFAAAAAAAAAAhAP/o9pHAAwAAwAMAADcAAAAAAAAAAAAAAAAAjs0LAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9kaXN0X2luZm8ucHlQSwECFAMUAAAAAAAAACEAq3QS6VVUAQBVVAEAOgAAAAAAAAAAAAAAAACj0QsAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2Vhc3lfaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQBOLHJCcGEAAHBhAAA2AAAAAAAAAAAAAAAAAFAmDQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHlQSwECFAMUAAAAAAAAACEAjdu1P0sSAABLEgAANQAAAAAAAAAAAAAAAAAUiA0AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGwucHlQSwECFAMUAAAAAAAAACEAXNKo5ZsIAACbCAAAPgAAAAAAAAAAAAAAAACymg0AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHlQSwECFAMUAAAAAAAAACEAkJw7UwAPAAAADwAAOQAAAAAAAAAAAAAAAACpow0AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfbGliLnB5UEsBAhQDFAAAAAAAAAAhAEY/8R6HCQAAhwkAAD0AAAAAAAAAAAAAAAAAALMNAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHlQSwECFAMUAAAAAAAAACEAfXNgv3oTAAB6EwAAOAAAAAAAAAAAAAAAAADivA0AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3B5MzZjb21wYXQucHlQSwECFAMUAAAAAAAAACEAzf+tkA4BAAAOAQAANgAAAAAAAAAAAAAAAACy0A0AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3JlZ2lzdGVyLnB5UEsBAhQDFAAAAAAAAAAhABnK1KR0CAAAdAgAADQAAAAAAAAAAAAAAAAAFNINAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9yb3RhdGUucHlQSwECFAMUAAAAAAAAACEABIHWNJICAACSAgAANgAAAAAAAAAAAAAAAADa2g0AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3NhdmVvcHRzLnB5UEsBAhQDFAAAAAAAAAAhALcf0W43GgAANxoAADMAAAAAAAAAAAAAAAAAwN0NAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9zZGlzdC5weVBLAQIUAxQAAAAAAAAAIQCbcMvH3RMAAN0TAAA0AAAAAAAAAAAAAAAAAEj4DQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvc2V0b3B0LnB5UEsBAhQDFAAAAAAAAAAhAN0Z4Z7+IwAA/iMAADIAAAAAAAAAAAAAAAAAdwwOAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC90ZXN0LnB5UEsBAhQDFAAAAAAAAAAhANkki2eUBAAAlAQAADQAAAAAAAAAAAAAAAAAxTAOAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHlQSwECFAMUAAAAAAAAACEA8pfzxo8cAACPHAAAOQAAAAAAAAAAAAAAAACrNQ4AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZF9kb2NzLnB5UEsBAhQDFAAAAAAAAAAhAIlHECSxPwAAsT8AACwAAAAAAAAAAAAAAAAAkVIOAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29uZmlnLnB5UEsBAhQDFAAAAAAAAAAhABoiBDKnAwAApwMAAC4AAAAAAAAAAAAAAAAAjJIOAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZGVwX3V0aWwucHlQSwECFAMUAAAAAAAAACEAWyktas0WAADNFgAALQAAAAAAAAAAAAAAAAB/lg4AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9kZXBlbmRzLnB5UEsBAhQDFAAAAAAAAAAhACV0hwWQnQAAkJ0AACoAAAAAAAAAAAAAAAAAl60OAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZGlzdC5weVBLAQIUAxQAAAAAAAAAIQC5qpHuwQYAAMEGAAAvAAAAAAAAAAAAAAAAAG9LDwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2V4dGVuc2lvbi5weVBLAQIUAxQAAAAAAAAAIQDQintlgwAAAIMAAAA1AAAAAAAAAAAAAAAAAH1SDwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2V4dGVybi9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAE6sG9SgwAAEoMAAArAAAAAAAAAAAAAAAAAFNTDwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2dsaWJjLnB5UEsBAhQDFAAAAAAAAAAhALxdoTlXFAAAVxQAACoAAAAAAAAAAAAAAAAA5l8PAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ2xvYi5weVBLAQIUAxQAAAAAAAAAIQAQ+fwpAAABAAAAAQAtAAAAAAAAAAAAAAAAAIV0DwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2d1aS0zMi5leGVQSwECFAMUAAAAAAAAACEA2A6r9AAmAQAAJgEALQAAAAAAAAAAAAAAAADQdBAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9ndWktNjQuZXhlUEsBAhQDFAAAAAAAAAAhABD5/CkAAAEAAAABACoAAAAAAAAAAAAAAAAAG5sRAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ3VpLmV4ZVBLAQIUAxQAAAAAAAAAIQBk+X6bEwMAABMDAAAsAAAAAAAAAAAAAAAAAGObEgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2xhdW5jaC5weVBLAQIUAxQAAAAAAAAAIQCHUeui3QcAAN0HAAAwAAAAAAAAAAAAAAAAAMCeEgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2xpYjJ0bzNfZXgucHlQSwECFAMUAAAAAAAAACEAjUNyXp0WAACdFgAALAAAAAAAAAAAAAAAAADrphIAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9tb25rZXkucHlQSwECFAMUAAAAAAAAACEAgsOU5rSfAAC0nwAAKgAAAAAAAAAAAAAAAADSvRIAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9tc3ZjLnB5UEsBAhQDFAAAAAAAAAAhAGML49Z/DAAAfwwAADAAAAAAAAAAAAAAAAAAzl0TAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbmFtZXNwYWNlcy5weVBLAQIUAxQAAAAAAAAAIQCJsBPOO54AADueAAAzAAAAAAAAAAAAAAAAAJtqEwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHlQSwECFAMUAAAAAAAAACEA5ebovoIqAACCKgAAMAAAAAAAAAAAAAAAAAAnCRQAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9wZXA0MjV0YWdzLnB5UEsBAhQDFAAAAAAAAAAhALJmp1cYAgAAGAIAADAAAAAAAAAAAAAAAAAA9zMUAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcHkyN2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQDQuUhaqAQAAKgEAAAwAAAAAAAAAAAAAAAAAF02FABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3B5MzFjb21wYXQucHlQSwECFAMUAAAAAAAAACEAyWGSwOYDAADmAwAAMAAAAAAAAAAAAAAAAABTOxQAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9weTMzY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAIUZmgtLCwAASwsAADAAAAAAAAAAAAAAAAAAhz8UAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcHkzNmNvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQCMU5pjxDcAAMQ3AAAtAAAAAAAAAAAAAAAAACBLFABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3NhbmRib3gucHlQSwECFAMUAAAAAAAAACEAqDO0vooAAACKAAAALgAAAAAAAAAAAAAAAAAvgxQAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9zY3JpcHQudG1wbFBLAQIUAxQAAAAAAAAAIQACwZTjAwkAAAMJAAAwAAAAAAAAAAAAAAAAAAWEFABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3NpdGUtcGF0Y2gucHlQSwECFAMUAAAAAAAAACEAiJtbTiwhAAAsIQAAMQAAAAAAAAAAAAAAAABWjRQAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9zc2xfc3VwcG9ydC5weVBLAQIUAxQAAAAAAAAAIQCaQtea5AMAAOQDAAAzAAAAAAAAAAAAAAAAANGuFABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3VuaWNvZGVfdXRpbHMucHlQSwECFAMUAAAAAAAAACEASLFMYpAAAACQAAAALQAAAAAAAAAAAAAAAAAGsxQAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy92ZXJzaW9uLnB5UEsBAhQDFAAAAAAAAAAhAHAdCPNBHAAAQRwAACsAAAAAAAAAAAAAAAAA4bMUAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvd2hlZWwucHlQSwECFAMUAAAAAAAAACEA+cvuDcoCAADKAgAANQAAAAAAAAAAAAAAAABr0BQAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy93aW5kb3dzX3N1cHBvcnQucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAAAACI0xQAc3VicGFyL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAABoAAAAAAAAAAAAAAAAAuNMUAHN1YnBhci9ydW50aW1lL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAI+gczy3LgAAty4AABkAAAAAAAAAAAAAAAAA8NMUAHN1YnBhci9ydW50aW1lL3N1cHBvcnQucHlQSwUGAAAAAGEAYQDGJAAA3gIVAAAA