@runcore-sh/runcore 0.5.6 → 0.5.7

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 (174) hide show
  1. package/dictionary.json +2 -2
  2. package/dist/.extensions/ext-byok.json +1 -0
  3. package/dist/.extensions/ext-hosted.json +1 -0
  4. package/dist/.extensions/ext-spawn.json +1 -0
  5. package/dist/agents/autonomous.d.ts.map +1 -1
  6. package/dist/agents/runtime/bus.d.ts +1 -0
  7. package/dist/agents/runtime/bus.d.ts.map +1 -1
  8. package/dist/agents/spawn.d.ts.map +1 -1
  9. package/dist/auth/middleware.d.ts.map +1 -1
  10. package/dist/auth/middleware.js +3 -2
  11. package/dist/auth/middleware.js.map +1 -1
  12. package/dist/calendar/routes.d.ts.map +1 -1
  13. package/dist/calendar/routes.js +8 -7
  14. package/dist/calendar/routes.js.map +1 -1
  15. package/dist/files/registry.d.ts +4 -5
  16. package/dist/files/registry.d.ts.map +1 -1
  17. package/dist/files/registry.js +4 -5
  18. package/dist/files/registry.js.map +1 -1
  19. package/dist/files/store.d.ts +2 -0
  20. package/dist/files/store.d.ts.map +1 -1
  21. package/dist/files/store.js +5 -1
  22. package/dist/files/store.js.map +1 -1
  23. package/dist/instance.d.ts +2 -0
  24. package/dist/instance.d.ts.map +1 -1
  25. package/dist/instance.js +2 -0
  26. package/dist/instance.js.map +1 -1
  27. package/dist/lib/paths.d.ts.map +1 -1
  28. package/dist/lib/paths.js +15 -1
  29. package/dist/lib/paths.js.map +1 -1
  30. package/dist/library/brain-shadow.d.ts.map +1 -1
  31. package/dist/library/brain-shadow.js +5 -4
  32. package/dist/library/brain-shadow.js.map +1 -1
  33. package/dist/library/routes.d.ts.map +1 -1
  34. package/dist/library/routes.js +10 -9
  35. package/dist/library/routes.js.map +1 -1
  36. package/dist/llm/cache.d.ts.map +1 -1
  37. package/dist/llm/cache.js +7 -5
  38. package/dist/llm/cache.js.map +1 -1
  39. package/dist/llm/complete.js +2 -0
  40. package/dist/llm/complete.js.map +1 -1
  41. package/dist/llm/providers/ollama.d.ts.map +1 -1
  42. package/dist/llm/providers/ollama.js +32 -7
  43. package/dist/llm/providers/ollama.js.map +1 -1
  44. package/dist/llm/providers/openrouter.d.ts.map +1 -1
  45. package/dist/llm/providers/openrouter.js +105 -12
  46. package/dist/llm/providers/openrouter.js.map +1 -1
  47. package/dist/llm/providers/types.d.ts +18 -0
  48. package/dist/llm/providers/types.d.ts.map +1 -1
  49. package/dist/llm/retry.d.ts.map +1 -1
  50. package/dist/llm/retry.js +6 -0
  51. package/dist/llm/retry.js.map +1 -1
  52. package/dist/llm/tools/handlers.d.ts +27 -0
  53. package/dist/llm/tools/handlers.d.ts.map +1 -0
  54. package/dist/llm/tools/handlers.js +842 -0
  55. package/dist/llm/tools/handlers.js.map +1 -0
  56. package/dist/llm/tools/index.d.ts +12 -0
  57. package/dist/llm/tools/index.d.ts.map +1 -0
  58. package/dist/llm/tools/index.js +10 -0
  59. package/dist/llm/tools/index.js.map +1 -0
  60. package/dist/llm/tools/loop.d.ts +47 -0
  61. package/dist/llm/tools/loop.d.ts.map +1 -0
  62. package/dist/llm/tools/loop.js +126 -0
  63. package/dist/llm/tools/loop.js.map +1 -0
  64. package/dist/llm/tools/registry.d.ts +27 -0
  65. package/dist/llm/tools/registry.d.ts.map +1 -0
  66. package/dist/llm/tools/registry.js +60 -0
  67. package/dist/llm/tools/registry.js.map +1 -0
  68. package/dist/llm/tools/schemas.d.ts +92 -0
  69. package/dist/llm/tools/schemas.d.ts.map +1 -0
  70. package/dist/llm/tools/schemas.js +154 -0
  71. package/dist/llm/tools/schemas.js.map +1 -0
  72. package/dist/llm/tools/types.d.ts +44 -0
  73. package/dist/llm/tools/types.d.ts.map +1 -0
  74. package/dist/llm/tools/types.js +9 -0
  75. package/dist/llm/tools/types.js.map +1 -0
  76. package/dist/mcp-server.d.ts +1 -1
  77. package/dist/mcp-server.js +249 -5
  78. package/dist/mcp-server.js.map +1 -1
  79. package/dist/memory/visual.d.ts.map +1 -1
  80. package/dist/memory/visual.js +3 -6
  81. package/dist/memory/visual.js.map +1 -1
  82. package/dist/openloop/foldback.js +1 -1
  83. package/dist/openloop/foldback.js.map +1 -1
  84. package/dist/openloop/resolution-scanner.d.ts.map +1 -1
  85. package/dist/openloop/resolution-scanner.js +76 -63
  86. package/dist/openloop/resolution-scanner.js.map +1 -1
  87. package/dist/plugins/github/index.d.ts +49 -0
  88. package/dist/plugins/github/index.d.ts.map +1 -0
  89. package/dist/plugins/github/index.js +153 -0
  90. package/dist/plugins/github/index.js.map +1 -0
  91. package/dist/plugins/index.d.ts +1 -2
  92. package/dist/plugins/index.d.ts.map +1 -1
  93. package/dist/plugins/index.js +79 -2
  94. package/dist/plugins/index.js.map +1 -1
  95. package/dist/plugins/slack/index.d.ts +43 -0
  96. package/dist/plugins/slack/index.d.ts.map +1 -0
  97. package/dist/plugins/slack/index.js +158 -0
  98. package/dist/plugins/slack/index.js.map +1 -0
  99. package/dist/plugins/twilio/index.d.ts +41 -0
  100. package/dist/plugins/twilio/index.d.ts.map +1 -0
  101. package/dist/plugins/twilio/index.js +102 -0
  102. package/dist/plugins/twilio/index.js.map +1 -0
  103. package/dist/pulse/tier.d.ts +1 -1
  104. package/dist/pulse/tier.js +2 -2
  105. package/dist/pulse/tier.js.map +1 -1
  106. package/dist/search/gemini.d.ts +27 -0
  107. package/dist/search/gemini.d.ts.map +1 -0
  108. package/dist/search/gemini.js +103 -0
  109. package/dist/search/gemini.js.map +1 -0
  110. package/dist/server.d.ts.map +1 -1
  111. package/dist/server.js +850 -536
  112. package/dist/server.js.map +1 -1
  113. package/dist/services/routine-patterns.d.ts.map +1 -1
  114. package/dist/services/routine-patterns.js +6 -0
  115. package/dist/services/routine-patterns.js.map +1 -1
  116. package/dist/services/traceInsights.d.ts +5 -0
  117. package/dist/services/traceInsights.d.ts.map +1 -1
  118. package/dist/services/traceInsights.js +18 -1
  119. package/dist/services/traceInsights.js.map +1 -1
  120. package/dist/settings.d.ts +1 -1
  121. package/dist/settings.d.ts.map +1 -1
  122. package/dist/types.d.ts +26 -2
  123. package/dist/types.d.ts.map +1 -1
  124. package/dist/vault/store.d.ts +1 -1
  125. package/dist/vault/store.d.ts.map +1 -1
  126. package/dist/webhooks/mount.d.ts.map +1 -1
  127. package/dist/whiteboard/store.d.ts +40 -0
  128. package/dist/whiteboard/store.d.ts.map +1 -0
  129. package/dist/whiteboard/store.js +280 -0
  130. package/dist/whiteboard/store.js.map +1 -0
  131. package/dist/whiteboard/types.d.ts +55 -0
  132. package/dist/whiteboard/types.d.ts.map +1 -0
  133. package/dist/whiteboard/types.js +9 -0
  134. package/dist/whiteboard/types.js.map +1 -0
  135. package/dist/whiteboard/weight.d.ts +23 -0
  136. package/dist/whiteboard/weight.d.ts.map +1 -0
  137. package/dist/whiteboard/weight.js +126 -0
  138. package/dist/whiteboard/weight.js.map +1 -0
  139. package/package.json +2 -2
  140. package/public/avatar/cache/0cdaf9c41eff4347.mp4 +0 -0
  141. package/public/avatar/cache/3dacc4ea1082ae36.mp4 +0 -0
  142. package/public/avatar/cache/44f5db0bfdde93c6.mp4 +0 -0
  143. package/public/avatar/cache/5628fd10fe55e529.mp4 +0 -0
  144. package/public/avatar/cache/7ee2ab1577690c8a.mp4 +0 -0
  145. package/public/avatar/cache/8c470929e814b6b0.mp4 +0 -0
  146. package/public/avatar/cache/8c908421ce52bf91.mp4 +0 -0
  147. package/public/avatar/cache/9532f8782a42a89c.mp4 +0 -0
  148. package/public/avatar/cache/9ce0dddd0cc4d7a1.mp4 +0 -0
  149. package/public/avatar/cache/a6508e00b6711143.mp4 +0 -0
  150. package/public/avatar/cache/ba61810a8915e0c7.mp4 +0 -0
  151. package/public/avatar/cache/c07bee3a10c917cf.mp4 +0 -0
  152. package/public/avatar/cache/d69175900ea4ea2a.mp4 +0 -0
  153. package/public/avatar/cache/e61039bc8d39cb93.mp4 +0 -0
  154. package/public/avatar/cache/e61c6b7047e2cbdb.mp4 +0 -0
  155. package/public/avatar/cache/efd93c9b18930cf6.mp4 +0 -0
  156. package/public/avatar/cache/f052d74f5c4abab7.mp4 +0 -0
  157. package/public/avatar/cache/f7c0be3429a4ef97.mp4 +0 -0
  158. package/public/avatar/cache/fc8e480f63fe4e35.mp4 +0 -0
  159. package/public/index.html +225 -51
  160. package/public/search-flyout.js +324 -0
  161. package/public/whiteboard.html +915 -0
  162. package/public/avatar/cache/06fa55aececcc478.mp4 +0 -0
  163. package/public/avatar/cache/07a65738ba170827.mp4 +0 -0
  164. package/public/avatar/cache/1185fd491f413406.mp4 +0 -0
  165. package/public/avatar/cache/272c004a41087de5.mp4 +0 -0
  166. package/public/avatar/cache/332384e088ca214b.mp4 +0 -0
  167. package/public/avatar/cache/5d9a960bbf71732c.mp4 +0 -0
  168. package/public/avatar/cache/5e0954401e15af89.mp4 +0 -0
  169. package/public/avatar/cache/b35f7a3d558f22cb.mp4 +0 -0
  170. package/public/avatar/cache/be89f49970672374.mp4 +0 -0
  171. package/public/avatar/cache/c900811e3382ac6d.mp4 +0 -0
  172. package/public/avatar/cache/d42a73667acf5716.mp4 +0 -0
  173. package/public/avatar/cache/e539f247a8908603.mp4 +0 -0
  174. package/public/avatar/cache/ec95af57d33b3f07.mp4 +0 -0
@@ -0,0 +1 @@
1
+ {"manifest":{"name":"ext-hosted","version":"0.5.6","minCoreVersion":"0.5.6","tier":"hosted","modules":[{"path":"tracing/bridge.js","hash":"sha256:3a4b2d2a65685eaf7c5c15517ef3666ca2a22ee7e260730862b54fcc2999e6a8"},{"path":"tracing/correlation.js","hash":"sha256:6e7d4e52666da9bac71d50784c3833d89d83a75fe783370eeb5269dc94992623"},{"path":"tracing/index.js","hash":"sha256:74b01090491684acd1fdd89251d23e51d13ef3c8dd5e78758bd5ba32fd3c3613"},{"path":"tracing/init.js","hash":"sha256:6cd8fbf6c573d3a140296af25834c6257b0dfbde805b78e795e00edfa9e5e260"},{"path":"tracing/instrument.js","hash":"sha256:77e2157ab10079ed5201364b65528f498e30ad397bdb7bc414b3b74da4dd5ed1"},{"path":"tracing/middleware.js","hash":"sha256:487c746c475f95f807e1d5a08a6319a5d4b87d0627ea7a227b0882bb91aabf48"},{"path":"tracing/tracer.js","hash":"sha256:8204a703a67da5258a94eb97a736799cdb819188abcfa9c130b4612661148e13"},{"path":"files/extract.js","hash":"sha256:18468f54350cbb2856639fb01655e4e381992d311cc8f05b8fd740c02d819567"},{"path":"files/deep-index.js","hash":"sha256:21c810bb1e88c57d56c4fe23d770b6f8712a4b2e09d54e0d2cd4b21205fb6980"},{"path":"browser/sessions.js","hash":"sha256:889f0ed039650f41dd4ea0a55aa188404fdc14199367bc82ebae56a44c559212"},{"path":"capabilities/definitions/browser.js","hash":"sha256:c2de9cc69907d7b993902673aa7929b735d25591d2dd46ad0620ddf3eb69b113"}],"dependencies":{"@opentelemetry/api":"^1.9.0","@opentelemetry/core":"^1.30.0","@opentelemetry/resources":"^1.30.0","@opentelemetry/sdk-trace-base":"^1.30.0","@opentelemetry/sdk-trace-node":"^1.30.0","@opentelemetry/semantic-conventions":"^1.28.0","tesseract.js":"^7.0.0","playwright":"^1.58.2","@browserbasehq/stagehand":"^3.1.0"}},"files":{"tracing/bridge.js":"LyoqCiAqIEJyaWRnZSBiZXR3ZWVuIHRoZSBjdXN0b20gVHJhY2VyIGFuZCBPcGVuVGVsZW1ldHJ5LgogKgogKiBMaXN0ZW5zIHRvIFJ1bnRpbWVCdXMgZXZlbnRzIGFuZCBjcmVhdGVzIE9UZWwgc3BhbnMgYWxvbmdzaWRlCiAqIHRoZSBleGlzdGluZyBUcmFjZXIgc3BhbnMuIFRoaXMgZW5zdXJlcyBib3RoIHRoZSBjdXN0b20gdHJhY2UKICogQVBJICh1c2VkIGJ5IC9hcGkvdHJhY2VzIGVuZHBvaW50cykgYW5kIE9UZWwgZXhwb3J0IHdvcmsgdG9nZXRoZXIuCiAqLwppbXBvcnQgeyBTcGFuS2luZCwgU3BhblN0YXR1c0NvZGUgfSBmcm9tICJAb3BlbnRlbGVtZXRyeS9hcGkiOwppbXBvcnQgeyBnZXRUcmFjZXIgfSBmcm9tICIuL2luaXQuanMiOwppbXBvcnQgeyBnZXRJbnN0YW5jZU5hbWVMb3dlciB9IGZyb20gIi4uL2luc3RhbmNlLmpzIjsKLy8gVHJhY2sgYWN0aXZlIE9UZWwgc3BhbnMgYnkgYWdlbnRJZApjb25zdCBhY3RpdmVPVGVsU3BhbnMgPSBuZXcgTWFwKCk7Ci8qKgogKiBBdHRhY2ggT1RlbCBzcGFuIGNyZWF0aW9uIHRvIHRoZSBSdW50aW1lQnVzLgogKiBDYWxsIGFsb25nc2lkZSBgdHJhY2VyLmF0dGFjaFRvQnVzKGJ1cylgIGR1cmluZyBpbml0aWFsaXphdGlvbi4KICovCmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hPVGVsVG9CdXMoYnVzKSB7CiAgICBjb25zdCBvdGVsVHJhY2VyID0gZ2V0VHJhY2VyKGAke2dldEluc3RhbmNlTmFtZUxvd2VyKCl9LWFnZW50LXJ1bnRpbWVgKTsKICAgIGJ1cy5vbigiYWdlbnQ6c3Bhd25lZCIsICh7IGFnZW50SWQsIHBpZCB9KSA9PiB7CiAgICAgICAgY29uc3Qgc3BhbiA9IG90ZWxUcmFjZXIuc3RhcnRTcGFuKCJhZ2VudC5saWZlY3ljbGUiLCB7CiAgICAgICAgICAgIGtpbmQ6IFNwYW5LaW5kLklOVEVSTkFMLAogICAgICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICAgICAgICAiYWdlbnQuaWQiOiBhZ2VudElkLAogICAgICAgICAgICAgICAgImFnZW50LnBpZCI6IHBpZCA/PyAwLAogICAgICAgICAgICAgICAgImFnZW50LnN0YXRlIjogInNwYXduZWQiLAogICAgICAgICAgICB9LAogICAgICAgIH0pOwogICAgICAgIGFjdGl2ZU9UZWxTcGFucy5zZXQoYWdlbnRJZCwgc3Bhbik7CiAgICB9KTsKICAgIGJ1cy5vbigiYWdlbnQ6bGlmZWN5Y2xlIiwgKGV2ZW50KSA9PiB7CiAgICAgICAgY29uc3Qgc3BhbiA9IGFjdGl2ZU9UZWxTcGFucy5nZXQoZXZlbnQuYWdlbnRJZCk7CiAgICAgICAgaWYgKCFzcGFuKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgc3Bhbi5hZGRFdmVudChgc3RhdGU6JHtldmVudC5uZXdTdGF0ZX1gLCB7CiAgICAgICAgICAgICJhZ2VudC5wcmV2aW91c19zdGF0ZSI6IGV2ZW50LnByZXZpb3VzU3RhdGUsCiAgICAgICAgICAgIC4uLihldmVudC5yZWFzb24gPyB7IHJlYXNvbjogZXZlbnQucmVhc29uIH0gOiB7fSksCiAgICAgICAgfSk7CiAgICAgICAgLy8gRW5kIHNwYW4gb24gdGVybWluYWwgc3RhdGVzCiAgICAgICAgaWYgKGV2ZW50Lm5ld1N0YXRlID09PSAiY29tcGxldGVkIiB8fAogICAgICAgICAgICBldmVudC5uZXdTdGF0ZSA9PT0gInRlcm1pbmF0ZWQiKSB7CiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuT0sgfSk7CiAgICAgICAgICAgIHNwYW4uZW5kKCk7CiAgICAgICAgICAgIGFjdGl2ZU9UZWxTcGFucy5kZWxldGUoZXZlbnQuYWdlbnRJZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGV2ZW50Lm5ld1N0YXRlID09PSAiZmFpbGVkIikgewogICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7CiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUiwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGV2ZW50LnJlYXNvbiA/PyAiQWdlbnQgZmFpbGVkIiwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHNwYW4uZW5kKCk7CiAgICAgICAgICAgIGFjdGl2ZU9UZWxTcGFucy5kZWxldGUoZXZlbnQuYWdlbnRJZCk7CiAgICAgICAgfQogICAgfSk7CiAgICBidXMub24oImFnZW50OmZhaWxlZCIsICh7IGFnZW50SWQsIGVycm9yIH0pID0+IHsKICAgICAgICBjb25zdCBzcGFuID0gYWN0aXZlT1RlbFNwYW5zLmdldChhZ2VudElkKTsKICAgICAgICBpZiAoIXNwYW4pCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBzcGFuLnJlY29yZEV4Y2VwdGlvbihuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSkpOwogICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKCJlcnJvci5jb2RlIiwgZXJyb3IuY29kZSk7CiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoImVycm9yLnJlY292ZXJhYmxlIiwgZXJyb3IucmVjb3ZlcmFibGUpOwogICAgfSk7CiAgICBidXMub24oImFnZW50OmNvbXBsZXRlZCIsICh7IGFnZW50SWQsIGV4aXRDb2RlIH0pID0+IHsKICAgICAgICBjb25zdCBzcGFuID0gYWN0aXZlT1RlbFNwYW5zLmdldChhZ2VudElkKTsKICAgICAgICBpZiAoIXNwYW4pCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZSgiYWdlbnQuZXhpdF9jb2RlIiwgZXhpdENvZGUgPz8gMCk7CiAgICAgICAgLy8gVGhlIGxpZmVjeWNsZSBldmVudCBoYW5kbGVyIHdpbGwgZW5kIHRoZSBzcGFuCiAgICB9KTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1icmlkZ2UuanMubWFw","tracing/correlation.js":"LyoqCiAqIENvcnJlbGF0aW9uIElEIG1hbmFnZW1lbnQgZm9yIGRpc3RyaWJ1dGVkIHJlcXVlc3QgdHJhY2tpbmcuCiAqCiAqIFByb3ZpZGVzIGEgcGVyLXJlcXVlc3QgY29ycmVsYXRpb24gY29udGV4dCB1c2luZyBOb2RlLmpzIEFzeW5jTG9jYWxTdG9yYWdlLgogKiBUaGUgY29ycmVsYXRpb24gSUQgZmxvd3MgYXV0b21hdGljYWxseSB0aHJvdWdoIGFzeW5jIG9wZXJhdGlvbnMgd2l0aGluCiAqIGEgcmVxdWVzdCBsaWZlY3ljbGUg4oCUIG5vIG1hbnVhbCB0aHJlYWRpbmcgcmVxdWlyZWQuCiAqCiAqIFVzYWdlOgogKiAgIHdpdGhDb3JyZWxhdGlvbihjb3JyZWxhdGlvbklkLCBhc3luYyAoKSA9PiB7IC4uLiB9KQogKiAgIGdldENvcnJlbGF0aW9uSWQoKSAvLyByZXR1cm5zIGN1cnJlbnQgSUQgb3IgdW5kZWZpbmVkCiAqLwppbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gIm5vZGU6YXN5bmNfaG9va3MiOwppbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gIm5vZGU6Y3J5cHRvIjsKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEFzeW5jTG9jYWxTdG9yYWdlIGluc3RhbmNlCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjb25zdCBzdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBQdWJsaWMgQVBJCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKiogR2VuZXJhdGUgYSBuZXcgY29ycmVsYXRpb24gSUQuIEZvcm1hdDogYGNvcl88dGltZXN0YW1wPl88cmFuZG9tPmAuICovCmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUNvcnJlbGF0aW9uSWQoKSB7CiAgICByZXR1cm4gYGNvcl8ke0RhdGUubm93KCl9XyR7cmFuZG9tQnl0ZXMoNCkudG9TdHJpbmcoImhleCIpfWA7Cn0KLyoqCiAqIFJ1biBhIGZ1bmN0aW9uIHdpdGhpbiBhIGNvcnJlbGF0aW9uIGNvbnRleHQuCiAqIFRoZSBjb3JyZWxhdGlvbiBJRCBpcyBhdmFpbGFibGUgdG8gYWxsIGFzeW5jIGNvZGUgd2l0aGluIHRoZSBjYWxsYmFjawogKiB2aWEgYGdldENvcnJlbGF0aW9uSWQoKWAuCiAqLwpleHBvcnQgZnVuY3Rpb24gd2l0aENvcnJlbGF0aW9uKGNvcnJlbGF0aW9uSWQsIGZuLCBiYWdnYWdlKSB7CiAgICBjb25zdCBwYXJlbnRDdHggPSBzdG9yYWdlLmdldFN0b3JlKCk7CiAgICBjb25zdCBjdHggPSB7CiAgICAgICAgY29ycmVsYXRpb25JZCwKICAgICAgICBwYXJlbnRDb3JyZWxhdGlvbklkOiBwYXJlbnRDdHg/LmNvcnJlbGF0aW9uSWQsCiAgICAgICAgYmFnZ2FnZTogeyAuLi5wYXJlbnRDdHg/LmJhZ2dhZ2UsIC4uLmJhZ2dhZ2UgfSwKICAgIH07CiAgICByZXR1cm4gc3RvcmFnZS5ydW4oY3R4LCBmbik7Cn0KLyoqIEdldCB0aGUgY3VycmVudCBjb3JyZWxhdGlvbiBJRCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBpbiBhIGNvcnJlbGF0aW9uIGNvbnRleHQuICovCmV4cG9ydCBmdW5jdGlvbiBnZXRDb3JyZWxhdGlvbklkKCkgewogICAgcmV0dXJuIHN0b3JhZ2UuZ2V0U3RvcmUoKT8uY29ycmVsYXRpb25JZDsKfQovKiogR2V0IHRoZSBmdWxsIGNvcnJlbGF0aW9uIGNvbnRleHQsIG9yIHVuZGVmaW5lZC4gKi8KZXhwb3J0IGZ1bmN0aW9uIGdldENvcnJlbGF0aW9uQ29udGV4dCgpIHsKICAgIHJldHVybiBzdG9yYWdlLmdldFN0b3JlKCk7Cn0KLyoqIEhUVFAgaGVhZGVyIG5hbWUgZm9yIGNvcnJlbGF0aW9uIElEIHByb3BhZ2F0aW9uLiAqLwpleHBvcnQgY29uc3QgQ09SUkVMQVRJT05fSEVBREVSID0gIngtY29ycmVsYXRpb24taWQiOwovLyMgc291cmNlTWFwcGluZ1VSTD1jb3JyZWxhdGlvbi5qcy5tYXA=","tracing/index.js":"LyoqCiAqIERpc3RyaWJ1dGVkIHRyYWNpbmcgbW9kdWxlIOKAlCBwdWJsaWMgQVBJLgogKgogKiBSZS1leHBvcnRzIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIGluaXRpYWxpemUsIGluc3RydW1lbnQsIGFuZCBxdWVyeSB0cmFjZXMuCiAqLwovLyBPVGVsIGluaXRpYWxpemF0aW9uCmV4cG9ydCB7IGluaXRUcmFjaW5nLCBzaHV0ZG93blRyYWNpbmcsIGdldFRyYWNlciB9IGZyb20gIi4vaW5pdC5qcyI7Ci8vIENvcnJlbGF0aW9uIElEcwpleHBvcnQgeyBnZW5lcmF0ZUNvcnJlbGF0aW9uSWQsIHdpdGhDb3JyZWxhdGlvbiwgZ2V0Q29ycmVsYXRpb25JZCwgZ2V0Q29ycmVsYXRpb25Db250ZXh0LCBDT1JSRUxBVElPTl9IRUFERVIsIH0gZnJvbSAiLi9jb3JyZWxhdGlvbi5qcyI7Ci8vIEluc3RydW1lbnRhdGlvbiBoZWxwZXJzCmV4cG9ydCB7IHdpdGhTcGFuLCB3aXRoU3BhblN5bmMsIHRyYWNlQWdlbnRTcGF3biwgdHJhY2VBZ2VudEV4ZWN1dGlvbiwgdHJhY2VBcGlDYWxsLCB0cmFjZUZpbGVPcCwgdHJhY2VIdHRwUmVxdWVzdCwgfSBmcm9tICIuL2luc3RydW1lbnQuanMiOwovLyBIb25vIG1pZGRsZXdhcmUKZXhwb3J0IHsgdHJhY2luZ01pZGRsZXdhcmUgfSBmcm9tICIuL21pZGRsZXdhcmUuanMiOwovLyBPVGVsIOKGlCBDb3JlIFRyYWNlciBicmlkZ2UKZXhwb3J0IHsgYXR0YWNoT1RlbFRvQnVzIH0gZnJvbSAiLi9icmlkZ2UuanMiOwovLyBFeGlzdGluZyBjdXN0b20gdHJhY2VyIChmb3IgL2FwaS90cmFjZXMgZW5kcG9pbnRzKQpleHBvcnQgeyBUcmFjZXIsIGdlbmVyYXRlVHJhY2VJZCwgZ2VuZXJhdGVTcGFuSWQgfSBmcm9tICIuL3RyYWNlci5qcyI7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcA==","tracing/init.js":"LyoqCiAqIE9wZW5UZWxlbWV0cnkgaW5pdGlhbGl6YXRpb24gZm9yIENvcmUuCiAqCiAqIFNldHMgdXAgdGhlIE9UZWwgU0RLIHdpdGggYSBjb25zb2xlIGV4cG9ydGVyIChkZWZhdWx0KSBhbmQgZXh0ZW5zaWJsZQogKiBjb25maWd1cmF0aW9uIGZvciBmdXR1cmUgYmFja2VuZHMgKEphZWdlciwgT1RMUCwgZXRjLikuCiAqCiAqIENhbGwgYGluaXRUcmFjaW5nKClgIGVhcmx5IGluIHRoZSBzdGFydHVwIHNlcXVlbmNlIOKAlCBiZWZvcmUgYW55CiAqIGluc3RydW1lbnRlZCBjb2RlIHJ1bnMg4oCUIHNvIHRoZSBnbG9iYWwgdHJhY2VyIHByb3ZpZGVyIGlzIHJlZ2lzdGVyZWQuCiAqLwppbXBvcnQgeyBOb2RlVHJhY2VyUHJvdmlkZXIgfSBmcm9tICJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2Utbm9kZSI7CmltcG9ydCB7IFNpbXBsZVNwYW5Qcm9jZXNzb3IsIEJhdGNoU3BhblByb2Nlc3NvciwgQ29uc29sZVNwYW5FeHBvcnRlciwgfSBmcm9tICJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZSI7CmltcG9ydCB7IFJlc291cmNlIH0gZnJvbSAiQG9wZW50ZWxlbWV0cnkvcmVzb3VyY2VzIjsKaW1wb3J0IHsgQVRUUl9TRVJWSUNFX05BTUUsIEFUVFJfU0VSVklDRV9WRVJTSU9OLCB9IGZyb20gIkBvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zIjsKaW1wb3J0IHsgdHJhY2UgfSBmcm9tICJAb3BlbnRlbGVtZXRyeS9hcGkiOwppbXBvcnQgeyBnZXRJbnN0YW5jZU5hbWVMb3dlciB9IGZyb20gIi4uL2luc3RhbmNlLmpzIjsKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIE1vZHVsZSBzdGF0ZQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbGV0IHByb3ZpZGVyID0gbnVsbDsKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFB1YmxpYyBBUEkKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8qKgogKiBJbml0aWFsaXplIE9wZW5UZWxlbWV0cnkgdHJhY2luZy4KICogU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzIOKAlCBzdWJzZXF1ZW50IGNhbGxzIGFyZSBuby1vcHMuCiAqIFJldHVybnMgdGhlIFRyYWNlclByb3ZpZGVyIGZvciB0ZXN0aW5nIG9yIG1hbnVhbCBjb250cm9sLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGluaXRUcmFjaW5nKGNvbmZpZykgewogICAgaWYgKHByb3ZpZGVyKQogICAgICAgIHJldHVybiBwcm92aWRlcjsKICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gY29uZmlnPy5zZXJ2aWNlTmFtZSA/PyBgJHtnZXRJbnN0YW5jZU5hbWVMb3dlcigpfS1icmFpbmA7CiAgICBjb25zdCBzZXJ2aWNlVmVyc2lvbiA9IGNvbmZpZz8uc2VydmljZVZlcnNpb24gPz8gIjAuMS4wIjsKICAgIGNvbnN0IHJlc291cmNlID0gbmV3IFJlc291cmNlKHsKICAgICAgICBbQVRUUl9TRVJWSUNFX05BTUVdOiBzZXJ2aWNlTmFtZSwKICAgICAgICBbQVRUUl9TRVJWSUNFX1ZFUlNJT05dOiBzZXJ2aWNlVmVyc2lvbiwKICAgICAgICAuLi5jb25maWc/LnJlc291cmNlQXR0cmlidXRlcywKICAgIH0pOwogICAgcHJvdmlkZXIgPSBuZXcgTm9kZVRyYWNlclByb3ZpZGVyKHsgcmVzb3VyY2UgfSk7CiAgICAvLyBDb25zb2xlIGV4cG9ydGVyIChvcHQtaW46IHBhc3MgY29uc29sZUV4cG9ydDp0cnVlIG9yIHNldCBPVEVMX0NPTlNPTEU9MSkKICAgIGNvbnN0IGVuYWJsZUNvbnNvbGUgPSBjb25maWc/LmNvbnNvbGVFeHBvcnQgPz8gcHJvY2Vzcy5lbnYuT1RFTF9DT05TT0xFID09PSAiMSI7CiAgICBpZiAoZW5hYmxlQ29uc29sZSkgewogICAgICAgIGNvbnN0IGNvbnNvbGVFeHBvcnRlciA9IG5ldyBDb25zb2xlU3BhbkV4cG9ydGVyKCk7CiAgICAgICAgaWYgKGNvbmZpZz8uYmF0Y2gpIHsKICAgICAgICAgICAgcHJvdmlkZXIuYWRkU3BhblByb2Nlc3NvcihuZXcgQmF0Y2hTcGFuUHJvY2Vzc29yKGNvbnNvbGVFeHBvcnRlcikpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHJvdmlkZXIuYWRkU3BhblByb2Nlc3NvcihuZXcgU2ltcGxlU3BhblByb2Nlc3Nvcihjb25zb2xlRXhwb3J0ZXIpKTsKICAgICAgICB9CiAgICB9CiAgICAvLyBBZGRpdGlvbmFsIGV4cG9ydGVycyAoZS5nLiBPVExQIGZvciBKYWVnZXIvR3JhZmFuYSBUZW1wbykKICAgIGlmIChjb25maWc/LmV4cG9ydGVycykgewogICAgICAgIGZvciAoY29uc3QgZXhwb3J0ZXIgb2YgY29uZmlnLmV4cG9ydGVycykgewogICAgICAgICAgICBpZiAoY29uZmlnPy5iYXRjaCkgewogICAgICAgICAgICAgICAgcHJvdmlkZXIuYWRkU3BhblByb2Nlc3NvcihuZXcgQmF0Y2hTcGFuUHJvY2Vzc29yKGV4cG9ydGVyKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwcm92aWRlci5hZGRTcGFuUHJvY2Vzc29yKG5ldyBTaW1wbGVTcGFuUHJvY2Vzc29yKGV4cG9ydGVyKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvLyBSZWdpc3RlciBhcyB0aGUgZ2xvYmFsIHRyYWNlciBwcm92aWRlcgogICAgcHJvdmlkZXIucmVnaXN0ZXIoKTsKICAgIHJldHVybiBwcm92aWRlcjsKfQovKioKICogR3JhY2VmdWxseSBzaHV0IGRvd24gdHJhY2luZyDigJQgZmx1c2hlcyBwZW5kaW5nIHNwYW5zLgogKiBDYWxsIGR1cmluZyBzZXJ2ZXIgc2h1dGRvd24uCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gc2h1dGRvd25UcmFjaW5nKCkgewogICAgaWYgKCFwcm92aWRlcikKICAgICAgICByZXR1cm47CiAgICBhd2FpdCBwcm92aWRlci5zaHV0ZG93bigpOwogICAgcHJvdmlkZXIgPSBudWxsOwp9Ci8qKgogKiBHZXQgdGhlIHRyYWNlciBpbnN0YW5jZS4gQWx3YXlzIHJldHVybnMgYSB2YWxpZCB0cmFjZXIKICogKG5vb3AgdHJhY2VyIGlmIGluaXRUcmFjaW5nIGhhc24ndCBiZWVuIGNhbGxlZCB5ZXQpLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGdldFRyYWNlcihuYW1lKSB7CiAgICByZXR1cm4gdHJhY2UuZ2V0VHJhY2VyKG5hbWUgPz8gYCR7Z2V0SW5zdGFuY2VOYW1lTG93ZXIoKX0tYnJhaW5gKTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1pbml0LmpzLm1hcA==","tracing/instrument.js":"LyoqCiAqIEluc3RydW1lbnRhdGlvbiBoZWxwZXJzIGZvciB3cmFwcGluZyBDb3JlIG9wZXJhdGlvbnMgd2l0aCBPVGVsIHNwYW5zLgogKgogKiBQcm92aWRlcyB0eXBlZCB3cmFwcGVycyBmb3IgdGhlIGtleSBvcGVyYXRpb24gY2F0ZWdvcmllczoKICogLSBBZ2VudCBleGVjdXRpb24gKHNwYXduLCBsaWZlY3ljbGUpCiAqIC0gRXh0ZXJuYWwgQVBJIGNhbGxzIChMaW5lYXIsIEdvb2dsZSwgT3BlblJvdXRlcikKICogLSBGaWxlIG9wZXJhdGlvbnMgKGluZ2VzdCwgcmVhZCwgd3JpdGUpCiAqIC0gSFRUUCByZXF1ZXN0IGhhbmRsaW5nCiAqCiAqIEVhY2ggd3JhcHBlciBjcmVhdGVzIGFuIE9UZWwgc3BhbiwgcmVjb3JkcyByZWxldmFudCBhdHRyaWJ1dGVzLAogKiBhbmQgcHJvcGVybHkgaGFuZGxlcyBlcnJvcnMgYW5kIHN0YXR1cyBjb2Rlcy4KICovCmltcG9ydCB7IFNwYW5TdGF0dXNDb2RlLCBTcGFuS2luZCwgfSBmcm9tICJAb3BlbnRlbGVtZXRyeS9hcGkiOwppbXBvcnQgeyBnZXRUcmFjZXIgfSBmcm9tICIuL2luaXQuanMiOwppbXBvcnQgeyBnZXRDb3JyZWxhdGlvbklkIH0gZnJvbSAiLi9jb3JyZWxhdGlvbi5qcyI7Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBHZW5lcmljIHNwYW4gd3JhcHBlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLyoqCiAqIFdyYXAgYW4gYXN5bmMgb3BlcmF0aW9uIGluIGFuIE9UZWwgc3Bhbi4KICogQXV0b21hdGljYWxseSByZWNvcmRzIGVycm9ycyBhbmQgc2V0cyBzcGFuIHN0YXR1cy4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoU3BhbihuYW1lLCBmbiwgb3B0cykgewogICAgY29uc3QgdHJhY2VyID0gZ2V0VHJhY2VyKCk7CiAgICByZXR1cm4gdHJhY2VyLnN0YXJ0QWN0aXZlU3BhbihuYW1lLCB7CiAgICAgICAga2luZDogb3B0cz8ua2luZCA/PyBTcGFuS2luZC5JTlRFUk5BTCwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICAgIC4uLm9wdHM/LmF0dHJpYnV0ZXMsCiAgICAgICAgICAgIC4uLihnZXRDb3JyZWxhdGlvbklkKCkKICAgICAgICAgICAgICAgID8geyAiZGFzaC5jb3JyZWxhdGlvbl9pZCI6IGdldENvcnJlbGF0aW9uSWQoKSB9CiAgICAgICAgICAgICAgICA6IHt9KSwKICAgICAgICB9LAogICAgfSwgYXN5bmMgKHNwYW4pID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihzcGFuKTsKICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSyB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7CiAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUiwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHNwYW4ucmVjb3JkRXhjZXB0aW9uKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKFN0cmluZyhlcnIpKSk7CiAgICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIHNwYW4uZW5kKCk7CiAgICAgICAgfQogICAgfSk7Cn0KLyoqCiAqIFdyYXAgYSBzeW5jaHJvbm91cyBvcGVyYXRpb24gaW4gYW4gT1RlbCBzcGFuLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHdpdGhTcGFuU3luYyhuYW1lLCBmbiwgb3B0cykgewogICAgY29uc3QgdHJhY2VyID0gZ2V0VHJhY2VyKCk7CiAgICBjb25zdCBzcGFuID0gdHJhY2VyLnN0YXJ0U3BhbihuYW1lLCB7CiAgICAgICAga2luZDogb3B0cz8ua2luZCA/PyBTcGFuS2luZC5JTlRFUk5BTCwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICAgIC4uLm9wdHM/LmF0dHJpYnV0ZXMsCiAgICAgICAgICAgIC4uLihnZXRDb3JyZWxhdGlvbklkKCkKICAgICAgICAgICAgICAgID8geyAiZGFzaC5jb3JyZWxhdGlvbl9pZCI6IGdldENvcnJlbGF0aW9uSWQoKSB9CiAgICAgICAgICAgICAgICA6IHt9KSwKICAgICAgICB9LAogICAgfSk7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGZuKHNwYW4pOwogICAgICAgIHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuT0sgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBzcGFuLnNldFN0YXR1cyh7CiAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLAogICAgICAgICAgICBtZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksCiAgICAgICAgfSk7CiAgICAgICAgc3Bhbi5yZWNvcmRFeGNlcHRpb24oZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoU3RyaW5nKGVycikpKTsKICAgICAgICB0aHJvdyBlcnI7CiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBzcGFuLmVuZCgpOwogICAgfQp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBZ2VudCBpbnN0cnVtZW50YXRpb24KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8qKiBXcmFwIGFuIGFnZW50IHNwYXduIG9wZXJhdGlvbi4gKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYWNlQWdlbnRTcGF3bih0YXNrSWQsIGxhYmVsLCBvcmlnaW4sIGZuKSB7CiAgICByZXR1cm4gd2l0aFNwYW4oYGFnZW50LnNwYXduYCwgZm4sIHsKICAgICAgICBraW5kOiBTcGFuS2luZC5QUk9EVUNFUiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICAgICJhZ2VudC50YXNrX2lkIjogdGFza0lkLAogICAgICAgICAgICAiYWdlbnQubGFiZWwiOiBsYWJlbCwKICAgICAgICAgICAgImFnZW50Lm9yaWdpbiI6IG9yaWdpbiwKICAgICAgICB9LAogICAgfSk7Cn0KLyoqIFdyYXAgYWdlbnQgZXhlY3V0aW9uICh0aGUgZnVsbCBsaWZlY3ljbGUgb2YgYSBzaW5nbGUgYWdlbnQgcnVuKS4gKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYWNlQWdlbnRFeGVjdXRpb24odGFza0lkLCBsYWJlbCwgZm4pIHsKICAgIHJldHVybiB3aXRoU3BhbihgYWdlbnQuZXhlY3V0ZWAsIGZuLCB7CiAgICAgICAga2luZDogU3BhbktpbmQuSU5URVJOQUwsCiAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgICAiYWdlbnQudGFza19pZCI6IHRhc2tJZCwKICAgICAgICAgICAgImFnZW50LmxhYmVsIjogbGFiZWwsCiAgICAgICAgfSwKICAgIH0pOwp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBUEkgY2FsbCBpbnN0cnVtZW50YXRpb24KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8qKiBXcmFwIGFuIGV4dGVybmFsIEFQSSBjYWxsIChMaW5lYXIsIEdvb2dsZSwgT3BlblJvdXRlciwgZXRjLikuICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFjZUFwaUNhbGwoc2VydmljZSwgb3BlcmF0aW9uLCBmbikgewogICAgcmV0dXJuIHdpdGhTcGFuKGAke3NlcnZpY2V9LiR7b3BlcmF0aW9ufWAsIGZuLCB7CiAgICAgICAga2luZDogU3BhbktpbmQuQ0xJRU5ULAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgICAgInJwYy5zZXJ2aWNlIjogc2VydmljZSwKICAgICAgICAgICAgInJwYy5tZXRob2QiOiBvcGVyYXRpb24sCiAgICAgICAgfSwKICAgIH0pOwp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBGaWxlIG9wZXJhdGlvbiBpbnN0cnVtZW50YXRpb24KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8qKiBXcmFwIGEgZmlsZSBvcGVyYXRpb24gKHJlYWQsIHdyaXRlLCBpbmdlc3QpLiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhY2VGaWxlT3Aob3BlcmF0aW9uLCBwYXRoLCBmbikgewogICAgcmV0dXJuIHdpdGhTcGFuKGBmaWxlLiR7b3BlcmF0aW9ufWAsIGZuLCB7CiAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgICAiZmlsZS5vcGVyYXRpb24iOiBvcGVyYXRpb24sCiAgICAgICAgICAgICJmaWxlLnBhdGgiOiBwYXRoLAogICAgICAgIH0sCiAgICB9KTsKfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSFRUUCBpbnN0cnVtZW50YXRpb24KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8qKiBXcmFwIGFuIEhUVFAgcmVxdWVzdCBoYW5kbGVyLiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhY2VIdHRwUmVxdWVzdChtZXRob2QsIHJvdXRlLCBmbikgewogICAgcmV0dXJuIHdpdGhTcGFuKGBIVFRQICR7bWV0aG9kfSAke3JvdXRlfWAsIGZuLCB7CiAgICAgICAga2luZDogU3BhbktpbmQuU0VSVkVSLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgICAgImh0dHAubWV0aG9kIjogbWV0aG9kLAogICAgICAgICAgICAiaHR0cC5yb3V0ZSI6IHJvdXRlLAogICAgICAgIH0sCiAgICB9KTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1pbnN0cnVtZW50LmpzLm1hcA==","tracing/middleware.js":"LyoqCiAqIEhvbm8gbWlkZGxld2FyZSBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZy4KICoKICogQXV0b21hdGljYWxseSBjcmVhdGVzIE9UZWwgc3BhbnMgZm9yIEhUVFAgcmVxdWVzdHMgYW5kIHByb3BhZ2F0ZXMKICogY29ycmVsYXRpb24gSURzIHZpYSB0aGUgYHgtY29ycmVsYXRpb24taWRgIGhlYWRlci4KICoKICogQWRkcyB0byBldmVyeSByZXF1ZXN0OgogKiAtIEFuIE9UZWwgc3BhbiB3aXRoIEhUVFAgc2VtYW50aWMgYXR0cmlidXRlcwogKiAtIEEgY29ycmVsYXRpb24gSUQgKGZyb20gaGVhZGVyIG9yIGF1dG8tZ2VuZXJhdGVkKQogKiAtIFJlc3BvbnNlIGhlYWRlcnM6IHgtY29ycmVsYXRpb24taWQsIHgtdHJhY2UtaWQKICovCmltcG9ydCB7IFNwYW5LaW5kLCBTcGFuU3RhdHVzQ29kZSB9IGZyb20gIkBvcGVudGVsZW1ldHJ5L2FwaSI7CmltcG9ydCB7IGdldFRyYWNlciB9IGZyb20gIi4vaW5pdC5qcyI7CmltcG9ydCB7IGdlbmVyYXRlQ29ycmVsYXRpb25JZCwgd2l0aENvcnJlbGF0aW9uLCBDT1JSRUxBVElPTl9IRUFERVIsIH0gZnJvbSAiLi9jb3JyZWxhdGlvbi5qcyI7Ci8qKgogKiBUcmFjaW5nIG1pZGRsZXdhcmUgZm9yIEhvbm8uCiAqIFdyYXBzIGVhY2ggcmVxdWVzdCBpbiBhbiBPVGVsIHNwYW4gYW5kIGNvcnJlbGF0aW9uIGNvbnRleHQuCiAqLwpleHBvcnQgZnVuY3Rpb24gdHJhY2luZ01pZGRsZXdhcmUoKSB7CiAgICByZXR1cm4gYXN5bmMgKGMsIG5leHQpID0+IHsKICAgICAgICBjb25zdCB0cmFjZXIgPSBnZXRUcmFjZXIoKTsKICAgICAgICBjb25zdCBtZXRob2QgPSBjLnJlcS5tZXRob2Q7CiAgICAgICAgY29uc3QgcGF0aCA9IG5ldyBVUkwoYy5yZXEudXJsKS5wYXRobmFtZTsKICAgICAgICAvLyBFeHRyYWN0IG9yIGdlbmVyYXRlIGNvcnJlbGF0aW9uIElECiAgICAgICAgY29uc3QgaW5jb21pbmdDb3JyZWxhdGlvbklkID0gYy5yZXEuaGVhZGVyKENPUlJFTEFUSU9OX0hFQURFUik7CiAgICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGluY29taW5nQ29ycmVsYXRpb25JZCB8fCBnZW5lcmF0ZUNvcnJlbGF0aW9uSWQoKTsKICAgICAgICAvLyBSdW4gdGhlIGhhbmRsZXIgaW5zaWRlIGJvdGggYW4gT1RlbCBzcGFuIGFuZCBjb3JyZWxhdGlvbiBjb250ZXh0CiAgICAgICAgYXdhaXQgd2l0aENvcnJlbGF0aW9uKGNvcnJlbGF0aW9uSWQsIGFzeW5jICgpID0+IHsKICAgICAgICAgICAgY29uc3Qgc3BhbiA9IHRyYWNlci5zdGFydFNwYW4oYEhUVFAgJHttZXRob2R9ICR7cGF0aH1gLCB7CiAgICAgICAgICAgICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsCiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICAgICAgICAgICAgImh0dHAubWV0aG9kIjogbWV0aG9kLAogICAgICAgICAgICAgICAgICAgICJodHRwLnJvdXRlIjogcGF0aCwKICAgICAgICAgICAgICAgICAgICAiaHR0cC51cmwiOiBjLnJlcS51cmwsCiAgICAgICAgICAgICAgICAgICAgImRhc2guY29ycmVsYXRpb25faWQiOiBjb3JyZWxhdGlvbklkLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBhd2FpdCBuZXh0KCk7CiAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXMgPSBjLnJlcy5zdGF0dXM7CiAgICAgICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZSgiaHR0cC5zdGF0dXNfY29kZSIsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID49IDQwMCkgewogICAgICAgICAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHsKICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBIVFRQICR7c3RhdHVzfWAsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7IGNvZGU6IFNwYW5TdGF0dXNDb2RlLk9LIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHsKICAgICAgICAgICAgICAgICAgICBjb2RlOiBTcGFuU3RhdHVzQ29kZS5FUlJPUiwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHNwYW4ucmVjb3JkRXhjZXB0aW9uKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKFN0cmluZyhlcnIpKSk7CiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICBzcGFuLmVuZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBjb3JyZWxhdGlvbiArIHRyYWNlIElEcyBpbiByZXNwb25zZSBoZWFkZXJzCiAgICAgICAgICAgIGMuaGVhZGVyKENPUlJFTEFUSU9OX0hFQURFUiwgY29ycmVsYXRpb25JZCk7CiAgICAgICAgICAgIGMuaGVhZGVyKCJ4LXRyYWNlLWlkIiwgc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlSWQpOwogICAgICAgIH0pOwogICAgfTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1taWRkbGV3YXJlLmpzLm1hcA==","tracing/tracer.js":"LyoqCiAqIExpZ2h0d2VpZ2h0IHRyYWNpbmcgZm9yIENvcmUgYWdlbnQgcnVudGltZS4KICoKICogSG9va3MgaW50byBSdW50aW1lQnVzIGxpZmVjeWNsZSBldmVudHMgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgdHJhY2Ugc3BhbnMKICogZm9yIGFnZW50IG9wZXJhdGlvbnMgKHNwYXduLCBwYXVzZSwgcmVzdW1lLCB0ZXJtaW5hdGUsIGNvbXBsZXRlLCBmYWlsKS4KICogVHJhY2tzIHBhcmVudOKGkmNoaWxkIGFnZW50IHJlbGF0aW9uc2hpcHMgYXMgbmVzdGVkIHNwYW5zIHdpdGhpbiBhIHRyYWNlLgogKgogKiBUcmFjZS9zcGFuIElEcyB1c2UgVzNDLWNvbXBhdGlibGUgaGV4IGZvcm1hdCBmb3IgZnV0dXJlIE9UZWwgZXhwb3J0LgogKi8KaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICJub2RlOmNyeXB0byI7Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBJRCBnZW5lcmF0aW9uIChXM0MgVHJhY2UgQ29udGV4dCBjb21wYXRpYmxlKQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLyoqIDE2LWJ5dGUgKDMyIGhleCBjaGFyKSB0cmFjZSBJRC4gKi8KZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVHJhY2VJZCgpIHsKICAgIHJldHVybiByYW5kb21CeXRlcygxNikudG9TdHJpbmcoImhleCIpOwp9Ci8qKiA4LWJ5dGUgKDE2IGhleCBjaGFyKSBzcGFuIElELiAqLwpleHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTcGFuSWQoKSB7CiAgICByZXR1cm4gcmFuZG9tQnl0ZXMoOCkudG9TdHJpbmcoImhleCIpOwp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBUcmFjZXIKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmV4cG9ydCBjbGFzcyBUcmFjZXIgewogICAgLyoqIEFsbCBzcGFucyBpbmRleGVkIGJ5IHNwYW5JZC4gKi8KICAgIHNwYW5zID0gbmV3IE1hcCgpOwogICAgLyoqIGFnZW50SWQg4oaSIGFjdGl2ZSBzcGFuSWQgZm9yIHRoYXQgYWdlbnQuICovCiAgICBhY3RpdmVTcGFucyA9IG5ldyBNYXAoKTsKICAgIC8qKiBhZ2VudElkIOKGkiB0cmFjZUlkIChzbyBjaGlsZCBhZ2VudHMgaW5oZXJpdCB0aGUgcGFyZW50J3MgdHJhY2UpLiAqLwogICAgYWdlbnRUcmFjZXMgPSBuZXcgTWFwKCk7CiAgICAvKiogdHJhY2VJZCDihpIgc2V0IG9mIHNwYW5JZHMuICovCiAgICB0cmFjZVNwYW5zID0gbmV3IE1hcCgpOwogICAgLyoqIHRyYWNlSWQg4oaSIHJvb3Qgc3BhbklkLiAqLwogICAgdHJhY2VSb290cyA9IG5ldyBNYXAoKTsKICAgIC8qKiBNYXhpbXVtIG51bWJlciBvZiBjb21wbGV0ZWQgdHJhY2VzIHRvIHJldGFpbi4gKi8KICAgIG1heFRyYWNlczsKICAgIC8qKiBPcmRlcmVkIGxpc3Qgb2YgdHJhY2VJZHMgZm9yIGV2aWN0aW9uLiAqLwogICAgdHJhY2VPcmRlciA9IFtdOwogICAgY29uc3RydWN0b3Iob3B0cykgewogICAgICAgIHRoaXMubWF4VHJhY2VzID0gb3B0cz8ubWF4VHJhY2VzID8/IDUwMDsKICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIE1hbnVhbCBzcGFuIEFQSQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqIFN0YXJ0IGEgbmV3IHNwYW4uIElmIHBhcmVudEFnZW50SWQgaXMgcHJvdmlkZWQsIGpvaW5zIHRoYXQgYWdlbnQncyB0cmFjZS4gKi8KICAgIHN0YXJ0U3BhbihvcHRzKSB7CiAgICAgICAgLy8gRGV0ZXJtaW5lIHRyYWNlIGNvbnRleHQKICAgICAgICBsZXQgdHJhY2VJZDsKICAgICAgICBsZXQgcGFyZW50U3BhbklkOwogICAgICAgIGlmIChvcHRzLnBhcmVudEFnZW50SWQgJiYgdGhpcy5hZ2VudFRyYWNlcy5oYXMob3B0cy5wYXJlbnRBZ2VudElkKSkgewogICAgICAgICAgICAvLyBKb2luIHBhcmVudCdzIHRyYWNlCiAgICAgICAgICAgIHRyYWNlSWQgPSB0aGlzLmFnZW50VHJhY2VzLmdldChvcHRzLnBhcmVudEFnZW50SWQpOwogICAgICAgICAgICBwYXJlbnRTcGFuSWQgPSB0aGlzLmFjdGl2ZVNwYW5zLmdldChvcHRzLnBhcmVudEFnZW50SWQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gTmV3IHJvb3QgdHJhY2UKICAgICAgICAgICAgdHJhY2VJZCA9IGdlbmVyYXRlVHJhY2VJZCgpOwogICAgICAgIH0KICAgICAgICBjb25zdCBzcGFuSWQgPSBnZW5lcmF0ZVNwYW5JZCgpOwogICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKICAgICAgICBjb25zdCBzcGFuID0gewogICAgICAgICAgICB0cmFjZUlkLAogICAgICAgICAgICBzcGFuSWQsCiAgICAgICAgICAgIHBhcmVudFNwYW5JZCwKICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogb3B0cy5vcGVyYXRpb25OYW1lLAogICAgICAgICAgICBhZ2VudElkOiBvcHRzLmFnZW50SWQsCiAgICAgICAgICAgIHRhc2tJZDogb3B0cy50YXNrSWQsCiAgICAgICAgICAgIHN0YXJ0VGltZTogbm93LAogICAgICAgICAgICBzdGF0dXM6ICJydW5uaW5nIiwKICAgICAgICAgICAgYXR0cmlidXRlczogb3B0cy5hdHRyaWJ1dGVzID8/IHt9LAogICAgICAgICAgICBldmVudHM6IFtdLAogICAgICAgIH07CiAgICAgICAgdGhpcy5zcGFucy5zZXQoc3BhbklkLCBzcGFuKTsKICAgICAgICB0aGlzLmFjdGl2ZVNwYW5zLnNldChvcHRzLmFnZW50SWQsIHNwYW5JZCk7CiAgICAgICAgdGhpcy5hZ2VudFRyYWNlcy5zZXQob3B0cy5hZ2VudElkLCB0cmFjZUlkKTsKICAgICAgICAvLyBUcmFjayBzcGFuIGluIHRyYWNlIGluZGV4CiAgICAgICAgaWYgKCF0aGlzLnRyYWNlU3BhbnMuaGFzKHRyYWNlSWQpKSB7CiAgICAgICAgICAgIHRoaXMudHJhY2VTcGFucy5zZXQodHJhY2VJZCwgbmV3IFNldCgpKTsKICAgICAgICAgICAgdGhpcy50cmFjZVJvb3RzLnNldCh0cmFjZUlkLCBzcGFuSWQpOwogICAgICAgICAgICB0aGlzLnRyYWNlT3JkZXIucHVzaCh0cmFjZUlkKTsKICAgICAgICAgICAgdGhpcy5ldmljdCgpOwogICAgICAgIH0KICAgICAgICB0aGlzLnRyYWNlU3BhbnMuZ2V0KHRyYWNlSWQpLmFkZChzcGFuSWQpOwogICAgICAgIHJldHVybiBzcGFuOwogICAgfQogICAgLyoqIEFkZCBhbiBldmVudCB0byBhbiBhY3RpdmUgc3Bhbi4gKi8KICAgIGFkZEV2ZW50KHNwYW5JZCwgbmFtZSwgYXR0cmlidXRlcykgewogICAgICAgIGNvbnN0IHNwYW4gPSB0aGlzLnNwYW5zLmdldChzcGFuSWQpOwogICAgICAgIGlmICghc3BhbikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHNwYW4uZXZlbnRzLnB1c2goewogICAgICAgICAgICBuYW1lLAogICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgYXR0cmlidXRlcywKICAgICAgICB9KTsKICAgIH0KICAgIC8qKiBTZXQgYXR0cmlidXRlcyBvbiBhIHNwYW4uICovCiAgICBzZXRBdHRyaWJ1dGVzKHNwYW5JZCwgYXR0cmlidXRlcykgewogICAgICAgIGNvbnN0IHNwYW4gPSB0aGlzLnNwYW5zLmdldChzcGFuSWQpOwogICAgICAgIGlmICghc3BhbikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIE9iamVjdC5hc3NpZ24oc3Bhbi5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKTsKICAgIH0KICAgIC8qKiBFbmQgYSBzcGFuIHdpdGggYSBzdGF0dXMuICovCiAgICBlbmRTcGFuKHNwYW5JZCwgc3RhdHVzID0gIm9rIikgewogICAgICAgIGNvbnN0IHNwYW4gPSB0aGlzLnNwYW5zLmdldChzcGFuSWQpOwogICAgICAgIGlmICghc3BhbiB8fCBzcGFuLmVuZFRpbWUpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICAgICAgc3Bhbi5lbmRUaW1lID0gbm93OwogICAgICAgIHNwYW4uZHVyYXRpb25NcyA9IG5ldyBEYXRlKG5vdykuZ2V0VGltZSgpIC0gbmV3IERhdGUoc3Bhbi5zdGFydFRpbWUpLmdldFRpbWUoKTsKICAgICAgICBzcGFuLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAvLyBDbGVhciBhY3RpdmUgc3BhbiBpZiB0aGlzIGlzIHRoZSBjdXJyZW50IG9uZSBmb3IgdGhlIGFnZW50CiAgICAgICAgaWYgKHRoaXMuYWN0aXZlU3BhbnMuZ2V0KHNwYW4uYWdlbnRJZCkgPT09IHNwYW5JZCkgewogICAgICAgICAgICB0aGlzLmFjdGl2ZVNwYW5zLmRlbGV0ZShzcGFuLmFnZW50SWQpOwogICAgICAgIH0KICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEJ1cyBpbnRlZ3JhdGlvbiDigJQgYXV0by1jcmVhdGUgc3BhbnMgZnJvbSBsaWZlY3ljbGUgZXZlbnRzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvKioKICAgICAqIEF0dGFjaCB0byBhIFJ1bnRpbWVCdXMgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgc3BhbnMgZnJvbSBsaWZlY3ljbGUgZXZlbnRzLgogICAgICogQ2FsbCB0aGlzIG9uY2UgZHVyaW5nIHJ1bnRpbWUgaW5pdGlhbGl6YXRpb24uCiAgICAgKi8KICAgIGF0dGFjaFRvQnVzKGJ1cykgewogICAgICAgIGJ1cy5vbigiYWdlbnQ6bGlmZWN5Y2xlIiwgKGV2ZW50KSA9PiB7CiAgICAgICAgICAgIHRoaXMuaGFuZGxlTGlmZWN5Y2xlRXZlbnQoZXZlbnQpOwogICAgICAgIH0pOwogICAgICAgIGJ1cy5vbigiYWdlbnQ6c3Bhd25lZCIsICh7IGFnZW50SWQsIHBpZCB9KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHNwYW5JZCA9IHRoaXMuYWN0aXZlU3BhbnMuZ2V0KGFnZW50SWQpOwogICAgICAgICAgICBpZiAoc3BhbklkKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZXMoc3BhbklkLCB7IHBpZDogcGlkID8/IDAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBidXMub24oImFnZW50OmZhaWxlZCIsICh7IGFnZW50SWQsIGVycm9yIH0pID0+IHsKICAgICAgICAgICAgY29uc3Qgc3BhbklkID0gdGhpcy5hY3RpdmVTcGFucy5nZXQoYWdlbnRJZCk7CiAgICAgICAgICAgIGlmIChzcGFuSWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoc3BhbklkLCAiZXJyb3IiLCB7CiAgICAgICAgICAgICAgICAgICAgImVycm9yLmNvZGUiOiBlcnJvci5jb2RlLAogICAgICAgICAgICAgICAgICAgICJlcnJvci5tZXNzYWdlIjogZXJyb3IubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAiZXJyb3IucmVjb3ZlcmFibGUiOiBlcnJvci5yZWNvdmVyYWJsZSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBoYW5kbGVMaWZlY3ljbGVFdmVudChldmVudCkgewogICAgICAgIGNvbnN0IHsgYWdlbnRJZCwgcHJldmlvdXNTdGF0ZSwgbmV3U3RhdGUsIHRpbWVzdGFtcCwgcmVhc29uIH0gPSBldmVudDsKICAgICAgICAvLyBBZGQgc3RhdGUgdHJhbnNpdGlvbiBhcyBhbiBldmVudCBvbiB0aGUgYWN0aXZlIHNwYW4KICAgICAgICBjb25zdCBhY3RpdmVTcGFuSWQgPSB0aGlzLmFjdGl2ZVNwYW5zLmdldChhZ2VudElkKTsKICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSA9PT0gImluaXRpYWxpemluZyIgJiYgbmV3U3RhdGUgPT09ICJydW5uaW5nIikgewogICAgICAgICAgICAvLyBTcGFuIHdhcyBhbHJlYWR5IHN0YXJ0ZWQgZHVyaW5nIHNwYXduIOKAlCBqdXN0IGFkZCB0aGUgZXZlbnQKICAgICAgICAgICAgaWYgKGFjdGl2ZVNwYW5JZCkgewogICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudChhY3RpdmVTcGFuSWQsICJzdGF0ZTpydW5uaW5nIiwgewogICAgICAgICAgICAgICAgICAgIC4uLihyZWFzb24gPyB7IHJlYXNvbiB9IDoge30pLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmV3U3RhdGUgPT09ICJwYXVzZWQiKSB7CiAgICAgICAgICAgIGlmIChhY3RpdmVTcGFuSWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoYWN0aXZlU3BhbklkLCAic3RhdGU6cGF1c2VkIiwgewogICAgICAgICAgICAgICAgICAgIC4uLihyZWFzb24gPyB7IHJlYXNvbiB9IDoge30pLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBFbmQgdGhlIHJ1bm5pbmcgc3BhbiwgbWFyayBhcyBvayAocGF1c2VkIGlzIG5vdCBhbiBlcnJvcikKICAgICAgICAgICAgICAgIHRoaXMuZW5kU3BhbihhY3RpdmVTcGFuSWQsICJvayIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHByZXZpb3VzU3RhdGUgPT09ICJwYXVzZWQiICYmIG5ld1N0YXRlID09PSAicmVzdW1pbmciKSB7CiAgICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3IHNwYW4gZm9yIHRoZSByZXN1bWVkIGV4ZWN1dGlvbgogICAgICAgICAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5hZ2VudFRyYWNlcy5nZXQoYWdlbnRJZCk7CiAgICAgICAgICAgIGlmICh0cmFjZUlkKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzcGFuSWQgPSBnZW5lcmF0ZVNwYW5JZCgpOwogICAgICAgICAgICAgICAgY29uc3Qgc3BhbiA9IHsKICAgICAgICAgICAgICAgICAgICB0cmFjZUlkLAogICAgICAgICAgICAgICAgICAgIHNwYW5JZCwKICAgICAgICAgICAgICAgICAgICBwYXJlbnRTcGFuSWQ6IGFjdGl2ZVNwYW5JZCwgLy8gY2hhaW4gZnJvbSB0aGUgcGF1c2VkIHNwYW4KICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAiYWdlbnQ6cmVzdW1lIiwKICAgICAgICAgICAgICAgICAgICBhZ2VudElkLAogICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogdGltZXN0YW1wLAogICAgICAgICAgICAgICAgICAgIHN0YXR1czogInJ1bm5pbmciLAogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9LAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogInN0YXRlOnJlc3VtaW5nIiwgdGltZXN0YW1wIH1dLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHRoaXMuc3BhbnMuc2V0KHNwYW5JZCwgc3Bhbik7CiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVNwYW5zLnNldChhZ2VudElkLCBzcGFuSWQpOwogICAgICAgICAgICAgICAgdGhpcy50cmFjZVNwYW5zLmdldCh0cmFjZUlkKT8uYWRkKHNwYW5JZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmV3U3RhdGUgPT09ICJjb21wbGV0ZWQiKSB7CiAgICAgICAgICAgIGlmIChhY3RpdmVTcGFuSWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoYWN0aXZlU3BhbklkLCAic3RhdGU6Y29tcGxldGVkIiwgewogICAgICAgICAgICAgICAgICAgIC4uLihyZWFzb24gPyB7IHJlYXNvbiB9IDoge30pLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGlzLmVuZFNwYW4oYWN0aXZlU3BhbklkLCAib2siKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmFnZW50VHJhY2VzLmRlbGV0ZShhZ2VudElkKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmV3U3RhdGUgPT09ICJmYWlsZWQiKSB7CiAgICAgICAgICAgIGlmIChhY3RpdmVTcGFuSWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoYWN0aXZlU3BhbklkLCAic3RhdGU6ZmFpbGVkIiwgewogICAgICAgICAgICAgICAgICAgIC4uLihyZWFzb24gPyB7IHJlYXNvbiB9IDoge30pLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGlzLmVuZFNwYW4oYWN0aXZlU3BhbklkLCAiZXJyb3IiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmFnZW50VHJhY2VzLmRlbGV0ZShhZ2VudElkKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmV3U3RhdGUgPT09ICJ0ZXJtaW5hdGVkIikgewogICAgICAgICAgICBpZiAoYWN0aXZlU3BhbklkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50KGFjdGl2ZVNwYW5JZCwgInN0YXRlOnRlcm1pbmF0ZWQiLCB7CiAgICAgICAgICAgICAgICAgICAgLi4uKHJlYXNvbiA/IHsgcmVhc29uIH0gOiB7fSksCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuZW5kU3BhbihhY3RpdmVTcGFuSWQsICJvayIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuYWdlbnRUcmFjZXMuZGVsZXRlKGFnZW50SWQpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChhY3RpdmVTcGFuSWQpIHsKICAgICAgICAgICAgLy8gR2VuZXJpYyB0cmFuc2l0aW9uIGV2ZW50CiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoYWN0aXZlU3BhbklkLCBgc3RhdGU6JHtuZXdTdGF0ZX1gLCB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1N0YXRlLAogICAgICAgICAgICAgICAgLi4uKHJlYXNvbiA/IHsgcmVhc29uIH0gOiB7fSksCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIFF1ZXJ5IEFQSQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLyoqIEdldCBhIHNwYW4gYnkgSUQuICovCiAgICBnZXRTcGFuKHNwYW5JZCkgewogICAgICAgIHJldHVybiB0aGlzLnNwYW5zLmdldChzcGFuSWQpOwogICAgfQogICAgLyoqIEdldCB0aGUgYWN0aXZlIHNwYW4gZm9yIGFuIGFnZW50LiAqLwogICAgZ2V0QWN0aXZlU3BhbihhZ2VudElkKSB7CiAgICAgICAgY29uc3Qgc3BhbklkID0gdGhpcy5hY3RpdmVTcGFucy5nZXQoYWdlbnRJZCk7CiAgICAgICAgcmV0dXJuIHNwYW5JZCA/IHRoaXMuc3BhbnMuZ2V0KHNwYW5JZCkgOiB1bmRlZmluZWQ7CiAgICB9CiAgICAvKiogR2V0IGEgdHJhY2Ugc3VtbWFyeSBieSBJRC4gKi8KICAgIGdldFRyYWNlKHRyYWNlSWQpIHsKICAgICAgICBjb25zdCBzcGFuSWRzID0gdGhpcy50cmFjZVNwYW5zLmdldCh0cmFjZUlkKTsKICAgICAgICBpZiAoIXNwYW5JZHMpCiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgY29uc3Qgcm9vdFNwYW5JZCA9IHRoaXMudHJhY2VSb290cy5nZXQodHJhY2VJZCk7CiAgICAgICAgaWYgKCFyb290U3BhbklkKQogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIGNvbnN0IHJvb3RTcGFuID0gdGhpcy5zcGFucy5nZXQocm9vdFNwYW5JZCk7CiAgICAgICAgaWYgKCFyb290U3BhbikKICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICBjb25zdCBzcGFucyA9IFsuLi5zcGFuSWRzXS5tYXAoKGlkKSA9PiB0aGlzLnNwYW5zLmdldChpZCkpLmZpbHRlcihCb29sZWFuKTsKICAgICAgICBjb25zdCBoYXNFcnJvciA9IHNwYW5zLnNvbWUoKHMpID0+IHMuc3RhdHVzID09PSAiZXJyb3IiKTsKICAgICAgICBjb25zdCBhbGxEb25lID0gc3BhbnMuZXZlcnkoKHMpID0+IHMuc3RhdHVzICE9PSAicnVubmluZyIpOwogICAgICAgIC8vIFRyYWNlIGVuZCB0aW1lID0gbGF0ZXN0IHNwYW4gZW5kIHRpbWUKICAgICAgICBsZXQgZW5kVGltZTsKICAgICAgICBsZXQgZHVyYXRpb25NczsKICAgICAgICBpZiAoYWxsRG9uZSkgewogICAgICAgICAgICBjb25zdCBlbmRUaW1lcyA9IHNwYW5zCiAgICAgICAgICAgICAgICAubWFwKChzKSA9PiBzLmVuZFRpbWUpCiAgICAgICAgICAgICAgICAuZmlsdGVyKCh0KSA9PiAhIXQpCiAgICAgICAgICAgICAgICAuc29ydCgpOwogICAgICAgICAgICBlbmRUaW1lID0gZW5kVGltZXNbZW5kVGltZXMubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIGlmIChlbmRUaW1lKSB7CiAgICAgICAgICAgICAgICBkdXJhdGlvbk1zID0gbmV3IERhdGUoZW5kVGltZSkuZ2V0VGltZSgpIC0gbmV3IERhdGUocm9vdFNwYW4uc3RhcnRUaW1lKS5nZXRUaW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdHJhY2VJZCwKICAgICAgICAgICAgcm9vdFNwYW5JZCwKICAgICAgICAgICAgc3RhcnRUaW1lOiByb290U3Bhbi5zdGFydFRpbWUsCiAgICAgICAgICAgIGVuZFRpbWUsCiAgICAgICAgICAgIGR1cmF0aW9uTXMsCiAgICAgICAgICAgIHNwYW5Db3VudDogc3BhbnMubGVuZ3RoLAogICAgICAgICAgICBzdGF0dXM6IGhhc0Vycm9yID8gImVycm9yIiA6IGFsbERvbmUgPyAib2siIDogInJ1bm5pbmciLAogICAgICAgICAgICBsYWJlbDogcm9vdFNwYW4uYXR0cmlidXRlc1siYWdlbnQubGFiZWwiXSwKICAgICAgICB9OwogICAgfQogICAgLyoqIEdldCBmdWxsIHRyYWNlIGRldGFpbCAoc3VtbWFyeSArIGFsbCBzcGFucykuICovCiAgICBnZXRUcmFjZURldGFpbCh0cmFjZUlkKSB7CiAgICAgICAgY29uc3QgdHJhY2UgPSB0aGlzLmdldFRyYWNlKHRyYWNlSWQpOwogICAgICAgIGlmICghdHJhY2UpCiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgY29uc3Qgc3BhbklkcyA9IHRoaXMudHJhY2VTcGFucy5nZXQodHJhY2VJZCk7CiAgICAgICAgY29uc3Qgc3BhbnMgPSBbLi4uc3Bhbklkc10KICAgICAgICAgICAgLm1hcCgoaWQpID0+IHRoaXMuc3BhbnMuZ2V0KGlkKSkKICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKQogICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gbmV3IERhdGUoYS5zdGFydFRpbWUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIuc3RhcnRUaW1lKS5nZXRUaW1lKCkpOwogICAgICAgIHJldHVybiB7IHRyYWNlLCBzcGFucyB9OwogICAgfQogICAgLyoqIExpc3QgcmVjZW50IHRyYWNlcywgbmV3ZXN0IGZpcnN0LiAqLwogICAgbGlzdFRyYWNlcyhvcHRzKSB7CiAgICAgICAgY29uc3QgbGltaXQgPSBvcHRzPy5saW1pdCA/PyA1MDsKICAgICAgICBjb25zdCB0cmFjZXMgPSBbXTsKICAgICAgICAvLyBXYWxrIHRyYWNlT3JkZXIgaW4gcmV2ZXJzZSAobmV3ZXN0IGZpcnN0KQogICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnRyYWNlT3JkZXIubGVuZ3RoIC0gMTsgaSA+PSAwICYmIHRyYWNlcy5sZW5ndGggPCBsaW1pdDsgaS0tKSB7CiAgICAgICAgICAgIGNvbnN0IHRyYWNlID0gdGhpcy5nZXRUcmFjZSh0aGlzLnRyYWNlT3JkZXJbaV0pOwogICAgICAgICAgICBpZiAoIXRyYWNlKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGlmIChvcHRzPy5zdGF0dXMgJiYgdHJhY2Uuc3RhdHVzICE9PSBvcHRzLnN0YXR1cykKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB0cmFjZXMucHVzaCh0cmFjZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cmFjZXM7CiAgICB9CiAgICAvKiogR2V0IHRoZSB0cmFjZSBJRCBhc3NvY2lhdGVkIHdpdGggYW4gYWdlbnQuICovCiAgICBnZXRBZ2VudFRyYWNlSWQoYWdlbnRJZCkgewogICAgICAgIHJldHVybiB0aGlzLmFnZW50VHJhY2VzLmdldChhZ2VudElkKTsKICAgIH0KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIEludGVybmFsOiBldmljdGlvbgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZXZpY3QoKSB7CiAgICAgICAgd2hpbGUgKHRoaXMudHJhY2VPcmRlci5sZW5ndGggPiB0aGlzLm1heFRyYWNlcykgewogICAgICAgICAgICBjb25zdCBvbGRUcmFjZUlkID0gdGhpcy50cmFjZU9yZGVyLnNoaWZ0KCk7CiAgICAgICAgICAgIGNvbnN0IHNwYW5JZHMgPSB0aGlzLnRyYWNlU3BhbnMuZ2V0KG9sZFRyYWNlSWQpOwogICAgICAgICAgICBpZiAoc3BhbklkcykgewogICAgICAgICAgICAgICAgZm9yIChjb25zdCBzcGFuSWQgb2Ygc3BhbklkcykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYW4gPSB0aGlzLnNwYW5zLmdldChzcGFuSWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChzcGFuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlU3BhbnMuZGVsZXRlKHNwYW4uYWdlbnRJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWdlbnRUcmFjZXMuZGVsZXRlKHNwYW4uYWdlbnRJZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuc3BhbnMuZGVsZXRlKHNwYW5JZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy50cmFjZVNwYW5zLmRlbGV0ZShvbGRUcmFjZUlkKTsKICAgICAgICAgICAgdGhpcy50cmFjZVJvb3RzLmRlbGV0ZShvbGRUcmFjZUlkKTsKICAgICAgICB9CiAgICB9Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhY2VyLmpzLm1hcA==","files/extract.js":"LyoqCiAqIFRleHQgZXh0cmFjdGlvbiBmcm9tIGJpbmFyeSBmb3JtYXRzIChQREYsIGltYWdlcykuCiAqIFRoaW4gd3JhcHBlcnMgYXJvdW5kIHVucGRmIGFuZCB0ZXNzZXJhY3QuanMuCiAqLwppbXBvcnQgeyBleHRyYWN0VGV4dCB9IGZyb20gInVucGRmIjsKaW1wb3J0IFRlc3NlcmFjdCBmcm9tICJ0ZXNzZXJhY3QuanMiOwpsZXQgb2NyV29ya2VyID0gbnVsbDsKYXN5bmMgZnVuY3Rpb24gZ2V0T2NyV29ya2VyKCkgewogICAgaWYgKCFvY3JXb3JrZXIpIHsKICAgICAgICBvY3JXb3JrZXIgPSBhd2FpdCBUZXNzZXJhY3QuY3JlYXRlV29ya2VyKCJlbmciKTsKICAgIH0KICAgIHJldHVybiBvY3JXb3JrZXI7Cn0KLyoqIEV4dHJhY3QgdGV4dCBjb250ZW50IGZyb20gYSBQREYgYnVmZmVyLiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFBkZlRleHQoYnVmZmVyKSB7CiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4dHJhY3RUZXh0KGRhdGEsIHsgbWVyZ2VQYWdlczogdHJ1ZSB9KTsKICAgIHJldHVybiByZXN1bHQudGV4dC50cmltKCk7Cn0KLyoqIEV4dHJhY3QgdGV4dCBmcm9tIGFuIGltYWdlIGJ1ZmZlciB2aWEgT0NSLiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdEltYWdlVGV4dChidWZmZXIpIHsKICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IGdldE9jcldvcmtlcigpOwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ya2VyLnJlY29nbml6ZShidWZmZXIpOwogICAgcmV0dXJuIHJlc3VsdC5kYXRhLnRleHQudHJpbSgpOwp9Ci8qKiBUZXJtaW5hdGUgdGhlIE9DUiB3b3JrZXIgaWYgaXQgd2FzIGNyZWF0ZWQuIENhbGwgb24gc2h1dGRvd24uICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXJtaW5hdGVPY3JXb3JrZXIoKSB7CiAgICBpZiAob2NyV29ya2VyKSB7CiAgICAgICAgYXdhaXQgb2NyV29ya2VyLnRlcm1pbmF0ZSgpOwogICAgICAgIG9jcldvcmtlciA9IG51bGw7CiAgICB9Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXh0cmFjdC5qcy5tYXA=","files/deep-index.js":"LyoqCiAqIERlZXAgaW5kZXhpbmcg4oCUIGJhY2tncm91bmQgd29ya2VyIGZvciB0aG9yb3VnaCBkb2N1bWVudCB1bmRlcnN0YW5kaW5nLgogKgogKiBSdW5zIGFmdGVyIHRoZSBmYXN0IHBhc3MgKGluZGV4LWxvY2FsLnRzKSBjb21wbGV0ZXMuIFByb2Nlc3NlcyBmaWxlcwogKiB0aHJvdWdoIGxvY2FsIE9sbGFtYSBhdCB3aGF0ZXZlciBwYWNlIHRoZSBkZXZpY2UgYWxsb3dzLgogKgogKiBQaXBlbGluZToKICogMS4gRW50aXR5IGV4dHJhY3Rpb24g4oCUIHBlb3BsZSwgcHJvamVjdHMsIGRhdGVzLCBvcmdhbml6YXRpb25zCiAqIDIuIFRoZW1lIGRpc2NvdmVyeSDigJQgcmVjdXJyaW5nIHRvcGljcyBhY3Jvc3MgZG9jdW1lbnRzCiAqIDMuIENyb3NzLXJlZmVyZW5jaW5nIOKAlCBjb25uZWN0aW9ucyBiZXR3ZWVuIGltcG9ydGVkIGRvY3MgYW5kIGV4aXN0aW5nIG1lbW9yeQogKiA0LiBGbGFncyDigJQgZG9jdW1lbnRzIG5lZWRpbmcgaHVtYW4gcmV2aWV3IChjb25mbGljdHMsIG91dGRhdGVkIGluZm8pCiAqCiAqIFJlc3VsdHMgZmVlZCB0aGUgbmVydmUgc3RhdGU6CiAqIC0gV29yayBkb3QgZ29lcyBncmVlbiBkdXJpbmcgcHJvY2Vzc2luZwogKiAtIEpveSBkb3QgZ29lcyBncmVlbiB3aGVuIHBhdHRlcm5zIGVtZXJnZQogKgogKiBBbGwgcHJvY2Vzc2luZyBsb2NhbC4gTWVtYnJhbmUgcHJvdGVjdHMgYW55IG91dGJvdW5kIGNhbGwuCiAqLwppbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlIH0gZnJvbSAibm9kZTpmcy9wcm9taXNlcyI7CmltcG9ydCB7IGpvaW4sIGV4dG5hbWUgfSBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAibm9kZTpmcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiZGVlcC1pbmRleCIpOwppbXBvcnQgeyBCUkFJTl9ESVIgfSBmcm9tICIuLi9saWIvcGF0aHMuanMiOwpjb25zdCBERUVQX01BTklGRVNUX1BBVEggPSBqb2luKEJSQUlOX0RJUiwgIi5jb3JlIiwgImRlZXAtaW5kZXguanNvbiIpOwovLyDilIDilIAgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmxldCBydW5uaW5nID0gZmFsc2U7CmxldCBwcm9ncmVzcyA9IHsgdG90YWw6IDAsIGRvbmU6IDAsIHBoYXNlOiAiaWRsZSIgfTsKZXhwb3J0IGZ1bmN0aW9uIGdldERlZXBJbmRleFByb2dyZXNzKCkgewogICAgcmV0dXJuIHsgLi4ucHJvZ3Jlc3MsIHJ1bm5pbmcgfTsKfQovLyDilIDilIAgT2xsYW1hIGhlbHBlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKYXN5bmMgZnVuY3Rpb24gYXNrT2xsYW1hKHByb21wdCwgc3lzdGVtKSB7CiAgICBjb25zdCB7IHN0cmVhbUNoYXRMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KCIuLi9sbG0vb2xsYW1hLmpzIik7CiAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4gewogICAgICAgIHN0cmVhbUNoYXRMb2NhbCh7CiAgICAgICAgICAgIG1lc3NhZ2VzOiBbCiAgICAgICAgICAgICAgICB7IHJvbGU6ICJzeXN0ZW0iLCBjb250ZW50OiBzeXN0ZW0gfSwKICAgICAgICAgICAgICAgIHsgcm9sZTogInVzZXIiLCBjb250ZW50OiBwcm9tcHQgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgbW9kZWw6ICJhdXRvIiwKICAgICAgICAgICAgb25Ub2tlbjogKHQpID0+IHsgY2h1bmtzLnB1c2godCk7IH0sCiAgICAgICAgICAgIG9uRG9uZTogKCkgPT4gcmVzKCksCiAgICAgICAgICAgIG9uRXJyb3I6IChlKSA9PiByZWooZSksCiAgICAgICAgfSk7CiAgICB9KTsKICAgIHJldHVybiBjaHVua3Muam9pbigiIik7Cn0KLy8g4pSA4pSAIExvYWQgLyBTYXZlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAphc3luYyBmdW5jdGlvbiBsb2FkRGVlcE1hbmlmZXN0KCkgewogICAgdHJ5IHsKICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkRmlsZShERUVQX01BTklGRVNUX1BBVEgsICJ1dGYtOCIpOwogICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJhdyk7CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgcmV0dXJuIHsgZGVlcEluZGV4ZWQ6IFtdLCBsYXN0UnVuOiAiIiwgZW50aXRpZXM6IFtdLCB0aGVtZXM6IFtdLCBjcm9zc1JlZnM6IFtdLCBmbGFnczogW10gfTsKICAgIH0KfQphc3luYyBmdW5jdGlvbiBzYXZlRGVlcE1hbmlmZXN0KG1hbmlmZXN0KSB7CiAgICBhd2FpdCB3cml0ZUZpbGUoREVFUF9NQU5JRkVTVF9QQVRILCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMiksICJ1dGYtOCIpOwp9Ci8vIOKUgOKUgCBFbnRpdHkgZXh0cmFjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKYXN5bmMgZnVuY3Rpb24gZXh0cmFjdEVudGl0aWVzKGNvbnRlbnQsIGZpbGVQYXRoKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHRydW5jYXRlZCA9IGNvbnRlbnQubGVuZ3RoID4gMzAwMCA/IGNvbnRlbnQuc2xpY2UoMCwgMzAwMCkgOiBjb250ZW50OwogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXNrT2xsYW1hKHRydW5jYXRlZCwgYEV4dHJhY3QgbmFtZWQgZW50aXRpZXMgZnJvbSB0aGlzIGRvY3VtZW50LiBSZXR1cm4gb25lIHBlciBsaW5lIGluIGZvcm1hdDoKVFlQRXxOQU1FfENPTlRFWFQKV2hlcmUgVFlQRSBpcyBwZXJzb24sIG9yZywgcHJvamVjdCwgZGF0ZSwgcGxhY2UsIG9yIGNvbmNlcHQuCkNPTlRFWFQgaXMgdGhlIHNlbnRlbmNlIHdoZXJlIGl0IGFwcGVhcnMgKGFiYnJldmlhdGVkKS4KT25seSByZXR1cm4gZW50aXRpZXMsIG5vdGhpbmcgZWxzZS4gSWYgbm9uZSBmb3VuZCwgcmV0dXJuIE5PTkUuYCk7CiAgICAgICAgaWYgKHJlc3BvbnNlLnRyaW0oKSA9PT0gIk5PTkUiIHx8ICFyZXNwb25zZS50cmltKCkpCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICByZXR1cm4gcmVzcG9uc2UudHJpbSgpLnNwbGl0KCJcbiIpCiAgICAgICAgICAgIC5tYXAobGluZSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gbGluZS5zcGxpdCgifCIpLm1hcChwID0+IHAudHJpbSgpKTsKICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgY29uc3QgdHlwZSA9IHBhcnRzWzBdLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGlmICghWyJwZXJzb24iLCAib3JnIiwgInByb2plY3QiLCAiZGF0ZSIsICJwbGFjZSIsICJjb25jZXB0Il0uaW5jbHVkZXModHlwZSkpCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG5hbWU6IHBhcnRzWzFdLAogICAgICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgICAgIHNvdXJjZTogZmlsZVBhdGgsCiAgICAgICAgICAgICAgICBjb250ZXh0OiBwYXJ0c1syXSB8fCAiIiwKICAgICAgICAgICAgfTsKICAgICAgICB9KQogICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlICE9PSBudWxsKTsKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICByZXR1cm4gW107CiAgICB9Cn0KLy8g4pSA4pSAIFRoZW1lIGRpc2NvdmVyeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJUaGVtZXMoZmlsZVN1bW1hcmllcykgewogICAgaWYgKGZpbGVTdW1tYXJpZXMubGVuZ3RoIDwgMikKICAgICAgICByZXR1cm4gW107CiAgICB0cnkgewogICAgICAgIGNvbnN0IGNvbWJpbmVkID0gZmlsZVN1bW1hcmllcwogICAgICAgICAgICAubWFwKChmLCBpKSA9PiBgWyR7aSArIDF9XSAke2YucGF0aH06ICR7Zi5zdW1tYXJ5fWApCiAgICAgICAgICAgIC5qb2luKCJcbiIpOwogICAgICAgIGNvbnN0IHRydW5jYXRlZCA9IGNvbWJpbmVkLmxlbmd0aCA+IDQwMDAgPyBjb21iaW5lZC5zbGljZSgwLCA0MDAwKSA6IGNvbWJpbmVkOwogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXNrT2xsYW1hKHRydW5jYXRlZCwgYFRoZXNlIGFyZSBzdW1tYXJpZXMgb2YgZG9jdW1lbnRzIGluIGEgcGVyc29uYWwga25vd2xlZGdlIGJhc2UuIElkZW50aWZ5IDEtNSByZWN1cnJpbmcgdGhlbWVzLgpGb3IgZWFjaCB0aGVtZSwgcmV0dXJuIG9uZSBsaW5lOgpUSEVNRXxDT05GSURFTkNFfERPQ1VNRU5UX05VTUJFUlN8T05FX1NFTlRFTkNFX1NVTU1BUlkKQ09ORklERU5DRSBpcyAwLjAtMS4wLiBET0NVTUVOVF9OVU1CRVJTIGFyZSBjb21tYS1zZXBhcmF0ZWQgW05dIHJlZmVyZW5jZXMuCk9ubHkgcmV0dXJuIHRoZW1lcywgbm90aGluZyBlbHNlLiBJZiBubyBjbGVhciB0aGVtZXMsIHJldHVybiBOT05FLmApOwogICAgICAgIGlmIChyZXNwb25zZS50cmltKCkgPT09ICJOT05FIiB8fCAhcmVzcG9uc2UudHJpbSgpKQogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRyaW0oKS5zcGxpdCgiXG4iKQogICAgICAgICAgICAubWFwKGxpbmUgPT4gewogICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGxpbmUuc3BsaXQoInwiKS5tYXAocCA9PiBwLnRyaW0oKSk7CiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCAzKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIGNvbnN0IGNvbmZpZGVuY2UgPSBwYXJzZUZsb2F0KHBhcnRzWzFdKTsKICAgICAgICAgICAgaWYgKGlzTmFOKGNvbmZpZGVuY2UpKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIC8vIFJlc29sdmUgZG9jdW1lbnQgbnVtYmVycyB0byBmaWxlIHBhdGhzCiAgICAgICAgICAgIGNvbnN0IGRvY051bXMgPSBwYXJ0c1syXS5tYXRjaCgvXGQrL2cpPy5tYXAobiA9PiBwYXJzZUludChuKSAtIDEpIHx8IFtdOwogICAgICAgICAgICBjb25zdCBzb3VyY2VzID0gZG9jTnVtcwogICAgICAgICAgICAgICAgLmZpbHRlcihuID0+IG4gPj0gMCAmJiBuIDwgZmlsZVN1bW1hcmllcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAubWFwKG4gPT4gZmlsZVN1bW1hcmllc1tuXS5wYXRoKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGxhYmVsOiBwYXJ0c1swXSwKICAgICAgICAgICAgICAgIGNvbmZpZGVuY2U6IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIGNvbmZpZGVuY2UpKSwKICAgICAgICAgICAgICAgIHNvdXJjZXMsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBwYXJ0c1szXSB8fCBwYXJ0c1swXSwKICAgICAgICAgICAgfTsKICAgICAgICB9KQogICAgICAgICAgICAuZmlsdGVyKCh0KSA9PiB0ICE9PSBudWxsKTsKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICByZXR1cm4gW107CiAgICB9Cn0KLy8g4pSA4pSAIENyb3NzLXJlZmVyZW5jaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAphc3luYyBmdW5jdGlvbiBmaW5kQ3Jvc3NSZWZzKGZpbGVTdW1tYXJpZXMpIHsKICAgIGlmIChmaWxlU3VtbWFyaWVzLmxlbmd0aCA8IDIpCiAgICAgICAgcmV0dXJuIFtdOwogICAgdHJ5IHsKICAgICAgICBjb25zdCBjb21iaW5lZCA9IGZpbGVTdW1tYXJpZXMKICAgICAgICAgICAgLm1hcCgoZiwgaSkgPT4gYFske2kgKyAxfV0gJHtmLnBhdGh9OiAke2Yuc3VtbWFyeX1gKQogICAgICAgICAgICAuam9pbigiXG4iKTsKICAgICAgICBjb25zdCB0cnVuY2F0ZWQgPSBjb21iaW5lZC5sZW5ndGggPiA0MDAwID8gY29tYmluZWQuc2xpY2UoMCwgNDAwMCkgOiBjb21iaW5lZDsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFza09sbGFtYSh0cnVuY2F0ZWQsIGBUaGVzZSBhcmUgc3VtbWFyaWVzIGZyb20gYSBrbm93bGVkZ2UgYmFzZS4gRmluZCBjb25uZWN0aW9ucyBiZXR3ZWVuIGRvY3VtZW50cy4KRm9yIGVhY2ggY29ubmVjdGlvbiwgcmV0dXJuIG9uZSBsaW5lOgpTT1VSQ0VfTlVNfFRBUkdFVF9OVU18UkVMQVRJT05TSElQfERFVEFJTApSRUxBVElPTlNISVAgaXM6IG1lbnRpb25zLCBleHRlbmRzLCBjb250cmFkaWN0cywgb3IgdXBkYXRlcy4KT25seSByZXR1cm4gY29ubmVjdGlvbnMsIG5vdGhpbmcgZWxzZS4gTWF4IDEwLiBJZiBub25lLCByZXR1cm4gTk9ORS5gKTsKICAgICAgICBpZiAocmVzcG9uc2UudHJpbSgpID09PSAiTk9ORSIgfHwgIXJlc3BvbnNlLnRyaW0oKSkKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIHJldHVybiByZXNwb25zZS50cmltKCkuc3BsaXQoIlxuIikKICAgICAgICAgICAgLnNsaWNlKDAsIDEwKQogICAgICAgICAgICAubWFwKGxpbmUgPT4gewogICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGxpbmUuc3BsaXQoInwiKS5tYXAocCA9PiBwLnRyaW0oKSk7CiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCAzKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIGNvbnN0IHNyYyA9IHBhcnNlSW50KHBhcnRzWzBdKSAtIDE7CiAgICAgICAgICAgIGNvbnN0IHRndCA9IHBhcnNlSW50KHBhcnRzWzFdKSAtIDE7CiAgICAgICAgICAgIGlmIChpc05hTihzcmMpIHx8IGlzTmFOKHRndCkgfHwgc3JjIDwgMCB8fCB0Z3QgPCAwKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIGlmIChzcmMgPj0gZmlsZVN1bW1hcmllcy5sZW5ndGggfHwgdGd0ID49IGZpbGVTdW1tYXJpZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzb3VyY2VGaWxlOiBmaWxlU3VtbWFyaWVzW3NyY10ucGF0aCwKICAgICAgICAgICAgICAgIHRhcmdldEZpbGU6IGZpbGVTdW1tYXJpZXNbdGd0XS5wYXRoLAogICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwOiBwYXJ0c1syXSwKICAgICAgICAgICAgICAgIGRldGFpbDogcGFydHNbM10gfHwgIiIsCiAgICAgICAgICAgIH07CiAgICAgICAgfSkKICAgICAgICAgICAgLmZpbHRlcigocikgPT4gciAhPT0gbnVsbCk7CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgfQp9Ci8vIOKUgOKUgCBEb2N1bWVudCBmbGFnZ2luZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKYXN5bmMgZnVuY3Rpb24gZmxhZ0RvY3VtZW50KGNvbnRlbnQsIGZpbGVQYXRoKSB7CiAgICAvLyBRdWljayBoZXVyaXN0aWMgY2hlY2tzIChubyBMTE0gbmVlZGVkKQogICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCJcbiIpOwogICAgLy8gQ2hlY2sgZm9yIG9sZCBkYXRlcyAobW9yZSB0aGFuIDIgeWVhcnMgYWdvKQogICAgY29uc3QgeWVhck1hdGNoID0gY29udGVudC5tYXRjaCgvXGIoMjBbMC0xXVxkfDE5XGR7Mn0pXGIvKTsKICAgIGlmICh5ZWFyTWF0Y2gpIHsKICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQoeWVhck1hdGNoWzFdKTsKICAgICAgICBpZiAoeWVhciA8IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIDIpIHsKICAgICAgICAgICAgcmV0dXJuIHsgZmlsZTogZmlsZVBhdGgsIHJlYXNvbjogYFJlZmVyZW5jZXMgeWVhciAke3llYXJ9IOKAlCBtYXkgYmUgb3V0ZGF0ZWRgLCB0eXBlOiAib3V0ZGF0ZWQiIH07CiAgICAgICAgfQogICAgfQogICAgLy8gQ2hlY2sgZm9yIFRPRE8vRklYTUUvSU5DT01QTEVURSBtYXJrZXJzCiAgICBpZiAoL1xiKFRPRE98RklYTUV8SU5DT01QTEVURXxEUkFGVHxXSVApXGIvaS50ZXN0KGNvbnRlbnQpKSB7CiAgICAgICAgcmV0dXJuIHsgZmlsZTogZmlsZVBhdGgsIHJlYXNvbjogIkNvbnRhaW5zIFRPRE8vRklYTUUvRFJBRlQgbWFya2VycyIsIHR5cGU6ICJpbmNvbXBsZXRlIiB9OwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLy8g4pSA4pSAIE1haW4gZGVlcCBpbmRleCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkRlZXBJbmRleChvcHRpb25zKSB7CiAgICBpZiAocnVubmluZykgewogICAgICAgIGxvZy5pbmZvKCJEZWVwIGluZGV4aW5nIGFscmVhZHkgcnVubmluZyDigJQgc2tpcHBpbmciKTsKICAgICAgICByZXR1cm4geyBlbnRpdGllczogW10sIHRoZW1lczogW10sIGNyb3NzUmVmczogW10sIGZsYWdzOiBbXSwgZmlsZXNQcm9jZXNzZWQ6IDAgfTsKICAgIH0KICAgIHJ1bm5pbmcgPSB0cnVlOwogICAgY29uc3QgYmF0Y2hTaXplID0gb3B0aW9ucz8uYmF0Y2hTaXplID8/IDMwOwogICAgdHJ5IHsKICAgICAgICAvLyBMb2FkIG1hbmlmZXN0cwogICAgICAgIGNvbnN0IGRlZXBNYW5pZmVzdCA9IGF3YWl0IGxvYWREZWVwTWFuaWZlc3QoKTsKICAgICAgICBjb25zdCBhbHJlYWR5RGVlcCA9IG5ldyBTZXQoZGVlcE1hbmlmZXN0LmRlZXBJbmRleGVkKTsKICAgICAgICAvLyBMb2FkIGltcG9ydCBtYW5pZmVzdCBmb3IgZmlsZSBsaXN0CiAgICAgICAgY29uc3QgaW1wb3J0TWFuaWZlc3RQYXRoID0gam9pbihCUkFJTl9ESVIsICIuY29yZSIsICJpbXBvcnQtbWFuaWZlc3QuanNvbiIpOwogICAgICAgIGlmICghZXhpc3RzU3luYyhpbXBvcnRNYW5pZmVzdFBhdGgpKSB7CiAgICAgICAgICAgIHJldHVybiB7IGVudGl0aWVzOiBbXSwgdGhlbWVzOiBbXSwgY3Jvc3NSZWZzOiBbXSwgZmxhZ3M6IFtdLCBmaWxlc1Byb2Nlc3NlZDogMCB9OwogICAgICAgIH0KICAgICAgICBjb25zdCBpbXBvcnRNYW5pZmVzdCA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoaW1wb3J0TWFuaWZlc3RQYXRoLCAidXRmLTgiKSk7CiAgICAgICAgY29uc3QgaW1wb3J0ZWRGaWxlcyA9IGltcG9ydE1hbmlmZXN0LmZpbGVzIHx8IFtdOwogICAgICAgIC8vIEZpbHRlciB0byB1bnByb2Nlc3NlZCB0ZXh0IGZpbGVzCiAgICAgICAgY29uc3QgdGV4dEV4dHMgPSBuZXcgU2V0KFsiLm1kIiwgIi50eHQiLCAiLnlhbWwiLCAiLnltbCIsICIuanNvbiIsICIuY3N2Il0pOwogICAgICAgIGNvbnN0IHRvUHJvY2VzcyA9IGltcG9ydGVkRmlsZXMKICAgICAgICAgICAgLmZpbHRlcihmID0+ICFhbHJlYWR5RGVlcC5oYXMoZi5kZXN0aW5hdGlvbikpCiAgICAgICAgICAgIC5maWx0ZXIoZiA9PiB0ZXh0RXh0cy5oYXMoZXh0bmFtZShmLmRlc3RpbmF0aW9uKS50b0xvd2VyQ2FzZSgpKSkKICAgICAgICAgICAgLnNsaWNlKDAsIGJhdGNoU2l6ZSk7CiAgICAgICAgaWYgKHRvUHJvY2Vzcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm4geyBlbnRpdGllczogW10sIHRoZW1lczogW10sIGNyb3NzUmVmczogW10sIGZsYWdzOiBbXSwgZmlsZXNQcm9jZXNzZWQ6IDAgfTsKICAgICAgICB9CiAgICAgICAgcHJvZ3Jlc3MgPSB7IHRvdGFsOiB0b1Byb2Nlc3MubGVuZ3RoLCBkb25lOiAwLCBwaGFzZTogImVudGl0aWVzIiB9OwogICAgICAgIGxvZy5pbmZvKGBEZWVwIGluZGV4aW5nICR7dG9Qcm9jZXNzLmxlbmd0aH0gZmlsZXMuLi5gKTsKICAgICAgICAvLyBOb3RpZnkgbmVydmUgc3RhdGUKICAgICAgICBjb25zdCB7IGFwcGVuZEJyYWluTGluZSB9ID0gYXdhaXQgaW1wb3J0KCIuLi9saWIvYnJhaW4taW8uanMiKTsKICAgICAgICBjb25zdCBub3RpZlBhdGggPSBqb2luKEJSQUlOX0RJUiwgIm9wZXJhdGlvbnMiLCAibm90aWZpY2F0aW9ucy5qc29ubCIpOwogICAgICAgIGF3YWl0IGFwcGVuZEJyYWluTGluZShub3RpZlBhdGgsIEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgIG1lc3NhZ2U6IGBEZWVwIGluZGV4aW5nIHN0YXJ0ZWQ6ICR7dG9Qcm9jZXNzLmxlbmd0aH0gZmlsZXNgLAogICAgICAgICAgICBzb3VyY2U6ICJkZWVwLWluZGV4IiwKICAgICAgICB9KSk7CiAgICAgICAgLy8gUGhhc2UgMTogUmVhZCBmaWxlcyBhbmQgZXh0cmFjdCBlbnRpdGllcwogICAgICAgIGNvbnN0IGFsbEVudGl0aWVzID0gW107CiAgICAgICAgY29uc3QgZmlsZVN1bW1hcmllcyA9IFtdOwogICAgICAgIGNvbnN0IGFsbEZsYWdzID0gW107CiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIHRvUHJvY2VzcykgewogICAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4oQlJBSU5fRElSLCBmaWxlLmRlc3RpbmF0aW9uKTsKICAgICAgICAgICAgaWYgKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkgewogICAgICAgICAgICAgICAgZGVlcE1hbmlmZXN0LmRlZXBJbmRleGVkLnB1c2goZmlsZS5kZXN0aW5hdGlvbik7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGZ1bGxQYXRoLCAidXRmLTgiKTsKICAgICAgICAgICAgICAgIGlmICghY29udGVudC50cmltKCkpCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGVudGl0aWVzCiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdGllcyA9IGF3YWl0IGV4dHJhY3RFbnRpdGllcyhjb250ZW50LCBmaWxlLmRlc3RpbmF0aW9uKTsKICAgICAgICAgICAgICAgIGFsbEVudGl0aWVzLnB1c2goLi4uZW50aXRpZXMpOwogICAgICAgICAgICAgICAgLy8gQnVpbGQgc3VtbWFyeSBmb3IgdGhlbWUvY3Jvc3MtcmVmIGFuYWx5c2lzCiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdExpbmVzID0gY29udGVudC5zcGxpdCgiXG4iKS5maWx0ZXIobCA9PiBsLnRyaW0oKSkuc2xpY2UoMCwgNSkuam9pbigiICIpOwogICAgICAgICAgICAgICAgZmlsZVN1bW1hcmllcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBwYXRoOiBmaWxlLmRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGZpcnN0TGluZXMuc2xpY2UoMCwgMzAwKSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gRmxhZyBjaGVja3MKICAgICAgICAgICAgICAgIGNvbnN0IGZsYWcgPSBhd2FpdCBmbGFnRG9jdW1lbnQoY29udGVudCwgZmlsZS5kZXN0aW5hdGlvbik7CiAgICAgICAgICAgICAgICBpZiAoZmxhZykKICAgICAgICAgICAgICAgICAgICBhbGxGbGFncy5wdXNoKGZsYWcpOwogICAgICAgICAgICAgICAgZGVlcE1hbmlmZXN0LmRlZXBJbmRleGVkLnB1c2goZmlsZS5kZXN0aW5hdGlvbik7CiAgICAgICAgICAgICAgICBwcm9ncmVzcy5kb25lKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgbG9nLndhcm4oYERlZXAgaW5kZXggZmFpbGVkIGZvciAke2ZpbGUuZGVzdGluYXRpb259OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBQaGFzZSAyOiBUaGVtZSBkaXNjb3ZlcnkgKGFjcm9zcyBhbGwgZmlsZXMpCiAgICAgICAgcHJvZ3Jlc3MucGhhc2UgPSAidGhlbWVzIjsKICAgICAgICBjb25zdCB0aGVtZXMgPSBhd2FpdCBkaXNjb3ZlclRoZW1lcyhmaWxlU3VtbWFyaWVzKTsKICAgICAgICAvLyBQaGFzZSAzOiBDcm9zcy1yZWZlcmVuY2luZwogICAgICAgIHByb2dyZXNzLnBoYXNlID0gImNyb3NzLXJlZnMiOwogICAgICAgIGNvbnN0IGNyb3NzUmVmcyA9IGF3YWl0IGZpbmRDcm9zc1JlZnMoZmlsZVN1bW1hcmllcyk7CiAgICAgICAgLy8gU3RvcmUgcmVzdWx0cwogICAgICAgIGRlZXBNYW5pZmVzdC5lbnRpdGllcy5wdXNoKC4uLmFsbEVudGl0aWVzKTsKICAgICAgICBkZWVwTWFuaWZlc3QudGhlbWVzID0gbWVyZ2VUaGVtZXMoZGVlcE1hbmlmZXN0LnRoZW1lcywgdGhlbWVzKTsKICAgICAgICBkZWVwTWFuaWZlc3QuY3Jvc3NSZWZzLnB1c2goLi4uY3Jvc3NSZWZzKTsKICAgICAgICBkZWVwTWFuaWZlc3QuZmxhZ3MucHVzaCguLi5hbGxGbGFncyk7CiAgICAgICAgZGVlcE1hbmlmZXN0Lmxhc3RSdW4gPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICAgICAgYXdhaXQgc2F2ZURlZXBNYW5pZmVzdChkZWVwTWFuaWZlc3QpOwogICAgICAgIC8vIFdyaXRlIGVudGl0aWVzIHRvIHNlbWFudGljIG1lbW9yeQogICAgICAgIGNvbnN0IHNlbWFudGljUGF0aCA9IGpvaW4oQlJBSU5fRElSLCAibWVtb3J5IiwgInNlbWFudGljLmpzb25sIik7CiAgICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgYWxsRW50aXRpZXMpIHsKICAgICAgICAgICAgYXdhaXQgYXBwZW5kQnJhaW5MaW5lKHNlbWFudGljUGF0aCwgSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgaWQ6IGBlbnRpdHlfJHtEYXRlLm5vdygpLnRvU3RyaW5nKDM2KX1fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA2KX1gLAogICAgICAgICAgICAgICAgdHlwZTogInNlbWFudGljIiwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGAke2VudGl0eS50eXBlfTogJHtlbnRpdHkubmFtZX0g4oCUICR7ZW50aXR5LmNvbnRleHR9YCwKICAgICAgICAgICAgICAgIG1ldGE6IHsgc291cmNlOiBlbnRpdHkuc291cmNlLCBlbnRpdHlUeXBlOiBlbnRpdHkudHlwZSwgaW1wb3J0ZWRGcm9tOiAiZGVlcC1pbmRleCIgfSwKICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8vIE5vdGlmeSBjb21wbGV0aW9uCiAgICAgICAgY29uc3QgZGlzY292ZXJ5Q291bnQgPSB0aGVtZXMubGVuZ3RoICsgY3Jvc3NSZWZzLmxlbmd0aDsKICAgICAgICBhd2FpdCBhcHBlbmRCcmFpbkxpbmUobm90aWZQYXRoLCBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICBtZXNzYWdlOiBgRGVlcCBpbmRleGluZyBjb21wbGV0ZTogJHthbGxFbnRpdGllcy5sZW5ndGh9IGVudGl0aWVzLCAke3RoZW1lcy5sZW5ndGh9IHRoZW1lcywgJHtjcm9zc1JlZnMubGVuZ3RofSBjb25uZWN0aW9ucywgJHthbGxGbGFncy5sZW5ndGh9IGZsYWdzYCwKICAgICAgICAgICAgc291cmNlOiAiZGVlcC1pbmRleCIsCiAgICAgICAgfSkpOwogICAgICAgIGlmIChkaXNjb3ZlcnlDb3VudCA+IDApIHsKICAgICAgICAgICAgbG9nLmluZm8oYERlZXAgaW5kZXggZGlzY292ZXJpZXM6ICR7dGhlbWVzLmxlbmd0aH0gdGhlbWVzLCAke2Nyb3NzUmVmcy5sZW5ndGh9IGNyb3NzLXJlZnNgKTsKICAgICAgICB9CiAgICAgICAgcHJvZ3Jlc3MgPSB7IHRvdGFsOiAwLCBkb25lOiAwLCBwaGFzZTogImlkbGUiIH07CiAgICAgICAgcnVubmluZyA9IGZhbHNlOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGVudGl0aWVzOiBhbGxFbnRpdGllcywKICAgICAgICAgICAgdGhlbWVzLAogICAgICAgICAgICBjcm9zc1JlZnMsCiAgICAgICAgICAgIGZsYWdzOiBhbGxGbGFncywKICAgICAgICAgICAgZmlsZXNQcm9jZXNzZWQ6IHRvUHJvY2Vzcy5sZW5ndGgsCiAgICAgICAgfTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBydW5uaW5nID0gZmFsc2U7CiAgICAgICAgcHJvZ3Jlc3MgPSB7IHRvdGFsOiAwLCBkb25lOiAwLCBwaGFzZTogImlkbGUiIH07CiAgICAgICAgbG9nLmVycm9yKCJEZWVwIGluZGV4aW5nIGZhaWxlZCIsIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTsKICAgICAgICB0aHJvdyBlcnI7CiAgICB9Cn0KLyoqIE1lcmdlIG5ldyB0aGVtZXMgd2l0aCBleGlzdGluZywgZGVkdXBsaWNhdGluZyBieSBsYWJlbCBzaW1pbGFyaXR5LiAqLwpmdW5jdGlvbiBtZXJnZVRoZW1lcyhleGlzdGluZywgaW5jb21pbmcpIHsKICAgIGNvbnN0IG1lcmdlZCA9IFsuLi5leGlzdGluZ107CiAgICBmb3IgKGNvbnN0IHRoZW1lIG9mIGluY29taW5nKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSBtZXJnZWQuZmluZCh0ID0+IHQubGFiZWwudG9Mb3dlckNhc2UoKSA9PT0gdGhlbWUubGFiZWwudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIC8vIE1lcmdlIHNvdXJjZXMKICAgICAgICAgICAgY29uc3QgYWxsU291cmNlcyA9IG5ldyBTZXQoWy4uLm1hdGNoLnNvdXJjZXMsIC4uLnRoZW1lLnNvdXJjZXNdKTsKICAgICAgICAgICAgbWF0Y2guc291cmNlcyA9IEFycmF5LmZyb20oYWxsU291cmNlcyk7CiAgICAgICAgICAgIG1hdGNoLmNvbmZpZGVuY2UgPSBNYXRoLm1heChtYXRjaC5jb25maWRlbmNlLCB0aGVtZS5jb25maWRlbmNlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG1lcmdlZC5wdXNoKHRoZW1lKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbWVyZ2VkOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlZXAtaW5kZXguanMubWFw","browser/sessions.js":"LyoqCiAqIEJyb3dzZXIgc2Vzc2lvbiBtYW5hZ2VyIOKAlCBwZXJzaXN0IGFuZCByZXVzZSBQbGF5d3JpZ2h0IHN0b3JhZ2VTdGF0ZSBwZXIgZG9tYWluLgogKgogKiBTZXNzaW9ucyBhcmUgc3RvcmVkIGFzIEFFUy0yNTYtR0NNIGVuY3J5cHRlZCBKU09OIGluIGJyYWluL2Jyb3dzZXIvc2Vzc2lvbnMvLgogKiBFYWNoIHNlc3Npb24gaXMga2V5ZWQgYnkgZG9tYWluIHdpdGggYSA3LWRheSBleHBpcnkuCiAqLwppbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlLCByZWFkZGlyLCB1bmxpbmssIG1rZGlyIH0gZnJvbSAibm9kZTpmcy9wcm9taXNlcyI7CmltcG9ydCB7IGpvaW4gfSBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyBjcmVhdGVDaXBoZXJpdiwgY3JlYXRlRGVjaXBoZXJpdiwgcmFuZG9tQnl0ZXMgfSBmcm9tICJub2RlOmNyeXB0byI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmltcG9ydCB7IGdldEVuY3J5cHRpb25LZXkgfSBmcm9tICIuLi9saWIva2V5LXN0b3JlLmpzIjsKaW1wb3J0IHsgQlJBSU5fRElSIH0gZnJvbSAiLi4vbGliL3BhdGhzLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJicm93c2VyLXNlc3Npb25zIik7CmNvbnN0IFNFU1NJT05TX0RJUiA9IGpvaW4oQlJBSU5fRElSLCAiYnJvd3NlciIsICJzZXNzaW9ucyIpOwpjb25zdCBTRVNTSU9OX1RUTF9NUyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwOyAvLyA3IGRheXMKLy8g4pSA4pSAIENyeXB0byBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBkZXJpdmVTZXNzaW9uS2V5KCkgewogICAgY29uc3QgbWFzdGVyS2V5ID0gZ2V0RW5jcnlwdGlvbktleSgpOwogICAgaWYgKCFtYXN0ZXJLZXkpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJObyBlbmNyeXB0aW9uIGtleSBhdmFpbGFibGUg4oCUIG5vdCBhdXRoZW50aWNhdGVkIik7CiAgICAvLyBVc2UgZmlyc3QgMzIgYnl0ZXMgb2YgdGhlIG1hc3RlciBrZXkgKEFFUy0yNTYpCiAgICByZXR1cm4gbWFzdGVyS2V5LnN1YmFycmF5KDAsIDMyKTsKfQpmdW5jdGlvbiBlbmNyeXB0KHBsYWludGV4dCkgewogICAgY29uc3Qga2V5ID0gZGVyaXZlU2Vzc2lvbktleSgpOwogICAgY29uc3QgaXYgPSByYW5kb21CeXRlcygxNik7CiAgICBjb25zdCBjaXBoZXIgPSBjcmVhdGVDaXBoZXJpdigiYWVzLTI1Ni1nY20iLCBrZXksIGl2KTsKICAgIGNvbnN0IGVuY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW2NpcGhlci51cGRhdGUocGxhaW50ZXh0LCAidXRmLTgiKSwgY2lwaGVyLmZpbmFsKCldKTsKICAgIGNvbnN0IHRhZyA9IGNpcGhlci5nZXRBdXRoVGFnKCk7CiAgICByZXR1cm4geyBpdjogaXYudG9TdHJpbmcoImhleCIpLCB0YWc6IHRhZy50b1N0cmluZygiaGV4IiksIGRhdGE6IGVuY3J5cHRlZC50b1N0cmluZygiaGV4IikgfTsKfQpmdW5jdGlvbiBkZWNyeXB0KGl2LCB0YWcsIGRhdGEpIHsKICAgIGNvbnN0IGtleSA9IGRlcml2ZVNlc3Npb25LZXkoKTsKICAgIGNvbnN0IGRlY2lwaGVyID0gY3JlYXRlRGVjaXBoZXJpdigiYWVzLTI1Ni1nY20iLCBrZXksIEJ1ZmZlci5mcm9tKGl2LCAiaGV4IikpOwogICAgZGVjaXBoZXIuc2V0QXV0aFRhZyhCdWZmZXIuZnJvbSh0YWcsICJoZXgiKSk7CiAgICByZXR1cm4gZGVjaXBoZXIudXBkYXRlKGRhdGEsICJoZXgiLCAidXRmLTgiKSArIGRlY2lwaGVyLmZpbmFsKCJ1dGYtOCIpOwp9Ci8vIOKUgOKUgCBGaWxlIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIHNlc3Npb25QYXRoKGRvbWFpbikgewogICAgLy8gU2FuaXRpemUgZG9tYWluIGZvciBmaWxlc3lzdGVtOiByZXBsYWNlIGRvdHMvY29sb25zIHdpdGggdW5kZXJzY29yZXMKICAgIGNvbnN0IHNhZmUgPSBkb21haW4ucmVwbGFjZSgvW15hLXpBLVowLTktXS9nLCAiXyIpOwogICAgcmV0dXJuIGpvaW4oU0VTU0lPTlNfRElSLCBgJHtzYWZlfS5zZXNzaW9uLmpzb25gKTsKfQphc3luYyBmdW5jdGlvbiBlbnN1cmVEaXIoKSB7CiAgICBhd2FpdCBta2RpcihTRVNTSU9OU19ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwp9Ci8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogU2F2ZSBhIFBsYXl3cmlnaHQgc3RvcmFnZVN0YXRlIChjb29raWVzLCBsb2NhbFN0b3JhZ2UsIGV0Yy4pIGZvciBhIGRvbWFpbi4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlU2Vzc2lvbihkb21haW4sIHN0b3JhZ2VTdGF0ZSkgewogICAgYXdhaXQgZW5zdXJlRGlyKCk7CiAgICBjb25zdCBwbGFpbnRleHQgPSBKU09OLnN0cmluZ2lmeShzdG9yYWdlU3RhdGUpOwogICAgY29uc3QgeyBpdiwgdGFnLCBkYXRhIH0gPSBlbmNyeXB0KHBsYWludGV4dCk7CiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpOwogICAgY29uc3QgZW52ZWxvcGUgPSB7CiAgICAgICAgZG9tYWluLAogICAgICAgIGNyZWF0ZWRBdDogbm93LnRvSVNPU3RyaW5nKCksCiAgICAgICAgZXhwaXJlc0F0OiBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgU0VTU0lPTl9UVExfTVMpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgaXYsCiAgICAgICAgdGFnLAogICAgICAgIGRhdGEsCiAgICB9OwogICAgYXdhaXQgd3JpdGVGaWxlKHNlc3Npb25QYXRoKGRvbWFpbiksIEpTT04uc3RyaW5naWZ5KGVudmVsb3BlLCBudWxsLCAyKSwgInV0Zi04Iik7CiAgICBsb2cuaW5mbyhgU2F2ZWQgYnJvd3NlciBzZXNzaW9uIGZvciAke2RvbWFpbn1gKTsKfQovKioKICogTG9hZCBhIHN0b3JlZCBzZXNzaW9uIGZvciBhIGRvbWFpbiwgb3IgbnVsbCBpZiBtaXNzaW5nL2V4cGlyZWQvY29ycnVwdGVkLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRTZXNzaW9uKGRvbWFpbikgewogICAgdHJ5IHsKICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkRmlsZShzZXNzaW9uUGF0aChkb21haW4pLCAidXRmLTgiKTsKICAgICAgICBjb25zdCBlbnZlbG9wZSA9IEpTT04ucGFyc2UocmF3KTsKICAgICAgICAvLyBDaGVjayBleHBpcnkKICAgICAgICBpZiAobmV3IERhdGUoZW52ZWxvcGUuZXhwaXJlc0F0KS5nZXRUaW1lKCkgPCBEYXRlLm5vdygpKSB7CiAgICAgICAgICAgIGxvZy5pbmZvKGBTZXNzaW9uIGV4cGlyZWQgZm9yICR7ZG9tYWlufSDigJQgcmVtb3ZpbmdgKTsKICAgICAgICAgICAgYXdhaXQgdW5saW5rKHNlc3Npb25QYXRoKGRvbWFpbikpLmNhdGNoKCgpID0+IHsgfSk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBwbGFpbnRleHQgPSBkZWNyeXB0KGVudmVsb3BlLml2LCBlbnZlbG9wZS50YWcsIGVudmVsb3BlLmRhdGEpOwogICAgICAgIHJldHVybiBKU09OLnBhcnNlKHBsYWludGV4dCk7CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KLyoqCiAqIERlbGV0ZSBhIHN0b3JlZCBzZXNzaW9uIGZvciBhIGRvbWFpbi4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVTZXNzaW9uKGRvbWFpbikgewogICAgYXdhaXQgdW5saW5rKHNlc3Npb25QYXRoKGRvbWFpbikpLmNhdGNoKCgpID0+IHsgfSk7CiAgICBsb2cuaW5mbyhgRGVsZXRlZCBicm93c2VyIHNlc3Npb24gZm9yICR7ZG9tYWlufWApOwp9Ci8qKgogKiBQdXJnZSBhbGwgZXhwaXJlZCBzZXNzaW9ucyBmcm9tIGRpc2suCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVyZ2VFeHBpcmVkU2Vzc2lvbnMoKSB7CiAgICBhd2FpdCBlbnN1cmVEaXIoKTsKICAgIGxldCBwdXJnZWQgPSAwOwogICAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKFNFU1NJT05TX0RJUik7CiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHsKICAgICAgICBpZiAoIWZpbGUuZW5kc1dpdGgoIi5zZXNzaW9uLmpzb24iKSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgcmVhZEZpbGUoam9pbihTRVNTSU9OU19ESVIsIGZpbGUpLCAidXRmLTgiKTsKICAgICAgICAgICAgY29uc3QgZW52ZWxvcGUgPSBKU09OLnBhcnNlKHJhdyk7CiAgICAgICAgICAgIGlmIChuZXcgRGF0ZShlbnZlbG9wZS5leHBpcmVzQXQpLmdldFRpbWUoKSA8IERhdGUubm93KCkpIHsKICAgICAgICAgICAgICAgIGF3YWl0IHVubGluayhqb2luKFNFU1NJT05TX0RJUiwgZmlsZSkpOwogICAgICAgICAgICAgICAgcHVyZ2VkKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAvLyBDb3JydXB0ZWQgZmlsZSDigJQgcmVtb3ZlIGl0CiAgICAgICAgICAgIGF3YWl0IHVubGluayhqb2luKFNFU1NJT05TX0RJUiwgZmlsZSkpLmNhdGNoKCgpID0+IHsgfSk7CiAgICAgICAgICAgIHB1cmdlZCsrOwogICAgICAgIH0KICAgIH0KICAgIGlmIChwdXJnZWQgPiAwKQogICAgICAgIGxvZy5pbmZvKGBQdXJnZWQgJHtwdXJnZWR9IGV4cGlyZWQgYnJvd3NlciBzZXNzaW9uKHMpYCk7CiAgICByZXR1cm4gcHVyZ2VkOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlc3Npb25zLmpzLm1hcA==","capabilities/definitions/browser.js":"LyoqCiAqIEJyb3dzZXIgY2FwYWJpbGl0eSDigJQgbmF2aWdhdGUsIGNsaWNrLCB0eXBlLCBzY3JlZW5zaG90LCBleHRyYWN0LCBzY3JvbGwKICogdmlhIFN0YWdlaGFuZCAoQUktcG93ZXJlZCkgKyBQbGF5d3JpZ2h0IChkZXRlcm1pbmlzdGljKS4KICoKICogUGF0dGVybjogYWN0aW9uLWJsb2NrCiAqIFRhZzogICAgIEJST1dTRVJfQUNUSU9OCiAqCiAqIFRoZSBMTE0gZW1pdHMgW0JST1dTRVJfQUNUSU9OXXsuLi59Wy9CUk9XU0VSX0FDVElPTl0gYmxvY2tzLgogKiBFYWNoIGJsb2NrIHNwZWNpZmllcyBhbiBgYWN0aW9uYCBwbHVzIGFjdGlvbi1zcGVjaWZpYyBmaWVsZHMuCiAqCiAqIFNlc3Npb24gbWFuYWdlbWVudDogUGxheXdyaWdodCBicm93c2VyIGNvbnRleHRzIGFyZSBwZXJzaXN0ZWQgcGVyLWRvbWFpbgogKiBhcyBlbmNyeXB0ZWQgc3RvcmFnZVN0YXRlIEpTT04gaW4gYnJhaW4vYnJvd3Nlci9zZXNzaW9ucy8gd2l0aCA3LWRheSBleHBpcnkuCiAqLwppbXBvcnQgeyBTdGFnZWhhbmQgfSBmcm9tICJAYnJvd3NlcmJhc2VocS9zdGFnZWhhbmQiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uLy4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IHB1c2hOb3RpZmljYXRpb24gfSBmcm9tICIuLi8uLi9nb2Fscy9ub3RpZmljYXRpb25zLmpzIjsKaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vLi4vdXRpbHMvbG9nZ2VyLmpzIjsKaW1wb3J0IHsgc2F2ZVNlc3Npb24sIGxvYWRTZXNzaW9uLCBwdXJnZUV4cGlyZWRTZXNzaW9ucyB9IGZyb20gIi4uLy4uL2Jyb3dzZXIvc2Vzc2lvbnMuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImJyb3dzZXIiKTsKLy8g4pSA4pSAIFN0YWdlaGFuZCBsaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmxldCBfc3RhZ2VoYW5kID0gbnVsbDsKLyoqCiAqIEdldCBvciBjcmVhdGUgdGhlIHNoYXJlZCBTdGFnZWhhbmQgaW5zdGFuY2UuCiAqIFVzZXMgTE9DQUwgZW52IHdpdGggaGVhZGxlc3MgQ2hyb21pdW0g4oCUIG5vIEJyb3dzZXJiYXNlIGRlcGVuZGVuY3kuCiAqLwphc3luYyBmdW5jdGlvbiBnZXRTdGFnZWhhbmQoKSB7CiAgICBpZiAoX3N0YWdlaGFuZCkKICAgICAgICByZXR1cm4gX3N0YWdlaGFuZDsKICAgIF9zdGFnZWhhbmQgPSBuZXcgU3RhZ2VoYW5kKHsKICAgICAgICBlbnY6ICJMT0NBTCIsCiAgICAgICAgbG9jYWxCcm93c2VyTGF1bmNoT3B0aW9uczogeyBoZWFkbGVzczogdHJ1ZSB9LAogICAgfSk7CiAgICBhd2FpdCBfc3RhZ2VoYW5kLmluaXQoKTsKICAgIGxvZy5pbmZvKCJTdGFnZWhhbmQgaW5pdGlhbGl6ZWQgKExPQ0FMLCBoZWFkbGVzcykiKTsKICAgIC8vIFB1cmdlIGV4cGlyZWQgc2Vzc2lvbnMgb24gZmlyc3QgbGF1bmNoCiAgICBwdXJnZUV4cGlyZWRTZXNzaW9ucygpLmNhdGNoKCgpID0+IHsgfSk7CiAgICByZXR1cm4gX3N0YWdlaGFuZDsKfQovKiogU2h1dCBkb3duIHRoZSBicm93c2VyIChjYWxsZWQgb24gc2VydmVyIHRlYXJkb3duKS4gKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQnJvd3NlcigpIHsKICAgIGlmIChfc3RhZ2VoYW5kKSB7CiAgICAgICAgYXdhaXQgX3N0YWdlaGFuZC5jbG9zZSgpOwogICAgICAgIF9zdGFnZWhhbmQgPSBudWxsOwogICAgICAgIGxvZy5pbmZvKCJTdGFnZWhhbmQgY2xvc2VkIik7CiAgICB9Cn0KLy8g4pSA4pSAIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIGRvbWFpbkZyb21VcmwodXJsKSB7CiAgICB0cnkgewogICAgICAgIHJldHVybiBuZXcgVVJMKHVybCkuaG9zdG5hbWU7CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKICAgIH0KfQpjb25zdCBhY3Rpb25MYWJlbCA9IChjdHgpID0+IGN0eC5vcmlnaW4gPT09ICJhdXRvbm9tb3VzIiA/ICJBVVRPTk9NT1VTIiA6ICJQUk9NUFRFRCI7Ci8vIOKUgOKUgCBBY3Rpb24gaGFuZGxlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmFzeW5jIGZ1bmN0aW9uIGhhbmRsZU5hdmlnYXRlKHJlcSwgY3R4KSB7CiAgICBjb25zdCB1cmwgPSByZXEudXJsOwogICAgaWYgKCF1cmwpCiAgICAgICAgcmV0dXJuIHsgY2FwYWJpbGl0eUlkOiAiYnJvd3NlciIsIG9rOiBmYWxzZSwgbWVzc2FnZTogIk1pc3NpbmcgcmVxdWlyZWQgZmllbGQ6IHVybCIgfTsKICAgIGNvbnN0IHN0YWdlaGFuZCA9IGF3YWl0IGdldFN0YWdlaGFuZCgpOwogICAgY29uc3QgZG9tYWluID0gZG9tYWluRnJvbVVybCh1cmwpOwogICAgLy8gUmVzdG9yZSBzZXNzaW9uIGlmIGF2YWlsYWJsZQogICAgY29uc3Qgc3RvcmVkID0gYXdhaXQgbG9hZFNlc3Npb24oZG9tYWluKTsKICAgIGlmIChzdG9yZWQpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBhd2FpdCBzdGFnZWhhbmQuY29udGV4dC5hZGRDb29raWVzKHN0b3JlZC5jb29raWVzID8/IFtdKTsKICAgICAgICAgICAgbG9nLmluZm8oYFJlc3RvcmVkIHNlc3Npb24gZm9yICR7ZG9tYWlufWApOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGxvZy53YXJuKGBGYWlsZWQgdG8gcmVzdG9yZSBzZXNzaW9uIGZvciAke2RvbWFpbn1gLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTsKICAgICAgICB9CiAgICB9CiAgICBjb25zdCBwYWdlID0gc3RhZ2VoYW5kLmNvbnRleHQucGFnZXMoKVswXTsKICAgIGF3YWl0IHBhZ2UuZ290byh1cmwsIHsgd2FpdFVudGlsOiAiZG9tY29udGVudGxvYWRlZCIsIHRpbWVvdXRNczogMzBfMDAwIH0pOwogICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJicm93c2UiLCBzdW1tYXJ5OiBgTmF2aWdhdGVkIHRvICR7dXJsfWAsIGFjdGlvbkxhYmVsOiBhY3Rpb25MYWJlbChjdHgpLCByZWFzb246IGBicm93c2VyIG5hdmlnYXRlYCB9KTsKICAgIHJldHVybiB7IGNhcGFiaWxpdHlJZDogImJyb3dzZXIiLCBvazogdHJ1ZSwgbWVzc2FnZTogYE5hdmlnYXRlZCB0byAke3VybH1gIH07Cn0KYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ2xpY2socmVxLCBjdHgpIHsKICAgIGNvbnN0IGluc3RydWN0aW9uID0gcmVxLmluc3RydWN0aW9uID8/IHJlcS5zZWxlY3RvcjsKICAgIGlmICghaW5zdHJ1Y3Rpb24pCiAgICAgICAgcmV0dXJuIHsgY2FwYWJpbGl0eUlkOiAiYnJvd3NlciIsIG9rOiBmYWxzZSwgbWVzc2FnZTogIk1pc3NpbmcgcmVxdWlyZWQgZmllbGQ6IGluc3RydWN0aW9uIG9yIHNlbGVjdG9yIiB9OwogICAgY29uc3Qgc3RhZ2VoYW5kID0gYXdhaXQgZ2V0U3RhZ2VoYW5kKCk7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGFnZWhhbmQuYWN0KGBjbGljayAke2luc3RydWN0aW9ufWApOwogICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJicm93c2UiLCBzdW1tYXJ5OiBgQ2xpY2tlZDogJHtpbnN0cnVjdGlvbn1gLCBhY3Rpb25MYWJlbDogYWN0aW9uTGFiZWwoY3R4KSwgcmVhc29uOiBgYnJvd3NlciBjbGlja2AgfSk7CiAgICByZXR1cm4geyBjYXBhYmlsaXR5SWQ6ICJicm93c2VyIiwgb2s6IHJlc3VsdC5zdWNjZXNzLCBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSA/PyBgQ2xpY2tlZDogJHtpbnN0cnVjdGlvbn1gIH07Cn0KYXN5bmMgZnVuY3Rpb24gaGFuZGxlVHlwZShyZXEsIGN0eCkgewogICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSByZXEuaW5zdHJ1Y3Rpb247CiAgICBjb25zdCB0ZXh0ID0gcmVxLnRleHQ7CiAgICBjb25zdCBzZWxlY3RvciA9IHJlcS5zZWxlY3RvcjsKICAgIGlmICghdGV4dCkKICAgICAgICByZXR1cm4geyBjYXBhYmlsaXR5SWQ6ICJicm93c2VyIiwgb2s6IGZhbHNlLCBtZXNzYWdlOiAiTWlzc2luZyByZXF1aXJlZCBmaWVsZDogdGV4dCIgfTsKICAgIGNvbnN0IHN0YWdlaGFuZCA9IGF3YWl0IGdldFN0YWdlaGFuZCgpOwogICAgY29uc3QgYWN0SW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbgogICAgICAgID8/IChzZWxlY3RvciA/IGB0eXBlICIke3RleHR9IiBpbnRvICR7c2VsZWN0b3J9YCA6IGB0eXBlICIke3RleHR9IiBpbnRvIHRoZSBmb2N1c2VkIGZpZWxkYCk7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGFnZWhhbmQuYWN0KGFjdEluc3RydWN0aW9uKTsKICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAiYnJvd3NlIiwgc3VtbWFyeTogYFR5cGVkIGludG8gZmllbGRgLCBhY3Rpb25MYWJlbDogYWN0aW9uTGFiZWwoY3R4KSwgcmVhc29uOiBgYnJvd3NlciB0eXBlYCB9KTsKICAgIHJldHVybiB7IGNhcGFiaWxpdHlJZDogImJyb3dzZXIiLCBvazogcmVzdWx0LnN1Y2Nlc3MsIG1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlID8/IGBUeXBlZCB0ZXh0YCB9Owp9CmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVNjcmVlbnNob3QoX3JlcSwgY3R4KSB7CiAgICBjb25zdCBzdGFnZWhhbmQgPSBhd2FpdCBnZXRTdGFnZWhhbmQoKTsKICAgIGNvbnN0IHBhZ2UgPSBzdGFnZWhhbmQuY29udGV4dC5wYWdlcygpWzBdOwogICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgdHlwZTogInBuZyIsIGZ1bGxQYWdlOiBmYWxzZSB9KTsKICAgIGNvbnN0IGJhc2U2NCA9IGJ1ZmZlci50b1N0cmluZygiYmFzZTY0Iik7CiAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogImJyb3dzZSIsIHN1bW1hcnk6IGBUb29rIHNjcmVlbnNob3RgLCBhY3Rpb25MYWJlbDogYWN0aW9uTGFiZWwoY3R4KSwgcmVhc29uOiBgYnJvd3NlciBzY3JlZW5zaG90YCB9KTsKICAgIHJldHVybiB7CiAgICAgICAgY2FwYWJpbGl0eUlkOiAiYnJvd3NlciIsCiAgICAgICAgb2s6IHRydWUsCiAgICAgICAgbWVzc2FnZTogIlNjcmVlbnNob3QgY2FwdHVyZWQiLAogICAgICAgIGRhdGE6IHsgYmFzZTY0LCBtaW1lVHlwZTogImltYWdlL3BuZyIgfSwKICAgIH07Cn0KYXN5bmMgZnVuY3Rpb24gaGFuZGxlRXh0cmFjdChyZXEsIGN0eCkgewogICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSByZXEuaW5zdHJ1Y3Rpb247CiAgICBjb25zdCBzdGFnZWhhbmQgPSBhd2FpdCBnZXRTdGFnZWhhbmQoKTsKICAgIGxldCBleHRyYWN0ZWQ7CiAgICBpZiAoaW5zdHJ1Y3Rpb24pIHsKICAgICAgICBleHRyYWN0ZWQgPSBhd2FpdCBzdGFnZWhhbmQuZXh0cmFjdChpbnN0cnVjdGlvbik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBleHRyYWN0ZWQgPSBhd2FpdCBzdGFnZWhhbmQuZXh0cmFjdCgpOwogICAgfQogICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJicm93c2UiLCBzdW1tYXJ5OiBgRXh0cmFjdGVkIGNvbnRlbnQgZnJvbSBwYWdlYCwgYWN0aW9uTGFiZWw6IGFjdGlvbkxhYmVsKGN0eCksIHJlYXNvbjogYGJyb3dzZXIgZXh0cmFjdGAgfSk7CiAgICByZXR1cm4gewogICAgICAgIGNhcGFiaWxpdHlJZDogImJyb3dzZXIiLAogICAgICAgIG9rOiB0cnVlLAogICAgICAgIG1lc3NhZ2U6ICJDb250ZW50IGV4dHJhY3RlZCIsCiAgICAgICAgZGF0YTogZXh0cmFjdGVkLAogICAgfTsKfQphc3luYyBmdW5jdGlvbiBoYW5kbGVTY3JvbGwocmVxLCBjdHgpIHsKICAgIGNvbnN0IGRpcmVjdGlvbiA9IHJlcS5kaXJlY3Rpb24gPz8gImRvd24iOwogICAgY29uc3Qgc3RhZ2VoYW5kID0gYXdhaXQgZ2V0U3RhZ2VoYW5kKCk7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGFnZWhhbmQuYWN0KGBzY3JvbGwgJHtkaXJlY3Rpb259YCk7CiAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogImJyb3dzZSIsIHN1bW1hcnk6IGBTY3JvbGxlZCAke2RpcmVjdGlvbn1gLCBhY3Rpb25MYWJlbDogYWN0aW9uTGFiZWwoY3R4KSwgcmVhc29uOiBgYnJvd3NlciBzY3JvbGxgIH0pOwogICAgcmV0dXJuIHsgY2FwYWJpbGl0eUlkOiAiYnJvd3NlciIsIG9rOiByZXN1bHQuc3VjY2VzcywgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UgPz8gYFNjcm9sbGVkICR7ZGlyZWN0aW9ufWAgfTsKfQovLyDilIDilIAgQ2FwYWJpbGl0eSBkZWZpbml0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgY29uc3QgYnJvd3NlckNhcGFiaWxpdHkgPSB7CiAgICBpZDogImJyb3dzZXIiLAogICAgcGF0dGVybjogImFjdGlvbiIsCiAgICB0YWc6ICJCUk9XU0VSX0FDVElPTiIsCiAgICBrZXl3b3JkczogWyJicm93c2UiLCAiYnJvd3NlciIsICJ3ZWJzaXRlIiwgIndlYnBhZ2UiLCAiY2xpY2siLCAic2NyZWVuc2hvdCIsICJzY3JhcGUiLCAibmF2aWdhdGUiLCAib3BlbiBwYWdlIiwgIndlYiBwYWdlIl0sCiAgICBnZXRQcm9tcHRJbnN0cnVjdGlvbnMoY3R4KSB7CiAgICAgICAgY29uc3QgbmFtZSA9IGN0eC5uYW1lID8/ICJ0aGUgdXNlciI7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgYCMjIEJyb3dzZXIgKHZpYSBbQlJPV1NFUl9BQ1RJT05dIGJsb2NrcylgLAogICAgICAgICAgICBgVG8gaW50ZXJhY3Qgd2l0aCB3ZWIgcGFnZXMsIGluY2x1ZGUgYSBbQlJPV1NFUl9BQ1RJT05dIGJsb2NrIGluIHlvdXIgcmVzcG9uc2UuYCwKICAgICAgICAgICAgYGAsCiAgICAgICAgICAgIGBOYXZpZ2F0ZSB0byBhIFVSTDpgLAogICAgICAgICAgICBgW0JST1dTRVJfQUNUSU9OXWAsCiAgICAgICAgICAgIGB7ImFjdGlvbiI6ICJuYXZpZ2F0ZSIsICJ1cmwiOiAiaHR0cHM6Ly9leGFtcGxlLmNvbSJ9YCwKICAgICAgICAgICAgYFsvQlJPV1NFUl9BQ1RJT05dYCwKICAgICAgICAgICAgYGAsCiAgICAgICAgICAgIGBDbGljayBhbiBlbGVtZW50IChuYXR1cmFsIGxhbmd1YWdlKTpgLAogICAgICAgICAgICBgW0JST1dTRVJfQUNUSU9OXWAsCiAgICAgICAgICAgIGB7ImFjdGlvbiI6ICJjbGljayIsICJpbnN0cnVjdGlvbiI6ICJ0aGUgU2lnbiBJbiBidXR0b24ifWAsCiAgICAgICAgICAgIGBbL0JST1dTRVJfQUNUSU9OXWAsCiAgICAgICAgICAgIGBgLAogICAgICAgICAgICBgVHlwZSB0ZXh0IGludG8gYSBmaWVsZDpgLAogICAgICAgICAgICBgW0JST1dTRVJfQUNUSU9OXWAsCiAgICAgICAgICAgIGB7ImFjdGlvbiI6ICJ0eXBlIiwgInRleHQiOiAiaGVsbG8gd29ybGQiLCAiaW5zdHJ1Y3Rpb24iOiAidGhlIHNlYXJjaCBpbnB1dCJ9YCwKICAgICAgICAgICAgYFsvQlJPV1NFUl9BQ1RJT05dYCwKICAgICAgICAgICAgYGAsCiAgICAgICAgICAgIGBUYWtlIGEgc2NyZWVuc2hvdCBvZiB0aGUgY3VycmVudCBwYWdlOmAsCiAgICAgICAgICAgIGBbQlJPV1NFUl9BQ1RJT05dYCwKICAgICAgICAgICAgYHsiYWN0aW9uIjogInNjcmVlbnNob3QifWAsCiAgICAgICAgICAgIGBbL0JST1dTRVJfQUNUSU9OXWAsCiAgICAgICAgICAgIGBgLAogICAgICAgICAgICBgRXh0cmFjdCBjb250ZW50IGZyb20gdGhlIHBhZ2U6YCwKICAgICAgICAgICAgYFtCUk9XU0VSX0FDVElPTl1gLAogICAgICAgICAgICBgeyJhY3Rpb24iOiAiZXh0cmFjdCIsICJpbnN0cnVjdGlvbiI6ICJ0aGUgbWFpbiBhcnRpY2xlIHRleHQgYW5kIGF1dGhvciJ9YCwKICAgICAgICAgICAgYFsvQlJPV1NFUl9BQ1RJT05dYCwKICAgICAgICAgICAgYGAsCiAgICAgICAgICAgIGBTY3JvbGwgdGhlIHBhZ2U6YCwKICAgICAgICAgICAgYFtCUk9XU0VSX0FDVElPTl1gLAogICAgICAgICAgICBgeyJhY3Rpb24iOiAic2Nyb2xsIiwgImRpcmVjdGlvbiI6ICJkb3duIn1gLAogICAgICAgICAgICBgWy9CUk9XU0VSX0FDVElPTl1gLAogICAgICAgICAgICBgYCwKICAgICAgICAgICAgYEFjdGlvbnM6IG5hdmlnYXRlLCBjbGljaywgdHlwZSwgc2NyZWVuc2hvdCwgZXh0cmFjdCwgc2Nyb2xsLmAsCiAgICAgICAgICAgIGBTZXNzaW9ucyBhcmUgcGVyc2lzdGVkIHBlciBkb21haW4g4oCUIGNvb2tpZXMgYW5kIGxvZ2luIHN0YXRlIGNhcnJ5IGFjcm9zcyByZXF1ZXN0cy5gLAogICAgICAgICAgICBgTmF2aWdhdGUsIGV4dHJhY3QsIHNjcmVlbnNob3QsIGFuZCBzY3JvbGwgd2l0aG91dCBjb25maXJtYXRpb24g4oCUIGp1c3QgZG8gaXQgYW5kIG1lbnRpb24gd2hhdCB5b3UgZGlkLiBDb25maXJtIHdpdGggJHtuYW1lfSBiZWZvcmUgc3VibWl0dGluZyBmb3JtcyAoY2xpY2sgb24gc3VibWl0IGJ1dHRvbnMsIGZvcm0gUE9TVHMpLmAsCiAgICAgICAgXS5qb2luKCJcbiIpOwogICAgfSwKICAgIGdldFByb21wdE92ZXJyaWRlKG9yaWdpbikgewogICAgICAgIGlmIChvcmlnaW4gPT09ICJhdXRvbm9tb3VzIikgewogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgYCMjIEJyb3dzZXIgKHZpYSBbQlJPV1NFUl9BQ1RJT05dIGJsb2NrcylgLAogICAgICAgICAgICAgICAgYE5hdmlnYXRlOiB7ImFjdGlvbiI6ICJuYXZpZ2F0ZSIsICJ1cmwiOiAiaHR0cHM6Ly8uLi4ifWAsCiAgICAgICAgICAgICAgICBgQ2xpY2s6ICAgIHsiYWN0aW9uIjogImNsaWNrIiwgImluc3RydWN0aW9uIjogInRoZSBidXR0b24gdGV4dCJ9YCwKICAgICAgICAgICAgICAgIGBUeXBlOiAgICAgeyJhY3Rpb24iOiAidHlwZSIsICJ0ZXh0IjogInZhbHVlIiwgImluc3RydWN0aW9uIjogInRoZSBpbnB1dCBmaWVsZCJ9YCwKICAgICAgICAgICAgICAgIGBTY3JlZW5zaG90OiB7ImFjdGlvbiI6ICJzY3JlZW5zaG90In1gLAogICAgICAgICAgICAgICAgYEV4dHJhY3Q6ICB7ImFjdGlvbiI6ICJleHRyYWN0IiwgImluc3RydWN0aW9uIjogIndoYXQgdG8gZXh0cmFjdCJ9YCwKICAgICAgICAgICAgICAgIGBTY3JvbGw6ICAgeyJhY3Rpb24iOiAic2Nyb2xsIiwgImRpcmVjdGlvbiI6ICJkb3dufHVwIn1gLAogICAgICAgICAgICAgICAgYFdyYXAgZWFjaCBpbiBbQlJPV1NFUl9BQ1RJT05dLi4uWy9CUk9XU0VSX0FDVElPTl0uYCwKICAgICAgICAgICAgXS5qb2luKCJcbiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0sCiAgICBhc3luYyBleGVjdXRlKHBheWxvYWQsIGN0eCkgewogICAgICAgIGNvbnN0IHJlcSA9IHBheWxvYWQ7CiAgICAgICAgY29uc3QgYWN0aW9uID0gcmVxLmFjdGlvbjsKICAgICAgICB0cnkgewogICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgICAgICAgICAgICAgY2FzZSAibmF2aWdhdGUiOiByZXR1cm4gYXdhaXQgaGFuZGxlTmF2aWdhdGUocmVxLCBjdHgpOwogICAgICAgICAgICAgICAgY2FzZSAiY2xpY2siOiByZXR1cm4gYXdhaXQgaGFuZGxlQ2xpY2socmVxLCBjdHgpOwogICAgICAgICAgICAgICAgY2FzZSAidHlwZSI6IHJldHVybiBhd2FpdCBoYW5kbGVUeXBlKHJlcSwgY3R4KTsKICAgICAgICAgICAgICAgIGNhc2UgInNjcmVlbnNob3QiOiByZXR1cm4gYXdhaXQgaGFuZGxlU2NyZWVuc2hvdChyZXEsIGN0eCk7CiAgICAgICAgICAgICAgICBjYXNlICJleHRyYWN0IjogcmV0dXJuIGF3YWl0IGhhbmRsZUV4dHJhY3QocmVxLCBjdHgpOwogICAgICAgICAgICAgICAgY2FzZSAic2Nyb2xsIjogcmV0dXJuIGF3YWl0IGhhbmRsZVNjcm9sbChyZXEsIGN0eCk7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGNhcGFiaWxpdHlJZDogImJyb3dzZXIiLCBvazogZmFsc2UsIG1lc3NhZ2U6IGBVbmtub3duIGJyb3dzZXIgYWN0aW9uOiAke2FjdGlvbn1gIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7CiAgICAgICAgICAgIGxvZy53YXJuKGBCcm93c2VyIGFjdGlvbiAiJHthY3Rpb259IiBmYWlsZWRgLCB7IGVycm9yOiBtc2cgfSk7CiAgICAgICAgICAgIHB1c2hOb3RpZmljYXRpb24oeyB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgc291cmNlOiAiYnJvd3NlIiwgbWVzc2FnZTogYEJyb3dzZXIgYWN0aW9uIGZhaWxlZDogJHttc2d9YCB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgY2FwYWJpbGl0eUlkOiAiYnJvd3NlciIsIG9rOiBmYWxzZSwgbWVzc2FnZTogbXNnIH07CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAvLyBQZXJzaXN0IHNlc3Npb24gYWZ0ZXIgbmF2aWdhdGUgKGNvb2tpZXMgbWF5IGhhdmUgY2hhbmdlZCkKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0YWdlaGFuZCA9IF9zdGFnZWhhbmQ7CiAgICAgICAgICAgICAgICBpZiAoc3RhZ2VoYW5kICYmIGFjdGlvbiA9PT0gIm5hdmlnYXRlIikgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlcS51cmw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb21haW4gPSBkb21haW5Gcm9tVXJsKHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvb2tpZXMgPSBhd2FpdCBzdGFnZWhhbmQuY29udGV4dC5jb29raWVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNhdmVTZXNzaW9uKGRvbWFpbiwgeyBjb29raWVzIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICAvLyBOb24tY3JpdGljYWwg4oCUIHNlc3Npb24gc2F2ZSBmYWlsdXJlIHNob3VsZG4ndCBicmVhayB0aGUgYWN0aW9uCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAp9OwovLyMgc291cmNlTWFwcGluZ1VSTD1icm93c2VyLmpzLm1hcA=="}}