wherdr 1.2.0 → 1.3.1

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 (124) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{AgentView.DE2GDt4O.css → AgentView.C4YOwvZG.css} +1 -1
  3. package/.output/public/_nuxt/{BIA9pZvC.js → B6qBWHWB.js} +1 -1
  4. package/.output/public/_nuxt/BMIe8p_3.js +2 -0
  5. package/.output/public/_nuxt/BrAeJIZR.js +30 -0
  6. package/.output/public/_nuxt/C12eXl5z.js +1 -0
  7. package/.output/public/_nuxt/{DxO1TBoK.js → C2T9fQ4f.js} +1 -1
  8. package/.output/public/_nuxt/CYxHnMNH.js +83 -0
  9. package/.output/public/_nuxt/{D903WmCE.js → CctS2Xn6.js} +1 -1
  10. package/.output/public/_nuxt/{Bta8at9w.js → CiYar6hg.js} +1 -1
  11. package/.output/public/_nuxt/{CjKICX3g.js → Dwh-l2rQ.js} +11 -11
  12. package/.output/public/_nuxt/{e5N4AqCN.js → WLQjK8uJ.js} +41 -41
  13. package/.output/public/_nuxt/builds/latest.json +1 -1
  14. package/.output/public/_nuxt/builds/meta/6466b0ab-7935-460c-abdf-2ea632dae6d0.json +1 -0
  15. package/.output/public/_nuxt/{entry.SHBiCXBL.css → entry.cKR16VqG.css} +1 -1
  16. package/.output/public/_nuxt/whFLy_Ne.js +23 -0
  17. package/.output/public/sw.js +1 -1
  18. package/.output/server/chunks/_/branding.mjs +1 -1
  19. package/.output/server/chunks/_/plugins.mjs +10 -2
  20. package/.output/server/chunks/_/worktrees.mjs +1 -1
  21. package/.output/server/chunks/_/ws.mjs +1 -1
  22. package/.output/server/chunks/nitro/nitro.mjs +626 -436
  23. package/.output/server/chunks/raw/bump-homebrew.mjs +7 -0
  24. package/.output/server/chunks/raw/herdr-plugin.mjs +1 -1
  25. package/.output/server/chunks/routes/api/_..._.mjs +1 -0
  26. package/.output/server/chunks/routes/api/agents.post.mjs +1 -0
  27. package/.output/server/chunks/routes/api/ask-tab.post.mjs +1 -0
  28. package/.output/server/chunks/routes/api/attach.post.mjs +1 -0
  29. package/.output/server/chunks/routes/api/auth/disable.post.mjs +1 -0
  30. package/.output/server/chunks/routes/api/auth/lock-all.post.mjs +1 -0
  31. package/.output/server/chunks/routes/api/auth/lock.post.mjs +1 -0
  32. package/.output/server/chunks/routes/api/auth/login/options.post.mjs +1 -0
  33. package/.output/server/chunks/routes/api/auth/login/verify.post.mjs +1 -0
  34. package/.output/server/chunks/routes/api/auth/max-session.post.mjs +1 -0
  35. package/.output/server/chunks/routes/api/auth/register/options.post.mjs +1 -0
  36. package/.output/server/chunks/routes/api/auth/register/verify.post.mjs +1 -0
  37. package/.output/server/chunks/routes/api/auth/status.get.mjs +1 -0
  38. package/.output/server/chunks/routes/api/changes.get.mjs +1 -0
  39. package/.output/server/chunks/routes/api/chat/image.get.mjs +1 -0
  40. package/.output/server/chunks/routes/api/chat.get.mjs +1 -0
  41. package/.output/server/chunks/routes/api/choose.post.mjs +1 -0
  42. package/.output/server/chunks/routes/api/claude-statusline.post.mjs +1 -0
  43. package/.output/server/chunks/routes/api/close/status.get.mjs +1 -0
  44. package/.output/server/chunks/routes/api/close.post.mjs +1 -0
  45. package/.output/server/chunks/routes/api/codex-update.post.mjs +1 -0
  46. package/.output/server/chunks/routes/api/commands.get.mjs +1 -0
  47. package/.output/server/chunks/routes/api/config.get.mjs +1 -0
  48. package/.output/server/chunks/routes/api/dirs.get.mjs +1 -0
  49. package/.output/server/chunks/routes/api/dismiss.post.mjs +1 -0
  50. package/.output/server/chunks/routes/api/effort.post.mjs +1 -0
  51. package/.output/server/chunks/routes/api/efforts.get.mjs +1 -0
  52. package/.output/server/chunks/routes/api/file.post.mjs +1 -0
  53. package/.output/server/chunks/routes/api/gitroot.get.mjs +1 -0
  54. package/.output/server/chunks/routes/api/index.get.mjs +1 -0
  55. package/.output/server/chunks/routes/api/input.post.mjs +1 -0
  56. package/.output/server/chunks/routes/api/interrupt.post.mjs +1 -0
  57. package/.output/server/chunks/routes/api/isgit.get.mjs +1 -0
  58. package/.output/server/chunks/routes/api/machine/awake.get.mjs +1 -0
  59. package/.output/server/chunks/routes/api/machine/awake.post.mjs +1 -0
  60. package/.output/server/chunks/routes/api/machine/order.get.mjs +1 -0
  61. package/.output/server/chunks/routes/api/machine/order.post.mjs +1 -0
  62. package/.output/server/chunks/routes/api/machine/rename.post.mjs +1 -0
  63. package/.output/server/chunks/routes/api/menu.post.mjs +1 -0
  64. package/.output/server/chunks/routes/api/model.post.mjs +1 -0
  65. package/.output/server/chunks/routes/api/models.get.mjs +1 -0
  66. package/.output/server/chunks/routes/api/nav.post.mjs +1 -0
  67. package/.output/server/chunks/routes/api/onboarding.get.mjs +1 -0
  68. package/.output/server/chunks/routes/api/onboarding.post.mjs +1 -0
  69. package/.output/server/chunks/routes/api/phone.get.mjs +1 -0
  70. package/.output/server/chunks/routes/api/phone.post.mjs +1 -0
  71. package/.output/server/chunks/routes/api/plugins/actions.get.mjs +1 -0
  72. package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +1 -0
  73. package/.output/server/chunks/routes/api/plugins/profiles.get.mjs +1 -0
  74. package/.output/server/chunks/routes/api/plugins/projects.get.mjs +1 -0
  75. package/.output/server/chunks/routes/api/plugins/projects.post.mjs +1 -0
  76. package/.output/server/chunks/routes/api/plugins/thread-limits.get.mjs +1 -0
  77. package/.output/server/chunks/routes/api/plugins/thread-limits.post.mjs +1 -0
  78. package/.output/server/chunks/routes/api/project/report.get.mjs +1 -0
  79. package/.output/server/chunks/routes/api/prompt.post.mjs +1 -0
  80. package/.output/server/chunks/routes/api/push/quiet.post.mjs +1 -0
  81. package/.output/server/chunks/routes/api/push/subscribe.post.mjs +1 -0
  82. package/.output/server/chunks/routes/api/push/test.post.mjs +1 -0
  83. package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +1 -0
  84. package/.output/server/chunks/routes/api/quotas.get.mjs +1 -0
  85. package/.output/server/chunks/routes/api/rename.post.mjs +1 -0
  86. package/.output/server/chunks/routes/api/requeue.post.mjs +1 -0
  87. package/.output/server/chunks/routes/api/restart.get.mjs +1 -0
  88. package/.output/server/chunks/routes/api/restart.post.mjs +1 -0
  89. package/.output/server/chunks/routes/api/reveal.post.mjs +1 -0
  90. package/.output/server/chunks/routes/api/screen-key.post.mjs +1 -0
  91. package/.output/server/chunks/routes/api/screen.get.mjs +8 -5
  92. package/.output/server/chunks/routes/api/search.get.mjs +2 -1
  93. package/.output/server/chunks/routes/api/seen.post.mjs +2 -1
  94. package/.output/server/chunks/routes/api/sessions.get.mjs +2 -1
  95. package/.output/server/chunks/routes/api/sessions.post.mjs +2 -1
  96. package/.output/server/chunks/routes/api/space.post.mjs +2 -1
  97. package/.output/server/chunks/routes/api/state.get.mjs +1 -0
  98. package/.output/server/chunks/routes/api/unqueue.post.mjs +2 -1
  99. package/.output/server/chunks/routes/api/update.get.mjs +3 -2
  100. package/.output/server/chunks/routes/api/upload.post.mjs +1 -0
  101. package/.output/server/chunks/routes/api/worktrees/remove.post.mjs +1 -0
  102. package/.output/server/chunks/routes/api/worktrees.get.mjs +1 -0
  103. package/.output/server/chunks/routes/favicon.ico.get.mjs +1 -0
  104. package/.output/server/chunks/routes/icons/_name_.get.mjs +2 -1
  105. package/.output/server/chunks/routes/renderer.mjs +3 -2
  106. package/.output/server/chunks/routes/uploads/_...name_.get.mjs +2 -1
  107. package/.output/server/chunks/routes/ws/_..._.mjs +2 -1
  108. package/.output/server/chunks/routes/ws/events.mjs +2 -1
  109. package/.output/server/chunks/routes/ws/mirror.mjs +1 -1
  110. package/.output/server/chunks/routes/ws/term.mjs +2 -96
  111. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  112. package/.output/server/index.mjs +2 -1
  113. package/.output/server/package.json +1 -1
  114. package/README.md +107 -23
  115. package/bin/lib/brew.mjs +86 -0
  116. package/bin/lib/commands.mjs +32 -8
  117. package/bin/lib/core.mjs +7 -2
  118. package/package.json +1 -1
  119. package/.output/public/_nuxt/BDI8xNSb.js +0 -2
  120. package/.output/public/_nuxt/BevNMnQ2.js +0 -83
  121. package/.output/public/_nuxt/CA9mI3eg.js +0 -23
  122. package/.output/public/_nuxt/DBu2-cEy.js +0 -30
  123. package/.output/public/_nuxt/DJE_XMLO.js +0 -1
  124. package/.output/public/_nuxt/builds/meta/211609c0-be04-46c5-a6b0-566bc0c4a3dd.json +0 -1
@@ -0,0 +1,7 @@
1
+ import { b as base64ToUint8Array } from '../virtual/_raw-helpers.mjs';
2
+
3
+ // ROLLUP_NO_REPLACE
4
+ const bumpHomebrew = base64ToUint8Array("IyEvYmluL3NoCiMgUG9pbnRzIHRoZSBIb21lYnJldyBmb3JtdWxhICg8b3duZXI+L2hvbWVicmV3LXRhcCwgRm9ybXVsYS93aGVyZHIucmIpIGF0IGEKIyB2ZXJzaW9uIGFscmVhZHkgcHVibGlzaGVkIG9uIG5wbS4gTWFudWFsIGZhbGxiYWNrIGZvciB0aGUgYGhvbWVicmV3YCBqb2Igb2YKIyAuZ2l0aHViL3dvcmtmbG93cy9ucG0ueW1sIHdoZW4gdGhlIEhPTUVCUkVXX1RBUF9UT0tFTiBzZWNyZXQgaXMgbWlzc2luZy4KIyBVc2VzIHRoZSBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIChgZ2ggYXV0aCBsb2dpbmApIHRvIGNsb25lIGFuZCBwdXNoLgojCiMgICBzY3JpcHRzL2J1bXAtaG9tZWJyZXcuc2ggW3ZlcnNpb25dIFtvd25lcl0KIwojIHZlcnNpb24gZGVmYXVsdHMgdG8gcGFja2FnZS5qc29uJ3MsIG93bmVyIHRvIHRoZSBvd25lciBvZiB0aGlzIGNoZWNrb3V0J3MgR2l0SHViIHJlcG8uCnNldCAtZXUKCmNkICIkKGRpcm5hbWUgIiQwIikvLi4iCnZlcnNpb249JHsxOi0kKG5vZGUgLXAgJ3JlcXVpcmUoIi4vcGFja2FnZS5qc29uIikudmVyc2lvbicgMj4vZGV2L251bGwgfHwgc2VkIC1uICdzL14gICJ2ZXJzaW9uIjogIlwoLipcKSIsJC9cMS9wJyBwYWNrYWdlLmpzb24pfQpvd25lcj0kezI6LSQoZ2ggcmVwbyB2aWV3IC0tanNvbiBvd25lciAtcSAub3duZXIubG9naW4pfQp1cmw9Imh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3doZXJkci8tL3doZXJkci0ke3ZlcnNpb259LnRneiIKCnRtcD0kKG1rdGVtcCAtZCkKdHJhcCAncm0gLXJmICIkdG1wIicgRVhJVAoKY3VybCAtZnNTTCAiJHVybCIgLW8gIiR0bXAvd2hlcmRyLnRneiIgfHwgeyBlY2hvICJ3aGVyZHJAJHt2ZXJzaW9ufSBpcyBub3Qgb24gbnBtIHlldCAoJHVybCkiID4mMjsgZXhpdCAxOyB9CmlmIGNvbW1hbmQgLXYgc2hhMjU2c3VtID4vZGV2L251bGw7IHRoZW4KICBzaGE9JChzaGEyNTZzdW0gIiR0bXAvd2hlcmRyLnRneiIgfCBjdXQgLWQnICcgLWYxKQplbHNlCiAgc2hhPSQoc2hhc3VtIC1hIDI1NiAiJHRtcC93aGVyZHIudGd6IiB8IGN1dCAtZCcgJyAtZjEpCmZpClsgLW4gIiRzaGEiIF0gfHwgeyBlY2hvICJDb3VsZCBub3QgY29tcHV0ZSBzaGEyNTYiID4mMjsgZXhpdCAxOyB9CgpnaCByZXBvIGNsb25lICIke293bmVyfS9ob21lYnJldy10YXAiICIkdG1wL3RhcCIgLS0gLXEKY2QgIiR0bXAvdGFwIgpzZWQgLUUgInN8XiAgdXJsIFwiLipcInwgIHVybCBcIiR7dXJsfVwifDsgc3xeICBzaGEyNTYgXCIuKlwifCAgc2hhMjU2IFwiJHtzaGF9XCJ8IiBGb3JtdWxhL3doZXJkci5yYiA+IEZvcm11bGEvd2hlcmRyLnJiLm5ldwptdiBGb3JtdWxhL3doZXJkci5yYi5uZXcgRm9ybXVsYS93aGVyZHIucmIKaWYgZ2l0IGRpZmYgLS1xdWlldDsgdGhlbiBlY2hvICJGb3JtdWxhIGFscmVhZHkgYXQgJHt2ZXJzaW9ufS4iOyBleGl0IDA7IGZpCmdpdCBkaWZmCmdpdCBjb21taXQgLXFhbSAid2hlcmRyICR7dmVyc2lvbn0iCmdpdCBwdXNoIC1xCmVjaG8gIkZvcm11bGEvd2hlcmRyLnJiIG5vdyBwb2ludHMgYXQgd2hlcmRyICR7dmVyc2lvbn0gKHNoYTI1NiAke3NoYX0pLiIK");
5
+
6
+ export { bumpHomebrew as default };
7
+ //# sourceMappingURL=bump-homebrew.mjs.map
@@ -1,7 +1,7 @@
1
1
  import { b as base64ToUint8Array } from '../virtual/_raw-helpers.mjs';
2
2
 
3
3
  // ROLLUP_NO_REPLACE
4
- const herdrPlugin = base64ToUint8Array("IyEvYmluL3NoCiMgd2hlcmRyIGFzIGEgSGVyZHIgcGx1Z2luIChoZXJkci1wbHVnaW4udG9tbCk6IGJ1aWxkIChpbnN0YWxsICsgZmlyc3Qgc3RhcnQpLAojIHRoZSBwYW5lbCwgc3RhcnQsIHN0b3AsIHN0YXR1cywgb3BlbiwgdXBkYXRlLCBzZXJ2aWNlLCBza2lsbCwga2V5LgojCiMgICBoZXJkciBwbHVnaW4gaW5zdGFsbCA8b3duZXI+L3doZXJkcgojCiMgVHdvIHdheXMgdG8gcnVuIHdoZXJkciwgcGlja2VkIG9uY2UgYXQgaW5zdGFsbCB0aW1lIGFuZCBrZXB0IGluCiMgJFdIRVJEUl9ESVIvcGx1Z2luLmVudjoKIyAgIGRvY2tlciAgTGludXggd2l0aCBEb2NrZXIgQ29tcG9zZSB2MiB1c2FibGUgYnkgdGhpcyB1c2VyOiB0aGUgcHVibGlzaGVkCiMgICAgICAgICAgIGltYWdlLCBydW4gZnJvbSAkV0hFUkRSX0RJUiBleGFjdGx5IGxpa2UgaHR0cHM6Ly93aGVyZHIuZGV2L2luc3RhbGwuCiMgICBuYXRpdmUgIGV2ZXJ5d2hlcmUgZWxzZSAoYWx3YXlzIG9uIG1hY09TOiBEb2NrZXIgRGVza3RvcCBjYW5ub3QgcmVhY2gKIyAgICAgICAgICAgSGVyZHIncyBVbml4IHNvY2tldCk6IE5vZGUuanMgMjIgKG9yIEJ1bikgcnVucyB0aGUgcHJlYnVpbHQgbnBtCiMgICAgICAgICAgIHBhY2thZ2Ugb2YgdGhpcyB2ZXJzaW9uIChvciBhIGJ1aWxkIG1hZGUgaW4gdGhlIHBsdWdpbiBmb2xkZXIpLAojICAgICAgICAgICBjb3BpZWQgdG8gJFdIRVJEUl9ESVIvYXBwIGFuZCBzdGFydGVkIGRldGFjaGVkIGZyb20gdGhlcmUsIHdpdGgKIyAgICAgICAgICAgaXRzIHBpZCBhbmQgbG9nIGluICRXSEVSRFJfRElSLgojIEhlcmRyIGJ1aWxkcyBhIHBsdWdpbiBpbiBhIHRlbXBvcmFyeSBmb2xkZXIsIHRoZW4gbW92ZXMgaXQ6IGEgc2VydmVyIHN0YXJ0ZWQKIyBmcm9tIHRoZSBjaGVja291dCBkdXJpbmcgdGhlIGJ1aWxkIHdvdWxkIGxvc2UgaXRzIGZpbGVzLiAkV0hFUkRSX0RJUi9hcHAKIyBzdGF5cyBwdXQsIGFjcm9zcyBwbHVnaW4gdXBkYXRlcyB0b28sIHNvIHRoZSBidWlsZCBjYW4gc3RhcnQgd2hlcmRyIGFuZCBhCiMgbG9naW4gc2VydmljZSBjYW4gcG9pbnQgYXQgaXQuCiMgV0hFUkRSX01PREU9bmF0aXZlIChvciBkb2NrZXIpIGluIHRoZSBlbnZpcm9ubWVudCBvZiBgaGVyZHIgcGx1Z2luIGluc3RhbGxgCiMgZm9yY2VzIHRoZSBjaG9pY2U7IGVkaXQgcGx1Z2luLmVudiB0byBjaGFuZ2UgaXQgbGF0ZXIsIHRoZW4gcnVuIFVwZGF0ZS4KIwojIFNhZmV0eSBydWxlczoKIyAgIC0gbm90aGluZyBnbG9iYWwgaXMgaW5zdGFsbGVkLCBubyBzdWRvOyBmaWxlcyBhcmUgb25seSB3cml0dGVuIHRvIHRoZQojICAgICBwbHVnaW4gZm9sZGVyIGFuZCAkV0hFUkRSX0RJUiAoZGVmYXVsdCB+L3doZXJkciksIHBsdXMgdGhlIGZvbGRlcnMgdGhlCiMgICAgIERvY2tlciBzZXR1cCBtb3VudHMgKH4vLmNvbmZpZy9oZXJkciwgfi8uY2FjaGUvaGVyZHItd2Vi4oCmKSwgYW5kIHRoZQojICAgICBsb2dpbiBzZXJ2aWNlIG9ubHkgd2hlbiBhc2tlZCAoa2V5IEEgb2YgdGhlIHBhbmVsKSwgcGx1cyBhICJ3aGVyZHIiCiMgICAgIGxpbmsgaW4gdGhlIGFnZW50cycgdXNlciBza2lsbCBmb2xkZXJzIChzZWUgY21kX3NraWxsKSwgcGx1cyBvbmUgbWFya2VkCiMgICAgIGJsb2NrIGFwcGVuZGVkIHRvIEhlcmRyJ3MgY29uZmlnLnRvbWw6IHRoZSBrZXkgdGhhdCBvcGVucyB0aGUgcGFuZWwKIyAgICAgKHNlZSBjbWRfa2V5KTsKIyAgIC0gdGhlIGluc3RhbGwgc3RhcnRzIHdoZXJkciwgYW5kIEhlcmRyJ3Mgc3RhcnR1cCBob29rIHN0YXJ0cyBpdCBhZ2FpbiwKIyAgICAgYnV0IG9ubHkgd2hlbiBub3RoaW5nIGFuc3dlcnMgb24gdGhlIHBvcnQ6IGEgd2hlcmRyIHN0YXJ0ZWQgYW5vdGhlciB3YXkKIyAgICAgKERvY2tlciwgc3lzdGVtZCwgYnkgaGFuZCkgaXMgbmV2ZXIgdG91Y2hlZCwgbm8gc2Vjb25kIHdoZXJkciBpcyBzdGFydGVkOwojICAgLSBzdG9wIG9ubHkgc3RvcHMgd2hhdCB0aGlzIHBsdWdpbiBzdGFydGVkIChpdHMgcGlkLCBpdHMgbG9naW4gc2VydmljZSwgb3IKIyAgICAgdGhlIGNvbnRhaW5lciBvZiBpdHMgb3duIGNvbXBvc2UgZm9sZGVyKS4KIwojIFVuaW5zdGFsbDogSGVyZHIgaGFzIG5vIHVuaW5zdGFsbCBob29rLiBTdG9wIHdoZXJkciAoYW5kIHJlbW92ZSB0aGUgbG9naW4KIyBzZXJ2aWNlKSBmcm9tIHRoZSBwYW5lbCBmaXJzdCwgdGhlbjoKIyAgIHNoIHNjcmlwdHMvaGVyZHItcGx1Z2luLnNoIHNraWxsIHVuaW5zdGFsbCAgIChpbiB0aGUgcGx1Z2luIGZvbGRlcikKIyAgIHNoIHNjcmlwdHMvaGVyZHItcGx1Z2luLnNoIGtleSB1bmluc3RhbGwgICAgICh0aGUgSGVyZHIga2V5IG9mIHRoZSBwYW5lbCkKIyAgIGhlcmRyIHBsdWdpbiB1bmluc3RhbGwgPG93bmVyPi53aGVyZHIgJiYgcm0gLXJmIH4vd2hlcmRyCiMKIyBTZXR0aW5ncyAoJFdIRVJEUl9ESVIvcGx1Z2luLmVudiwgb3IgdGhlIGVudmlyb25tZW50KToKIyAgIFdIRVJEUl9NT0RFICBkb2NrZXIgfCBuYXRpdmUgICAgICAgIChkZWZhdWx0OiBjaG9zZW4gYXQgaW5zdGFsbCkKIyAgIFdIRVJEUl9QT1JUICBsb2NhbCBwb3J0ICAgICAgICAgICAgICAoZGVmYXVsdDogNzY4MykKIyAgIEFQUF9VUkwgICAgICBwcml2YXRlIEhUVFBTIGFkZHJlc3MgICAobmF0aXZlOyBEb2NrZXIgcmVhZHMgaXRzIC5lbnYpCiMgICBXSEVSRFJfUlVOVElNRSAgYWJzb2x1dGUgcGF0aCBvZiBub2RlIC8gYnVuIChuYXRpdmU7IGZvdW5kIGF0IGluc3RhbGwpCgpzZXQgLWV1CgpST09UPSIkKGNkICIkKGRpcm5hbWUgIiQwIikvLi4iICYmIHB3ZCAtUCkiCiMgQnVpbGQgY29tbWFuZHMgZ2V0IG5vIHBsdWdpbiBlbnZpcm9ubWVudDogdGhlIGZvbGRlciBjaG9zZW4gYXQgaW5zdGFsbAojIHRpbWUgaXMgcmVtZW1iZXJlZCBpbiB0aGUgcGx1Z2luIGNoZWNrb3V0IGZvciB0aGUgcnVudGltZSBjb21tYW5kcy4KaWYgWyAteiAiJHtXSEVSRFJfRElSOi19IiBdICYmIFsgLWYgIiRST09ULy53aGVyZHItZGlyIiBdOyB0aGVuCiAgV0hFUkRSX0RJUj0iJChjYXQgIiRST09ULy53aGVyZHItZGlyIikiCmZpCkRJUj0iJHtXSEVSRFJfRElSOi0kSE9NRS93aGVyZHJ9IgpDT05GPSIkRElSL3BsdWdpbi5lbnYiCiMgTmF0aXZlIG1vZGU6IHRoZSBpbnN0YWxsZWQgY29weSBvZiB3aGVyZHIgKGJpbiArIGJ1aWx0IHNlcnZlcikuCkFQUD0iJERJUi9hcHAiCiMgR2l0SHViIHNvdXJjZSBvZiB0aGlzIHBsdWdpbjogaXRzIG1hbmlmZXN0IGlkIHdpdGggIi8iIGZvciAiLiIgKG93bmVyLndoZXJkcikuClNPVVJDRT0iJChzZWQgLW4gJ3MvXmlkID0gIlwoLipcKSIkL1wxL3AnICIkUk9PVC9oZXJkci1wbHVnaW4udG9tbCIgfCBoZWFkIC1uIDEgfCB0ciAuIC8pIgojIGNvbnRhaW5lcl9uYW1lIG9mIHRoZSBjb21wb3NlIGZpbGUgKHdoZXJkciB1bmxlc3MgeW91IHJlbmFtZWQgaXQpLgpDT05UQUlORVI9IiQoc2VkIC1uICdzL14gKmNvbnRhaW5lcl9uYW1lOiAqLy9wJyAiJERJUi9kb2NrZXItY29tcG9zZS55bWwiIDI+L2Rldi9udWxsIHwgaGVhZCAtbiAxKSIKQ09OVEFJTkVSPSIke0NPTlRBSU5FUjotd2hlcmRyfSIKIyBUaGUgZW52aXJvbm1lbnQgd2lucyBvdmVyIHBsdWdpbi5lbnYuCkVOVl9NT0RFPSIke1dIRVJEUl9NT0RFOi19IiBFTlZfUE9SVD0iJHtXSEVSRFJfUE9SVDotfSIgRU5WX0FQUF9VUkw9IiR7QVBQX1VSTDotfSIgRU5WX1JVTlRJTUU9IiR7V0hFUkRSX1JVTlRJTUU6LX0iCmlmIFsgLWYgIiRDT05GIiBdOyB0aGVuCiAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MxMDkwCiAgLiAiJENPTkYiCmZpCk1PREU9IiR7RU5WX01PREU6LSR7V0hFUkRSX01PREU6LX19IgpQT1JUPSIke0VOVl9QT1JUOi0ke1dIRVJEUl9QT1JUOi03NjgzfX0iCkFQUF9VUkw9IiR7RU5WX0FQUF9VUkw6LSR7QVBQX1VSTDotfX0iCiMgTmF0aXZlIG1vZGU6IGFic29sdXRlIHBhdGggb2YgdGhlIG5vZGUgKG9yIGJ1bikgdGhhdCBydW5zIHRoZSBzZXJ2ZXIuIEhlcmRyCiMgcnVucyBhY3Rpb25zIHdpdGggaXRzIHNlcnZlcidzIFBBVEgsIHdoaWNoIG9mdGVuIGxhY2tzIG52bSAvIG4gLyBmbm0gZm9sZGVycy4KUlVOVElNRT0iJHtFTlZfUlVOVElNRTotJHtXSEVSRFJfUlVOVElNRTotfX0iClVSTD0iaHR0cDovL2xvY2FsaG9zdDokUE9SVCIKCnNheSgpIHsgcHJpbnRmICclc1xuJyAiJCoiOyB9Cm9rKCkgeyBwcmludGYgJyAg4pyTICVzXG4nICIkKiI7IH0Kd2FybigpIHsgcHJpbnRmICcgICEgJXNcbicgIiQqIiA+JjI7IH0KZGllKCkgeyBwcmludGYgJyAg4pyXICVzXG4nICIkKiIgPiYyOyBleGl0IDE7IH0KCiMgQW55IEhUVFAgYW5zd2VyIGNvdW50cyAoYSBsb2NrZWQgd2hlcmRyIGFuc3dlcnMgNDAxKTogdGhlIHBvcnQgaXMgdGFrZW4uCmFuc3dlcnMoKSB7CiAgaWYgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgY29kZT0iJChjdXJsIC1zIC1vIC9kZXYvbnVsbCAtLW1heC10aW1lIDIgLXcgJyV7aHR0cF9jb2RlfScgImh0dHA6Ly8xMjcuMC4wLjE6JFBPUlQvIiAyPi9kZXYvbnVsbCB8fCB0cnVlKSIKICAgIFsgLW4gIiRjb2RlIiBdICYmIFsgIiRjb2RlIiAhPSAiMDAwIiBdCiAgZWxpZiBjb21tYW5kIC12IG5jID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgbmMgLXogMTI3LjAuMC4xICIkUE9SVCIgPi9kZXYvbnVsbCAyPiYxCiAgZWxzZQogICAgZGllICJjdXJsIG9yIG5jIGlzIG5lZWRlZCB0byBjaGVjayBwb3J0ICRQT1JULiIKICBmaQp9Cgpkb2NrZXJfdXNhYmxlKCkgewogIFsgIiQodW5hbWUgLXMpIiA9ICJMaW51eCIgXSB8fCByZXR1cm4gMQogIGNvbW1hbmQgLXYgZG9ja2VyID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMQogIGRvY2tlciBjb21wb3NlIHZlcnNpb24gPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAxCiAgZG9ja2VyIGluZm8gPi9kZXYvbnVsbCAyPiYxCn0KCiMgTWFqb3IgdmVyc2lvbiBvZiBhIG5vZGUgYmluYXJ5LCAwIHdoZW4gaXQgaXMgbm90IG9uZS4Kbm9kZV9tYWpvcigpIHsKICAiJDEiIC1wICdwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoIi4iKVswXScgMj4vZGV2L251bGwgfHwgZWNobyAwCn0KCiMgQSB1c2FibGUgcnVudGltZTogTm9kZS5qcyAyMiBvciBuZXdlciwgb3IgQnVuIChpdCBydW5zIHRoZSBidWlsdCBzZXJ2ZXIgdG9vKS4KcnVudGltZV9vaygpIHsKICBbIC1uICIkMSIgXSAmJiBbIC14ICIkMSIgXSAmJiBbICEgLWQgIiQxIiBdIHx8IHJldHVybiAxCiAgY2FzZSAiJChiYXNlbmFtZSAiJDEiKSIgaW4KICAgIGJ1bikgIiQxIiAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPiYxIDs7CiAgICAqKSBbICIkKG5vZGVfbWFqb3IgIiQxIikiIC1nZSAyMiBdIDI+L2Rldi9udWxsIDs7CiAgZXNhYwp9CgojIEFic29sdXRlIHBhdGggb2YgdGhlIHJ1bnRpbWU6IFdIRVJEUl9SVU5USU1FLCB0aGVuIG5vZGUgb24gdGhlIFBBVEgsIHRoZW4gdGhlCiMgdXN1YWwgaW5zdGFsbCBmb2xkZXJzIChuLCBudm0sIFZvbHRhLCBmbm0sIGFzZGYsIEhvbWVicmV3KSwgdGhlbiBCdW4uCiMgUHJpbnRzIG5vdGhpbmcgYW5kIGZhaWxzIHdoZW4gbm9uZSBpcyBmb3VuZC4KZmluZF9ydW50aW1lKCkgewogIGZvciBjIGluICIkUlVOVElNRSIgIiQoY29tbWFuZCAtdiBub2RlIDI+L2Rldi9udWxsIHx8IHRydWUpIiBcCiAgICAiJEhPTUUvLm4vYmluL25vZGUiICIke05fUFJFRklYOiskTl9QUkVGSVgvYmluL25vZGV9IiBcCiAgICAkKGxzIC1kICIkSE9NRSIvLm52bS92ZXJzaW9ucy9ub2RlL3YqL2Jpbi9ub2RlIDI+L2Rldi9udWxsIHwgc29ydCAtciAtVikgXAogICAgIiRIT01FLy52b2x0YS9iaW4vbm9kZSIgXAogICAgJChscyAtZCAiJEhPTUUiLy5sb2NhbC9zaGFyZS9mbm0vbm9kZS12ZXJzaW9ucy8qL2luc3RhbGxhdGlvbi9iaW4vbm9kZSAiJEhPTUUiLy5mbm0vbm9kZS12ZXJzaW9ucy8qL2luc3RhbGxhdGlvbi9iaW4vbm9kZSAyPi9kZXYvbnVsbCB8IHNvcnQgLXIgLVYpIFwKICAgICIkSE9NRS8uYXNkZi9zaGltcy9ub2RlIiAvb3B0L2hvbWVicmV3L2Jpbi9ub2RlIC91c3IvbG9jYWwvYmluL25vZGUgL3Vzci9iaW4vbm9kZSBcCiAgICAiJChjb21tYW5kIC12IGJ1biAyPi9kZXYvbnVsbCB8fCB0cnVlKSIgIiRIT01FLy5idW4vYmluL2J1biIgL29wdC9ob21lYnJldy9iaW4vYnVuIC91c3IvbG9jYWwvYmluL2J1bjsgZG8KICAgIGlmIHJ1bnRpbWVfb2sgIiRjIjsgdGhlbiBlY2hvICIkYyI7IHJldHVybiAwOyBmaQogIGRvbmUKICByZXR1cm4gMQp9CgpSVU5USU1FX0hFTFA9Ik5vZGUuanMgMjIgb3IgbmV3ZXIgKG9yIEJ1bikgaXMgcmVxdWlyZWQgdG8gcnVuIHdoZXJkciB3aXRob3V0IERvY2tlci4KICAgICBJbnN0YWxsIGl0IGZyb20gaHR0cHM6Ly9ub2RlanMub3JnLCBvciBzZXQgaXRzIGFic29sdXRlIHBhdGggaW4gJENPTkY6CiAgICAgICBXSEVSRFJfUlVOVElNRT0vcGF0aC90by9ub2RlIgoKaGVyZHJfYmluKCkgewogIGlmIFsgLW4gIiR7SEVSRFJfQklOX1BBVEg6LX0iIF07IHRoZW4gZWNobyAiJEhFUkRSX0JJTl9QQVRIIgogIGVsaWYgWyAteCAiJEhPTUUvLmxvY2FsL2Jpbi9oZXJkciIgXTsgdGhlbiBlY2hvICIkSE9NRS8ubG9jYWwvYmluL2hlcmRyIgogIGVsc2UgY29tbWFuZCAtdiBoZXJkciAyPi9kZXYvbnVsbCB8fCBlY2hvIGhlcmRyCiAgZmkKfQoKcmVhbF9kaXIoKSB7IChjZCAiJDEiIDI+L2Rldi9udWxsICYmIHB3ZCAtUCkgfHwgZWNobyAiJDEiOyB9CgojIENvbXBvc2UgZm9sZGVyIG9mIHRoZSBgd2hlcmRyYCBjb250YWluZXIsIGVtcHR5IHdoZW4gdGhlcmUgaXMgbm9uZS4KY29udGFpbmVyX2RpcigpIHsKICBkb2NrZXIgaW5zcGVjdCAiJENPTlRBSU5FUiIgLS1mb3JtYXQgJ3t7IGluZGV4IC5Db25maWcuTGFiZWxzICJjb20uZG9ja2VyLmNvbXBvc2UucHJvamVjdC53b3JraW5nX2RpciIgfX0nIDI+L2Rldi9udWxsIHx8IHRydWUKfQoKIyBUcnVlIHdoZW4gdGhlIGB3aGVyZHJgIGNvbnRhaW5lciBiZWxvbmdzIHRvICRESVIgKG9yIGRvZXMgbm90IGV4aXN0IHlldCkuCmNvbnRhaW5lcl9vdXJzKCkgewogIG93bmVyPSIkKGNvbnRhaW5lcl9kaXIpIgogIFsgLXogIiRvd25lciIgXSB8fCBbICIkKHJlYWxfZGlyICIkb3duZXIiKSIgPSAiJChyZWFsX2RpciAiJERJUiIpIiBdCn0KCmNvbXBvc2UoKSB7IGRvY2tlciBjb21wb3NlIC0tcHJvamVjdC1kaXJlY3RvcnkgIiRESVIiIC1mICIkRElSL2RvY2tlci1jb21wb3NlLnltbCIgIiRAIjsgfQoKd2FpdF91cCgpIHsKICBpPTAKICB3aGlsZSBbICIkaSIgLWx0ICIkezE6LTMwfSIgXTsgZG8KICAgIGlmIGFuc3dlcnM7IHRoZW4gcmV0dXJuIDA7IGZpCiAgICBpPSQoKGkgKyAxKSk7IHNsZWVwIDEKICBkb25lCiAgcmV0dXJuIDEKfQoKIyBUaGUgY29tbWFuZHMgb2YgdGhlIG5hdGl2ZSBtb2RlOiB0aGUgaW5zdGFsbGVkIGNvcHksIG9yIHRoZSBjaGVja291dCBpdHNlbGYKIyAoYSBsaW5rZWQgcGx1Z2luIGJ1aWx0IGJ5IGhhbmQsIG9yIGEgcGx1Z2luIGluc3RhbGxlZCBiZWZvcmUgJEFQUCBleGlzdGVkKS4KY2xpX3Jvb3QoKSB7CiAgaWYgWyAtZiAiJEFQUC9iaW4vd2hlcmRyLm1qcyIgXSAmJiBbIC1mICIkQVBQLy5vdXRwdXQvc2VydmVyL2luZGV4Lm1qcyIgXTsgdGhlbiBlY2hvICIkQVBQIjsgZWxzZSBlY2hvICIkUk9PVCI7IGZpCn0KCiMgVGhlIHBlcnNvbiBydW5uaW5nIGBoZXJkciBwbHVnaW4gaW5zdGFsbGAgc2VlcyBvbmx5IEhlcmRyJ3Mgb3duIGxpbmVzOiB0aGUKIyBvdXRwdXQgb2YgYnVpbGQgY29tbWFuZHMgaXMgY2FwdHVyZWQuIEltcG9ydGFudCBsaW5lcyBhbHNvIGdvIHRvIHRoZSB0ZXJtaW5hbC4KdGVsbCgpIHsKICBwcmludGYgJyVzXG4nICIkKiIKICB7IHByaW50ZiAnJXNcbicgIiQqIiA+IC9kZXYvdHR5OyB9IDI+L2Rldi9udWxsIHx8IHRydWUKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYnVpbGQKY21kX2J1aWxkKCkgewogIHRlbGwgIndoZXJkcjogaW5zdGFsbGluZyBpbiAkRElSIgogICMgRmlyc3QgaW5zdGFsbCAobm8gcGx1Z2luLmVudiB5ZXQpOiB0aGUgYnJvd3NlciBvcGVucyBvbiB0aGUgc2V0dXAgZ3VpZGUKICAjIG9uY2Ugd2hlcmRyIHJ1bnMuIFVwZGF0ZXMga2VlcCBwbHVnaW4uZW52IGFuZCBvcGVuIG5vdGhpbmcuCiAgRklSU1RfSU5TVEFMTD0wCiAgWyAtZiAiJENPTkYiIF0gfHwgRklSU1RfSU5TVEFMTD0xCiAgbWtkaXIgLXAgIiRESVIiCiAgcHJpbnRmICclc1xuJyAiJERJUiIgPiAiJFJPT1QvLndoZXJkci1kaXIiCgogIGlmIFsgLXogIiRNT0RFIiBdOyB0aGVuCiAgICBpZiBkb2NrZXJfdXNhYmxlOyB0aGVuIE1PREU9ZG9ja2VyOyBlbHNlIE1PREU9bmF0aXZlOyBmaQogIGZpCiAgY2FzZSAiJE1PREUiIGluCiAgICBkb2NrZXIpIGRvY2tlcl91c2FibGUgfHwgZGllICJXSEVSRFJfTU9ERT1kb2NrZXIsIGJ1dCBEb2NrZXIgQ29tcG9zZSB2MiBpcyBub3QgdXNhYmxlIGJ5ICQoaWQgLXVuKSBvbiB0aGlzIHN5c3RlbS4iIDs7CiAgICBuYXRpdmUpIDs7CiAgICAqKSBkaWUgIldIRVJEUl9NT0RFIG11c3QgYmUgZG9ja2VyIG9yIG5hdGl2ZSAoZ290OiAkTU9ERSkuIiA7OwogIGVzYWMKCiAgaWYgWyAiJE1PREUiID0gImRvY2tlciIgXTsgdGhlbiBidWlsZF9kb2NrZXI7IGVsc2UgYnVpbGRfbmF0aXZlOyBmaQogICMgV3JpdHRlbiBsYXN0OiBhIGZhaWxlZCBidWlsZCBrZWVwcyBubyBoYWxmLW1hZGUgY2hvaWNlLiBSZXdyaXR0ZW4gb24gZWFjaAogICMgaW5zdGFsbCBmcm9tIHRoZSBtZXJnZWQgc2V0dGluZ3MgKGVudmlyb25tZW50IG92ZXIgdGhlIHByZXZpb3VzIGZpbGUpLgogIHdyaXRlX2NvbmYKICBvayAicGx1Z2luLmVudiB3cml0dGVuIChtb2RlOiAkTU9ERSkiCiAgKCBjbWRfc2tpbGwgaW5zdGFsbCApIHx8IHdhcm4gIndoZXJkciBza2lsbCBub3QgbGlua2VkIChvcHRpb25hbCk6IHJ1biAkMCBza2lsbCBpbnN0YWxsIgogICggY21kX2tleSBpbnN0YWxsICkgfHwgd2FybiAibm8gSGVyZHIga2V5IGZvciB0aGUgcGFuZWwgKG9wdGlvbmFsKTogcnVuICQwIGtleSBpbnN0YWxsIgogIGJ1aWxkX3N0YXJ0Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNraWxsCiMgVGhlICJ3aGVyZHIiIGFnZW50IHNraWxsIChza2lsbHMvd2hlcmRyL1NLSUxMLm1kKTogdGhlIGNvbnZlbnRpb25zIG9mIHRoZQojIFByb2plY3QgcGFuZWwgZm9yIGhlcmRyLXByb2plY3RzIGNvb3JkaW5hdG9ycy4gQ29waWVkIHRvICRESVIvc2tpbGxzL3doZXJkcgojICh0aGUgY2hlY2tvdXQgaXMgYnVpbHQgaW4gYSB0ZW1wb3JhcnkgZm9sZGVyLCB0aGVuIG1vdmVkKSwgdGhlbiBsaW5rZWQgaW50bwojIHRoZSB1c2VyIHNraWxsIGZvbGRlcnM6IENsYXVkZSBDb2RlJ3MgJHtDTEFVREVfQ09ORklHX0RJUjotfi8uY2xhdWRlfS9za2lsbHMsCiMgYW5kIH4vLmFnZW50cy9za2lsbHMsIHJlYWQgYnkgQ29kZXggYW5kIG9tcC4gT25seSBsaW5rcyB0byB0aGF0IGNvcHkgYXJlCiMgZXZlciBjcmVhdGVkIG9yIHJlbW92ZWQ6IGEgIndoZXJkciIgc2tpbGwgb2Ygc29tZW9uZSBlbHNlIGlzIGxlZnQgYWxvbmUuClNLSUxMX0NPUFk9IiRESVIvc2tpbGxzL3doZXJkciIKCnNraWxsX2RpcnMoKSB7CiAgY2xhdWRlPSIke0NMQVVERV9DT05GSUdfRElSOi0kSE9NRS8uY2xhdWRlfSIKICBbIC1kICIkY2xhdWRlIiBdICYmIGVjaG8gIiRjbGF1ZGUvc2tpbGxzIgogIGlmIFsgLWQgIiRIT01FLy5hZ2VudHMiIF0gfHwgWyAtZCAiJEhPTUUvLmNvZGV4IiBdIHx8IFsgLWQgIiRIT01FLy5vbXAiIF07IHRoZW4gZWNobyAiJEhPTUUvLmFnZW50cy9za2lsbHMiOyBmaQogIHJldHVybiAwCn0KCmNtZF9za2lsbCgpIHsKICBjYXNlICIkezE6LX0iIGluCiAgICBpbnN0YWxsKQogICAgICBta2RpciAtcCAiJFNLSUxMX0NPUFkiCiAgICAgIGNwICIkUk9PVC9za2lsbHMvd2hlcmRyL1NLSUxMLm1kIiAiJFNLSUxMX0NPUFkvU0tJTEwubWQiCiAgICAgIHNraWxsX2RpcnMgfCB3aGlsZSBJRlM9IHJlYWQgLXIgZDsgZG8KICAgICAgICBsaW5rPSIkZC93aGVyZHIiCiAgICAgICAgaWYgWyAtTCAiJGxpbmsiIF0gJiYgWyAiJChyZWFkbGluayAiJGxpbmsiKSIgPSAiJFNLSUxMX0NPUFkiIF07IHRoZW4gb2sgInNraWxsIGFscmVhZHkgbGlua2VkOiAkbGluayIKICAgICAgICBlbGlmIFsgLWUgIiRsaW5rIiBdIHx8IFsgLUwgIiRsaW5rIiBdOyB0aGVuIHdhcm4gInNraWxsIG5vdCBsaW5rZWQ6ICRsaW5rIGFscmVhZHkgZXhpc3RzIChsZWZ0IGFsb25lKSIKICAgICAgICBlbHNlIG1rZGlyIC1wICIkZCIgJiYgbG4gLXMgIiRTS0lMTF9DT1BZIiAiJGxpbmsiICYmIG9rICJza2lsbCBsaW5rZWQ6ICRsaW5rIgogICAgICAgIGZpCiAgICAgIGRvbmUKICAgICAgOzsKICAgIHVuaW5zdGFsbCkKICAgICAgc2tpbGxfZGlycyB8IHdoaWxlIElGUz0gcmVhZCAtciBkOyBkbwogICAgICAgIGxpbms9IiRkL3doZXJkciIKICAgICAgICBpZiBbIC1MICIkbGluayIgXSAmJiBbICIkKHJlYWRsaW5rICIkbGluayIpIiA9ICIkU0tJTExfQ09QWSIgXTsgdGhlbiBybSAiJGxpbmsiICYmIG9rICJza2lsbCB1bmxpbmtlZDogJGxpbmsiOyBmaQogICAgICBkb25lCiAgICAgIHJtIC1yZiAiJFNLSUxMX0NPUFkiCiAgICAgIHJtZGlyICIkRElSL3NraWxscyIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICA7OwogICAgKikgZGllICJ1c2FnZTogJDAgc2tpbGwgaW5zdGFsbHx1bmluc3RhbGwiIDs7CiAgZXNhYwp9CgojIExhc3Qgc3RlcCBvZiB0aGUgaW5zdGFsbDogc3RhcnQgd2hlcmRyIChvciByZXN0YXJ0IHRoZSBvbmUgdGhpcyBwbHVnaW4KIyBydW5zLCBvbiBhbiB1cGRhdGUpLiBOZXZlciBmYWlscyB0aGUgaW5zdGFsbDogYSB3aGVyZHIgdGhhdCBjYW5ub3Qgc3RhcnQgaXMKIyByZXBvcnRlZCB3aXRoIHdoYXQgdG8gZG8sIHRoZSBwbHVnaW4gc3RheXMgaW5zdGFsbGVkLgpidWlsZF9zdGFydCgpIHsKICBzZXQgK2UKICBvdXQ9IiQoIChjbWRfc3RhcnQpIDI+JjEgKSIKICBjb2RlPSQ/CiAgc2V0IC1lCiAgcHJpbnRmICclc1xuJyAiJG91dCIKICBpZiBbICIkY29kZSIgLWVxIDAgXSAmJiBhbnN3ZXJzOyB0aGVuCiAgICB0ZWxsICIiCiAgICB0ZWxsICLinJMgd2hlcmRyIGlzIHJ1bm5pbmcg4oaSICRVUkwiCiAgICBpZiBbICIke0ZJUlNUX0lOU1RBTEw6LTB9IiA9IDEgXTsgdGhlbgogICAgICBpZiBvcGVuX2Jyb3dzZXIgIiRVUkwvIy9zZXR1cCI7IHRoZW4gdGVsbCAiICBTZXR1cCBndWlkZSBvcGVuZWQgaW4geW91ciBicm93c2VyIgogICAgICBlbHNlIHRlbGwgIiAgU2V0dXAgZ3VpZGU6IG9wZW4gJFVSTC8jL3NldHVwIGluIGEgYnJvd3NlciBvbiB0aGlzIGNvbXB1dGVyIgogICAgICBmaQogICAgZmkKICAgIHRlbGwgIiAgUGhvbmU6IG9wZW4gdGhlIHdoZXJkciBwYW5lbCBpbiBIZXJkciAoa2V5IGFib3ZlLCBvciBoZXJkciBwbHVnaW4gYWN0aW9uIGludm9rZSBwYW5lbCAtLXBsdWdpbiAkUExVR0lOX0lEKSIKICBlbHNlCiAgICB0ZWxsICIiCiAgICB0ZWxsICIhIHdoZXJkciBpcyBpbnN0YWxsZWQgYnV0IGRpZCBub3Qgc3RhcnQ6IgogICAgcHJpbnRmICclc1xuJyAiJG91dCIgfCB0YWlsIC1uIDggfCB3aGlsZSBJRlM9IHJlYWQgLXIgbDsgZG8gdGVsbCAiICAgICRsIjsgZG9uZQogICAgdGVsbCAiICBPcGVuIHRoZSB3aGVyZHIgcGFuZWwgaW4gSGVyZHIsIHRoZW4gcHJlc3MgUyB0byBzdGFydCBpdCBvciBMIGZvciBpdHMgbG9nLiIKICBmaQp9Cgp3cml0ZV9jb25mKCkgewogIHsKICAgIGVjaG8gIiMgd2hlcmRyIEhlcmRyIHBsdWdpbiBzZXR0aW5ncyAoaGVyZHItcGx1Z2luLnNoKS4iCiAgICBlY2hvICIjIFRvIHN3aXRjaCBtb2RlLCBzZXQgV0hFUkRSX01PREUgYW5kIHJ1bjogaGVyZHIgcGx1Z2luIGluc3RhbGwgJFNPVVJDRSIKICAgIGVjaG8gIldIRVJEUl9NT0RFPSRNT0RFIgogICAgZWNobyAiV0hFUkRSX1BPUlQ9JFBPUlQiCiAgICBlY2hvICIjIE5hdGl2ZSBtb2RlOiBwcml2YXRlIEhUVFBTIGFkZHJlc3MgKHRhaWxzY2FsZSBzZXJ2ZSksIGZvciBwdXNoIG5vdGlmaWNhdGlvbnMuIgogICAgZWNobyAiQVBQX1VSTD0ke0FQUF9VUkw6LX0iCiAgICBpZiBbICIkTU9ERSIgPSAibmF0aXZlIiBdOyB0aGVuCiAgICAgIGVjaG8gIiMgTmF0aXZlIG1vZGU6IGFic29sdXRlIHBhdGggb2YgdGhlIG5vZGUgKDIyKykgb3IgYnVuIHRoYXQgcnVucyB3aGVyZHIuIgogICAgICBlY2hvICJXSEVSRFJfUlVOVElNRT0kUlVOVElNRSIKICAgIGZpCiAgfSA+ICIkQ09ORiIKfQoKIyBUaGUgcHVibGlzaGVkIG5wbSBwYWNrYWdlIG9mIHRoaXMgZXhhY3QgdmVyc2lvbiBob2xkcyB0aGUgYnVpbHQgc2VydmVyOgojIGRvd25sb2FkIGl0IGluc3RlYWQgb2YgYnVpbGRpbmcgKG5vIG5wbSBjaSkuIEZhaWxzIHdoZW4gaXQgaXMgbm90IHB1Ymxpc2hlZC4KZmV0Y2hfcHJlYnVpbHQoKSB7CiAgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMSAmJiBjb21tYW5kIC12IHRhciA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDEKICB2ZXJzaW9uPSIkKHNlZCAtbiAncy9edmVyc2lvbiA9ICJcKC4qXCkiJC9cMS9wJyAiJFJPT1QvaGVyZHItcGx1Z2luLnRvbWwiIHwgaGVhZCAtbiAxKSIKICB0bXA9IiQobWt0ZW1wIC1kKSIKICBpZiBjdXJsIC1mc1NMIC0tbWF4LXRpbWUgMTIwICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aGVyZHIvLS93aGVyZHItJHZlcnNpb24udGd6IiAtbyAiJHRtcC93aGVyZHIudGd6IiAyPi9kZXYvbnVsbCBcCiAgICAmJiB0YXIgLXh6ZiAiJHRtcC93aGVyZHIudGd6IiAtQyAiJHRtcCIgXAogICAgJiYgWyAtZiAiJHRtcC9wYWNrYWdlLy5vdXRwdXQvc2VydmVyL2luZGV4Lm1qcyIgXTsgdGhlbgogICAgcm0gLXJmICIkUk9PVC8ub3V0cHV0IgogICAgbXYgIiR0bXAvcGFja2FnZS8ub3V0cHV0IiAiJFJPT1QvLm91dHB1dCIKICAgIHJtIC1yZiAiJHRtcCIKICAgIG9rICJ3aGVyZHIgJHZlcnNpb24gZG93bmxvYWRlZCAocHJlYnVpbHQgbnBtIHBhY2thZ2UpIgogICAgcmV0dXJuIDAKICBmaQogIHJtIC1yZiAiJHRtcCIKICByZXR1cm4gMQp9CgojIHFyY29kZS10ZXJtaW5hbCAodGhlIHBhbmVsJ3MgUVIgY29kZSksIHRoZSBvbmx5IHBhY2thZ2UgdGhlIGNvbW1hbmRzIG5lZWQKIyBhdCBydW50aW1lLCB3aGVuIHRoZSBmb2xkZXIgZG9lcyBub3QgaGF2ZSBpdCB5ZXQgKG5vIG5wbSBjaSB3YXMgcnVuKS4KZmV0Y2hfcXIoKSB7CiAgWyAtZiAiJDEvbm9kZV9tb2R1bGVzL3FyY29kZS10ZXJtaW5hbC9wYWNrYWdlLmpzb24iIF0gJiYgcmV0dXJuIDAKICBjb21tYW5kIC12IGN1cmwgPi9kZXYvbnVsbCAyPiYxICYmIGNvbW1hbmQgLXYgdGFyID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAogIHRtcD0iJChta3RlbXAgLWQpIgogIGlmIGN1cmwgLWZzU0wgLS1tYXgtdGltZSA2MCBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9xcmNvZGUtdGVybWluYWwvLS9xcmNvZGUtdGVybWluYWwtMC4xMi4wLnRneiAtbyAiJHRtcC9xci50Z3oiIDI+L2Rldi9udWxsIFwKICAgICYmIHRhciAteHpmICIkdG1wL3FyLnRneiIgLUMgIiR0bXAiOyB0aGVuCiAgICBta2RpciAtcCAiJDEvbm9kZV9tb2R1bGVzIgogICAgcm0gLXJmICIkMS9ub2RlX21vZHVsZXMvcXJjb2RlLXRlcm1pbmFsIgogICAgbXYgIiR0bXAvcGFja2FnZSIgIiQxL25vZGVfbW9kdWxlcy9xcmNvZGUtdGVybWluYWwiCiAgZWxzZQogICAgd2FybiAiTm8gUVIgY29kZSBpbiB0aGUgcGFuZWwgKHFyY29kZS10ZXJtaW5hbCBjb3VsZCBub3QgYmUgZG93bmxvYWRlZCkuIgogIGZpCiAgcm0gLXJmICIkdG1wIgp9CgpidWlsZF9uYXRpdmUoKSB7CiAgUlVOVElNRT0iJChmaW5kX3J1bnRpbWUpIiB8fCBkaWUgIiRSVU5USU1FX0hFTFAiCiAgb2sgIlJ1bnRpbWU6ICRSVU5USU1FICgkKCIkUlVOVElNRSIgLS12ZXJzaW9uIDI+L2Rldi9udWxsKSkiCiAgaWYgZmV0Y2hfcHJlYnVpbHQ7IHRoZW4KICAgIGluc3RhbGxfYXBwCiAgICByZXR1cm4gMAogIGZpCiAgY2FzZSAiJChiYXNlbmFtZSAiJFJVTlRJTUUiKSIgaW4KICAgIGJ1bikgZGllICJUaGUgcHJlYnVpbHQgd2hlcmRyIHBhY2thZ2UgY291bGQgbm90IGJlIGRvd25sb2FkZWQsIGFuZCBidWlsZGluZyBpdCBuZWVkcyBOb2RlLmpzIDIyIHdpdGggbnBtLgogICAgIENoZWNrIHRoZSBuZXR3b3JrLCBvciBpbnN0YWxsIE5vZGUuanMgMjIsIHRoZW4gaW5zdGFsbCB0aGUgcGx1Z2luIGFnYWluLiIgOzsKICBlc2FjCiAgYmluZGlyPSIkKGRpcm5hbWUgIiRSVU5USU1FIikiCiAgWyAteCAiJGJpbmRpci9ucG0iIF0gfHwgY29tbWFuZCAtdiBucG0gPi9kZXYvbnVsbCAyPiYxIHx8IGRpZSAibnBtIGlzIG1pc3NpbmcgKGl0IGNvbWVzIHdpdGggTm9kZS5qcykuIgogIHRlbGwgIndoZXJkcjogYnVpbGRpbmcgKGEgZmV3IG1pbnV0ZXMgdGhlIGZpcnN0IHRpbWUp4oCmIgogICgKICAgIGNkICIkUk9PVCIKICAgIFBBVEg9IiRiaW5kaXI6JFBBVEgiIG5wbSBjaSAtLW5vLWF1ZGl0IC0tbm8tZnVuZAogICAgUEFUSD0iJGJpbmRpcjokUEFUSCIgbnBtIHJ1biBidWlsZAogICkKICBvayAid2hlcmRyIGJ1aWx0IGluIHRoZSBwbHVnaW4gZm9sZGVyIgogIGluc3RhbGxfYXBwCn0KCiMgQ29waWVzIHRoZSBjb21tYW5kcyBhbmQgdGhlIGJ1aWx0IHNlcnZlciB0byAkQVBQLCB3aGljaCBvdXRsaXZlcyB0aGlzCiMgY2hlY2tvdXQuIEEgd2hlcmRyIHRoaXMgcGx1Z2luIHJ1bnMgZnJvbSB0aGUgcHJldmlvdXMgY29weSBpcyBzdG9wcGVkIGZvcgojIHRoZSBzd2FwOyBidWlsZF9zdGFydCBzdGFydHMgdGhlIG5ldyBvbmUuCmluc3RhbGxfYXBwKCkgewogICMgTml0cm8gbGlua3Mgc29tZSBwYWNrYWdlcyAodHNsaWIpIHRvIGl0cyBvd24gZm9sZGVyOiBjb3BpZXMsIG5vdCBsaW5rcy4KICBpZiBbIC1kICIkUk9PVC8ub3V0cHV0L3NlcnZlci9ub2RlX21vZHVsZXMiIF07IHRoZW4gIiRSVU5USU1FIiAiJFJPT1Qvc2NyaXB0cy9wYWNrLW91dHB1dC5tanMiID4vZGV2L251bGw7IGZpCiAgbmV3PSIkQVBQLm5ldyIKICBybSAtcmYgIiRuZXciCiAgbWtkaXIgLXAgIiRuZXciCiAgY3AgLVIgIiRST09UL2JpbiIgIiRST09ULy5vdXRwdXQiICIkUk9PVC9wYWNrYWdlLmpzb24iICIkbmV3LyIKICBpZiBbIC1kICIkUk9PVC9ub2RlX21vZHVsZXMvcXJjb2RlLXRlcm1pbmFsIiBdOyB0aGVuCiAgICBta2RpciAtcCAiJG5ldy9ub2RlX21vZHVsZXMiCiAgICBjcCAtUiAiJFJPT1Qvbm9kZV9tb2R1bGVzL3FyY29kZS10ZXJtaW5hbCIgIiRuZXcvbm9kZV9tb2R1bGVzLyIKICBmaQogIGZldGNoX3FyICIkbmV3IgogICMgVGhlIHdoZXJkciB0aGlzIHBsdWdpbiBydW5zIChmcm9tIHRoZSBwcmV2aW91cyBjb3B5LCBvciBmcm9tIGFuIG9sZGVyCiAgIyBwbHVnaW4gY2hlY2tvdXQpOiBzdG9wcGVkIGZvciB0aGUgc3dhcCwgc3RhcnRlZCBhZ2FpbiBieSBidWlsZF9zdGFydC4KICBpZiBbIC1mICIkRElSL3doZXJkci5waWQiIF0gfHwgWyAtZiAiJEFQUC9iaW4vd2hlcmRyLm1qcyIgXTsgdGhlbiBjbGkgc3RvcCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZTsgZmkKICBybSAtcmYgIiRBUFAub2xkIgogIGlmIFsgLWQgIiRBUFAiIF07IHRoZW4gbXYgIiRBUFAiICIkQVBQLm9sZCI7IGZpCiAgbXYgIiRuZXciICIkQVBQIgogIHJtIC1yZiAiJEFQUC5vbGQiCiAgb2sgIndoZXJkciAkKHNlZCAtbiAncy9eICoidmVyc2lvbiI6ICoiXCguKlwpIiwkL1wxL3AnICIkQVBQL3BhY2thZ2UuanNvbiIgfCBoZWFkIC1uIDEpIGluc3RhbGxlZCBpbiAkQVBQIgp9CgpidWlsZF9kb2NrZXIoKSB7CiAgb2sgIkRvY2tlciAkKGRvY2tlciB2ZXJzaW9uIC0tZm9ybWF0ICd7ey5TZXJ2ZXIuVmVyc2lvbn19JyAyPi9kZXYvbnVsbCB8fCBlY2hvICc/JykiCiAgc3RhbXA9IiRESVIvLmNvbXBvc2UtZnJvbS1wbHVnaW4iCiAgaWYgWyAhIC1mICIkRElSL2RvY2tlci1jb21wb3NlLnltbCIgXTsgdGhlbgogICAgY3AgIiRST09UL2RvY2tlci1jb21wb3NlLnltbCIgIiRESVIvZG9ja2VyLWNvbXBvc2UueW1sIgogICAgY2tzdW0gPCAiJERJUi9kb2NrZXItY29tcG9zZS55bWwiID4gIiRzdGFtcCIKICAgIG9rICJkb2NrZXItY29tcG9zZS55bWwgY29waWVkIgogIGVsaWYgY21wIC1zICIkUk9PVC9kb2NrZXItY29tcG9zZS55bWwiICIkRElSL2RvY2tlci1jb21wb3NlLnltbCI7IHRoZW4KICAgIG9rICJkb2NrZXItY29tcG9zZS55bWwgaXMgdXAgdG8gZGF0ZSIKICBlbGlmIFsgLWYgIiRzdGFtcCIgXSAmJiBbICIkKGNrc3VtIDwgIiRESVIvZG9ja2VyLWNvbXBvc2UueW1sIikiID0gIiQoY2F0ICIkc3RhbXAiKSIgXTsgdGhlbgogICAgIyBVbmNoYW5nZWQgc2luY2UgdGhlIHBsdWdpbiB3cm90ZSBpdDogc2FmZSB0byByZWZyZXNoLgogICAgY3AgIiRST09UL2RvY2tlci1jb21wb3NlLnltbCIgIiRESVIvZG9ja2VyLWNvbXBvc2UueW1sIgogICAgY2tzdW0gPCAiJERJUi9kb2NrZXItY29tcG9zZS55bWwiID4gIiRzdGFtcCIKICAgIG9rICJkb2NrZXItY29tcG9zZS55bWwgdXBkYXRlZCIKICBlbHNlCiAgICB3YXJuICJLZWVwaW5nIHlvdXIgZWRpdGVkIGRvY2tlci1jb21wb3NlLnltbCAodGhlIG5ldyBvbmUgaXMgJFJPT1QvZG9ja2VyLWNvbXBvc2UueW1sKS4iCiAgZmkKICBpZiBbICEgLWYgIiRESVIvLmVudiIgXTsgdGhlbgogICAgaGVyZHI9IiQoaGVyZHJfYmluKSIKICAgIHsKICAgICAgZWNobyAiIyB3aGVyZHIgc2V0dGluZ3MsIHJlYWQgYnkgZG9ja2VyIGNvbXBvc2UgKHNlZSAuZW52LmV4YW1wbGUgaW4gdGhlIHJlcG9zaXRvcnkpLiIKICAgICAgZWNobyAiSE9TVF9IT01FPSRIT01FIgogICAgICBlY2hvICJQVUlEPSQoaWQgLXUpIgogICAgICBlY2hvICJQR0lEPSQoaWQgLWcpIgogICAgICBlY2hvICJQT1JUPSRQT1JUIgogICAgICBlY2hvICIjIFByaXZhdGUgSFRUUFMgYWRkcmVzcyAodGFpbHNjYWxlIHNlcnZlKSwgbmVlZGVkIGZvciBwdXNoIG5vdGlmaWNhdGlvbnMuIgogICAgICBlY2hvICJBUFBfVVJMPSR7QVBQX1VSTDotaHR0cDovL2xvY2FsaG9zdDokUE9SVC99IgogICAgICBlY2hvICJUWj0ke1RaOi1VVEN9IgogICAgICBpZiBbICIkaGVyZHIiICE9ICIkSE9NRS8ubG9jYWwvYmluL2hlcmRyIiBdOyB0aGVuIGVjaG8gIkhFUkRSX0JJTj0kaGVyZHIiOyBmaQogICAgfSA+ICIkRElSLy5lbnYiCiAgICBvayAiLmVudiBjcmVhdGVkIgogIGVsc2UKICAgIG9rICIuZW52IGtlcHQiCiAgZmkKICBjb21wb3NlIHB1bGwgLS1xdWlldCB8fCBkaWUgIkNvdWxkIG5vdCBwdWxsIHRoZSB3aGVyZHIgaW1hZ2UuIENoZWNrIHRoZSBuZXR3b3JrLCB0aGVuIGluc3RhbGwgdGhlIHBsdWdpbiBhZ2Fpbi4iCiAgb2sgIkltYWdlIHB1bGxlZCIKICAjIFRoZSBwYW5lbCBydW5zIGZyb20gdGhlIGNoZWNrb3V0IHdpdGggbm9kZSB3aGVuIHRoZXJlIGlzIG9uZS4KICBmZXRjaF9xciAiJFJPT1QiCn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0YXJ0CmNtZF9zdGFydCgpIHsKICBpZiBhbnN3ZXJzOyB0aGVuCiAgICBzYXkgIndoZXJkcjogc29tZXRoaW5nIGFscmVhZHkgYW5zd2VycyBvbiBwb3J0ICRQT1JULCBub3RoaW5nIHRvIHN0YXJ0ICgkVVJMKS4iCiAgICByZXR1cm4gMAogIGZpCiAgY2FzZSAiJE1PREUiIGluCiAgICBkb2NrZXIpIHN0YXJ0X2RvY2tlciA7OwogICAgbmF0aXZlKSBzdGFydF9uYXRpdmUgOzsKICAgICopIGRpZSAid2hlcmRyIHBsdWdpbiBpcyBub3Qgc2V0IHVwICgkQ09ORiBpcyBtaXNzaW5nKTogaW5zdGFsbCBpdCBhZ2FpbiB3aXRoIGhlcmRyIHBsdWdpbiBpbnN0YWxsICRTT1VSQ0UuIiA7OwogIGVzYWMKICBpZiBbICIkTU9ERSIgPSAibmF0aXZlIiBdOyB0aGVuIHJldHVybiAwOyBmaQogIGlmIHdhaXRfdXAgNDU7IHRoZW4KICAgIHNheSAid2hlcmRyIGlzIHJ1bm5pbmc6ICRVUkwiCiAgZWxzZQogICAgd2FybiAid2hlcmRyIGRvZXMgbm90IGFuc3dlciBvbiBwb3J0ICRQT1JUIHlldC4gTG9nOiAkKGxvZ19oaW50KSIKICAgIGV4aXQgMQogIGZpCn0KCiMgTmF0aXZlIG1vZGU6IHRoZSB3aGVyZHIgY29tbWFuZCAoYmluL3doZXJkci5tanMpIGRvZXMgdGhlIHdvcmssIHdpdGggdGhlCiMgcnVudGltZSBzYXZlZCBhdCBpbnN0YWxsOyBpdCBzYXlzICJzdGFydGVkIiBvbmx5IG9uY2UgdGhlIHBvcnQgYW5zd2Vycy4KZW5zdXJlX3J1bnRpbWUoKSB7CiAgaWYgISBydW50aW1lX29rICIkUlVOVElNRSI7IHRoZW4KICAgIHNhdmVkPSIkUlVOVElNRSIKICAgIFJVTlRJTUU9IiQoZmluZF9ydW50aW1lKSIgfHwgZGllICIke3NhdmVkOitUaGUgc2F2ZWQgcnVudGltZSAoJHNhdmVkKSBpcyBnb25lLiB9JFJVTlRJTUVfSEVMUCIKICAgIHdhcm4gIiR7c2F2ZWQ6KyRzYXZlZCBpcyBnb25lOiB9dXNpbmcgJFJVTlRJTUUgKHNhdmVkIGluICRDT05GKS4iCiAgICB3cml0ZV9jb25mCiAgZmkKfQoKY2xpKCkgewogIGVuc3VyZV9ydW50aW1lCiAgc29jaz0iJHtIRVJEUl9TT0NLRVRfUEFUSDotfSIKICAjIEEgcGx1Z2luIHN0YXJ0ZWQgZnJvbSBhIG5hbWVkIEhlcmRyIHNlc3Npb24gZHJpdmVzIHRoYXQgc2Vzc2lvbi4KICBzZXNzaW9uPSIiCiAgY2FzZSAiJHNvY2siIGluICovc2Vzc2lvbnMvKi9oZXJkci5zb2NrKSBzZXNzaW9uPSIkKGJhc2VuYW1lICIkKGRpcm5hbWUgIiRzb2NrIikiKSIgOzsgZXNhYwogICgKICAgIGNkICIkRElSIgogICAgSEVSRFJfQklOPSIkKGhlcmRyX2JpbikiCiAgICAjIFRoZSBydW50aW1lJ3MgZm9sZGVyIGZpcnN0OiB0b29scyBpdCBzdGFydHMgZmluZCB0aGUgc2FtZSBub2RlLgogICAgUEFUSD0iJChkaXJuYW1lICIkUlVOVElNRSIpOiRQQVRIIgogICAgZXhwb3J0IFBBVEggV0hFUkRSX0RJUj0iJERJUiIgV0hFUkRSX1JVTlRJTUU9IiRSVU5USU1FIiBIT1NUPTEyNy4wLjAuMSBQT1JUIEhFUkRSX0JJTgogICAgaWYgWyAtbiAiJHNlc3Npb24iIF07IHRoZW4gZXhwb3J0IEhFUkRSX1dFQl9TRVNTSU9OPSIkc2Vzc2lvbiI7IGZpCiAgICBpZiBbIC1uICIkc29jayIgXTsgdGhlbiBleHBvcnQgSEVSRFJfU09DSz0iJHNvY2siOyBmaQogICAgaWYgWyAtbiAiJHtBUFBfVVJMOi19IiBdOyB0aGVuIGV4cG9ydCBBUFBfVVJMOyBmaQogICAgZXhlYyAiJFJVTlRJTUUiICIkKGNsaV9yb290KS9iaW4vd2hlcmRyLm1qcyIgIiRAIgogICkKfQoKc3RhcnRfbmF0aXZlKCkgewogIFsgLWYgIiQoY2xpX3Jvb3QpLy5vdXRwdXQvc2VydmVyL2luZGV4Lm1qcyIgXSB8fCBkaWUgIndoZXJkciBpcyBub3QgYnVpbHQ6IGluc3RhbGwgdGhlIHBsdWdpbiBhZ2FpbiAoaGVyZHIgcGx1Z2luIGluc3RhbGwgJFNPVVJDRSAtLXllcykuIgogIG1rZGlyIC1wICIkRElSIgogIGNsaSBzdGFydAp9CgpzdGFydF9kb2NrZXIoKSB7CiAgWyAtZiAiJERJUi9kb2NrZXItY29tcG9zZS55bWwiIF0gfHwgZGllICIkRElSL2RvY2tlci1jb21wb3NlLnltbCBpcyBtaXNzaW5nOiBydW4gdGhlIFVwZGF0ZSBhY3Rpb24uIgogIGlmICEgY29udGFpbmVyX291cnM7IHRoZW4KICAgIHNheSAid2hlcmRyOiB0aGUgXCIkQ09OVEFJTkVSXCIgY29udGFpbmVyIGJlbG9uZ3MgdG8gJChjb250YWluZXJfZGlyKTsgc3RhcnQgaXQgZnJvbSB0aGVyZS4gTm90aGluZyBkb25lLiIKICAgIGV4aXQgMAogIGZpCiAgIyBDcmVhdGVkIGFzIHRoaXMgdXNlciBmaXJzdDogRG9ja2VyIHdvdWxkIGNyZWF0ZSBtaXNzaW5nIGJpbmQgbW91bnRzIGFzIHJvb3QuCiAgbWtkaXIgLXAgIiRESVIvZGF0YSIgIiRIT01FLy5jb25maWcvaGVyZHIiICIkSE9NRS8ubG9jYWwvc3RhdGUvaGVyZHIvY2xpZW50IiBcCiAgICAiJEhPTUUvLmNhY2hlL2hlcmRyLXdlYiIgIiRIT01FLy5oZXJkci1wcm9qZWN0cyIKICBjb21wb3NlIHVwIC1kIC0tcmVtb3ZlLW9ycGhhbnMKICBvayAiY29udGFpbmVyIHN0YXJ0ZWQiCn0KCmxvZ19oaW50KCkgeyBlY2hvICJjZCAkRElSICYmIGRvY2tlciBjb21wb3NlIGxvZ3MiOyB9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RvcApjbWRfc3RvcCgpIHsKICBjYXNlICIkTU9ERSIgaW4KICAgIG5hdGl2ZSkgY2xpIHN0b3A7IHJldHVybiAwIDs7CiAgICBkb2NrZXIpCiAgICAgIGlmIFsgLW4gIiQoY29udGFpbmVyX2RpcikiIF0gJiYgY29udGFpbmVyX291cnM7IHRoZW4KICAgICAgICBjb21wb3NlIHN0b3AKICAgICAgICBzYXkgIndoZXJkciBzdG9wcGVkIChjb250YWluZXIgJENPTlRBSU5FUikuIgogICAgICAgIHJldHVybiAwCiAgICAgIGZpCiAgICAgIDs7CiAgZXNhYwogIGlmIGFuc3dlcnM7IHRoZW4KICAgIHNheSAid2hlcmRyIG9uIHBvcnQgJFBPUlQgd2FzIG5vdCBzdGFydGVkIGJ5IHRoaXMgcGx1Z2luOiBsZWZ0IHJ1bm5pbmcuIgogIGVsc2UKICAgIHNheSAid2hlcmRyIGlzIG5vdCBydW5uaW5nLiIKICBmaQp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0YXR1cwpjbWRfc3RhdHVzKCkgewogIGlmIFsgIiRNT0RFIiA9ICJuYXRpdmUiIF07IHRoZW4KICAgIGNsaSBzdGF0dXMKICAgIHNheSAiICBQbHVnaW4gICBuYXRpdmUgbW9kZSwgc2V0dGluZ3MgaW4gJENPTkYiCiAgICByZXR1cm4gMAogIGZpCiAgc2F5ICJNb2RlOiAgICAke01PREU6LW5vdCBzZXQgdXB9IgogIHNheSAiRm9sZGVyOiAgJERJUiIKICBpZiBhbnN3ZXJzOyB0aGVuIHNheSAiUG9ydDogICAgJFBPUlQgYW5zd2VycyAoJFVSTCkiOyBlbHNlIHNheSAiUG9ydDogICAgJFBPUlQgZnJlZSI7IGZpCiAgaWYgWyAiJE1PREUiID0gImRvY2tlciIgXTsgdGhlbgogICAgb3duZXI9IiQoY29udGFpbmVyX2RpcikiCiAgICBpZiBbIC16ICIkb3duZXIiIF07IHRoZW4gc2F5ICJDb250YWluZXI6IG5vbmUiCiAgICBlbGlmIGNvbnRhaW5lcl9vdXJzOyB0aGVuIHNheSAiQ29udGFpbmVyOiAkQ09OVEFJTkVSICgkKGRvY2tlciBpbnNwZWN0ICIkQ09OVEFJTkVSIiAtLWZvcm1hdCAne3suU3RhdGUuU3RhdHVzfX0nIDI+L2Rldi9udWxsKSksIG1hbmFnZWQgYnkgdGhlIHBsdWdpbiIKICAgIGVsc2Ugc2F5ICJDb250YWluZXI6ICRDT05UQUlORVIsIG1hbmFnZWQgZnJvbSAkb3duZXIgKGxlZnQgYWxvbmUpIgogICAgZmkKICBmaQp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbG9ncywgZG9jdG9yCmNtZF9sb2dzKCkgewogIGNhc2UgIiRNT0RFIiBpbgogICAgbmF0aXZlKSBjbGkgbG9ncyAtLWZvbGxvdyA7OwogICAgZG9ja2VyKSBjb21wb3NlIGxvZ3MgLS1mb2xsb3cgLS10YWlsIDEwMCA7OwogICAgKikgZGllICJ3aGVyZHIgcGx1Z2luIGlzIG5vdCBzZXQgdXA6IGluc3RhbGwgaXQgYWdhaW4gd2l0aCBoZXJkciBwbHVnaW4gaW5zdGFsbCAkU09VUkNFLiIgOzsKICBlc2FjCn0KCmNtZF9kb2N0b3IoKSB7CiAgaWYgWyAiJE1PREUiID0gIm5hdGl2ZSIgXTsgdGhlbiBjbGkgZG9jdG9yOyBlbHNlIGNtZF9zdGF0dXM7IGZpCn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBvcGVuCiMgVGhlIGRlZmF1bHQgYnJvd3Nlciwgb24gYSBjb21wdXRlciB3aXRoIGEgc2NyZWVuIG9ubHk6IGBvcGVuYCBvbiBtYWNPUywKIyBgeGRnLW9wZW5gIG9uIExpbnV4IHdpdGggYSBkaXNwbGF5LiBGYWlscyAob3BlbnMgbm90aGluZykgb24gYSBoZWFkbGVzcyBzZXJ2ZXIuCm9wZW5fYnJvd3NlcigpIHsKICBpZiBbICIkKHVuYW1lIC1zKSIgPSAiRGFyd2luIiBdICYmIGNvbW1hbmQgLXYgb3BlbiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gb3BlbiAiJDEiCiAgZWxpZiBbIC1uICIke0RJU1BMQVk6LX0ke1dBWUxBTkRfRElTUExBWTotfSIgXSAmJiBjb21tYW5kIC12IHhkZy1vcGVuID4vZGV2L251bGwgMj4mMTsgdGhlbiB4ZGctb3BlbiAiJDEiID4vZGV2L251bGwgMj4mMSAmCiAgZWxzZSByZXR1cm4gMQogIGZpCn0KCmNtZF9vcGVuKCkgewogIG9wZW5fYnJvd3NlciAiJFVSTCIgfHwgdHJ1ZQogIHNheSAiJFVSTCIKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB1cGRhdGUKY21kX3VwZGF0ZSgpIHsKICBjYXNlICIkTU9ERSIgaW4KICAgIGRvY2tlcikKICAgICAgY29udGFpbmVyX291cnMgfHwgZGllICJUaGUgXCIkQ09OVEFJTkVSXCIgY29udGFpbmVyIGJlbG9uZ3MgdG8gJChjb250YWluZXJfZGlyKTogdXBkYXRlIGl0IGZyb20gdGhlcmUuIgogICAgICBjb21wb3NlIHB1bGwgLS1xdWlldAogICAgICBpZiBbICIkKGRvY2tlciBpbnNwZWN0ICIkQ09OVEFJTkVSIiAtLWZvcm1hdCAne3suU3RhdGUuUnVubmluZ319JyAyPi9kZXYvbnVsbCkiID0gInRydWUiIF07IHRoZW4KICAgICAgICBjb21wb3NlIHVwIC1kIC0tcmVtb3ZlLW9ycGhhbnMKICAgICAgICBzYXkgIndoZXJkciB1cGRhdGVkIGFuZCByZXN0YXJ0ZWQuIgogICAgICBlbHNlCiAgICAgICAgc2F5ICJ3aGVyZHIgaW1hZ2UgdXBkYXRlZDsgaXQgcnVucyB0aGUgbmV3IHZlcnNpb24gYXQgdGhlIG5leHQgc3RhcnQuIgogICAgICBmaQogICAgICA7OwogICAgbmF0aXZlKQogICAgICAjIEEgbmV3IGNoZWNrb3V0LCBhIG5ldyBjb3B5IGluICRBUFAsIGFuZCB3aGVyZHIgcmVzdGFydGVkIChidWlsZF9zdGFydCkuCiAgICAgIHNheSAiVXBkYXRpbmcgdGhlIHdoZXJkciBwbHVnaW4gZnJvbSAkU09VUkNF4oCmIgogICAgICAiJChoZXJkcl9iaW4pIiBwbHVnaW4gaW5zdGFsbCAiJFNPVVJDRSIgLS15ZXMKICAgICAgOzsKICAgICopIGRpZSAid2hlcmRyIHBsdWdpbiBpcyBub3Qgc2V0IHVwOiBpbnN0YWxsIGl0IGFnYWluIHdpdGggaGVyZHIgcGx1Z2luIGluc3RhbGwgJFNPVVJDRS4iIDs7CiAgZXNhYwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaG9uZQp0YWlsbmV0X25hbWUoKSB7CiAgY29tbWFuZCAtdiB0YWlsc2NhbGUgPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAxCiAgIyBTZWxmIGNvbWVzIGJlZm9yZSBQZWVyIGluIGB0YWlsc2NhbGUgc3RhdHVzIC0tanNvbmA6IHRoZSBmaXJzdCBETlNOYW1lIGlzIHRoaXMgbWFjaGluZS4KICB0YWlsc2NhbGUgc3RhdHVzIC0tanNvbiAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy8uKiJETlNOYW1lIjogKiJcKFteIl0qXClcLiIuKi9cMS9wJyB8IGhlYWQgLW4gMQp9CgojIFRoZSBwaG9uZSBzZXR1cCBpcyBhIHBhZ2Ugb2YgdGhlIGFwcCAoU2V0dGluZ3Mg4oC6IFBob25lKTsgYHdoZXJkciBwaG9uZWAKIyBwcmludHMgdGhlIHN0YXRlIGFuZCBpdHMgbGluay4gRG9ja2VyIHdpdGhvdXQgTm9kZS5qczogdGhlIHN0ZXBzIGJ5IGhhbmQuCmNtZF9waG9uZSgpIHsKICBpZiBbICIkTU9ERSIgPSAibmF0aXZlIiBdOyB0aGVuIGNsaSBwaG9uZTsgcmV0dXJuIDA7IGZpCiAgc2F5ICIiCiAgc2F5ICIgIFdIRVJEUiDCtyBQSE9ORSBTRVRVUCIKICBzYXkgIiIKICBpZiBhbnN3ZXJzOyB0aGVuIHNheSAiICDinJMgd2hlcmRyIGFuc3dlcnMgb24gJFVSTCI7IGVsc2Ugc2F5ICIgICEgd2hlcmRyIGlzIG5vdCBydW5uaW5nOiBwcmVzcyBTIGluIHRoZSB3aGVyZHIgcGFuZWwgZmlyc3QuIjsgZmkKICBuYW1lPSIkKHRhaWxuZXRfbmFtZSB8fCB0cnVlKSIKICBzYXkgIiIKICBzYXkgIiAgWW91ciBwaG9uZSBuZWVkcyBhIHByaXZhdGUgSFRUUFMgYWRkcmVzcyAobmV2ZXIgdGhlIHB1YmxpYyBJbnRlcm5ldCk6IgogIHNheSAiICAxLiBJbnN0YWxsIFRhaWxzY2FsZSBvbiB0aGlzIG1hY2hpbmUgYW5kIHlvdXIgcGhvbmUsIEhUVFBTIGNlcnRpZmljYXRlcyBlbmFibGVkLiIKICBzYXkgIiAgMi4gUnVuOiAgdGFpbHNjYWxlIHNlcnZlIC0tYmcgLS1odHRwcz0kUE9SVCBodHRwOi8vMTI3LjAuMC4xOiRQT1JUIgogIGlmIFsgLW4gIiRuYW1lIiBdOyB0aGVuCiAgICBwaG9uZT0iaHR0cHM6Ly8kbmFtZTokUE9SVC8iCiAgICBzYXkgIiAgMy4gT3BlbiAgJHBob25lICBvbiB0aGUgcGhvbmUgYW5kIGFkZCBpdCB0byB0aGUgaG9tZSBzY3JlZW4uIgogIGVsc2UKICAgIHBob25lPSIiCiAgICBzYXkgIiAgMy4gT3BlbiAgaHR0cHM6Ly88bWFjaGluZT4uPHRhaWxuZXQ+LnRzLm5ldDokUE9SVC8gIG9uIHRoZSBwaG9uZSwgYWRkIGl0IHRvIHRoZSBob21lIHNjcmVlbi4iCiAgZmkKICBzYXkgIiAgNC4gVGhlbiBvcGVuICRVUkwvIy9zZXR0aW5ncz9zZWN0aW9uPXBob25lOiB3aGVyZHIgY2hlY2tzIHRoZSBhZGRyZXNzIGFuZCBzZXRzIEFQUF9VUkwgaXRzZWxmLiIKICBzYXkgIiAgNS4gSW4gdGhlIGFwcDogU2V0dGluZ3Mg4oaSIEVuYWJsZSBub3RpZmljYXRpb25zLCB0aGVuIFNlY3VyaXR5IOKGkiBFbmFibGUgcGFzc2tleSBsb2NrLiIKICAjIFRoZSBRUiBjb2RlIG9ubHkgZm9yIGFuIGFkZHJlc3MgdGhhdCBhbnN3ZXJzIGxpa2Ugd2hlcmRyLgogIGlmIFsgLW4gIiRwaG9uZSIgXSAmJiBjb21tYW5kIC12IGN1cmwgPi9kZXYvbnVsbCAyPiYxIFwKICAgICYmIGN1cmwgLWZzUyAtLW1heC10aW1lIDggIiR7cGhvbmV9bWFuaWZlc3Qud2VibWFuaWZlc3QiIDI+L2Rldi9udWxsIHwgZ3JlcCAtcSB3aGVyZHI7IHRoZW4KICAgIHNheSAiIgogICAgaWYgY29tbWFuZCAtdiBxcmVuY29kZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcXJlbmNvZGUgLXQgQU5TSVVURjggLW0gMiAiJHBob25lIgogICAgZWxzZQogICAgICBzYXkgIiAgKEluc3RhbGwgcXJlbmNvZGUgdG8gc2hvdyBhIFFSIGNvZGUgb2YgJHBob25lIGhlcmUuKSIKICAgIGZpCiAgZWxpZiBbIC1uICIkcGhvbmUiIF07IHRoZW4KICAgIHNheSAiIgogICAgc2F5ICIgICEgTm90IHJlYWNoYWJsZSBmcm9tIHlvdXIgcGhvbmUgeWV0OiAkcGhvbmUgZG9lcyBub3QgYW5zd2VyIChzdGVwIDIpLiIKICBmaQogIHNheSAiIgogIHNheSAiICBHdWlkZTogaHR0cHM6Ly9naXRodWIuY29tLyRTT1VSQ0UjaW5zdGFsbC10aGUtYXBwLW9uLXlvdXItcGhvbmUiCn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNlcnZpY2UKY21kX3NlcnZpY2UoKSB7CiAgY2FzZSAiJHsxOi19IiBpbiBpbnN0YWxsfHVuaW5zdGFsbCkgOzsgKikgZGllICJ1c2FnZTogJDAgc2VydmljZSBpbnN0YWxsfHVuaW5zdGFsbCIgOzsgZXNhYwogIGlmIFsgIiRNT0RFIiA9ICJkb2NrZXIiIF07IHRoZW4KICAgIHNheSAid2hlcmRyIHJ1bnMgaW4gRG9ja2VyOiB0aGUgY29udGFpbmVyIGFscmVhZHkgc3RhcnRzIHdpdGggRG9ja2VyIChyZXN0YXJ0OiBhbHdheXMpLiIKICAgIHJldHVybiAwCiAgZmkKICBjbGkgc2VydmljZSAiJDEiCiAgIyBXaXRob3V0IHRoZSBzZXJ2aWNlLCB0aGUgcGx1Z2luIHJ1bnMgd2hlcmRyIGFnYWluIChhbmQgaXRzIHN0YXJ0dXAgaG9vawogICMgc3RhcnRzIGl0IHdpdGggSGVyZHIpLgogIGlmIFsgIiQxIiA9ICJ1bmluc3RhbGwiIF07IHRoZW4gY21kX3N0YXJ0OyBmaQp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBrZXkKIyBBIEhlcmRyIGtleSB0aGF0IG9wZW5zIHRoZSB3aGVyZHIgcGFuZWw6IEhlcmRyIHYxIHBsdWdpbnMgaGF2ZSBubyBtZW51LCBzbwojIHRoZSBpbnN0YWxsIGFwcGVuZHMgb25lIG1hcmtlZCBbW2tleXMuY29tbWFuZF1dIGJsb2NrIHRvIEhlcmRyJ3MKIyBjb25maWcudG9tbCwgb24gdGhlIGZpcnN0IGZyZWUga2V5IG9mIEhPVEtFWVMgKG5ldmVyIG9uZSBIZXJkciBvciB0aGUgdXNlcgojIGFscmVhZHkgYmluZHMpLiBFeGlzdGluZyBsaW5lcyBhcmUgbmV2ZXIgY2hhbmdlZDogdGhlIGJsb2NrIGlzIG9ubHkgZXZlcgojIGFwcGVuZGVkLCB0aGVuIHJlbW92ZWQgYnkgYGtleSB1bmluc3RhbGxgLiBOb3RoaW5nIGlzIGFkZGVkIHdoZW4gdGhlIHBhbmVsCiMgYWxyZWFkeSBoYXMgYSBrZXksIG9yIHdoZW4gbm8gY2FuZGlkYXRlIGlzIGZyZWUuCkhPVEtFWVM9IiR7V0hFUkRSX0hPVEtFWVM6LXByZWZpeCtpIHByZWZpeCt1IHByZWZpeCt5IHByZWZpeCttIHByZWZpeCthbHQrd30iCkhFUkRSX0NPTkZJRz0iJHtIRVJEUl9DT05GSUdfUEFUSDotJHtYREdfQ09ORklHX0hPTUU6LSRIT01FLy5jb25maWd9L2hlcmRyL2NvbmZpZy50b21sfSIKUExVR0lOX0lEPSIkKHByaW50ZiAnJXMnICIkU09VUkNFIiB8IHRyIC8gLikiClBBTkVMX0FDVElPTj0iJFBMVUdJTl9JRC5wYW5lbCIKS0VZX0JFR0lOPSIjIHdoZXJkcjoga2V5IHRoYXQgb3BlbnMgdGhlIHdoZXJkciBwYW5lbCAocmVtb3ZlIHRoaXMgYmxvY2sgdG8gdW5iaW5kIGl0KSIKS0VZX0VORD0iIyBlbmQgd2hlcmRyIgoKIyBIZXJkcidzIGRlZmF1bHQga2V5bWFwLCBmcm9tIHRoZSBydW5uaW5nIGJpbmFyeSB3aGVuIGl0IGNhbiBwcmludCBpdCwKIyBvdGhlcndpc2UgYXMgb2YgSGVyZHIgMC45LjMgKCJuYW1lPFRBQj5rZXkiIGxpbmVzKS4KZGVmYXVsdF9rZXlzKCkgewogIG91dD0iJCgiJChoZXJkcl9iaW4pIiAtLWRlZmF1bHQtY29uZmlnIDI+L2Rldi9udWxsIHwgYXdrICcKICAgIC9eXFtrZXlzXF0vIHsgayA9IDE7IG5leHQgfQogICAgayAmJiAvXlxbLyB7IGV4aXQgfQogICAgayAmJiBtYXRjaCgkMCwgL14jIFthLXpfXSsgPSAiW14iXSoiLykgewogICAgICBsaW5lID0gc3Vic3RyKCQwLCAzLCBSTEVOR1RIIC0gMik7IGVxID0gaW5kZXgobGluZSwgIiA9ICIpCiAgICAgIHYgPSBzdWJzdHIobGluZSwgZXEgKyA0KTsgc3ViKC8iJC8sICIiLCB2KQogICAgICBpZiAodiAhPSAiIikgcHJpbnRmICIlc1x0JXNcbiIsIHN1YnN0cihsaW5lLCAxLCBlcSAtIDEpLCB2CiAgICB9JykiIHx8IG91dD0iIgogIGlmIFsgLW4gIiRvdXQiIF07IHRoZW4gcHJpbnRmICclc1xuJyAiJG91dCI7IHJldHVybjsgZmkKICBmb3IgcCBpbiBoZWxwOj8gc2V0dGluZ3M6cyBkZXRhY2g6cSByZWxvYWRfY29uZmlnOnNoaWZ0K3Igb3Blbl9ub3RpZmljYXRpb25fdGFyZ2V0Om8gXAogICAgd29ya3NwYWNlX3BpY2tlcjp3IGdvdG86ZyBuZXdfd29ya3NwYWNlOnNoaWZ0K24gbmV3X3dvcmt0cmVlOnNoaWZ0K2cgcmVuYW1lX3dvcmtzcGFjZTpzaGlmdCt3IFwKICAgIGNsb3NlX3dvcmtzcGFjZTpzaGlmdCtkIG5ld190YWI6YyByZW5hbWVfdGFiOnNoaWZ0K3QgcHJldmlvdXNfdGFiOnAgbmV4dF90YWI6biBcCiAgICBjbG9zZV90YWI6c2hpZnQreCByZW5hbWVfcGFuZTpzaGlmdCtwIGVkaXRfc2Nyb2xsYmFjazplIGZvY3VzX3BhbmVfbGVmdDpoIGZvY3VzX3BhbmVfZG93bjpqIFwKICAgIGZvY3VzX3BhbmVfdXA6ayBmb2N1c19wYW5lX3JpZ2h0OmwgY3ljbGVfcGFuZV9uZXh0OnRhYiBjeWNsZV9wYW5lX3ByZXZpb3VzOnNoaWZ0K3RhYiBcCiAgICBzcGxpdF92ZXJ0aWNhbDp2IHNwbGl0X2hvcml6b250YWw6bWludXMgY2xvc2VfcGFuZTp4IHpvb206eiByZXNpemVfbW9kZTpyIHRvZ2dsZV9zaWRlYmFyOmI7IGRvCiAgICBwcmludGYgJyVzXHRwcmVmaXgrJXNcbicgIiR7cCUlOip9IiAiJHtwIyo6fSIKICBkb25lCn0KCiMgT25lIGxpbmUgb24gdGhlIGNvbmZpZzogImJvdW5kIDxrZXk+IiB3aGVuIGEgW1trZXlzLmNvbW1hbmRdXSBhbHJlYWR5IHJ1bnMKIyB0aGUgcGFuZWwsIGVsc2UgImZyZWUgPGtleT4iIChmaXJzdCBmcmVlIGNhbmRpZGF0ZSkgb3IgIm5vbmUiLiBBbHNvCiMgIm9sZCA8a2V5PiIgZm9yIGEgYmluZGluZyBvZiB0aGUgcGFuZWwncyBmb3JtZXIgYWN0aW9uIGlkICg8aWQ+LndoZXJkcikuCmtleV9zY2FuKCkgewogIGRlZmF1bHRzPSIkKGRlZmF1bHRfa2V5cykiCiAgeyBwcmludGYgJyVzXG4nICIkZGVmYXVsdHMiOyBwcmludGYgJ1wwMDFcbic7IGNhdCAiJEhFUkRSX0NPTkZJRyIgMj4vZGV2L251bGw7IH0gfCBhd2sgXAogICAgLXYgY2FuZHM9IiRIT1RLRVlTIiAtdiBhY3Rpb249IiRQQU5FTF9BQ1RJT04iIC12IG9sZD0iJFBMVUdJTl9JRC53aGVyZHIiICcKICAgIGZ1bmN0aW9uIG5vcm0oaykgewogICAgICBnc3ViKC9bIFx0XS8sICIiLCBrKQogICAgICAjICJwcmVmaXgrVyIgaXMgInByZWZpeCtzaGlmdCt3IgogICAgICBpZiAobWF0Y2goaywgL1wrW0EtWl0kLykpIGsgPSBzdWJzdHIoaywgMSwgUlNUQVJUKSAic2hpZnQrIiB0b2xvd2VyKHN1YnN0cihrLCBSU1RBUlQgKyAxKSkKICAgICAgcmV0dXJuIHRvbG93ZXIoaykKICAgIH0KICAgIGZ1bmN0aW9uIHN0cmluZ3Mocywgb3V0LCAgIG4pIHsKICAgICAgbiA9IDAKICAgICAgd2hpbGUgKG1hdGNoKHMsIC8iW14iXSoiLykpIHsgb3V0Wysrbl0gPSBzdWJzdHIocywgUlNUQVJUICsgMSwgUkxFTkdUSCAtIDIpOyBzID0gc3Vic3RyKHMsIFJTVEFSVCArIFJMRU5HVEgpIH0KICAgICAgcmV0dXJuIG4KICAgIH0KICAgIGZ1bmN0aW9uIGZsdXNoKCkgewogICAgICBpZiAoY2tleSAhPSAiIiAmJiBjbWQgPT0gYWN0aW9uICYmIGJvdW5kID09ICIiKSBib3VuZCA9IGNrZXkKICAgICAgaWYgKGNrZXkgIT0gIiIgJiYgY21kID09IG9sZCAmJiBvbGRrZXkgPT0gIiIpIG9sZGtleSA9IGNrZXkKICAgICAgY2tleSA9ICIiOyBjbWQgPSAiIgogICAgfQogICAgJDAgPT0gIlwwMDEiIHsgY29uZiA9IDE7IG5leHQgfQogICAgIWNvbmYgeyBzcGxpdCgkMCwgZCwgIlx0Iik7IGRlZltkWzFdXSA9IGRbMl07IG5leHQgfQogICAgL15bIFx0XSpcWy8gewogICAgICBmbHVzaCgpOyB0ID0gJDA7IHN1YigvIy4qLywgIiIsIHQpOyBnc3ViKC9bIFx0XS8sICIiLCB0KQogICAgICBzZWN0ID0gdCA9PSAiW2tleXNdIiA/ICJrZXlzIiA6IHQgPT0gIltba2V5cy5jb21tYW5kXV0iID8gImNtZCIgOiAiIgogICAgICBuZXh0CiAgICB9CiAgICAvXlsgXHRdKigjfCQpLyB7IG5leHQgfQogICAgewogICAgICBlcSA9IGluZGV4KCQwLCAiPSIpOyBpZiAoIWVxKSBuZXh0CiAgICAgIG5hbWUgPSBzdWJzdHIoJDAsIDEsIGVxIC0gMSk7IGdzdWIoL1sgXHRdLywgIiIsIG5hbWUpOyB2YWwgPSBzdWJzdHIoJDAsIGVxICsgMSkKICAgICAgaWYgKHNlY3QgPT0gImtleXMiKSB7CiAgICAgICAgb3ZlcltuYW1lXSA9IDE7IG4gPSBzdHJpbmdzKHZhbCwgcykKICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykgdGFrZW5bbm9ybShzW2ldKV0gPSAxCiAgICAgIH0gZWxzZSBpZiAoc2VjdCA9PSAiY21kIiAmJiBzdHJpbmdzKHZhbCwgcykpIHsKICAgICAgICBpZiAobmFtZSA9PSAia2V5IikgeyBja2V5ID0gc1sxXTsgdGFrZW5bbm9ybShzWzFdKV0gPSAxIH0KICAgICAgICBpZiAobmFtZSA9PSAiY29tbWFuZCIpIGNtZCA9IHNbMV0KICAgICAgfQogICAgfQogICAgRU5EIHsKICAgICAgZmx1c2goKQogICAgICBpZiAob2xka2V5ICE9ICIiKSBwcmludCAib2xkICIgb2xka2V5CiAgICAgIGlmIChib3VuZCAhPSAiIikgeyBwcmludCAiYm91bmQgIiBib3VuZDsgZXhpdCB9CiAgICAgIGZvciAoYSBpbiBkZWYpIGlmICghKGEgaW4gb3ZlcikpIHRha2VuW25vcm0oZGVmW2FdKV0gPSAxCiAgICAgIG4gPSBzcGxpdChjYW5kcywgYywgIiAiKQogICAgICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykgaWYgKCEobm9ybShjW2ldKSBpbiB0YWtlbikpIHsgcHJpbnQgImZyZWUgIiBjW2ldOyBleGl0IH0KICAgICAgcHJpbnQgIm5vbmUiCiAgICB9Jwp9CgojIFRoZSBrZXkgYm91bmQgdG8gdGhlIHBhbmVsLCBpZiBhbnkuCmtleV9ib3VuZCgpIHsga2V5X3NjYW4gfCBzZWQgLW4gJ3MvXmJvdW5kIC8vcCc7IH0KCiMgSGVyZHIgYXBwbGllcyBrZXliaW5kaW5ncyBvbiBgaGVyZHIgc2VydmVyIHJlbG9hZC1jb25maWdgIChubyByZXN0YXJ0KS4Ka2V5X3JlbG9hZCgpIHsKICBpZiAiJChoZXJkcl9iaW4pIiBzZXJ2ZXIgcmVsb2FkLWNvbmZpZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHRlbGwgIiAgSGVyZHIgcmVsb2FkZWQgaXRzIGNvbmZpZzogbm8gcmVzdGFydCBuZWVkZWQuIgogIGVsc2UKICAgIHRlbGwgIiAgUnVuIGhlcmRyIHNlcnZlciByZWxvYWQtY29uZmlnIChvciByZXN0YXJ0IEhlcmRyKSB0byBhcHBseSBpdC4iCiAgZmkKfQoKY21kX2tleSgpIHsKICBjYXNlICIkezE6LX0iIGluCiAgICBpbnN0YWxsKQogICAgICBzY2FuPSIkKGtleV9zY2FuKSIKICAgICAgb2xkPSIkKHByaW50ZiAnJXNcbicgIiRzY2FuIiB8IHNlZCAtbiAncy9eb2xkIC8vcCcpIgogICAgICBbIC16ICIkb2xkIiBdIHx8IHdhcm4gIiRvbGQgcnVucyAkUExVR0lOX0lELndoZXJkciwgcmVuYW1lZCAkUEFORUxfQUNUSU9OOiBlZGl0IHRoYXQgbGluZSBvZiAkSEVSRFJfQ09ORklHLiIKICAgICAgcmVzPSIkKHByaW50ZiAnJXNcbicgIiRzY2FuIiB8IHNlZCAnL15vbGQgL2QnKSIKICAgICAgY2FzZSAiJHJlcyIgaW4KICAgICAgICBib3VuZFwgKikgdGVsbCAiUHJlc3MgJHtyZXMjYm91bmQgfSBpbiBIZXJkciB0byBvcGVuIHRoZSB3aGVyZHIgcGFuZWwuIiA7OwogICAgICAgIGZyZWVcICopCiAgICAgICAgICBrZXk9IiR7cmVzI2ZyZWUgfSIKICAgICAgICAgIG1rZGlyIC1wICIkKGRpcm5hbWUgIiRIRVJEUl9DT05GSUciKSIKICAgICAgICAgIGJsb2NrPSIkKHByaW50ZiAnJXNcbltba2V5cy5jb21tYW5kXV1cbmtleSA9ICIlcyJcbnR5cGUgPSAicGx1Z2luX2FjdGlvbiJcbmNvbW1hbmQgPSAiJXMiXG5kZXNjcmlwdGlvbiA9ICJ3aGVyZHIiXG4lcycgXAogICAgICAgICAgICAiJEtFWV9CRUdJTiIgIiRrZXkiICIkUEFORUxfQUNUSU9OIiAiJEtFWV9FTkQiKSIKICAgICAgICAgIHNlcD0iIgogICAgICAgICAgaWYgWyAtcyAiJEhFUkRSX0NPTkZJRyIgXTsgdGhlbgogICAgICAgICAgICBzZXA9IgoiCiAgICAgICAgICAgICMgQSBsYXN0IGxpbmUgd2l0aG91dCBpdHMgbmV3bGluZSBnZXRzIG9uZSBmaXJzdC4KICAgICAgICAgICAgWyAiJCh0YWlsIC1jIDEgIiRIRVJEUl9DT05GSUciIHwgb2QgLUFuIC1jIHwgdHIgLWQgJyAnKSIgPSAnXG4nIF0gfHwgc2VwPSIKJHNlcCIKICAgICAgICAgIGZpCiAgICAgICAgICAjIENoZWNrZWQgb24gYSBjb3B5IGZpcnN0IHdoZW4gdGhpcyBIZXJkciBjYW4gdmFsaWRhdGUgYSBjb25maWc6CiAgICAgICAgICAjIGEgY29uZmlnIEhlcmRyIHdvdWxkIHJlamVjdCBpcyBuZXZlciB3cml0dGVuLgogICAgICAgICAgdG1wPSIkSEVSRFJfQ09ORklHLndoZXJkci1jaGVjay50b21sIgogICAgICAgICAgeyBpZiBbIC1mICIkSEVSRFJfQ09ORklHIiBdOyB0aGVuIGNhdCAiJEhFUkRSX0NPTkZJRyI7IGZpOyBwcmludGYgJyVzJXNcbicgIiRzZXAiICIkYmxvY2siOyB9ID4gIiR0bXAiCiAgICAgICAgICBpZiAiJChoZXJkcl9iaW4pIiBjb25maWcgLS1oZWxwID4vZGV2L251bGwgMj4mMSAmJiAhIEhFUkRSX0NPTkZJR19QQVRIPSIkdG1wIiAiJChoZXJkcl9iaW4pIiBjb25maWcgY2hlY2sgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgICAgIHJtIC1mICIkdG1wIgogICAgICAgICAgICB3YXJuICJubyBIZXJkciBrZXkgYWRkZWQ6ICRIRVJEUl9DT05GSUcgd291bGQgbm90IHZhbGlkYXRlIHdpdGggaXQgKGhlcmRyIGNvbmZpZyBjaGVjaykuIgogICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgZmkKICAgICAgICAgIHJtIC1mICIkdG1wIgogICAgICAgICAgcHJpbnRmICclcyVzXG4nICIkc2VwIiAiJGJsb2NrIiA+PiAiJEhFUkRSX0NPTkZJRyIKICAgICAgICAgIG9rICJIZXJkciBrZXkgJGtleSBhZGRlZCB0byAkSEVSRFJfQ09ORklHIgogICAgICAgICAgdGVsbCAiUHJlc3MgJGtleSBpbiBIZXJkciB0byBvcGVuIHRoZSB3aGVyZHIgcGFuZWwuIgogICAgICAgICAga2V5X3JlbG9hZAogICAgICAgICAgOzsKICAgICAgICAqKSB3YXJuICJubyBIZXJkciBrZXkgYWRkZWQ6ICRIT1RLRVlTIGFyZSBhbGwgdGFrZW4uIEJpbmQgb25lIHRvICRQQU5FTF9BQ1RJT04gKHR5cGUgPSBcInBsdWdpbl9hY3Rpb25cIikgaW4gJEhFUkRSX0NPTkZJRy4iIDs7CiAgICAgIGVzYWMKICAgICAgOzsKICAgIHVuaW5zdGFsbCkKICAgICAgaWYgISBncmVwIC1xeEYgIiRLRVlfQkVHSU4iICIkSEVSRFJfQ09ORklHIiAyPi9kZXYvbnVsbDsgdGhlbiBvayAibm8gd2hlcmRyIGtleSBpbiAkSEVSRFJfQ09ORklHIjsgcmV0dXJuIDA7IGZpCiAgICAgICMgRHJvcHMgdGhlIG1hcmtlZCBibG9jayBhbmQgdGhlIGJsYW5rIGxpbmUgd3JpdHRlbiBiZWZvcmUgaXQuCiAgICAgIHRtcD0iJEhFUkRSX0NPTkZJRy53aGVyZHItdG1wIgogICAgICBhd2sgLXYgYj0iJEtFWV9CRUdJTiIgLXYgZT0iJEtFWV9FTkQiICcKICAgICAgICAkMCA9PSBiIHsgc2tpcCA9IDE7IGlmIChibGFuaykgYmxhbmstLTsgbmV4dCB9CiAgICAgICAgc2tpcCB7IGlmICgkMCA9PSBlKSBza2lwID0gMDsgbmV4dCB9CiAgICAgICAgJDAgPT0gIiIgeyBibGFuaysrOyBuZXh0IH0KICAgICAgICB7IHdoaWxlIChibGFuaykgeyBwcmludCAiIjsgYmxhbmstLSB9IHByaW50IH0KICAgICAgICBFTkQgeyB3aGlsZSAoYmxhbmspIHsgcHJpbnQgIiI7IGJsYW5rLS0gfSB9JyAiJEhFUkRSX0NPTkZJRyIgPiAiJHRtcCIKICAgICAgIyBSZXdyaXR0ZW4gaW4gcGxhY2U6IHRoZSBmaWxlIGtlZXBzIGl0cyBvd25lciBhbmQgbW9kZS4KICAgICAgY2F0ICIkdG1wIiA+ICIkSEVSRFJfQ09ORklHIiAmJiBybSAtZiAiJHRtcCIKICAgICAgb2sgIndoZXJkciBrZXkgcmVtb3ZlZCBmcm9tICRIRVJEUl9DT05GSUciCiAgICAgIGtleV9yZWxvYWQKICAgICAgOzsKICAgIHN0YXR1cykgYj0iJChrZXlfYm91bmQpIjsgaWYgWyAtbiAiJGIiIF07IHRoZW4gc2F5ICIkYiI7IGVsc2Ugc2F5ICJub25lIjsgZmkgOzsKICAgICopIGRpZSAidXNhZ2U6ICQwIGtleSBpbnN0YWxsfHVuaW5zdGFsbHxzdGF0dXMiIDs7CiAgZXNhYwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwYW5lbAojIFRoZSAicGFuZWwiIGFjdGlvbjogb25lIHBvcHVwIHdpdGggdGhlIHN0YXRlLCBPcGVuIHdoZXJkciwgU2V0IHVwIG15IHBob25lCiMgKG9wZW5zIFNldHRpbmdzIOKAuiBQaG9uZSkgYW5kIHRoZSBvdGhlciBjb21tYW5kcyAoYmluL2xpYi9wYW5lbC5tanMpLAojIGRyaXZpbmcgdGhpcyBzY3JpcHQuCmNtZF9wYW5lbCgpIHsKICBjb250cm9sPSIkKHByaW50ZiAnWyJzaCIsIiVzIl0nICIkKHByaW50ZiAnJXMnICIkUk9PVC9zY3JpcHRzL2hlcmRyLXBsdWdpbi5zaCIgfCBzZWQgJ3MvW1xcIl0vXFwmL2cnKSIpIgogIGlmIFsgIiRNT0RFIiA9ICJuYXRpdmUiIF0gfHwgeyBbIC1uICIkTU9ERSIgXSAmJiBSVU5USU1FPSIkKGZpbmRfcnVudGltZSkiOyB9OyB0aGVuCiAgICBXSEVSRFJfQ09OVFJPTD0iJGNvbnRyb2wiIFdIRVJEUl9NT0RFPSIkTU9ERSIgV0hFUkRSX0hPVEtFWT0iJChrZXlfYm91bmQpIiBjbGkgcGFuZWwKICBlbGlmIFsgLW4gIiRNT0RFIiBdOyB0aGVuCiAgICBzaF9wYW5lbAogIGVsc2UKICAgIGRpZSAid2hlcmRyIHBsdWdpbiBpcyBub3Qgc2V0IHVwICgkQ09ORiBpcyBtaXNzaW5nKTogaW5zdGFsbCBpdCBhZ2FpbiB3aXRoIGhlcmRyIHBsdWdpbiBpbnN0YWxsICRTT1VSQ0UgLS15ZXMuIgogIGZpCn0KCiMgRG9ja2VyIG1vZGUgd2l0aG91dCBOb2RlLmpzOiB0aGUgc2FtZSBrZXlzLCB3aXRob3V0IHRoZSBRUiBjb2RlLgpzaF9wYW5lbCgpIHsKICBzYXZlZD0iJChzdHR5IC1nKSIKICB0cmFwICdzdHR5ICIkc2F2ZWQiJyBFWElUCiAgd2hpbGUgOjsgZG8KICAgIHByaW50ZiAnXDAzM1tIXDAzM1sySlxuICBXSEVSRFJcblxuJwogICAgKCBjbWRfc3RhdHVzICkgfHwgdHJ1ZQogICAgcHJpbnRmICdcbiAgUyBzdGFydCAgWCBzdG9wICBSIHJlc3RhcnQgIE8gb3BlbiAgTCBsb2cgIFUgdXBkYXRlICBQIHBob25lICBRIHF1aXRcbicKICAgIHByaW50ZiAnICBSZW1vdmU6IFgsIHRoZW4gc2ggJXMga2V5IHVuaW5zdGFsbCwgdGhlbiBoZXJkciBwbHVnaW4gdW5pbnN0YWxsICVzICYmIHJtIC1yZiAlc1xuJyAiJFJPT1Qvc2NyaXB0cy9oZXJkci1wbHVnaW4uc2giICIkUExVR0lOX0lEIiAiJERJUiIKICAgIHN0dHkgLWljYW5vbiAtZWNobyBtaW4gMCB0aW1lIDUwCiAgICBrPSIkKGRkIGJzPTEgY291bnQ9MSAyPi9kZXYvbnVsbCB8fCB0cnVlKSIKICAgIHN0dHkgIiRzYXZlZCIKICAgIGNhc2UgIiRrIiBpbgogICAgICBzfFMpIGFjdD1zdGFydCA7OyB4fFgpIGFjdD1zdG9wIDs7IHJ8UikgYWN0PXJlc3RhcnQgOzsgb3xPKSBhY3Q9b3BlbiA7OwogICAgICBsfEwpIGFjdD1sb2dzIDs7IHV8VSkgYWN0PXVwZGF0ZSA7OyBwfFApIGFjdD1waG9uZSA7OyBxfFEpIGJyZWFrIDs7CiAgICAgICopIGNvbnRpbnVlIDs7CiAgICBlc2FjCiAgICBwcmludGYgJ1wwMzNbSFwwMzNbMkpcbicKICAgICggdHJhcCAtIElOVDsgImNtZF8kYWN0IiApIHx8IHRydWUKICAgIHByaW50ZiAnXG4gIFByZXNzIEVudGVyIHRvIGdvIGJhY2suICcKICAgIHJlYWQgLXIgXyB8fCB0cnVlCiAgZG9uZQp9CgpjbWRfcmVzdGFydCgpIHsgY21kX3N0b3A7IGNtZF9zdGFydDsgfQoKY2FzZSAiJHsxOi19IiBpbgogIGJ1aWxkKSBjbWRfYnVpbGQgOzsKICBwYW5lbCkgY21kX3BhbmVsIDs7CiAgc3RhcnR8c3RvcHxyZXN0YXJ0fHN0YXR1c3xvcGVufHVwZGF0ZXxwaG9uZXxsb2dzfGRvY3RvcikgImNtZF8kMSIgOzsKICBzZXJ2aWNlKSBjbWRfc2VydmljZSAiJHsyOi19IiA7OwogIHNraWxsKSBjbWRfc2tpbGwgIiR7MjotfSIgOzsKICBrZXkpIGNtZF9rZXkgIiR7MjotfSIgOzsKICAqKSBkaWUgInVzYWdlOiAkMCBidWlsZHxwYW5lbHxzdGFydHxzdG9wfHJlc3RhcnR8c3RhdHVzfG9wZW58dXBkYXRlfHBob25lfGxvZ3N8ZG9jdG9yfHNlcnZpY2UgaW5zdGFsbHx1bmluc3RhbGx8c2tpbGwgaW5zdGFsbHx1bmluc3RhbGx8a2V5IGluc3RhbGx8dW5pbnN0YWxsfHN0YXR1cyIgOzsKZXNhYwo=");
4
+ const herdrPlugin = base64ToUint8Array("IyEvYmluL3NoCiMgd2hlcmRyIGFzIGEgSGVyZHIgcGx1Z2luIChoZXJkci1wbHVnaW4udG9tbCk6IGJ1aWxkIChpbnN0YWxsICsgZmlyc3Qgc3RhcnQpLAojIHRoZSBwYW5lbCwgc3RhcnQsIHN0b3AsIHN0YXR1cywgb3BlbiwgdXBkYXRlLCBzZXJ2aWNlLCBza2lsbCwga2V5LgojCiMgICBoZXJkciBwbHVnaW4gaW5zdGFsbCA8b3duZXI+L3doZXJkcgojCiMgVHdvIHdheXMgdG8gcnVuIHdoZXJkciwgcGlja2VkIG9uY2UgYXQgaW5zdGFsbCB0aW1lIGFuZCBrZXB0IGluCiMgJFdIRVJEUl9ESVIvcGx1Z2luLmVudjoKIyAgIGRvY2tlciAgTGludXggd2l0aCBEb2NrZXIgQ29tcG9zZSB2MiB1c2FibGUgYnkgdGhpcyB1c2VyOiB0aGUgcHVibGlzaGVkCiMgICAgICAgICAgIGltYWdlLCBydW4gZnJvbSAkV0hFUkRSX0RJUiBleGFjdGx5IGxpa2UgaHR0cHM6Ly93aGVyZHIuZGV2L2luc3RhbGwuCiMgICBuYXRpdmUgIGV2ZXJ5d2hlcmUgZWxzZSAoYWx3YXlzIG9uIG1hY09TOiBEb2NrZXIgRGVza3RvcCBjYW5ub3QgcmVhY2gKIyAgICAgICAgICAgSGVyZHIncyBVbml4IHNvY2tldCk6IE5vZGUuanMgMjIgKG9yIEJ1bikgcnVucyB0aGUgcHJlYnVpbHQgbnBtCiMgICAgICAgICAgIHBhY2thZ2Ugb2YgdGhpcyB2ZXJzaW9uIChvciBhIGJ1aWxkIG1hZGUgaW4gdGhlIHBsdWdpbiBmb2xkZXIpLAojICAgICAgICAgICBjb3BpZWQgdG8gJFdIRVJEUl9ESVIvYXBwIGFuZCBzdGFydGVkIGRldGFjaGVkIGZyb20gdGhlcmUsIHdpdGgKIyAgICAgICAgICAgaXRzIHBpZCBhbmQgbG9nIGluICRXSEVSRFJfRElSLgojIEhlcmRyIGJ1aWxkcyBhIHBsdWdpbiBpbiBhIHRlbXBvcmFyeSBmb2xkZXIsIHRoZW4gbW92ZXMgaXQ6IGEgc2VydmVyIHN0YXJ0ZWQKIyBmcm9tIHRoZSBjaGVja291dCBkdXJpbmcgdGhlIGJ1aWxkIHdvdWxkIGxvc2UgaXRzIGZpbGVzLiAkV0hFUkRSX0RJUi9hcHAKIyBzdGF5cyBwdXQsIGFjcm9zcyBwbHVnaW4gdXBkYXRlcyB0b28sIHNvIHRoZSBidWlsZCBjYW4gc3RhcnQgd2hlcmRyIGFuZCBhCiMgbG9naW4gc2VydmljZSBjYW4gcG9pbnQgYXQgaXQuCiMgV0hFUkRSX01PREU9bmF0aXZlIChvciBkb2NrZXIpIGluIHRoZSBlbnZpcm9ubWVudCBvZiBgaGVyZHIgcGx1Z2luIGluc3RhbGxgCiMgZm9yY2VzIHRoZSBjaG9pY2U7IGVkaXQgcGx1Z2luLmVudiB0byBjaGFuZ2UgaXQgbGF0ZXIsIHRoZW4gcnVuIFVwZGF0ZS4KIwojIFNhZmV0eSBydWxlczoKIyAgIC0gbm90aGluZyBnbG9iYWwgaXMgaW5zdGFsbGVkLCBubyBzdWRvOyBmaWxlcyBhcmUgb25seSB3cml0dGVuIHRvIHRoZQojICAgICBwbHVnaW4gZm9sZGVyIGFuZCAkV0hFUkRSX0RJUiAoZGVmYXVsdCB+L3doZXJkciksIHBsdXMgdGhlIGZvbGRlcnMgdGhlCiMgICAgIERvY2tlciBzZXR1cCBtb3VudHMgKH4vLmNvbmZpZy9oZXJkciwgfi8uY2FjaGUvaGVyZHItd2Vi4oCmKSwgYW5kIHRoZQojICAgICBsb2dpbiBzZXJ2aWNlIG9ubHkgd2hlbiBhc2tlZCAoa2V5IEEgb2YgdGhlIHBhbmVsKSwgcGx1cyBhICJ3aGVyZHIiCiMgICAgIGxpbmsgaW4gdGhlIGFnZW50cycgdXNlciBza2lsbCBmb2xkZXJzIChzZWUgY21kX3NraWxsKSwgcGx1cyBvbmUgbWFya2VkCiMgICAgIGJsb2NrIGFwcGVuZGVkIHRvIEhlcmRyJ3MgY29uZmlnLnRvbWw6IHRoZSBrZXkgdGhhdCBvcGVucyB0aGUgcGFuZWwKIyAgICAgKHNlZSBjbWRfa2V5KTsKIyAgIC0gdGhlIGluc3RhbGwgc3RhcnRzIHdoZXJkciwgYW5kIEhlcmRyJ3Mgc3RhcnR1cCBob29rIHN0YXJ0cyBpdCBhZ2FpbiwKIyAgICAgYnV0IG9ubHkgd2hlbiBub3RoaW5nIGFuc3dlcnMgb24gdGhlIHBvcnQ6IGEgd2hlcmRyIHN0YXJ0ZWQgYW5vdGhlciB3YXkKIyAgICAgKERvY2tlciwgc3lzdGVtZCwgYnkgaGFuZCkgaXMgbmV2ZXIgdG91Y2hlZCwgbm8gc2Vjb25kIHdoZXJkciBpcyBzdGFydGVkOwojICAgLSBzdG9wIG9ubHkgc3RvcHMgd2hhdCB0aGlzIHBsdWdpbiBzdGFydGVkIChpdHMgcGlkLCBpdHMgbG9naW4gc2VydmljZSwgb3IKIyAgICAgdGhlIGNvbnRhaW5lciBvZiBpdHMgb3duIGNvbXBvc2UgZm9sZGVyKS4KIwojIFVuaW5zdGFsbDogSGVyZHIgaGFzIG5vIHVuaW5zdGFsbCBob29rLiBTdG9wIHdoZXJkciAoYW5kIHJlbW92ZSB0aGUgbG9naW4KIyBzZXJ2aWNlKSBmcm9tIHRoZSBwYW5lbCBmaXJzdCwgdGhlbjoKIyAgIHNoIHNjcmlwdHMvaGVyZHItcGx1Z2luLnNoIHNraWxsIHVuaW5zdGFsbCAgIChpbiB0aGUgcGx1Z2luIGZvbGRlcikKIyAgIHNoIHNjcmlwdHMvaGVyZHItcGx1Z2luLnNoIGtleSB1bmluc3RhbGwgICAgICh0aGUgSGVyZHIga2V5IG9mIHRoZSBwYW5lbCkKIyAgIGhlcmRyIHBsdWdpbiB1bmluc3RhbGwgPG93bmVyPi53aGVyZHIgJiYgcm0gLXJmIH4vd2hlcmRyCiMKIyBTZXR0aW5ncyAoJFdIRVJEUl9ESVIvcGx1Z2luLmVudiwgb3IgdGhlIGVudmlyb25tZW50KToKIyAgIFdIRVJEUl9NT0RFICBkb2NrZXIgfCBuYXRpdmUgICAgICAgIChkZWZhdWx0OiBjaG9zZW4gYXQgaW5zdGFsbCkKIyAgIFdIRVJEUl9QT1JUICBsb2NhbCBwb3J0ICAgICAgICAgICAgICAoZGVmYXVsdDogNzY4MykKIyAgIEFQUF9VUkwgICAgICBwcml2YXRlIEhUVFBTIGFkZHJlc3MgICAobmF0aXZlOyBEb2NrZXIgcmVhZHMgaXRzIC5lbnYpCiMgICBXSEVSRFJfUlVOVElNRSAgYWJzb2x1dGUgcGF0aCBvZiBub2RlIC8gYnVuIChuYXRpdmU7IGZvdW5kIGF0IGluc3RhbGwpCgpzZXQgLWV1CgpST09UPSIkKGNkICIkKGRpcm5hbWUgIiQwIikvLi4iICYmIHB3ZCAtUCkiCiMgQnVpbGQgY29tbWFuZHMgZ2V0IG5vIHBsdWdpbiBlbnZpcm9ubWVudDogdGhlIGZvbGRlciBjaG9zZW4gYXQgaW5zdGFsbAojIHRpbWUgaXMgcmVtZW1iZXJlZCBpbiB0aGUgcGx1Z2luIGNoZWNrb3V0IGZvciB0aGUgcnVudGltZSBjb21tYW5kcy4KaWYgWyAteiAiJHtXSEVSRFJfRElSOi19IiBdICYmIFsgLWYgIiRST09ULy53aGVyZHItZGlyIiBdOyB0aGVuCiAgV0hFUkRSX0RJUj0iJChjYXQgIiRST09ULy53aGVyZHItZGlyIikiCmZpCkRJUj0iJHtXSEVSRFJfRElSOi0kSE9NRS93aGVyZHJ9IgpDT05GPSIkRElSL3BsdWdpbi5lbnYiCiMgTmF0aXZlIG1vZGU6IHRoZSBpbnN0YWxsZWQgY29weSBvZiB3aGVyZHIgKGJpbiArIGJ1aWx0IHNlcnZlcikuCkFQUD0iJERJUi9hcHAiCiMgR2l0SHViIHNvdXJjZSBvZiB0aGlzIHBsdWdpbjogaXRzIG1hbmlmZXN0IGlkIHdpdGggIi8iIGZvciAiLiIgKG93bmVyLndoZXJkcikuClNPVVJDRT0iJChzZWQgLW4gJ3MvXmlkID0gIlwoLipcKSIkL1wxL3AnICIkUk9PVC9oZXJkci1wbHVnaW4udG9tbCIgfCBoZWFkIC1uIDEgfCB0ciAuIC8pIgojIGNvbnRhaW5lcl9uYW1lIG9mIHRoZSBjb21wb3NlIGZpbGUgKHdoZXJkciB1bmxlc3MgeW91IHJlbmFtZWQgaXQpLgpDT05UQUlORVI9IiQoc2VkIC1uICdzL14gKmNvbnRhaW5lcl9uYW1lOiAqLy9wJyAiJERJUi9kb2NrZXItY29tcG9zZS55bWwiIDI+L2Rldi9udWxsIHwgaGVhZCAtbiAxKSIKQ09OVEFJTkVSPSIke0NPTlRBSU5FUjotd2hlcmRyfSIKIyBUaGUgZW52aXJvbm1lbnQgd2lucyBvdmVyIHBsdWdpbi5lbnYuCkVOVl9NT0RFPSIke1dIRVJEUl9NT0RFOi19IiBFTlZfUE9SVD0iJHtXSEVSRFJfUE9SVDotfSIgRU5WX0FQUF9VUkw9IiR7QVBQX1VSTDotfSIgRU5WX1JVTlRJTUU9IiR7V0hFUkRSX1JVTlRJTUU6LX0iCmlmIFsgLWYgIiRDT05GIiBdOyB0aGVuCiAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MxMDkwCiAgLiAiJENPTkYiCmZpCk1PREU9IiR7RU5WX01PREU6LSR7V0hFUkRSX01PREU6LX19IgpQT1JUPSIke0VOVl9QT1JUOi0ke1dIRVJEUl9QT1JUOi03NjgzfX0iCkFQUF9VUkw9IiR7RU5WX0FQUF9VUkw6LSR7QVBQX1VSTDotfX0iCiMgTmF0aXZlIG1vZGU6IGFic29sdXRlIHBhdGggb2YgdGhlIG5vZGUgKG9yIGJ1bikgdGhhdCBydW5zIHRoZSBzZXJ2ZXIuIEhlcmRyCiMgcnVucyBhY3Rpb25zIHdpdGggaXRzIHNlcnZlcidzIFBBVEgsIHdoaWNoIG9mdGVuIGxhY2tzIG52bSAvIG4gLyBmbm0gZm9sZGVycy4KUlVOVElNRT0iJHtFTlZfUlVOVElNRTotJHtXSEVSRFJfUlVOVElNRTotfX0iClVSTD0iaHR0cDovL2xvY2FsaG9zdDokUE9SVCIKCnNheSgpIHsgcHJpbnRmICclc1xuJyAiJCoiOyB9Cm9rKCkgeyBwcmludGYgJyAg4pyTICVzXG4nICIkKiI7IH0Kd2FybigpIHsgcHJpbnRmICcgICEgJXNcbicgIiQqIiA+JjI7IH0KZGllKCkgeyBwcmludGYgJyAg4pyXICVzXG4nICIkKiIgPiYyOyBleGl0IDE7IH0KCiMgQW55IEhUVFAgYW5zd2VyIGNvdW50cyAoYSBsb2NrZWQgd2hlcmRyIGFuc3dlcnMgNDAxKTogdGhlIHBvcnQgaXMgdGFrZW4uCmFuc3dlcnMoKSB7CiAgaWYgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgY29kZT0iJChjdXJsIC1zIC1vIC9kZXYvbnVsbCAtLW1heC10aW1lIDIgLXcgJyV7aHR0cF9jb2RlfScgImh0dHA6Ly8xMjcuMC4wLjE6JFBPUlQvIiAyPi9kZXYvbnVsbCB8fCB0cnVlKSIKICAgIFsgLW4gIiRjb2RlIiBdICYmIFsgIiRjb2RlIiAhPSAiMDAwIiBdCiAgZWxpZiBjb21tYW5kIC12IG5jID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgbmMgLXogMTI3LjAuMC4xICIkUE9SVCIgPi9kZXYvbnVsbCAyPiYxCiAgZWxzZQogICAgZGllICJjdXJsIG9yIG5jIGlzIG5lZWRlZCB0byBjaGVjayBwb3J0ICRQT1JULiIKICBmaQp9Cgpkb2NrZXJfdXNhYmxlKCkgewogIFsgIiQodW5hbWUgLXMpIiA9ICJMaW51eCIgXSB8fCByZXR1cm4gMQogIGNvbW1hbmQgLXYgZG9ja2VyID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMQogIGRvY2tlciBjb21wb3NlIHZlcnNpb24gPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAxCiAgZG9ja2VyIGluZm8gPi9kZXYvbnVsbCAyPiYxCn0KCiMgTWFqb3IgdmVyc2lvbiBvZiBhIG5vZGUgYmluYXJ5LCAwIHdoZW4gaXQgaXMgbm90IG9uZS4Kbm9kZV9tYWpvcigpIHsKICAiJDEiIC1wICdwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoIi4iKVswXScgMj4vZGV2L251bGwgfHwgZWNobyAwCn0KCiMgQSB1c2FibGUgcnVudGltZTogTm9kZS5qcyAyMiBvciBuZXdlciwgb3IgQnVuIChpdCBydW5zIHRoZSBidWlsdCBzZXJ2ZXIgdG9vKS4KcnVudGltZV9vaygpIHsKICBbIC1uICIkMSIgXSAmJiBbIC14ICIkMSIgXSAmJiBbICEgLWQgIiQxIiBdIHx8IHJldHVybiAxCiAgY2FzZSAiJChiYXNlbmFtZSAiJDEiKSIgaW4KICAgIGJ1bikgIiQxIiAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPiYxIDs7CiAgICAqKSBbICIkKG5vZGVfbWFqb3IgIiQxIikiIC1nZSAyMiBdIDI+L2Rldi9udWxsIDs7CiAgZXNhYwp9CgojIEFic29sdXRlIHBhdGggb2YgdGhlIHJ1bnRpbWU6IFdIRVJEUl9SVU5USU1FLCB0aGVuIG5vZGUgb24gdGhlIFBBVEgsIHRoZW4gdGhlCiMgdXN1YWwgaW5zdGFsbCBmb2xkZXJzIChuLCBudm0sIFZvbHRhLCBmbm0sIGFzZGYsIEhvbWVicmV3KSwgdGhlbiBCdW4uCiMgUHJpbnRzIG5vdGhpbmcgYW5kIGZhaWxzIHdoZW4gbm9uZSBpcyBmb3VuZC4KZmluZF9ydW50aW1lKCkgewogIGZvciBjIGluICIkUlVOVElNRSIgIiQoY29tbWFuZCAtdiBub2RlIDI+L2Rldi9udWxsIHx8IHRydWUpIiBcCiAgICAiJEhPTUUvLm4vYmluL25vZGUiICIke05fUFJFRklYOiskTl9QUkVGSVgvYmluL25vZGV9IiBcCiAgICAkKGxzIC1kICIkSE9NRSIvLm52bS92ZXJzaW9ucy9ub2RlL3YqL2Jpbi9ub2RlIDI+L2Rldi9udWxsIHwgc29ydCAtciAtVikgXAogICAgIiRIT01FLy52b2x0YS9iaW4vbm9kZSIgXAogICAgJChscyAtZCAiJEhPTUUiLy5sb2NhbC9zaGFyZS9mbm0vbm9kZS12ZXJzaW9ucy8qL2luc3RhbGxhdGlvbi9iaW4vbm9kZSAiJEhPTUUiLy5mbm0vbm9kZS12ZXJzaW9ucy8qL2luc3RhbGxhdGlvbi9iaW4vbm9kZSAyPi9kZXYvbnVsbCB8IHNvcnQgLXIgLVYpIFwKICAgICIkSE9NRS8uYXNkZi9zaGltcy9ub2RlIiAvb3B0L2hvbWVicmV3L2Jpbi9ub2RlIC91c3IvbG9jYWwvYmluL25vZGUgL3Vzci9iaW4vbm9kZSBcCiAgICAiJChjb21tYW5kIC12IGJ1biAyPi9kZXYvbnVsbCB8fCB0cnVlKSIgIiRIT01FLy5idW4vYmluL2J1biIgL29wdC9ob21lYnJldy9iaW4vYnVuIC91c3IvbG9jYWwvYmluL2J1bjsgZG8KICAgIGlmIHJ1bnRpbWVfb2sgIiRjIjsgdGhlbiBlY2hvICIkYyI7IHJldHVybiAwOyBmaQogIGRvbmUKICByZXR1cm4gMQp9CgpSVU5USU1FX0hFTFA9Ik5vZGUuanMgMjIgb3IgbmV3ZXIgKG9yIEJ1bikgaXMgcmVxdWlyZWQgdG8gcnVuIHdoZXJkciB3aXRob3V0IERvY2tlci4KICAgICBJbnN0YWxsIGl0IGZyb20gaHR0cHM6Ly9ub2RlanMub3JnLCBvciBzZXQgaXRzIGFic29sdXRlIHBhdGggaW4gJENPTkY6CiAgICAgICBXSEVSRFJfUlVOVElNRT0vcGF0aC90by9ub2RlIgoKaGVyZHJfYmluKCkgewogIGlmIFsgLW4gIiR7SEVSRFJfQklOX1BBVEg6LX0iIF07IHRoZW4gZWNobyAiJEhFUkRSX0JJTl9QQVRIIgogIGVsaWYgWyAteCAiJEhPTUUvLmxvY2FsL2Jpbi9oZXJkciIgXTsgdGhlbiBlY2hvICIkSE9NRS8ubG9jYWwvYmluL2hlcmRyIgogIGVsc2UgY29tbWFuZCAtdiBoZXJkciAyPi9kZXYvbnVsbCB8fCBlY2hvIGhlcmRyCiAgZmkKfQoKcmVhbF9kaXIoKSB7IChjZCAiJDEiIDI+L2Rldi9udWxsICYmIHB3ZCAtUCkgfHwgZWNobyAiJDEiOyB9CgojIENvbXBvc2UgZm9sZGVyIG9mIHRoZSBgd2hlcmRyYCBjb250YWluZXIsIGVtcHR5IHdoZW4gdGhlcmUgaXMgbm9uZS4KY29udGFpbmVyX2RpcigpIHsKICBkb2NrZXIgaW5zcGVjdCAiJENPTlRBSU5FUiIgLS1mb3JtYXQgJ3t7IGluZGV4IC5Db25maWcuTGFiZWxzICJjb20uZG9ja2VyLmNvbXBvc2UucHJvamVjdC53b3JraW5nX2RpciIgfX0nIDI+L2Rldi9udWxsIHx8IHRydWUKfQoKIyBUcnVlIHdoZW4gdGhlIGB3aGVyZHJgIGNvbnRhaW5lciBiZWxvbmdzIHRvICRESVIgKG9yIGRvZXMgbm90IGV4aXN0IHlldCkuCmNvbnRhaW5lcl9vdXJzKCkgewogIG93bmVyPSIkKGNvbnRhaW5lcl9kaXIpIgogIFsgLXogIiRvd25lciIgXSB8fCBbICIkKHJlYWxfZGlyICIkb3duZXIiKSIgPSAiJChyZWFsX2RpciAiJERJUiIpIiBdCn0KCmNvbXBvc2UoKSB7IGRvY2tlciBjb21wb3NlIC0tcHJvamVjdC1kaXJlY3RvcnkgIiRESVIiIC1mICIkRElSL2RvY2tlci1jb21wb3NlLnltbCIgIiRAIjsgfQoKd2FpdF91cCgpIHsKICBpPTAKICB3aGlsZSBbICIkaSIgLWx0ICIkezE6LTMwfSIgXTsgZG8KICAgIGlmIGFuc3dlcnM7IHRoZW4gcmV0dXJuIDA7IGZpCiAgICBpPSQoKGkgKyAxKSk7IHNsZWVwIDEKICBkb25lCiAgcmV0dXJuIDEKfQoKIyBUaGUgY29tbWFuZHMgb2YgdGhlIG5hdGl2ZSBtb2RlOiB0aGUgaW5zdGFsbGVkIGNvcHksIG9yIHRoZSBjaGVja291dCBpdHNlbGYKIyAoYSBsaW5rZWQgcGx1Z2luIGJ1aWx0IGJ5IGhhbmQsIG9yIGEgcGx1Z2luIGluc3RhbGxlZCBiZWZvcmUgJEFQUCBleGlzdGVkKS4KY2xpX3Jvb3QoKSB7CiAgaWYgWyAtZiAiJEFQUC9iaW4vd2hlcmRyLm1qcyIgXSAmJiBbIC1mICIkQVBQLy5vdXRwdXQvc2VydmVyL2luZGV4Lm1qcyIgXTsgdGhlbiBlY2hvICIkQVBQIjsgZWxzZSBlY2hvICIkUk9PVCI7IGZpCn0KCiMgVGhlIHBlcnNvbiBydW5uaW5nIGBoZXJkciBwbHVnaW4gaW5zdGFsbGAgc2VlcyBvbmx5IEhlcmRyJ3Mgb3duIGxpbmVzOiB0aGUKIyBvdXRwdXQgb2YgYnVpbGQgY29tbWFuZHMgaXMgY2FwdHVyZWQuIEltcG9ydGFudCBsaW5lcyBhbHNvIGdvIHRvIHRoZSB0ZXJtaW5hbC4KdGVsbCgpIHsKICBwcmludGYgJyVzXG4nICIkKiIKICB7IHByaW50ZiAnJXNcbicgIiQqIiA+IC9kZXYvdHR5OyB9IDI+L2Rldi9udWxsIHx8IHRydWUKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYnVpbGQKY21kX2J1aWxkKCkgewogIHRlbGwgIndoZXJkcjogaW5zdGFsbGluZyBpbiAkRElSIgogICMgRmlyc3QgaW5zdGFsbCAobm8gcGx1Z2luLmVudiB5ZXQpOiB0aGUgYnJvd3NlciBvcGVucyBvbiB0aGUgc2V0dXAgZ3VpZGUKICAjIG9uY2Ugd2hlcmRyIHJ1bnMuIFVwZGF0ZXMga2VlcCBwbHVnaW4uZW52IGFuZCBvcGVuIG5vdGhpbmcuCiAgRklSU1RfSU5TVEFMTD0wCiAgWyAtZiAiJENPTkYiIF0gfHwgRklSU1RfSU5TVEFMTD0xCiAgbWtkaXIgLXAgIiRESVIiCiAgcHJpbnRmICclc1xuJyAiJERJUiIgPiAiJFJPT1QvLndoZXJkci1kaXIiCgogIGlmIFsgLXogIiRNT0RFIiBdOyB0aGVuCiAgICBpZiBkb2NrZXJfdXNhYmxlOyB0aGVuIE1PREU9ZG9ja2VyOyBlbHNlIE1PREU9bmF0aXZlOyBmaQogIGZpCiAgY2FzZSAiJE1PREUiIGluCiAgICBkb2NrZXIpIGRvY2tlcl91c2FibGUgfHwgZGllICJXSEVSRFJfTU9ERT1kb2NrZXIsIGJ1dCBEb2NrZXIgQ29tcG9zZSB2MiBpcyBub3QgdXNhYmxlIGJ5ICQoaWQgLXVuKSBvbiB0aGlzIHN5c3RlbS4iIDs7CiAgICBuYXRpdmUpIDs7CiAgICAqKSBkaWUgIldIRVJEUl9NT0RFIG11c3QgYmUgZG9ja2VyIG9yIG5hdGl2ZSAoZ290OiAkTU9ERSkuIiA7OwogIGVzYWMKCiAgaWYgWyAiJE1PREUiID0gImRvY2tlciIgXTsgdGhlbiBidWlsZF9kb2NrZXI7IGVsc2UgYnVpbGRfbmF0aXZlOyBmaQogICMgV3JpdHRlbiBsYXN0OiBhIGZhaWxlZCBidWlsZCBrZWVwcyBubyBoYWxmLW1hZGUgY2hvaWNlLiBSZXdyaXR0ZW4gb24gZWFjaAogICMgaW5zdGFsbCBmcm9tIHRoZSBtZXJnZWQgc2V0dGluZ3MgKGVudmlyb25tZW50IG92ZXIgdGhlIHByZXZpb3VzIGZpbGUpLgogIHdyaXRlX2NvbmYKICBvayAicGx1Z2luLmVudiB3cml0dGVuIChtb2RlOiAkTU9ERSkiCiAgKCBjbWRfc2tpbGwgaW5zdGFsbCApIHx8IHdhcm4gIndoZXJkciBza2lsbCBub3QgbGlua2VkIChvcHRpb25hbCk6IHJ1biAkMCBza2lsbCBpbnN0YWxsIgogICggY21kX2tleSBpbnN0YWxsICkgfHwgd2FybiAibm8gSGVyZHIga2V5IGZvciB0aGUgcGFuZWwgKG9wdGlvbmFsKTogcnVuICQwIGtleSBpbnN0YWxsIgogIGJ1aWxkX3N0YXJ0Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNraWxsCiMgVGhlICJ3aGVyZHIiIGFnZW50IHNraWxsIChza2lsbHMvd2hlcmRyL1NLSUxMLm1kKTogdGhlIGNvbnZlbnRpb25zIG9mIHRoZQojIFByb2plY3QgcGFuZWwgZm9yIGhlcmRyLXByb2plY3RzIGNvb3JkaW5hdG9ycy4gQ29waWVkIHRvICRESVIvc2tpbGxzL3doZXJkcgojICh0aGUgY2hlY2tvdXQgaXMgYnVpbHQgaW4gYSB0ZW1wb3JhcnkgZm9sZGVyLCB0aGVuIG1vdmVkKSwgdGhlbiBsaW5rZWQgaW50bwojIHRoZSB1c2VyIHNraWxsIGZvbGRlcnM6IENsYXVkZSBDb2RlJ3MgJHtDTEFVREVfQ09ORklHX0RJUjotfi8uY2xhdWRlfS9za2lsbHMsCiMgYW5kIH4vLmFnZW50cy9za2lsbHMsIHJlYWQgYnkgQ29kZXggYW5kIG9tcC4gT25seSBsaW5rcyB0byB0aGF0IGNvcHkgYXJlCiMgZXZlciBjcmVhdGVkIG9yIHJlbW92ZWQ6IGEgIndoZXJkciIgc2tpbGwgb2Ygc29tZW9uZSBlbHNlIGlzIGxlZnQgYWxvbmUuClNLSUxMX0NPUFk9IiRESVIvc2tpbGxzL3doZXJkciIKCnNraWxsX2RpcnMoKSB7CiAgY2xhdWRlPSIke0NMQVVERV9DT05GSUdfRElSOi0kSE9NRS8uY2xhdWRlfSIKICBbIC1kICIkY2xhdWRlIiBdICYmIGVjaG8gIiRjbGF1ZGUvc2tpbGxzIgogIGlmIFsgLWQgIiRIT01FLy5hZ2VudHMiIF0gfHwgWyAtZCAiJEhPTUUvLmNvZGV4IiBdIHx8IFsgLWQgIiRIT01FLy5vbXAiIF07IHRoZW4gZWNobyAiJEhPTUUvLmFnZW50cy9za2lsbHMiOyBmaQogIHJldHVybiAwCn0KCmNtZF9za2lsbCgpIHsKICBjYXNlICIkezE6LX0iIGluCiAgICBpbnN0YWxsKQogICAgICBta2RpciAtcCAiJFNLSUxMX0NPUFkiCiAgICAgIGNwICIkUk9PVC9za2lsbHMvd2hlcmRyL1NLSUxMLm1kIiAiJFNLSUxMX0NPUFkvU0tJTEwubWQiCiAgICAgIHNraWxsX2RpcnMgfCB3aGlsZSBJRlM9IHJlYWQgLXIgZDsgZG8KICAgICAgICBsaW5rPSIkZC93aGVyZHIiCiAgICAgICAgaWYgWyAtTCAiJGxpbmsiIF0gJiYgWyAiJChyZWFkbGluayAiJGxpbmsiKSIgPSAiJFNLSUxMX0NPUFkiIF07IHRoZW4gb2sgInNraWxsIGFscmVhZHkgbGlua2VkOiAkbGluayIKICAgICAgICBlbGlmIFsgLWUgIiRsaW5rIiBdIHx8IFsgLUwgIiRsaW5rIiBdOyB0aGVuIHdhcm4gInNraWxsIG5vdCBsaW5rZWQ6ICRsaW5rIGFscmVhZHkgZXhpc3RzIChsZWZ0IGFsb25lKSIKICAgICAgICBlbHNlIG1rZGlyIC1wICIkZCIgJiYgbG4gLXMgIiRTS0lMTF9DT1BZIiAiJGxpbmsiICYmIG9rICJza2lsbCBsaW5rZWQ6ICRsaW5rIgogICAgICAgIGZpCiAgICAgIGRvbmUKICAgICAgOzsKICAgIHVuaW5zdGFsbCkKICAgICAgc2tpbGxfZGlycyB8IHdoaWxlIElGUz0gcmVhZCAtciBkOyBkbwogICAgICAgIGxpbms9IiRkL3doZXJkciIKICAgICAgICBpZiBbIC1MICIkbGluayIgXSAmJiBbICIkKHJlYWRsaW5rICIkbGluayIpIiA9ICIkU0tJTExfQ09QWSIgXTsgdGhlbiBybSAiJGxpbmsiICYmIG9rICJza2lsbCB1bmxpbmtlZDogJGxpbmsiOyBmaQogICAgICBkb25lCiAgICAgIHJtIC1yZiAiJFNLSUxMX0NPUFkiCiAgICAgIHJtZGlyICIkRElSL3NraWxscyIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICA7OwogICAgKikgZGllICJ1c2FnZTogJDAgc2tpbGwgaW5zdGFsbHx1bmluc3RhbGwiIDs7CiAgZXNhYwp9CgojIExhc3Qgc3RlcCBvZiB0aGUgaW5zdGFsbDogc3RhcnQgd2hlcmRyIChvciByZXN0YXJ0IHRoZSBvbmUgdGhpcyBwbHVnaW4KIyBydW5zLCBvbiBhbiB1cGRhdGUpLiBOZXZlciBmYWlscyB0aGUgaW5zdGFsbDogYSB3aGVyZHIgdGhhdCBjYW5ub3Qgc3RhcnQgaXMKIyByZXBvcnRlZCB3aXRoIHdoYXQgdG8gZG8sIHRoZSBwbHVnaW4gc3RheXMgaW5zdGFsbGVkLgpidWlsZF9zdGFydCgpIHsKICBzZXQgK2UKICBvdXQ9IiQoIChjbWRfc3RhcnQpIDI+JjEgKSIKICBjb2RlPSQ/CiAgc2V0IC1lCiAgcHJpbnRmICclc1xuJyAiJG91dCIKICBpZiBbICIkY29kZSIgLWVxIDAgXSAmJiBhbnN3ZXJzOyB0aGVuCiAgICAjIGh0dHBzOi8vd2hlcmRyLmRldi9pbnN0YWxsIHByaW50cyBpdHMgb3duIHN1bW1hcnkgKFdIRVJEUl9JTlNUQUxMRVI9MSkuCiAgICBxdWlldD0wCiAgICBbICIke1dIRVJEUl9JTlNUQUxMRVI6LTB9IiA9IDEgXSAmJiBxdWlldD0xCiAgICBbICIkcXVpZXQiID0gMSBdIHx8IHRlbGwgIiIKICAgIFsgIiRxdWlldCIgPSAxIF0gfHwgdGVsbCAi4pyTIHdoZXJkciBpcyBydW5uaW5nIOKGkiAkVVJMIgogICAgaWYgWyAiJHtGSVJTVF9JTlNUQUxMOi0wfSIgPSAxIF07IHRoZW4KICAgICAgaWYgb3Blbl9icm93c2VyICIkVVJMLyMvc2V0dXAiOyB0aGVuIFsgIiRxdWlldCIgPSAxIF0gfHwgdGVsbCAiICBTZXR1cCBndWlkZSBvcGVuZWQgaW4geW91ciBicm93c2VyIgogICAgICBlbHNlIFsgIiRxdWlldCIgPSAxIF0gfHwgdGVsbCAiICBTZXR1cCBndWlkZTogb3BlbiAkVVJMLyMvc2V0dXAgaW4gYSBicm93c2VyIG9uIHRoaXMgY29tcHV0ZXIiCiAgICAgIGZpCiAgICBmaQogICAgWyAiJHF1aWV0IiA9IDEgXSB8fCB0ZWxsICIgIFBob25lOiBvcGVuIHRoZSB3aGVyZHIgcGFuZWwgaW4gSGVyZHIgKGtleSBhYm92ZSwgb3IgaGVyZHIgcGx1Z2luIGFjdGlvbiBpbnZva2UgcGFuZWwgLS1wbHVnaW4gJFBMVUdJTl9JRCkiCiAgZWxzZQogICAgdGVsbCAiIgogICAgdGVsbCAiISB3aGVyZHIgaXMgaW5zdGFsbGVkIGJ1dCBkaWQgbm90IHN0YXJ0OiIKICAgIHByaW50ZiAnJXNcbicgIiRvdXQiIHwgdGFpbCAtbiA4IHwgd2hpbGUgSUZTPSByZWFkIC1yIGw7IGRvIHRlbGwgIiAgICAkbCI7IGRvbmUKICAgIHRlbGwgIiAgT3BlbiB0aGUgd2hlcmRyIHBhbmVsIGluIEhlcmRyLCB0aGVuIHByZXNzIFMgdG8gc3RhcnQgaXQgb3IgTCBmb3IgaXRzIGxvZy4iCiAgZmkKfQoKd3JpdGVfY29uZigpIHsKICB7CiAgICBlY2hvICIjIHdoZXJkciBIZXJkciBwbHVnaW4gc2V0dGluZ3MgKGhlcmRyLXBsdWdpbi5zaCkuIgogICAgZWNobyAiIyBUbyBzd2l0Y2ggbW9kZSwgc2V0IFdIRVJEUl9NT0RFIGFuZCBydW46IGhlcmRyIHBsdWdpbiBpbnN0YWxsICRTT1VSQ0UiCiAgICBlY2hvICJXSEVSRFJfTU9ERT0kTU9ERSIKICAgIGVjaG8gIldIRVJEUl9QT1JUPSRQT1JUIgogICAgZWNobyAiIyBOYXRpdmUgbW9kZTogcHJpdmF0ZSBIVFRQUyBhZGRyZXNzICh0YWlsc2NhbGUgc2VydmUpLCBmb3IgcHVzaCBub3RpZmljYXRpb25zLiIKICAgIGVjaG8gIkFQUF9VUkw9JHtBUFBfVVJMOi19IgogICAgaWYgWyAiJE1PREUiID0gIm5hdGl2ZSIgXTsgdGhlbgogICAgICBlY2hvICIjIE5hdGl2ZSBtb2RlOiBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBub2RlICgyMispIG9yIGJ1biB0aGF0IHJ1bnMgd2hlcmRyLiIKICAgICAgZWNobyAiV0hFUkRSX1JVTlRJTUU9JFJVTlRJTUUiCiAgICBmaQogIH0gPiAiJENPTkYiCn0KCiMgVGhlIHB1Ymxpc2hlZCBucG0gcGFja2FnZSBvZiB0aGlzIGV4YWN0IHZlcnNpb24gaG9sZHMgdGhlIGJ1aWx0IHNlcnZlcjoKIyBkb3dubG9hZCBpdCBpbnN0ZWFkIG9mIGJ1aWxkaW5nIChubyBucG0gY2kpLiBGYWlscyB3aGVuIGl0IGlzIG5vdCBwdWJsaXNoZWQuCmZldGNoX3ByZWJ1aWx0KCkgewogIGNvbW1hbmQgLXYgY3VybCA+L2Rldi9udWxsIDI+JjEgJiYgY29tbWFuZCAtdiB0YXIgPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAxCiAgdmVyc2lvbj0iJChzZWQgLW4gJ3MvXnZlcnNpb24gPSAiXCguKlwpIiQvXDEvcCcgIiRST09UL2hlcmRyLXBsdWdpbi50b21sIiB8IGhlYWQgLW4gMSkiCiAgdG1wPSIkKG1rdGVtcCAtZCkiCiAgaWYgY3VybCAtZnNTTCAtLW1heC10aW1lIDEyMCAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2hlcmRyLy0vd2hlcmRyLSR2ZXJzaW9uLnRneiIgLW8gIiR0bXAvd2hlcmRyLnRneiIgMj4vZGV2L251bGwgXAogICAgJiYgdGFyIC14emYgIiR0bXAvd2hlcmRyLnRneiIgLUMgIiR0bXAiIFwKICAgICYmIFsgLWYgIiR0bXAvcGFja2FnZS8ub3V0cHV0L3NlcnZlci9pbmRleC5tanMiIF07IHRoZW4KICAgIHJtIC1yZiAiJFJPT1QvLm91dHB1dCIKICAgIG12ICIkdG1wL3BhY2thZ2UvLm91dHB1dCIgIiRST09ULy5vdXRwdXQiCiAgICBybSAtcmYgIiR0bXAiCiAgICBvayAid2hlcmRyICR2ZXJzaW9uIGRvd25sb2FkZWQgKHByZWJ1aWx0IG5wbSBwYWNrYWdlKSIKICAgIHJldHVybiAwCiAgZmkKICBybSAtcmYgIiR0bXAiCiAgcmV0dXJuIDEKfQoKIyBxcmNvZGUtdGVybWluYWwgKHRoZSBwYW5lbCdzIFFSIGNvZGUpLCB0aGUgb25seSBwYWNrYWdlIHRoZSBjb21tYW5kcyBuZWVkCiMgYXQgcnVudGltZSwgd2hlbiB0aGUgZm9sZGVyIGRvZXMgbm90IGhhdmUgaXQgeWV0IChubyBucG0gY2kgd2FzIHJ1bikuCmZldGNoX3FyKCkgewogIFsgLWYgIiQxL25vZGVfbW9kdWxlcy9xcmNvZGUtdGVybWluYWwvcGFja2FnZS5qc29uIiBdICYmIHJldHVybiAwCiAgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMSAmJiBjb21tYW5kIC12IHRhciA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKICB0bXA9IiQobWt0ZW1wIC1kKSIKICBpZiBjdXJsIC1mc1NMIC0tbWF4LXRpbWUgNjAgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcXJjb2RlLXRlcm1pbmFsLy0vcXJjb2RlLXRlcm1pbmFsLTAuMTIuMC50Z3ogLW8gIiR0bXAvcXIudGd6IiAyPi9kZXYvbnVsbCBcCiAgICAmJiB0YXIgLXh6ZiAiJHRtcC9xci50Z3oiIC1DICIkdG1wIjsgdGhlbgogICAgbWtkaXIgLXAgIiQxL25vZGVfbW9kdWxlcyIKICAgIHJtIC1yZiAiJDEvbm9kZV9tb2R1bGVzL3FyY29kZS10ZXJtaW5hbCIKICAgIG12ICIkdG1wL3BhY2thZ2UiICIkMS9ub2RlX21vZHVsZXMvcXJjb2RlLXRlcm1pbmFsIgogIGVsc2UKICAgIHdhcm4gIk5vIFFSIGNvZGUgaW4gdGhlIHBhbmVsIChxcmNvZGUtdGVybWluYWwgY291bGQgbm90IGJlIGRvd25sb2FkZWQpLiIKICBmaQogIHJtIC1yZiAiJHRtcCIKfQoKYnVpbGRfbmF0aXZlKCkgewogIFJVTlRJTUU9IiQoZmluZF9ydW50aW1lKSIgfHwgZGllICIkUlVOVElNRV9IRUxQIgogIG9rICJSdW50aW1lOiAkUlVOVElNRSAoJCgiJFJVTlRJTUUiIC0tdmVyc2lvbiAyPi9kZXYvbnVsbCkpIgogIGlmIGZldGNoX3ByZWJ1aWx0OyB0aGVuCiAgICBpbnN0YWxsX2FwcAogICAgcmV0dXJuIDAKICBmaQogIGNhc2UgIiQoYmFzZW5hbWUgIiRSVU5USU1FIikiIGluCiAgICBidW4pIGRpZSAiVGhlIHByZWJ1aWx0IHdoZXJkciBwYWNrYWdlIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkLCBhbmQgYnVpbGRpbmcgaXQgbmVlZHMgTm9kZS5qcyAyMiB3aXRoIG5wbS4KICAgICBDaGVjayB0aGUgbmV0d29yaywgb3IgaW5zdGFsbCBOb2RlLmpzIDIyLCB0aGVuIGluc3RhbGwgdGhlIHBsdWdpbiBhZ2Fpbi4iIDs7CiAgZXNhYwogIGJpbmRpcj0iJChkaXJuYW1lICIkUlVOVElNRSIpIgogIFsgLXggIiRiaW5kaXIvbnBtIiBdIHx8IGNvbW1hbmQgLXYgbnBtID4vZGV2L251bGwgMj4mMSB8fCBkaWUgIm5wbSBpcyBtaXNzaW5nIChpdCBjb21lcyB3aXRoIE5vZGUuanMpLiIKICB0ZWxsICJ3aGVyZHI6IGJ1aWxkaW5nIChhIGZldyBtaW51dGVzIHRoZSBmaXJzdCB0aW1lKeKApiIKICAoCiAgICBjZCAiJFJPT1QiCiAgICBQQVRIPSIkYmluZGlyOiRQQVRIIiBucG0gY2kgLS1uby1hdWRpdCAtLW5vLWZ1bmQKICAgIFBBVEg9IiRiaW5kaXI6JFBBVEgiIG5wbSBydW4gYnVpbGQKICApCiAgb2sgIndoZXJkciBidWlsdCBpbiB0aGUgcGx1Z2luIGZvbGRlciIKICBpbnN0YWxsX2FwcAp9CgojIENvcGllcyB0aGUgY29tbWFuZHMgYW5kIHRoZSBidWlsdCBzZXJ2ZXIgdG8gJEFQUCwgd2hpY2ggb3V0bGl2ZXMgdGhpcwojIGNoZWNrb3V0LiBBIHdoZXJkciB0aGlzIHBsdWdpbiBydW5zIGZyb20gdGhlIHByZXZpb3VzIGNvcHkgaXMgc3RvcHBlZCBmb3IKIyB0aGUgc3dhcDsgYnVpbGRfc3RhcnQgc3RhcnRzIHRoZSBuZXcgb25lLgppbnN0YWxsX2FwcCgpIHsKICAjIE5pdHJvIGxpbmtzIHNvbWUgcGFja2FnZXMgKHRzbGliKSB0byBpdHMgb3duIGZvbGRlcjogY29waWVzLCBub3QgbGlua3MuCiAgaWYgWyAtZCAiJFJPT1QvLm91dHB1dC9zZXJ2ZXIvbm9kZV9tb2R1bGVzIiBdOyB0aGVuICIkUlVOVElNRSIgIiRST09UL3NjcmlwdHMvcGFjay1vdXRwdXQubWpzIiA+L2Rldi9udWxsOyBmaQogIG5ldz0iJEFQUC5uZXciCiAgcm0gLXJmICIkbmV3IgogIG1rZGlyIC1wICIkbmV3IgogIGNwIC1SICIkUk9PVC9iaW4iICIkUk9PVC8ub3V0cHV0IiAiJFJPT1QvcGFja2FnZS5qc29uIiAiJG5ldy8iCiAgaWYgWyAtZCAiJFJPT1Qvbm9kZV9tb2R1bGVzL3FyY29kZS10ZXJtaW5hbCIgXTsgdGhlbgogICAgbWtkaXIgLXAgIiRuZXcvbm9kZV9tb2R1bGVzIgogICAgY3AgLVIgIiRST09UL25vZGVfbW9kdWxlcy9xcmNvZGUtdGVybWluYWwiICIkbmV3L25vZGVfbW9kdWxlcy8iCiAgZmkKICBmZXRjaF9xciAiJG5ldyIKICAjIFRoZSB3aGVyZHIgdGhpcyBwbHVnaW4gcnVucyAoZnJvbSB0aGUgcHJldmlvdXMgY29weSwgb3IgZnJvbSBhbiBvbGRlcgogICMgcGx1Z2luIGNoZWNrb3V0KTogc3RvcHBlZCBmb3IgdGhlIHN3YXAsIHN0YXJ0ZWQgYWdhaW4gYnkgYnVpbGRfc3RhcnQuCiAgaWYgWyAtZiAiJERJUi93aGVyZHIucGlkIiBdIHx8IFsgLWYgIiRBUFAvYmluL3doZXJkci5tanMiIF07IHRoZW4gY2xpIHN0b3AgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWU7IGZpCiAgcm0gLXJmICIkQVBQLm9sZCIKICBpZiBbIC1kICIkQVBQIiBdOyB0aGVuIG12ICIkQVBQIiAiJEFQUC5vbGQiOyBmaQogIG12ICIkbmV3IiAiJEFQUCIKICBybSAtcmYgIiRBUFAub2xkIgogIG9rICJ3aGVyZHIgJChzZWQgLW4gJ3MvXiAqInZlcnNpb24iOiAqIlwoLipcKSIsJC9cMS9wJyAiJEFQUC9wYWNrYWdlLmpzb24iIHwgaGVhZCAtbiAxKSBpbnN0YWxsZWQgaW4gJEFQUCIKfQoKYnVpbGRfZG9ja2VyKCkgewogIG9rICJEb2NrZXIgJChkb2NrZXIgdmVyc2lvbiAtLWZvcm1hdCAne3suU2VydmVyLlZlcnNpb259fScgMj4vZGV2L251bGwgfHwgZWNobyAnPycpIgogIHN0YW1wPSIkRElSLy5jb21wb3NlLWZyb20tcGx1Z2luIgogIGlmIFsgISAtZiAiJERJUi9kb2NrZXItY29tcG9zZS55bWwiIF07IHRoZW4KICAgIGNwICIkUk9PVC9kb2NrZXItY29tcG9zZS55bWwiICIkRElSL2RvY2tlci1jb21wb3NlLnltbCIKICAgIGNrc3VtIDwgIiRESVIvZG9ja2VyLWNvbXBvc2UueW1sIiA+ICIkc3RhbXAiCiAgICBvayAiZG9ja2VyLWNvbXBvc2UueW1sIGNvcGllZCIKICBlbGlmIGNtcCAtcyAiJFJPT1QvZG9ja2VyLWNvbXBvc2UueW1sIiAiJERJUi9kb2NrZXItY29tcG9zZS55bWwiOyB0aGVuCiAgICBvayAiZG9ja2VyLWNvbXBvc2UueW1sIGlzIHVwIHRvIGRhdGUiCiAgZWxpZiBbIC1mICIkc3RhbXAiIF0gJiYgWyAiJChja3N1bSA8ICIkRElSL2RvY2tlci1jb21wb3NlLnltbCIpIiA9ICIkKGNhdCAiJHN0YW1wIikiIF07IHRoZW4KICAgICMgVW5jaGFuZ2VkIHNpbmNlIHRoZSBwbHVnaW4gd3JvdGUgaXQ6IHNhZmUgdG8gcmVmcmVzaC4KICAgIGNwICIkUk9PVC9kb2NrZXItY29tcG9zZS55bWwiICIkRElSL2RvY2tlci1jb21wb3NlLnltbCIKICAgIGNrc3VtIDwgIiRESVIvZG9ja2VyLWNvbXBvc2UueW1sIiA+ICIkc3RhbXAiCiAgICBvayAiZG9ja2VyLWNvbXBvc2UueW1sIHVwZGF0ZWQiCiAgZWxzZQogICAgd2FybiAiS2VlcGluZyB5b3VyIGVkaXRlZCBkb2NrZXItY29tcG9zZS55bWwgKHRoZSBuZXcgb25lIGlzICRST09UL2RvY2tlci1jb21wb3NlLnltbCkuIgogIGZpCiAgaWYgWyAhIC1mICIkRElSLy5lbnYiIF07IHRoZW4KICAgIGhlcmRyPSIkKGhlcmRyX2JpbikiCiAgICB7CiAgICAgIGVjaG8gIiMgd2hlcmRyIHNldHRpbmdzLCByZWFkIGJ5IGRvY2tlciBjb21wb3NlIChzZWUgLmVudi5leGFtcGxlIGluIHRoZSByZXBvc2l0b3J5KS4iCiAgICAgIGVjaG8gIkhPU1RfSE9NRT0kSE9NRSIKICAgICAgZWNobyAiUFVJRD0kKGlkIC11KSIKICAgICAgZWNobyAiUEdJRD0kKGlkIC1nKSIKICAgICAgZWNobyAiUE9SVD0kUE9SVCIKICAgICAgZWNobyAiIyBQcml2YXRlIEhUVFBTIGFkZHJlc3MgKHRhaWxzY2FsZSBzZXJ2ZSksIG5lZWRlZCBmb3IgcHVzaCBub3RpZmljYXRpb25zLiIKICAgICAgZWNobyAiQVBQX1VSTD0ke0FQUF9VUkw6LWh0dHA6Ly9sb2NhbGhvc3Q6JFBPUlQvfSIKICAgICAgZWNobyAiVFo9JHtUWjotVVRDfSIKICAgICAgaWYgWyAiJGhlcmRyIiAhPSAiJEhPTUUvLmxvY2FsL2Jpbi9oZXJkciIgXTsgdGhlbiBlY2hvICJIRVJEUl9CSU49JGhlcmRyIjsgZmkKICAgIH0gPiAiJERJUi8uZW52IgogICAgb2sgIi5lbnYgY3JlYXRlZCIKICBlbHNlCiAgICBvayAiLmVudiBrZXB0IgogIGZpCiAgY29tcG9zZSBwdWxsIC0tcXVpZXQgfHwgZGllICJDb3VsZCBub3QgcHVsbCB0aGUgd2hlcmRyIGltYWdlLiBDaGVjayB0aGUgbmV0d29yaywgdGhlbiBpbnN0YWxsIHRoZSBwbHVnaW4gYWdhaW4uIgogIG9rICJJbWFnZSBwdWxsZWQiCiAgIyBUaGUgcGFuZWwgcnVucyBmcm9tIHRoZSBjaGVja291dCB3aXRoIG5vZGUgd2hlbiB0aGVyZSBpcyBvbmUuCiAgZmV0Y2hfcXIgIiRST09UIgp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGFydApjbWRfc3RhcnQoKSB7CiAgaWYgYW5zd2VyczsgdGhlbgogICAgc2F5ICJ3aGVyZHI6IHNvbWV0aGluZyBhbHJlYWR5IGFuc3dlcnMgb24gcG9ydCAkUE9SVCwgbm90aGluZyB0byBzdGFydCAoJFVSTCkuIgogICAgcmV0dXJuIDAKICBmaQogIGNhc2UgIiRNT0RFIiBpbgogICAgZG9ja2VyKSBzdGFydF9kb2NrZXIgOzsKICAgIG5hdGl2ZSkgc3RhcnRfbmF0aXZlIDs7CiAgICAqKSBkaWUgIndoZXJkciBwbHVnaW4gaXMgbm90IHNldCB1cCAoJENPTkYgaXMgbWlzc2luZyk6IGluc3RhbGwgaXQgYWdhaW4gd2l0aCBoZXJkciBwbHVnaW4gaW5zdGFsbCAkU09VUkNFLiIgOzsKICBlc2FjCiAgaWYgWyAiJE1PREUiID0gIm5hdGl2ZSIgXTsgdGhlbiByZXR1cm4gMDsgZmkKICBpZiB3YWl0X3VwIDQ1OyB0aGVuCiAgICBzYXkgIndoZXJkciBpcyBydW5uaW5nOiAkVVJMIgogIGVsc2UKICAgIHdhcm4gIndoZXJkciBkb2VzIG5vdCBhbnN3ZXIgb24gcG9ydCAkUE9SVCB5ZXQuIExvZzogJChsb2dfaGludCkiCiAgICBleGl0IDEKICBmaQp9CgojIE5hdGl2ZSBtb2RlOiB0aGUgd2hlcmRyIGNvbW1hbmQgKGJpbi93aGVyZHIubWpzKSBkb2VzIHRoZSB3b3JrLCB3aXRoIHRoZQojIHJ1bnRpbWUgc2F2ZWQgYXQgaW5zdGFsbDsgaXQgc2F5cyAic3RhcnRlZCIgb25seSBvbmNlIHRoZSBwb3J0IGFuc3dlcnMuCmVuc3VyZV9ydW50aW1lKCkgewogIGlmICEgcnVudGltZV9vayAiJFJVTlRJTUUiOyB0aGVuCiAgICBzYXZlZD0iJFJVTlRJTUUiCiAgICBSVU5USU1FPSIkKGZpbmRfcnVudGltZSkiIHx8IGRpZSAiJHtzYXZlZDorVGhlIHNhdmVkIHJ1bnRpbWUgKCRzYXZlZCkgaXMgZ29uZS4gfSRSVU5USU1FX0hFTFAiCiAgICB3YXJuICIke3NhdmVkOiskc2F2ZWQgaXMgZ29uZTogfXVzaW5nICRSVU5USU1FIChzYXZlZCBpbiAkQ09ORikuIgogICAgd3JpdGVfY29uZgogIGZpCn0KCmNsaSgpIHsKICBlbnN1cmVfcnVudGltZQogIHNvY2s9IiR7SEVSRFJfU09DS0VUX1BBVEg6LX0iCiAgIyBBIHBsdWdpbiBzdGFydGVkIGZyb20gYSBuYW1lZCBIZXJkciBzZXNzaW9uIGRyaXZlcyB0aGF0IHNlc3Npb24uCiAgc2Vzc2lvbj0iIgogIGNhc2UgIiRzb2NrIiBpbiAqL3Nlc3Npb25zLyovaGVyZHIuc29jaykgc2Vzc2lvbj0iJChiYXNlbmFtZSAiJChkaXJuYW1lICIkc29jayIpIikiIDs7IGVzYWMKICAoCiAgICBjZCAiJERJUiIKICAgIEhFUkRSX0JJTj0iJChoZXJkcl9iaW4pIgogICAgIyBUaGUgcnVudGltZSdzIGZvbGRlciBmaXJzdDogdG9vbHMgaXQgc3RhcnRzIGZpbmQgdGhlIHNhbWUgbm9kZS4KICAgIFBBVEg9IiQoZGlybmFtZSAiJFJVTlRJTUUiKTokUEFUSCIKICAgIGV4cG9ydCBQQVRIIFdIRVJEUl9ESVI9IiRESVIiIFdIRVJEUl9SVU5USU1FPSIkUlVOVElNRSIgSE9TVD0xMjcuMC4wLjEgUE9SVCBIRVJEUl9CSU4KICAgIGlmIFsgLW4gIiRzZXNzaW9uIiBdOyB0aGVuIGV4cG9ydCBIRVJEUl9XRUJfU0VTU0lPTj0iJHNlc3Npb24iOyBmaQogICAgaWYgWyAtbiAiJHNvY2siIF07IHRoZW4gZXhwb3J0IEhFUkRSX1NPQ0s9IiRzb2NrIjsgZmkKICAgIGlmIFsgLW4gIiR7QVBQX1VSTDotfSIgXTsgdGhlbiBleHBvcnQgQVBQX1VSTDsgZmkKICAgIGV4ZWMgIiRSVU5USU1FIiAiJChjbGlfcm9vdCkvYmluL3doZXJkci5tanMiICIkQCIKICApCn0KCnN0YXJ0X25hdGl2ZSgpIHsKICBbIC1mICIkKGNsaV9yb290KS8ub3V0cHV0L3NlcnZlci9pbmRleC5tanMiIF0gfHwgZGllICJ3aGVyZHIgaXMgbm90IGJ1aWx0OiBpbnN0YWxsIHRoZSBwbHVnaW4gYWdhaW4gKGhlcmRyIHBsdWdpbiBpbnN0YWxsICRTT1VSQ0UgLS15ZXMpLiIKICBta2RpciAtcCAiJERJUiIKICBjbGkgc3RhcnQKfQoKc3RhcnRfZG9ja2VyKCkgewogIFsgLWYgIiRESVIvZG9ja2VyLWNvbXBvc2UueW1sIiBdIHx8IGRpZSAiJERJUi9kb2NrZXItY29tcG9zZS55bWwgaXMgbWlzc2luZzogcnVuIHRoZSBVcGRhdGUgYWN0aW9uLiIKICBpZiAhIGNvbnRhaW5lcl9vdXJzOyB0aGVuCiAgICBzYXkgIndoZXJkcjogdGhlIFwiJENPTlRBSU5FUlwiIGNvbnRhaW5lciBiZWxvbmdzIHRvICQoY29udGFpbmVyX2Rpcik7IHN0YXJ0IGl0IGZyb20gdGhlcmUuIE5vdGhpbmcgZG9uZS4iCiAgICBleGl0IDAKICBmaQogICMgQ3JlYXRlZCBhcyB0aGlzIHVzZXIgZmlyc3Q6IERvY2tlciB3b3VsZCBjcmVhdGUgbWlzc2luZyBiaW5kIG1vdW50cyBhcyByb290LgogIG1rZGlyIC1wICIkRElSL2RhdGEiICIkSE9NRS8uY29uZmlnL2hlcmRyIiAiJEhPTUUvLmxvY2FsL3N0YXRlL2hlcmRyL2NsaWVudCIgXAogICAgIiRIT01FLy5jYWNoZS9oZXJkci13ZWIiICIkSE9NRS8uaGVyZHItcHJvamVjdHMiCiAgY29tcG9zZSB1cCAtZCAtLXJlbW92ZS1vcnBoYW5zCiAgb2sgImNvbnRhaW5lciBzdGFydGVkIgp9Cgpsb2dfaGludCgpIHsgZWNobyAiY2QgJERJUiAmJiBkb2NrZXIgY29tcG9zZSBsb2dzIjsgfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0b3AKY21kX3N0b3AoKSB7CiAgY2FzZSAiJE1PREUiIGluCiAgICBuYXRpdmUpIGNsaSBzdG9wOyByZXR1cm4gMCA7OwogICAgZG9ja2VyKQogICAgICBpZiBbIC1uICIkKGNvbnRhaW5lcl9kaXIpIiBdICYmIGNvbnRhaW5lcl9vdXJzOyB0aGVuCiAgICAgICAgY29tcG9zZSBzdG9wCiAgICAgICAgc2F5ICJ3aGVyZHIgc3RvcHBlZCAoY29udGFpbmVyICRDT05UQUlORVIpLiIKICAgICAgICByZXR1cm4gMAogICAgICBmaQogICAgICA7OwogIGVzYWMKICBpZiBhbnN3ZXJzOyB0aGVuCiAgICBzYXkgIndoZXJkciBvbiBwb3J0ICRQT1JUIHdhcyBub3Qgc3RhcnRlZCBieSB0aGlzIHBsdWdpbjogbGVmdCBydW5uaW5nLiIKICBlbHNlCiAgICBzYXkgIndoZXJkciBpcyBub3QgcnVubmluZy4iCiAgZmkKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGF0dXMKY21kX3N0YXR1cygpIHsKICBpZiBbICIkTU9ERSIgPSAibmF0aXZlIiBdOyB0aGVuCiAgICBjbGkgc3RhdHVzCiAgICBzYXkgIiAgUGx1Z2luICAgbmF0aXZlIG1vZGUsIHNldHRpbmdzIGluICRDT05GIgogICAgcmV0dXJuIDAKICBmaQogIHNheSAiTW9kZTogICAgJHtNT0RFOi1ub3Qgc2V0IHVwfSIKICBzYXkgIkZvbGRlcjogICRESVIiCiAgaWYgYW5zd2VyczsgdGhlbiBzYXkgIlBvcnQ6ICAgICRQT1JUIGFuc3dlcnMgKCRVUkwpIjsgZWxzZSBzYXkgIlBvcnQ6ICAgICRQT1JUIGZyZWUiOyBmaQogIGlmIFsgIiRNT0RFIiA9ICJkb2NrZXIiIF07IHRoZW4KICAgIG93bmVyPSIkKGNvbnRhaW5lcl9kaXIpIgogICAgaWYgWyAteiAiJG93bmVyIiBdOyB0aGVuIHNheSAiQ29udGFpbmVyOiBub25lIgogICAgZWxpZiBjb250YWluZXJfb3VyczsgdGhlbiBzYXkgIkNvbnRhaW5lcjogJENPTlRBSU5FUiAoJChkb2NrZXIgaW5zcGVjdCAiJENPTlRBSU5FUiIgLS1mb3JtYXQgJ3t7LlN0YXRlLlN0YXR1c319JyAyPi9kZXYvbnVsbCkpLCBtYW5hZ2VkIGJ5IHRoZSBwbHVnaW4iCiAgICBlbHNlIHNheSAiQ29udGFpbmVyOiAkQ09OVEFJTkVSLCBtYW5hZ2VkIGZyb20gJG93bmVyIChsZWZ0IGFsb25lKSIKICAgIGZpCiAgZmkKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGxvZ3MsIGRvY3RvcgpjbWRfbG9ncygpIHsKICBjYXNlICIkTU9ERSIgaW4KICAgIG5hdGl2ZSkgY2xpIGxvZ3MgLS1mb2xsb3cgOzsKICAgIGRvY2tlcikgY29tcG9zZSBsb2dzIC0tZm9sbG93IC0tdGFpbCAxMDAgOzsKICAgICopIGRpZSAid2hlcmRyIHBsdWdpbiBpcyBub3Qgc2V0IHVwOiBpbnN0YWxsIGl0IGFnYWluIHdpdGggaGVyZHIgcGx1Z2luIGluc3RhbGwgJFNPVVJDRS4iIDs7CiAgZXNhYwp9CgpjbWRfZG9jdG9yKCkgewogIGlmIFsgIiRNT0RFIiA9ICJuYXRpdmUiIF07IHRoZW4gY2xpIGRvY3RvcjsgZWxzZSBjbWRfc3RhdHVzOyBmaQp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gb3BlbgojIFRoZSBkZWZhdWx0IGJyb3dzZXIsIG9uIGEgY29tcHV0ZXIgd2l0aCBhIHNjcmVlbiBvbmx5OiBgb3BlbmAgb24gbWFjT1MsCiMgYHhkZy1vcGVuYCBvbiBMaW51eCB3aXRoIGEgZGlzcGxheS4gRmFpbHMgKG9wZW5zIG5vdGhpbmcpIG9uIGEgaGVhZGxlc3Mgc2VydmVyLAojIG9yIHdpdGggV0hFUkRSX05PX0JST1dTRVI9MSAoc2V0IGJ5IGh0dHBzOi8vd2hlcmRyLmRldi9pbnN0YWxsIG92ZXIgU1NIKS4Kb3Blbl9icm93c2VyKCkgewogIGlmIFsgIiR7V0hFUkRSX05PX0JST1dTRVI6LTB9IiA9ICIxIiBdOyB0aGVuIHJldHVybiAxCiAgZWxpZiBbICIkKHVuYW1lIC1zKSIgPSAiRGFyd2luIiBdICYmIGNvbW1hbmQgLXYgb3BlbiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gb3BlbiAiJDEiCiAgZWxpZiBbIC1uICIke0RJU1BMQVk6LX0ke1dBWUxBTkRfRElTUExBWTotfSIgXSAmJiBjb21tYW5kIC12IHhkZy1vcGVuID4vZGV2L251bGwgMj4mMTsgdGhlbiB4ZGctb3BlbiAiJDEiID4vZGV2L251bGwgMj4mMSAmCiAgZWxzZSByZXR1cm4gMQogIGZpCn0KCmNtZF9vcGVuKCkgewogIG9wZW5fYnJvd3NlciAiJFVSTCIgfHwgdHJ1ZQogIHNheSAiJFVSTCIKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB1cGRhdGUKY21kX3VwZGF0ZSgpIHsKICBjYXNlICIkTU9ERSIgaW4KICAgIGRvY2tlcikKICAgICAgY29udGFpbmVyX291cnMgfHwgZGllICJUaGUgXCIkQ09OVEFJTkVSXCIgY29udGFpbmVyIGJlbG9uZ3MgdG8gJChjb250YWluZXJfZGlyKTogdXBkYXRlIGl0IGZyb20gdGhlcmUuIgogICAgICBjb21wb3NlIHB1bGwgLS1xdWlldAogICAgICBpZiBbICIkKGRvY2tlciBpbnNwZWN0ICIkQ09OVEFJTkVSIiAtLWZvcm1hdCAne3suU3RhdGUuUnVubmluZ319JyAyPi9kZXYvbnVsbCkiID0gInRydWUiIF07IHRoZW4KICAgICAgICBjb21wb3NlIHVwIC1kIC0tcmVtb3ZlLW9ycGhhbnMKICAgICAgICBzYXkgIndoZXJkciB1cGRhdGVkIGFuZCByZXN0YXJ0ZWQuIgogICAgICBlbHNlCiAgICAgICAgc2F5ICJ3aGVyZHIgaW1hZ2UgdXBkYXRlZDsgaXQgcnVucyB0aGUgbmV3IHZlcnNpb24gYXQgdGhlIG5leHQgc3RhcnQuIgogICAgICBmaQogICAgICA7OwogICAgbmF0aXZlKQogICAgICAjIEEgbmV3IGNoZWNrb3V0LCBhIG5ldyBjb3B5IGluICRBUFAsIGFuZCB3aGVyZHIgcmVzdGFydGVkIChidWlsZF9zdGFydCkuCiAgICAgIHNheSAiVXBkYXRpbmcgdGhlIHdoZXJkciBwbHVnaW4gZnJvbSAkU09VUkNF4oCmIgogICAgICAiJChoZXJkcl9iaW4pIiBwbHVnaW4gaW5zdGFsbCAiJFNPVVJDRSIgLS15ZXMKICAgICAgOzsKICAgICopIGRpZSAid2hlcmRyIHBsdWdpbiBpcyBub3Qgc2V0IHVwOiBpbnN0YWxsIGl0IGFnYWluIHdpdGggaGVyZHIgcGx1Z2luIGluc3RhbGwgJFNPVVJDRS4iIDs7CiAgZXNhYwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaG9uZQp0YWlsbmV0X25hbWUoKSB7CiAgY29tbWFuZCAtdiB0YWlsc2NhbGUgPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAxCiAgIyBTZWxmIGNvbWVzIGJlZm9yZSBQZWVyIGluIGB0YWlsc2NhbGUgc3RhdHVzIC0tanNvbmA6IHRoZSBmaXJzdCBETlNOYW1lIGlzIHRoaXMgbWFjaGluZS4KICB0YWlsc2NhbGUgc3RhdHVzIC0tanNvbiAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy8uKiJETlNOYW1lIjogKiJcKFteIl0qXClcLiIuKi9cMS9wJyB8IGhlYWQgLW4gMQp9CgojIFRoZSBwaG9uZSBzZXR1cCBpcyBhIHBhZ2Ugb2YgdGhlIGFwcCAoU2V0dGluZ3Mg4oC6IFBob25lKTsgYHdoZXJkciBwaG9uZWAKIyBwcmludHMgdGhlIHN0YXRlIGFuZCBpdHMgbGluay4gRG9ja2VyIHdpdGhvdXQgTm9kZS5qczogdGhlIHN0ZXBzIGJ5IGhhbmQuCmNtZF9waG9uZSgpIHsKICBpZiBbICIkTU9ERSIgPSAibmF0aXZlIiBdOyB0aGVuIGNsaSBwaG9uZTsgcmV0dXJuIDA7IGZpCiAgc2F5ICIiCiAgc2F5ICIgIFdIRVJEUiDCtyBQSE9ORSBTRVRVUCIKICBzYXkgIiIKICBpZiBhbnN3ZXJzOyB0aGVuIHNheSAiICDinJMgd2hlcmRyIGFuc3dlcnMgb24gJFVSTCI7IGVsc2Ugc2F5ICIgICEgd2hlcmRyIGlzIG5vdCBydW5uaW5nOiBwcmVzcyBTIGluIHRoZSB3aGVyZHIgcGFuZWwgZmlyc3QuIjsgZmkKICBuYW1lPSIkKHRhaWxuZXRfbmFtZSB8fCB0cnVlKSIKICBzYXkgIiIKICBzYXkgIiAgWW91ciBwaG9uZSBuZWVkcyBhIHByaXZhdGUgSFRUUFMgYWRkcmVzcyAobmV2ZXIgdGhlIHB1YmxpYyBJbnRlcm5ldCk6IgogIHNheSAiICAxLiBJbnN0YWxsIFRhaWxzY2FsZSBvbiB0aGlzIG1hY2hpbmUgYW5kIHlvdXIgcGhvbmUsIEhUVFBTIGNlcnRpZmljYXRlcyBlbmFibGVkLiIKICBzYXkgIiAgMi4gUnVuOiAgdGFpbHNjYWxlIHNlcnZlIC0tYmcgLS1odHRwcz0kUE9SVCBodHRwOi8vMTI3LjAuMC4xOiRQT1JUIgogIGlmIFsgLW4gIiRuYW1lIiBdOyB0aGVuCiAgICBwaG9uZT0iaHR0cHM6Ly8kbmFtZTokUE9SVC8iCiAgICBzYXkgIiAgMy4gT3BlbiAgJHBob25lICBvbiB0aGUgcGhvbmUgYW5kIGFkZCBpdCB0byB0aGUgaG9tZSBzY3JlZW4uIgogIGVsc2UKICAgIHBob25lPSIiCiAgICBzYXkgIiAgMy4gT3BlbiAgaHR0cHM6Ly88bWFjaGluZT4uPHRhaWxuZXQ+LnRzLm5ldDokUE9SVC8gIG9uIHRoZSBwaG9uZSwgYWRkIGl0IHRvIHRoZSBob21lIHNjcmVlbi4iCiAgZmkKICBzYXkgIiAgNC4gVGhlbiBvcGVuICRVUkwvIy9zZXR0aW5ncz9zZWN0aW9uPXBob25lOiB3aGVyZHIgY2hlY2tzIHRoZSBhZGRyZXNzIGFuZCBzZXRzIEFQUF9VUkwgaXRzZWxmLiIKICBzYXkgIiAgNS4gSW4gdGhlIGFwcDogU2V0dGluZ3Mg4oaSIEVuYWJsZSBub3RpZmljYXRpb25zLCB0aGVuIFNlY3VyaXR5IOKGkiBFbmFibGUgcGFzc2tleSBsb2NrLiIKICAjIFRoZSBRUiBjb2RlIG9ubHkgZm9yIGFuIGFkZHJlc3MgdGhhdCBhbnN3ZXJzIGxpa2Ugd2hlcmRyLgogIGlmIFsgLW4gIiRwaG9uZSIgXSAmJiBjb21tYW5kIC12IGN1cmwgPi9kZXYvbnVsbCAyPiYxIFwKICAgICYmIGN1cmwgLWZzUyAtLW1heC10aW1lIDggIiR7cGhvbmV9bWFuaWZlc3Qud2VibWFuaWZlc3QiIDI+L2Rldi9udWxsIHwgZ3JlcCAtcSB3aGVyZHI7IHRoZW4KICAgIHNheSAiIgogICAgaWYgY29tbWFuZCAtdiBxcmVuY29kZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcXJlbmNvZGUgLXQgQU5TSVVURjggLW0gMiAiJHBob25lIgogICAgZWxzZQogICAgICBzYXkgIiAgKEluc3RhbGwgcXJlbmNvZGUgdG8gc2hvdyBhIFFSIGNvZGUgb2YgJHBob25lIGhlcmUuKSIKICAgIGZpCiAgZWxpZiBbIC1uICIkcGhvbmUiIF07IHRoZW4KICAgIHNheSAiIgogICAgc2F5ICIgICEgTm90IHJlYWNoYWJsZSBmcm9tIHlvdXIgcGhvbmUgeWV0OiAkcGhvbmUgZG9lcyBub3QgYW5zd2VyIChzdGVwIDIpLiIKICBmaQogIHNheSAiIgogIHNheSAiICBHdWlkZTogaHR0cHM6Ly9naXRodWIuY29tLyRTT1VSQ0UjaW5zdGFsbC1pdC1hcy1hbi1hcHAiCn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNlcnZpY2UKY21kX3NlcnZpY2UoKSB7CiAgY2FzZSAiJHsxOi19IiBpbiBpbnN0YWxsfHVuaW5zdGFsbCkgOzsgKikgZGllICJ1c2FnZTogJDAgc2VydmljZSBpbnN0YWxsfHVuaW5zdGFsbCIgOzsgZXNhYwogIGlmIFsgIiRNT0RFIiA9ICJkb2NrZXIiIF07IHRoZW4KICAgIHNheSAid2hlcmRyIHJ1bnMgaW4gRG9ja2VyOiB0aGUgY29udGFpbmVyIGFscmVhZHkgc3RhcnRzIHdpdGggRG9ja2VyIChyZXN0YXJ0OiBhbHdheXMpLiIKICAgIHJldHVybiAwCiAgZmkKICBjbGkgc2VydmljZSAiJDEiCiAgIyBXaXRob3V0IHRoZSBzZXJ2aWNlLCB0aGUgcGx1Z2luIHJ1bnMgd2hlcmRyIGFnYWluIChhbmQgaXRzIHN0YXJ0dXAgaG9vawogICMgc3RhcnRzIGl0IHdpdGggSGVyZHIpLgogIGlmIFsgIiQxIiA9ICJ1bmluc3RhbGwiIF07IHRoZW4gY21kX3N0YXJ0OyBmaQp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBrZXkKIyBBIEhlcmRyIGtleSB0aGF0IG9wZW5zIHRoZSB3aGVyZHIgcGFuZWw6IEhlcmRyIHYxIHBsdWdpbnMgaGF2ZSBubyBtZW51LCBzbwojIHRoZSBpbnN0YWxsIGFwcGVuZHMgb25lIG1hcmtlZCBbW2tleXMuY29tbWFuZF1dIGJsb2NrIHRvIEhlcmRyJ3MKIyBjb25maWcudG9tbCwgb24gdGhlIGZpcnN0IGZyZWUga2V5IG9mIEhPVEtFWVMgKG5ldmVyIG9uZSBIZXJkciBvciB0aGUgdXNlcgojIGFscmVhZHkgYmluZHMpLiBFeGlzdGluZyBsaW5lcyBhcmUgbmV2ZXIgY2hhbmdlZDogdGhlIGJsb2NrIGlzIG9ubHkgZXZlcgojIGFwcGVuZGVkLCB0aGVuIHJlbW92ZWQgYnkgYGtleSB1bmluc3RhbGxgLiBOb3RoaW5nIGlzIGFkZGVkIHdoZW4gdGhlIHBhbmVsCiMgYWxyZWFkeSBoYXMgYSBrZXksIG9yIHdoZW4gbm8gY2FuZGlkYXRlIGlzIGZyZWUuCkhPVEtFWVM9IiR7V0hFUkRSX0hPVEtFWVM6LXByZWZpeCtpIHByZWZpeCt1IHByZWZpeCt5IHByZWZpeCttIHByZWZpeCthbHQrd30iCkhFUkRSX0NPTkZJRz0iJHtIRVJEUl9DT05GSUdfUEFUSDotJHtYREdfQ09ORklHX0hPTUU6LSRIT01FLy5jb25maWd9L2hlcmRyL2NvbmZpZy50b21sfSIKUExVR0lOX0lEPSIkKHByaW50ZiAnJXMnICIkU09VUkNFIiB8IHRyIC8gLikiClBBTkVMX0FDVElPTj0iJFBMVUdJTl9JRC5wYW5lbCIKS0VZX0JFR0lOPSIjIHdoZXJkcjoga2V5IHRoYXQgb3BlbnMgdGhlIHdoZXJkciBwYW5lbCAocmVtb3ZlIHRoaXMgYmxvY2sgdG8gdW5iaW5kIGl0KSIKS0VZX0VORD0iIyBlbmQgd2hlcmRyIgoKIyBIZXJkcidzIGRlZmF1bHQga2V5bWFwLCBmcm9tIHRoZSBydW5uaW5nIGJpbmFyeSB3aGVuIGl0IGNhbiBwcmludCBpdCwKIyBvdGhlcndpc2UgYXMgb2YgSGVyZHIgMC45LjMgKCJuYW1lPFRBQj5rZXkiIGxpbmVzKS4KZGVmYXVsdF9rZXlzKCkgewogIG91dD0iJCgiJChoZXJkcl9iaW4pIiAtLWRlZmF1bHQtY29uZmlnIDI+L2Rldi9udWxsIHwgYXdrICcKICAgIC9eXFtrZXlzXF0vIHsgayA9IDE7IG5leHQgfQogICAgayAmJiAvXlxbLyB7IGV4aXQgfQogICAgayAmJiBtYXRjaCgkMCwgL14jIFthLXpfXSsgPSAiW14iXSoiLykgewogICAgICBsaW5lID0gc3Vic3RyKCQwLCAzLCBSTEVOR1RIIC0gMik7IGVxID0gaW5kZXgobGluZSwgIiA9ICIpCiAgICAgIHYgPSBzdWJzdHIobGluZSwgZXEgKyA0KTsgc3ViKC8iJC8sICIiLCB2KQogICAgICBpZiAodiAhPSAiIikgcHJpbnRmICIlc1x0JXNcbiIsIHN1YnN0cihsaW5lLCAxLCBlcSAtIDEpLCB2CiAgICB9JykiIHx8IG91dD0iIgogIGlmIFsgLW4gIiRvdXQiIF07IHRoZW4gcHJpbnRmICclc1xuJyAiJG91dCI7IHJldHVybjsgZmkKICBmb3IgcCBpbiBoZWxwOj8gc2V0dGluZ3M6cyBkZXRhY2g6cSByZWxvYWRfY29uZmlnOnNoaWZ0K3Igb3Blbl9ub3RpZmljYXRpb25fdGFyZ2V0Om8gXAogICAgd29ya3NwYWNlX3BpY2tlcjp3IGdvdG86ZyBuZXdfd29ya3NwYWNlOnNoaWZ0K24gbmV3X3dvcmt0cmVlOnNoaWZ0K2cgcmVuYW1lX3dvcmtzcGFjZTpzaGlmdCt3IFwKICAgIGNsb3NlX3dvcmtzcGFjZTpzaGlmdCtkIG5ld190YWI6YyByZW5hbWVfdGFiOnNoaWZ0K3QgcHJldmlvdXNfdGFiOnAgbmV4dF90YWI6biBcCiAgICBjbG9zZV90YWI6c2hpZnQreCByZW5hbWVfcGFuZTpzaGlmdCtwIGVkaXRfc2Nyb2xsYmFjazplIGZvY3VzX3BhbmVfbGVmdDpoIGZvY3VzX3BhbmVfZG93bjpqIFwKICAgIGZvY3VzX3BhbmVfdXA6ayBmb2N1c19wYW5lX3JpZ2h0OmwgY3ljbGVfcGFuZV9uZXh0OnRhYiBjeWNsZV9wYW5lX3ByZXZpb3VzOnNoaWZ0K3RhYiBcCiAgICBzcGxpdF92ZXJ0aWNhbDp2IHNwbGl0X2hvcml6b250YWw6bWludXMgY2xvc2VfcGFuZTp4IHpvb206eiByZXNpemVfbW9kZTpyIHRvZ2dsZV9zaWRlYmFyOmI7IGRvCiAgICBwcmludGYgJyVzXHRwcmVmaXgrJXNcbicgIiR7cCUlOip9IiAiJHtwIyo6fSIKICBkb25lCn0KCiMgT25lIGxpbmUgb24gdGhlIGNvbmZpZzogImJvdW5kIDxrZXk+IiB3aGVuIGEgW1trZXlzLmNvbW1hbmRdXSBhbHJlYWR5IHJ1bnMKIyB0aGUgcGFuZWwsIGVsc2UgImZyZWUgPGtleT4iIChmaXJzdCBmcmVlIGNhbmRpZGF0ZSkgb3IgIm5vbmUiLiBBbHNvCiMgIm9sZCA8a2V5PiIgZm9yIGEgYmluZGluZyBvZiB0aGUgcGFuZWwncyBmb3JtZXIgYWN0aW9uIGlkICg8aWQ+LndoZXJkcikuCmtleV9zY2FuKCkgewogIGRlZmF1bHRzPSIkKGRlZmF1bHRfa2V5cykiCiAgeyBwcmludGYgJyVzXG4nICIkZGVmYXVsdHMiOyBwcmludGYgJ1wwMDFcbic7IGNhdCAiJEhFUkRSX0NPTkZJRyIgMj4vZGV2L251bGw7IH0gfCBhd2sgXAogICAgLXYgY2FuZHM9IiRIT1RLRVlTIiAtdiBhY3Rpb249IiRQQU5FTF9BQ1RJT04iIC12IG9sZD0iJFBMVUdJTl9JRC53aGVyZHIiICcKICAgIGZ1bmN0aW9uIG5vcm0oaykgewogICAgICBnc3ViKC9bIFx0XS8sICIiLCBrKQogICAgICAjICJwcmVmaXgrVyIgaXMgInByZWZpeCtzaGlmdCt3IgogICAgICBpZiAobWF0Y2goaywgL1wrW0EtWl0kLykpIGsgPSBzdWJzdHIoaywgMSwgUlNUQVJUKSAic2hpZnQrIiB0b2xvd2VyKHN1YnN0cihrLCBSU1RBUlQgKyAxKSkKICAgICAgcmV0dXJuIHRvbG93ZXIoaykKICAgIH0KICAgIGZ1bmN0aW9uIHN0cmluZ3Mocywgb3V0LCAgIG4pIHsKICAgICAgbiA9IDAKICAgICAgd2hpbGUgKG1hdGNoKHMsIC8iW14iXSoiLykpIHsgb3V0Wysrbl0gPSBzdWJzdHIocywgUlNUQVJUICsgMSwgUkxFTkdUSCAtIDIpOyBzID0gc3Vic3RyKHMsIFJTVEFSVCArIFJMRU5HVEgpIH0KICAgICAgcmV0dXJuIG4KICAgIH0KICAgIGZ1bmN0aW9uIGZsdXNoKCkgewogICAgICBpZiAoY2tleSAhPSAiIiAmJiBjbWQgPT0gYWN0aW9uICYmIGJvdW5kID09ICIiKSBib3VuZCA9IGNrZXkKICAgICAgaWYgKGNrZXkgIT0gIiIgJiYgY21kID09IG9sZCAmJiBvbGRrZXkgPT0gIiIpIG9sZGtleSA9IGNrZXkKICAgICAgY2tleSA9ICIiOyBjbWQgPSAiIgogICAgfQogICAgJDAgPT0gIlwwMDEiIHsgY29uZiA9IDE7IG5leHQgfQogICAgIWNvbmYgeyBzcGxpdCgkMCwgZCwgIlx0Iik7IGRlZltkWzFdXSA9IGRbMl07IG5leHQgfQogICAgL15bIFx0XSpcWy8gewogICAgICBmbHVzaCgpOyB0ID0gJDA7IHN1YigvIy4qLywgIiIsIHQpOyBnc3ViKC9bIFx0XS8sICIiLCB0KQogICAgICBzZWN0ID0gdCA9PSAiW2tleXNdIiA/ICJrZXlzIiA6IHQgPT0gIltba2V5cy5jb21tYW5kXV0iID8gImNtZCIgOiAiIgogICAgICBuZXh0CiAgICB9CiAgICAvXlsgXHRdKigjfCQpLyB7IG5leHQgfQogICAgewogICAgICBlcSA9IGluZGV4KCQwLCAiPSIpOyBpZiAoIWVxKSBuZXh0CiAgICAgIG5hbWUgPSBzdWJzdHIoJDAsIDEsIGVxIC0gMSk7IGdzdWIoL1sgXHRdLywgIiIsIG5hbWUpOyB2YWwgPSBzdWJzdHIoJDAsIGVxICsgMSkKICAgICAgaWYgKHNlY3QgPT0gImtleXMiKSB7CiAgICAgICAgb3ZlcltuYW1lXSA9IDE7IG4gPSBzdHJpbmdzKHZhbCwgcykKICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykgdGFrZW5bbm9ybShzW2ldKV0gPSAxCiAgICAgIH0gZWxzZSBpZiAoc2VjdCA9PSAiY21kIiAmJiBzdHJpbmdzKHZhbCwgcykpIHsKICAgICAgICBpZiAobmFtZSA9PSAia2V5IikgeyBja2V5ID0gc1sxXTsgdGFrZW5bbm9ybShzWzFdKV0gPSAxIH0KICAgICAgICBpZiAobmFtZSA9PSAiY29tbWFuZCIpIGNtZCA9IHNbMV0KICAgICAgfQogICAgfQogICAgRU5EIHsKICAgICAgZmx1c2goKQogICAgICBpZiAob2xka2V5ICE9ICIiKSBwcmludCAib2xkICIgb2xka2V5CiAgICAgIGlmIChib3VuZCAhPSAiIikgeyBwcmludCAiYm91bmQgIiBib3VuZDsgZXhpdCB9CiAgICAgIGZvciAoYSBpbiBkZWYpIGlmICghKGEgaW4gb3ZlcikpIHRha2VuW25vcm0oZGVmW2FdKV0gPSAxCiAgICAgIG4gPSBzcGxpdChjYW5kcywgYywgIiAiKQogICAgICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykgaWYgKCEobm9ybShjW2ldKSBpbiB0YWtlbikpIHsgcHJpbnQgImZyZWUgIiBjW2ldOyBleGl0IH0KICAgICAgcHJpbnQgIm5vbmUiCiAgICB9Jwp9CgojIFRoZSBrZXkgYm91bmQgdG8gdGhlIHBhbmVsLCBpZiBhbnkuCmtleV9ib3VuZCgpIHsga2V5X3NjYW4gfCBzZWQgLW4gJ3MvXmJvdW5kIC8vcCc7IH0KCiMgSGVyZHIgYXBwbGllcyBrZXliaW5kaW5ncyBvbiBgaGVyZHIgc2VydmVyIHJlbG9hZC1jb25maWdgIChubyByZXN0YXJ0KS4Ka2V5X3JlbG9hZCgpIHsKICBpZiAiJChoZXJkcl9iaW4pIiBzZXJ2ZXIgcmVsb2FkLWNvbmZpZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHRlbGwgIiAgSGVyZHIgcmVsb2FkZWQgaXRzIGNvbmZpZzogbm8gcmVzdGFydCBuZWVkZWQuIgogIGVsc2UKICAgIHRlbGwgIiAgUnVuIGhlcmRyIHNlcnZlciByZWxvYWQtY29uZmlnIChvciByZXN0YXJ0IEhlcmRyKSB0byBhcHBseSBpdC4iCiAgZmkKfQoKY21kX2tleSgpIHsKICBjYXNlICIkezE6LX0iIGluCiAgICBpbnN0YWxsKQogICAgICBzY2FuPSIkKGtleV9zY2FuKSIKICAgICAgb2xkPSIkKHByaW50ZiAnJXNcbicgIiRzY2FuIiB8IHNlZCAtbiAncy9eb2xkIC8vcCcpIgogICAgICBbIC16ICIkb2xkIiBdIHx8IHdhcm4gIiRvbGQgcnVucyAkUExVR0lOX0lELndoZXJkciwgcmVuYW1lZCAkUEFORUxfQUNUSU9OOiBlZGl0IHRoYXQgbGluZSBvZiAkSEVSRFJfQ09ORklHLiIKICAgICAgcmVzPSIkKHByaW50ZiAnJXNcbicgIiRzY2FuIiB8IHNlZCAnL15vbGQgL2QnKSIKICAgICAgY2FzZSAiJHJlcyIgaW4KICAgICAgICBib3VuZFwgKikgdGVsbCAiUHJlc3MgJHtyZXMjYm91bmQgfSBpbiBIZXJkciB0byBvcGVuIHRoZSB3aGVyZHIgcGFuZWwuIiA7OwogICAgICAgIGZyZWVcICopCiAgICAgICAgICBrZXk9IiR7cmVzI2ZyZWUgfSIKICAgICAgICAgIG1rZGlyIC1wICIkKGRpcm5hbWUgIiRIRVJEUl9DT05GSUciKSIKICAgICAgICAgIGJsb2NrPSIkKHByaW50ZiAnJXNcbltba2V5cy5jb21tYW5kXV1cbmtleSA9ICIlcyJcbnR5cGUgPSAicGx1Z2luX2FjdGlvbiJcbmNvbW1hbmQgPSAiJXMiXG5kZXNjcmlwdGlvbiA9ICJ3aGVyZHIiXG4lcycgXAogICAgICAgICAgICAiJEtFWV9CRUdJTiIgIiRrZXkiICIkUEFORUxfQUNUSU9OIiAiJEtFWV9FTkQiKSIKICAgICAgICAgIHNlcD0iIgogICAgICAgICAgaWYgWyAtcyAiJEhFUkRSX0NPTkZJRyIgXTsgdGhlbgogICAgICAgICAgICBzZXA9IgoiCiAgICAgICAgICAgICMgQSBsYXN0IGxpbmUgd2l0aG91dCBpdHMgbmV3bGluZSBnZXRzIG9uZSBmaXJzdC4KICAgICAgICAgICAgWyAiJCh0YWlsIC1jIDEgIiRIRVJEUl9DT05GSUciIHwgb2QgLUFuIC1jIHwgdHIgLWQgJyAnKSIgPSAnXG4nIF0gfHwgc2VwPSIKJHNlcCIKICAgICAgICAgIGZpCiAgICAgICAgICAjIENoZWNrZWQgb24gYSBjb3B5IGZpcnN0IHdoZW4gdGhpcyBIZXJkciBjYW4gdmFsaWRhdGUgYSBjb25maWc6CiAgICAgICAgICAjIGEgY29uZmlnIEhlcmRyIHdvdWxkIHJlamVjdCBpcyBuZXZlciB3cml0dGVuLgogICAgICAgICAgdG1wPSIkSEVSRFJfQ09ORklHLndoZXJkci1jaGVjay50b21sIgogICAgICAgICAgeyBpZiBbIC1mICIkSEVSRFJfQ09ORklHIiBdOyB0aGVuIGNhdCAiJEhFUkRSX0NPTkZJRyI7IGZpOyBwcmludGYgJyVzJXNcbicgIiRzZXAiICIkYmxvY2siOyB9ID4gIiR0bXAiCiAgICAgICAgICBpZiAiJChoZXJkcl9iaW4pIiBjb25maWcgLS1oZWxwID4vZGV2L251bGwgMj4mMSAmJiAhIEhFUkRSX0NPTkZJR19QQVRIPSIkdG1wIiAiJChoZXJkcl9iaW4pIiBjb25maWcgY2hlY2sgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgICAgIHJtIC1mICIkdG1wIgogICAgICAgICAgICB3YXJuICJubyBIZXJkciBrZXkgYWRkZWQ6ICRIRVJEUl9DT05GSUcgd291bGQgbm90IHZhbGlkYXRlIHdpdGggaXQgKGhlcmRyIGNvbmZpZyBjaGVjaykuIgogICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgZmkKICAgICAgICAgIHJtIC1mICIkdG1wIgogICAgICAgICAgcHJpbnRmICclcyVzXG4nICIkc2VwIiAiJGJsb2NrIiA+PiAiJEhFUkRSX0NPTkZJRyIKICAgICAgICAgIG9rICJIZXJkciBrZXkgJGtleSBhZGRlZCB0byAkSEVSRFJfQ09ORklHIgogICAgICAgICAgdGVsbCAiUHJlc3MgJGtleSBpbiBIZXJkciB0byBvcGVuIHRoZSB3aGVyZHIgcGFuZWwuIgogICAgICAgICAga2V5X3JlbG9hZAogICAgICAgICAgOzsKICAgICAgICAqKSB3YXJuICJubyBIZXJkciBrZXkgYWRkZWQ6ICRIT1RLRVlTIGFyZSBhbGwgdGFrZW4uIEJpbmQgb25lIHRvICRQQU5FTF9BQ1RJT04gKHR5cGUgPSBcInBsdWdpbl9hY3Rpb25cIikgaW4gJEhFUkRSX0NPTkZJRy4iIDs7CiAgICAgIGVzYWMKICAgICAgOzsKICAgIHVuaW5zdGFsbCkKICAgICAgaWYgISBncmVwIC1xeEYgIiRLRVlfQkVHSU4iICIkSEVSRFJfQ09ORklHIiAyPi9kZXYvbnVsbDsgdGhlbiBvayAibm8gd2hlcmRyIGtleSBpbiAkSEVSRFJfQ09ORklHIjsgcmV0dXJuIDA7IGZpCiAgICAgICMgRHJvcHMgdGhlIG1hcmtlZCBibG9jayBhbmQgdGhlIGJsYW5rIGxpbmUgd3JpdHRlbiBiZWZvcmUgaXQuCiAgICAgIHRtcD0iJEhFUkRSX0NPTkZJRy53aGVyZHItdG1wIgogICAgICBhd2sgLXYgYj0iJEtFWV9CRUdJTiIgLXYgZT0iJEtFWV9FTkQiICcKICAgICAgICAkMCA9PSBiIHsgc2tpcCA9IDE7IGlmIChibGFuaykgYmxhbmstLTsgbmV4dCB9CiAgICAgICAgc2tpcCB7IGlmICgkMCA9PSBlKSBza2lwID0gMDsgbmV4dCB9CiAgICAgICAgJDAgPT0gIiIgeyBibGFuaysrOyBuZXh0IH0KICAgICAgICB7IHdoaWxlIChibGFuaykgeyBwcmludCAiIjsgYmxhbmstLSB9IHByaW50IH0KICAgICAgICBFTkQgeyB3aGlsZSAoYmxhbmspIHsgcHJpbnQgIiI7IGJsYW5rLS0gfSB9JyAiJEhFUkRSX0NPTkZJRyIgPiAiJHRtcCIKICAgICAgIyBSZXdyaXR0ZW4gaW4gcGxhY2U6IHRoZSBmaWxlIGtlZXBzIGl0cyBvd25lciBhbmQgbW9kZS4KICAgICAgY2F0ICIkdG1wIiA+ICIkSEVSRFJfQ09ORklHIiAmJiBybSAtZiAiJHRtcCIKICAgICAgb2sgIndoZXJkciBrZXkgcmVtb3ZlZCBmcm9tICRIRVJEUl9DT05GSUciCiAgICAgIGtleV9yZWxvYWQKICAgICAgOzsKICAgIHN0YXR1cykgYj0iJChrZXlfYm91bmQpIjsgaWYgWyAtbiAiJGIiIF07IHRoZW4gc2F5ICIkYiI7IGVsc2Ugc2F5ICJub25lIjsgZmkgOzsKICAgICopIGRpZSAidXNhZ2U6ICQwIGtleSBpbnN0YWxsfHVuaW5zdGFsbHxzdGF0dXMiIDs7CiAgZXNhYwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwYW5lbAojIFRoZSAicGFuZWwiIGFjdGlvbjogb25lIHBvcHVwIHdpdGggdGhlIHN0YXRlLCBPcGVuIHdoZXJkciwgU2V0IHVwIG15IHBob25lCiMgKG9wZW5zIFNldHRpbmdzIOKAuiBQaG9uZSkgYW5kIHRoZSBvdGhlciBjb21tYW5kcyAoYmluL2xpYi9wYW5lbC5tanMpLAojIGRyaXZpbmcgdGhpcyBzY3JpcHQuCmNtZF9wYW5lbCgpIHsKICBjb250cm9sPSIkKHByaW50ZiAnWyJzaCIsIiVzIl0nICIkKHByaW50ZiAnJXMnICIkUk9PVC9zY3JpcHRzL2hlcmRyLXBsdWdpbi5zaCIgfCBzZWQgJ3MvW1xcIl0vXFwmL2cnKSIpIgogIGlmIFsgIiRNT0RFIiA9ICJuYXRpdmUiIF0gfHwgeyBbIC1uICIkTU9ERSIgXSAmJiBSVU5USU1FPSIkKGZpbmRfcnVudGltZSkiOyB9OyB0aGVuCiAgICBXSEVSRFJfQ09OVFJPTD0iJGNvbnRyb2wiIFdIRVJEUl9NT0RFPSIkTU9ERSIgV0hFUkRSX0hPVEtFWT0iJChrZXlfYm91bmQpIiBjbGkgcGFuZWwKICBlbGlmIFsgLW4gIiRNT0RFIiBdOyB0aGVuCiAgICBzaF9wYW5lbAogIGVsc2UKICAgIGRpZSAid2hlcmRyIHBsdWdpbiBpcyBub3Qgc2V0IHVwICgkQ09ORiBpcyBtaXNzaW5nKTogaW5zdGFsbCBpdCBhZ2FpbiB3aXRoIGhlcmRyIHBsdWdpbiBpbnN0YWxsICRTT1VSQ0UgLS15ZXMuIgogIGZpCn0KCiMgRG9ja2VyIG1vZGUgd2l0aG91dCBOb2RlLmpzOiB0aGUgc2FtZSBrZXlzLCB3aXRob3V0IHRoZSBRUiBjb2RlLgpzaF9wYW5lbCgpIHsKICBzYXZlZD0iJChzdHR5IC1nKSIKICB0cmFwICdzdHR5ICIkc2F2ZWQiJyBFWElUCiAgd2hpbGUgOjsgZG8KICAgIHByaW50ZiAnXDAzM1tIXDAzM1sySlxuICBXSEVSRFJcblxuJwogICAgKCBjbWRfc3RhdHVzICkgfHwgdHJ1ZQogICAgcHJpbnRmICdcbiAgUyBzdGFydCAgWCBzdG9wICBSIHJlc3RhcnQgIE8gb3BlbiAgTCBsb2cgIFUgdXBkYXRlICBQIHBob25lICBRIHF1aXRcbicKICAgIHByaW50ZiAnICBSZW1vdmU6IFgsIHRoZW4gc2ggJXMga2V5IHVuaW5zdGFsbCwgdGhlbiBoZXJkciBwbHVnaW4gdW5pbnN0YWxsICVzICYmIHJtIC1yZiAlc1xuJyAiJFJPT1Qvc2NyaXB0cy9oZXJkci1wbHVnaW4uc2giICIkUExVR0lOX0lEIiAiJERJUiIKICAgIHN0dHkgLWljYW5vbiAtZWNobyBtaW4gMCB0aW1lIDUwCiAgICBrPSIkKGRkIGJzPTEgY291bnQ9MSAyPi9kZXYvbnVsbCB8fCB0cnVlKSIKICAgIHN0dHkgIiRzYXZlZCIKICAgIGNhc2UgIiRrIiBpbgogICAgICBzfFMpIGFjdD1zdGFydCA7OyB4fFgpIGFjdD1zdG9wIDs7IHJ8UikgYWN0PXJlc3RhcnQgOzsgb3xPKSBhY3Q9b3BlbiA7OwogICAgICBsfEwpIGFjdD1sb2dzIDs7IHV8VSkgYWN0PXVwZGF0ZSA7OyBwfFApIGFjdD1waG9uZSA7OyBxfFEpIGJyZWFrIDs7CiAgICAgICopIGNvbnRpbnVlIDs7CiAgICBlc2FjCiAgICBwcmludGYgJ1wwMzNbSFwwMzNbMkpcbicKICAgICggdHJhcCAtIElOVDsgImNtZF8kYWN0IiApIHx8IHRydWUKICAgIHByaW50ZiAnXG4gIFByZXNzIEVudGVyIHRvIGdvIGJhY2suICcKICAgIHJlYWQgLXIgXyB8fCB0cnVlCiAgZG9uZQp9CgpjbWRfcmVzdGFydCgpIHsgY21kX3N0b3A7IGNtZF9zdGFydDsgfQoKY2FzZSAiJHsxOi19IiBpbgogIGJ1aWxkKSBjbWRfYnVpbGQgOzsKICBwYW5lbCkgY21kX3BhbmVsIDs7CiAgc3RhcnR8c3RvcHxyZXN0YXJ0fHN0YXR1c3xvcGVufHVwZGF0ZXxwaG9uZXxsb2dzfGRvY3RvcikgImNtZF8kMSIgOzsKICBzZXJ2aWNlKSBjbWRfc2VydmljZSAiJHsyOi19IiA7OwogIHNraWxsKSBjbWRfc2tpbGwgIiR7MjotfSIgOzsKICBrZXkpIGNtZF9rZXkgIiR7MjotfSIgOzsKICAqKSBkaWUgInVzYWdlOiAkMCBidWlsZHxwYW5lbHxzdGFydHxzdG9wfHJlc3RhcnR8c3RhdHVzfG9wZW58dXBkYXRlfHBob25lfGxvZ3N8ZG9jdG9yfHNlcnZpY2UgaW5zdGFsbHx1bmluc3RhbGx8c2tpbGwgaW5zdGFsbHx1bmluc3RhbGx8a2V5IGluc3RhbGx8dW5pbnN0YWxsfHN0YXR1cyIgOzsKZXNhYwo=");
5
5
 
6
6
  export { herdrPlugin as default };
7
7
  //# sourceMappingURL=herdr-plugin.mjs.map
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -21,6 +21,7 @@ import 'web-push';
21
21
  import 'node:os';
22
22
  import 'node:child_process';
23
23
  import 'node:net';
24
+ import 'node:readline';
24
25
  import 'node:fs/promises';
25
26
  import 'node:url';
26
27
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -21,6 +21,7 @@ import 'web-push';
21
21
  import 'node:os';
22
22
  import 'node:child_process';
23
23
  import 'node:net';
24
+ import 'node:readline';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
26
27
 
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -21,6 +21,7 @@ import 'web-push';
21
21
  import 'node:os';
22
22
  import 'node:child_process';
23
23
  import 'node:net';
24
+ import 'node:readline';
24
25
  import 'node:fs/promises';
25
26
  import 'node:url';
26
27
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -21,6 +21,7 @@ import 'web-push';
21
21
  import 'node:os';
22
22
  import 'node:child_process';
23
23
  import 'node:net';
24
+ import 'node:readline';
24
25
  import 'node:fs/promises';
25
26
  import 'node:url';
26
27
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -21,6 +21,7 @@ import 'web-push';
21
21
  import 'node:os';
22
22
  import 'node:child_process';
23
23
  import 'node:net';
24
+ import 'node:readline';
24
25
  import 'node:fs/promises';
25
26
  import 'node:url';
26
27
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -22,6 +22,7 @@ import 'web-push';
22
22
  import 'node:os';
23
23
  import 'node:child_process';
24
24
  import 'node:net';
25
+ import 'node:readline';
25
26
  import 'node:fs/promises';
26
27
  import 'node:url';
27
28
  import '@simplewebauthn/server';
@@ -21,6 +21,7 @@ import 'web-push';
21
21
  import 'node:os';
22
22
  import 'node:child_process';
23
23
  import 'node:net';
24
+ import 'node:readline';
24
25
  import 'node:fs/promises';
25
26
  import 'node:url';
26
27
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -21,6 +21,7 @@ import 'web-push';
21
21
  import 'node:os';
22
22
  import 'node:child_process';
23
23
  import 'node:net';
24
+ import 'node:readline';
24
25
  import 'node:fs/promises';
25
26
  import 'node:url';
26
27
  import '@simplewebauthn/server';
@@ -21,6 +21,7 @@ import 'web-push';
21
21
  import 'node:os';
22
22
  import 'node:child_process';
23
23
  import 'node:net';
24
+ import 'node:readline';
24
25
  import 'node:fs/promises';
25
26
  import 'node:url';
26
27
  import '@simplewebauthn/server';
@@ -21,6 +21,7 @@ import 'web-push';
21
21
  import 'node:os';
22
22
  import 'node:child_process';
23
23
  import 'node:net';
24
+ import 'node:readline';
24
25
  import 'node:fs/promises';
25
26
  import 'node:url';
26
27
  import '@simplewebauthn/server';
@@ -21,6 +21,7 @@ import 'web-push';
21
21
  import 'node:os';
22
22
  import 'node:child_process';
23
23
  import 'node:net';
24
+ import 'node:readline';
24
25
  import 'node:fs/promises';
25
26
  import 'node:url';
26
27
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';
@@ -20,6 +20,7 @@ import 'web-push';
20
20
  import 'node:os';
21
21
  import 'node:child_process';
22
22
  import 'node:net';
23
+ import 'node:readline';
23
24
  import 'node:fs/promises';
24
25
  import 'node:url';
25
26
  import '@simplewebauthn/server';