sonamu 0.8.8 → 0.8.10

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 (44) hide show
  1. package/dist/bin/cli.js +2 -1
  2. package/dist/cone/cone-generator.js +8 -3
  3. package/dist/database/puri.d.ts +1 -0
  4. package/dist/database/puri.d.ts.map +1 -1
  5. package/dist/database/puri.js +5 -1
  6. package/dist/migration/migrator.d.ts.map +1 -1
  7. package/dist/migration/migrator.js +37 -33
  8. package/dist/syncer/file-patterns.d.ts +15 -5
  9. package/dist/syncer/file-patterns.d.ts.map +1 -1
  10. package/dist/syncer/file-patterns.js +5 -3
  11. package/dist/syncer/syncer.js +1 -1
  12. package/dist/testing/__tests__/dev-vitest-manager.test.js +27 -1
  13. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  14. package/dist/testing/dev-test-routes.js +82 -4
  15. package/dist/testing/dev-vitest-manager.d.ts +8 -1
  16. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  17. package/dist/testing/dev-vitest-manager.js +209 -7
  18. package/dist/testing/fixture-generator.d.ts.map +1 -1
  19. package/dist/testing/fixture-generator.js +34 -30
  20. package/dist/ui/api.js +5 -5
  21. package/dist/ui-web/assets/index-B3NU_uZ2.css +1 -0
  22. package/dist/ui-web/assets/{index-DphNCij5.js → index-C3UTzGvY.js} +91 -91
  23. package/dist/ui-web/index.html +2 -2
  24. package/package.json +3 -3
  25. package/src/bin/cli.ts +1 -0
  26. package/src/cone/cone-generator.ts +7 -2
  27. package/src/database/puri.ts +7 -0
  28. package/src/migration/migrator.ts +42 -41
  29. package/src/shared/web.shared.ts.txt +8 -3
  30. package/src/skills/sonamu/SKILL.md +26 -11
  31. package/src/skills/sonamu/cone.md +271 -0
  32. package/src/skills/sonamu/entity-basic.md +221 -65
  33. package/src/skills/sonamu/fixture-cli.md +2 -2
  34. package/src/skills/sonamu/migration.md +24 -13
  35. package/src/skills/sonamu/scaffolding.md +16 -0
  36. package/src/skills/sonamu/workflow.md +75 -45
  37. package/src/syncer/file-patterns.ts +8 -18
  38. package/src/syncer/syncer.ts +1 -1
  39. package/src/testing/__tests__/dev-vitest-manager.test.ts +21 -0
  40. package/src/testing/dev-test-routes.ts +83 -3
  41. package/src/testing/dev-vitest-manager.ts +258 -7
  42. package/src/testing/fixture-generator.ts +46 -40
  43. package/src/ui/api.ts +5 -5
  44. package/dist/ui-web/assets/index-DNMaDuR4.css +0 -1
package/dist/bin/cli.js CHANGED
@@ -332,6 +332,7 @@ bootstrap().finally(async ()=>{
332
332
  "--node-args=--import=sonamu/hmr-hook-register",
333
333
  "--node-args=--enable-source-maps",
334
334
  "--on-key=r:restart:Restart server",
335
+ "--on-key=c:clear:Clear screen",
335
336
  `--on-key=f:shell(rm ${path.join(apiRoot, "sonamu.lock")}):restart:Force restart`,
336
337
  "--on-key=enter:shell(echo hi):Key binding test",
337
338
  "--on-key=ctrl+f ctrl+f:shell(git pull && pnpm install && pnpm --filter sonamu build && echo 'Sonamu is now up-to-date!'):restart:Pull & install & build & restart",
@@ -1225,4 +1226,4 @@ status: draft
1225
1226
  return findAppRootPath();
1226
1227
  }
1227
1228
 
1228
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgZXhlY1N5bmMsIHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGNwLCBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzeW1saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XG5pbXBvcnQgeyB0c2ljbGkgfSBmcm9tIFwidHNpY2xpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyB9IGZyb20gXCIuLi9hdXRoL2F1dGgtZ2VuZXJhdG9yXCI7XG5pbXBvcnQge1xuICB0eXBlIEJldHRlckF1dGhQbHVnaW5JZCxcbiAgaXNWYWxpZFBsdWdpbklkLFxuICBTVVBQT1JURURfUExVR0lOX0lEUyxcbn0gZnJvbSBcIi4uL2F1dGgvcGx1Z2lucy9lbnRpdHktZGVmaW5pdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBleGVjV2l0aExpbmVQcmVmaXgsXG4gIHByaW50QnVpbGRTdW1tYXJ5LFxuICBwcmludFRhc2tGYWlsZWQsXG4gIHByaW50VGFza0hlYWRlcixcbiAgcHJpbnRUYXNrU3RhcnQsXG4gIHByaW50VGFza1N1Y2Nlc3MsXG59IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoLCBmaW5kQXBwUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IEFQSV9BUlRJRkFDVFMsIHR5cGUgQnVpbGRBcnRpZmFjdCwgV0VCX0FSVElGQUNUUyB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuaW1wb3J0IHsgZml4dHVyZUV4cGxvcmVDb21tYW5kLCBmaXh0dXJlRmV0Y2hDb21tYW5kLCBmaXh0dXJlR2VuQ29tbWFuZCB9IGZyb20gXCIuL2ZpeHR1cmVcIjtcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSBcIi4vdGVzdC1jb21tYW5kXCI7XG5cbmxldCBtaWdyYXRvcjogTWlncmF0b3I7XG5cbi8qKlxuICogQ0xJIOyYteyFmOydhCDtjIzsi7HtlZjripQg7Zes7Y28IO2VqOyImFxuICovXG5mdW5jdGlvbiBwYXJzZUNsaU9wdGlvbnMoYXJndjogc3RyaW5nW10gPSBwcm9jZXNzLmFyZ3YpOiB7XG4gIGZsYWdzOiBTZXQ8c3RyaW5nPjsgLy8gLS1yZWdlbmVyYXRlLCAtLWFpLCAtLW5vLWNvbmVzIOuTsVxuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyAvLyAtLWxvY2FsZSBrbyDrk7Fcbn0ge1xuICBjb25zdCBmbGFncyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXJnID0gYXJndltpXTtcbiAgICBpZiAoIWFyZy5zdGFydHNXaXRoKFwiLS1cIikpIGNvbnRpbnVlO1xuXG4gICAgLy8gLS1vcHRpb249dmFsdWUg7ZiV7IudXG4gICAgaWYgKGFyZy5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGFyZy5zbGljZSgyKS5zcGxpdChcIj1cIik7XG4gICAgICBvcHRpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIC0tb3B0aW9uIHZhbHVlIO2YleyLneyduOyngCDtmZXsnbhcbiAgICBjb25zdCBuZXh0QXJnID0gYXJndltpICsgMV07XG4gICAgaWYgKG5leHRBcmcgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi0tXCIpICYmICFuZXh0QXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICBvcHRpb25zW2FyZy5zbGljZSgyKV0gPSBuZXh0QXJnO1xuICAgICAgaSsrOyAvLyDri6TsnYwgYXJn64qUIOqwkuydtOuvgOuhnCDsiqTtgrVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gLS1mbGFnIO2YleyLnVxuICAgICAgZmxhZ3MuYWRkKGFyZy5zbGljZSgyKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZmxhZ3MsIG9wdGlvbnMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuICBjb25zdCBub3RUb0luaXQgPSBbXCJkZXZcIiwgXCJidWlsZFwiLCBcInN0YXJ0XCIsIFwic2tpbGxzXCIsIFwidGVzdFwiXS5pbmNsdWRlcyhwcm9jZXNzLmFyZ3ZbMl0gPz8gXCJcIik7XG4gIGlmICghbm90VG9Jbml0KSB7XG4gICAgYXdhaXQgU29uYW11LmluaXQoZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gdHNpY2xp64qUIOygle2Zle2VnCDrqoXroLnslrQg66ek7Lmt66eMIOyngOybkO2VmOuvgOuhnCwgLS3roZwg7Iuc7J6R7ZWY64qUIOyYteyFmOqzvCDqt7gg6rCS7J2EIO2VhO2EsOunge2VqeuLiOuLpC5cbiAgICAvLyDsmLXshZgg7YyM7Iux7J2AIOqwgSBydW5uZXIg7ZWo7IiY7JeQ7IScIOybkOuzuCBwcm9jZXNzLmFyZ3brpbwg7IKs7Jqp7ZWY7JesIOyImO2Wie2VqeuLiOuLpC5cbiAgICAvLyBcIi0tXCIoYmFyZSBkb3VibGUgZGFzaCnripQgcGFzc3Rocm91Z2gg6rWs67aE7J6Q7J2066+A66GcLCDqt7gg65Kk7J2YIOuqqOuToCDsnbjsnpDrj4Qg7KCc7Jm47ZWp64uI64ukLlxuICAgIGNvbnN0IGZpbHRlcmVkQXJndjogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgc2tpcE5leHQgPSBmYWxzZTtcbiAgICBsZXQgYWZ0ZXJEb3VibGVEYXNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzLmFyZ3YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFyZyA9IHByb2Nlc3MuYXJndltpXTtcbiAgICAgIGlmIChhcmcgPT09IFwiLS1cIikge1xuICAgICAgICBhZnRlckRvdWJsZURhc2ggPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhZnRlckRvdWJsZURhc2gpIGNvbnRpbnVlO1xuICAgICAgaWYgKHNraXBOZXh0KSB7XG4gICAgICAgIHNraXBOZXh0ID0gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1cIikpIHtcbiAgICAgICAgLy8gLS1vcHRpb249dmFsdWUg7ZiV7Iud7J2AIOydtCBhcmfrp4wg7Iqk7YK1XG4gICAgICAgIGlmIChhcmcuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gLS1vcHRpb24gdmFsdWUg7ZiV7Iud7J247KeAIO2ZleyduDog64uk7J2MIGFyZ+qwgCAtLeuhnCDsi5zsnpHtlZjsp4Ag7JWK7Jy866m0IOqwkuydtCDsnojripQg6rKDXG4gICAgICAgIGNvbnN0IG5leHRBcmcgPSBwcm9jZXNzLmFyZ3ZbaSArIDFdO1xuICAgICAgICBpZiAobmV4dEFyZyAmJiAhbmV4dEFyZy5zdGFydHNXaXRoKFwiLS1cIikgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICBza2lwTmV4dCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmaWx0ZXJlZEFyZ3YucHVzaChhcmcpO1xuICAgIH1cblxuICAgIC8vIGJ1aWxkL2RldiDrqoXroLnslrTqsIAg7ISc67iM7Luk66eo65OcIOyXhuydtCDtmLjstpzrkKAg65WMIFwiYWxsXCLsnYQg6riw67O46rCS7Jy866GcIOy2lOqwgO2VqeuLiOuLpC5cbiAgICAvLyDsmIg6IGBzb25hbXUgYnVpbGRgIOKGkiBgc29uYW11IGJ1aWxkIGFsbGAsIGBzb25hbXUgZGV2YCDihpIgYHNvbmFtdSBkZXYgYWxsYFxuICAgIGNvbnN0IGNtZCA9IGZpbHRlcmVkQXJndlsyXTtcbiAgICBpZiAoKGNtZCA9PT0gXCJidWlsZFwiIHx8IGNtZCA9PT0gXCJkZXZcIikgJiYgZmlsdGVyZWRBcmd2Lmxlbmd0aCA9PT0gMykge1xuICAgICAgZmlsdGVyZWRBcmd2LnB1c2goXCJhbGxcIik7XG4gICAgfVxuXG4gICAgLy8gdGVzdCDsu6Trp6jrk5zripQg6rCA67OAIOyduOyekCjtjIzsnbzrqoUsIC0tcGF0dGVybiDrk7Ep66W8IOuwm+ycvOuvgOuhnCB0c2ljbGnrpbwg7Jqw7ZqM7ZWp64uI64ukLlxuICAgIGlmIChjbWQgPT09IFwidGVzdFwiKSB7XG4gICAgICByZXR1cm4gdGVzdENvbW1hbmQoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0c2ljbGkoZmlsdGVyZWRBcmd2LCB7XG4gICAgICB0eXBlczoge1xuICAgICAgICBcIiNlbnRpdHlJZFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJhdXRvY29tcGxldGVcIixcbiAgICAgICAgICBuYW1lOiBcIiNlbnRpdHlJZFwiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiUGxlYXNlIGlucHV0ICNlbnRpdHlJZFwiLFxuICAgICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsUGFyZW50SWRzKCkubWFwKChlbnRpdHlJZCkgPT4gKHtcbiAgICAgICAgICAgIHRpdGxlOiBlbnRpdHlJZCxcbiAgICAgICAgICAgIHZhbHVlOiBlbnRpdHlJZCxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICAgIFwiI3JlY29yZElkc1wiOiBcIm51bWJlcltdXCIsXG4gICAgICAgIFwiI25hbWVcIjogXCJzdHJpbmdcIixcbiAgICAgICAgXCIjdGFyZ2V0c1wiOiB7XG4gICAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICAgIG5hbWU6IFwiI3RhcmdldHNcIixcbiAgICAgICAgICBtZXNzYWdlOiBcIlBsZWFzZSBpbnB1dCAjdGFyZ2V0c1wiLFxuICAgICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiRGV2ZWxvcG1lbnRcIiwgdmFsdWU6IFwiZGV2ZWxvcG1lbnRfbWFzdGVyXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiUHJvZHVjdGlvblwiLCB2YWx1ZTogXCJwcm9kdWN0aW9uX21hc3RlclwiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIkZpeHR1cmVcIiwgdmFsdWU6IFwiZml4dHVyZVwiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIlRlc3RcIiwgdmFsdWU6IFwidGVzdFwiIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhcmdzOiBbXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJpbml0XCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiaW1wb3J0XCIsIFwiI2VudGl0eUlkXCIsIFwiI3JlY29yZElkc1wiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcInN5bmNcIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJnZW5cIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJmZXRjaFwiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImV4cGxvcmVcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJydW5cIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJhcHBseVwiLCBcIiN0YXJnZXRzXCJdLFxuICAgICAgICBbXCJtaWdyYXRlXCIsIFwic3RhdHVzXCJdLFxuICAgICAgICBbXCJzdHViXCIsIFwicHJhY3RpY2VcIiwgXCIjbmFtZVwiXSxcbiAgICAgICAgW1wic3R1YlwiLCBcImVudGl0eVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsX3Rlc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwidmlld19saXN0XCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfZm9ybVwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wiY29uZVwiLCBcImdlblwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic3luY1wiXSxcbiAgICAgICAgW1wiYnVpbGRcIiwgXCJhbGxcIl0sXG4gICAgICAgIFtcImJ1aWxkXCIsIFwiYXBpXCJdLFxuICAgICAgICBbXCJidWlsZFwiLCBcIndlYlwiXSxcbiAgICAgICAgW1wiZGV2XCIsIFwiYWxsXCJdLFxuICAgICAgICBbXCJkZXZcIiwgXCJhcGlcIl0sXG4gICAgICAgIFtcImRldlwiLCBcIndlYlwiXSxcbiAgICAgICAgW1wic3RhcnRcIl0sXG4gICAgICAgIFtcInNraWxsc1wiLCBcInN5bmNcIl0sXG4gICAgICAgIFtcInNraWxsc1wiLCBcImNyZWF0ZVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJ0ZXN0XCJdLFxuICAgICAgICBbXCJhdXRoXCIsIFwiZ2VuZXJhdGVcIl0sXG4gICAgICBdLFxuICAgICAgcnVubmVyczoge1xuICAgICAgICBtaWdyYXRlX3N0YXR1cyxcbiAgICAgICAgbWlncmF0ZV9ydW4sXG4gICAgICAgIG1pZ3JhdGVfYXBwbHksXG4gICAgICAgIGZpeHR1cmVfaW5pdCxcbiAgICAgICAgZml4dHVyZV9pbXBvcnQsXG4gICAgICAgIGZpeHR1cmVfc3luYyxcbiAgICAgICAgZml4dHVyZV9nZW4sXG4gICAgICAgIGZpeHR1cmVfZmV0Y2gsXG4gICAgICAgIGZpeHR1cmVfZXhwbG9yZSxcbiAgICAgICAgc3R1Yl9wcmFjdGljZSxcbiAgICAgICAgc3R1Yl9lbnRpdHksXG4gICAgICAgIHNjYWZmb2xkX21vZGVsLFxuICAgICAgICBzY2FmZm9sZF9tb2RlbF90ZXN0LFxuICAgICAgICAvLyBzY2FmZm9sZF92aWV3X2xpc3QsXG4gICAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfZm9ybSxcbiAgICAgICAgY29uZV9nZW4sXG4gICAgICAgIHN5bmMsXG4gICAgICAgIGJ1aWxkX2FsbCxcbiAgICAgICAgYnVpbGRfYXBpLFxuICAgICAgICBidWlsZF93ZWIsXG4gICAgICAgIGRldl9hbGwsXG4gICAgICAgIGRldl9hcGksXG4gICAgICAgIGRldl93ZWIsXG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBza2lsbHNfc3luYyxcbiAgICAgICAgc2tpbGxzX2NyZWF0ZSxcbiAgICAgICAgdGVzdDogdGVzdENvbW1hbmQsXG4gICAgICAgIGF1dGhfZ2VuZXJhdGUsXG4gICAgICB9LFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IFNvbmFtdS5kZXN0cm95KCk7XG4gIH1cbn1cblxuYm9vdHN0cmFwKCkuZmluYWxseShhc3luYyAoKSA9PiB7XG4gIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmRlc3Ryb3koKTtcbn0pO1xuXG4vKipcbiAqIHBucG0gc3luYyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOulvCDsi7Htgaztlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN5bmMoKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuc3luYygpO1xufVxuXG4vKipcbiAqIEFQSSDqsJzrsJwg7ISc67KE66W8IOyLpO2Wie2VmOuKlCDqs7XthrUg66Gc7KeB7J6F64uI64ukLlxuICogZGV2X2FsbOqzvCBkZXZfYXBp7JeQ7IScIOqzteycoO2VqeuLiOuLpC5cbiAqXG4gKiBUeXBlU2NyaXB066W8IOuwlOuhnCDsi6TtlontlaAg7IiYIOyeiOuPhOuhnSBAc29uYW11LWtpdC90cy1sb2FkZXLrpbwsXG4gKiBITVLsnYQg7KeA7JuQ7ZWY6riwIOychO2VtCBAc29uYW11LWtpdC9obXItaG9va+ydhCBpbXBvcnTtlZjrqbAsXG4gKiDshozsiqTrp7Ug7KeA7JuQ7J2EIOychO2VtCAtLWVuYWJsZS1zb3VyY2UtbWFwcyDtlIzrnpjqt7jrpbwg7Y+s7ZWo7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiDsnbTrlYwgQHNvbmFtdS1raXQvdHMtbG9hZGVy7JmAIEBzb25hbXUta2l0L2htci1ob29r64qUIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65iQ7ZWcIOyLpO2WieyXkCDsgqzsmqntlZjripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuuPhCDrp4jssKzqsIDsp4DroZwgc29uYW116rCAIOyekOyytOyggeycvOuhnCDqsIDsp4Dqs6Ag7J6I64qUIGRlcGVuZGVuY3nsnoXri4jri6QuXG4gKiDrlLDrnbzshJwg7IKs7Jqp7J6QIO2UhOuhnOygne2KuOyXkOyEnOuKlCDsnbQg7IS4IO2MqO2CpOyngOulvCDsp4HsoJEg7ISk7LmY7ZWgIO2VhOyalOqwgCDsl4bsirXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHNwYXduQXBpRGV2U2VydmVyKG9wdGlvbnM/OiB7IGV4dHJhRW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KSB7XG4gIGNvbnN0IGFwaVJvb3QgPSBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgY29uc3QgZW50cnlQb2ludCA9IFwic3JjL2luZGV4LnRzXCI7XG5cbiAgLy8g7J20IHNvbmFtdSDtjKjtgqTsp4DqsIAgZGVwZW5kZW5jaWVz66GcIOqwgOyngOqzoCDsnojripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuydmCBiaW4vcnVuLmpz66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAgLy8g7J20IOqyveuhnCgvYmluL3J1bi5qcynripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuydmCBwYWNrYWdlLmpzb27snZggYmluIO2VhOuTnOyXkCDrqoXsi5zrkJjslrQg7J6I64qUIOq3uOqyg+qzvCDqsJnsirXri4jri6QuXG4gIGNvbnN0IGhvdFJ1bm5lckJpblBhdGggPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCkucmVzb2x2ZShcbiAgICBcIkBzb25hbXUta2l0L2htci1ydW5uZXIvYmluL3J1bi5qc1wiLFxuICApO1xuXG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLCAvLyBub2RlXG4gICAgW1xuICAgICAgaG90UnVubmVyQmluUGF0aCwgLy8g7J2066CH6rKMIO2VtOyEnCBob3QtcnVubmVy66W8IOyLpO2Wie2VmOq1rOyalFxuICAgICAgXCItLWNsZWFyLXNjcmVlbj1mYWxzZVwiLCAvLyDsnbTtlZggaG90LXJ1bm5lcuyXkOqyjCDrhJjqsqjspIQg7J247J6Q65Ok7J6F64uI64ukLlxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvdHMtbG9hZGVyLXJlZ2lzdGVyXCIsIC8vIFR5cGVTY3JpcHQg7ISc7Y+s7Yq466W8IOychO2VnCDroZzrjZQsXG4gICAgICBcIi0tbm9kZS1hcmdzPS0taW1wb3J0PXNvbmFtdS9obXItaG9vay1yZWdpc3RlclwiLCAvLyBITVLsnYQg7KeA7JuQ7ZWY6riwIOychO2VnCBob29rLFxuICAgICAgXCItLW5vZGUtYXJncz0tLWVuYWJsZS1zb3VyY2UtbWFwc1wiLCAvLyDqt7jrpqzqs6Ag7IaM7Iqk66e1IOyngOybkOydhCDsnITtlZwg7ZSM656Y6re47J6F64uI64ukLlxuICAgICAgXCItLW9uLWtleT1yOnJlc3RhcnQ6UmVzdGFydCBzZXJ2ZXJcIiwgLy8gciDriITrpbTrqbQg7ISc67KEIOyerOyLnOyeke2VmOqyjCDtlbTspJjsmpQuXG4gICAgICBgLS1vbi1rZXk9ZjpzaGVsbChybSAke3BhdGguam9pbihhcGlSb290LCBcInNvbmFtdS5sb2NrXCIpfSk6cmVzdGFydDpGb3JjZSByZXN0YXJ0YCwgLy8gZiDriITrpbTrqbQgc29uYW11LmxvY2sg7YyM7J287J2EIOyngOyasOqzoCDshJzrsoQg7J6s7Iuc7J6R7ZWY6rKMIO2VtOykmOyalC5cblxuICAgICAgXCItLW9uLWtleT1lbnRlcjpzaGVsbChlY2hvIGhpKTpLZXkgYmluZGluZyB0ZXN0XCIsIC8vIGVudGVy66W8IGtleeuhnCDsk7gg7IiYIOyeiOydjOydhCDrs7TsnbTquLAg7JyE7ZWcIO2FjOyKpO2KuOyeheuLiOuLpC5cbiAgICAgIFwiLS1vbi1rZXk9Y3RybCtmIGN0cmwrZjpzaGVsbChnaXQgcHVsbCAmJiBwbnBtIGluc3RhbGwgJiYgcG5wbSAtLWZpbHRlciBzb25hbXUgYnVpbGQgJiYgZWNobyAnU29uYW11IGlzIG5vdyB1cC10by1kYXRlIScpOnJlc3RhcnQ6UHVsbCAmIGluc3RhbGwgJiBidWlsZCAmIHJlc3RhcnRcIiwgLy8gbW9kaWZpZXLsmYDsnZgg7KGw7ZWpLCDqt7jrpqzqs6Ag65GQIOqwnOydmCBjaG9yZOulvCDsgqzsmqntlaAg7IiYIOyeiOydjOydhCDrs7TsnbTquLAg7JyE7ZWcIO2FjOyKpO2KuOyeheuLiOuLpC5cbiAgICAgIGVudHJ5UG9pbnQsIC8vIOuniOyngOunieycvOuhnCDsi6TsoJwg7Iuk7ZaJ7ZWgIOyKpO2BrOumve2KuOydmCDqsr3roZzrpbwg64SY6rKo7KSN64uI64ukLlxuICAgIF0sXG4gICAge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgZW52OiB7XG4gICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICBOT0RFX0VOVjogXCJkZXZlbG9wbWVudFwiLFxuICAgICAgICBIT1Q6IFwieWVzXCIsIC8vIOyWmOqwgCDsnojslrTslbwgSE1S7J20IO2ZnOyEse2ZlOuQqeuLiOuLpC5cbiAgICAgICAgQVBJX1JPT1RfUEFUSDogYXBpUm9vdCwgLy8g7J20IOqyveuhnOqwgCBobXItaG9va+ydmCDro6jtirgg65SU66CJ7Yag66as6rCAIOuQqeuLiOuLpC5cbiAgICAgICAgLi4ub3B0aW9ucz8uZXh0cmFFbnYsXG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgLy8g7KKF66OMIOyymOumrFxuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIlxcblxcbvCfkYsgU2h1dHRpbmcgZG93bi4uLlwiKSk7XG4gICAgc2VydmVyUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBjbGVhbnVwKTtcbiAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgY2xlYW51cCk7XG5cbiAgc2VydmVyUHJvY2Vzcy5vbihcImV4aXRcIiwgKGNvZGUpID0+IHtcbiAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFNlcnZlciBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoY29kZSB8fCAxKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIHBucG0gZGV2IC8gcG5wbSBkZXYgYWxsIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog7ZSE66Gc7KCd7Yq47JeQIOuMgO2VtCBITVIg7KeA7JuQ7ZWY64qUIOqwnOuwnCDshJzrsoTrpbwg652E7JuM7KSN64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGRldl9hbGwoKSB7XG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKFwiU3RhcnRpbmcgU29uYW11IGRldiBzZXJ2ZXIuLi5cXG5cIikpO1xuICBzcGF3bkFwaURldlNlcnZlcigpO1xufVxuXG4vKipcbiAqIHBucG0gZGV2IGFwaSDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIEFQSSDsoITsmqkg6rCc67CcIOyEnOuyhOulvCDrnYTsm4Hri4jri6QuXG4gKiBkZXZfYWxs6rO8IOqxsOydmCDrj5nsnbztlZjrkJgsIO2Gte2VqSDsm7kg7ISc67KE66W8IOu5hO2ZnOyEse2ZlO2VqeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5mdW5jdGlvbiBkZXZfYXBpKCkge1xuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIlN0YXJ0aW5nIFNvbmFtdSBBUEktb25seSBkZXYgc2VydmVyLi4uXFxuXCIpKTtcbiAgc3Bhd25BcGlEZXZTZXJ2ZXIoe1xuICAgIGV4dHJhRW52OiB7IFNPTkFNVV9ESVNBQkxFX0lOVEVHUkFURURfV0VCOiBcInllc1wiIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIHBucG0gZGV2IHdlYiDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIFZpdGUg6rCc67CcIOyEnOuyhOulvCDri6jrj4XsnLzroZwg7Iuk7ZaJ7ZWp64uI64ukLlxuICogLS0g65Kk7J2YIOyduOyekOuKlCBWaXRl7JeQIOq3uOuMgOuhnCDsoITri6zrkKnri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGV2X3dlYigpIHtcbiAgY29uc3QgYXBwUm9vdCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKGFwcFJvb3QsIFwid2ViXCIpO1xuXG4gIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJQYXRoKSkpIHtcbiAgICBjb25zb2xlLmVycm9yKGB3ZWIg65SU66CJ7Yag66as66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke3dlYlBhdGh9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gLS0g65Kk7J2YIOyduOyekCDstpTstpxcbiAgY29uc3QgZG91YmxlRGFzaEluZGV4ID0gcHJvY2Vzcy5hcmd2LmluZGV4T2YoXCItLVwiKTtcbiAgY29uc3QgcGFzc3Rocm91Z2hBcmdzID0gZG91YmxlRGFzaEluZGV4ICE9PSAtMSA/IHByb2Nlc3MuYXJndi5zbGljZShkb3VibGVEYXNoSW5kZXggKyAxKSA6IFtdO1xuXG4gIGNvbnN0IHZpdGVBcmdzID0gW1wiZXhlY1wiLCBcInZpdGVcIiwgLi4ucGFzc3Rocm91Z2hBcmdzXTtcblxuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIlN0YXJ0aW5nIFZpdGUgZGV2IHNlcnZlci4uLlxcblwiKSk7XG5cbiAgY29uc3Qgdml0ZVByb2Nlc3MgPSBzcGF3bihcInBucG1cIiwgdml0ZUFyZ3MsIHtcbiAgICBjd2Q6IHdlYlBhdGgsXG4gICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICB9KTtcblxuICB2aXRlUHJvY2Vzcy5vbihcImV4aXRcIiwgKGNvZGUpID0+IHtcbiAgICBwcm9jZXNzLmV4aXQoY29kZSA/PyAwKTtcbiAgfSk7XG5cbiAgLy8gU0lHSU5UL1NJR1RFUk0g7IucIFZpdGUg7ZSE66Gc7IS47Iqk66W8IGdyYWNlZnVsbHkg7KKF66OM7ZWp64uI64ukLlxuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbXCJTSUdJTlRcIiwgXCJTSUdURVJNXCJdIGFzIGNvbnN0KSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHtcbiAgICAgIHZpdGVQcm9jZXNzLmtpbGwoc2lnbmFsKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFNXQyDshKTsoJUg7YyM7J28IOqyveuhnOulvCDqsrDsoJXtlanri4jri6QuIEFQSSDruYzrk5woU1dDKeyXkOyEnOunjCDsgqzsmqnrkKnri4jri6QuXG4gKiDtlITroZzsoJ3tirgg66Oo7Yq47JeQIC5zd2NyY+qwgCDsnojsnLzrqbQg6re46rKD7J2ELCDsl4bsnLzrqbQgc29uYW11IOq4sOuzuCDshKTsoJXsnYQg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU3djQ29uZmlnUGF0aCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICBsZXQgc3djRmlsZVBhdGggPSBcIi5zd2NyY1wiO1xuICB0cnkge1xuICAgIGlmIChhd2FpdCBleGlzdHMoc3djRmlsZVBhdGgpKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCJVc2luZyAuc3djcmMgZnJvbSBwcm9qZWN0IHJvb3QuLi5cIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCJVc2luZyBkZWZhdWx0IC5zd2NyYyBmcm9tIHNvbmFtdSBwYWNrYWdlLi4uXCIpKTtcbiAgICAgIHN3Y0ZpbGVQYXRoID0gcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcIi5zd2NyYy5wcm9qZWN0LWRlZmF1bHRcIik7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiU2V0dGluZyB1cCBzd2MgY29uZmlnIGZpbGUgZmFpbGVkLlwiKSwgZXJyb3IpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gc3djRmlsZVBhdGg7XG59XG5cbi8qKlxuICogc29uYW11IGJ1aWxkIC8gc29uYW11IGJ1aWxkIGFsbCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIGJ1aWxkX2FwaSArIGJ1aWxkX3dlYuydmCDtlanshLHsnoXri4jri6QuIFdlYiDrlJTroInthqDrpqzqsIAg7JeG7Jy866m0IFdlYiDruYzrk5zrpbwg7Iqk7YK17ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZF9hbGwoKSB7XG4gIGF3YWl0IGJ1aWxkX2FwaSgpO1xuICBhd2FpdCBidWlsZF93ZWIoeyBza2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIHBucG0gYnVpbGQgYXBpIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogQVBJIO2UhOuhnOygne2KuOunjCDruYzrk5ztlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfYXBpKCkge1xuICBjb25zdCBhcHBSb290ID0gZmluZEFwcFJvb3RQYXRoKCk7XG4gIGNvbnN0IHN3Y0ZpbGVQYXRoID0gYXdhaXQgcmVzb2x2ZVN3Y0NvbmZpZ1BhdGgoKTtcblxuICBjb25zdCBhcGlTdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgYXJ0aWZhY3Qgb2YgQVBJX0FSVElGQUNUUykge1xuICAgICAgY29uc3QgY3dkID0gcGF0aC5qb2luKGFwcFJvb3QsIGFydGlmYWN0LnByb2plY3RQYXRoKTtcbiAgICAgIHByaW50VGFza0hlYWRlcihhcnRpZmFjdC5uYW1lLCBhcnRpZmFjdC5kZXNjcmlwdGlvbiwgY3dkKTtcblxuICAgICAgYXdhaXQgcnVuQnVpbGRTdGVwcyhhcnRpZmFjdCwgeyBjd2QsIGJ1aWxkQ29tbWFuZEFyZ3M6IHsgY29uZmlnRmlsZVBhdGg6IHN3Y0ZpbGVQYXRoIH0gfSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIHRydWUsIERhdGUubm93KCkgLSBhcGlTdGFydGVkQXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJBUElcIiwgZmFsc2UsIERhdGUubm93KCkgLSBhcGlTdGFydGVkQXQpO1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogcG5wbSBidWlsZCB3ZWIg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBXZWIg7ZSE66Gc7KCd7Yq466eMIOu5jOuTnO2VqeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZF93ZWIoeyBza2lwSWZNaXNzaW5nID0gZmFsc2UgfSA9IHt9KSB7XG4gIGNvbnN0IGFwcFJvb3QgPSBmaW5kQXBwUm9vdFBhdGgoKTtcbiAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbihhcHBSb290LCBcIndlYlwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMod2ViUGF0aCkpKSB7XG4gICAgaWYgKHNraXBJZk1pc3NpbmcpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoXCJXZWIg65SU66CJ7Yag66as6rCAIOyXhuycvOuvgOuhnCBXZWIg67mM65Oc66W8IOqxtOuEiOucgeuLiOuLpC5cIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKGB3ZWIg65SU66CJ7Yag66as66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke3dlYlBhdGh9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3Qgd2ViU3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIFdFQl9BUlRJRkFDVFMpIHtcbiAgICAgIGNvbnN0IGN3ZCA9IHBhdGguam9pbihhcHBSb290LCBhcnRpZmFjdC5wcm9qZWN0UGF0aCk7XG4gICAgICBwcmludFRhc2tIZWFkZXIoYXJ0aWZhY3QubmFtZSwgYXJ0aWZhY3QuZGVzY3JpcHRpb24sIGN3ZCk7XG5cbiAgICAgIGF3YWl0IHJ1bkJ1aWxkU3RlcHMoYXJ0aWZhY3QsIHsgY3dkLCBidWlsZENvbW1hbmRBcmdzOiB7fSB9KTtcbiAgICB9XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJXZWJcIiwgdHJ1ZSwgRGF0ZS5ub3coKSAtIHdlYlN0YXJ0ZWRBdCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIldlYlwiLCBmYWxzZSwgRGF0ZS5ub3coKSAtIHdlYlN0YXJ0ZWRBdCk7XG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuLyoqXG4gKiBwcmUtYnVpbGQsIGJ1aWxkLCBwb3N0LWJ1aWxkIOuLqOqzhOulvCDsiJzssKjsoIHsnLzroZwg7Iuk7ZaJ7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBydW5CdWlsZFN0ZXBzPFQ+KFxuICBhcnRpZmFjdDogQnVpbGRBcnRpZmFjdDxUPixcbiAgb3B0aW9uczogeyBjd2Q6IHN0cmluZzsgYnVpbGRDb21tYW5kQXJnczogVCB9LFxuKSB7XG4gIGNvbnN0IHN0ZXBzID0gW1xuICAgIHsgbmFtZTogXCJwcmUtYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5wcmVCdWlsZENvbW1hbmQ/LigpIH0sXG4gICAgeyBuYW1lOiBcImJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QuYnVpbGRDb21tYW5kKG9wdGlvbnMuYnVpbGRDb21tYW5kQXJncykgfSxcbiAgICB7IG5hbWU6IFwicG9zdC1idWlsZFwiLCBjbWQ6IGFydGlmYWN0LnBvc3RCdWlsZENvbW1hbmQ/LigpIH0sXG4gIF0uZmlsdGVyKChzdGVwKSA9PiBzdGVwLmNtZCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHN0ZXAgPSBzdGVwc1tpXTtcbiAgICBjb25zdCBpc0xhc3QgPSBpID09PSBzdGVwcy5sZW5ndGggLSAxO1xuXG4gICAgdHJ5IHtcbiAgICAgIGFzc2VydChzdGVwLmNtZCk7XG4gICAgICBwcmludFRhc2tTdGFydChzdGVwLm5hbWUsIHN0ZXAuY21kLCBpc0xhc3QpO1xuICAgICAgYXdhaXQgZXhlY1dpdGhMaW5lUHJlZml4KHN0ZXAuY21kLCB7IGN3ZDogb3B0aW9ucy5jd2QgfSk7XG4gICAgICBwcmludFRhc2tTdWNjZXNzKHN0ZXAubmFtZSwgaXNMYXN0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBwcmludFRhc2tGYWlsZWQoc3RlcC5uYW1lLCBpc0xhc3QpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3N0ZXAubmFtZX0gZmFpbGVkYCwgeyBjYXVzZTogZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBwbnBtIHN0YXJ0IO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog67mM65Oc65CcIO2UhOuhnOygne2KuOulvCDsi6Ttlontlanri4jri6QuXG4gKlxuICog67mM65Oc65CcIOqysOqzvOusvChkaXN0IOuUlOugie2GoOumrOydmCBpbmRleC5qcyDsl5Ttirjrpqztj6zsnbjtirgp7J20IOyXhuuLpOuptCDsi6TtlonsnYQg7KSR64uo7ZWp64uI64ukLlxuICog7IaM7Iqk66e1IOyngOybkOqzvCBkb3RlbnYg7KeA7JuQ7J2EIO2PrO2VqO2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhcnQoKSB7XG4gIGNvbnN0IGFwaVJvb3QgPSBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgY29uc3QgZW50cnlQb2ludCA9IFwiZGlzdC9pbmRleC5qc1wiO1xuXG4gIGlmICghKGF3YWl0IGV4aXN0cyhlbnRyeVBvaW50KSkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7ZW50cnlQb2ludH0gbm90IGZvdW5kLiBQbGVhc2UgYnVpbGQgeW91ciBwcm9qZWN0IGZpcnN0LmApKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKFwiUnVuOiBwbnBtIHNvbmFtdSBidWlsZFwiKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBzcGF3biB9ID0gYXdhaXQgaW1wb3J0KFwiY2hpbGRfcHJvY2Vzc1wiKTtcbiAgY29uc3Qgc2VydmVyUHJvY2VzcyA9IHNwYXduKFxuICAgIHByb2Nlc3MuZXhlY1BhdGgsXG4gICAgW1wiLS1lbmFibGUtc291cmNlLW1hcHNcIiwgXCItclwiLCBcImRvdGVudi9jb25maWdcIiwgZW50cnlQb2ludF0sXG4gICAge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgIH0sXG4gICk7XG5cbiAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCAoKSA9PiB7XG4gICAgc2VydmVyUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cE1pZ3JhdG9yKCkge1xuICAvLyBtaWdyYXRvclxuICBtaWdyYXRvciA9IG5ldyBNaWdyYXRvcigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cEZpeHR1cmVNYW5hZ2VyKCkge1xuICBGaXh0dXJlTWFuYWdlci5pbml0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfYXBwbHkodGFyZ2V0czogKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcbiAgYXdhaXQgbWlncmF0b3IucnVuQWN0aW9uKFwiYXBwbHlcIiwgdGFyZ2V0cyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfcnVuKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG4gIGNvbnN0IGxvY2FsSG9zdHMgPSBbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdO1xuICBjb25zdCB0YXJnZXRzID0gT2JqZWN0LmtleXMoU29uYW11LmRiQ29uZmlnKS5maWx0ZXIoKHRhcmdldCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldENvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXQgYXMga2V5b2YgU29uYW11REJDb25maWddO1xuICAgIGNvbnN0IGhvc3QgPSAodGFyZ2V0Q29uZmlnPy5jb25uZWN0aW9uIGFzIHsgaG9zdD86IHN0cmluZyB9KT8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICAgIHJldHVybiBsb2NhbEhvc3RzLmluY2x1ZGVzKGhvc3QudG9Mb3dlckNhc2UoKSk7XG4gIH0pO1xuXG4gIC8vIOuhnOy7rCDrjbDsnbTthLDrsqDsnbTsiqTsl5Ag64yA7ZW07ISc66eMIOyghOyytCDrp4jsnbTqt7jroIjsnbTshZjsl5DshJwg64+Z7J6RXG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcImFwcGx5XCIsIHRhcmdldHMgYXMgKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9zdGF0dXMoKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcblxuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKTtcbiAgLy8gc3RhdHVzO1xuICBjb25zb2xlLmxvZyhzdGF0dXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2luaXQoKSB7XG4gIGNvbnN0IHNyY0NvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZy5kZXZlbG9wbWVudF9tYXN0ZXI7XG4gIGNvbnN0IHRhcmdldHMgPSBbXG4gICAge1xuICAgICAgbGFiZWw6IFwiKFJFTU9URSkgRml4dHVyZSBEQlwiLFxuICAgICAgY29uZmlnOiBTb25hbXUuZGJDb25maWcuZml4dHVyZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBcIihMT0NBTCkgVGVzdGluZyBEQlwiLFxuICAgICAgY29uZmlnOiBTb25hbXUuZGJDb25maWcudGVzdCxcbiAgICAgIHRvU2tpcDogKCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVtb3RlQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuICAgICAgICBjb25zdCBsb2NhbENvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgcmV0dXJuIHJlbW90ZUNvbm4uaG9zdCA9PT0gbG9jYWxDb25uLmhvc3QgJiYgcmVtb3RlQ29ubi5kYXRhYmFzZSA9PT0gbG9jYWxDb25uLmRhdGFiYXNlO1xuICAgICAgfSkoKSxcbiAgICB9LFxuICBdIGFzIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGNvbmZpZzogS25leC5Db25maWc7XG4gICAgdG9Ta2lwPzogYm9vbGVhbjtcbiAgfVtdO1xuXG4gIC8vIDEuIOq4sOykgERCIOyKpO2CpOuniOulvCDrjaTtlIRcbiAgY29uc29sZS5sb2coXCJEVU1QLi4uXCIpO1xuICBjb25zdCBkdW1wRmlsZW5hbWUgPSBgL3RtcC9zb25hbXUtZml4dHVyZS1pbml0LSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgY29uc3Qgc3JjQ29ubiA9IHNyY0NvbmZpZy5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgY29uc3QgbWlncmF0aW9uc0R1bXAgPSBgL3RtcC9zb25hbXUtZml4dHVyZS1pbml0LW1pZ3JhdGlvbnMtJHtEYXRlLm5vdygpfS5zcWxgO1xuICBleGVjU3luYyhcbiAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtZCAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0gPiAke2R1bXBGaWxlbmFtZX1gLFxuICApO1xuICBjb25zdCBfZGIgPSBrbmV4KHNyY0NvbmZpZyk7XG4gIGNvbnN0IFtbbWlncmF0aW9uc11dID0gYXdhaXQgX2RiLnJhdyhcbiAgICBcIlNFTEVDVCBDT1VOVCgqKSBhcyBjb3VudCBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfc2NoZW1hID0gPyBBTkQgdGFibGVfbmFtZSA9ICdrbmV4X21pZ3JhdGlvbnMnXCIsXG4gICAgW3NyY0Nvbm4uZGF0YWJhc2VdLFxuICApO1xuICBpZiAobWlncmF0aW9ucy5jb3VudCA+IDApIHtcbiAgICBleGVjU3luYyhcbiAgICAgIGBteXNxbGR1bXAgLWgke3NyY0Nvbm4uaG9zdH0gLXUke3NyY0Nvbm4udXNlcn0gLXAke3NyY0Nvbm4ucGFzc3dvcmR9IC0tc2luZ2xlLXRyYW5zYWN0aW9uIC0tbm8tY3JlYXRlLWRiIC0tdHJpZ2dlcnMgJHtzcmNDb25uLmRhdGFiYXNlfSBrbmV4X21pZ3JhdGlvbnMga25leF9taWdyYXRpb25zX2xvY2sgPiAke21pZ3JhdGlvbnNEdW1wfWAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDIuIOuMgOyDgURCIOqwgeqwgeyXkCDrjIDtlZjsl6wg7KG07J6s7Jes67aAIO2ZleyduCDtm4Qg67aT6riwXG4gIGZvciBhd2FpdCAoY29uc3QgeyBsYWJlbCwgY29uZmlnLCB0b1NraXAgfSBvZiB0YXJnZXRzKSB7XG4gICAgY29uc3QgY29ubiA9IGNvbmZpZy5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcblxuICAgIGlmICh0b1NraXAgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZChgJHtsYWJlbH06IFNraXBwZWQhYCkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZGIgPSBrbmV4KHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgLi4uKChjb25maWcuY29ubmVjdGlvbiA/PyB7fSkgYXMgS25leC5Db25uZWN0aW9uQ29uZmlnKSxcbiAgICAgICAgZGF0YWJhc2U6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY29uc3QgW1tyb3ddXSA9IGF3YWl0IGRiLnJhdyhgU0hPVyBEQVRBQkFTRVMgTElLRSBcIiR7Y29ubi5kYXRhYmFzZX1cImApO1xuICAgIGlmIChyb3cpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgJHtsYWJlbH06IERhdGFiYXNlIFwiJHtjb25uLmRhdGFiYXNlfVwiIEFscmVhZHkgZXhpc3RzYCkpO1xuICAgICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFNZTkMgdG8gJHtsYWJlbH0uLi5gKTtcbiAgICBjb25zdCBteXNxbENtZCA9IGBteXNxbCAtaCR7Y29ubi5ob3N0fSAtdSR7Y29ubi51c2VyfSAtcCR7Y29ubi5wYXNzd29yZH1gO1xuICAgIGV4ZWNTeW5jKGAke215c3FsQ21kfSAtZSAnRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0NSRUFURSBEQVRBQkFTRSBcXGAke2Nvbm4uZGF0YWJhc2V9XFxgJ2ApO1xuICAgIGV4ZWNTeW5jKGAke215c3FsQ21kfSAke2Nvbm4uZGF0YWJhc2V9IDwgJHtkdW1wRmlsZW5hbWV9YCk7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhtaWdyYXRpb25zRHVtcCkpIHtcbiAgICAgIGV4ZWNTeW5jKGAke215c3FsQ21kfSAke2Nvbm4uZGF0YWJhc2V9IDwgJHttaWdyYXRpb25zRHVtcH1gKTtcbiAgICB9XG5cbiAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gIH1cblxuICBhd2FpdCBfZGIuZGVzdHJveSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2ltcG9ydChlbnRpdHlJZDogc3RyaW5nLCByZWNvcmRJZHM6IG51bWJlcltdKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbXBvcnRGaXh0dXJlKGVudGl0eUlkLCByZWNvcmRJZHMpO1xuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfc3luYygpIHtcbiAgYXdhaXQgc2V0dXBGaXh0dXJlTWFuYWdlcigpO1xuXG4gIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLnN5bmMoKTtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGdlbiDrqoXroLnslrRcbiAqIOyYteyFmOydhCBwcm9jZXNzLmFyZ3bsl5DshJwg7YyM7IuxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfZ2VuKCkge1xuICBjb25zdCBvcHRpb25zID0gcGFyc2VPcHRpb25zKHByb2Nlc3MuYXJndik7XG4gIGF3YWl0IGZpeHR1cmVHZW5Db21tYW5kKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZmV0Y2gg66qF66C57Ja0XG4gKiDsmLXshZjsnYQgcHJvY2Vzcy5hcmd27JeQ7IScIO2MjOyLsVxuICovXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2ZldGNoKCkge1xuICBjb25zdCBvcHRpb25zID0gcGFyc2VPcHRpb25zKHByb2Nlc3MuYXJndik7XG4gIGF3YWl0IGZpeHR1cmVGZXRjaENvbW1hbmQob3B0aW9ucyk7XG59XG5cbi8qKlxuICogZml4dHVyZSBleHBsb3JlIOuqheugueyWtFxuICog7Ji17IWY7J2EIHByb2Nlc3MuYXJnduyXkOyEnCDtjIzsi7FcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9leHBsb3JlKCkge1xuICBjb25zdCBvcHRpb25zID0gcGFyc2VPcHRpb25zKHByb2Nlc3MuYXJndik7XG4gIGF3YWl0IGZpeHR1cmVFeHBsb3JlQ29tbWFuZChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiDqsITri6jtlZwg7Ji17IWYIO2MjOyEnFxuICovXG5mdW5jdGlvbiBwYXJzZU9wdGlvbnMoXG4gIGFyZ3Y6IHN0cmluZ1tdLFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IHN0cmluZ1tdPiAmIHsgXzogc3RyaW5nW10gfSB7XG4gIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXT4gJiB7IF86IHN0cmluZ1tdIH0gPSB7IF86IFtdIH07XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXJnID0gYXJndltpXTtcblxuICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICBjb25zdCBrZXkgPSBhcmcuc2xpY2UoMik7XG5cbiAgICAgIGlmIChrZXkuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgIGNvbnN0IFtrLCB2XSA9IGtleS5zcGxpdChcIj1cIik7XG4gICAgICAgIG9wdGlvbnNba10gPSB2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IGFyZ3ZbaSArIDFdO1xuICAgICAgICBpZiAobmV4dCAmJiAhbmV4dC5zdGFydHNXaXRoKFwiLS1cIikpIHtcbiAgICAgICAgICBvcHRpb25zW2tleV0gPSBuZXh0O1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHRpb25zW2tleV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhcmcuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgIGNvbnN0IGtleSA9IGFyZy5zbGljZSgxKTtcbiAgICAgIGNvbnN0IG5leHQgPSBhcmd2W2kgKyAxXTtcblxuICAgICAgaWYgKG5leHQgJiYgIW5leHQuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgb3B0aW9uc1trZXldID0gbmV4dDtcbiAgICAgICAgaSsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uc1trZXldID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy5fLnB1c2goYXJnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3R1Yl9wcmFjdGljZShuYW1lOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJhY3RpY2VEaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcInByYWN0aWNlc1wiKTtcbiAgY29uc3QgZmlsZU5hbWVzID0gYXdhaXQgcmVhZGRpcihwcmFjdGljZURpcik7XG5cbiAgY29uc3QgbWF4U2VxTm8gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgIGlmICghKGF3YWl0IGV4aXN0cyhwcmFjdGljZURpcikpKSB7XG4gICAgICBhd2FpdCBta2RpcihwcmFjdGljZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyZWRTZXFzID0gZmlsZU5hbWVzXG4gICAgICAuZmlsdGVyKChmaWxlTmFtZSkgPT4gZmlsZU5hbWUuc3RhcnRzV2l0aChcInBcIikgJiYgZmlsZU5hbWUuZW5kc1dpdGgoXCIudHNcIikpXG4gICAgICAubWFwKChmaWxlTmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBbLCBzZXFOb10gPSBmaWxlTmFtZS5tYXRjaCgvXnAoWzAtOV0rKS0vKSA/PyBbXCIwXCIsIFwiMFwiXTtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHNlcU5vKTtcbiAgICAgIH0pXG4gICAgICAuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuXG4gICAgaWYgKGZpbHRlcmVkU2Vxcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmlsdGVyZWRTZXFzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9KSgpO1xuXG4gIGNvbnN0IGN1cnJlbnRTZXFObyA9IG1heFNlcU5vICsgMTtcbiAgY29uc3QgZmlsZU5hbWUgPSBgcCR7Y3VycmVudFNlcU5vfS0ke25hbWV9LnRzYDtcbiAgY29uc3QgZHN0UGF0aCA9IHBhdGguam9pbihwcmFjdGljZURpciwgZmlsZU5hbWUpO1xuXG4gIGNvbnN0IGNvZGUgPSBbXG4gICAgYGltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCJzb25hbXVcIjtgLFxuICAgIFwiXCIsXG4gICAgYGNvbnNvbGUuY2xlYXIoKTtgLFxuICAgIGBjb25zb2xlLmxvZyhcIiR7ZmlsZU5hbWV9XCIpO2AsXG4gICAgXCJcIixcbiAgICBgU29uYW11LnJ1blNjcmlwdChhc3luYyAoKSA9PiB7YCxcbiAgICBgIC8vIFRPRE9gLFxuICAgIGB9KTtgLFxuICAgIFwiXCIsXG4gIF0uam9pbihcIlxcblwiKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGRzdFBhdGgsIGNvZGUpO1xuXG4gIGV4ZWNTeW5jKGBjb2RlICR7ZHN0UGF0aH1gKTtcblxuICBjb25zdCBydW5Db2RlID0gYHlhcm4gbm9kZSAtciBkb3RlbnYvY29uZmlnIC0tZW5hYmxlLXNvdXJjZS1tYXBzIGRpc3QvcHJhY3RpY2VzLyR7ZmlsZU5hbWUucmVwbGFjZShcbiAgICBcIi50c1wiLFxuICAgIFwiLmpzXCIsXG4gICl9YDtcbiAgY29uc29sZS5sb2coYCR7Y2hhbGsuYmx1ZShydW5Db2RlKX0gY29waWVkIHRvIGNsaXBib2FyZC5gKTtcbiAgZXhlY1N5bmMoYGVjaG8gXCIke3J1bkNvZGV9XCIgfCBwYmNvcHlgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3R1Yl9lbnRpdHkoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmNyZWF0ZUVudGl0eSh7IGVudGl0eUlkLCB0aXRsZTogZW50aXR5SWQgfSk7XG5cbiAgY29uc3QgeyBmbGFncyB9ID0gcGFyc2VDbGlPcHRpb25zKCk7XG4gIGNvbnN0IHVzZUFJID0gZmxhZ3MuaGFzKFwiYWlcIik7XG4gIGNvbnN0IG5vQ29uZXMgPSBmbGFncy5oYXMoXCJuby1jb25lc1wiKTtcblxuICAvLyAtLW5vLWNvbmVzOiBjb25lIOyDneyEsSDsiqTtgrVcbiAgaWYgKG5vQ29uZXMpIHtcbiAgICBjb25zb2xlLmxvZyhg4pyTIEVudGl0eSAnJHtlbnRpdHlJZH0nIGNyZWF0ZWQgd2l0aG91dCBjb25lc2ApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gIGlmICghZW50aXR5KSB7XG4gICAgY29uc29sZS5lcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlJZH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyAtLWFpOiBMTE3snLzroZwgY29uZSDsg53shLFcbiAgaWYgKHVzZUFJKSB7XG4gICAgY29uc29sZS5sb2coYOKckyBFbnRpdHkgJyR7ZW50aXR5SWR9JyBjcmVhdGVkYCk7XG4gICAgY29uc29sZS5sb2coYPCfjJ8gR2VuZXJhdGluZyBBSS1wb3dlcmVkIGNvbmVzLi4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICAgIGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiXG4gICAgICAgICAgPyBjb25maWdMb2NhbGVcbiAgICAgICAgICA6IFwia29cIjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgICBwcmVzZXJ2ZUV4aXN0aW5nOiBmYWxzZSxcbiAgICAgICAgb25seUVtcHR5OiBmYWxzZSxcbiAgICAgICAgbG9jYWxlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKGDinIUgRG9uZSAoJHtyZXN1bHQudG9rZW5zVXNlZH0gdG9rZW5zKWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQU5USFJPUElDX0FQSV9LRVlcIikpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu8J+SoSBSZW1vdmUgLS1haSBmbGFnIHRvIHVzZSB0ZW1wbGF0ZSBjb25lcyBpbnN0ZWFkYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8g6riw67O4OiDthZztlIzrpr8gY29uZSDsnpDrj5kg7IOd7ISxXG4gIC8vIExMTSDsl4bsnbQgZmFrZXItbWFwcGluZ3MudHPrpbwg7Zmc7Jqp7ZWY7JesIOq4sOuzuCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gIC8vIOydtOulvCDthrXtlbQgQU5USFJPUElDX0FQSV9LRVnqsIAg7JeG7Ja064+EIFNvbmFtdeulvCDsgqzsmqntlaAg7IiYIOyeiOycvOupsCxcbiAgLy8g7IOd7ISx65CcIO2FnO2UjOumvyBjb25l7J2AIOuCmOykkeyXkCAnY29uZSBnZW4nIOuqheugueyWtOuhnCBBSeulvCDthrXtlbQg7JeF6re466CI7J2065Oc7ZWgIOyImCDsnojsirXri4jri6QuXG4gIGNvbnNvbGUubG9nKGDwn4yfIEdlbmVyYXRpbmcgdGVtcGxhdGUgY29uZXMuLi5gKTtcbiAgYXdhaXQgZW50aXR5LmdlbmVyYXRlVGVtcGxhdGVDb25lcygpO1xuICBjb25zb2xlLmxvZyhg4pyTIEVudGl0eSAnJHtlbnRpdHlJZH0nIGNyZWF0ZWQgd2l0aCB0ZW1wbGF0ZSBjb25lc2ApO1xuICBjb25zb2xlLmxvZyhg8J+SoSBUaXA6IFJ1biAncG5wbSBzb25hbXUgY29uZSBnZW4gJHtlbnRpdHlJZH0nIHRvIGltcHJvdmUgd2l0aCBBSWApO1xufVxuXG4vKipcbiAqIEFJ66W8IOyCrOyaqe2VmOyXrCBlbnRpdHnsnZggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWY6rGw64KYIOyXheq3uOugiOydtOuTnO2VqeuLiOuLpC5cbiAqXG4gKiDsmLXshZg6XG4gKiAtIC0tcmVnZW5lcmF0ZTog7KCE7LK0IOyerOyDneyEsSAo6riw7KG0IGNvbmUg642u7Ja07JOw6riwKVxuICogLSAtLWxvY2FsZSA8a298ZW58amE+OiDsg53shLEg7Ja47Ja0IOyngOyglVxuICogLSDquLDrs7g6IG9ubHlFbXB0eSDrqqjrk5wgKOq4sOyhtCBmaXh0dXJlSGludCDrs7TsobQpXG4gKlxuICogQU5USFJPUElDX0FQSV9LRVkg7ZWE7JqUIChzb25hbXUuc2VjcmV0LnRzIOuYkOuKlCDtmZjqsr3rs4DsiJgpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbmVfZ2VuKGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgY29uc3QgeyBFbnRpdHlNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIik7XG4gIGNvbnN0IHsgZmxhZ3MsIG9wdGlvbnMgfSA9IHBhcnNlQ2xpT3B0aW9ucygpO1xuXG4gIC8vIC0tYWxsIOyYteyFmDog66qo65OgIGVudGl0eSBjb25lIOyDneyEsVxuICBpZiAoZmxhZ3MuaGFzKFwiYWxsXCIpIHx8IGVudGl0eUlkID09PSBcImFsbFwiKSB7XG4gICAgY29uc3QgYWxsRW50aXRpZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbEVudGl0aWVzKCk7XG4gICAgY29uc29sZS5sb2coYPCfjJ8gR2VuZXJhdGluZyBBSS1wb3dlcmVkIGNvbmVzIGZvciAke2FsbEVudGl0aWVzLmxlbmd0aH0gZW50aXRpZXMuLi5cXG5gKTtcblxuICAgIGxldCB0b3RhbFRva2VucyA9IDA7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgYWxsRW50aXRpZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBQcm9jZXNzaW5nICR7ZW50aXR5LmlkfS4uLmApO1xuICAgICAgICBjb25zdCBjb25maWdMb2NhbGUgPSBvcHRpb25zLmxvY2FsZSB8fCBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICAgICAgY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCJcbiAgICAgICAgICAgID8gY29uZmlnTG9jYWxlXG4gICAgICAgICAgICA6IFwia29cIjtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnRpdHkuZ2VuZXJhdGVDb25lcyh7XG4gICAgICAgICAgcHJlc2VydmVFeGlzdGluZzogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICAgICAgb25seUVtcHR5OiAhZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSxcbiAgICAgICAgICBsb2NhbGUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRvdGFsVG9rZW5zICs9IHJlc3VsdC50b2tlbnNVc2VkO1xuICAgICAgICBjb25zb2xlLmxvZyhgICDinJMgJHtlbnRpdHkuaWR9ICgke3Jlc3VsdC50b2tlbnNVc2VkfSB0b2tlbnMpXFxuYCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIjtcbiAgICAgICAgZXJyb3JzLnB1c2goYCR7ZW50aXR5LmlkfTogJHttZXNzYWdlfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGAgIOKclyAke2VudGl0eS5pZH06ICR7bWVzc2FnZX1cXG5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgXFxu4pyFIERvbmUhIFRvdGFsOiAke3RvdGFsVG9rZW5zfSB0b2tlbnMgdXNlZGApO1xuICAgIGNvbnN0IGVzdGltYXRlZENvc3QgPSAodG90YWxUb2tlbnMgKiA5KSAvIDFfMDAwXzAwMDtcbiAgICBjb25zb2xlLmxvZyhg8J+SsCBFc3RpbWF0ZWQgY29zdDogfiQke2VzdGltYXRlZENvc3QudG9GaXhlZCg0KX1gKTtcblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MIEZhaWxlZCBlbnRpdGllcyAoJHtlcnJvcnMubGVuZ3RofSk6YCk7XG4gICAgICBmb3IgKGNvbnN0IGVyciBvZiBlcnJvcnMpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICAtICR7ZXJyfWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDri6jsnbwgZW50aXR5IGNvbmUg7IOd7ISxXG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgaWYgKCFlbnRpdHkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBFbnRpdHkgbm90IGZvdW5kOiAke2VudGl0eUlkfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1vZGUgPSBmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpID8gXCJyZWdlbmVyYXRpbmdcIiA6IFwiZ2VuZXJhdGluZ1wiO1xuICBjb25zb2xlLmxvZyhcbiAgICBg8J+MnyAke21vZGUgPT09IFwicmVnZW5lcmF0aW5nXCIgPyBcIlJlZ2VuZXJhdGluZ1wiIDogXCJHZW5lcmF0aW5nXCJ9IEFJLXBvd2VyZWQgY29uZXMgZm9yICR7ZW50aXR5SWR9Li4uYCxcbiAgKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IG9wdGlvbnMubG9jYWxlIHx8IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCIgPyBjb25maWdMb2NhbGUgOiBcImtvXCI7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnRpdHkuZ2VuZXJhdGVDb25lcyh7XG4gICAgICBwcmVzZXJ2ZUV4aXN0aW5nOiAhZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSxcbiAgICAgIG9ubHlFbXB0eTogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICBsb2NhbGUsXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhg4pyFIERvbmUhICgke3Jlc3VsdC50b2tlbnNVc2VkfSB0b2tlbnMgdXNlZClgKTtcblxuICAgIC8vIO2GoO2BsCDruYTsmqkg6rOE7IKwICjrjIDrnrXsoIHsnbgg7LaU7KCVKVxuICAgIC8vIENsYXVkZSBTb25uZXQgNC41OiBpbnB1dCAkMy9NIHRva2Vucywgb3V0cHV0ICQxNS9NIHRva2Vuc1xuICAgIC8vIOqwhOuLqO2VmOqyjCDtj4nqt6AgJDkvTSB0b2tlbnProZwg6rOE7IKwXG4gICAgY29uc3QgZXN0aW1hdGVkQ29zdCA9IChyZXN1bHQudG9rZW5zVXNlZCAqIDkpIC8gMV8wMDBfMDAwO1xuICAgIGNvbnNvbGUubG9nKGDwn5KwIEVzdGltYXRlZCBjb3N0OiB+JCR7ZXN0aW1hdGVkQ29zdC50b0ZpeGVkKDQpfWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIkFOVEhST1BJQ19BUElfS0VZXCIpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbvCfkqEgVG8gdXNlIEFJLXBvd2VyZWQgY29uZSBnZW5lcmF0aW9uOmApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGAgICAxLiBHZXQgYW4gQVBJIGtleSBmcm9tIGh0dHBzOi8vY29uc29sZS5hbnRocm9waWMuY29tL2ApO1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGAgICAyLiBBZGQgaXQgdG8gc29uYW11LnNlY3JldC50cyBvciBzZXQgQU5USFJPUElDX0FQSV9LRVkgZW52aXJvbm1lbnQgdmFyaWFibGVgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiUmF0ZSBsaW1pdFwiKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7wn5KhIFBsZWFzZSB3YWl0IGEgbW9tZW50IGFuZCB0cnkgYWdhaW4uYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgRmFpbGVkIHRvIGdlbmVyYXRlIGNvbmVzOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCBGYWlsZWQgdG8gZ2VuZXJhdGUgY29uZXM6IFVua25vd24gZXJyb3JgKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGRfbW9kZWwoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXCJtb2RlbFwiLCB7XG4gICAgZW50aXR5SWQsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZF9tb2RlbF90ZXN0KGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFwibW9kZWxfdGVzdFwiLCB7XG4gICAgZW50aXR5SWQsXG4gIH0pO1xufVxuXG4vKipcbiAqIHBucG0gc29uYW11IHNraWxscyBzeW5jIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog6rO17IudIFNraWxsc+ulvCDroZzsu6wg7ZSE66Gc7KCd7Yq4IOuYkOuKlCDquIDroZzrsowgfi8uY2xhdWRlL+uhnCDrj5nquLDtmZTtlanri4jri6QuXG4gKlxuICogLS1nbG9iYWwg7ZSM656Y6re4OiB+Ly5jbGF1ZGUv7JeQIOuPmeq4sO2ZlCAo7ZSE66Gc7KCd7Yq4IOyDneyEsSDsoIQg7IKs7JqpIOqwgOuKpSlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2tpbGxzX3N5bmMoKSB7XG4gIGNvbnN0IHsgZmxhZ3MgfSA9IHBhcnNlQ2xpT3B0aW9ucygpO1xuICBjb25zdCBpc0dsb2JhbCA9IGZsYWdzLmhhcyhcImdsb2JhbFwiKTtcblxuICAvLyDqsJzrsJwg7ZmY6rK9IC0gY2xpLnRzOiBzb25hbXUvbW9kdWxlcy9zb25hbXUvc3JjL2Jpbi9jbGkudHNcbiAgLy8g67mM65OcIO2bhCAtIGNsaS5qczogbm9kZV9tb2R1bGVzL3NvbmFtdS9kaXN0L2Jpbi9jbGkuanMgKOyLpOygnCDsi6TtlokpXG4gIC8vIHNraWxscyDsnITsuZg6IG5vZGVfbW9kdWxlcy9zb25hbXUvc3JjL3NraWxscyAobnBtIOuwsO2PrCDsi5wpXG4gIGNvbnN0IHNvdXJjZUJhc2UgPSBwYXRoLnJlc29sdmUoaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwic3JjXCIsIFwic2tpbGxzXCIpO1xuICBjb25zdCBzb3VyY2VTa2lsbHNEaXIgPSBwYXRoLmpvaW4oc291cmNlQmFzZSwgXCJzb25hbXVcIik7XG4gIGNvbnN0IHNvdXJjZUNsYXVkZU1kID0gcGF0aC5qb2luKHNvdXJjZUJhc2UsIFwiQ0xBVURFLm1kXCIpO1xuXG4gIGlmICghKGF3YWl0IGV4aXN0cyhzb3VyY2VTa2lsbHNEaXIpKSkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIlNraWxscyBzb3VyY2Ugbm90IGZvdW5kIGluIHNvbmFtdSBwYWNrYWdlLlwiKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzR2xvYmFsKSB7XG4gICAgYXdhaXQgc2tpbGxzX3N5bmNfdG8ocGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgXCIuY2xhdWRlXCIpLCBzb3VyY2VTa2lsbHNEaXIsIHNvdXJjZUNsYXVkZU1kLCB7XG4gICAgICB1c2VTeW1saW5rOiBmYWxzZSxcbiAgICAgIGNvcHlQcm9qZWN0VGVtcGxhdGVzOiBmYWxzZSxcbiAgICAgIGlzR2xvYmFsOiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFxcbiAgR2xvYmFsIHN5bmMgY29tcGxldGUg4oaSIH4vLmNsYXVkZS9za2lsbHMvc29uYW11L2ApKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgVGhlc2Ugc2tpbGxzIGFyZSBhdmFpbGFibGUgaW4gYWxsIENsYXVkZSBDb2RlIHNlc3Npb25zLmApKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLmRpbShcbiAgICAgICAgYCAgT25jZSBhIHByb2plY3QgaXMgY3JlYXRlZCwgcnVuICdwbnBtIHNvbmFtdSBza2lsbHMgc3luYycgZm9yIHByb2plY3QtbG9jYWwgc3luYy5gLFxuICAgICAgKSxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHdvcmtzcGFjZVJvb3QgPSBhd2FpdCBmaW5kV29ya3NwYWNlUm9vdCgpO1xuICAgIGNvbnN0IGNsYXVkZURpciA9IHBhdGguam9pbih3b3Jrc3BhY2VSb290LCBcIi5jbGF1ZGVcIik7XG4gICAgYXdhaXQgc2tpbGxzX3N5bmNfdG8oY2xhdWRlRGlyLCBzb3VyY2VTa2lsbHNEaXIsIHNvdXJjZUNsYXVkZU1kLCB7XG4gICAgICB1c2VTeW1saW5rOiB0cnVlLFxuICAgICAgY29weVByb2plY3RUZW1wbGF0ZXM6IHRydWUsXG4gICAgICBzb3VyY2VCYXNlLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogY2xhdWRlRGly66GcIHNraWxsc+ulvCDrj5nquLDtmZTtlZjripQg6rO17Ya1IOuhnOyngeyeheuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2tpbGxzX3N5bmNfdG8oXG4gIGNsYXVkZURpcjogc3RyaW5nLFxuICBzb3VyY2VTa2lsbHNEaXI6IHN0cmluZyxcbiAgc291cmNlQ2xhdWRlTWQ6IHN0cmluZyxcbiAgb3B0aW9uczoge1xuICAgIHVzZVN5bWxpbms6IGJvb2xlYW47XG4gICAgY29weVByb2plY3RUZW1wbGF0ZXM6IGJvb2xlYW47XG4gICAgc291cmNlQmFzZT86IHN0cmluZztcbiAgICBpc0dsb2JhbD86IGJvb2xlYW47XG4gIH0sXG4pIHtcbiAgY29uc3QgdGFyZ2V0U2tpbGxzRGlyID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJza2lsbHNcIiwgXCJzb25hbXVcIik7XG5cbiAgLy8g6riw7KG0IOuUlOugie2GoOumrC9zeW1saW5rIOyCreygnCDtm4Qg7J6s7IOd7ISxXG4gIC8vIGV4aXN0cygp64qUIGJyb2tlbiBzeW1saW5r66W8IOqwkOyngO2VmOyngCDrqrvtlZjrr4DroZwgcm3snYQg66y07KGw6rG0IOyLnOuPhO2VqeuLiOuLpFxuICB0cnkge1xuICAgIGF3YWl0IHJtKHRhcmdldFNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyDtjIzsnbzsnbQg7JeG7Jy866m0IOustOyLnFxuICB9XG5cbiAgYXdhaXQgbWtkaXIocGF0aC5kaXJuYW1lKHRhcmdldFNraWxsc0RpciksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGlmIChvcHRpb25zLnVzZVN5bWxpbmspIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3ltbGluayhzb3VyY2VTa2lsbHNEaXIsIHRhcmdldFNraWxsc0RpciwgXCJkaXJcIik7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIFNraWxscyBsaW5rZWQgKHN5bWxpbmspYCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsueWVsbG93KGDimqAgU3ltbGluayBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgICBGYWxsaW5nIGJhY2sgdG8gY29weS4uLmApKTtcbiAgICAgIGF3YWl0IHNraWxsc0NvcHkoc291cmNlU2tpbGxzRGlyLCB0YXJnZXRTa2lsbHNEaXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBza2lsbHNDb3B5KHNvdXJjZVNraWxsc0RpciwgdGFyZ2V0U2tpbGxzRGlyKTtcbiAgfVxuXG4gIC8vIHByb2plY3Qg65SU66CJ7Yag66asIOy0iOq4sO2ZlCAo7JeG7Jy866m0IOyDneyEsSwg7J6I7Jy866m0IOycoOyngClcbiAgaWYgKG9wdGlvbnMuY29weVByb2plY3RUZW1wbGF0ZXMgJiYgb3B0aW9ucy5zb3VyY2VCYXNlKSB7XG4gICAgY29uc3Qgc291cmNlUHJvamVjdERpciA9IHBhdGguam9pbihvcHRpb25zLnNvdXJjZUJhc2UsIFwicHJvamVjdFwiKTtcbiAgICBjb25zdCB0YXJnZXRQcm9qZWN0RGlyID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJza2lsbHNcIiwgXCJwcm9qZWN0XCIpO1xuXG4gICAgaWYgKGF3YWl0IGV4aXN0cyhzb3VyY2VQcm9qZWN0RGlyKSkge1xuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHRhcmdldFByb2plY3REaXIpKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNwKHNvdXJjZVByb2plY3REaXIsIHRhcmdldFByb2plY3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgUHJvamVjdCB0ZW1wbGF0ZXMgaW5pdGlhbGl6ZWRgKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICAgICAgYOKclyBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9qZWN0IHRlbXBsYXRlczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKGDij60gUHJvamVjdCB0ZW1wbGF0ZXMgYWxyZWFkeSBleGlzdCAocHJlc2VydmVkKWApKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDTEFVREUubWQg67O17IKsL+yXheuNsOydtO2KuFxuICBpZiAoYXdhaXQgZXhpc3RzKHNvdXJjZUNsYXVkZU1kKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXJnZXRDbGF1ZGVNZCA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwiQ0xBVURFLm1kXCIpO1xuICAgICAgY29uc3QgcmF3Q29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHNvdXJjZUNsYXVkZU1kLCBcInV0Zi04XCIpO1xuICAgICAgLy8g6riA66Gc67KMIOuqqOuTnOyXkOyEnOuKlCDsg4HrjIAg6rK966Gc66W8IOygiOuMgCDqsr3roZzroZwg67OA7ZmY7ZWp64uI64ukXG4gICAgICBjb25zdCBzb3VyY2VDb250ZW50ID0gb3B0aW9ucy5pc0dsb2JhbFxuICAgICAgICA/IHJhd0NvbnRlbnQucmVwbGFjZUFsbChcIi5jbGF1ZGUvc2tpbGxzL3NvbmFtdS9cIiwgXCJ+Ly5jbGF1ZGUvc2tpbGxzL3NvbmFtdS9cIilcbiAgICAgICAgOiByYXdDb250ZW50O1xuXG4gICAgICBpZiAoYXdhaXQgZXhpc3RzKHRhcmdldENsYXVkZU1kKSkge1xuICAgICAgICBjb25zdCB0YXJnZXRDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUodGFyZ2V0Q2xhdWRlTWQsIFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IHN0YXJ0TWFya2VyID0gXCI8IS0tIFNPTkFNVTpTVEFSVCAtLT5cIjtcbiAgICAgICAgY29uc3QgZW5kTWFya2VyID0gXCI8IS0tIFNPTkFNVTpFTkQgLS0+XCI7XG4gICAgICAgIGlmICh0YXJnZXRDb250ZW50LmluY2x1ZGVzKHN0YXJ0TWFya2VyKSAmJiB0YXJnZXRDb250ZW50LmluY2x1ZGVzKGVuZE1hcmtlcikpIHtcbiAgICAgICAgICBjb25zdCBzdGFydElkeCA9IHRhcmdldENvbnRlbnQuaW5kZXhPZihzdGFydE1hcmtlcik7XG4gICAgICAgICAgY29uc3QgZW5kSWR4ID0gdGFyZ2V0Q29udGVudC5pbmRleE9mKGVuZE1hcmtlcik7XG5cbiAgICAgICAgICBpZiAoc3RhcnRJZHggIT09IC0xICYmIGVuZElkeCAhPT0gLTEgJiYgc3RhcnRJZHggPCBlbmRJZHgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IHRhcmdldENvbnRlbnQuc3Vic3RyaW5nKDAsIHN0YXJ0SWR4KTtcbiAgICAgICAgICAgIGNvbnN0IGFmdGVyID0gdGFyZ2V0Q29udGVudC5zdWJzdHJpbmcoZW5kSWR4ICsgZW5kTWFya2VyLmxlbmd0aCk7XG4gICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7YmVmb3JlfSR7c3RhcnRNYXJrZXJ9XFxuJHtzb3VyY2VDb250ZW50fVxcbiR7ZW5kTWFya2VyfSR7YWZ0ZXJ9YDtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZSh0YXJnZXRDbGF1ZGVNZCwgbmV3Q29udGVudCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIENMQVVERS5tZCB1cGRhdGVkIChtYXJrZXIgcmVnaW9uKWApKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDij60gQ0xBVURFLm1kIG1hcmtlciBwb3NpdGlvbnMgaW52YWxpZCwgc2tpcHBlZGApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8g66eI7Luk6rCAIOyXhuuKlCDquLDsobQgQ0xBVURFLm1k7JeQIFNvbmFtdSDshLnshZjsnYQg7LaU6rCA7ZWp64uI64ukXG4gICAgICAgICAgY29uc3QgYXBwZW5kZWQgPSBgJHt0YXJnZXRDb250ZW50LnRyaW1FbmQoKX1cXG5cXG48IS0tIFNPTkFNVTpTVEFSVCAtLT5cXG4ke3NvdXJjZUNvbnRlbnR9XFxuPCEtLSBTT05BTVU6RU5EIC0tPlxcbmA7XG4gICAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHRhcmdldENsYXVkZU1kLCBhcHBlbmRlZCk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBDTEFVREUubWQgdXBkYXRlZCAoYXBwZW5kZWQgU29uYW11IHNlY3Rpb24pYCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB3aXRoTWFya2VycyA9IGA8IS0tIFNPTkFNVTpTVEFSVCAtLT5cXG4ke3NvdXJjZUNvbnRlbnR9XFxuPCEtLSBTT05BTVU6RU5EIC0tPlxcbmA7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZSh0YXJnZXRDbGF1ZGVNZCwgd2l0aE1hcmtlcnMpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIENMQVVERS5tZCBjcmVhdGVkYCkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYOKclyBGYWlsZWQgdG8gdXBkYXRlIENMQVVERS5tZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc0NvcHkoc3JjOiBzdHJpbmcsIGRlc3Q6IHN0cmluZykge1xuICB0cnkge1xuICAgIGF3YWl0IGNwKHNyYywgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBTa2lsbHMgY29waWVkYCkpO1xuICB9IGNhdGNoIChjb3B5RXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBg4pyXIEZhaWxlZCB0byBjb3B5IHNraWxsczogJHtjb3B5RXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGNvcHlFcnJvci5tZXNzYWdlIDogU3RyaW5nKGNvcHlFcnJvcil9YCxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aHJvdyBjb3B5RXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBwbnBtIHNvbmFtdSBza2lsbHMgY3JlYXRlIDxuYW1lPiDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOuhnOy7rCBza2lsbCDstIjslYjsnYQg7IOd7ISx7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBza2lsbHNfY3JlYXRlKG5hbWU6IHN0cmluZykge1xuICBjb25zdCB3b3Jrc3BhY2VSb290ID0gYXdhaXQgZmluZFdvcmtzcGFjZVJvb3QoKTtcbiAgY29uc3QgbG9jYWxEaXIgPSBwYXRoLmpvaW4od29ya3NwYWNlUm9vdCwgXCIuY2xhdWRlXCIsIFwic2tpbGxzXCIsIFwibG9jYWxcIik7XG5cbiAgLy8gPT09IO2MjOydvOuqhSDqsoDspp0g67CPIFNhbml0aXplID09PVxuICBpZiAoIW5hbWUgfHwgbmFtZS50cmltKCkgPT09IFwiXCIpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIuKclyBTa2lsbCBuYW1lIGlzIHJlcXVpcmVkXCIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgc2FuaXRpemVkID0gbmFtZVxuICAgIC8vIOqzteuwseydhCDtlZjsnbTtlIjsnLzroZxcbiAgICAucmVwbGFjZSgvXFxzKy9nLCBcIi1cIilcbiAgICAvLyDqsr3roZwg6rWs67aE7J6QIOygnOqxsFxuICAgIC5yZXBsYWNlKC9bL1xcXFxdL2csIFwiLVwiKVxuICAgIC8vIFBhdGggdHJhdmVyc2FsIOuwqeyngFxuICAgIC5yZXBsYWNlKC9cXC5cXC4vZywgXCJcIilcbiAgICAvLyBXaW5kb3dzIOq4iOyngCDrrLjsnpAg7KCc6rGwXG4gICAgLnJlcGxhY2UoL1s8PjpcInw/Kl0vZywgXCJcIilcbiAgICAvLyDsi5zsnpEv64GdIOygkCwg7ZWY7J207ZSILCDslrjrjZTsiqTsvZTslrQg7KCc6rGwXG4gICAgLnJlcGxhY2UoL15bLlxcLV9dK3xbLlxcLV9dKyQvZywgXCJcIilcbiAgICAvLyDsl7Dsho3rkJwg7ZWY7J207ZSI7J2EIO2VmOuCmOuhnFxuICAgIC5yZXBsYWNlKC8tKy9nLCBcIi1cIilcbiAgICAvLyDslYztjIzrsrMsIOyIq+yekCwg7ZWY7J207ZSILCDslrjrjZTsiqTsvZTslrQsIO2VnOq4gOunjCDtl4jsmqlcbiAgICAucmVwbGFjZSgvW15hLXpBLVowLTktX+qwgC3tnqNdL2csIFwiXCIpO1xuXG4gIC8vIOq4uOydtCDsoJztlZxcbiAgY29uc3QgTUFYX0xFTkdUSCA9IDEwMDtcbiAgaWYgKHNhbml0aXplZC5sZW5ndGggPiBNQVhfTEVOR1RIKSB7XG4gICAgc2FuaXRpemVkID0gc2FuaXRpemVkLnN1YnN0cmluZygwLCBNQVhfTEVOR1RIKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBOYW1lIHRydW5jYXRlZCB0byAke01BWF9MRU5HVEh9IGNoYXJhY3RlcnNgKSk7XG4gIH1cblxuICAvLyBXaW5kb3dzIOyYiOyVveyWtCDtmZXsnbhcbiAgY29uc3QgUkVTRVJWRURfTkFNRVMgPSBbXG4gICAgXCJDT05cIixcbiAgICBcIlBSTlwiLFxuICAgIFwiQVVYXCIsXG4gICAgXCJOVUxcIixcbiAgICBcIkNPTTFcIixcbiAgICBcIkNPTTJcIixcbiAgICBcIkNPTTNcIixcbiAgICBcIkNPTTRcIixcbiAgICBcIkNPTTVcIixcbiAgICBcIkNPTTZcIixcbiAgICBcIkNPTTdcIixcbiAgICBcIkNPTThcIixcbiAgICBcIkNPTTlcIixcbiAgICBcIkxQVDFcIixcbiAgICBcIkxQVDJcIixcbiAgICBcIkxQVDNcIixcbiAgICBcIkxQVDRcIixcbiAgICBcIkxQVDVcIixcbiAgICBcIkxQVDZcIixcbiAgICBcIkxQVDdcIixcbiAgICBcIkxQVDhcIixcbiAgICBcIkxQVDlcIixcbiAgXTtcbiAgaWYgKFJFU0VSVkVEX05BTUVTLmluY2x1ZGVzKHNhbml0aXplZC50b1VwcGVyQ2FzZSgpKSkge1xuICAgIHNhbml0aXplZCA9IGBza2lsbC0ke3Nhbml0aXplZH1gO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4pqgIFJlc2VydmVkIG5hbWUgZGV0ZWN0ZWQsIHByZWZpeGVkIHdpdGggXCJza2lsbC1cImApKTtcbiAgfVxuXG4gIC8vIOu5iCDrrLjsnpDsl7Qg7LK07YGsXG4gIGlmIChzYW5pdGl6ZWQgPT09IFwiXCIpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIuKclyBJbnZhbGlkIHNraWxsIG5hbWUgYWZ0ZXIgc2FuaXRpemF0aW9uXCIpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgT3JpZ2luYWw6IFwiJHtuYW1lfVwiYCkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOuzgOqyvSDslYzrprxcbiAgaWYgKHNhbml0aXplZCAhPT0gbmFtZSkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4pqgIE5hbWUgc2FuaXRpemVkOiBcIiR7bmFtZX1cIiDihpIgXCIke3Nhbml0aXplZH1cImApKTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGxvY2FsRGlyLCBgJHtzYW5pdGl6ZWR9Lm1kYCk7XG5cbiAgaWYgKGF3YWl0IGV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYFNraWxsIFwiJHtzYW5pdGl6ZWR9XCIgYWxyZWFkeSBleGlzdHMuYCkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IG1rZGlyKGxvY2FsRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCB0ZW1wbGF0ZSA9IGAtLS1cbm5hbWU6ICR7c2FuaXRpemVkfVxuY2F0ZWdvcnk6IG90aGVyXG5jcmVhdGVkX2F0OiAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF19XG5zdGF0dXM6IGRyYWZ0XG4tLS1cblxuIyAke3Nhbml0aXplZH1cblxuIyMg7IOB7ZmpXG5cblvslrTrlqQg66y47KCc7JiA64qU7KeAXVxuXG4jIyDtlbTqsrAg67Cp67KVXG5cblvslrTrlrvqsowg7ZW06rKw7ZaI64qU7KeAXVxuXG4jIyDsvZTrk5wg7JiI7IucXG5cblxcYFxcYFxcYHR5cGVzY3JpcHRcbi8vIOyYiOyLnCDsvZTrk5xcblxcYFxcYFxcYFxuYDtcblxuICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIHRlbXBsYXRlKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBDcmVhdGVkIC5jbGF1ZGUvc2tpbGxzL2xvY2FsLyR7c2FuaXRpemVkfS5tZGApKTtcbn1cblxuLyoqXG4gKiBwbnBtIHNvbmFtdSBhdXRoIGdlbmVyYXRlIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogYmV0dGVyLWF1dGgg7JeU7Yuw7Yuw65OkKFVzZXIsIFNlc3Npb24sIEFjY291bnQsIFZlcmlmaWNhdGlvbinsnYQg7IOd7ISx7ZWp64uI64ukLlxuICpcbiAqIOyYteyFmDpcbiAqIC0tcGx1Z2lucyBwaG9uZS1udW1iZXIsMmZhICDtlIzrn6zqt7jsnbgg7JeU7Yuw7Yuw64+EIO2VqOq7mCDsg53shLFcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXV0aF9nZW5lcmF0ZSgpIHtcbiAgLy8gLS1wbHVnaW5zIOyYteyFmCDtjIzsi7FcbiAgY29uc3QgcGx1Z2luc0FyZyA9IHByb2Nlc3MuYXJndi5maW5kKChhcmcpID0+IGFyZy5zdGFydHNXaXRoKFwiLS1wbHVnaW5zXCIpKTtcbiAgY29uc3QgcGx1Z2luczogQmV0dGVyQXV0aFBsdWdpbklkW10gPSBbXTtcblxuICBpZiAocGx1Z2luc0FyZykge1xuICAgIGNvbnN0IHBsdWdpblZhbHVlID0gcGx1Z2luc0FyZy5pbmNsdWRlcyhcIj1cIilcbiAgICAgID8gcGx1Z2luc0FyZy5zcGxpdChcIj1cIilbMV1cbiAgICAgIDogcHJvY2Vzcy5hcmd2W3Byb2Nlc3MuYXJndi5pbmRleE9mKHBsdWdpbnNBcmcpICsgMV07XG5cbiAgICBpZiAocGx1Z2luVmFsdWUpIHtcbiAgICAgIGNvbnN0IHBsdWdpbklkcyA9IHBsdWdpblZhbHVlLnNwbGl0KFwiLFwiKS5tYXAoKHApID0+IHAudHJpbSgpKTtcblxuICAgICAgZm9yIChjb25zdCBpZCBvZiBwbHVnaW5JZHMpIHtcbiAgICAgICAgaWYgKGlzVmFsaWRQbHVnaW5JZChpZCkpIHtcbiAgICAgICAgICBwbHVnaW5zLnB1c2goaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4pqgIFVua25vd24gcGx1Z2luOiAke2lkfWApKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgU3VwcG9ydGVkIHBsdWdpbnM6ICR7U1VQUE9SVEVEX1BMVUdJTl9JRFMuam9pbihcIiwgXCIpfWApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKFwi8J+UkCBHZW5lcmF0aW5nIGJldHRlci1hdXRoIGVudGl0aWVzLi4uXFxuXCIpKTtcblxuICBpZiAocGx1Z2lucy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFBsdWdpbnM6ICR7cGx1Z2lucy5qb2luKFwiLCBcIil9YCkpO1xuICB9XG5cbiAgYXdhaXQgZ2VuZXJhdGVCZXR0ZXJBdXRoRW50aXRpZXMoeyBwbHVnaW5zIH0pO1xufVxuXG4vKipcbiAqIOybjO2BrOyKpO2OmOydtOyKpCDro6jtirjrpbwg7LC+7Iq164uI64ukLlxuICog7Jqw7ISg7Iic7JyEOiBwbnBtLXdvcmtzcGFjZS55YW1sID4gQ0xBVURFLm1kID4g66Oo7Yq4IHBhY2thZ2UuanNvbiAod29ya3NwYWNlcyDtlYTrk5wpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRXb3Jrc3BhY2VSb290KCkge1xuICBsZXQgZGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICB3aGlsZSAoZGlyICE9PSBwYXRoLmRpcm5hbWUoZGlyKSkge1xuICAgIC8vIDEuIHBucG0td29ya3NwYWNlLnlhbWwg7YyM7J287J20IOyeiOuKlOyngCDtmZXsnbguIOyeiOycvOuptCDtmZXsi6TtlZwgbW9ub3JlcG8g66Oo7Yq4LlxuICAgIGlmIChhd2FpdCBleGlzdHMocGF0aC5qb2luKGRpciwgXCJwbnBtLXdvcmtzcGFjZS55YW1sXCIpKSkge1xuICAgICAgcmV0dXJuIGRpcjtcbiAgICB9XG5cbiAgICAvLyAyLiBDTEFVREUubWQg7YyM7J287J20IOyeiOuKlOyngCDtmZXsnbguIOyeiOycvOuptCDtlITroZzsoJ3tirgg66Oo7Yq466GcIOqwhOyjvO2VqC5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHBhdGguam9pbihkaXIsIFwiQ0xBVURFLm1kXCIpKSkge1xuICAgICAgcmV0dXJuIGRpcjtcbiAgICB9XG5cbiAgICAvLyAzLiBwYWNrYWdlLmpzb27sl5Agd29ya3NwYWNlcyDtlYTrk5zqsIAg7J6I7Jy866m0IOujqO2KuC5cbiAgICBjb25zdCBwYWNrYWdlUGF0aCA9IHBhdGguam9pbihkaXIsIFwicGFja2FnZS5qc29uXCIpO1xuICAgIGlmIChhd2FpdCBleGlzdHMocGFja2FnZVBhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUocGFja2FnZVBhdGgsIFwidXRmLThcIikpO1xuICAgICAgICBpZiAocGFja2FnZUpzb24ud29ya3NwYWNlcykge1xuICAgICAgICAgIHJldHVybiBkaXI7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyDtjIzsi7Eg7Iuk7Yyo7IucIOustOyLnFxuICAgICAgfVxuICAgIH1cbiAgICBkaXIgPSBwYXRoLmRpcm5hbWUoZGlyKTtcbiAgfVxuXG4gIC8vIOywvuyngCDrqrvtlZjrqbQgYXBpIO2PtOuNlOydmCDrtoDrqqgg7IKs7JqpXG4gIHJldHVybiBmaW5kQXBwUm9vdFBhdGgoKTtcbn1cbiJdLCJuYW1lcyI6WyJjaGFsayIsImRvdGVudiIsImNvbmZpZyIsImFzc2VydCIsImV4ZWNTeW5jIiwic3Bhd24iLCJjcCIsIm1rZGlyIiwicmVhZGRpciIsInJlYWRGaWxlIiwicm0iLCJzeW1saW5rIiwid3JpdGVGaWxlIiwia25leCIsImNyZWF0ZVJlcXVpcmUiLCJvcyIsInBhdGgiLCJwcm9jZXNzIiwidHNpY2xpIiwiU29uYW11IiwiZ2VuZXJhdGVCZXR0ZXJBdXRoRW50aXRpZXMiLCJpc1ZhbGlkUGx1Z2luSWQiLCJTVVBQT1JURURfUExVR0lOX0lEUyIsIkVudGl0eU1hbmFnZXIiLCJNaWdyYXRvciIsIkZpeHR1cmVNYW5hZ2VyIiwiZXhlY1dpdGhMaW5lUHJlZml4IiwicHJpbnRCdWlsZFN1bW1hcnkiLCJwcmludFRhc2tGYWlsZWQiLCJwcmludFRhc2tIZWFkZXIiLCJwcmludFRhc2tTdGFydCIsInByaW50VGFza1N1Y2Nlc3MiLCJleGlzdHMiLCJmaW5kQXBpUm9vdFBhdGgiLCJmaW5kQXBwUm9vdFBhdGgiLCJBUElfQVJUSUZBQ1RTIiwiV0VCX0FSVElGQUNUUyIsImZpeHR1cmVFeHBsb3JlQ29tbWFuZCIsImZpeHR1cmVGZXRjaENvbW1hbmQiLCJmaXh0dXJlR2VuQ29tbWFuZCIsInRlc3RDb21tYW5kIiwibWlncmF0b3IiLCJwYXJzZUNsaU9wdGlvbnMiLCJhcmd2IiwiZmxhZ3MiLCJTZXQiLCJvcHRpb25zIiwiaSIsImxlbmd0aCIsImFyZyIsInN0YXJ0c1dpdGgiLCJpbmNsdWRlcyIsImtleSIsInZhbHVlIiwic2xpY2UiLCJzcGxpdCIsIm5leHRBcmciLCJhZGQiLCJib290c3RyYXAiLCJub3RUb0luaXQiLCJpbml0IiwiZmlsdGVyZWRBcmd2Iiwic2tpcE5leHQiLCJhZnRlckRvdWJsZURhc2giLCJwdXNoIiwiY21kIiwidHlwZXMiLCJ0eXBlIiwibmFtZSIsIm1lc3NhZ2UiLCJjaG9pY2VzIiwiZ2V0QWxsUGFyZW50SWRzIiwibWFwIiwiZW50aXR5SWQiLCJ0aXRsZSIsImFyZ3MiLCJydW5uZXJzIiwibWlncmF0ZV9zdGF0dXMiLCJtaWdyYXRlX3J1biIsIm1pZ3JhdGVfYXBwbHkiLCJmaXh0dXJlX2luaXQiLCJmaXh0dXJlX2ltcG9ydCIsImZpeHR1cmVfc3luYyIsImZpeHR1cmVfZ2VuIiwiZml4dHVyZV9mZXRjaCIsImZpeHR1cmVfZXhwbG9yZSIsInN0dWJfcHJhY3RpY2UiLCJzdHViX2VudGl0eSIsInNjYWZmb2xkX21vZGVsIiwic2NhZmZvbGRfbW9kZWxfdGVzdCIsImNvbmVfZ2VuIiwic3luYyIsImJ1aWxkX2FsbCIsImJ1aWxkX2FwaSIsImJ1aWxkX3dlYiIsImRldl9hbGwiLCJkZXZfYXBpIiwiZGV2X3dlYiIsInN0YXJ0Iiwic2tpbGxzX3N5bmMiLCJza2lsbHNfY3JlYXRlIiwidGVzdCIsImF1dGhfZ2VuZXJhdGUiLCJkZXN0cm95IiwiZmluYWxseSIsInN5bmNlciIsInNwYXduQXBpRGV2U2VydmVyIiwiYXBpUm9vdCIsImVudHJ5UG9pbnQiLCJob3RSdW5uZXJCaW5QYXRoIiwidXJsIiwicmVzb2x2ZSIsInNlcnZlclByb2Nlc3MiLCJleGVjUGF0aCIsImpvaW4iLCJjd2QiLCJzdGRpbyIsImVudiIsIk5PREVfRU5WIiwiSE9UIiwiQVBJX1JPT1RfUEFUSCIsImV4dHJhRW52IiwiY2xlYW51cCIsImNvbnNvbGUiLCJsb2ciLCJ5ZWxsb3ciLCJraWxsIiwiZXhpdCIsIm9uIiwiY29kZSIsImVycm9yIiwicmVkIiwiYm9sZCIsIlNPTkFNVV9ESVNBQkxFX0lOVEVHUkFURURfV0VCIiwiYXBwUm9vdCIsIndlYlBhdGgiLCJkb3VibGVEYXNoSW5kZXgiLCJpbmRleE9mIiwicGFzc3Rocm91Z2hBcmdzIiwidml0ZUFyZ3MiLCJ2aXRlUHJvY2VzcyIsInNpZ25hbCIsInJlc29sdmVTd2NDb25maWdQYXRoIiwic3djRmlsZVBhdGgiLCJkaW0iLCJkaXJuYW1lIiwic2tpcElmTWlzc2luZyIsImFwaVN0YXJ0ZWRBdCIsIkRhdGUiLCJub3ciLCJhcnRpZmFjdCIsInByb2plY3RQYXRoIiwiZGVzY3JpcHRpb24iLCJydW5CdWlsZFN0ZXBzIiwiYnVpbGRDb21tYW5kQXJncyIsImNvbmZpZ0ZpbGVQYXRoIiwiZSIsImdyYXkiLCJ3ZWJTdGFydGVkQXQiLCJzdGVwcyIsInByZUJ1aWxkQ29tbWFuZCIsImJ1aWxkQ29tbWFuZCIsInBvc3RCdWlsZENvbW1hbmQiLCJmaWx0ZXIiLCJzdGVwIiwiaXNMYXN0IiwiRXJyb3IiLCJjYXVzZSIsImJsdWUiLCJzZXR1cE1pZ3JhdG9yIiwic2V0dXBGaXh0dXJlTWFuYWdlciIsInRhcmdldHMiLCJydW5BY3Rpb24iLCJsb2NhbEhvc3RzIiwiT2JqZWN0Iiwia2V5cyIsImRiQ29uZmlnIiwidGFyZ2V0IiwidGFyZ2V0Q29uZmlnIiwiaG9zdCIsImNvbm5lY3Rpb24iLCJ0b0xvd2VyQ2FzZSIsInN0YXR1cyIsImdldFN0YXR1cyIsInNyY0NvbmZpZyIsImRldmVsb3BtZW50X21hc3RlciIsImxhYmVsIiwiZml4dHVyZSIsInRvU2tpcCIsInJlbW90ZUNvbm4iLCJsb2NhbENvbm4iLCJkYXRhYmFzZSIsImR1bXBGaWxlbmFtZSIsInNyY0Nvbm4iLCJtaWdyYXRpb25zRHVtcCIsInVzZXIiLCJwYXNzd29yZCIsIl9kYiIsIm1pZ3JhdGlvbnMiLCJyYXciLCJjb3VudCIsImNvbm4iLCJkYiIsInVuZGVmaW5lZCIsInJvdyIsIm15c3FsQ21kIiwicmVjb3JkSWRzIiwiaW1wb3J0Rml4dHVyZSIsInBhcnNlT3B0aW9ucyIsIl8iLCJrIiwidiIsIm5leHQiLCJwcmFjdGljZURpciIsImFwaVJvb3RQYXRoIiwiZmlsZU5hbWVzIiwibWF4U2VxTm8iLCJyZWN1cnNpdmUiLCJmaWx0ZXJlZFNlcXMiLCJmaWxlTmFtZSIsImVuZHNXaXRoIiwic2VxTm8iLCJtYXRjaCIsInBhcnNlSW50Iiwic29ydCIsImEiLCJiIiwiY3VycmVudFNlcU5vIiwiZHN0UGF0aCIsInJ1bkNvZGUiLCJyZXBsYWNlIiwiY3JlYXRlRW50aXR5IiwidXNlQUkiLCJoYXMiLCJub0NvbmVzIiwiZW50aXR5IiwiZ2V0IiwiY29uZmlnTG9jYWxlIiwiaTE4biIsImRlZmF1bHRMb2NhbGUiLCJsb2NhbGUiLCJyZXN1bHQiLCJnZW5lcmF0ZUNvbmVzIiwicHJlc2VydmVFeGlzdGluZyIsIm9ubHlFbXB0eSIsInRva2Vuc1VzZWQiLCJnZW5lcmF0ZVRlbXBsYXRlQ29uZXMiLCJhbGxFbnRpdGllcyIsImdldEFsbEVudGl0aWVzIiwidG90YWxUb2tlbnMiLCJlcnJvcnMiLCJpZCIsImVzdGltYXRlZENvc3QiLCJ0b0ZpeGVkIiwiZXJyIiwibW9kZSIsImdlbmVyYXRlVGVtcGxhdGUiLCJpc0dsb2JhbCIsInNvdXJjZUJhc2UiLCJzb3VyY2VTa2lsbHNEaXIiLCJzb3VyY2VDbGF1ZGVNZCIsInNraWxsc19zeW5jX3RvIiwiaG9tZWRpciIsInVzZVN5bWxpbmsiLCJjb3B5UHJvamVjdFRlbXBsYXRlcyIsImN5YW4iLCJ3b3Jrc3BhY2VSb290IiwiZmluZFdvcmtzcGFjZVJvb3QiLCJjbGF1ZGVEaXIiLCJ0YXJnZXRTa2lsbHNEaXIiLCJmb3JjZSIsImdyZWVuIiwiU3RyaW5nIiwic2tpbGxzQ29weSIsInNvdXJjZVByb2plY3REaXIiLCJ0YXJnZXRQcm9qZWN0RGlyIiwidGFyZ2V0Q2xhdWRlTWQiLCJyYXdDb250ZW50Iiwic291cmNlQ29udGVudCIsInJlcGxhY2VBbGwiLCJ0YXJnZXRDb250ZW50Iiwic3RhcnRNYXJrZXIiLCJlbmRNYXJrZXIiLCJzdGFydElkeCIsImVuZElkeCIsImJlZm9yZSIsInN1YnN0cmluZyIsImFmdGVyIiwibmV3Q29udGVudCIsImFwcGVuZGVkIiwidHJpbUVuZCIsIndpdGhNYXJrZXJzIiwic3JjIiwiZGVzdCIsImNvcHlFcnJvciIsImxvY2FsRGlyIiwidHJpbSIsInNhbml0aXplZCIsIk1BWF9MRU5HVEgiLCJSRVNFUlZFRF9OQU1FUyIsInRvVXBwZXJDYXNlIiwiZmlsZVBhdGgiLCJ0ZW1wbGF0ZSIsInRvSVNPU3RyaW5nIiwicGx1Z2luc0FyZyIsImZpbmQiLCJwbHVnaW5zIiwicGx1Z2luVmFsdWUiLCJwbHVnaW5JZHMiLCJwIiwiZGlyIiwicGFja2FnZVBhdGgiLCJwYWNrYWdlSnNvbiIsIkpTT04iLCJwYXJzZSIsIndvcmtzcGFjZXMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVcsUUFBUTtBQUMxQixPQUFPQyxZQUFZLFNBQVM7QUFFNUJBLE9BQU9DLE1BQU07QUFFYixPQUFPQyxZQUFZLFNBQVM7QUFDNUIsU0FBU0MsUUFBUSxFQUFFQyxLQUFLLFFBQVEsZ0JBQWdCO0FBQ2hELFNBQVNDLEVBQUUsRUFBRUMsS0FBSyxFQUFFQyxPQUFPLEVBQUVDLFFBQVEsRUFBRUMsRUFB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
1229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgZXhlY1N5bmMsIHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGNwLCBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzeW1saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XG5pbXBvcnQgeyB0c2ljbGkgfSBmcm9tIFwidHNpY2xpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyB9IGZyb20gXCIuLi9hdXRoL2F1dGgtZ2VuZXJhdG9yXCI7XG5pbXBvcnQge1xuICB0eXBlIEJldHRlckF1dGhQbHVnaW5JZCxcbiAgaXNWYWxpZFBsdWdpbklkLFxuICBTVVBQT1JURURfUExVR0lOX0lEUyxcbn0gZnJvbSBcIi4uL2F1dGgvcGx1Z2lucy9lbnRpdHktZGVmaW5pdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBleGVjV2l0aExpbmVQcmVmaXgsXG4gIHByaW50QnVpbGRTdW1tYXJ5LFxuICBwcmludFRhc2tGYWlsZWQsXG4gIHByaW50VGFza0hlYWRlcixcbiAgcHJpbnRUYXNrU3RhcnQsXG4gIHByaW50VGFza1N1Y2Nlc3MsXG59IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoLCBmaW5kQXBwUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IEFQSV9BUlRJRkFDVFMsIHR5cGUgQnVpbGRBcnRpZmFjdCwgV0VCX0FSVElGQUNUUyB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuaW1wb3J0IHsgZml4dHVyZUV4cGxvcmVDb21tYW5kLCBmaXh0dXJlRmV0Y2hDb21tYW5kLCBmaXh0dXJlR2VuQ29tbWFuZCB9IGZyb20gXCIuL2ZpeHR1cmVcIjtcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSBcIi4vdGVzdC1jb21tYW5kXCI7XG5cbmxldCBtaWdyYXRvcjogTWlncmF0b3I7XG5cbi8qKlxuICogQ0xJIOyYteyFmOydhCDtjIzsi7HtlZjripQg7Zes7Y28IO2VqOyImFxuICovXG5mdW5jdGlvbiBwYXJzZUNsaU9wdGlvbnMoYXJndjogc3RyaW5nW10gPSBwcm9jZXNzLmFyZ3YpOiB7XG4gIGZsYWdzOiBTZXQ8c3RyaW5nPjsgLy8gLS1yZWdlbmVyYXRlLCAtLWFpLCAtLW5vLWNvbmVzIOuTsVxuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyAvLyAtLWxvY2FsZSBrbyDrk7Fcbn0ge1xuICBjb25zdCBmbGFncyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXJnID0gYXJndltpXTtcbiAgICBpZiAoIWFyZy5zdGFydHNXaXRoKFwiLS1cIikpIGNvbnRpbnVlO1xuXG4gICAgLy8gLS1vcHRpb249dmFsdWUg7ZiV7IudXG4gICAgaWYgKGFyZy5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGFyZy5zbGljZSgyKS5zcGxpdChcIj1cIik7XG4gICAgICBvcHRpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIC0tb3B0aW9uIHZhbHVlIO2YleyLneyduOyngCDtmZXsnbhcbiAgICBjb25zdCBuZXh0QXJnID0gYXJndltpICsgMV07XG4gICAgaWYgKG5leHRBcmcgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi0tXCIpICYmICFuZXh0QXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICBvcHRpb25zW2FyZy5zbGljZSgyKV0gPSBuZXh0QXJnO1xuICAgICAgaSsrOyAvLyDri6TsnYwgYXJn64qUIOqwkuydtOuvgOuhnCDsiqTtgrVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gLS1mbGFnIO2YleyLnVxuICAgICAgZmxhZ3MuYWRkKGFyZy5zbGljZSgyKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZmxhZ3MsIG9wdGlvbnMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuICBjb25zdCBub3RUb0luaXQgPSBbXCJkZXZcIiwgXCJidWlsZFwiLCBcInN0YXJ0XCIsIFwic2tpbGxzXCIsIFwidGVzdFwiXS5pbmNsdWRlcyhwcm9jZXNzLmFyZ3ZbMl0gPz8gXCJcIik7XG4gIGlmICghbm90VG9Jbml0KSB7XG4gICAgYXdhaXQgU29uYW11LmluaXQoZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gdHNpY2xp64qUIOygle2Zle2VnCDrqoXroLnslrQg66ek7Lmt66eMIOyngOybkO2VmOuvgOuhnCwgLS3roZwg7Iuc7J6R7ZWY64qUIOyYteyFmOqzvCDqt7gg6rCS7J2EIO2VhO2EsOunge2VqeuLiOuLpC5cbiAgICAvLyDsmLXshZgg7YyM7Iux7J2AIOqwgSBydW5uZXIg7ZWo7IiY7JeQ7IScIOybkOuzuCBwcm9jZXNzLmFyZ3brpbwg7IKs7Jqp7ZWY7JesIOyImO2Wie2VqeuLiOuLpC5cbiAgICAvLyBcIi0tXCIoYmFyZSBkb3VibGUgZGFzaCnripQgcGFzc3Rocm91Z2gg6rWs67aE7J6Q7J2066+A66GcLCDqt7gg65Kk7J2YIOuqqOuToCDsnbjsnpDrj4Qg7KCc7Jm47ZWp64uI64ukLlxuICAgIGNvbnN0IGZpbHRlcmVkQXJndjogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgc2tpcE5leHQgPSBmYWxzZTtcbiAgICBsZXQgYWZ0ZXJEb3VibGVEYXNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzLmFyZ3YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFyZyA9IHByb2Nlc3MuYXJndltpXTtcbiAgICAgIGlmIChhcmcgPT09IFwiLS1cIikge1xuICAgICAgICBhZnRlckRvdWJsZURhc2ggPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhZnRlckRvdWJsZURhc2gpIGNvbnRpbnVlO1xuICAgICAgaWYgKHNraXBOZXh0KSB7XG4gICAgICAgIHNraXBOZXh0ID0gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1cIikpIHtcbiAgICAgICAgLy8gLS1vcHRpb249dmFsdWUg7ZiV7Iud7J2AIOydtCBhcmfrp4wg7Iqk7YK1XG4gICAgICAgIGlmIChhcmcuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gLS1vcHRpb24gdmFsdWUg7ZiV7Iud7J247KeAIO2ZleyduDog64uk7J2MIGFyZ+qwgCAtLeuhnCDsi5zsnpHtlZjsp4Ag7JWK7Jy866m0IOqwkuydtCDsnojripQg6rKDXG4gICAgICAgIGNvbnN0IG5leHRBcmcgPSBwcm9jZXNzLmFyZ3ZbaSArIDFdO1xuICAgICAgICBpZiAobmV4dEFyZyAmJiAhbmV4dEFyZy5zdGFydHNXaXRoKFwiLS1cIikgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICBza2lwTmV4dCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmaWx0ZXJlZEFyZ3YucHVzaChhcmcpO1xuICAgIH1cblxuICAgIC8vIGJ1aWxkL2RldiDrqoXroLnslrTqsIAg7ISc67iM7Luk66eo65OcIOyXhuydtCDtmLjstpzrkKAg65WMIFwiYWxsXCLsnYQg6riw67O46rCS7Jy866GcIOy2lOqwgO2VqeuLiOuLpC5cbiAgICAvLyDsmIg6IGBzb25hbXUgYnVpbGRgIOKGkiBgc29uYW11IGJ1aWxkIGFsbGAsIGBzb25hbXUgZGV2YCDihpIgYHNvbmFtdSBkZXYgYWxsYFxuICAgIGNvbnN0IGNtZCA9IGZpbHRlcmVkQXJndlsyXTtcbiAgICBpZiAoKGNtZCA9PT0gXCJidWlsZFwiIHx8IGNtZCA9PT0gXCJkZXZcIikgJiYgZmlsdGVyZWRBcmd2Lmxlbmd0aCA9PT0gMykge1xuICAgICAgZmlsdGVyZWRBcmd2LnB1c2goXCJhbGxcIik7XG4gICAgfVxuXG4gICAgLy8gdGVzdCDsu6Trp6jrk5zripQg6rCA67OAIOyduOyekCjtjIzsnbzrqoUsIC0tcGF0dGVybiDrk7Ep66W8IOuwm+ycvOuvgOuhnCB0c2ljbGnrpbwg7Jqw7ZqM7ZWp64uI64ukLlxuICAgIGlmIChjbWQgPT09IFwidGVzdFwiKSB7XG4gICAgICByZXR1cm4gdGVzdENvbW1hbmQoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0c2ljbGkoZmlsdGVyZWRBcmd2LCB7XG4gICAgICB0eXBlczoge1xuICAgICAgICBcIiNlbnRpdHlJZFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJhdXRvY29tcGxldGVcIixcbiAgICAgICAgICBuYW1lOiBcIiNlbnRpdHlJZFwiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiUGxlYXNlIGlucHV0ICNlbnRpdHlJZFwiLFxuICAgICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsUGFyZW50SWRzKCkubWFwKChlbnRpdHlJZCkgPT4gKHtcbiAgICAgICAgICAgIHRpdGxlOiBlbnRpdHlJZCxcbiAgICAgICAgICAgIHZhbHVlOiBlbnRpdHlJZCxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICAgIFwiI3JlY29yZElkc1wiOiBcIm51bWJlcltdXCIsXG4gICAgICAgIFwiI25hbWVcIjogXCJzdHJpbmdcIixcbiAgICAgICAgXCIjdGFyZ2V0c1wiOiB7XG4gICAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICAgIG5hbWU6IFwiI3RhcmdldHNcIixcbiAgICAgICAgICBtZXNzYWdlOiBcIlBsZWFzZSBpbnB1dCAjdGFyZ2V0c1wiLFxuICAgICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiRGV2ZWxvcG1lbnRcIiwgdmFsdWU6IFwiZGV2ZWxvcG1lbnRfbWFzdGVyXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiUHJvZHVjdGlvblwiLCB2YWx1ZTogXCJwcm9kdWN0aW9uX21hc3RlclwiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIkZpeHR1cmVcIiwgdmFsdWU6IFwiZml4dHVyZVwiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIlRlc3RcIiwgdmFsdWU6IFwidGVzdFwiIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhcmdzOiBbXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJpbml0XCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiaW1wb3J0XCIsIFwiI2VudGl0eUlkXCIsIFwiI3JlY29yZElkc1wiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcInN5bmNcIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJnZW5cIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJmZXRjaFwiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImV4cGxvcmVcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJydW5cIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJhcHBseVwiLCBcIiN0YXJnZXRzXCJdLFxuICAgICAgICBbXCJtaWdyYXRlXCIsIFwic3RhdHVzXCJdLFxuICAgICAgICBbXCJzdHViXCIsIFwicHJhY3RpY2VcIiwgXCIjbmFtZVwiXSxcbiAgICAgICAgW1wic3R1YlwiLCBcImVudGl0eVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsX3Rlc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwidmlld19saXN0XCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfZm9ybVwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wiY29uZVwiLCBcImdlblwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic3luY1wiXSxcbiAgICAgICAgW1wiYnVpbGRcIiwgXCJhbGxcIl0sXG4gICAgICAgIFtcImJ1aWxkXCIsIFwiYXBpXCJdLFxuICAgICAgICBbXCJidWlsZFwiLCBcIndlYlwiXSxcbiAgICAgICAgW1wiZGV2XCIsIFwiYWxsXCJdLFxuICAgICAgICBbXCJkZXZcIiwgXCJhcGlcIl0sXG4gICAgICAgIFtcImRldlwiLCBcIndlYlwiXSxcbiAgICAgICAgW1wic3RhcnRcIl0sXG4gICAgICAgIFtcInNraWxsc1wiLCBcInN5bmNcIl0sXG4gICAgICAgIFtcInNraWxsc1wiLCBcImNyZWF0ZVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJ0ZXN0XCJdLFxuICAgICAgICBbXCJhdXRoXCIsIFwiZ2VuZXJhdGVcIl0sXG4gICAgICBdLFxuICAgICAgcnVubmVyczoge1xuICAgICAgICBtaWdyYXRlX3N0YXR1cyxcbiAgICAgICAgbWlncmF0ZV9ydW4sXG4gICAgICAgIG1pZ3JhdGVfYXBwbHksXG4gICAgICAgIGZpeHR1cmVfaW5pdCxcbiAgICAgICAgZml4dHVyZV9pbXBvcnQsXG4gICAgICAgIGZpeHR1cmVfc3luYyxcbiAgICAgICAgZml4dHVyZV9nZW4sXG4gICAgICAgIGZpeHR1cmVfZmV0Y2gsXG4gICAgICAgIGZpeHR1cmVfZXhwbG9yZSxcbiAgICAgICAgc3R1Yl9wcmFjdGljZSxcbiAgICAgICAgc3R1Yl9lbnRpdHksXG4gICAgICAgIHNjYWZmb2xkX21vZGVsLFxuICAgICAgICBzY2FmZm9sZF9tb2RlbF90ZXN0LFxuICAgICAgICAvLyBzY2FmZm9sZF92aWV3X2xpc3QsXG4gICAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfZm9ybSxcbiAgICAgICAgY29uZV9nZW4sXG4gICAgICAgIHN5bmMsXG4gICAgICAgIGJ1aWxkX2FsbCxcbiAgICAgICAgYnVpbGRfYXBpLFxuICAgICAgICBidWlsZF93ZWIsXG4gICAgICAgIGRldl9hbGwsXG4gICAgICAgIGRldl9hcGksXG4gICAgICAgIGRldl93ZWIsXG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBza2lsbHNfc3luYyxcbiAgICAgICAgc2tpbGxzX2NyZWF0ZSxcbiAgICAgICAgdGVzdDogdGVzdENvbW1hbmQsXG4gICAgICAgIGF1dGhfZ2VuZXJhdGUsXG4gICAgICB9LFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IFNvbmFtdS5kZXN0cm95KCk7XG4gIH1cbn1cblxuYm9vdHN0cmFwKCkuZmluYWxseShhc3luYyAoKSA9PiB7XG4gIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmRlc3Ryb3koKTtcbn0pO1xuXG4vKipcbiAqIHBucG0gc3luYyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOulvCDsi7Htgaztlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN5bmMoKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuc3luYygpO1xufVxuXG4vKipcbiAqIEFQSSDqsJzrsJwg7ISc67KE66W8IOyLpO2Wie2VmOuKlCDqs7XthrUg66Gc7KeB7J6F64uI64ukLlxuICogZGV2X2FsbOqzvCBkZXZfYXBp7JeQ7IScIOqzteycoO2VqeuLiOuLpC5cbiAqXG4gKiBUeXBlU2NyaXB066W8IOuwlOuhnCDsi6TtlontlaAg7IiYIOyeiOuPhOuhnSBAc29uYW11LWtpdC90cy1sb2FkZXLrpbwsXG4gKiBITVLsnYQg7KeA7JuQ7ZWY6riwIOychO2VtCBAc29uYW11LWtpdC9obXItaG9va+ydhCBpbXBvcnTtlZjrqbAsXG4gKiDshozsiqTrp7Ug7KeA7JuQ7J2EIOychO2VtCAtLWVuYWJsZS1zb3VyY2UtbWFwcyDtlIzrnpjqt7jrpbwg7Y+s7ZWo7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiDsnbTrlYwgQHNvbmFtdS1raXQvdHMtbG9hZGVy7JmAIEBzb25hbXUta2l0L2htci1ob29r64qUIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65iQ7ZWcIOyLpO2WieyXkCDsgqzsmqntlZjripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuuPhCDrp4jssKzqsIDsp4DroZwgc29uYW116rCAIOyekOyytOyggeycvOuhnCDqsIDsp4Dqs6Ag7J6I64qUIGRlcGVuZGVuY3nsnoXri4jri6QuXG4gKiDrlLDrnbzshJwg7IKs7Jqp7J6QIO2UhOuhnOygne2KuOyXkOyEnOuKlCDsnbQg7IS4IO2MqO2CpOyngOulvCDsp4HsoJEg7ISk7LmY7ZWgIO2VhOyalOqwgCDsl4bsirXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHNwYXduQXBpRGV2U2VydmVyKG9wdGlvbnM/OiB7IGV4dHJhRW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KSB7XG4gIGNvbnN0IGFwaVJvb3QgPSBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgY29uc3QgZW50cnlQb2ludCA9IFwic3JjL2luZGV4LnRzXCI7XG5cbiAgLy8g7J20IHNvbmFtdSDtjKjtgqTsp4DqsIAgZGVwZW5kZW5jaWVz66GcIOqwgOyngOqzoCDsnojripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuydmCBiaW4vcnVuLmpz66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAgLy8g7J20IOqyveuhnCgvYmluL3J1bi5qcynripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuydmCBwYWNrYWdlLmpzb27snZggYmluIO2VhOuTnOyXkCDrqoXsi5zrkJjslrQg7J6I64qUIOq3uOqyg+qzvCDqsJnsirXri4jri6QuXG4gIGNvbnN0IGhvdFJ1bm5lckJpblBhdGggPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCkucmVzb2x2ZShcbiAgICBcIkBzb25hbXUta2l0L2htci1ydW5uZXIvYmluL3J1bi5qc1wiLFxuICApO1xuXG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLCAvLyBub2RlXG4gICAgW1xuICAgICAgaG90UnVubmVyQmluUGF0aCwgLy8g7J2066CH6rKMIO2VtOyEnCBob3QtcnVubmVy66W8IOyLpO2Wie2VmOq1rOyalFxuICAgICAgXCItLWNsZWFyLXNjcmVlbj1mYWxzZVwiLCAvLyDsnbTtlZggaG90LXJ1bm5lcuyXkOqyjCDrhJjqsqjspIQg7J247J6Q65Ok7J6F64uI64ukLlxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvdHMtbG9hZGVyLXJlZ2lzdGVyXCIsIC8vIFR5cGVTY3JpcHQg7ISc7Y+s7Yq466W8IOychO2VnCDroZzrjZQsXG4gICAgICBcIi0tbm9kZS1hcmdzPS0taW1wb3J0PXNvbmFtdS9obXItaG9vay1yZWdpc3RlclwiLCAvLyBITVLsnYQg7KeA7JuQ7ZWY6riwIOychO2VnCBob29rLFxuICAgICAgXCItLW5vZGUtYXJncz0tLWVuYWJsZS1zb3VyY2UtbWFwc1wiLCAvLyDqt7jrpqzqs6Ag7IaM7Iqk66e1IOyngOybkOydhCDsnITtlZwg7ZSM656Y6re47J6F64uI64ukLlxuICAgICAgXCItLW9uLWtleT1yOnJlc3RhcnQ6UmVzdGFydCBzZXJ2ZXJcIiwgLy8gciDriITrpbTrqbQg7ISc67KEIOyerOyLnOyeke2VmOqyjCDtlbTspJjsmpQuXG4gICAgICBcIi0tb24ta2V5PWM6Y2xlYXI6Q2xlYXIgc2NyZWVuXCIsIC8vIGMg64iE66W066m0IO2EsOuvuOuEkCDtmZTrqbTsnYQg7KeA7JuM7KSY7JqULlxuICAgICAgYC0tb24ta2V5PWY6c2hlbGwocm0gJHtwYXRoLmpvaW4oYXBpUm9vdCwgXCJzb25hbXUubG9ja1wiKX0pOnJlc3RhcnQ6Rm9yY2UgcmVzdGFydGAsIC8vIGYg64iE66W066m0IHNvbmFtdS5sb2NrIO2MjOydvOydhCDsp4DsmrDqs6Ag7ISc67KEIOyerOyLnOyeke2VmOqyjCDtlbTspJjsmpQuXG5cbiAgICAgIFwiLS1vbi1rZXk9ZW50ZXI6c2hlbGwoZWNobyBoaSk6S2V5IGJpbmRpbmcgdGVzdFwiLCAvLyBlbnRlcuulvCBrZXnroZwg7JO4IOyImCDsnojsnYzsnYQg67O07J206riwIOychO2VnCDthYzsiqTtirjsnoXri4jri6QuXG4gICAgICBcIi0tb24ta2V5PWN0cmwrZiBjdHJsK2Y6c2hlbGwoZ2l0IHB1bGwgJiYgcG5wbSBpbnN0YWxsICYmIHBucG0gLS1maWx0ZXIgc29uYW11IGJ1aWxkICYmIGVjaG8gJ1NvbmFtdSBpcyBub3cgdXAtdG8tZGF0ZSEnKTpyZXN0YXJ0OlB1bGwgJiBpbnN0YWxsICYgYnVpbGQgJiByZXN0YXJ0XCIsIC8vIG1vZGlmaWVy7JmA7J2YIOyhsO2VqSwg6re466as6rOgIOuRkCDqsJzsnZggY2hvcmTrpbwg7IKs7Jqp7ZWgIOyImCDsnojsnYzsnYQg67O07J206riwIOychO2VnCDthYzsiqTtirjsnoXri4jri6QuXG4gICAgICBlbnRyeVBvaW50LCAvLyDrp4jsp4Drp4nsnLzroZwg7Iuk7KCcIOyLpO2Wie2VoCDsiqTtgazrpr3tirjsnZgg6rK966Gc66W8IOuEmOqyqOykjeuLiOuLpC5cbiAgICBdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjoge1xuICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgTk9ERV9FTlY6IFwiZGV2ZWxvcG1lbnRcIixcbiAgICAgICAgSE9UOiBcInllc1wiLCAvLyDslpjqsIAg7J6I7Ja07JW8IEhNUuydtCDtmZzshLHtmZTrkKnri4jri6QuXG4gICAgICAgIEFQSV9ST09UX1BBVEg6IGFwaVJvb3QsIC8vIOydtCDqsr3roZzqsIAgaG1yLWhvb2vsnZgg66Oo7Yq4IOuUlOugie2GoOumrOqwgCDrkKnri4jri6QuXG4gICAgICAgIC4uLm9wdGlvbnM/LmV4dHJhRW52LFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIC8vIOyiheujjCDsspjrpqxcbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24uLi5cIikpO1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgY2xlYW51cCk7XG4gIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIGNsZWFudXApO1xuXG4gIHNlcnZlclByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBTZXJ2ZXIgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KGNvZGUgfHwgMSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiAvIHBucG0gZGV2IGFsbCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOyXkCDrjIDtlbQgSE1SIOyngOybkO2VmOuKlCDqsJzrsJwg7ISc67KE66W8IOudhOybjOykjeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5mdW5jdGlvbiBkZXZfYWxsKCkge1xuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIlN0YXJ0aW5nIFNvbmFtdSBkZXYgc2VydmVyLi4uXFxuXCIpKTtcbiAgc3Bhd25BcGlEZXZTZXJ2ZXIoKTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiBhcGkg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBBUEkg7KCE7JqpIOqwnOuwnCDshJzrsoTrpbwg652E7JuB64uI64ukLlxuICogZGV2X2FsbOqzvCDqsbDsnZgg64+Z7J287ZWY65CYLCDthrXtlakg7Ju5IOyEnOuyhOulvCDruYTtmZzshLHtmZTtlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGV2X2FwaSgpIHtcbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBTb25hbXUgQVBJLW9ubHkgZGV2IHNlcnZlci4uLlxcblwiKSk7XG4gIHNwYXduQXBpRGV2U2VydmVyKHtcbiAgICBleHRyYUVudjogeyBTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQjogXCJ5ZXNcIiB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiB3ZWIg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBWaXRlIOqwnOuwnCDshJzrsoTrpbwg64uo64+F7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqIC0tIOuSpOydmCDsnbjsnpDripQgVml0ZeyXkCDqt7jrjIDroZwg7KCE64us65Cp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRldl93ZWIoKSB7XG4gIGNvbnN0IGFwcFJvb3QgPSBmaW5kQXBwUm9vdFBhdGgoKTtcbiAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbihhcHBSb290LCBcIndlYlwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMod2ViUGF0aCkpKSB7XG4gICAgY29uc29sZS5lcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIC0tIOuSpOydmCDsnbjsnpAg7LaU7LacXG4gIGNvbnN0IGRvdWJsZURhc2hJbmRleCA9IHByb2Nlc3MuYXJndi5pbmRleE9mKFwiLS1cIik7XG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IGRvdWJsZURhc2hJbmRleCAhPT0gLTEgPyBwcm9jZXNzLmFyZ3Yuc2xpY2UoZG91YmxlRGFzaEluZGV4ICsgMSkgOiBbXTtcblxuICBjb25zdCB2aXRlQXJncyA9IFtcImV4ZWNcIiwgXCJ2aXRlXCIsIC4uLnBhc3N0aHJvdWdoQXJnc107XG5cbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBWaXRlIGRldiBzZXJ2ZXIuLi5cXG5cIikpO1xuXG4gIGNvbnN0IHZpdGVQcm9jZXNzID0gc3Bhd24oXCJwbnBtXCIsIHZpdGVBcmdzLCB7XG4gICAgY3dkOiB3ZWJQYXRoLFxuICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgfSk7XG5cbiAgdml0ZVByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgcHJvY2Vzcy5leGl0KGNvZGUgPz8gMCk7XG4gIH0pO1xuXG4gIC8vIFNJR0lOVC9TSUdURVJNIOyLnCBWaXRlIO2UhOuhnOyEuOyKpOulvCBncmFjZWZ1bGx5IOyiheujjO2VqeuLiOuLpC5cbiAgZm9yIChjb25zdCBzaWduYWwgb2YgW1wiU0lHSU5UXCIsIFwiU0lHVEVSTVwiXSBhcyBjb25zdCkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgICB2aXRlUHJvY2Vzcy5raWxsKHNpZ25hbCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTV0Mg7ISk7KCVIO2MjOydvCDqsr3roZzrpbwg6rKw7KCV7ZWp64uI64ukLiBBUEkg67mM65OcKFNXQynsl5DshJzrp4wg7IKs7Jqp65Cp64uI64ukLlxuICog7ZSE66Gc7KCd7Yq4IOujqO2KuOyXkCAuc3djcmPqsIAg7J6I7Jy866m0IOq3uOqyg+ydhCwg7JeG7Jy866m0IHNvbmFtdSDquLDrs7gg7ISk7KCV7J2EIOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVN3Y0NvbmZpZ1BhdGgoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IHN3Y0ZpbGVQYXRoID0gXCIuc3djcmNcIjtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHN3Y0ZpbGVQYXRoKSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgLnN3Y3JjIGZyb20gcHJvamVjdCByb290Li4uXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgZGVmYXVsdCAuc3djcmMgZnJvbSBzb25hbXUgcGFja2FnZS4uLlwiKSk7XG4gICAgICBzd2NGaWxlUGF0aCA9IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCIuc3djcmMucHJvamVjdC1kZWZhdWx0XCIpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIlNldHRpbmcgdXAgc3djIGNvbmZpZyBmaWxlIGZhaWxlZC5cIiksIGVycm9yKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIHN3Y0ZpbGVQYXRoO1xufVxuXG4vKipcbiAqIHNvbmFtdSBidWlsZCAvIHNvbmFtdSBidWlsZCBhbGwg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBidWlsZF9hcGkgKyBidWlsZF93ZWLsnZgg7ZWp7ISx7J6F64uI64ukLiBXZWIg65SU66CJ7Yag66as6rCAIOyXhuycvOuptCBXZWIg67mM65Oc66W8IOyKpO2Cte2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfYWxsKCkge1xuICBhd2FpdCBidWlsZF9hcGkoKTtcbiAgYXdhaXQgYnVpbGRfd2ViKHsgc2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGJ1aWxkIGFwaSDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIEFQSSDtlITroZzsoJ3tirjrp4wg67mM65Oc7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkX2FwaSgpIHtcbiAgY29uc3QgYXBwUm9vdCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCBzd2NGaWxlUGF0aCA9IGF3YWl0IHJlc29sdmVTd2NDb25maWdQYXRoKCk7XG5cbiAgY29uc3QgYXBpU3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIEFQSV9BUlRJRkFDVFMpIHtcbiAgICAgIGNvbnN0IGN3ZCA9IHBhdGguam9pbihhcHBSb290LCBhcnRpZmFjdC5wcm9qZWN0UGF0aCk7XG4gICAgICBwcmludFRhc2tIZWFkZXIoYXJ0aWZhY3QubmFtZSwgYXJ0aWZhY3QuZGVzY3JpcHRpb24sIGN3ZCk7XG5cbiAgICAgIGF3YWl0IHJ1bkJ1aWxkU3RlcHMoYXJ0aWZhY3QsIHsgY3dkLCBidWlsZENvbW1hbmRBcmdzOiB7IGNvbmZpZ0ZpbGVQYXRoOiBzd2NGaWxlUGF0aCB9IH0pO1xuICAgIH1cbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIkFQSVwiLCB0cnVlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIHBucG0gYnVpbGQgd2ViIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogV2ViIO2UhOuhnOygne2KuOunjCDruYzrk5ztlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfd2ViKHsgc2tpcElmTWlzc2luZyA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBhcHBSb290ID0gZmluZEFwcFJvb3RQYXRoKCk7XG4gIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4oYXBwUm9vdCwgXCJ3ZWJcIik7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYlBhdGgpKSkge1xuICAgIGlmIChza2lwSWZNaXNzaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KFwiV2ViIOuUlOugie2GoOumrOqwgCDsl4bsnLzrr4DroZwgV2ViIOu5jOuTnOulvCDqsbTrhIjrnIHri4jri6QuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHdlYlN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBXRUJfQVJUSUZBQ1RTKSB7XG4gICAgICBjb25zdCBjd2QgPSBwYXRoLmpvaW4oYXBwUm9vdCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuXG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczoge30gfSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIHRydWUsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJXZWJcIiwgZmFsc2UsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogcHJlLWJ1aWxkLCBidWlsZCwgcG9zdC1idWlsZCDri6jqs4Trpbwg7Iic7LCo7KCB7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwczxUPihcbiAgYXJ0aWZhY3Q6IEJ1aWxkQXJ0aWZhY3Q8VD4sXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmc7IGJ1aWxkQ29tbWFuZEFyZ3M6IFQgfSxcbikge1xuICBjb25zdCBzdGVwcyA9IFtcbiAgICB7IG5hbWU6IFwicHJlLWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucHJlQnVpbGRDb21tYW5kPy4oKSB9LFxuICAgIHsgbmFtZTogXCJidWlsZFwiLCBjbWQ6IGFydGlmYWN0LmJ1aWxkQ29tbWFuZChvcHRpb25zLmJ1aWxkQ29tbWFuZEFyZ3MpIH0sXG4gICAgeyBuYW1lOiBcInBvc3QtYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5wb3N0QnVpbGRDb21tYW5kPy4oKSB9LFxuICBdLmZpbHRlcigoc3RlcCkgPT4gc3RlcC5jbWQpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGVwID0gc3RlcHNbaV07XG4gICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gc3RlcHMubGVuZ3RoIC0gMTtcblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQoc3RlcC5jbWQpO1xuICAgICAgcHJpbnRUYXNrU3RhcnQoc3RlcC5uYW1lLCBzdGVwLmNtZCwgaXNMYXN0KTtcbiAgICAgIGF3YWl0IGV4ZWNXaXRoTGluZVByZWZpeChzdGVwLmNtZCwgeyBjd2Q6IG9wdGlvbnMuY3dkIH0pO1xuICAgICAgcHJpbnRUYXNrU3VjY2VzcyhzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcHJpbnRUYXNrRmFpbGVkKHN0ZXAubmFtZSwgaXNMYXN0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzdGVwLm5hbWV9IGZhaWxlZGAsIHsgY2F1c2U6IGUgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogcG5wbSBzdGFydCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOu5jOuTnOuQnCDtlITroZzsoJ3tirjrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOuQnCDqsrDqs7zrrLwoZGlzdCDrlJTroInthqDrpqzsnZggaW5kZXguanMg7JeU7Yq466as7Y+s7J247Yq4KeydtCDsl4bri6TrqbQg7Iuk7ZaJ7J2EIOykkeuLqO2VqeuLiOuLpC5cbiAqIOyGjOyKpOuntSDsp4Dsm5Dqs7wgZG90ZW52IOyngOybkOydhCDtj6ztlajtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcImRpc3QvaW5kZXguanNcIjtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoZW50cnlQb2ludCkpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2VudHJ5UG9pbnR9IG5vdCBmb3VuZC4gUGxlYXNlIGJ1aWxkIHlvdXIgcHJvamVjdCBmaXJzdC5gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJ1bjogcG5wbSBzb25hbXUgYnVpbGRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcImNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgIFtcIi0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIFwiLXJcIiwgXCJkb3RlbnYvY29uZmlnXCIsIGVudHJ5UG9pbnRdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9LFxuICApO1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBNaWdyYXRvcigpIHtcbiAgLy8gbWlncmF0b3JcbiAgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBGaXh0dXJlTWFuYWdlcigpIHtcbiAgRml4dHVyZU1hbmFnZXIuaW5pdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX2FwcGx5KHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcImFwcGx5XCIsIHRhcmdldHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3J1bigpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuICBjb25zdCBsb2NhbEhvc3RzID0gW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXTtcbiAgY29uc3QgdGFyZ2V0cyA9IE9iamVjdC5rZXlzKFNvbmFtdS5kYkNvbmZpZykuZmlsdGVyKCh0YXJnZXQpID0+IHtcbiAgICBjb25zdCB0YXJnZXRDb25maWcgPSBTb25hbXUuZGJDb25maWdbdGFyZ2V0IGFzIGtleW9mIFNvbmFtdURCQ29uZmlnXTtcbiAgICBjb25zdCBob3N0ID0gKHRhcmdldENvbmZpZz8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSk/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICByZXR1cm4gbG9jYWxIb3N0cy5pbmNsdWRlcyhob3N0LnRvTG93ZXJDYXNlKCkpO1xuICB9KTtcblxuICAvLyDroZzsu6wg642w7J207YSw67Kg7J207Iqk7JeQIOuMgO2VtOyEnOunjCDsoITssrQg66eI7J206re466CI7J207IWY7JeQ7IScIOuPmeyekVxuICBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oXCJhcHBseVwiLCB0YXJnZXRzIGFzIChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfc3RhdHVzKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG5cbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG4gIC8vIHN0YXR1cztcbiAgY29uc29sZS5sb2coc3RhdHVzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbml0KCkge1xuICBjb25zdCBzcmNDb25maWcgPSBTb25hbXUuZGJDb25maWcuZGV2ZWxvcG1lbnRfbWFzdGVyO1xuICBjb25zdCB0YXJnZXRzID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBcIihSRU1PVEUpIEZpeHR1cmUgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLmZpeHR1cmUsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIFRlc3RpbmcgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICB0b1NraXA6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZS5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgY29uc3QgbG9jYWxDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIHJldHVybiByZW1vdGVDb25uLmhvc3QgPT09IGxvY2FsQ29ubi5ob3N0ICYmIHJlbW90ZUNvbm4uZGF0YWJhc2UgPT09IGxvY2FsQ29ubi5kYXRhYmFzZTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgXSBhcyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgIHRvU2tpcD86IGJvb2xlYW47XG4gIH1bXTtcblxuICAvLyAxLiDquLDspIBEQiDsiqTtgqTrp4jrpbwg642k7ZSEXG4gIGNvbnNvbGUubG9nKFwiRFVNUC4uLlwiKTtcbiAgY29uc3QgZHVtcEZpbGVuYW1lID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm4gPSBzcmNDb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEdW1wID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC1taWdyYXRpb25zLSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgZXhlY1N5bmMoXG4gICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLWQgLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9ID4gJHtkdW1wRmlsZW5hbWV9YCxcbiAgKTtcbiAgY29uc3QgX2RiID0ga25leChzcmNDb25maWcpO1xuICBjb25zdCBbW21pZ3JhdGlvbnNdXSA9IGF3YWl0IF9kYi5yYXcoXG4gICAgXCJTRUxFQ1QgQ09VTlQoKikgYXMgY291bnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ID8gQU5EIHRhYmxlX25hbWUgPSAna25leF9taWdyYXRpb25zJ1wiLFxuICAgIFtzcmNDb25uLmRhdGFiYXNlXSxcbiAgKTtcbiAgaWYgKG1pZ3JhdGlvbnMuY291bnQgPiAwKSB7XG4gICAgZXhlY1N5bmMoXG4gICAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0ga25leF9taWdyYXRpb25zIGtuZXhfbWlncmF0aW9uc19sb2NrID4gJHttaWdyYXRpb25zRHVtcH1gLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDrjIDsg4FEQiDqsIHqsIHsl5Ag64yA7ZWY7JesIOyhtOyerOyXrOu2gCDtmZXsnbgg7ZuEIOu2k+q4sFxuICBmb3IgYXdhaXQgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbm4gPSBjb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG5cbiAgICBpZiAodG9Ta2lwID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7bGFiZWx9OiBTa2lwcGVkIWApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0ga25leCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLigoY29uZmlnLmNvbm5lY3Rpb24gPz8ge30pIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyksXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFtbcm93XV0gPSBhd2FpdCBkYi5yYXcoYFNIT1cgREFUQUJBU0VTIExJS0UgXCIke2Nvbm4uZGF0YWJhc2V9XCJgKTtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCR7bGFiZWx9OiBEYXRhYmFzZSBcIiR7Y29ubi5kYXRhYmFzZX1cIiBBbHJlYWR5IGV4aXN0c2ApKTtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTWU5DIHRvICR7bGFiZWx9Li4uYCk7XG4gICAgY29uc3QgbXlzcWxDbWQgPSBgbXlzcWwgLWgke2Nvbm4uaG9zdH0gLXUke2Nvbm4udXNlcn0gLXAke2Nvbm4ucGFzc3dvcmR9YDtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0RST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdDUkVBVEUgREFUQUJBU0UgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7ZHVtcEZpbGVuYW1lfWApO1xuICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7bWlncmF0aW9uc0R1bXB9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICB9XG5cbiAgYXdhaXQgX2RiLmRlc3Ryb3koKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgcmVjb3JkSWRzOiBudW1iZXJbXSkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShlbnRpdHlJZCwgcmVjb3JkSWRzKTtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX3N5bmMoKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbi8qKlxuICogZml4dHVyZSBnZW4g66qF66C57Ja0XG4gKiDsmLXshZjsnYQgcHJvY2Vzcy5hcmd27JeQ7IScIO2MjOyLsVxuICovXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2dlbigpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlR2VuQ29tbWFuZChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGZldGNoIOuqheugueyWtFxuICog7Ji17IWY7J2EIHByb2Nlc3MuYXJnduyXkOyEnCDtjIzsi7FcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9mZXRjaCgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlRmV0Y2hDb21tYW5kKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZXhwbG9yZSDrqoXroLnslrRcbiAqIOyYteyFmOydhCBwcm9jZXNzLmFyZ3bsl5DshJwg7YyM7IuxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfZXhwbG9yZSgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlRXhwbG9yZUNvbW1hbmQob3B0aW9ucyk7XG59XG5cbi8qKlxuICog6rCE64uo7ZWcIOyYteyFmCDtjIzshJxcbiAqL1xuZnVuY3Rpb24gcGFyc2VPcHRpb25zKFxuICBhcmd2OiBzdHJpbmdbXSxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXT4gJiB7IF86IHN0cmluZ1tdIH0ge1xuICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgc3RyaW5nW10+ICYgeyBfOiBzdHJpbmdbXSB9ID0geyBfOiBbXSB9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3ZbaV07XG5cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgY29uc3Qga2V5ID0gYXJnLnNsaWNlKDIpO1xuXG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICBjb25zdCBbaywgdl0gPSBrZXkuc3BsaXQoXCI9XCIpO1xuICAgICAgICBvcHRpb25zW2tdID0gdjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBhcmd2W2kgKyAxXTtcbiAgICAgICAgaWYgKG5leHQgJiYgIW5leHQuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gbmV4dDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICBjb25zdCBrZXkgPSBhcmcuc2xpY2UoMSk7XG4gICAgICBjb25zdCBuZXh0ID0gYXJndltpICsgMV07XG5cbiAgICAgIGlmIChuZXh0ICYmICFuZXh0LnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IG5leHQ7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMuXy5wdXNoKGFyZyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfcHJhY3RpY2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByYWN0aWNlRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJwcmFjdGljZXNcIik7XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXIpO1xuXG4gIGNvbnN0IG1heFNlcU5vID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocHJhY3RpY2VEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkU2VxcyA9IGZpbGVOYW1lc1xuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IGZpbGVOYW1lLnN0YXJ0c1dpdGgoXCJwXCIpICYmIGZpbGVOYW1lLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgWywgc2VxTm9dID0gZmlsZU5hbWUubWF0Y2goL15wKFswLTldKyktLykgPz8gW1wiMFwiLCBcIjBcIl07XG4gICAgICAgIHJldHVybiBwYXJzZUludChzZXFObyk7XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcblxuICAgIGlmIChmaWx0ZXJlZFNlcXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkU2Vxc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSkoKTtcblxuICBjb25zdCBjdXJyZW50U2VxTm8gPSBtYXhTZXFObyArIDE7XG4gIGNvbnN0IGZpbGVOYW1lID0gYHAke2N1cnJlbnRTZXFOb30tJHtuYW1lfS50c2A7XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4ocHJhY3RpY2VEaXIsIGZpbGVOYW1lKTtcblxuICBjb25zdCBjb2RlID0gW1xuICAgIGBpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICBcIlwiLFxuICAgIGBjb25zb2xlLmNsZWFyKCk7YCxcbiAgICBgY29uc29sZS5sb2coXCIke2ZpbGVOYW1lfVwiKTtgLFxuICAgIFwiXCIsXG4gICAgYFNvbmFtdS5ydW5TY3JpcHQoYXN5bmMgKCkgPT4ge2AsXG4gICAgYCAvLyBUT0RPYCxcbiAgICBgfSk7YCxcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZShkc3RQYXRoLCBjb2RlKTtcblxuICBleGVjU3luYyhgY29kZSAke2RzdFBhdGh9YCk7XG5cbiAgY29uc3QgcnVuQ29kZSA9IGB5YXJuIG5vZGUgLXIgZG90ZW52L2NvbmZpZyAtLWVuYWJsZS1zb3VyY2UtbWFwcyBkaXN0L3ByYWN0aWNlcy8ke2ZpbGVOYW1lLnJlcGxhY2UoXG4gICAgXCIudHNcIixcbiAgICBcIi5qc1wiLFxuICApfWA7XG4gIGNvbnNvbGUubG9nKGAke2NoYWxrLmJsdWUocnVuQ29kZSl9IGNvcGllZCB0byBjbGlwYm9hcmQuYCk7XG4gIGV4ZWNTeW5jKGBlY2hvIFwiJHtydW5Db2RlfVwiIHwgcGJjb3B5YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfZW50aXR5KGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyBlbnRpdHlJZCwgdGl0bGU6IGVudGl0eUlkIH0pO1xuXG4gIGNvbnN0IHsgZmxhZ3MgfSA9IHBhcnNlQ2xpT3B0aW9ucygpO1xuICBjb25zdCB1c2VBSSA9IGZsYWdzLmhhcyhcImFpXCIpO1xuICBjb25zdCBub0NvbmVzID0gZmxhZ3MuaGFzKFwibm8tY29uZXNcIik7XG5cbiAgLy8gLS1uby1jb25lczogY29uZSDsg53shLEg7Iqk7YK1XG4gIGlmIChub0NvbmVzKSB7XG4gICAgY29uc29sZS5sb2coYOKckyBFbnRpdHkgJyR7ZW50aXR5SWR9JyBjcmVhdGVkIHdpdGhvdXQgY29uZXNgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICBpZiAoIWVudGl0eSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVudGl0eSBub3QgZm91bmQ6ICR7ZW50aXR5SWR9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gLS1haTogTExN7Jy866GcIGNvbmUg7IOd7ISxXG4gIGlmICh1c2VBSSkge1xuICAgIGNvbnNvbGUubG9nKGDinJMgRW50aXR5ICcke2VudGl0eUlkfScgY3JlYXRlZGApO1xuICAgIGNvbnNvbGUubG9nKGDwn4yfIEdlbmVyYXRpbmcgQUktcG93ZXJlZCBjb25lcy4uLmApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdMb2NhbGUgPSBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgICBjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIlxuICAgICAgICAgID8gY29uZmlnTG9jYWxlXG4gICAgICAgICAgOiBcImtvXCI7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgICAgcHJlc2VydmVFeGlzdGluZzogZmFsc2UsXG4gICAgICAgIG9ubHlFbXB0eTogZmFsc2UsXG4gICAgICAgIGxvY2FsZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zb2xlLmxvZyhg4pyFIERvbmUgKCR7cmVzdWx0LnRva2Vuc1VzZWR9IHRva2VucylgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIkFOVEhST1BJQ19BUElfS0VZXCIpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbvCfkqEgUmVtb3ZlIC0tYWkgZmxhZyB0byB1c2UgdGVtcGxhdGUgY29uZXMgaW5zdGVhZGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOq4sOuzuDog7YWc7ZSM66a/IGNvbmUg7J6Q64+ZIOyDneyEsVxuICAvLyBMTE0g7JeG7J20IGZha2VyLW1hcHBpbmdzLnRz66W8IO2ZnOyaqe2VmOyXrCDquLDrs7ggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAvLyDsnbTrpbwg7Ya17ZW0IEFOVEhST1BJQ19BUElfS0VZ6rCAIOyXhuyWtOuPhCBTb25hbXXrpbwg7IKs7Jqp7ZWgIOyImCDsnojsnLzrqbAsXG4gIC8vIOyDneyEseuQnCDthZztlIzrpr8gY29uZeydgCDrgpjspJHsl5AgJ2NvbmUgZ2VuJyDrqoXroLnslrTroZwgQUnrpbwg7Ya17ZW0IOyXheq3uOugiOydtOuTnO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICBjb25zb2xlLmxvZyhg8J+MnyBHZW5lcmF0aW5nIHRlbXBsYXRlIGNvbmVzLi4uYCk7XG4gIGF3YWl0IGVudGl0eS5nZW5lcmF0ZVRlbXBsYXRlQ29uZXMoKTtcbiAgY29uc29sZS5sb2coYOKckyBFbnRpdHkgJyR7ZW50aXR5SWR9JyBjcmVhdGVkIHdpdGggdGVtcGxhdGUgY29uZXNgKTtcbiAgY29uc29sZS5sb2coYPCfkqEgVGlwOiBSdW4gJ3BucG0gc29uYW11IGNvbmUgZ2VuICR7ZW50aXR5SWR9JyB0byBpbXByb3ZlIHdpdGggQUlgKTtcbn1cblxuLyoqXG4gKiBBSeulvCDsgqzsmqntlZjsl6wgZW50aXR57J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VmOqxsOuCmCDsl4Xqt7jroIjsnbTrk5ztlanri4jri6QuXG4gKlxuICog7Ji17IWYOlxuICogLSAtLXJlZ2VuZXJhdGU6IOyghOyytCDsnqzsg53shLEgKOq4sOyhtCBjb25lIOuNruyWtOyTsOq4sClcbiAqIC0gLS1sb2NhbGUgPGtvfGVufGphPjog7IOd7ISxIOyWuOyWtCDsp4DsoJVcbiAqIC0g6riw67O4OiBvbmx5RW1wdHkg66qo65OcICjquLDsobQgZml4dHVyZUhpbnQg67O07KG0KVxuICpcbiAqIEFOVEhST1BJQ19BUElfS0VZIO2VhOyalCAoc29uYW11LnNlY3JldC50cyDrmJDripQg7ZmY6rK967OA7IiYKVxuICovXG5hc3luYyBmdW5jdGlvbiBjb25lX2dlbihlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICBjb25zdCB7IGZsYWdzLCBvcHRpb25zIH0gPSBwYXJzZUNsaU9wdGlvbnMoKTtcblxuICAvLyAtLWFsbCDsmLXshZg6IOuqqOuToCBlbnRpdHkgY29uZSDsg53shLFcbiAgaWYgKGZsYWdzLmhhcyhcImFsbFwiKSB8fCBlbnRpdHlJZCA9PT0gXCJhbGxcIikge1xuICAgIGNvbnN0IGFsbEVudGl0aWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuICAgIGNvbnNvbGUubG9nKGDwn4yfIEdlbmVyYXRpbmcgQUktcG93ZXJlZCBjb25lcyBmb3IgJHthbGxFbnRpdGllcy5sZW5ndGh9IGVudGl0aWVzLi4uXFxuYCk7XG5cbiAgICBsZXQgdG90YWxUb2tlbnMgPSAwO1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGFsbEVudGl0aWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUHJvY2Vzc2luZyAke2VudGl0eS5pZH0uLi5gKTtcbiAgICAgICAgY29uc3QgY29uZmlnTG9jYWxlID0gb3B0aW9ucy5sb2NhbGUgfHwgU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgICAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgICAgIGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiXG4gICAgICAgICAgICA/IGNvbmZpZ0xvY2FsZVxuICAgICAgICAgICAgOiBcImtvXCI7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgICAgIHByZXNlcnZlRXhpc3Rpbmc6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgICAgIG9ubHlFbXB0eTogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0b3RhbFRva2VucyArPSByZXN1bHQudG9rZW5zVXNlZDtcbiAgICAgICAgY29uc29sZS5sb2coYCAg4pyTICR7ZW50aXR5LmlkfSAoJHtyZXN1bHQudG9rZW5zVXNlZH0gdG9rZW5zKVxcbmApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCI7XG4gICAgICAgIGVycm9ycy5wdXNoKGAke2VudGl0eS5pZH06ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICDinJcgJHtlbnRpdHkuaWR9OiAke21lc3NhZ2V9XFxuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFxcbuKchSBEb25lISBUb3RhbDogJHt0b3RhbFRva2Vuc30gdG9rZW5zIHVzZWRgKTtcbiAgICBjb25zdCBlc3RpbWF0ZWRDb3N0ID0gKHRvdGFsVG9rZW5zICogOSkgLyAxXzAwMF8wMDA7XG4gICAgY29uc29sZS5sb2coYPCfkrAgRXN0aW1hdGVkIGNvc3Q6IH4kJHtlc3RpbWF0ZWRDb3N0LnRvRml4ZWQoNCl9YCk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCBGYWlsZWQgZW50aXRpZXMgKCR7ZXJyb3JzLmxlbmd0aH0pOmApO1xuICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3JzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgLSAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8g64uo7J28IGVudGl0eSBjb25lIOyDneyEsVxuICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gIGlmICghZW50aXR5KSB7XG4gICAgY29uc29sZS5lcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlJZH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtb2RlID0gZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSA/IFwicmVnZW5lcmF0aW5nXCIgOiBcImdlbmVyYXRpbmdcIjtcbiAgY29uc29sZS5sb2coXG4gICAgYPCfjJ8gJHttb2RlID09PSBcInJlZ2VuZXJhdGluZ1wiID8gXCJSZWdlbmVyYXRpbmdcIiA6IFwiR2VuZXJhdGluZ1wifSBBSS1wb3dlcmVkIGNvbmVzIGZvciAke2VudGl0eUlkfS4uLmAsXG4gICk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWdMb2NhbGUgPSBvcHRpb25zLmxvY2FsZSB8fCBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiID8gY29uZmlnTG9jYWxlIDogXCJrb1wiO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgcHJlc2VydmVFeGlzdGluZzogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICBvbmx5RW1wdHk6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgbG9jYWxlLFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coYOKchSBEb25lISAoJHtyZXN1bHQudG9rZW5zVXNlZH0gdG9rZW5zIHVzZWQpYCk7XG5cbiAgICAvLyDthqDtgbAg67mE7JqpIOqzhOyCsCAo64yA65617KCB7J24IOy2lOyglSlcbiAgICAvLyBDbGF1ZGUgU29ubmV0IDQuNTogaW5wdXQgJDMvTSB0b2tlbnMsIG91dHB1dCAkMTUvTSB0b2tlbnNcbiAgICAvLyDqsITri6jtlZjqsowg7Y+J6regICQ5L00gdG9rZW5z66GcIOqzhOyCsFxuICAgIGNvbnN0IGVzdGltYXRlZENvc3QgPSAocmVzdWx0LnRva2Vuc1VzZWQgKiA5KSAvIDFfMDAwXzAwMDtcbiAgICBjb25zb2xlLmxvZyhg8J+SsCBFc3RpbWF0ZWQgY29zdDogfiQke2VzdGltYXRlZENvc3QudG9GaXhlZCg0KX1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJBTlRIUk9QSUNfQVBJX0tFWVwiKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7wn5KhIFRvIHVzZSBBSS1wb3dlcmVkIGNvbmUgZ2VuZXJhdGlvbjpgKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICAgMS4gR2V0IGFuIEFQSSBrZXkgZnJvbSBodHRwczovL2NvbnNvbGUuYW50aHJvcGljLmNvbS9gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgICAgMi4gQWRkIGl0IHRvIHNvbmFtdS5zZWNyZXQudHMgb3Igc2V0IEFOVEhST1BJQ19BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIlJhdGUgbGltaXRcIikpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu8J+SoSBQbGVhc2Ugd2FpdCBhIG1vbWVudCBhbmQgdHJ5IGFnYWluLmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MIEZhaWxlZCB0byBnZW5lcmF0ZSBjb25lczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgRmFpbGVkIHRvIGdlbmVyYXRlIGNvbmVzOiBVbmtub3duIGVycm9yYCk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsKGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFwibW9kZWxcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGRfbW9kZWxfdGVzdChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsX3Rlc3RcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIHNvbmFtdSBza2lsbHMgc3luYyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOqzteyLnSBTa2lsbHPrpbwg66Gc7LusIO2UhOuhnOygne2KuCDrmJDripQg6riA66Gc67KMIH4vLmNsYXVkZS/roZwg64+Z6riw7ZmU7ZWp64uI64ukLlxuICpcbiAqIC0tZ2xvYmFsIO2UjOuemOq3uDogfi8uY2xhdWRlL+yXkCDrj5nquLDtmZQgKO2UhOuhnOygne2KuCDsg53shLEg7KCEIOyCrOyaqSDqsIDriqUpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19zeW5jKCkge1xuICBjb25zdCB7IGZsYWdzIH0gPSBwYXJzZUNsaU9wdGlvbnMoKTtcbiAgY29uc3QgaXNHbG9iYWwgPSBmbGFncy5oYXMoXCJnbG9iYWxcIik7XG5cbiAgLy8g6rCc67CcIO2ZmOqyvSAtIGNsaS50czogc29uYW11L21vZHVsZXMvc29uYW11L3NyYy9iaW4vY2xpLnRzXG4gIC8vIOu5jOuTnCDtm4QgLSBjbGkuanM6IG5vZGVfbW9kdWxlcy9zb25hbXUvZGlzdC9iaW4vY2xpLmpzICjsi6TsoJwg7Iuk7ZaJKVxuICAvLyBza2lsbHMg7JyE7LmYOiBub2RlX21vZHVsZXMvc29uYW11L3NyYy9za2lsbHMgKG5wbSDrsLDtj6wg7IucKVxuICBjb25zdCBzb3VyY2VCYXNlID0gcGF0aC5yZXNvbHZlKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcInNyY1wiLCBcInNraWxsc1wiKTtcbiAgY29uc3Qgc291cmNlU2tpbGxzRGlyID0gcGF0aC5qb2luKHNvdXJjZUJhc2UsIFwic29uYW11XCIpO1xuICBjb25zdCBzb3VyY2VDbGF1ZGVNZCA9IHBhdGguam9pbihzb3VyY2VCYXNlLCBcIkNMQVVERS5tZFwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoc291cmNlU2tpbGxzRGlyKSkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJTa2lsbHMgc291cmNlIG5vdCBmb3VuZCBpbiBzb25hbXUgcGFja2FnZS5cIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpc0dsb2JhbCkge1xuICAgIGF3YWl0IHNraWxsc19zeW5jX3RvKHBhdGguam9pbihvcy5ob21lZGlyKCksIFwiLmNsYXVkZVwiKSwgc291cmNlU2tpbGxzRGlyLCBzb3VyY2VDbGF1ZGVNZCwge1xuICAgICAgdXNlU3ltbGluazogZmFsc2UsXG4gICAgICBjb3B5UHJvamVjdFRlbXBsYXRlczogZmFsc2UsXG4gICAgICBpc0dsb2JhbDogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4gIEdsb2JhbCBzeW5jIGNvbXBsZXRlIOKGkiB+Ly5jbGF1ZGUvc2tpbGxzL3NvbmFtdS9gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFRoZXNlIHNraWxscyBhcmUgYXZhaWxhYmxlIGluIGFsbCBDbGF1ZGUgQ29kZSBzZXNzaW9ucy5gKSk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjaGFsay5kaW0oXG4gICAgICAgIGAgIE9uY2UgYSBwcm9qZWN0IGlzIGNyZWF0ZWQsIHJ1biAncG5wbSBzb25hbXUgc2tpbGxzIHN5bmMnIGZvciBwcm9qZWN0LWxvY2FsIHN5bmMuYCxcbiAgICAgICksXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB3b3Jrc3BhY2VSb290ID0gYXdhaXQgZmluZFdvcmtzcGFjZVJvb3QoKTtcbiAgICBjb25zdCBjbGF1ZGVEaXIgPSBwYXRoLmpvaW4od29ya3NwYWNlUm9vdCwgXCIuY2xhdWRlXCIpO1xuICAgIGF3YWl0IHNraWxsc19zeW5jX3RvKGNsYXVkZURpciwgc291cmNlU2tpbGxzRGlyLCBzb3VyY2VDbGF1ZGVNZCwge1xuICAgICAgdXNlU3ltbGluazogdHJ1ZSxcbiAgICAgIGNvcHlQcm9qZWN0VGVtcGxhdGVzOiB0cnVlLFxuICAgICAgc291cmNlQmFzZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIGNsYXVkZURpcuuhnCBza2lsbHPrpbwg64+Z6riw7ZmU7ZWY64qUIOqzte2GtSDroZzsp4HsnoXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19zeW5jX3RvKFxuICBjbGF1ZGVEaXI6IHN0cmluZyxcbiAgc291cmNlU2tpbGxzRGlyOiBzdHJpbmcsXG4gIHNvdXJjZUNsYXVkZU1kOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHtcbiAgICB1c2VTeW1saW5rOiBib29sZWFuO1xuICAgIGNvcHlQcm9qZWN0VGVtcGxhdGVzOiBib29sZWFuO1xuICAgIHNvdXJjZUJhc2U/OiBzdHJpbmc7XG4gICAgaXNHbG9iYWw/OiBib29sZWFuO1xuICB9LFxuKSB7XG4gIGNvbnN0IHRhcmdldFNraWxsc0RpciA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwic2tpbGxzXCIsIFwic29uYW11XCIpO1xuXG4gIC8vIOq4sOyhtCDrlJTroInthqDrpqwvc3ltbGluayDsgq3soJwg7ZuEIOyerOyDneyEsVxuICAvLyBleGlzdHMoKeuKlCBicm9rZW4gc3ltbGlua+ulvCDqsJDsp4DtlZjsp4Ag66q77ZWY66+A66GcIHJt7J2EIOustOyhsOqxtCDsi5zrj4Ttlanri4jri6RcbiAgdHJ5IHtcbiAgICBhd2FpdCBybSh0YXJnZXRTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8g7YyM7J287J20IOyXhuycvOuptCDrrLTsi5xcbiAgfVxuXG4gIGF3YWl0IG1rZGlyKHBhdGguZGlybmFtZSh0YXJnZXRTa2lsbHNEaXIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBpZiAob3B0aW9ucy51c2VTeW1saW5rKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN5bWxpbmsoc291cmNlU2tpbGxzRGlyLCB0YXJnZXRTa2lsbHNEaXIsIFwiZGlyXCIpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBTa2lsbHMgbGlua2VkIChzeW1saW5rKWApKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnllbGxvdyhg4pqgIFN5bWxpbmsgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKSxcbiAgICAgICk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCAgRmFsbGluZyBiYWNrIHRvIGNvcHkuLi5gKSk7XG4gICAgICBhd2FpdCBza2lsbHNDb3B5KHNvdXJjZVNraWxsc0RpciwgdGFyZ2V0U2tpbGxzRGlyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgc2tpbGxzQ29weShzb3VyY2VTa2lsbHNEaXIsIHRhcmdldFNraWxsc0Rpcik7XG4gIH1cblxuICAvLyBwcm9qZWN0IOuUlOugie2GoOumrCDstIjquLDtmZQgKOyXhuycvOuptCDsg53shLEsIOyeiOycvOuptCDsnKDsp4ApXG4gIGlmIChvcHRpb25zLmNvcHlQcm9qZWN0VGVtcGxhdGVzICYmIG9wdGlvbnMuc291cmNlQmFzZSkge1xuICAgIGNvbnN0IHNvdXJjZVByb2plY3REaXIgPSBwYXRoLmpvaW4ob3B0aW9ucy5zb3VyY2VCYXNlLCBcInByb2plY3RcIik7XG4gICAgY29uc3QgdGFyZ2V0UHJvamVjdERpciA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwic2tpbGxzXCIsIFwicHJvamVjdFwiKTtcblxuICAgIGlmIChhd2FpdCBleGlzdHMoc291cmNlUHJvamVjdERpcikpIHtcbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyh0YXJnZXRQcm9qZWN0RGlyKSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjcChzb3VyY2VQcm9qZWN0RGlyLCB0YXJnZXRQcm9qZWN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIFByb2plY3QgdGVtcGxhdGVzIGluaXRpYWxpemVkYCkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgICAgIGDinJcgRmFpbGVkIHRvIGluaXRpYWxpemUgcHJvamVjdCB0ZW1wbGF0ZXM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShg4o+tIFByb2plY3QgdGVtcGxhdGVzIGFscmVhZHkgZXhpc3QgKHByZXNlcnZlZClgKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ0xBVURFLm1kIOuzteyCrC/sl4XrjbDsnbTtirhcbiAgaWYgKGF3YWl0IGV4aXN0cyhzb3VyY2VDbGF1ZGVNZCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0Q2xhdWRlTWQgPSBwYXRoLmpvaW4oY2xhdWRlRGlyLCBcIkNMQVVERS5tZFwiKTtcbiAgICAgIGNvbnN0IHJhd0NvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShzb3VyY2VDbGF1ZGVNZCwgXCJ1dGYtOFwiKTtcbiAgICAgIC8vIOq4gOuhnOuyjCDrqqjrk5zsl5DshJzripQg7IOB64yAIOqyveuhnOulvCDsoIjrjIAg6rK966Gc66GcIOuzgO2ZmO2VqeuLiOuLpFxuICAgICAgY29uc3Qgc291cmNlQ29udGVudCA9IG9wdGlvbnMuaXNHbG9iYWxcbiAgICAgICAgPyByYXdDb250ZW50LnJlcGxhY2VBbGwoXCIuY2xhdWRlL3NraWxscy9zb25hbXUvXCIsIFwifi8uY2xhdWRlL3NraWxscy9zb25hbXUvXCIpXG4gICAgICAgIDogcmF3Q29udGVudDtcblxuICAgICAgaWYgKGF3YWl0IGV4aXN0cyh0YXJnZXRDbGF1ZGVNZCkpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0Q29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHRhcmdldENsYXVkZU1kLCBcInV0Zi04XCIpO1xuICAgICAgICBjb25zdCBzdGFydE1hcmtlciA9IFwiPCEtLSBTT05BTVU6U1RBUlQgLS0+XCI7XG4gICAgICAgIGNvbnN0IGVuZE1hcmtlciA9IFwiPCEtLSBTT05BTVU6RU5EIC0tPlwiO1xuICAgICAgICBpZiAodGFyZ2V0Q29udGVudC5pbmNsdWRlcyhzdGFydE1hcmtlcikgJiYgdGFyZ2V0Q29udGVudC5pbmNsdWRlcyhlbmRNYXJrZXIpKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSB0YXJnZXRDb250ZW50LmluZGV4T2Yoc3RhcnRNYXJrZXIpO1xuICAgICAgICAgIGNvbnN0IGVuZElkeCA9IHRhcmdldENvbnRlbnQuaW5kZXhPZihlbmRNYXJrZXIpO1xuXG4gICAgICAgICAgaWYgKHN0YXJ0SWR4ICE9PSAtMSAmJiBlbmRJZHggIT09IC0xICYmIHN0YXJ0SWR4IDwgZW5kSWR4KSB7XG4gICAgICAgICAgICBjb25zdCBiZWZvcmUgPSB0YXJnZXRDb250ZW50LnN1YnN0cmluZygwLCBzdGFydElkeCk7XG4gICAgICAgICAgICBjb25zdCBhZnRlciA9IHRhcmdldENvbnRlbnQuc3Vic3RyaW5nKGVuZElkeCArIGVuZE1hcmtlci5sZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAke2JlZm9yZX0ke3N0YXJ0TWFya2VyfVxcbiR7c291cmNlQ29udGVudH1cXG4ke2VuZE1hcmtlcn0ke2FmdGVyfWA7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0Q2xhdWRlTWQsIG5ld0NvbnRlbnQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBDTEFVREUubWQgdXBkYXRlZCAobWFya2VyIHJlZ2lvbilgKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4o+tIENMQVVERS5tZCBtYXJrZXIgcG9zaXRpb25zIGludmFsaWQsIHNraXBwZWRgKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIOuniOy7pOqwgCDsl4bripQg6riw7KG0IENMQVVERS5tZOyXkCBTb25hbXUg7IS57IWY7J2EIOy2lOqwgO2VqeuLiOuLpFxuICAgICAgICAgIGNvbnN0IGFwcGVuZGVkID0gYCR7dGFyZ2V0Q29udGVudC50cmltRW5kKCl9XFxuXFxuPCEtLSBTT05BTVU6U1RBUlQgLS0+XFxuJHtzb3VyY2VDb250ZW50fVxcbjwhLS0gU09OQU1VOkVORCAtLT5cXG5gO1xuICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZSh0YXJnZXRDbGF1ZGVNZCwgYXBwZW5kZWQpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQ0xBVURFLm1kIHVwZGF0ZWQgKGFwcGVuZGVkIFNvbmFtdSBzZWN0aW9uKWApKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgd2l0aE1hcmtlcnMgPSBgPCEtLSBTT05BTVU6U1RBUlQgLS0+XFxuJHtzb3VyY2VDb250ZW50fVxcbjwhLS0gU09OQU1VOkVORCAtLT5cXG5gO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0Q2xhdWRlTWQsIHdpdGhNYXJrZXJzKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBDTEFVREUubWQgY3JlYXRlZGApKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGDinJcgRmFpbGVkIHRvIHVwZGF0ZSBDTEFVREUubWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBza2lsbHNDb3B5KHNyYzogc3RyaW5nLCBkZXN0OiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjcChzcmMsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgU2tpbGxzIGNvcGllZGApKTtcbiAgfSBjYXRjaCAoY29weUVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgYOKclyBGYWlsZWQgdG8gY29weSBza2lsbHM6ICR7Y29weUVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBjb3B5RXJyb3IubWVzc2FnZSA6IFN0cmluZyhjb3B5RXJyb3IpfWAsXG4gICAgICApLFxuICAgICk7XG4gICAgdGhyb3cgY29weUVycm9yO1xuICB9XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgc2tpbGxzIGNyZWF0ZSA8bmFtZT4g7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDroZzsu6wgc2tpbGwg7LSI7JWI7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2tpbGxzX2NyZWF0ZShuYW1lOiBzdHJpbmcpIHtcbiAgY29uc3Qgd29ya3NwYWNlUm9vdCA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VSb290KCk7XG4gIGNvbnN0IGxvY2FsRGlyID0gcGF0aC5qb2luKHdvcmtzcGFjZVJvb3QsIFwiLmNsYXVkZVwiLCBcInNraWxsc1wiLCBcImxvY2FsXCIpO1xuXG4gIC8vID09PSDtjIzsnbzrqoUg6rKA7KadIOuwjyBTYW5pdGl6ZSA9PT1cbiAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpID09PSBcIlwiKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCLinJcgU2tpbGwgbmFtZSBpcyByZXF1aXJlZFwiKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHNhbml0aXplZCA9IG5hbWVcbiAgICAvLyDqs7XrsLHsnYQg7ZWY7J207ZSI7Jy866GcXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCItXCIpXG4gICAgLy8g6rK966GcIOq1rOu2hOyekCDsoJzqsbBcbiAgICAucmVwbGFjZSgvWy9cXFxcXS9nLCBcIi1cIilcbiAgICAvLyBQYXRoIHRyYXZlcnNhbCDrsKnsp4BcbiAgICAucmVwbGFjZSgvXFwuXFwuL2csIFwiXCIpXG4gICAgLy8gV2luZG93cyDquIjsp4Ag66y47J6QIOygnOqxsFxuICAgIC5yZXBsYWNlKC9bPD46XCJ8PypdL2csIFwiXCIpXG4gICAgLy8g7Iuc7J6RL+uBnSDsoJAsIO2VmOydtO2UiCwg7Ja4642U7Iqk7L2U7Ja0IOygnOqxsFxuICAgIC5yZXBsYWNlKC9eWy5cXC1fXSt8Wy5cXC1fXSskL2csIFwiXCIpXG4gICAgLy8g7Jew7IaN65CcIO2VmOydtO2UiOydhCDtlZjrgpjroZxcbiAgICAucmVwbGFjZSgvLSsvZywgXCItXCIpXG4gICAgLy8g7JWM7YyM67KzLCDsiKvsnpAsIO2VmOydtO2UiCwg7Ja4642U7Iqk7L2U7Ja0LCDtlZzquIDrp4wg7ZeI7JqpXG4gICAgLnJlcGxhY2UoL1teYS16QS1aMC05LV/qsIAt7Z6jXS9nLCBcIlwiKTtcblxuICAvLyDquLjsnbQg7KCc7ZWcXG4gIGNvbnN0IE1BWF9MRU5HVEggPSAxMDA7XG4gIGlmIChzYW5pdGl6ZWQubGVuZ3RoID4gTUFYX0xFTkdUSCkge1xuICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5zdWJzdHJpbmcoMCwgTUFYX0xFTkdUSCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgTmFtZSB0cnVuY2F0ZWQgdG8gJHtNQVhfTEVOR1RIfSBjaGFyYWN0ZXJzYCkpO1xuICB9XG5cbiAgLy8gV2luZG93cyDsmIjslb3slrQg7ZmV7J24XG4gIGNvbnN0IFJFU0VSVkVEX05BTUVTID0gW1xuICAgIFwiQ09OXCIsXG4gICAgXCJQUk5cIixcbiAgICBcIkFVWFwiLFxuICAgIFwiTlVMXCIsXG4gICAgXCJDT00xXCIsXG4gICAgXCJDT00yXCIsXG4gICAgXCJDT00zXCIsXG4gICAgXCJDT000XCIsXG4gICAgXCJDT001XCIsXG4gICAgXCJDT002XCIsXG4gICAgXCJDT003XCIsXG4gICAgXCJDT004XCIsXG4gICAgXCJDT005XCIsXG4gICAgXCJMUFQxXCIsXG4gICAgXCJMUFQyXCIsXG4gICAgXCJMUFQzXCIsXG4gICAgXCJMUFQ0XCIsXG4gICAgXCJMUFQ1XCIsXG4gICAgXCJMUFQ2XCIsXG4gICAgXCJMUFQ3XCIsXG4gICAgXCJMUFQ4XCIsXG4gICAgXCJMUFQ5XCIsXG4gIF07XG4gIGlmIChSRVNFUlZFRF9OQU1FUy5pbmNsdWRlcyhzYW5pdGl6ZWQudG9VcHBlckNhc2UoKSkpIHtcbiAgICBzYW5pdGl6ZWQgPSBgc2tpbGwtJHtzYW5pdGl6ZWR9YDtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBSZXNlcnZlZCBuYW1lIGRldGVjdGVkLCBwcmVmaXhlZCB3aXRoIFwic2tpbGwtXCJgKSk7XG4gIH1cblxuICAvLyDruYgg66y47J6Q7Je0IOyytO2BrFxuICBpZiAoc2FuaXRpemVkID09PSBcIlwiKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCLinJcgSW52YWxpZCBza2lsbCBuYW1lIGFmdGVyIHNhbml0aXphdGlvblwiKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIE9yaWdpbmFsOiBcIiR7bmFtZX1cImApKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDrs4Dqsr0g7JWM66a8XG4gIGlmIChzYW5pdGl6ZWQgIT09IG5hbWUpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBOYW1lIHNhbml0aXplZDogXCIke25hbWV9XCIg4oaSIFwiJHtzYW5pdGl6ZWR9XCJgKSk7XG4gIH1cblxuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihsb2NhbERpciwgYCR7c2FuaXRpemVkfS5tZGApO1xuXG4gIGlmIChhd2FpdCBleGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGBTa2lsbCBcIiR7c2FuaXRpemVkfVwiIGFscmVhZHkgZXhpc3RzLmApKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBta2Rpcihsb2NhbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBgLS0tXG5uYW1lOiAke3Nhbml0aXplZH1cbmNhdGVnb3J5OiBvdGhlclxuY3JlYXRlZF9hdDogJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdfVxuc3RhdHVzOiBkcmFmdFxuLS0tXG5cbiMgJHtzYW5pdGl6ZWR9XG5cbiMjIOyDge2ZqVxuXG5b7Ja065akIOusuOygnOyYgOuKlOyngF1cblxuIyMg7ZW06rKwIOuwqeuylVxuXG5b7Ja065a76rKMIO2VtOqysO2WiOuKlOyngF1cblxuIyMg7L2U65OcIOyYiOyLnFxuXG5cXGBcXGBcXGB0eXBlc2NyaXB0XG4vLyDsmIjsi5wg7L2U65OcXG5cXGBcXGBcXGBcbmA7XG5cbiAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCB0ZW1wbGF0ZSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQ3JlYXRlZCAuY2xhdWRlL3NraWxscy9sb2NhbC8ke3Nhbml0aXplZH0ubWRgKSk7XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgYXV0aCBnZW5lcmF0ZSDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIGJldHRlci1hdXRoIOyXlO2LsO2LsOuTpChVc2VyLCBTZXNzaW9uLCBBY2NvdW50LCBWZXJpZmljYXRpb24p7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiDsmLXshZg6XG4gKiAtLXBsdWdpbnMgcGhvbmUtbnVtYmVyLDJmYSAg7ZSM65+s6re47J24IOyXlO2LsO2LsOuPhCDtlajqu5gg7IOd7ISxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGF1dGhfZ2VuZXJhdGUoKSB7XG4gIC8vIC0tcGx1Z2lucyDsmLXshZgg7YyM7IuxXG4gIGNvbnN0IHBsdWdpbnNBcmcgPSBwcm9jZXNzLmFyZ3YuZmluZCgoYXJnKSA9PiBhcmcuc3RhcnRzV2l0aChcIi0tcGx1Z2luc1wiKSk7XG4gIGNvbnN0IHBsdWdpbnM6IEJldHRlckF1dGhQbHVnaW5JZFtdID0gW107XG5cbiAgaWYgKHBsdWdpbnNBcmcpIHtcbiAgICBjb25zdCBwbHVnaW5WYWx1ZSA9IHBsdWdpbnNBcmcuaW5jbHVkZXMoXCI9XCIpXG4gICAgICA/IHBsdWdpbnNBcmcuc3BsaXQoXCI9XCIpWzFdXG4gICAgICA6IHByb2Nlc3MuYXJndltwcm9jZXNzLmFyZ3YuaW5kZXhPZihwbHVnaW5zQXJnKSArIDFdO1xuXG4gICAgaWYgKHBsdWdpblZhbHVlKSB7XG4gICAgICBjb25zdCBwbHVnaW5JZHMgPSBwbHVnaW5WYWx1ZS5zcGxpdChcIixcIikubWFwKChwKSA9PiBwLnRyaW0oKSk7XG5cbiAgICAgIGZvciAoY29uc3QgaWQgb2YgcGx1Z2luSWRzKSB7XG4gICAgICAgIGlmIChpc1ZhbGlkUGx1Z2luSWQoaWQpKSB7XG4gICAgICAgICAgcGx1Z2lucy5wdXNoKGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBVbmtub3duIHBsdWdpbjogJHtpZH1gKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFN1cHBvcnRlZCBwbHVnaW5zOiAke1NVUFBPUlRFRF9QTFVHSU5fSURTLmpvaW4oXCIsIFwiKX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIvCflJAgR2VuZXJhdGluZyBiZXR0ZXItYXV0aCBlbnRpdGllcy4uLlxcblwiKSk7XG5cbiAgaWYgKHBsdWdpbnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBQbHVnaW5zOiAke3BsdWdpbnMuam9pbihcIiwgXCIpfWApKTtcbiAgfVxuXG4gIGF3YWl0IGdlbmVyYXRlQmV0dGVyQXV0aEVudGl0aWVzKHsgcGx1Z2lucyB9KTtcbn1cblxuLyoqXG4gKiDsm4ztgazsiqTtjpjsnbTsiqQg66Oo7Yq466W8IOywvuyKteuLiOuLpC5cbiAqIOyasOyEoOyInOychDogcG5wbS13b3Jrc3BhY2UueWFtbCA+IENMQVVERS5tZCA+IOujqO2KuCBwYWNrYWdlLmpzb24gKHdvcmtzcGFjZXMg7ZWE65OcKVxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kV29ya3NwYWNlUm9vdCgpIHtcbiAgbGV0IGRpciA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgd2hpbGUgKGRpciAhPT0gcGF0aC5kaXJuYW1lKGRpcikpIHtcbiAgICAvLyAxLiBwbnBtLXdvcmtzcGFjZS55YW1sIO2MjOydvOydtCDsnojripTsp4Ag7ZmV7J24LiDsnojsnLzrqbQg7ZmV7Iuk7ZWcIG1vbm9yZXBvIOujqO2KuC5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHBhdGguam9pbihkaXIsIFwicG5wbS13b3Jrc3BhY2UueWFtbFwiKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuXG4gICAgLy8gMi4gQ0xBVURFLm1kIO2MjOydvOydtCDsnojripTsp4Ag7ZmV7J24LiDsnojsnLzrqbQg7ZSE66Gc7KCd7Yq4IOujqO2KuOuhnCDqsITso7ztlaguXG4gICAgaWYgKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oZGlyLCBcIkNMQVVERS5tZFwiKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuXG4gICAgLy8gMy4gcGFja2FnZS5qc29u7JeQIHdvcmtzcGFjZXMg7ZWE65Oc6rCAIOyeiOycvOuptCDro6jtirguXG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHBhY2thZ2VQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKHBhY2thZ2VQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgICAgaWYgKHBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgICByZXR1cm4gZGlyO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8g7YyM7IuxIOyLpO2MqOyLnCDrrLTsi5xcbiAgICAgIH1cbiAgICB9XG4gICAgZGlyID0gcGF0aC5kaXJuYW1lKGRpcik7XG4gIH1cblxuICAvLyDssL7sp4Ag66q77ZWY66m0IGFwaSDtj7TrjZTsnZgg67aA66qoIOyCrOyaqVxuICByZXR1cm4gZmluZEFwcFJvb3RQYXRoKCk7XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJkb3RlbnYiLCJjb25maWciLCJhc3NlcnQiLCJleGVjU3luYyIsInNwYXduIiwiY3AiLCJta2RpciIsInJlYWRkaXIiLCJyZWFkRmlsZSIsInJtIiwic3ltbGluayIsIndyaXRlRmlsZSIsImtuZXgiLCJjcmVhdGVSZXF1aXJlIiwib3MiLCJwYXRoIiwicHJvY2VzcyIsInRzaWNsaSIsIlNvbmFtdSIsImdlbmVyYXRlQmV0dGVyQXV0aEVudGl0aWVzIiwiaXNWYWxpZFBsdWdpbklkIiwiU1VQUE9SVEVEX1BMVUdJTl9JRFMiLCJFbnRpdHlNYW5hZ2VyIiwiTWlncmF0b3IiLCJGaXh0dXJlTWFuYWdlciIsImV4ZWNXaXRoTGluZVByZWZpeCIsInByaW50QnVpbGRTdW1tYXJ5IiwicHJpbnRUYXNrRmFpbGVkIiwicHJpbnRUYXNrSGVhZGVyIiwicHJpbnRUYXNrU3RhcnQiLCJwcmludFRhc2tTdWNjZXNzIiwiZXhpc3RzIiwiZmluZEFwaVJvb3RQYXRoIiwiZmluZEFwcFJvb3RQYXRoIiwiQVBJX0FSVElGQUNUUyIsIldFQl9BUlRJRkFDVFMiLCJmaXh0dXJlRXhwbG9yZUNvbW1hbmQiLCJmaXh0dXJlRmV0Y2hDb21tYW5kIiwiZml4dHVyZUdlbkNvbW1hbmQiLCJ0ZXN0Q29tbWFuZCIsIm1pZ3JhdG9yIiwicGFyc2VDbGlPcHRpb25zIiwiYXJndiIsImZsYWdzIiwiU2V0Iiwib3B0aW9ucyIsImkiLCJsZW5ndGgiLCJhcmciLCJzdGFydHNXaXRoIiwiaW5jbHVkZXMiLCJrZXkiLCJ2YWx1ZSIsInNsaWNlIiwic3BsaXQiLCJuZXh0QXJnIiwiYWRkIiwiYm9vdHN0cmFwIiwibm90VG9Jbml0IiwiaW5pdCIsImZpbHRlcmVkQXJndiIsInNraXBOZXh0IiwiYWZ0ZXJEb3VibGVEYXNoIiwicHVzaCIsImNtZCIsInR5cGVzIiwidHlwZSIsIm5hbWUiLCJtZXNzYWdlIiwiY2hvaWNlcyIsImdldEFsbFBhcmVudElkcyIsIm1hcCIsImVudGl0eUlkIiwidGl0bGUiLCJhcmdzIiwicnVubmVycyIsIm1pZ3JhdGVfc3RhdHVzIiwibWlncmF0ZV9ydW4iLCJtaWdyYXRlX2FwcGx5IiwiZml4dHVyZV9pbml0IiwiZml4dHVyZV9pbXBvcnQiLCJmaXh0dXJlX3N5bmMiLCJmaXh0dXJlX2dlbiIsImZpeHR1cmVfZmV0Y2giLCJmaXh0dXJlX2V4cGxvcmUiLCJzdHViX3ByYWN0aWNlIiwic3R1Yl9lbnRpdHkiLCJzY2FmZm9sZF9tb2RlbCIsInNjYWZmb2xkX21vZGVsX3Rlc3QiLCJjb25lX2dlbiIsInN5bmMiLCJidWlsZF9hbGwiLCJidWlsZF9hcGkiLCJidWlsZF93ZWIiLCJkZXZfYWxsIiwiZGV2X2FwaSIsImRldl93ZWIiLCJzdGFydCIsInNraWxsc19zeW5jIiwic2tpbGxzX2NyZWF0ZSIsInRlc3QiLCJhdXRoX2dlbmVyYXRlIiwiZGVzdHJveSIsImZpbmFsbHkiLCJzeW5jZXIiLCJzcGF3bkFwaURldlNlcnZlciIsImFwaVJvb3QiLCJlbnRyeVBvaW50IiwiaG90UnVubmVyQmluUGF0aCIsInVybCIsInJlc29sdmUiLCJzZXJ2ZXJQcm9jZXNzIiwiZXhlY1BhdGgiLCJqb2luIiwiY3dkIiwic3RkaW8iLCJlbnYiLCJOT0RFX0VOViIsIkhPVCIsIkFQSV9ST09UX1BBVEgiLCJleHRyYUVudiIsImNsZWFudXAiLCJjb25zb2xlIiwibG9nIiwieWVsbG93Iiwia2lsbCIsImV4aXQiLCJvbiIsImNvZGUiLCJlcnJvciIsInJlZCIsImJvbGQiLCJTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQiIsImFwcFJvb3QiLCJ3ZWJQYXRoIiwiZG91YmxlRGFzaEluZGV4IiwiaW5kZXhPZiIsInBhc3N0aHJvdWdoQXJncyIsInZpdGVBcmdzIiwidml0ZVByb2Nlc3MiLCJzaWduYWwiLCJyZXNvbHZlU3djQ29uZmlnUGF0aCIsInN3Y0ZpbGVQYXRoIiwiZGltIiwiZGlybmFtZSIsInNraXBJZk1pc3NpbmciLCJhcGlTdGFydGVkQXQiLCJEYXRlIiwibm93IiwiYXJ0aWZhY3QiLCJwcm9qZWN0UGF0aCIsImRlc2NyaXB0aW9uIiwicnVuQnVpbGRTdGVwcyIsImJ1aWxkQ29tbWFuZEFyZ3MiLCJjb25maWdGaWxlUGF0aCIsImUiLCJncmF5Iiwid2ViU3RhcnRlZEF0Iiwic3RlcHMiLCJwcmVCdWlsZENvbW1hbmQiLCJidWlsZENvbW1hbmQiLCJwb3N0QnVpbGRDb21tYW5kIiwiZmlsdGVyIiwic3RlcCIsImlzTGFzdCIsIkVycm9yIiwiY2F1c2UiLCJibHVlIiwic2V0dXBNaWdyYXRvciIsInNldHVwRml4dHVyZU1hbmFnZXIiLCJ0YXJnZXRzIiwicnVuQWN0aW9uIiwibG9jYWxIb3N0cyIsIk9iamVjdCIsImtleXMiLCJkYkNvbmZpZyIsInRhcmdldCIsInRhcmdldENvbmZpZyIsImhvc3QiLCJjb25uZWN0aW9uIiwidG9Mb3dlckNhc2UiLCJzdGF0dXMiLCJnZXRTdGF0dXMiLCJzcmNDb25maWciLCJkZXZlbG9wbWVudF9tYXN0ZXIiLCJsYWJlbCIsImZpeHR1cmUiLCJ0b1NraXAiLCJyZW1vdGVDb25uIiwibG9jYWxDb25uIiwiZGF0YWJhc2UiLCJkdW1wRmlsZW5hbWUiLCJzcmNDb25uIiwibWlncmF0aW9uc0R1bXAiLCJ1c2VyIiwicGFzc3dvcmQiLCJfZGIiLCJtaWdyYXRpb25zIiwicmF3IiwiY291bnQiLCJjb25uIiwiZGIiLCJ1bmRlZmluZWQiLCJyb3ciLCJteXNxbENtZCIsInJlY29yZElkcyIsImltcG9ydEZpeHR1cmUiLCJwYXJzZU9wdGlvbnMiLCJfIiwiayIsInYiLCJuZXh0IiwicHJhY3RpY2VEaXIiLCJhcGlSb290UGF0aCIsImZpbGVOYW1lcyIsIm1heFNlcU5vIiwicmVjdXJzaXZlIiwiZmlsdGVyZWRTZXFzIiwiZmlsZU5hbWUiLCJlbmRzV2l0aCIsInNlcU5vIiwibWF0Y2giLCJwYXJzZUludCIsInNvcnQiLCJhIiwiYiIsImN1cnJlbnRTZXFObyIsImRzdFBhdGgiLCJydW5Db2RlIiwicmVwbGFjZSIsImNyZWF0ZUVudGl0eSIsInVzZUFJIiwiaGFzIiwibm9Db25lcyIsImVudGl0eSIsImdldCIsImNvbmZpZ0xvY2FsZSIsImkxOG4iLCJkZWZhdWx0TG9jYWxlIiwibG9jYWxlIiwicmVzdWx0IiwiZ2VuZXJhdGVDb25lcyIsInByZXNlcnZlRXhpc3RpbmciLCJvbmx5RW1wdHkiLCJ0b2tlbnNVc2VkIiwiZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzIiwiYWxsRW50aXRpZXMiLCJnZXRBbGxFbnRpdGllcyIsInRvdGFsVG9rZW5zIiwiZXJyb3JzIiwiaWQiLCJlc3RpbWF0ZWRDb3N0IiwidG9GaXhlZCIsImVyciIsIm1vZGUiLCJnZW5lcmF0ZVRlbXBsYXRlIiwiaXNHbG9iYWwiLCJzb3VyY2VCYXNlIiwic291cmNlU2tpbGxzRGlyIiwic291cmNlQ2xhdWRlTWQiLCJza2lsbHNfc3luY190byIsImhvbWVkaXIiLCJ1c2VTeW1saW5rIiwiY29weVByb2plY3RUZW1wbGF0ZXMiLCJjeWFuIiwid29ya3NwYWNlUm9vdCIsImZpbmRXb3Jrc3BhY2VSb290IiwiY2xhdWRlRGlyIiwidGFyZ2V0U2tpbGxzRGlyIiwiZm9yY2UiLCJncmVlbiIsIlN0cmluZyIsInNraWxsc0NvcHkiLCJzb3VyY2VQcm9qZWN0RGlyIiwidGFyZ2V0UHJvamVjdERpciIsInRhcmdldENsYXVkZU1kIiwicmF3Q29udGVudCIsInNvdXJjZUNvbnRlbnQiLCJyZXBsYWNlQWxsIiwidGFyZ2V0Q29udGVudCIsInN0YXJ0TWFya2VyIiwiZW5kTWFya2VyIiwic3RhcnRJZHgiLCJlbmRJZHgiLCJiZWZvcmUiLCJzdWJzdHJpbmciLCJhZnRlciIsIm5ld0NvbnRlbnQiLCJhcHBlbmRlZCIsInRyaW1FbmQiLCJ3aXRoTWFya2VycyIsInNyYyIsImRlc3QiLCJjb3B5RXJyb3IiLCJsb2NhbERpciIsInRyaW0iLCJzYW5pdGl6ZWQiLCJNQVhfTEVOR1RIIiwiUkVTRVJWRURfTkFNRVMiLCJ0b1VwcGVyQ2FzZSIsImZpbGVQYXRoIiwidGVtcGxhdGUiLCJ0b0lTT1N0cmluZyIsInBsdWdpbnNBcmciLCJmaW5kIiwicGx1Z2lucyIsInBsdWdpblZhbHVlIiwicGx1Z2luSWRzIiwicCIsImRpciIsInBhY2thZ2VQYXRoIiwicGFja2FnZUpzb24iLCJKU09OIiwicGFyc2UiLCJ3b3Jrc3BhY2VzIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsWUFBWSxTQUFTO0FBRTVCQSxPQUFPQyxNQUFNO0FBRWIsT0FBT0MsWUFBWSxTQUFTO0FBQzVCLFNB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