cdnhost 3.3.7 → 3.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/ws_cdn.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdnhost",
3
- "version": "3.3.7",
3
+ "version": "3.3.8",
4
4
  "description": "cdnhost",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/ws_cdn.js CHANGED
@@ -3,4 +3,4 @@
3
3
  Unauthorized copying, modification, or redistribution is strictly prohibited.
4
4
  */
5
5
 
6
- eval(decodeURIComponent(escape(window.atob('ICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHdpbmRvdy5GSExXaWRnZXRJbml0aWFsaXplZCkgcmV0dXJuOw0KICAgICAgICB3aW5kb3cuRkhMV2lkZ2V0SW5pdGlhbGl6ZWQgPSB0cnVlOw0KDQogICAgICAgIGNvbnN0IGxhbmd1YWdlcyA9IFsgeyBjb2RlOiAnZW4nLCBuYW1lOiAnRW5nbGlzaCcgfSwgeyBjb2RlOiAna28nLCBuYW1lOiAn7ZWc6rWt7Ja0JyB9LCB7IGNvZGU6ICdlcycsIG5hbWU6ICdFc3Bhw7FvbCcgfSwgeyBjb2RlOiAnaGknLCBuYW1lOiAn4KS54KS/4KSo4KWN4KSm4KWAJyB9LCB7IGNvZGU6ICdhcicsIG5hbWU6ICfYp9mE2LnYsdio2YrYqScgfSwgeyBjb2RlOiAnZGUnLCBuYW1lOiAnRGV1dHNjaCcgfSwgeyBjb2RlOiAnZnInLCBuYW1lOiAnRnJhbsOnYWlzJyB9LCB7IGNvZGU6ICdwdCcsIG5hbWU6ICdQb3J0dWd1w6pzJyB9LCB7IGNvZGU6ICdibicsIG5hbWU6ICfgpqzgpr7gpoLgprLgpr4nIH0sIHsgY29kZTogJ2phJywgbmFtZTogJ+aXpeacrOiqnicgfSwgeyBjb2RlOiAncnUnLCBuYW1lOiAn0KDRg9GB0YHQutC40LknIH0sIHsgY29kZTogJ3poJywgbmFtZTogJ+eugOS9k+S4reaWhycgfSwgeyBjb2RlOiAndGgnLCBuYW1lOiAn4LmE4LiX4LiiJyB9LCB7IGNvZGU6ICd2aScsIG5hbWU6ICdUaeG6v25nIFZp4buHdCcgfSwgeyBjb2RlOiAnaWQnLCBuYW1lOiAnSW5kb25lc2lhJyB9LCB7IGNvZGU6ICd0cicsIG5hbWU6ICdUw7xya8OnZScgfSwgeyBjb2RlOiAndXInLCBuYW1lOiAn2KfYsdiv2YgnIH1dOw0KICAgICAgICBsZXQgY3VycmVudERpc3BsYXlJdGVtcyA9IFtdOyANCiAgICAgICAgbGV0IGN1cnJlbnRQYWdlID0gMTsgDQogICAgICAgIGNvbnN0IElURU1TX1BFUl9QQUdFID0gMzI7DQogICAgICAgIGxldCBpc0xvYWRpbmdOZXh0UGFnZSA9IGZhbHNlOyANCiAgICAgICAgbGV0IHNlYXJjaFRpbWVvdXQgPSBudWxsOw0KDQogICAgICAgIGNvbnN0IHdpZGdldENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtd2lkZ2V0LWNvbnRhaW5lcicpOw0KICAgICAgICBjb25zdCB3aWRnZXRXcmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC13aWRnZXQtd3JhcHBlcicpOw0KICAgICAgICBjb25zdCBsaXN0Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1saXN0LWNvbnRhaW5lcicpOw0KICAgICAgICBjb25zdCBzZWFyY2hJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtc2VhcmNoLWlucHV0Jyk7DQogICAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdHNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNlYXJjaC1yZXN1bHRzJyk7DQogICAgICAgIGNvbnN0IHNlYXJjaFRyaWdnZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNlYXJjaC10cmlnZ2VyJyk7DQogICAgICAgIGNvbnN0IHNlYXJjaENsb3NlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1zZWFyY2gtY2xvc2UnKTsNCiAgICAgICAgY29uc3QgaW5kaWNhdG9yVHJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWluZGljYXRvci10cmFjaycpOw0KICAgICAgICBjb25zdCBzY3JvbGxJbmRpY2F0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNjcm9sbC1pbmRpY2F0b3InKTsNCiAgICAgICAgY29uc3QgYWRkVG9Ib21lQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1hZGQtdG8taG9tZS1idG4nKTsNCiAgICAgICAgY29uc3Qgc2VhcmNoQWRkQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1zZWFyY2gtYWRkLWJ0bicpOw0KICAgICAgICBjb25zdCB0b2FzdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXRvYXN0LW5vdGlmaWNhdGlvbicpOw0KICAgICAgICBjb25zdCBmaXhlZFF1ZXN0aW9uQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1maXhlZC1xdWVzdGlvbicpOw0KICAgICAgICBjb25zdCBmaXhlZENoYXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWZpeGVkLWNoYXQnKTsNCiAgICAgICAgY29uc3QgZml4ZWRJbmZvQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1maXhlZC1pbmZvJyk7DQogICAgICAgIA0KICAgICAgICBsZXQgdG9hc3RUaW1lb3V0ID0gbnVsbDsNCg0KCQljb25zdCBicm93c2VyTGFuZyA9IChuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSkuc3Vic3RyaW5nKDAsIDIpOw0KCQljb25zdCBpc1N1cHBvcnRlZCA9IGxhbmd1YWdlcy5zb21lKGxhbmcgPT4gbGFuZy5jb2RlID09PSBicm93c2VyTGFuZyk7DQoJCWNvbnN0IGN1cnJlbnRMYW5nID0gaXNTdXBwb3J0ZWQgPyBicm93c2VyTGFuZyA6ICdlbic7DQoNCiAgICAgICAgY29uc3QgQVBJX0JBU0VfVVJMID0gJ2h0dHBzOi8vaXNhaS5rcic7DQoNCgkJY29uc3Qgc2hvcnRjdXRNYW5hZ2VyID0gew0KCQkJa2V5OiAnZmhsLWN1c3RvbS1pY29ucy13aXRoLWV4cGlyeScsDQoJCQlnZXQ6ICgpID0+IHsNCgkJCQljb25zdCByYXdEYXRhID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc2hvcnRjdXRNYW5hZ2VyLmtleSk7DQoJCQkJaWYgKCFyYXdEYXRhKSByZXR1cm4gW107DQoJCQkJdHJ5IHsNCgkJCQkJY29uc3QgZGF0YSA9IEpTT04ucGFyc2UocmF3RGF0YSk7DQoJCQkJCXJldHVybiBBcnJheS5pc0FycmF5KGRhdGEuc2hvcnRjdXRzKSA/IGRhdGEuc2hvcnRjdXRzLmZpbHRlcihpdGVtID0+IGl0ZW0gJiYgaXRlbS5uYW1lICYmIGl0ZW0udXJsKSA6IFtdOw0KCQkJCX0gY2F0Y2ggKGUpIHsNCgkJCQkJbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oc2hvcnRjdXRNYW5hZ2VyLmtleSk7DQoJCQkJCXJldHVybiBbXTsNCgkJCQl9DQoJCQl9LA0KCQkJc2V0OiAoc2hvcnRjdXRzKSA9PiB7DQoJCQkJY29uc3QgZGF0YVRvU3RvcmUgPSB7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgc2hvcnRjdXRzOiBzaG9ydGN1dHMgfTsNCgkJCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbShzaG9ydGN1dE1hbmFnZXIua2V5LCBKU09OLnN0cmluZ2lmeShkYXRhVG9TdG9yZSkpOw0KCQkJfSwNCgkJCXN5bmNGcm9tVVJMOiAoKSA9PiB7DQoJCQkJY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsNCgkJCQljb25zdCBzaG9ydGN1dHNQYXJhbSA9IHBhcmFtcy5nZXQoJ3Nob3J0Y3V0cycpOw0KCQkJCWlmIChzaG9ydGN1dHNQYXJhbSkgew0KCQkJCQl0cnkgew0KCQkJCQkJY29uc3QgZGVjb2RlZFVybERhdGEgPSBkZWNvZGVVUklDb21wb25lbnQoc2hvcnRjdXRzUGFyYW0pOw0KCQkJCQkJY29uc3QgdXJsRGF0YSA9IEpTT04ucGFyc2UoZGVjb2RlZFVybERhdGEpOw0KCQkJCQkJY29uc3QgcmF3TG9jYWxEYXRhID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc2hvcnRjdXRNYW5hZ2VyLmtleSk7DQoJCQkJCQlsZXQgbG9jYWxEYXRhID0gbnVsbDsNCgkJCQkJCQ0KCQkJCQkJaWYgKHJhd0xvY2FsRGF0YSkgew0KCQkJCQkJCXRyeSB7IGxvY2FsRGF0YSA9IEpTT04ucGFyc2UocmF3TG9jYWxEYXRhKTsgfSBjYXRjaCAoZSkgeyBsb2NhbERhdGEgPSBudWxsOyB9DQoJCQkJCQl9DQoNCgkJCQkJCWlmICh1cmxEYXRhLnNob3J0Y3V0cyAmJiB1cmxEYXRhLnNob3J0Y3V0cy5sZW5ndGggPT09IDApIHsNCgkJCQkJCQlyZXR1cm47IA0KCQkJCQkJfQ0KDQoJCQkJCQlpZiAoIWxvY2FsRGF0YSB8fCAodXJsRGF0YS50aW1lc3RhbXAgPiBsb2NhbERhdGEudGltZXN0YW1wKSkgew0KCQkJCQkJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKHNob3J0Y3V0TWFuYWdlci5rZXksIEpTT04uc3RyaW5naWZ5KHVybERhdGEpKTsNCgkJCQkJCX0NCgkJCQkJfSBjYXRjaCAoZSkge30NCgkJCQl9DQoJCQl9LA0KCQkJZ2V0QXNQYXJhbTogKCkgPT4gew0KCQkJCWNvbnN0IHJhd0RhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShzaG9ydGN1dE1hbmFnZXIua2V5KTsNCgkJCQlpZiAoIXJhd0RhdGEpIHJldHVybiAnJzsNCgkJCQl0cnkgew0KCQkJCQljb25zdCBkYXRhID0gSlNPTi5wYXJzZShyYXdEYXRhKTsNCgkJCQkJaWYgKCFkYXRhLnNob3J0Y3V0cyB8fCBkYXRhLnNob3J0Y3V0cy5sZW5ndGggPT09IDApIHsNCgkJCQkJCXJldHVybiAnJzsgDQoJCQkJCX0NCgkJCQl9IGNhdGNoIChlKSB7IHJldHVybiAnJzsgfQ0KCQkJCXJldHVybiBgc2hvcnRjdXRzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHJhd0RhdGEpfWA7DQoJCQl9DQoJCX07DQoNCiAgICAgICAgDQogICAgICAgIGNvbnN0IHVwZGF0ZUFsbFdpZGdldExpbmtzID0gKCkgPT4gew0KICAgICAgICAgICAgY29uc3QgcGFyYW1TdHJpbmcgPSBzaG9ydGN1dE1hbmFnZXIuZ2V0QXNQYXJhbSgpOw0KICAgICAgICAgICAgaWYgKCFwYXJhbVN0cmluZykgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgYWxsTGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZmhsLXdpZGdldC1jb250YWluZXIgLmZobC1pY29uLWRpc3BsYXksICNmaGwtd2lkZ2V0LWNvbnRhaW5lciAuZmhsLWZpeGVkLWl0ZW0nKTsNCiAgICAgICAgICAgIGFsbExpbmtzLmZvckVhY2gobGluayA9PiB7DQogICAgICAgICAgICAgICAgaWYgKGxpbmsudGFnTmFtZSA9PT0gJ0EnKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSHJlZiA9IGxpbmsuZ2V0QXR0cmlidXRlKCdocmVmJyk7DQogICAgICAgICAgICAgICAgICAgIGlmICghb3JpZ2luYWxIcmVmIHx8IG9yaWdpbmFsSHJlZi5zdGFydHNXaXRoKCcjJykpIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdVcmwgPSBuZXcgVVJMKG9yaWdpbmFsSHJlZik7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBwYXJhbVN0cmluZy5zcGxpdCgnPScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3VXJsLnNlYXJjaFBhcmFtcy5zZXQoa2V5LCB2YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBsaW5rLmhyZWYgPSBuZXdVcmwudG9TdHJpbmcoKTsNCgkJCQkJCWxpbmsucmVsID0gJ25vZm9sbG93JzsgDQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgY29uc29sZS5lcnJvcignSW52YWxpZCBVUkwgZm9yIGxpbmsgdXBkYXRlOicsIG9yaWdpbmFsSHJlZil9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQoNCiAgICAgICAgY29uc3Qgc2hvd1RvYXN0ID0gKG1lc3NhZ2UpID0+IHsgY2xlYXJUaW1lb3V0KHRvYXN0VGltZW91dCk7IHRvYXN0RWxlbWVudC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7IHRvYXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7IHRvYXN0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4geyB0b2FzdEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpfSwgMjUwMCl9Ow0KICAgICAgICANCiAgICAgICAgY29uc3QgYXBwbHlMYW5ndWFnZSA9IChsYW5nQ29kZSkgPT4gew0KICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2xhdGlvbnMgPT09ICd1bmRlZmluZWQnKSB7IGNvbnNvbGUuZXJyb3IoIlRyYW5zbGF0aW9ucyBub3QgbG9hZGVkISBNYWtlIHN1cmUgbGFuZy5qcyBpcyBpbmNsdWRlZCBjb3JyZWN0bHkuIik7IHJldHVybn0NCiAgICAgICAgICAgIGNvbnN0IHQgPSB0cmFuc2xhdGlvbnNbbGFuZ0NvZGVdIHx8IHRyYW5zbGF0aW9uc1snZW4nXTsNCiAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5sYW5nID0gbGFuZ0NvZGU7DQogICAgICAgICAgICBzZWFyY2hUcmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQub3BlblNlYXJjaCk7DQogICAgICAgICAgICBhZGRUb0hvbWVCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdC5hZGRUb1dpZGdldCk7DQogICAgICAgICAgICBzZWFyY2hDbG9zZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0LmNsb3NlU2VhcmNoKTsNCiAgICAgICAgICAgIHNlYXJjaEFkZEJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQ29weSBXaWRnZXQgQ29kZScpOyANCiAgICAgICAgICAgIGZpeGVkUXVlc3Rpb25CdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdC5xdWVzdGlvbik7DQogICAgICAgICAgICBmaXhlZENoYXRCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdC5jaGFyYWN0ZXJDaGF0KTsNCiAgICAgICAgICAgIGZpeGVkSW5mb0J0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0LmluZm8pOw0KICAgICAgICAgICAgaW5pdGlhbFJlbmRlcigpOw0KICAgICAgICB9Ow0KDQogICAgICAgIGNvbnN0IGdldFByb2Nlc3NlZFVybCA9IChmdWxsVXJsKSA9PiB7IHRyeSB7IGNvbnN0IHVybE9iaiA9IG5ldyBVUkwoZnVsbFVybCk7IHJldHVybiBgJHt1cmxPYmoucHJvdG9jb2x9Ly8ke3VybE9iai5ob3N0bmFtZX1gfSBjYXRjaCAoZSkgeyByZXR1cm4gZnVsbFVybH0gfTsNCiAgICAgICAgDQogICAgICAgIGNvbnN0IGNyZWF0ZUljb25JdGVtID0gKGl0ZW0sIHR5cGUgPSAnZGVmYXVsdCcpID0+IHsNCiAgICAgICAgICAgIGlmICghaXRlbSB8fCAhaXRlbS5uYW1lIHx8ICFpdGVtLnVybCkgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsNCiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NlYXJjaCcpIHsNCiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbVN0cmluZyA9IHNob3J0Y3V0TWFuYWdlci5nZXRBc1BhcmFtKCk7DQogICAgICAgICAgICAgICAgbGV0IGZpbmFsVXJsID0gaXRlbS51cmw7DQogICAgICAgICAgICAgICAgaWYgKHBhcmFtU3RyaW5nKSB7IHRyeSB7IGxldCBuZXdVcmwgPSBuZXcgVVJMKGl0ZW0udXJsKTsgY29uc3QgW2tleSwgdmFsdWVdID0gcGFyYW1TdHJpbmcuc3BsaXQoJz0nKTsgbmV3VXJsLnNlYXJjaFBhcmFtcy5zZXQoa2V5LCB2YWx1ZSk7IGZpbmFsVXJsID0gbmV3VXJsLnRvU3RyaW5nKCl9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgVVJMIGZvciBzZWFyY2ggcmVzdWx0IGxpbms6JywgaXRlbS51cmwpfSB9DQogICAgICAgICAgICAgICAgbGluay5ocmVmID0gZmluYWxVcmw7DQogICAgICAgICAgICB9IGVsc2UgeyBsaW5rLmhyZWYgPSBpdGVtLnVybH0NCiAgICAgICAgICAgIGxpbmsuY2xhc3NOYW1lID0gJ2ZobC1pY29uLWRpc3BsYXknOw0KCQkJbGluay5yZWwgPSAnbm9mb2xsb3cnOw0KICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBpdGVtLm5hbWUpOw0KICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzZWFyY2gnKSB7IGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKCkgPT4geyBmZXRjaChgJHtBUElfQkFTRV9VUkx9L3VwZGF0ZV92aWV3X2NvdW50LnBocGAsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHVybDogaXRlbS51cmwgfSkgfSkuY2F0Y2goY29uc29sZS5lcnJvcil9KTsgbGluay50YXJnZXQgPSAnX2JsYW5rJ30NCiAgICAgICAgICAgIGNvbnN0IGljb25DaXJjbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgaWNvbkNpcmNsZS5jbGFzc05hbWUgPSAnZmhsLWljb24tY2lyY2xlJzsNCiAgICAgICAgICAgIGlmIChpdGVtLmljb24pIHsgY29uc3QgaWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKTsgaWNvbi5jbGFzc05hbWUgPSBgcGgtYm9sZCAke2l0ZW0uaWNvbn1gOyBpY29uQ2lyY2xlLmFwcGVuZENoaWxkKGljb24pfQ0KICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS5pbWcpIHsgY29uc3QgY3VzdG9tSW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsgY3VzdG9tSW1hZ2Uuc3JjID0gaXRlbS5pbWc7IGN1c3RvbUltYWdlLmFsdCA9IGl0ZW0ubmFtZTsgY3VzdG9tSW1hZ2Uub25lcnJvciA9ICgpID0+IHsgY3VzdG9tSW1hZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJ307IGljb25DaXJjbGUuYXBwZW5kQ2hpbGQoY3VzdG9tSW1hZ2UpfQ0KICAgICAgICAgICAgZWxzZSB7IGNvbnN0IGZhdmljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsgZmF2aWNvbi5zcmMgPSBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zMi9mYXZpY29ucz9zej02NCZkb21haW5fdXJsPSR7aXRlbS51cmx9YDsgZmF2aWNvbi5hbHQgPSBpdGVtLm5hbWU7IGZhdmljb24ub25lcnJvciA9ICgpID0+IHsgZmF2aWNvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnfTsgaWNvbkNpcmNsZS5hcHBlbmRDaGlsZChmYXZpY29uKX0NCiAgICAgICAgICAgIGxpbmsuYXBwZW5kQ2hpbGQoaWNvbkNpcmNsZSk7DQogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NlYXJjaCcpIHsNCiAgICAgICAgICAgICAgICBjb25zdCB0b29sdGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IHRvb2x0aXAuY2xhc3NOYW1lID0gJ2ZobC1pdGVtLXRvb2x0aXAnOyB0b29sdGlwLnRleHRDb250ZW50ID0gaXRlbS5uYW1lLmxlbmd0aCA+IDUgPyBpdGVtLm5hbWUuc2xpY2UoMCwgNSkgKyAnLi4nIDogaXRlbS5uYW1lOyBsaW5rLmFwcGVuZENoaWxkKHRvb2x0aXApOw0KICAgICAgICAgICAgICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIChlKSA9PiB7IGNvbnN0IGN1cnJlbnRUb29sdGlwID0gZS5jdXJyZW50VGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJy5maGwtaXRlbS10b29sdGlwJyk7IGlmICghY3VycmVudFRvb2x0aXApIHJldHVybjsgY3VycmVudFRvb2x0aXAuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpOyBjb25zdCB3aWRnZXRSZWN0ID0gd2lkZ2V0V3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgY29uc3QgdG9vbHRpcFJlY3QgPSBjdXJyZW50VG9vbHRpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgbGV0IG9mZnNldFggPSAwOyBjb25zdCBwYWRkaW5nID0gNTsgaWYgKHRvb2x0aXBSZWN0LmxlZnQgPCB3aWRnZXRSZWN0LmxlZnQpIHsgb2Zmc2V0WCA9IHdpZGdldFJlY3QubGVmdCAtIHRvb2x0aXBSZWN0LmxlZnQgKyBwYWRkaW5nfSBlbHNlIGlmICh0b29sdGlwUmVjdC5yaWdodCA+IHdpZGdldFJlY3QucmlnaHQpIHsgb2Zmc2V0WCA9IHdpZGdldFJlY3QucmlnaHQgLSB0b29sdGlwUmVjdC5yaWdodCAtIHBhZGRpbmd9IGlmIChvZmZzZXRYICE9PSAwKSB7IGN1cnJlbnRUb29sdGlwLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKGNhbGMoLTUwJSArICR7b2Zmc2V0WH1weCkpYH0gfSk7DQogICAgICAgICAgICAgICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKGUpID0+IHsgY29uc3QgY3VycmVudFRvb2x0aXAgPSBlLmN1cnJlbnRUYXJnZXQucXVlcnlTZWxlY3RvcignLmZobC1pdGVtLXRvb2x0aXAnKTsgaWYgKCFjdXJyZW50VG9vbHRpcCkgcmV0dXJuOyBjdXJyZW50VG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7IGN1cnJlbnRUb29sdGlwLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKC01MCUpJ30pOw0KICAgICAgICAgICAgfSBlbHNlIHsgY29uc3QgbmFtZVNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IG5hbWVTcGFuLmNsYXNzTmFtZSA9ICdmaGwtaXRlbS1uYW1lJzsgbmFtZVNwYW4udGV4dENvbnRlbnQgPSBpdGVtLm5hbWUubGVuZ3RoID4gNSA/IGl0ZW0ubmFtZS5zbGljZSgwLCA1KSArICcuLicgOiBpdGVtLm5hbWU7IGxpbmsuYXBwZW5kQ2hpbGQobmFtZVNwYW4pfQ0KICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdsb2NhbCcpIHsNCiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9scyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBjb250cm9scy5jbGFzc05hbWUgPSAnZmhsLWl0ZW0tY29udHJvbHMnOw0KICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOyBkZWxldGVCdG4uY2xhc3NOYW1lID0gJ2ZobC1jb250cm9sLWJ0bic7IGRlbGV0ZUJ0bi5pbm5lckhUTUwgPSAnJnRpbWVzOyc7IGRlbGV0ZUJ0bi50aXRsZSA9ICfsgq3soJwnOw0KICAgICAgICAgICAgICAgIGRlbGV0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgbGV0IHN0b3JlZEl0ZW1zID0gc2hvcnRjdXRNYW5hZ2VyLmdldCgpOyBzdG9yZWRJdGVtcyA9IHN0b3JlZEl0ZW1zLmZpbHRlcihzdG9yZWQgPT4gc3RvcmVkLnVybCAhPT0gaXRlbS51cmwpOyBzaG9ydGN1dE1hbmFnZXIuc2V0KHN0b3JlZEl0ZW1zKTsgaW5pdGlhbFJlbmRlcigpfSk7DQogICAgICAgICAgICAgICAgY29uc3QgbW92ZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOyBtb3ZlQnRuLmNsYXNzTmFtZSA9ICdmaGwtY29udHJvbC1idG4nOyBtb3ZlQnRuLmlubmVySFRNTCA9ICcmZ3Q7JzsgbW92ZUJ0bi50aXRsZSA9ICfsmKTrpbjsqr3snLzroZwg7J2064+ZJzsNCiAgICAgICAgICAgICAgICBtb3ZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyBsZXQgc3RvcmVkSXRlbXMgPSBzaG9ydGN1dE1hbmFnZXIuZ2V0KCk7IGNvbnN0IGN1cnJlbnRJbmRleCA9IHN0b3JlZEl0ZW1zLmZpbmRJbmRleChzdG9yZWQgPT4gc3RvcmVkLnVybCA9PT0gaXRlbS51cmwpOyBpZiAoY3VycmVudEluZGV4ID4gLTEpIHsgY29uc3QgbmV3SW5kZXggPSAoY3VycmVudEluZGV4ICsgMSkgJSBzdG9yZWRJdGVtcy5sZW5ndGg7IGNvbnN0IFttb3ZlZEl0ZW1dID0gc3RvcmVkSXRlbXMuc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7IHN0b3JlZEl0ZW1zLnNwbGljZShuZXdJbmRleCwgMCwgbW92ZWRJdGVtKTsgc2hvcnRjdXRNYW5hZ2VyLnNldChzdG9yZWRJdGVtcyk7IGluaXRpYWxSZW5kZXIoKX0gfSk7DQogICAgICAgICAgICAgICAgY29udHJvbHMuYXBwZW5kQ2hpbGQoZGVsZXRlQnRuKTsgY29udHJvbHMuYXBwZW5kQ2hpbGQobW92ZUJ0bik7IGxpbmsuYXBwZW5kQ2hpbGQoY29udHJvbHMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGxpbms7DQogICAgICAgIH07DQoNCmNvbnN0IGFwcGVuZE5leHRQYWdlID0gKCkgPT4geyANCiAgICBpZiAoaXNMb2FkaW5nTmV4dFBhZ2UpIHJldHVybjsgDQogICAgaXNMb2FkaW5nTmV4dFBhZ2UgPSB0cnVlOyANCiAgICBjb25zdCBzdGFydEluZGV4ID0gKGN1cnJlbnRQYWdlIC0gMSkgKiBJVEVNU19QRVJfUEFHRTsgDQogICAgY29uc3QgZW5kSW5kZXggPSBjdXJyZW50UGFnZSAqIElURU1TX1BFUl9QQUdFOyANCiAgICBpZiAoc3RhcnRJbmRleCA+PSBjdXJyZW50RGlzcGxheUl0ZW1zLmxlbmd0aCkgeyANCiAgICAgICAgaXNMb2FkaW5nTmV4dFBhZ2UgPSBmYWxzZTsgDQogICAgICAgIHJldHVybjsNCiAgICB9IA0KICAgIGNvbnN0IGl0ZW1zVG9BcHBlbmQgPSBjdXJyZW50RGlzcGxheUl0ZW1zLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsgDQogICAgaXRlbXNUb0FwcGVuZC5mb3JFYWNoKGl0ZW0gPT4geyANCiAgICAgICAgc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5hcHBlbmRDaGlsZChjcmVhdGVJY29uSXRlbShpdGVtLCAnc2VhcmNoJykpOw0KICAgIH0pOyANCiAgICBjdXJyZW50UGFnZSsrOyANCiAgICBpc0xvYWRpbmdOZXh0UGFnZSA9IGZhbHNlOw0KfTsNCg0KY29uc3QgcmVuZGVySW5pdGlhbFJlc3VsdHMgPSAoaXRlbXMpID0+IHsNCiAgICBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLmlubmVySFRNTCA9ICcnOw0KICAgIGN1cnJlbnRQYWdlID0gMTsNCiAgICBjdXJyZW50RGlzcGxheUl0ZW1zID0gQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtdOw0KICAgIGFwcGVuZE5leHRQYWdlKCk7DQp9Ow0KDQpmZXRjaCgnL2FwcF9saXN0X2NhY2hlLmpzb24nKQ0KICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSkNCiAgICAudGhlbihkYXRhID0+IHJlbmRlckluaXRpYWxSZXN1bHRzKGRhdGEpKQ0KICAgIC5jYXRjaChlcnJvciA9PiBjb25zb2xlLmVycm9yKCfrjbDsnbTthLAg66Gc65OcIOyLpO2MqDonLCBlcnJvcikpOw0KDQogICAgICAgIGNvbnN0IHBlcmZvcm1TZWFyY2ggPSBhc3luYyAocXVlcnkgPSAnJykgPT4gew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vYXBwYXBpMi5waHA/cXVlcnk9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWApOw0KICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcignQVBJIOydkeuLtSDsmKTrpZgnKTsNCiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOw0KICAgICAgICAgICAgICAgIHJlbmRlckluaXRpYWxSZXN1bHRzKHJlc3VsdHMpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCfslbEg66qp66GdIOuhnOuTnCDsi6TtjKg6JywgZXJyb3IpOw0KICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdHNDb250YWluZXIuaW5uZXJIVE1MID0gJzxwPuuqqeuhnSDroZzrk5wg7Iuk7YyoPC9wPic7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICBjb25zdCBvcGVuU2VhcmNoID0gKCkgPT4geyB3aWRnZXRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnc2VhcmNoLW1vZGUnKTsgd2lkZ2V0V3JhcHBlci5jbGFzc0xpc3QuYWRkKCdzZWFyY2gtbW9kZScpOyBzZWFyY2hJbnB1dC5mb2N1cygpOyBwZXJmb3JtU2VhcmNoKCl9Ow0KICAgICAgICANCgkJY29uc3QgaW5pdGlhbFJlbmRlciA9ICgpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IGEgPSB0cmFuc2xhdGlvbnNbY3VycmVudExhbmddIHx8IHRyYW5zbGF0aW9uc1snZW4nXTsNCiAgICAgICAgICAgIGNvbnN0IGIgPSBbDQogICAgICAgICAgICAgICAgeyBuYW1lOiBhLnNlYXJjaCwgdXJsOiAnaHR0cHM6Ly9pc2FpLmtyJywgaWNvbjogJ3BoLXNwYXJrbGUnIH0sDQogICAgICAgICAgICAgICAgeyBuYW1lOiBhLnN0b3JlLCB1cmw6ICdodHRwczovL3dlYnN0b3JlLmlzYWkua3IvJywgaW1nOiAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC9lMTI4LnBuZycgfSwNCiAgICAgICAgICAgICAgICB7IG5hbWU6IGEuYW5vbiwgdXJsOiAnaHR0cHM6Ly9hbm9uLmlzYWkua3IvJywgaW1nOiAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC9hMTI4LnBuZycgfSwNCiAgICAgICAgICAgICAgICB7IG5hbWU6IGEuaW1hZ2VzLCB1cmw6ICdodHRwczovLzA5OS5rci8nLCBpbWc6ICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAbGF0ZXN0Lzk5LnBuZycgfSwNCiAgICAgICAgICAgICAgICB7IG5hbWU6IGEuYmxvZywgdXJsOiAnaHR0cHM6Ly9ibG9nLjA5OS5rcicsIGltZzogJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2RuaG9zdEAzLjIuNi95LnBuZycgfSwNCiAgICAgICAgICAgICAgICB7IG5hbWU6IGEuY2hhcmFjdGVyQ2hhdCwgdXJsOiAnaHR0cHM6Ly9sYWkub2R1Yy5rci8nLCBpbWc6ICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAMi43LjYvbGFpNDgucG5nJyB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogYS5hcmNoaXZlLCB1cmw6ICdodHRwczovL2FyY2hpLnZlYWkud29ya2Vycy5kZXYvJywgaW1nOiAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC9fX19fX19fX19fYm94LnBuZycgfSwNCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgIGxpc3RDb250YWluZXIuaW5uZXJIVE1MID0gJzxidXR0b24gY2xhc3M9ImZobC1pY29uLWNpcmNsZSIgc3R5bGU9ImJvcmRlcjowIiBpZD0iZmhsLWVkaXQtbW9kZS1idG4iPjxpIGNsYXNzPSJwaC1ib2xkIHBoLWVyYXNlciI+PC9pPjwvYnV0dG9uPic7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNvbnN0IGVkaXRNb2RlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1lZGl0LW1vZGUtYnRuJyk7DQogICAgICAgICAgICBpZiAoZWRpdE1vZGVCdG4pIHsNCiAgICAgICAgICAgICAgICBpZiAobGlzdENvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ2VkaXQtbW9kZScpKSB7DQogICAgICAgICAgICAgICAgICAgIGVkaXRNb2RlQnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlZGl0TW9kZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgbGlzdENvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCdlZGl0LW1vZGUnKTsNCiAgICAgICAgICAgICAgICAgICAgZWRpdE1vZGVCdG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJyk7IA0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjb25zdCBjID0gc2hvcnRjdXRNYW5hZ2VyLmdldCgpOw0KICAgICAgICAgICAgbGV0IGQgPSBbLi4uYl07DQogICAgICAgICAgICBkLnNwbGljZSgyLCAwLCAuLi5jKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7DQogICAgICAgICAgICBkLmZvckVhY2goZSA9PiB7DQogICAgICAgICAgICAgICAgY29uc3QgZiA9IGMuc29tZShnID0+IGcudXJsID09PSBlLnVybCk7DQogICAgICAgICAgICAgICAgY29uc3QgaCA9IGYgJiYgIWUuaWNvbiAmJiAhZS5pbWcgPyAnbG9jYWwnIDogJ2RlZmF1bHQnOw0KICAgICAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGNyZWF0ZUljb25JdGVtKGUsIGgpKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgbGlzdENvbnRhaW5lci5hcHBlbmRDaGlsZChmcmFnbWVudCk7DQoNCiAgICAgICAgICAgIGNoZWNrU2Nyb2xsYWJpbGl0eSgpOw0KICAgICAgICAgICAgdXBkYXRlQWxsV2lkZ2V0TGlua3MoKTsNCiAgICAgICAgfTsNCiAgICAgICAgDQogICAgICAgIGNvbnN0IHVwZGF0ZVNjcm9sbEluZGljYXRvciA9ICgpID0+IHsgY29uc3Qgc2Nyb2xsTGVmdCA9IGxpc3RDb250YWluZXIuc2Nyb2xsTGVmdDsgY29uc3QgbWF4U2Nyb2xsTGVmdCA9IGxpc3RDb250YWluZXIuc2Nyb2xsV2lkdGggLSBsaXN0Q29udGFpbmVyLmNsaWVudFdpZHRoOyBpZiAobWF4U2Nyb2xsTGVmdCA8PSAwKSByZXR1cm47IGNvbnN0IHNjcm9sbEZyYWN0aW9uID0gc2Nyb2xsTGVmdCAvIG1heFNjcm9sbExlZnQ7IGNvbnN0IHRyYWNrV2lkdGggPSBpbmRpY2F0b3JUcmFjay5jbGllbnRXaWR0aDsgY29uc3QgaW5kaWNhdG9yV2lkdGggPSBzY3JvbGxJbmRpY2F0b3IuY2xpZW50V2lkdGg7IGNvbnN0IG1heEluZGljYXRvckxlZnQgPSB0cmFja1dpZHRoIC0gaW5kaWNhdG9yV2lkdGg7IGNvbnN0IGluZGljYXRvckxlZnQgPSBzY3JvbGxGcmFjdGlvbiAqIG1heEluZGljYXRvckxlZnQ7IHNjcm9sbEluZGljYXRvci5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgtNTAlKSB0cmFuc2xhdGVYKCR7aW5kaWNhdG9yTGVmdH1weClgfTsNCiAgICAgICAgY29uc3QgY2hlY2tTY3JvbGxhYmlsaXR5ID0gKCkgPT4geyBjb25zdCBpc1Njcm9sbGFibGUgPSBsaXN0Q29udGFpbmVyLnNjcm9sbFdpZHRoID4gbGlzdENvbnRhaW5lci5jbGllbnRXaWR0aDsgd2lkZ2V0Q29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoJ3Njcm9sbGFibGUnLCBpc1Njcm9sbGFibGUpOyBpZiAoaXNTY3JvbGxhYmxlKSB1cGRhdGVTY3JvbGxJbmRpY2F0b3IoKX07DQogICAgICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7DQogICAgICAgIGNvbnN0IGhhbmRsZURyYWdNb3ZlID0gKGUpID0+IHsgaWYgKCFpc0RyYWdnaW5nKSByZXR1cm47IGUucHJldmVudERlZmF1bHQoKTsgY29uc3QgdHJhY2tSZWN0ID0gaW5kaWNhdG9yVHJhY2suZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IGNvbnN0IG1heFNjcm9sbExlZnQgPSBsaXN0Q29udGFpbmVyLnNjcm9sbFdpZHRoIC0gbGlzdENvbnRhaW5lci5jbGllbnRXaWR0aDsgbGV0IHBvc2l0aW9uUmF0aW8gPSAoZS5jbGllbnRYIC0gdHJhY2tSZWN0LmxlZnQpIC8gdHJhY2tSZWN0LndpZHRoOyBwb3NpdGlvblJhdGlvID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgcG9zaXRpb25SYXRpbykpOyBsaXN0Q29udGFpbmVyLnNjcm9sbExlZnQgPSBwb3NpdGlvblJhdGlvICogbWF4U2Nyb2xsTGVmdH07DQogICAgICAgIGNvbnN0IGhhbmRsZURyYWdFbmQgPSAoKSA9PiB7IGlmICghaXNEcmFnZ2luZykgcmV0dXJuOyBpc0RyYWdnaW5nID0gZmFsc2U7IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZURyYWdNb3ZlKTsgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZURyYWdFbmQpfTsNCiAgICAgICAgaW5kaWNhdG9yVHJhY2suYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGUpID0+IHsgaXNEcmFnZ2luZyA9IHRydWU7IGhhbmRsZURyYWdNb3ZlKGUpOyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVEcmFnTW92ZSk7IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVEcmFnRW5kKX0pOw0KICAgICAgICBjb25zdCBjbG9zZVNlYXJjaCA9ICgpID0+IHsgd2lkZ2V0Q29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ3NlYXJjaC1tb2RlJyk7IHdpZGdldFdyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgnc2VhcmNoLW1vZGUnKTsgc2VhcmNoSW5wdXQudmFsdWUgPSAnJzsgc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5pbm5lckhUTUwgPSAnJ307DQogICAgICAgIGxldCBoaWRlVGltZW91dCA9IG51bGw7DQogICAgICAgIHdpZGdldENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4geyBjbGVhclRpbWVvdXQoaGlkZVRpbWVvdXQpfSk7DQogICAgICAgIHdpZGdldENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKCkgPT4geyBoaWRlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4geyB3aWRnZXRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyl9LCA2MDAwKX0pOw0KDQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7DQogICAgaWYgKHdpZGdldENvbnRhaW5lci5jb250YWlucyhlLnRhcmdldCkpIHsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIGlmICh3aWRnZXRDb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRkZW4nKSkgew0KICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICAgIHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTsNCiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7DQogICAgICAgICAgICBoaWRlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgICAgIHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTsNCiAgICAgICAgICAgIH0sIDYwMDApOw0KICAgICAgICB9LCA1MCk7DQogICAgfQ0KfSk7DQoNCmxpc3RDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdXBkYXRlU2Nyb2xsSW5kaWNhdG9yKTsNCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBjaGVja1Njcm9sbGFiaWxpdHkpOw0Kc2VhcmNoVHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5TZWFyY2gpOw0KDQogICAgICAgIA0KICAgICAgICBzZWFyY2hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNlYXJjaFRpbWVvdXQpOw0KICAgICAgICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpOw0KICAgICAgICAgICAgc2VhcmNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgICAgIHBlcmZvcm1TZWFyY2gocXVlcnkpOw0KICAgICAgICAgICAgfSwgMzAwKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHsgY29uc3QgaXNBdEJvdHRvbSA9IHNlYXJjaFJlc3VsdHNDb250YWluZXIuc2Nyb2xsVG9wICsgc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5jbGllbnRIZWlnaHQgPj0gc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSAxMDsgaWYgKGlzQXRCb3R0b20pIHsgYXBwZW5kTmV4dFBhZ2UoKX0gfSk7DQogICAgICAgIHNlYXJjaENsb3NlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VTZWFyY2gpOw0KDQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsNCiAgICBjb25zdCB3aWRnZXRDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXdpZGdldC1jb250YWluZXInKTsNCg0KICAgIGlmICh3aWRnZXRDb250YWluZXIgJiYgIXdpZGdldENvbnRhaW5lci5jb250YWlucyhlLnRhcmdldCkpIHsNCiAgICAgICAgY2xvc2VTZWFyY2goKTsNCiAgICB9DQp9KTsNCg0KICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJyAmJiB3aWRnZXRXcmFwcGVyLmNsYXNzTGlzdC5jb250YWlucygnc2VhcmNoLW1vZGUnKSkgeyBjbG9zZVNlYXJjaCgpfSB9KTsNCiAgICAgICAgDQogICAgICAgIGNvbnN0IGFkZEN1cnJlbnRQYWdlVG9XaWRnZXQgPSBhc3luYyAoZSkgPT4gew0KICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICAgICAgY29uc3QgdCA9IHRyYW5zbGF0aW9uc1tjdXJyZW50TGFuZ10gfHwgdHJhbnNsYXRpb25zWydlbiddOw0KICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IGdldFByb2Nlc3NlZFVybCh3aW5kb3cubG9jYXRpb24uaHJlZik7DQogICAgICAgICAgICBsZXQgaWNvbk5hbWUgPSBkb2N1bWVudC50aXRsZSB8fCB0LmN1cnJlbnRQYWdlOw0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vZ2V0X3RpdGxlLnBocD91cmw9JHtlbmNvZGVVUklDb21wb25lbnQoYmFzZVVybCl9YCk7DQogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7IGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7IGlmIChkYXRhLnRpdGxlKSB7IGljb25OYW1lID0gZGF0YS50aXRsZX0gfQ0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIHRpdGxlOicsIGVycm9yKX0NCiAgICAgICAgICAgIGNvbnN0IG5ld0ljb24gPSB7IG5hbWU6IGljb25OYW1lLCB1cmw6IGJhc2VVcmwgfTsNCiAgICAgICAgICAgIGxldCBzdG9yZWRJdGVtcyA9IHNob3J0Y3V0TWFuYWdlci5nZXQoKTsNCiAgICAgICAgICAgIGNvbnN0IGlzQWxyZWFkeUFkZGVkID0gc3RvcmVkSXRlbXMuc29tZShpdGVtID0+IGdldFByb2Nlc3NlZFVybChpdGVtLnVybCkgPT09IGdldFByb2Nlc3NlZFVybChuZXdJY29uLnVybCkpOw0KICAgICAgICAgICAgaWYgKCFpc0FscmVhZHlBZGRlZCkgew0KICAgICAgICAgICAgICAgIGlmIChzdG9yZWRJdGVtcy5sZW5ndGggPj0gMTApIHsgc3RvcmVkSXRlbXMuc2hpZnQoKX0NCiAgICAgICAgICAgICAgICBzdG9yZWRJdGVtcy5wdXNoKG5ld0ljb24pOw0KICAgICAgICAgICAgICAgIHNob3J0Y3V0TWFuYWdlci5zZXQoc3RvcmVkSXRlbXMpOw0KICAgICAgICAgICAgICAgIHRyeSB7IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vcmVnaXN0ZXJfYXBwLnBocGAsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShuZXdJY29uKSB9KX0gY2F0Y2ggKGVycm9yKSB7IGNvbnNvbGUuZXJyb3IoJ0RCIOuTseuhnS/qsLHsi6Ag7Iuk7YyoOicsIGVycm9yKX0NCiAgICAgICAgICAgICAgICBpbml0aWFsUmVuZGVyKCk7DQogICAgICAgICAgICAgICAgaWYgKHdpZGdldFdyYXBwZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWFyY2gtbW9kZScpKSB7IGNsb3NlU2VhcmNoKCl9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHNob3dUb2FzdCh0LmFscmVhZHlBZGRlZCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQoNCiAgICAgICAgY29uc3QgY29weVdpZGdldFNjcmlwdCA9IChlKSA9PiB7DQogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICBjb25zdCB0ZXh0VG9Db3B5ID0gJzxzY3JpcHQgc3JjPSJodHRwczovL3VucGtnLmNvbS9AcGhvc3Bob3ItaWNvbnMvd2ViIj48XC9zY3JpcHQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2RuaG9zdEBsYXRlc3Qvd3NfbGcuanMiPjxcL3NjcmlwdD48bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2RuaG9zdEBsYXRlc3Qvd3NfY3NzLmNzcyI+PGRpdiBpZD0iYXBwIj48XC9kaXY+PHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2RuaG9zdEBsYXRlc3Qvd3NfY2RuaHRtbC5qcyI+PFwvc2NyaXB0PiA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC93c19jZG4uanMiPjxcL3NjcmlwdD4nOw0KICAgICAgICAgICAgY29uc3QgdCA9IHRyYW5zbGF0aW9uc1tjdXJyZW50TGFuZ10gfHwgdHJhbnNsYXRpb25zWydlbiddOw0KICAgICAgICAgICAgY29uc3QgZmFsbGJhY2tDb3B5ID0gKCkgPT4geyBjb25zdCB0ZXh0QXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7IHRleHRBcmVhLnZhbHVlID0gdGV4dFRvQ29weTsgdGV4dEFyZWEuc3R5bGUucG9zaXRpb24gPSAiZml4ZWQiOyB0ZXh0QXJlYS5zdHlsZS50b3AgPSAwOyB0ZXh0QXJlYS5zdHlsZS5sZWZ0ID0gIi05OTk5cHgiOyBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRBcmVhKTsgdGV4dEFyZWEuZm9jdXMoKTsgdGV4dEFyZWEuc2VsZWN0KCk7IHRyeSB7IGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7IHNob3dUb2FzdCh0LmNvZGVDb3BpZWQpfSBjYXRjaCAoZXJyKSB7IGNvbnNvbGUuZXJyb3IoJ0ZhbGxiYWNrOiBPb3BzLCB1bmFibGUgdG8gY29weScsIGVycil9IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dEFyZWEpfTsNCiAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHdpbmRvdy5pc1NlY3VyZUNvbnRleHQpIHsgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dFRvQ29weSkudGhlbigoKSA9PiB7IHNob3dUb2FzdCh0LmNvZGVDb3BpZWQpfSkuY2F0Y2goKCkgPT4geyBmYWxsYmFja0NvcHkoKX0pfSBlbHNlIHsgZmFsbGJhY2tDb3B5KCl9DQogICAgICAgIH07DQoNCiAgICAgICAgYWRkVG9Ib21lQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWRkQ3VycmVudFBhZ2VUb1dpZGdldCk7DQogICAgICAgIHNlYXJjaEFkZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNvcHlXaWRnZXRTY3JpcHQpOw0KICAgICAgICANCiAgICAgICAgc2hvcnRjdXRNYW5hZ2VyLnN5bmNGcm9tVVJMKCk7DQogICAgICAgIHNob3J0Y3V0TWFuYWdlci5nZXQoKTsNCiAgICAgICAgDQogICAgICAgIGFwcGx5TGFuZ3VhZ2UoY3VycmVudExhbmcpOw0KICAgIH0pOw=='))));
6
+ eval(decodeURIComponent(escape(window.atob('DQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAod2luZG93LkZITFdpZGdldEluaXRpYWxpemVkKSByZXR1cm47DQogICAgICAgIHdpbmRvdy5GSExXaWRnZXRJbml0aWFsaXplZCA9IHRydWU7DQoNCiAgICAgICAgY29uc3QgbGFuZ3VhZ2VzID0gWyB7IGNvZGU6ICdlbicsIG5hbWU6ICdFbmdsaXNoJyB9LCB7IGNvZGU6ICdrbycsIG5hbWU6ICftlZzqta3slrQnIH0sIHsgY29kZTogJ2VzJywgbmFtZTogJ0VzcGHDsW9sJyB9LCB7IGNvZGU6ICdoaScsIG5hbWU6ICfgpLngpL/gpKjgpY3gpKbgpYAnIH0sIHsgY29kZTogJ2FyJywgbmFtZTogJ9in2YTYudix2KjZitipJyB9LCB7IGNvZGU6ICdkZScsIG5hbWU6ICdEZXV0c2NoJyB9LCB7IGNvZGU6ICdmcicsIG5hbWU6ICdGcmFuw6dhaXMnIH0sIHsgY29kZTogJ3B0JywgbmFtZTogJ1BvcnR1Z3XDqnMnIH0sIHsgY29kZTogJ2JuJywgbmFtZTogJ+CmrOCmvuCmguCmsuCmvicgfSwgeyBjb2RlOiAnamEnLCBuYW1lOiAn5pel5pys6KqeJyB9LCB7IGNvZGU6ICdydScsIG5hbWU6ICfQoNGD0YHRgdC60LjQuScgfSwgeyBjb2RlOiAnemgnLCBuYW1lOiAn566A5L2T5Lit5paHJyB9LCB7IGNvZGU6ICd0aCcsIG5hbWU6ICfguYTguJfguKInIH0sIHsgY29kZTogJ3ZpJywgbmFtZTogJ1Rp4bq/bmcgVmnhu4d0JyB9LCB7IGNvZGU6ICdpZCcsIG5hbWU6ICdJbmRvbmVzaWEnIH0sIHsgY29kZTogJ3RyJywgbmFtZTogJ1TDvHJrw6dlJyB9LCB7IGNvZGU6ICd1cicsIG5hbWU6ICfYp9ix2K/ZiCcgfV07DQogICAgICAgIGxldCBjdXJyZW50RGlzcGxheUl0ZW1zID0gW107IA0KICAgICAgICBsZXQgY3VycmVudFBhZ2UgPSAxOyANCiAgICAgICAgY29uc3QgSVRFTVNfUEVSX1BBR0UgPSAzMjsNCiAgICAgICAgbGV0IGlzTG9hZGluZ05leHRQYWdlID0gZmFsc2U7IA0KICAgICAgICBsZXQgc2VhcmNoVGltZW91dCA9IG51bGw7DQoNCiAgICAgICAgY29uc3Qgd2lkZ2V0Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC13aWRnZXQtY29udGFpbmVyJyk7DQogICAgICAgIGNvbnN0IHdpZGdldFdyYXBwZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXdpZGdldC13cmFwcGVyJyk7DQogICAgICAgIGNvbnN0IGxpc3RDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWxpc3QtY29udGFpbmVyJyk7DQogICAgICAgIGNvbnN0IHNlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1zZWFyY2gtaW5wdXQnKTsNCiAgICAgICAgY29uc3Qgc2VhcmNoUmVzdWx0c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtc2VhcmNoLXJlc3VsdHMnKTsNCiAgICAgICAgY29uc3Qgc2VhcmNoVHJpZ2dlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtc2VhcmNoLXRyaWdnZXInKTsNCiAgICAgICAgY29uc3Qgc2VhcmNoQ2xvc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNlYXJjaC1jbG9zZScpOw0KICAgICAgICBjb25zdCBpbmRpY2F0b3JUcmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtaW5kaWNhdG9yLXRyYWNrJyk7DQogICAgICAgIGNvbnN0IHNjcm9sbEluZGljYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtc2Nyb2xsLWluZGljYXRvcicpOw0KICAgICAgICBjb25zdCBhZGRUb0hvbWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWFkZC10by1ob21lLWJ0bicpOw0KICAgICAgICBjb25zdCBzZWFyY2hBZGRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNlYXJjaC1hZGQtYnRuJyk7DQogICAgICAgIGNvbnN0IHRvYXN0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtdG9hc3Qtbm90aWZpY2F0aW9uJyk7DQogICAgICAgIGNvbnN0IGZpeGVkUXVlc3Rpb25CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWZpeGVkLXF1ZXN0aW9uJyk7DQogICAgICAgIGNvbnN0IGZpeGVkQ2hhdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtZml4ZWQtY2hhdCcpOw0KICAgICAgICBjb25zdCBmaXhlZEluZm9CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWZpeGVkLWluZm8nKTsNCiAgICAgICAgDQogICAgICAgIGxldCB0b2FzdFRpbWVvdXQgPSBudWxsOw0KDQoJCWNvbnN0IGJyb3dzZXJMYW5nID0gKG5hdmlnYXRvci5sYW5ndWFnZSB8fCBuYXZpZ2F0b3IudXNlckxhbmd1YWdlKS5zdWJzdHJpbmcoMCwgMik7DQoJCWNvbnN0IGlzU3VwcG9ydGVkID0gbGFuZ3VhZ2VzLnNvbWUobGFuZyA9PiBsYW5nLmNvZGUgPT09IGJyb3dzZXJMYW5nKTsNCgkJY29uc3QgY3VycmVudExhbmcgPSBpc1N1cHBvcnRlZCA/IGJyb3dzZXJMYW5nIDogJ2VuJzsNCg0KICAgICAgICBjb25zdCBBUElfQkFTRV9VUkwgPSAnaHR0cHM6Ly9pc2FpLmtyJzsNCg0KCQkvL+yVlO2YuO2ZlCDtlbTslbztlagNCmZ1bmN0aW9uIF8weDI2YWYoXzB4MWNmMmM1LF8weDMyOGFmYyl7XzB4MWNmMmM1PV8weDFjZjJjNS0weDE1YTtjb25zdCBfMHgyM2I0M2M9XzB4MjNiNCgpO2xldCBfMHgyNmFmMjA9XzB4MjNiNDNjW18weDFjZjJjNV07cmV0dXJuIF8weDI2YWYyMDt9ZnVuY3Rpb24gXzB4MjNiNCgpe2NvbnN0IF8weDQyNTQ5ZT1bJ25vdycsJzI0U21LTVZXJywnc2hvcnRjdXRzJywnNjI4MDB1RkpOa3InLCdzaG9ydGN1dHM9JywnMzU2M25ibXN1YycsJzIwOTk5N2RGZVdIZScsJzM1NjUxMjBBdmF6cHgnLCcxMTR0UGJVY1gnLCd0aW1lc3RhbXAnLCczMDk5MFlwVmhyaCcsJzgyNjU0NGp3VlhuQycsJ3NlYXJjaCcsJzI2MjIzM1pjRnh5UycsJ2tleScsJ3VybCcsJ2xlbmd0aCcsJ3NldEl0ZW0nLCdyZW1vdmVJdGVtJywnMlVITU1ldycsJ2dldEl0ZW0nLCdwYXJzZSddO18weDIzYjQ9ZnVuY3Rpb24oKXtyZXR1cm4gXzB4NDI1NDllO307cmV0dXJuIF8weDIzYjQoKTt9KGZ1bmN0aW9uKF8weDFjOTVmMixfMHgyMDI3ODkpe2NvbnN0IF8weDRlZjYzOT1fMHgyNmFmLF8weDUyODY2ZT1fMHgxYzk1ZjIoKTt3aGlsZSghIVtdKXt0cnl7Y29uc3QgXzB4NWQ0M2U0PXBhcnNlSW50KF8weDRlZjYzOSgweDE2ZSkpLzB4MSstcGFyc2VJbnQoXzB4NGVmNjM5KDB4MTY4KSkvMHgyKigtcGFyc2VJbnQoXzB4NGVmNjM5KDB4MTViKSkvMHgzKSstcGFyc2VJbnQoXzB4NGVmNjM5KDB4MTYwKSkvMHg0Ky1wYXJzZUludChfMHg0ZWY2MzkoMHgxNWYpKS8weDUqKHBhcnNlSW50KF8weDRlZjYzOSgweDE1ZCkpLzB4NikrcGFyc2VJbnQoXzB4NGVmNjM5KDB4MTVhKSkvMHg3KigtcGFyc2VJbnQoXzB4NGVmNjM5KDB4MTZjKSkvMHg4KSstcGFyc2VJbnQoXzB4NGVmNjM5KDB4MTYyKSkvMHg5K3BhcnNlSW50KF8weDRlZjYzOSgweDE1YykpLzB4YTtpZihfMHg1ZDQzZTQ9PT1fMHgyMDI3ODkpYnJlYWs7ZWxzZSBfMHg1Mjg2NmVbJ3B1c2gnXShfMHg1Mjg2NmVbJ3NoaWZ0J10oKSk7fWNhdGNoKF8weDU2ZjMxYil7XzB4NTI4NjZlWydwdXNoJ10oXzB4NTI4NjZlWydzaGlmdCddKCkpO319fShfMHgyM2I0LDB4MjBjNjkpKTtjb25zdCBzaG9ydGN1dE1hbmFnZXI9eydrZXknOidmaGwtY3VzdG9tLWljb25zLXdpdGgtZXhwaXJ5JywnZ2V0JzooKT0+e2NvbnN0IF8weDE0OTkxZD1fMHgyNmFmLF8weDMzZTM1Zj1sb2NhbFN0b3JhZ2VbJ2dldEl0ZW0nXShzaG9ydGN1dE1hbmFnZXJbJ2tleSddKTtpZighXzB4MzNlMzVmKXJldHVybltdO3RyeXtjb25zdCBfMHg1ZGRlZjM9SlNPTltfMHgxNDk5MWQoMHgxNmEpXShfMHgzM2UzNWYpO3JldHVybiBBcnJheVsnaXNBcnJheSddKF8weDVkZGVmM1tfMHgxNDk5MWQoMHgxNmQpXSk/XzB4NWRkZWYzW18weDE0OTkxZCgweDE2ZCldWydmaWx0ZXInXShfMHg0NDA5ZTQ9Pl8weDQ0MDllNCYmXzB4NDQwOWU0WyduYW1lJ10mJl8weDQ0MDllNFtfMHgxNDk5MWQoMHgxNjQpXSk6W107fWNhdGNoKF8weDIxOWEyNil7cmV0dXJuIGxvY2FsU3RvcmFnZVtfMHgxNDk5MWQoMHgxNjcpXShzaG9ydGN1dE1hbmFnZXJbXzB4MTQ5OTFkKDB4MTYzKV0pLFtdO319LCdzZXQnOl8weDJlNGM0Mj0+e2NvbnN0IF8weDdiZTBjNz1fMHgyNmFmLF8weDVkODNhOT17J3RpbWVzdGFtcCc6RGF0ZVtfMHg3YmUwYzcoMHgxNmIpXSgpLCdzaG9ydGN1dHMnOl8weDJlNGM0Mn07bG9jYWxTdG9yYWdlW18weDdiZTBjNygweDE2NildKHNob3J0Y3V0TWFuYWdlclsna2V5J10sSlNPTlsnc3RyaW5naWZ5J10oXzB4NWQ4M2E5KSk7fSwnc3luY0Zyb21VUkwnOigpPT57Y29uc3QgXzB4Y2RjMTQ0PV8weDI2YWYsXzB4MTE5YjM3PW5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93Wydsb2NhdGlvbiddW18weGNkYzE0NCgweDE2MSldKSxfMHgxOWUyM2Y9XzB4MTE5YjM3WydnZXQnXShfMHhjZGMxNDQoMHgxNmQpKTtpZihfMHgxOWUyM2YpdHJ5e2NvbnN0IF8weDJkNTM1Mj1kZWNvZGVVUklDb21wb25lbnQoXzB4MTllMjNmKSxfMHg0MWM1M2M9SlNPTlsncGFyc2UnXShfMHgyZDUzNTIpLF8weDI1MzU1Nj1sb2NhbFN0b3JhZ2VbXzB4Y2RjMTQ0KDB4MTY5KV0oc2hvcnRjdXRNYW5hZ2VyW18weGNkYzE0NCgweDE2MyldKTtsZXQgXzB4M2EzMjg2PW51bGw7aWYoXzB4MjUzNTU2KXRyeXtfMHgzYTMyODY9SlNPTlsncGFyc2UnXShfMHgyNTM1NTYpO31jYXRjaChfMHg1YzAxMmUpe18weDNhMzI4Nj1udWxsO31pZihfMHg0MWM1M2NbJ3Nob3J0Y3V0cyddJiZfMHg0MWM1M2NbXzB4Y2RjMTQ0KDB4MTZkKV1bXzB4Y2RjMTQ0KDB4MTY1KV09PT0weDApcmV0dXJuOyghXzB4M2EzMjg2fHxfMHg0MWM1M2NbXzB4Y2RjMTQ0KDB4MTVlKV0+XzB4M2EzMjg2Wyd0aW1lc3RhbXAnXSkmJmxvY2FsU3RvcmFnZVtfMHhjZGMxNDQoMHgxNjYpXShzaG9ydGN1dE1hbmFnZXJbXzB4Y2RjMTQ0KDB4MTYzKV0sSlNPTlsnc3RyaW5naWZ5J10oXzB4NDFjNTNjKSk7fWNhdGNoKF8weDhhN2E0YSl7fX0sJ2dldEFzUGFyYW0nOigpPT57Y29uc3QgXzB4MzNmOTFlPV8weDI2YWYsXzB4NDZhZGE3PWxvY2FsU3RvcmFnZVsnZ2V0SXRlbSddKHNob3J0Y3V0TWFuYWdlcltfMHgzM2Y5MWUoMHgxNjMpXSk7aWYoIV8weDQ2YWRhNylyZXR1cm4nJzt0cnl7Y29uc3QgXzB4NDRiZjg4PUpTT05bXzB4MzNmOTFlKDB4MTZhKV0oXzB4NDZhZGE3KTtpZighXzB4NDRiZjg4WydzaG9ydGN1dHMnXXx8XzB4NDRiZjg4WydzaG9ydGN1dHMnXVtfMHgzM2Y5MWUoMHgxNjUpXT09PTB4MClyZXR1cm4nJzt9Y2F0Y2goXzB4NGFiMzVmKXtyZXR1cm4nJzt9cmV0dXJuIF8weDMzZjkxZSgweDE2ZikrZW5jb2RlVVJJQ29tcG9uZW50KF8weDQ2YWRhNyk7fX07DQoJCS8v7JWU7Zi47ZmUIO2VtOyVvO2VqA0KDQogICAgICAgIA0KICAgICAgICBjb25zdCB1cGRhdGVBbGxXaWRnZXRMaW5rcyA9ICgpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IHBhcmFtU3RyaW5nID0gc2hvcnRjdXRNYW5hZ2VyLmdldEFzUGFyYW0oKTsNCiAgICAgICAgICAgIGlmICghcGFyYW1TdHJpbmcpIHJldHVybjsNCiAgICAgICAgICAgIGNvbnN0IGFsbExpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2ZobC13aWRnZXQtY29udGFpbmVyIC5maGwtaWNvbi1kaXNwbGF5LCAjZmhsLXdpZGdldC1jb250YWluZXIgLmZobC1maXhlZC1pdGVtJyk7DQogICAgICAgICAgICBhbGxMaW5rcy5mb3JFYWNoKGxpbmsgPT4gew0KICAgICAgICAgICAgICAgIGlmIChsaW5rLnRhZ05hbWUgPT09ICdBJykgew0KICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbEhyZWYgPSBsaW5rLmdldEF0dHJpYnV0ZSgnaHJlZicpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoIW9yaWdpbmFsSHJlZiB8fCBvcmlnaW5hbEhyZWYuc3RhcnRzV2l0aCgnIycpKSByZXR1cm47DQogICAgICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3VXJsID0gbmV3IFVSTChvcmlnaW5hbEhyZWYpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gcGFyYW1TdHJpbmcuc3BsaXQoJz0nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1VybC5zZWFyY2hQYXJhbXMuc2V0KGtleSwgdmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbGluay5ocmVmID0gbmV3VXJsLnRvU3RyaW5nKCk7DQoJCQkJCQlsaW5rLnJlbCA9ICdub2ZvbGxvdyc7IA0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgVVJMIGZvciBsaW5rIHVwZGF0ZTonLCBvcmlnaW5hbEhyZWYpfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9Ow0KDQogICAgICAgIGNvbnN0IHNob3dUb2FzdCA9IChtZXNzYWdlKSA9PiB7IGNsZWFyVGltZW91dCh0b2FzdFRpbWVvdXQpOyB0b2FzdEVsZW1lbnQudGV4dENvbnRlbnQgPSBtZXNzYWdlOyB0b2FzdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpOyB0b2FzdFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsgdG9hc3RFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKX0sIDI1MDApfTsNCiAgICAgICAgDQogICAgICAgIGNvbnN0IGFwcGx5TGFuZ3VhZ2UgPSAobGFuZ0NvZGUpID0+IHsNCiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09PSAndW5kZWZpbmVkJykgeyBjb25zb2xlLmVycm9yKCJUcmFuc2xhdGlvbnMgbm90IGxvYWRlZCEgTWFrZSBzdXJlIGxhbmcuanMgaXMgaW5jbHVkZWQgY29ycmVjdGx5LiIpOyByZXR1cm59DQogICAgICAgICAgICBjb25zdCB0ID0gdHJhbnNsYXRpb25zW2xhbmdDb2RlXSB8fCB0cmFuc2xhdGlvbnNbJ2VuJ107DQogICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZyA9IGxhbmdDb2RlOw0KICAgICAgICAgICAgc2VhcmNoVHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0Lm9wZW5TZWFyY2gpOw0KICAgICAgICAgICAgYWRkVG9Ib21lQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQuYWRkVG9XaWRnZXQpOw0KICAgICAgICAgICAgc2VhcmNoQ2xvc2Uuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdC5jbG9zZVNlYXJjaCk7DQogICAgICAgICAgICBzZWFyY2hBZGRCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0NvcHkgV2lkZ2V0IENvZGUnKTsgDQogICAgICAgICAgICBmaXhlZFF1ZXN0aW9uQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQucXVlc3Rpb24pOw0KICAgICAgICAgICAgZml4ZWRDaGF0QnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQuY2hhcmFjdGVyQ2hhdCk7DQogICAgICAgICAgICBmaXhlZEluZm9CdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdC5pbmZvKTsNCiAgICAgICAgICAgIGluaXRpYWxSZW5kZXIoKTsNCiAgICAgICAgfTsNCg0KICAgICAgICBjb25zdCBnZXRQcm9jZXNzZWRVcmwgPSAoZnVsbFVybCkgPT4geyB0cnkgeyBjb25zdCB1cmxPYmogPSBuZXcgVVJMKGZ1bGxVcmwpOyByZXR1cm4gYCR7dXJsT2JqLnByb3RvY29sfS8vJHt1cmxPYmouaG9zdG5hbWV9YH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZ1bGxVcmx9IH07DQoNCiAgICAgICAgLy/slZTtmLjtmZQNCmNvbnN0IF8weDEzNDZhMT1fMHgyNzY2O2Z1bmN0aW9uIF8weDU3NTkoKXtjb25zdCBfMHgyN2FlNzM9WycyNDYzOTBra1RIWXAnLCcxNTcwMDE0NG5uQW9VSycsJyZ0aW1lczsnLCdsZWZ0JywnYXBwZW5kQ2hpbGQnLCdjcmVhdGVEb2N1bWVudEZyYWdtZW50JywnNDE3Mzk4Uk5nU0hpJywncHJldmVudERlZmF1bHQnLCdtb3VzZWRvd24nLCdtb3VzZWVudGVyJywnbm9uZScsJ3RyYW5zbGF0ZVgoY2FsYygtNTAlXHgyMCtceDIwJywnc2V0QXR0cmlidXRlJywncmVsJywncXVlcnlTZWxlY3RvcicsJ2ZpbmRJbmRleCcsJ3RyYW5zZm9ybScsJ2dldCcsJ3NwYW4nLCcmZ3Q7JywnaHJlZicsJy5maGwtaXRlbS10b29sdGlwJywnZ2V0Qm91bmRpbmdDbGllbnRSZWN0JywnYnV0dG9uJywnbGVuZ3RoJywnc3RyaW5naWZ5JywndmlzaWJsZScsJ2dldEFzUGFyYW0nLCdmaGwtaXRlbS10b29sdGlwJywnX2JsYW5rJywnaW5uZXJIVE1MJywnMjM0MDc1NmVDeVpHRCcsJ2Vycm9yJywnMUtmYmVQVicsJ3NldCcsJ2ZobC1pdGVtLWNvbnRyb2xzJywnc2VhcmNoJywnYXBwbGljYXRpb24vanNvbicsJ2ZpbHRlcicsJ2NsaWNrJywncmlnaHQnLCdhZGRFdmVudExpc3RlbmVyJywnc3RvcFByb3BhZ2F0aW9uJywnZmhsLWNvbnRyb2wtYnRuJywnMjM5OTE3Nm5Fc3NtWCcsJ3JlbW92ZScsJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20vczIvZmF2aWNvbnM/c3o9NjQmZG9tYWluX3VybD0nLCdweCkpJywnZmhsLWljb24tZGlzcGxheScsJ3N0eWxlJywnc3BsaXQnLCdzbGljZScsJ2ZobC1pY29uLWNpcmNsZScsJ2ltZycsJ2FkZCcsJ2NsYXNzTmFtZScsJ2NyZWF0ZUVsZW1lbnQnLCd0b1N0cmluZycsJ0ludmFsaWRceDIwVVJMXHgyMGZvclx4MjBzZWFyY2hceDIwcmVzdWx0XHgyMGxpbms6JywndGFyZ2V0Jywnb25lcnJvcicsJ3RleHRDb250ZW50JywnNDU1NjA4M0JuQ2xGUycsJ3VybCcsJ3NwbGljZScsJzEyNDIzOTVRbGxKU28nLCdQT1NUJywnZGlzcGxheScsJ3RyYW5zbGF0ZVgoLTUwJSknLCdtb3VzZWxlYXZlJywndGl0bGUnLCdhbHQnLCdkZWZhdWx0JywnZGl2JywnaWNvbicsJ25hbWUnLCdhcmlhLWxhYmVsJ107XzB4NTc1OT1mdW5jdGlvbigpe3JldHVybiBfMHgyN2FlNzM7fTtyZXR1cm4gXzB4NTc1OSgpO31mdW5jdGlvbiBfMHgyNzY2KF8weDNlMzYzNCxfMHg1YjZmMmEpe18weDNlMzYzND1fMHgzZTM2MzQtMHgxODA7Y29uc3QgXzB4NTc1OWQ3PV8weDU3NTkoKTtsZXQgXzB4Mjc2NmUyPV8weDU3NTlkN1tfMHgzZTM2MzRdO3JldHVybiBfMHgyNzY2ZTI7fShmdW5jdGlvbihfMHg3ZTI4ZmYsXzB4MjkzNGUyKXtjb25zdCBfMHg0Mzc0MzY9XzB4Mjc2NixfMHgyMjJmOGU9XzB4N2UyOGZmKCk7d2hpbGUoISFbXSl7dHJ5e2NvbnN0IF8weDJiZWRjYT1wYXJzZUludChfMHg0Mzc0MzYoMHgxYTIpKS8weDEqKC1wYXJzZUludChfMHg0Mzc0MzYoMHgxODcpKS8weDIpKy1wYXJzZUludChfMHg0Mzc0MzYoMHgxODEpKS8weDMrLXBhcnNlSW50KF8weDQzNzQzNigweDFhZCkpLzB4NCstcGFyc2VJbnQoXzB4NDM3NDM2KDB4MWMyKSkvMHg1K3BhcnNlSW50KF8weDQzNzQzNigweDFhMCkpLzB4NistcGFyc2VJbnQoXzB4NDM3NDM2KDB4MWJmKSkvMHg3K3BhcnNlSW50KF8weDQzNzQzNigweDE4MikpLzB4ODtpZihfMHgyYmVkY2E9PT1fMHgyOTM0ZTIpYnJlYWs7ZWxzZSBfMHgyMjJmOGVbJ3B1c2gnXShfMHgyMjJmOGVbJ3NoaWZ0J10oKSk7fWNhdGNoKF8weDJkNmRiNSl7XzB4MjIyZjhlWydwdXNoJ10oXzB4MjIyZjhlWydzaGlmdCddKCkpO319fShfMHg1NzU5LDB4ODk1ZjEpKTtjb25zdCBjcmVhdGVJY29uSXRlbT0oXzB4ZDI4ZTE0LF8weDE4MGE0OD1fMHgxMzQ2YTEoMHgxYzkpKT0+e2NvbnN0IF8weDU2M2Q1Mj1fMHgxMzQ2YTE7aWYoIV8weGQyOGUxNHx8IV8weGQyOGUxNFtfMHg1NjNkNTIoMHgxY2MpXXx8IV8weGQyOGUxNFtfMHg1NjNkNTIoMHgxYzApXSlyZXR1cm4gZG9jdW1lbnRbXzB4NTYzZDUyKDB4MTg2KV0oKTtjb25zdCBfMHgyYmFlNzg9ZG9jdW1lbnRbXzB4NTYzZDUyKDB4MWI5KV0oJ2EnKTtpZihfMHgxODBhNDg9PT1fMHg1NjNkNTIoMHgxYTUpKXtjb25zdCBfMHgxOTYxNGU9c2hvcnRjdXRNYW5hZ2VyW18weDU2M2Q1MigweDE5YyldKCk7bGV0IF8weDVlNGQ0ZD1fMHhkMjhlMTRbXzB4NTYzZDUyKDB4MWMwKV07aWYoXzB4MTk2MTRlKXRyeXtsZXQgXzB4MjIzMWVmPW5ldyBVUkwoXzB4ZDI4ZTE0Wyd1cmwnXSk7Y29uc3QgW18weDkwNjgwYSxfMHgxZmQ3NDRdPV8weDE5NjE0ZVtfMHg1NjNkNTIoMHgxYjMpXSgnPScpO18weDIyMzFlZlsnc2VhcmNoUGFyYW1zJ11bXzB4NTYzZDUyKDB4MWEzKV0oXzB4OTA2ODBhLF8weDFmZDc0NCksXzB4NWU0ZDRkPV8weDIyMzFlZltfMHg1NjNkNTIoMHgxYmEpXSgpO31jYXRjaChfMHgyNmQwNTkpe2NvbnNvbGVbXzB4NTYzZDUyKDB4MWExKV0oXzB4NTYzZDUyKDB4MWJiKSxfMHhkMjhlMTRbXzB4NTYzZDUyKDB4MWMwKV0pO31fMHgyYmFlNzhbXzB4NTYzZDUyKDB4MTk1KV09XzB4NWU0ZDRkO31lbHNlIF8weDJiYWU3OFtfMHg1NjNkNTIoMHgxOTUpXT1fMHhkMjhlMTRbXzB4NTYzZDUyKDB4MWMwKV07XzB4MmJhZTc4W18weDU2M2Q1MigweDFiOCldPV8weDU2M2Q1MigweDFiMSksXzB4MmJhZTc4W18weDU2M2Q1MigweDE4ZSldPSdub2ZvbGxvdycsXzB4MmJhZTc4W18weDU2M2Q1MigweDE4ZCldKF8weDU2M2Q1MigweDE4MCksXzB4ZDI4ZTE0W18weDU2M2Q1MigweDFjYyldKTtfMHgxODBhNDg9PT1fMHg1NjNkNTIoMHgxYTUpJiYoXzB4MmJhZTc4WydhZGRFdmVudExpc3RlbmVyJ10oXzB4NTYzZDUyKDB4MTg5KSwoKT0+e2NvbnN0IF8weDE4ZDY2Yj1fMHg1NjNkNTI7ZmV0Y2goQVBJX0JBU0VfVVJMKycvdXBkYXRlX3ZpZXdfY291bnQucGhwJyx7J21ldGhvZCc6XzB4MThkNjZiKDB4MWMzKSwnaGVhZGVycyc6eydDb250ZW50LVR5cGUnOl8weDE4ZDY2YigweDFhNil9LCdib2R5JzpKU09OW18weDE4ZDY2YigweDE5YSldKHsndXJsJzpfMHhkMjhlMTRbXzB4MThkNjZiKDB4MWMwKV19KX0pWydjYXRjaCddKGNvbnNvbGVbXzB4MThkNjZiKDB4MWExKV0pO30pLF8weDJiYWU3OFtfMHg1NjNkNTIoMHgxYmMpXT1fMHg1NjNkNTIoMHgxOWUpKTtjb25zdCBfMHgzMDM1MWE9ZG9jdW1lbnRbJ2NyZWF0ZUVsZW1lbnQnXShfMHg1NjNkNTIoMHgxY2EpKTtfMHgzMDM1MWFbXzB4NTYzZDUyKDB4MWI4KV09XzB4NTYzZDUyKDB4MWI1KTtpZihfMHhkMjhlMTRbXzB4NTYzZDUyKDB4MWNiKV0pe2NvbnN0IF8weDJjYWUyNj1kb2N1bWVudFsnY3JlYXRlRWxlbWVudCddKCdpJyk7XzB4MmNhZTI2WydjbGFzc05hbWUnXT0ncGgtYm9sZFx4MjAnK18weGQyOGUxNFtfMHg1NjNkNTIoMHgxY2IpXSxfMHgzMDM1MWFbJ2FwcGVuZENoaWxkJ10oXzB4MmNhZTI2KTt9ZWxzZXtpZihfMHhkMjhlMTRbXzB4NTYzZDUyKDB4MWI2KV0pe2NvbnN0IF8weDJkYzcwMj1kb2N1bWVudFsnY3JlYXRlRWxlbWVudCddKF8weDU2M2Q1MigweDFiNikpO18weDJkYzcwMlsnc3JjJ109XzB4ZDI4ZTE0W18weDU2M2Q1MigweDFiNildLF8weDJkYzcwMltfMHg1NjNkNTIoMHgxYzgpXT1fMHhkMjhlMTRbXzB4NTYzZDUyKDB4MWNjKV0sXzB4MmRjNzAyWydvbmVycm9yJ109KCk9Pntjb25zdCBfMHg0ZDRjMWM9XzB4NTYzZDUyO18weDJkYzcwMltfMHg0ZDRjMWMoMHgxYjIpXVtfMHg0ZDRjMWMoMHgxYzQpXT1fMHg0ZDRjMWMoMHgxOGIpO30sXzB4MzAzNTFhW18weDU2M2Q1MigweDE4NSldKF8weDJkYzcwMik7fWVsc2V7Y29uc3QgXzB4NWNhYzg3PWRvY3VtZW50W18weDU2M2Q1MigweDFiOSldKF8weDU2M2Q1MigweDFiNikpO18weDVjYWM4N1snc3JjJ109XzB4NTYzZDUyKDB4MWFmKStfMHhkMjhlMTRbXzB4NTYzZDUyKDB4MWMwKV0sXzB4NWNhYzg3W18weDU2M2Q1MigweDFjOCldPV8weGQyOGUxNFsnbmFtZSddLF8weDVjYWM4N1tfMHg1NjNkNTIoMHgxYmQpXT0oKT0+e2NvbnN0IF8weDRhMjU4Yj1fMHg1NjNkNTI7XzB4NWNhYzg3W18weDRhMjU4YigweDFiMildW18weDRhMjU4YigweDFjNCldPV8weDRhMjU4YigweDE4Yik7fSxfMHgzMDM1MWFbJ2FwcGVuZENoaWxkJ10oXzB4NWNhYzg3KTt9fV8weDJiYWU3OFsnYXBwZW5kQ2hpbGQnXShfMHgzMDM1MWEpO2lmKF8weDE4MGE0OD09PSdzZWFyY2gnKXtjb25zdCBfMHgxYTYyNWU9ZG9jdW1lbnRbXzB4NTYzZDUyKDB4MWI5KV0oJ2RpdicpO18weDFhNjI1ZVtfMHg1NjNkNTIoMHgxYjgpXT1fMHg1NjNkNTIoMHgxOWQpLF8weDFhNjI1ZVtfMHg1NjNkNTIoMHgxYmUpXT1fMHhkMjhlMTRbXzB4NTYzZDUyKDB4MWNjKV1bXzB4NTYzZDUyKDB4MTk5KV0+MHg1P18weGQyOGUxNFtfMHg1NjNkNTIoMHgxY2MpXVtfMHg1NjNkNTIoMHgxYjQpXSgweDAsMHg1KSsnLi4nOl8weGQyOGUxNFtfMHg1NjNkNTIoMHgxY2MpXSxfMHgyYmFlNzhbXzB4NTYzZDUyKDB4MTg1KV0oXzB4MWE2MjVlKSxfMHgyYmFlNzhbXzB4NTYzZDUyKDB4MWFhKV0oXzB4NTYzZDUyKDB4MThhKSxfMHgzN2M4NGU9Pntjb25zdCBfMHgyYWNhYjM9XzB4NTYzZDUyLF8weDFlNmI4Yz1fMHgzN2M4NGVbJ2N1cnJlbnRUYXJnZXQnXVtfMHgyYWNhYjMoMHgxOGYpXSgnLmZobC1pdGVtLXRvb2x0aXAnKTtpZighXzB4MWU2YjhjKXJldHVybjtfMHgxZTZiOGNbJ2NsYXNzTGlzdCddW18weDJhY2FiMygweDFiNyldKCd2aXNpYmxlJyk7Y29uc3QgXzB4MWIyYzUwPXdpZGdldFdyYXBwZXJbXzB4MmFjYWIzKDB4MTk3KV0oKSxfMHgxMjllOTQ9XzB4MWU2YjhjWydnZXRCb3VuZGluZ0NsaWVudFJlY3QnXSgpO2xldCBfMHgyZDgzYjk9MHgwO2NvbnN0IF8weDU3YWE0Yj0weDU7aWYoXzB4MTI5ZTk0W18weDJhY2FiMygweDE4NCldPF8weDFiMmM1MFtfMHgyYWNhYjMoMHgxODQpXSlfMHgyZDgzYjk9XzB4MWIyYzUwW18weDJhY2FiMygweDE4NCldLV8weDEyOWU5NFtfMHgyYWNhYjMoMHgxODQpXStfMHg1N2FhNGI7ZWxzZSBfMHgxMjllOTRbXzB4MmFjYWIzKDB4MWE5KV0+XzB4MWIyYzUwW18weDJhY2FiMygweDFhOSldJiYoXzB4MmQ4M2I5PV8weDFiMmM1MFsncmlnaHQnXS1fMHgxMjllOTRbJ3JpZ2h0J10tXzB4NTdhYTRiKTtfMHgyZDgzYjkhPT0weDAmJihfMHgxZTZiOGNbXzB4MmFjYWIzKDB4MWIyKV1bXzB4MmFjYWIzKDB4MTkxKV09XzB4MmFjYWIzKDB4MThjKStfMHgyZDgzYjkrXzB4MmFjYWIzKDB4MWIwKSk7fSksXzB4MmJhZTc4W18weDU2M2Q1MigweDFhYSldKF8weDU2M2Q1MigweDFjNiksXzB4MzJiNDlmPT57Y29uc3QgXzB4NTBjOGViPV8weDU2M2Q1MixfMHgzNjFjNzk9XzB4MzJiNDlmWydjdXJyZW50VGFyZ2V0J11bXzB4NTBjOGViKDB4MThmKV0oXzB4NTBjOGViKDB4MTk2KSk7aWYoIV8weDM2MWM3OSlyZXR1cm47XzB4MzYxYzc5WydjbGFzc0xpc3QnXVtfMHg1MGM4ZWIoMHgxYWUpXShfMHg1MGM4ZWIoMHgxOWIpKSxfMHgzNjFjNzlbXzB4NTBjOGViKDB4MWIyKV1bXzB4NTBjOGViKDB4MTkxKV09XzB4NTBjOGViKDB4MWM1KTt9KTt9ZWxzZXtjb25zdCBfMHg0ZTg5MTM9ZG9jdW1lbnRbJ2NyZWF0ZUVsZW1lbnQnXShfMHg1NjNkNTIoMHgxOTMpKTtfMHg0ZTg5MTNbXzB4NTYzZDUyKDB4MWI4KV09J2ZobC1pdGVtLW5hbWUnLF8weDRlODkxM1tfMHg1NjNkNTIoMHgxYmUpXT1fMHhkMjhlMTRbXzB4NTYzZDUyKDB4MWNjKV1bXzB4NTYzZDUyKDB4MTk5KV0+MHg1P18weGQyOGUxNFtfMHg1NjNkNTIoMHgxY2MpXVtfMHg1NjNkNTIoMHgxYjQpXSgweDAsMHg1KSsnLi4nOl8weGQyOGUxNFtfMHg1NjNkNTIoMHgxY2MpXSxfMHgyYmFlNzhbXzB4NTYzZDUyKDB4MTg1KV0oXzB4NGU4OTEzKTt9aWYoXzB4MTgwYTQ4PT09J2xvY2FsJyl7Y29uc3QgXzB4NDM4YWY3PWRvY3VtZW50W18weDU2M2Q1MigweDFiOSldKF8weDU2M2Q1MigweDFjYSkpO18weDQzOGFmN1tfMHg1NjNkNTIoMHgxYjgpXT1fMHg1NjNkNTIoMHgxYTQpO2NvbnN0IF8weDQzMjE3OD1kb2N1bWVudFtfMHg1NjNkNTIoMHgxYjkpXShfMHg1NjNkNTIoMHgxOTgpKTtfMHg0MzIxNzhbXzB4NTYzZDUyKDB4MWI4KV09XzB4NTYzZDUyKDB4MWFjKSxfMHg0MzIxNzhbXzB4NTYzZDUyKDB4MTlmKV09XzB4NTYzZDUyKDB4MTgzKSxfMHg0MzIxNzhbXzB4NTYzZDUyKDB4MWM3KV09J+yCreygnCcsXzB4NDMyMTc4W18weDU2M2Q1MigweDFhYSldKF8weDU2M2Q1MigweDFhOCksXzB4NTdlZTE1PT57Y29uc3QgXzB4MjczYWQyPV8weDU2M2Q1MjtfMHg1N2VlMTVbXzB4MjczYWQyKDB4MTg4KV0oKSxfMHg1N2VlMTVbXzB4MjczYWQyKDB4MWFiKV0oKTtsZXQgXzB4NTQ1YmE4PXNob3J0Y3V0TWFuYWdlclsnZ2V0J10oKTtfMHg1NDViYTg9XzB4NTQ1YmE4W18weDI3M2FkMigweDFhNyldKF8weDNiZjVhMj0+XzB4M2JmNWEyW18weDI3M2FkMigweDFjMCldIT09XzB4ZDI4ZTE0W18weDI3M2FkMigweDFjMCldKSxzaG9ydGN1dE1hbmFnZXJbXzB4MjczYWQyKDB4MWEzKV0oXzB4NTQ1YmE4KSxpbml0aWFsUmVuZGVyKCk7fSk7Y29uc3QgXzB4Mjc5M2ZhPWRvY3VtZW50W18weDU2M2Q1MigweDFiOSldKCdidXR0b24nKTtfMHgyNzkzZmFbXzB4NTYzZDUyKDB4MWI4KV09XzB4NTYzZDUyKDB4MWFjKSxfMHgyNzkzZmFbXzB4NTYzZDUyKDB4MTlmKV09XzB4NTYzZDUyKDB4MTk0KSxfMHgyNzkzZmFbJ3RpdGxlJ109J+yYpOuluOyqveycvOuhnFx4MjDsnbTrj5knLF8weDI3OTNmYVsnYWRkRXZlbnRMaXN0ZW5lciddKF8weDU2M2Q1MigweDFhOCksXzB4NTMzM2JiPT57Y29uc3QgXzB4MzhkOWM5PV8weDU2M2Q1MjtfMHg1MzMzYmJbXzB4MzhkOWM5KDB4MTg4KV0oKSxfMHg1MzMzYmJbXzB4MzhkOWM5KDB4MWFiKV0oKTtsZXQgXzB4MTQ5MmJlPXNob3J0Y3V0TWFuYWdlcltfMHgzOGQ5YzkoMHgxOTIpXSgpO2NvbnN0IF8weDExMWIxOD1fMHgxNDkyYmVbXzB4MzhkOWM5KDB4MTkwKV0oXzB4MzFlMTU2PT5fMHgzMWUxNTZbXzB4MzhkOWM5KDB4MWMwKV09PT1fMHhkMjhlMTRbXzB4MzhkOWM5KDB4MWMwKV0pO2lmKF8weDExMWIxOD4tMHgxKXtjb25zdCBfMHhhZWU4YWM9KF8weDExMWIxOCsweDEpJV8weDE0OTJiZVtfMHgzOGQ5YzkoMHgxOTkpXSxbXzB4MTg4N2Y1XT1fMHgxNDkyYmVbXzB4MzhkOWM5KDB4MWMxKV0oXzB4MTExYjE4LDB4MSk7XzB4MTQ5MmJlWydzcGxpY2UnXShfMHhhZWU4YWMsMHgwLF8weDE4ODdmNSksc2hvcnRjdXRNYW5hZ2VyWydzZXQnXShfMHgxNDkyYmUpLGluaXRpYWxSZW5kZXIoKTt9fSksXzB4NDM4YWY3W18weDU2M2Q1MigweDE4NSldKF8weDQzMjE3OCksXzB4NDM4YWY3W18weDU2M2Q1MigweDE4NSldKF8weDI3OTNmYSksXzB4MmJhZTc4W18weDU2M2Q1MigweDE4NSldKF8weDQzOGFmNyk7fXJldHVybiBfMHgyYmFlNzg7fTsNCgkJLy/slZTtmLjtmZQNCg0KY29uc3QgYXBwZW5kTmV4dFBhZ2UgPSAoKSA9PiB7IA0KICAgIGlmIChpc0xvYWRpbmdOZXh0UGFnZSkgcmV0dXJuOyANCiAgICBpc0xvYWRpbmdOZXh0UGFnZSA9IHRydWU7IA0KICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAoY3VycmVudFBhZ2UgLSAxKSAqIElURU1TX1BFUl9QQUdFOyANCiAgICBjb25zdCBlbmRJbmRleCA9IGN1cnJlbnRQYWdlICogSVRFTVNfUEVSX1BBR0U7IA0KICAgIGlmIChzdGFydEluZGV4ID49IGN1cnJlbnREaXNwbGF5SXRlbXMubGVuZ3RoKSB7IA0KICAgICAgICBpc0xvYWRpbmdOZXh0UGFnZSA9IGZhbHNlOyANCiAgICAgICAgcmV0dXJuOw0KICAgIH0gDQogICAgY29uc3QgaXRlbXNUb0FwcGVuZCA9IGN1cnJlbnREaXNwbGF5SXRlbXMuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpOyANCiAgICBpdGVtc1RvQXBwZW5kLmZvckVhY2goaXRlbSA9PiB7IA0KICAgICAgICBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLmFwcGVuZENoaWxkKGNyZWF0ZUljb25JdGVtKGl0ZW0sICdzZWFyY2gnKSk7DQogICAgfSk7IA0KICAgIGN1cnJlbnRQYWdlKys7IA0KICAgIGlzTG9hZGluZ05leHRQYWdlID0gZmFsc2U7DQp9Ow0KDQpjb25zdCByZW5kZXJJbml0aWFsUmVzdWx0cyA9IChpdGVtcykgPT4gew0KICAgIHNlYXJjaFJlc3VsdHNDb250YWluZXIuaW5uZXJIVE1MID0gJyc7DQogICAgY3VycmVudFBhZ2UgPSAxOw0KICAgIGN1cnJlbnREaXNwbGF5SXRlbXMgPSBBcnJheS5pc0FycmF5KGl0ZW1zKSA/IGl0ZW1zIDogW107DQogICAgYXBwZW5kTmV4dFBhZ2UoKTsNCn07DQoNCmZldGNoKCcvYXBwX2xpc3RfY2FjaGUuanNvbicpDQogICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuanNvbigpKQ0KICAgIC50aGVuKGRhdGEgPT4gcmVuZGVySW5pdGlhbFJlc3VsdHMoZGF0YSkpDQogICAgLmNhdGNoKGVycm9yID0+IGNvbnNvbGUuZXJyb3IoJ+uNsOydtO2EsCDroZzrk5wg7Iuk7YyoOicsIGVycm9yKSk7DQoNCiAgICAgICAgY29uc3QgcGVyZm9ybVNlYXJjaCA9IGFzeW5jIChxdWVyeSA9ICcnKSA9PiB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9hcHBhcGkyLnBocD9xdWVyeT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9YCk7DQogICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKCdBUEkg7J2R64u1IOyYpOulmCcpOw0KICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7DQogICAgICAgICAgICAgICAgcmVuZGVySW5pdGlhbFJlc3VsdHMocmVzdWx0cyk7DQogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+yVsSDrqqnroZ0g66Gc65OcIOyLpO2MqDonLCBlcnJvcik7DQogICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPHA+66qp66GdIOuhnOuTnCDsi6TtjKg8L3A+JzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICAgICAgDQogICAgICAgIGNvbnN0IG9wZW5TZWFyY2ggPSAoKSA9PiB7IHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdzZWFyY2gtbW9kZScpOyB3aWRnZXRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoJ3NlYXJjaC1tb2RlJyk7IHNlYXJjaElucHV0LmZvY3VzKCk7IHBlcmZvcm1TZWFyY2goKX07DQogICAgICAgIA0KCQljb25zdCBpbml0aWFsUmVuZGVyID0gKCkgPT4gew0KICAgICAgICAgICAgY29uc3QgYSA9IHRyYW5zbGF0aW9uc1tjdXJyZW50TGFuZ10gfHwgdHJhbnNsYXRpb25zWydlbiddOw0KICAgICAgICAgICAgY29uc3QgYiA9IFsNCiAgICAgICAgICAgICAgICB7IG5hbWU6IGEuc2VhcmNoLCB1cmw6ICdodHRwczovL2lzYWkua3InLCBpY29uOiAncGgtc3BhcmtsZScgfSwNCiAgICAgICAgICAgICAgICB7IG5hbWU6IGEuc3RvcmUsIHVybDogJ2h0dHBzOi8vd2Vic3RvcmUuaXNhaS5rci8nLCBpbWc6ICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAbGF0ZXN0L2UxMjgucG5nJyB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogYS5hbm9uLCB1cmw6ICdodHRwczovL2Fub24uaXNhaS5rci8nLCBpbWc6ICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAbGF0ZXN0L2ExMjgucG5nJyB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogYS5pbWFnZXMsIHVybDogJ2h0dHBzOi8vMDk5LmtyLycsIGltZzogJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2RuaG9zdEBsYXRlc3QvOTkucG5nJyB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogYS5ibG9nLCB1cmw6ICdodHRwczovL2Jsb2cuMDk5LmtyJywgaW1nOiAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QDMuMi42L3kucG5nJyB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogYS5jaGFyYWN0ZXJDaGF0LCB1cmw6ICdodHRwczovL2xhaS5vZHVjLmtyLycsIGltZzogJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2RuaG9zdEAyLjcuNi9sYWk0OC5wbmcnIH0sDQogICAgICAgICAgICAgICAgeyBuYW1lOiBhLmFyY2hpdmUsIHVybDogJ2h0dHBzOi8vYXJjaGkudmVhaS53b3JrZXJzLmRldi8nLCBpbWc6ICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAbGF0ZXN0L19fX19fX19fX19ib3gucG5nJyB9LA0KICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgbGlzdENvbnRhaW5lci5pbm5lckhUTUwgPSAnPGJ1dHRvbiBjbGFzcz0iZmhsLWljb24tY2lyY2xlIiBzdHlsZT0iYm9yZGVyOjAiIGlkPSJmaGwtZWRpdC1tb2RlLWJ0biI+PGkgY2xhc3M9InBoLWJvbGQgcGgtZXJhc2VyIj48L2k+PC9idXR0b24+JzsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgY29uc3QgZWRpdE1vZGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWVkaXQtbW9kZS1idG4nKTsNCiAgICAgICAgICAgIGlmIChlZGl0TW9kZUJ0bikgew0KICAgICAgICAgICAgICAgIGlmIChsaXN0Q29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucygnZWRpdC1tb2RlJykpIHsNCiAgICAgICAgICAgICAgICAgICAgZWRpdE1vZGVCdG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVkaXRNb2RlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gew0KICAgICAgICAgICAgICAgICAgICBsaXN0Q29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoJ2VkaXQtbW9kZScpOw0KICAgICAgICAgICAgICAgICAgICBlZGl0TW9kZUJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnKTsgDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNvbnN0IGMgPSBzaG9ydGN1dE1hbmFnZXIuZ2V0KCk7DQogICAgICAgICAgICBsZXQgZCA9IFsuLi5iXTsNCiAgICAgICAgICAgIGQuc3BsaWNlKDIsIDAsIC4uLmMpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsNCiAgICAgICAgICAgIGQuZm9yRWFjaChlID0+IHsNCiAgICAgICAgICAgICAgICBjb25zdCBmID0gYy5zb21lKGcgPT4gZy51cmwgPT09IGUudXJsKTsNCiAgICAgICAgICAgICAgICBjb25zdCBoID0gZiAmJiAhZS5pY29uICYmICFlLmltZyA/ICdsb2NhbCcgOiAnZGVmYXVsdCc7DQogICAgICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY3JlYXRlSWNvbkl0ZW0oZSwgaCkpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBsaXN0Q29udGFpbmVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTsNCg0KICAgICAgICAgICAgY2hlY2tTY3JvbGxhYmlsaXR5KCk7DQogICAgICAgICAgICB1cGRhdGVBbGxXaWRnZXRMaW5rcygpOw0KICAgICAgICB9Ow0KICAgICAgICANCiAgICAgICAgY29uc3QgdXBkYXRlU2Nyb2xsSW5kaWNhdG9yID0gKCkgPT4geyBjb25zdCBzY3JvbGxMZWZ0ID0gbGlzdENvbnRhaW5lci5zY3JvbGxMZWZ0OyBjb25zdCBtYXhTY3JvbGxMZWZ0ID0gbGlzdENvbnRhaW5lci5zY3JvbGxXaWR0aCAtIGxpc3RDb250YWluZXIuY2xpZW50V2lkdGg7IGlmIChtYXhTY3JvbGxMZWZ0IDw9IDApIHJldHVybjsgY29uc3Qgc2Nyb2xsRnJhY3Rpb24gPSBzY3JvbGxMZWZ0IC8gbWF4U2Nyb2xsTGVmdDsgY29uc3QgdHJhY2tXaWR0aCA9IGluZGljYXRvclRyYWNrLmNsaWVudFdpZHRoOyBjb25zdCBpbmRpY2F0b3JXaWR0aCA9IHNjcm9sbEluZGljYXRvci5jbGllbnRXaWR0aDsgY29uc3QgbWF4SW5kaWNhdG9yTGVmdCA9IHRyYWNrV2lkdGggLSBpbmRpY2F0b3JXaWR0aDsgY29uc3QgaW5kaWNhdG9yTGVmdCA9IHNjcm9sbEZyYWN0aW9uICogbWF4SW5kaWNhdG9yTGVmdDsgc2Nyb2xsSW5kaWNhdG9yLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKC01MCUpIHRyYW5zbGF0ZVgoJHtpbmRpY2F0b3JMZWZ0fXB4KWB9Ow0KICAgICAgICBjb25zdCBjaGVja1Njcm9sbGFiaWxpdHkgPSAoKSA9PiB7IGNvbnN0IGlzU2Nyb2xsYWJsZSA9IGxpc3RDb250YWluZXIuc2Nyb2xsV2lkdGggPiBsaXN0Q29udGFpbmVyLmNsaWVudFdpZHRoOyB3aWRnZXRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnc2Nyb2xsYWJsZScsIGlzU2Nyb2xsYWJsZSk7IGlmIChpc1Njcm9sbGFibGUpIHVwZGF0ZVNjcm9sbEluZGljYXRvcigpfTsNCiAgICAgICAgbGV0IGlzRHJhZ2dpbmcgPSBmYWxzZTsNCiAgICAgICAgY29uc3QgaGFuZGxlRHJhZ01vdmUgPSAoZSkgPT4geyBpZiAoIWlzRHJhZ2dpbmcpIHJldHVybjsgZS5wcmV2ZW50RGVmYXVsdCgpOyBjb25zdCB0cmFja1JlY3QgPSBpbmRpY2F0b3JUcmFjay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgY29uc3QgbWF4U2Nyb2xsTGVmdCA9IGxpc3RDb250YWluZXIuc2Nyb2xsV2lkdGggLSBsaXN0Q29udGFpbmVyLmNsaWVudFdpZHRoOyBsZXQgcG9zaXRpb25SYXRpbyA9IChlLmNsaWVudFggLSB0cmFja1JlY3QubGVmdCkgLyB0cmFja1JlY3Qud2lkdGg7IHBvc2l0aW9uUmF0aW8gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBwb3NpdGlvblJhdGlvKSk7IGxpc3RDb250YWluZXIuc2Nyb2xsTGVmdCA9IHBvc2l0aW9uUmF0aW8gKiBtYXhTY3JvbGxMZWZ0fTsNCiAgICAgICAgY29uc3QgaGFuZGxlRHJhZ0VuZCA9ICgpID0+IHsgaWYgKCFpc0RyYWdnaW5nKSByZXR1cm47IGlzRHJhZ2dpbmcgPSBmYWxzZTsgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlRHJhZ01vdmUpOyBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlRHJhZ0VuZCl9Ow0KICAgICAgICBpbmRpY2F0b3JUcmFjay5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZSkgPT4geyBpc0RyYWdnaW5nID0gdHJ1ZTsgaGFuZGxlRHJhZ01vdmUoZSk7IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZURyYWdNb3ZlKTsgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZURyYWdFbmQpfSk7DQogICAgICAgIGNvbnN0IGNsb3NlU2VhcmNoID0gKCkgPT4geyB3aWRnZXRDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnc2VhcmNoLW1vZGUnKTsgd2lkZ2V0V3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCdzZWFyY2gtbW9kZScpOyBzZWFyY2hJbnB1dC52YWx1ZSA9ICcnOyBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLmlubmVySFRNTCA9ICcnfTsNCiAgICAgICAgbGV0IGhpZGVUaW1lb3V0ID0gbnVsbDsNCiAgICAgICAgd2lkZ2V0Q29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB7IGNsZWFyVGltZW91dChoaWRlVGltZW91dCl9KTsNCiAgICAgICAgd2lkZ2V0Q29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB7IGhpZGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7IHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKX0sIDYwMDApfSk7DQoNCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsNCiAgICBpZiAod2lkZ2V0Q29udGFpbmVyLmNvbnRhaW5zKGUudGFyZ2V0KSkgew0KICAgICAgICByZXR1cm47DQogICAgfQ0KDQogICAgaWYgKHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGRlbicpKSB7DQogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgd2lkZ2V0Q29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpOw0KICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhpZGVUaW1lb3V0KTsNCiAgICAgICAgICAgIGhpZGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICAgICAgd2lkZ2V0Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpOw0KICAgICAgICAgICAgfSwgNjAwMCk7DQogICAgICAgIH0sIDUwKTsNCiAgICB9DQp9KTsNCg0KbGlzdENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB1cGRhdGVTY3JvbGxJbmRpY2F0b3IpOw0Kd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGNoZWNrU2Nyb2xsYWJpbGl0eSk7DQpzZWFyY2hUcmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlblNlYXJjaCk7DQoNCiAgICAgICAgDQogICAgICAgIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBjbGVhclRpbWVvdXQoc2VhcmNoVGltZW91dCk7DQogICAgICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7DQogICAgICAgICAgICBzZWFyY2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICAgICAgcGVyZm9ybVNlYXJjaChxdWVyeSk7DQogICAgICAgICAgICB9LCAzMDApOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHNlYXJjaFJlc3VsdHNDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4geyBjb25zdCBpc0F0Qm90dG9tID0gc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5zY3JvbGxUb3AgKyBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLmNsaWVudEhlaWdodCA+PSBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLnNjcm9sbEhlaWdodCAtIDEwOyBpZiAoaXNBdEJvdHRvbSkgeyBhcHBlbmROZXh0UGFnZSgpfSB9KTsNCiAgICAgICAgc2VhcmNoQ2xvc2UuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZVNlYXJjaCk7DQoNCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgew0KICAgIGNvbnN0IHdpZGdldENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtd2lkZ2V0LWNvbnRhaW5lcicpOw0KDQogICAgaWYgKHdpZGdldENvbnRhaW5lciAmJiAhd2lkZ2V0Q29udGFpbmVyLmNvbnRhaW5zKGUudGFyZ2V0KSkgew0KICAgICAgICBjbG9zZVNlYXJjaCgpOw0KICAgIH0NCn0pOw0KDQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIHdpZGdldFdyYXBwZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWFyY2gtbW9kZScpKSB7IGNsb3NlU2VhcmNoKCl9IH0pOw0KICAgICAgICANCiAgICAgICAgY29uc3QgYWRkQ3VycmVudFBhZ2VUb1dpZGdldCA9IGFzeW5jIChlKSA9PiB7DQogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICBjb25zdCB0ID0gdHJhbnNsYXRpb25zW2N1cnJlbnRMYW5nXSB8fCB0cmFuc2xhdGlvbnNbJ2VuJ107DQogICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gZ2V0UHJvY2Vzc2VkVXJsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsNCiAgICAgICAgICAgIGxldCBpY29uTmFtZSA9IGRvY3VtZW50LnRpdGxlIHx8IHQuY3VycmVudFBhZ2U7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9nZXRfdGl0bGUucGhwP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChiYXNlVXJsKX1gKTsNCiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHsgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsgaWYgKGRhdGEudGl0bGUpIHsgaWNvbk5hbWUgPSBkYXRhLnRpdGxlfSB9DQogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgeyBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggdGl0bGU6JywgZXJyb3IpfQ0KICAgICAgICAgICAgY29uc3QgbmV3SWNvbiA9IHsgbmFtZTogaWNvbk5hbWUsIHVybDogYmFzZVVybCB9Ow0KICAgICAgICAgICAgbGV0IHN0b3JlZEl0ZW1zID0gc2hvcnRjdXRNYW5hZ2VyLmdldCgpOw0KICAgICAgICAgICAgY29uc3QgaXNBbHJlYWR5QWRkZWQgPSBzdG9yZWRJdGVtcy5zb21lKGl0ZW0gPT4gZ2V0UHJvY2Vzc2VkVXJsKGl0ZW0udXJsKSA9PT0gZ2V0UHJvY2Vzc2VkVXJsKG5ld0ljb24udXJsKSk7DQogICAgICAgICAgICBpZiAoIWlzQWxyZWFkeUFkZGVkKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0b3JlZEl0ZW1zLmxlbmd0aCA+PSAxMCkgeyBzdG9yZWRJdGVtcy5zaGlmdCgpfQ0KICAgICAgICAgICAgICAgIHN0b3JlZEl0ZW1zLnB1c2gobmV3SWNvbik7DQogICAgICAgICAgICAgICAgc2hvcnRjdXRNYW5hZ2VyLnNldChzdG9yZWRJdGVtcyk7DQogICAgICAgICAgICAgICAgdHJ5IHsgYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9yZWdpc3Rlcl9hcHAucGhwYCwgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KG5ld0ljb24pIH0pfSBjYXRjaCAoZXJyb3IpIHsgY29uc29sZS5lcnJvcignREIg65Ox66GdL+qwseyLoCDsi6TtjKg6JywgZXJyb3IpfQ0KICAgICAgICAgICAgICAgIGluaXRpYWxSZW5kZXIoKTsNCiAgICAgICAgICAgICAgICBpZiAod2lkZ2V0V3JhcHBlci5jbGFzc0xpc3QuY29udGFpbnMoJ3NlYXJjaC1tb2RlJykpIHsgY2xvc2VTZWFyY2goKX0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgc2hvd1RvYXN0KHQuYWxyZWFkeUFkZGVkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCg0KICAgICAgICBjb25zdCBjb3B5V2lkZ2V0U2NyaXB0ID0gKGUpID0+IHsNCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgIGNvbnN0IHRleHRUb0NvcHkgPSAnPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL0BwaG9zcGhvci1pY29ucy93ZWIiPjxcL3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC93c19sZy5qcyI+PFwvc2NyaXB0PjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC93c19jc3MuY3NzIj48ZGl2IGlkPSJhcHAiPjxcL2Rpdj48c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC93c19jZG5odG1sLmpzIj48XC9zY3JpcHQ+IDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAbGF0ZXN0L3dzX2Nkbi5qcyI+PFwvc2NyaXB0Pic7DQogICAgICAgICAgICBjb25zdCB0ID0gdHJhbnNsYXRpb25zW2N1cnJlbnRMYW5nXSB8fCB0cmFuc2xhdGlvbnNbJ2VuJ107DQogICAgICAgICAgICBjb25zdCBmYWxsYmFja0NvcHkgPSAoKSA9PiB7IGNvbnN0IHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTsgdGV4dEFyZWEudmFsdWUgPSB0ZXh0VG9Db3B5OyB0ZXh0QXJlYS5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7IHRleHRBcmVhLnN0eWxlLnRvcCA9IDA7IHRleHRBcmVhLnN0eWxlLmxlZnQgPSAiLTk5OTlweCI7IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dEFyZWEpOyB0ZXh0QXJlYS5mb2N1cygpOyB0ZXh0QXJlYS5zZWxlY3QoKTsgdHJ5IHsgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsgc2hvd1RvYXN0KHQuY29kZUNvcGllZCl9IGNhdGNoIChlcnIpIHsgY29uc29sZS5lcnJvcignRmFsbGJhY2s6IE9vcHMsIHVuYWJsZSB0byBjb3B5JywgZXJyKX0gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXh0QXJlYSl9Ow0KICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgd2luZG93LmlzU2VjdXJlQ29udGV4dCkgeyBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0VG9Db3B5KS50aGVuKCgpID0+IHsgc2hvd1RvYXN0KHQuY29kZUNvcGllZCl9KS5jYXRjaCgoKSA9PiB7IGZhbGxiYWNrQ29weSgpfSl9IGVsc2UgeyBmYWxsYmFja0NvcHkoKX0NCiAgICAgICAgfTsNCg0KICAgICAgICBhZGRUb0hvbWVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhZGRDdXJyZW50UGFnZVRvV2lkZ2V0KTsNCiAgICAgICAgc2VhcmNoQWRkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY29weVdpZGdldFNjcmlwdCk7DQogICAgICAgIA0KICAgICAgICBzaG9ydGN1dE1hbmFnZXIuc3luY0Zyb21VUkwoKTsNCiAgICAgICAgc2hvcnRjdXRNYW5hZ2VyLmdldCgpOw0KICAgICAgICANCiAgICAgICAgYXBwbHlMYW5ndWFnZShjdXJyZW50TGFuZyk7DQogICAgfSk7'))));