@unbrained/pm-cli 2026.10.11 → 2026.10.13

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 (740) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +45 -0
  3. package/dist/cli/after-command-context-usage.d.ts +8 -8
  4. package/dist/cli/bundle-integrity.d.ts +23 -23
  5. package/dist/cli/commander-usage.d.ts +31 -31
  6. package/dist/cli/commander-usage.js +3 -3
  7. package/dist/cli/error-guidance.d.ts +158 -161
  8. package/dist/cli/error-guidance.js +2 -2
  9. package/dist/cli/extension-command-help.d.ts +68 -68
  10. package/dist/cli/extension-command-options.d.ts +20 -20
  11. package/dist/cli/extension-recovery.d.ts +20 -20
  12. package/dist/cli/help-content.d.ts +16 -16
  13. package/dist/cli/help-content.js +2 -2
  14. package/dist/cli/help-json-payload.d.ts +40 -40
  15. package/dist/cli/help-json-payload.js +1 -1
  16. package/dist/cli/invocation-profile.d.ts +8 -8
  17. package/dist/cli/main.d.ts +166 -165
  18. package/dist/cli/main.js +4 -4
  19. package/dist/cli/migration-gates.d.ts +20 -20
  20. package/dist/cli/register-list-query.d.ts +4 -4
  21. package/dist/cli/register-mutation-options.d.ts +2 -2
  22. package/dist/cli/register-operations.d.ts +68 -63
  23. package/dist/cli/register-operations.js +1 -1
  24. package/dist/cli/register-setup.d.ts +1 -1
  25. package/dist/cli/register-structured-mutation.d.ts +3 -3
  26. package/dist/cli/register-structured-mutation.js +1 -1
  27. package/dist/cli/runtime/activation.d.ts +3 -3
  28. package/dist/cli/runtime/invocation-options.js +1 -1
  29. package/dist/cli/runtime/selection.d.ts +6 -6
  30. package/dist/cli/runtime-compatibility-boundary.d.ts +12 -12
  31. package/dist/cli-bundle/bundle-manifest.json +1 -1
  32. package/dist/cli-bundle/chunks/{chunk-K2UTE75T.js → chunk-AM2XOZKE.js} +2 -2
  33. package/dist/cli-bundle/chunks/{chunk-S445XEYT.js → chunk-APWPC4ZZ.js} +2 -2
  34. package/dist/cli-bundle/chunks/chunk-DJDRHJBP.js +234 -0
  35. package/dist/cli-bundle/chunks/{chunk-RUT3CCAG.js → chunk-DUK5DHI6.js} +2 -2
  36. package/dist/cli-bundle/chunks/chunk-HXHFKXLV.js +2 -0
  37. package/dist/cli-bundle/chunks/chunk-IFPJDJUM.js +20 -0
  38. package/dist/cli-bundle/chunks/{chunk-OBLO45UM.js → chunk-LBDWFWPK.js} +2 -2
  39. package/dist/cli-bundle/chunks/{chunk-ZWRLAOA4.js → chunk-N5EXRYCZ.js} +2 -2
  40. package/dist/cli-bundle/chunks/chunk-PSNS537F.js +30 -0
  41. package/dist/cli-bundle/chunks/{chunk-2JYTSTQP.js → chunk-RL45OYTL.js} +2 -2
  42. package/dist/cli-bundle/chunks/{chunk-ESRACL6K.js → chunk-UBTYYZIE.js} +49 -49
  43. package/dist/cli-bundle/chunks/chunk-WYZGZV2M.js +2 -0
  44. package/dist/cli-bundle/chunks/{chunk-SSY4OSJR.js → chunk-YH6H3UVE.js} +10 -10
  45. package/dist/cli-bundle/chunks/{register-list-query-T6BOR67M.js → register-list-query-BJ742QOR.js} +2 -2
  46. package/dist/cli-bundle/chunks/{register-mutation-6NXR7SAJ.js → register-mutation-GGGBRIH2.js} +3 -3
  47. package/dist/cli-bundle/chunks/register-operations-E6HXYHNM.js +2 -0
  48. package/dist/cli-bundle/chunks/{register-setup-MAYFPKBX.js → register-setup-4ZVTVEPY.js} +2 -2
  49. package/dist/cli-bundle/focused-chunks/{chunk-EIOQNLBQ.js → chunk-3LQEBXU5.js} +12 -12
  50. package/dist/cli-bundle/focused-chunks/{chunk-PLTTMQAW.js → chunk-6BTUISKV.js} +2 -2
  51. package/dist/cli-bundle/focused-chunks/chunk-73UNAJHD.js +2 -0
  52. package/dist/cli-bundle/focused-chunks/{chunk-WAOXID5J.js → chunk-DVK7VKZL.js} +2 -2
  53. package/dist/cli-bundle/focused-chunks/{chunk-SIEGIPNT.js → chunk-F5J3ATMV.js} +16 -16
  54. package/dist/cli-bundle/focused-chunks/chunk-IIKFTJVC.js +2 -0
  55. package/dist/cli-bundle/focused-chunks/chunk-IOTNG6CN.js +2 -0
  56. package/dist/cli-bundle/focused-chunks/{chunk-AU6VJGTY.js → chunk-KGFRQ34R.js} +2 -2
  57. package/dist/cli-bundle/focused-chunks/chunk-NNW5BS5L.js +3 -0
  58. package/dist/cli-bundle/focused-chunks/{chunk-KNJR2WUO.js → chunk-QMNAY25P.js} +62 -62
  59. package/dist/cli-bundle/focused-chunks/{chunk-W5AE7GKZ.js → chunk-R23T7GFZ.js} +2 -2
  60. package/dist/cli-bundle/focused-chunks/chunk-RAA7SVRA.js +8 -0
  61. package/dist/cli-bundle/focused-chunks/{chunk-52UJEHEV.js → chunk-RU6GCFN3.js} +2 -2
  62. package/dist/cli-bundle/focused-chunks/{chunk-JGFSSR3G.js → chunk-S6ITXQ5T.js} +5 -5
  63. package/dist/cli-bundle/focused-chunks/{chunk-DMSADMEU.js → chunk-SOB7X4FJ.js} +2 -2
  64. package/dist/cli-bundle/focused-chunks/chunk-UPJA45K7.js +26 -0
  65. package/dist/cli-bundle/main.js +22 -22
  66. package/dist/cli-bundle/sdk-authoring.js +1 -1
  67. package/dist/cli-bundle/sdk-contracts.js +2 -2
  68. package/dist/cli-bundle/sdk-core.js +31 -31
  69. package/dist/cli-bundle/sdk-governance.js +1 -1
  70. package/dist/cli-bundle/sdk-graph.js +1 -1
  71. package/dist/cli-bundle/sdk-merge.js +51 -51
  72. package/dist/cli-bundle/sdk-query.js +1 -1
  73. package/dist/cli-bundle/sdk-runtime.js +1 -1
  74. package/dist/cli-bundle/sdk-testing.js +1 -1
  75. package/dist/cli-bundle/sdk.js +8 -8
  76. package/dist/cli.d.ts +4 -4
  77. package/dist/core/checkpoint/checkpoint-gc.d.ts +32 -32
  78. package/dist/core/checkpoint/mutation-checkpoint.d.ts +34 -34
  79. package/dist/core/config/nested-settings.d.ts +26 -26
  80. package/dist/core/config/positional-value.d.ts +16 -16
  81. package/dist/core/diagnostics/remediation.d.ts +6 -6
  82. package/dist/core/diagnostics/remediation.js +1 -1
  83. package/dist/core/extensions/activation-summary-markdown.d.ts +6 -6
  84. package/dist/core/extensions/activation-summary.d.ts +54 -54
  85. package/dist/core/extensions/activation-transaction.d.ts +7 -7
  86. package/dist/core/extensions/capability-usage.d.ts +26 -26
  87. package/dist/core/extensions/command-hook-context.d.ts +26 -26
  88. package/dist/core/extensions/contribution-inventory.d.ts +21 -21
  89. package/dist/core/extensions/extension-candidate.d.ts +14 -14
  90. package/dist/core/extensions/extension-capability-aliases.d.ts +2 -2
  91. package/dist/core/extensions/extension-policy.d.ts +80 -80
  92. package/dist/core/extensions/extension-types.d.ts +1294 -1285
  93. package/dist/core/extensions/extension-types.js +1 -1
  94. package/dist/core/extensions/flag-definition-validation.d.ts +4 -4
  95. package/dist/core/extensions/item-fields.d.ts +3 -2
  96. package/dist/core/extensions/item-fields.js +1 -1
  97. package/dist/core/extensions/loader.d.ts +36 -36
  98. package/dist/core/extensions/loader.js +1 -1
  99. package/dist/core/extensions/manifest-schema.d.ts +16 -16
  100. package/dist/core/extensions/module-graph-snapshot.d.ts +8 -8
  101. package/dist/core/extensions/read-output-contract.d.ts +5 -0
  102. package/dist/core/extensions/read-output-contract.js +2 -0
  103. package/dist/core/extensions/registration-values.d.ts +1 -1
  104. package/dist/core/extensions/reserved-host-flags.d.ts +6 -6
  105. package/dist/core/extensions/version-compat.d.ts +10 -10
  106. package/dist/core/fs/fs-utils.d.ts +1 -1
  107. package/dist/core/fs/host-environment-errors.d.ts +14 -14
  108. package/dist/core/governance/content-fields.d.ts +31 -31
  109. package/dist/core/governance/issue-codes.d.ts +27 -27
  110. package/dist/core/governance/metadata-coverage.d.ts +91 -91
  111. package/dist/core/history/drift-scan.d.ts +26 -26
  112. package/dist/core/history/event-classification.d.ts +1 -1
  113. package/dist/core/history/event-classification.js +1 -1
  114. package/dist/core/history/event-index.d.ts +41 -41
  115. package/dist/core/history/history-compact-bulk.d.ts +22 -22
  116. package/dist/core/history/history-diff.d.ts +22 -22
  117. package/dist/core/history/history-rewrite.d.ts +66 -66
  118. package/dist/core/history/history-storage-stats.d.ts +31 -31
  119. package/dist/core/history/history-stream-policy.d.ts +12 -12
  120. package/dist/core/history/history.d.ts +22 -22
  121. package/dist/core/history/identity.d.ts +6 -6
  122. package/dist/core/history/operation-contract.d.ts +9 -9
  123. package/dist/core/history/projection.d.ts +15 -15
  124. package/dist/core/history/read.d.ts +4 -4
  125. package/dist/core/history/replay.d.ts +51 -49
  126. package/dist/core/history/replay.js +1 -1
  127. package/dist/core/history/workspace-history.d.ts +101 -101
  128. package/dist/core/io/bulk-ids-input.d.ts +4 -4
  129. package/dist/core/item/actionability.d.ts +40 -40
  130. package/dist/core/item/id.d.ts +3 -3
  131. package/dist/core/item/item-format-version.d.ts +8 -8
  132. package/dist/core/item/item-format.d.ts +37 -35
  133. package/dist/core/item/item-format.js +2 -2
  134. package/dist/core/item/item-type-definition.d.ts +2 -2
  135. package/dist/core/item/parent-reference-policy.d.ts +1 -1
  136. package/dist/core/item/parse.d.ts +12 -12
  137. package/dist/core/item/sprint-release-format.d.ts +2 -2
  138. package/dist/core/item/status-filter.d.ts +4 -4
  139. package/dist/core/item/toon-decode.d.ts +9 -9
  140. package/dist/core/item/type-registry.d.ts +40 -40
  141. package/dist/core/lock/lock-gc.d.ts +50 -50
  142. package/dist/core/lock/lock.d.ts +37 -37
  143. package/dist/core/output/mutation-projection.d.ts +6 -6
  144. package/dist/core/output/output-control.d.ts +4 -4
  145. package/dist/core/output/output.d.ts +40 -40
  146. package/dist/core/output/query-summary.d.ts +5 -5
  147. package/dist/core/packages/manifest.d.ts +50 -50
  148. package/dist/core/policy/workflow-policy-schema.d.ts +306 -306
  149. package/dist/core/policy/workflow-policy-store.d.ts +7 -7
  150. package/dist/core/policy/workflow-policy.d.ts +81 -81
  151. package/dist/core/profile/profile-describe.d.ts +40 -40
  152. package/dist/core/profile/profile-lint.d.ts +20 -20
  153. package/dist/core/profile/profile-plan.d.ts +84 -84
  154. package/dist/core/profile/profile-presets.d.ts +52 -52
  155. package/dist/core/reproducibility/context.d.ts +6 -6
  156. package/dist/core/schema/fields-file.d.ts +54 -54
  157. package/dist/core/schema/item-types-file.d.ts +36 -36
  158. package/dist/core/schema/runtime-field-values.d.ts +2 -2
  159. package/dist/core/schema/runtime-schema.d.ts +86 -86
  160. package/dist/core/schema/status-defs-file.d.ts +36 -36
  161. package/dist/core/schema/type-inference.d.ts +14 -14
  162. package/dist/core/schema/type-workflows.d.ts +22 -22
  163. package/dist/core/search/background-refresh.d.ts +9 -9
  164. package/dist/core/search/bm25.d.ts +19 -19
  165. package/dist/core/search/cache.d.ts +35 -35
  166. package/dist/core/search/corpus.d.ts +12 -12
  167. package/dist/core/search/embedding-batches.d.ts +48 -48
  168. package/dist/core/search/eval.d.ts +49 -49
  169. package/dist/core/search/http-client.d.ts +38 -38
  170. package/dist/core/search/providers.d.ts +41 -41
  171. package/dist/core/search/relevance.d.ts +20 -20
  172. package/dist/core/search/semantic-defaults.d.ts +8 -8
  173. package/dist/core/search/staleness.d.ts +4 -4
  174. package/dist/core/search/vector-stores.d.ts +78 -78
  175. package/dist/core/search/vectorization-metadata.d.ts +6 -6
  176. package/dist/core/sentry/helpers.d.ts +15 -15
  177. package/dist/core/sentry/instrument.d.ts +40 -40
  178. package/dist/core/session/session-state.d.ts +32 -32
  179. package/dist/core/shared/agent-session-context.d.ts +14 -14
  180. package/dist/core/shared/author.d.ts +128 -128
  181. package/dist/core/shared/command-types.d.ts +40 -40
  182. package/dist/core/shared/conflict-markers.d.ts +6 -6
  183. package/dist/core/shared/constants.d.ts +13 -13
  184. package/dist/core/shared/errors.d.ts +194 -183
  185. package/dist/core/shared/errors.js +1 -1
  186. package/dist/core/shared/secret-rules.d.ts +97 -97
  187. package/dist/core/shared/serial-queue.d.ts +8 -8
  188. package/dist/core/shared/split-comma-list.d.ts +6 -6
  189. package/dist/core/shared/time.d.ts +23 -23
  190. package/dist/core/store/item-format-migration.d.ts +10 -10
  191. package/dist/core/store/item-metadata-cache.d.ts +38 -38
  192. package/dist/core/store/item-metadata-query-index.d.ts +79 -79
  193. package/dist/core/store/item-metadata-read-work.d.ts +6 -6
  194. package/dist/core/store/item-store.d.ts +110 -110
  195. package/dist/core/store/paths.d.ts +2 -2
  196. package/dist/core/store/settings-read-cache.d.ts +12 -12
  197. package/dist/core/store/settings-validator.d.ts +165 -165
  198. package/dist/core/store/settings.d.ts +59 -59
  199. package/dist/core/telemetry/observability.d.ts +17 -17
  200. package/dist/core/telemetry/policy.d.ts +3 -3
  201. package/dist/core/telemetry/runtime.d.ts +242 -242
  202. package/dist/core/telemetry/runtime.js +2 -2
  203. package/dist/core/test/background-runs.d.ts +186 -185
  204. package/dist/core/test/background-runs.js +2 -2
  205. package/dist/core/test/item-test-run-tracking.d.ts +6 -6
  206. package/dist/core/test/run-selectors.d.ts +18 -18
  207. package/dist/core/validate/fix-planning.d.ts +50 -50
  208. package/dist/core/validate/missing-by-type.d.ts +4 -4
  209. package/dist/core/validate/missing-link-owners.d.ts +30 -30
  210. package/dist/core/validate/stale-file-classification.d.ts +8 -8
  211. package/dist/mcp/http-server.d.ts +28 -28
  212. package/dist/mcp/legacy-adapter.d.ts +33 -33
  213. package/dist/mcp/runtime-capabilities.d.ts +16 -16
  214. package/dist/mcp/server.d.ts +50 -50
  215. package/dist/mcp/tool-definitions.d.ts +36 -36
  216. package/dist/sdk/agent/closed-domain-contracts.d.ts +18 -18
  217. package/dist/sdk/agent/command-recovery.d.ts +4 -0
  218. package/dist/sdk/agent/command-recovery.js +1 -1
  219. package/dist/sdk/agent/command-suggestions.d.ts +2 -0
  220. package/dist/sdk/agent/command-suggestions.js +1 -1
  221. package/dist/sdk/agent/identity-config.d.ts +32 -32
  222. package/dist/sdk/agent/item-addressing.d.ts +8 -8
  223. package/dist/sdk/agent/refusal-closure-census.d.ts +34 -34
  224. package/dist/sdk/agent/refusal-closure.d.ts +42 -42
  225. package/dist/sdk/agent/refusal-corpus-contracts.d.ts +46 -46
  226. package/dist/sdk/agent/refusal-reachability.d.ts +112 -112
  227. package/dist/sdk/agent/subcommand-recovery.d.ts +25 -25
  228. package/dist/sdk/agent/task-transcript-contracts.d.ts +30 -30
  229. package/dist/sdk/agent/tracker-preflight-contracts.d.ts +38 -38
  230. package/dist/sdk/agent-capability-contracts.d.ts +37 -37
  231. package/dist/sdk/annotations.d.ts +106 -106
  232. package/dist/sdk/author-attribution.d.ts +76 -76
  233. package/dist/sdk/authoring.d.ts +1 -1
  234. package/dist/sdk/authoring.js +1 -1
  235. package/dist/sdk/cli-bootstrap.d.ts +70 -70
  236. package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +63 -63
  237. package/dist/sdk/cli-contracts/command-aliases.d.ts +14 -14
  238. package/dist/sdk/cli-contracts/command-exit-contracts.d.ts +70 -70
  239. package/dist/sdk/cli-contracts/commander-types.d.ts +17 -17
  240. package/dist/sdk/cli-contracts/completeness.d.ts +26 -26
  241. package/dist/sdk/cli-contracts/enum-contracts.d.ts +5 -5
  242. package/dist/sdk/cli-contracts/flag-contracts.d.ts +32 -32
  243. package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
  244. package/dist/sdk/cli-contracts/flag-lexicon-contracts.d.ts +42 -42
  245. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -1
  246. package/dist/sdk/cli-contracts/grammar-contracts.d.ts +84 -84
  247. package/dist/sdk/cli-contracts/grammar-contracts.js +1 -1
  248. package/dist/sdk/cli-contracts/registration-helpers.d.ts +37 -40
  249. package/dist/sdk/cli-contracts/registration-helpers.js +1 -1
  250. package/dist/sdk/cli-contracts/runtime-contracts.d.ts +290 -294
  251. package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
  252. package/dist/sdk/cli-contracts/schemas/assurance-definition.d.ts +793 -793
  253. package/dist/sdk/cli-contracts/tool-option-contracts.d.ts +391 -391
  254. package/dist/sdk/cli-contracts/tool-parameter-tables.d.ts +6 -6
  255. package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -1
  256. package/dist/sdk/cli-contracts/tool-schema.d.ts +55 -55
  257. package/dist/sdk/cli-contracts/tool-schema.js +1 -1
  258. package/dist/sdk/cli-contracts/typed-action-inputs.d.ts +24 -24
  259. package/dist/sdk/comments.d.ts +44 -44
  260. package/dist/sdk/compile-cache.d.ts +4 -4
  261. package/dist/sdk/completion/shared.d.ts +22 -22
  262. package/dist/sdk/compose.d.ts +156 -156
  263. package/dist/sdk/config.d.ts +123 -123
  264. package/dist/sdk/context/semantic-session-attribution.d.ts +14 -14
  265. package/dist/sdk/context/usage-ledger.d.ts +20 -20
  266. package/dist/sdk/context-intent-contracts.d.ts +50 -50
  267. package/dist/sdk/context-intent-contracts.js +1 -1
  268. package/dist/sdk/context-intent-runtime.d.ts +8 -8
  269. package/dist/sdk/context-packing.d.ts +78 -78
  270. package/dist/sdk/context-relevance.d.ts +189 -180
  271. package/dist/sdk/context-relevance.js +1 -1
  272. package/dist/sdk/context-signal-store.d.ts +84 -84
  273. package/dist/sdk/context-usage.d.ts +92 -92
  274. package/dist/sdk/core.d.ts +1 -0
  275. package/dist/sdk/core.js +1 -1
  276. package/dist/sdk/corpus-shape.d.ts +101 -101
  277. package/dist/sdk/define.d.ts +2 -2
  278. package/dist/sdk/dependencies.d.ts +116 -116
  279. package/dist/sdk/dependency-flag-validation.d.ts +14 -12
  280. package/dist/sdk/dependency-flag-validation.js +1 -1
  281. package/dist/sdk/dependency-provenance.d.ts +30 -30
  282. package/dist/sdk/docs.d.ts +32 -32
  283. package/dist/sdk/duplicates.d.ts +21 -21
  284. package/dist/sdk/environment/agent-environment.d.ts +196 -196
  285. package/dist/sdk/environment/project-runtime-compatibility.d.ts +56 -56
  286. package/dist/sdk/environment/source-context.d.ts +6 -6
  287. package/dist/sdk/error-code-catalog.d.ts +40 -40
  288. package/dist/sdk/errors.d.ts +29 -29
  289. package/dist/sdk/eval.d.ts +45 -45
  290. package/dist/sdk/extension/author-manifest.d.ts +14 -14
  291. package/dist/sdk/extension/bundled-catalog.d.ts +7 -7
  292. package/dist/sdk/extension/describe.d.ts +36 -36
  293. package/dist/sdk/extension/doctor.d.ts +29 -29
  294. package/dist/sdk/extension/install-plan.d.ts +55 -55
  295. package/dist/sdk/extension/install-receipts.d.ts +2 -2
  296. package/dist/sdk/extension/install-runtime.d.ts +8 -8
  297. package/dist/sdk/extension/install-snapshot.d.ts +14 -14
  298. package/dist/sdk/extension/install-sources.d.ts +96 -96
  299. package/dist/sdk/extension/managed-state.d.ts +66 -66
  300. package/dist/sdk/extension/migrations.d.ts +82 -82
  301. package/dist/sdk/extension/output-ownership.d.ts +24 -24
  302. package/dist/sdk/extension/runtime-summary.d.ts +5 -5
  303. package/dist/sdk/extension/scaffold.d.ts +12 -12
  304. package/dist/sdk/extension/shared.d.ts +15 -15
  305. package/dist/sdk/extension/source-resolution.d.ts +30 -30
  306. package/dist/sdk/extension/static-inventory.d.ts +42 -42
  307. package/dist/sdk/extension/update-check.d.ts +10 -10
  308. package/dist/sdk/extension.d.ts +320 -320
  309. package/dist/sdk/files.d.ts +157 -157
  310. package/dist/sdk/flag-invocation-contracts.d.ts +44 -44
  311. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
  312. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  313. package/dist/sdk/governance/artifact-ledgers.d.ts +35 -35
  314. package/dist/sdk/governance/artifact-ledgers.js +1 -1
  315. package/dist/sdk/governance/assurance-action.d.ts +68 -68
  316. package/dist/sdk/governance/assurance-action.js +1 -1
  317. package/dist/sdk/governance/assurance-mutation-error.d.ts +36 -36
  318. package/dist/sdk/governance/assurance-presets.d.ts +24 -24
  319. package/dist/sdk/governance/assurance-runtime.d.ts +14 -14
  320. package/dist/sdk/governance/assurance.d.ts +353 -353
  321. package/dist/sdk/governance/boundary-fixtures.d.ts +60 -60
  322. package/dist/sdk/governance/closure-timestamps.d.ts +9 -9
  323. package/dist/sdk/governance/coverage-assurance.d.ts +10 -10
  324. package/dist/sdk/governance/defect-recurrence-coverage.d.ts +75 -75
  325. package/dist/sdk/governance/defect-recurrence-graph.d.ts +18 -18
  326. package/dist/sdk/governance/defect-recurrence.d.ts +186 -181
  327. package/dist/sdk/governance/defect-recurrence.js +1 -1
  328. package/dist/sdk/governance/extension-host-version.d.ts +16 -16
  329. package/dist/sdk/governance/gc.d.ts +48 -48
  330. package/dist/sdk/governance/health-merge-evidence.d.ts +5 -5
  331. package/dist/sdk/governance/health.d.ts +188 -188
  332. package/dist/sdk/governance/hierarchy-validation.d.ts +13 -13
  333. package/dist/sdk/governance/linked-file-report.d.ts +26 -26
  334. package/dist/sdk/governance/merge-receipt-history.d.ts +36 -36
  335. package/dist/sdk/governance/provenance-health.d.ts +64 -64
  336. package/dist/sdk/governance/reindex.d.ts +89 -89
  337. package/dist/sdk/governance/reliability.d.ts +56 -56
  338. package/dist/sdk/governance/stale-work.d.ts +22 -22
  339. package/dist/sdk/governance/status-role-diagnostics.d.ts +12 -12
  340. package/dist/sdk/governance/storage-integrity.d.ts +54 -54
  341. package/dist/sdk/governance/tracked-runtime-cache.d.ts +10 -10
  342. package/dist/sdk/governance/upgrade.d.ts +104 -104
  343. package/dist/sdk/governance/validate-history-drift.d.ts +2 -2
  344. package/dist/sdk/governance/validate-item-reader.d.ts +6 -6
  345. package/dist/sdk/governance/validate.d.ts +191 -191
  346. package/dist/sdk/governance/workflow-completeness.d.ts +15 -15
  347. package/dist/sdk/governance/workflow-policy.d.ts +28 -28
  348. package/dist/sdk/governance/workspace-position.d.ts +46 -46
  349. package/dist/sdk/graph/adapter.d.ts +66 -66
  350. package/dist/sdk/graph/analytics.d.ts +54 -54
  351. package/dist/sdk/graph/assembly.d.ts +80 -80
  352. package/dist/sdk/graph/cache.d.ts +29 -29
  353. package/dist/sdk/graph/cardinality-integrity.d.ts +13 -0
  354. package/dist/sdk/graph/cardinality-integrity.js +2 -0
  355. package/dist/sdk/graph/centrality.d.ts +34 -34
  356. package/dist/sdk/graph/conformance.d.ts +33 -33
  357. package/dist/sdk/graph/deadline-scheduling.d.ts +58 -58
  358. package/dist/sdk/graph/durable-cache.d.ts +26 -26
  359. package/dist/sdk/graph/governance.d.ts +165 -165
  360. package/dist/sdk/graph/hierarchy-integrity.d.ts +52 -52
  361. package/dist/sdk/graph/index.d.ts +1 -0
  362. package/dist/sdk/graph/index.js +1 -1
  363. package/dist/sdk/graph/lifecycle-coverage.d.ts +17 -17
  364. package/dist/sdk/graph/mutation-advisory.d.ts +11 -11
  365. package/dist/sdk/graph/query-contracts.d.ts +10 -10
  366. package/dist/sdk/graph/remediation.d.ts +25 -25
  367. package/dist/sdk/graph/run.d.ts +392 -392
  368. package/dist/sdk/graph/scheduling.d.ts +38 -38
  369. package/dist/sdk/graph/traversal.d.ts +14 -14
  370. package/dist/sdk/guide-topics.d.ts +32 -32
  371. package/dist/sdk/guide.d.ts +62 -62
  372. package/dist/sdk/history/attestation-command.d.ts +12 -12
  373. package/dist/sdk/history/attestation-contract.d.ts +78 -78
  374. package/dist/sdk/history/attestation-scan.d.ts +6 -6
  375. package/dist/sdk/history/maintenance.d.ts +46 -46
  376. package/dist/sdk/history/salvage.d.ts +18 -18
  377. package/dist/sdk/history/subject.d.ts +9 -9
  378. package/dist/sdk/history-analytics.d.ts +84 -84
  379. package/dist/sdk/history-compact.d.ts +103 -103
  380. package/dist/sdk/history-mcp.d.ts +8 -8
  381. package/dist/sdk/history-provenance.d.ts +59 -59
  382. package/dist/sdk/history-read.d.ts +36 -36
  383. package/dist/sdk/history-redact.d.ts +78 -78
  384. package/dist/sdk/history-repair.d.ts +158 -158
  385. package/dist/sdk/history-repair.js +1 -1
  386. package/dist/sdk/improvement-ledger.d.ts +102 -102
  387. package/dist/sdk/index.d.ts +2 -0
  388. package/dist/sdk/index.js +1 -1
  389. package/dist/sdk/init-agent-guidance.d.ts +70 -70
  390. package/dist/sdk/init.d.ts +152 -152
  391. package/dist/sdk/item-children.d.ts +28 -28
  392. package/dist/sdk/item-schedule.d.ts +12 -12
  393. package/dist/sdk/item-transaction.d.ts +100 -100
  394. package/dist/sdk/learnings.d.ts +42 -42
  395. package/dist/sdk/lifecycle/append.d.ts +14 -14
  396. package/dist/sdk/lifecycle/claim.d.ts +60 -60
  397. package/dist/sdk/lifecycle/close-many.d.ts +94 -94
  398. package/dist/sdk/lifecycle/close.d.ts +27 -27
  399. package/dist/sdk/lifecycle/copy.d.ts +18 -18
  400. package/dist/sdk/lifecycle/core-field-recovery.d.ts +7 -0
  401. package/dist/sdk/lifecycle/core-field-recovery.js +2 -0
  402. package/dist/sdk/lifecycle/create.d.ts +82 -82
  403. package/dist/sdk/lifecycle/create.js +1 -1
  404. package/dist/sdk/lifecycle/delete.d.ts +28 -28
  405. package/dist/sdk/lifecycle/focus.d.ts +10 -10
  406. package/dist/sdk/lifecycle/hierarchy-mutation-lock.d.ts +10 -10
  407. package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -1
  408. package/dist/sdk/lifecycle/legacy-none-tokens.d.ts +54 -54
  409. package/dist/sdk/lifecycle/lifecycle-transitions.d.ts +4 -4
  410. package/dist/sdk/lifecycle/mcp-actions.d.ts +10 -10
  411. package/dist/sdk/lifecycle/mutation-command-options.d.ts +116 -116
  412. package/dist/sdk/lifecycle/mutation-facet-contracts.d.ts +6 -0
  413. package/dist/sdk/lifecycle/mutation-facet-contracts.js +2 -0
  414. package/dist/sdk/lifecycle/plan-mutation-receipt.d.ts +42 -42
  415. package/dist/sdk/lifecycle/plan.d.ts +217 -217
  416. package/dist/sdk/lifecycle/reopen.d.ts +29 -24
  417. package/dist/sdk/lifecycle/reopen.js +1 -1
  418. package/dist/sdk/lifecycle/repeatable-metadata-parsers.d.ts +3 -3
  419. package/dist/sdk/lifecycle/restore.d.ts +33 -33
  420. package/dist/sdk/lifecycle/shared-unset-fields.d.ts +19 -19
  421. package/dist/sdk/lifecycle/task-composition.d.ts +4 -4
  422. package/dist/sdk/lifecycle/update-many.d.ts +79 -79
  423. package/dist/sdk/lifecycle/update.d.ts +131 -132
  424. package/dist/sdk/lifecycle/update.js +2 -2
  425. package/dist/sdk/lifecycle-completion.d.ts +22 -22
  426. package/dist/sdk/lifecycle-policy.d.ts +52 -52
  427. package/dist/sdk/linked-artifacts.d.ts +69 -69
  428. package/dist/sdk/mcp/apps.d.ts +32 -32
  429. package/dist/sdk/mcp/authorization.d.ts +76 -76
  430. package/dist/sdk/mcp/discovery.d.ts +111 -111
  431. package/dist/sdk/mcp/interactions.d.ts +61 -61
  432. package/dist/sdk/mcp/protocol.d.ts +78 -78
  433. package/dist/sdk/mcp/skills.d.ts +88 -88
  434. package/dist/sdk/mcp/subscriptions.d.ts +39 -39
  435. package/dist/sdk/mcp/tasks.d.ts +75 -75
  436. package/dist/sdk/mcp/transport.d.ts +11 -11
  437. package/dist/sdk/merge/abandoned-receipts.d.ts +6 -6
  438. package/dist/sdk/merge/driver.d.ts +60 -60
  439. package/dist/sdk/merge/install.d.ts +64 -64
  440. package/dist/sdk/merge/receipt-file-boundary.d.ts +5 -5
  441. package/dist/sdk/merge/receipt-operation.d.ts +6 -6
  442. package/dist/sdk/merge/receipt-schema.d.ts +2 -2
  443. package/dist/sdk/merge/receipts.d.ts +156 -156
  444. package/dist/sdk/merge/reconcile.d.ts +36 -36
  445. package/dist/sdk/merge/reconcile.js +1 -1
  446. package/dist/sdk/merge/three-way.d.ts +77 -76
  447. package/dist/sdk/merge/three-way.js +1 -1
  448. package/dist/sdk/mutation-events.d.ts +84 -84
  449. package/dist/sdk/mutation-guard.d.ts +106 -106
  450. package/dist/sdk/notes.d.ts +52 -52
  451. package/dist/sdk/output/table-rows.d.ts +8 -8
  452. package/dist/sdk/output-contracts.d.ts +38 -38
  453. package/dist/sdk/output-projection.d.ts +142 -142
  454. package/dist/sdk/output-token-accounting.d.ts +27 -27
  455. package/dist/sdk/output.d.ts +28 -28
  456. package/dist/sdk/package-import-adapters.d.ts +54 -54
  457. package/dist/sdk/pagination.d.ts +29 -29
  458. package/dist/sdk/profile.d.ts +123 -123
  459. package/dist/sdk/provenance.d.ts +58 -58
  460. package/dist/sdk/public-surface.json +1 -1
  461. package/dist/sdk/query/activity.d.ts +118 -118
  462. package/dist/sdk/query/aggregate.d.ts +140 -140
  463. package/dist/sdk/query/calendar.d.ts +144 -144
  464. package/dist/sdk/query/complete-list.d.ts +53 -53
  465. package/dist/sdk/query/context.d.ts +395 -395
  466. package/dist/sdk/query/duplicate-candidates.d.ts +1 -1
  467. package/dist/sdk/query/get.d.ts +77 -77
  468. package/dist/sdk/query/history.d.ts +72 -72
  469. package/dist/sdk/query/item-filter-options.d.ts +79 -79
  470. package/dist/sdk/query/list-filter-shared.d.ts +1 -1
  471. package/dist/sdk/query/list.d.ts +188 -188
  472. package/dist/sdk/query/multi-value-filters.d.ts +4 -4
  473. package/dist/sdk/query/next-ready-budget.d.ts +14 -14
  474. package/dist/sdk/query/next.d.ts +137 -137
  475. package/dist/sdk/query/projection-contracts.d.ts +8 -8
  476. package/dist/sdk/query/search/corpus.d.ts +8 -8
  477. package/dist/sdk/query/search/filters.d.ts +5 -5
  478. package/dist/sdk/query/search/input.d.ts +4 -4
  479. package/dist/sdk/query/search/response.d.ts +8 -8
  480. package/dist/sdk/query/search/semantic.d.ts +106 -106
  481. package/dist/sdk/query/search/types.d.ts +85 -85
  482. package/dist/sdk/query/search-contracts.d.ts +65 -65
  483. package/dist/sdk/query/search-pagination.d.ts +19 -19
  484. package/dist/sdk/query/search-rendering.d.ts +25 -25
  485. package/dist/sdk/query/search.d.ts +46 -46
  486. package/dist/sdk/read-output/continuation.d.ts +8 -8
  487. package/dist/sdk/read-output/continuation.js +1 -1
  488. package/dist/sdk/read-output/extension.d.ts +7 -0
  489. package/dist/sdk/read-output/extension.js +2 -0
  490. package/dist/sdk/read-output/options.d.ts +6 -4
  491. package/dist/sdk/read-output/options.js +1 -1
  492. package/dist/sdk/read-output/provenance.d.ts +8 -8
  493. package/dist/sdk/read-output-budget.d.ts +10 -10
  494. package/dist/sdk/read-output-contracts.d.ts +192 -186
  495. package/dist/sdk/read-output-contracts.js +1 -1
  496. package/dist/sdk/read-output-rows.d.ts +6 -6
  497. package/dist/sdk/read-output-session.d.ts +50 -50
  498. package/dist/sdk/relationship-analytics.d.ts +78 -78
  499. package/dist/sdk/relationship-context.d.ts +81 -81
  500. package/dist/sdk/relationship-history.d.ts +109 -109
  501. package/dist/sdk/relationship-kinds/contract.d.ts +34 -34
  502. package/dist/sdk/relationship-migration.d.ts +26 -26
  503. package/dist/sdk/relationships.d.ts +78 -78
  504. package/dist/sdk/reproducibility/process.d.ts +3 -3
  505. package/dist/sdk/runtime/context.d.ts +11 -11
  506. package/dist/sdk/runtime-action-aliases.d.ts +2 -2
  507. package/dist/sdk/runtime-extended-actions.d.ts +8 -8
  508. package/dist/sdk/runtime-input.d.ts +3 -3
  509. package/dist/sdk/runtime-public-contracts.d.ts +78 -78
  510. package/dist/sdk/runtime.d.ts +305 -305
  511. package/dist/sdk/runtime.js +1 -1
  512. package/dist/sdk/scheduling-shortcuts.d.ts +32 -32
  513. package/dist/sdk/schema-migration.d.ts +86 -86
  514. package/dist/sdk/schema.d.ts +355 -355
  515. package/dist/sdk/similarity-scoring.d.ts +10 -10
  516. package/dist/sdk/similarity.d.ts +113 -113
  517. package/dist/sdk/stats.d.ts +108 -108
  518. package/dist/sdk/structured-mutations.d.ts +16 -16
  519. package/dist/sdk/structured-mutations.js +1 -1
  520. package/dist/sdk/telemetry.d.ts +53 -53
  521. package/dist/sdk/templates.d.ts +39 -39
  522. package/dist/sdk/test/batch.d.ts +85 -85
  523. package/dist/sdk/test/batch.js +1 -1
  524. package/dist/sdk/test/command-args.d.ts +4 -0
  525. package/dist/sdk/test/command-args.js +2 -0
  526. package/dist/sdk/test/entry.d.ts +3 -0
  527. package/dist/sdk/test/entry.js +1 -1
  528. package/dist/sdk/test/execution-receipts.d.ts +3 -3
  529. package/dist/sdk/test/execution.d.ts +279 -268
  530. package/dist/sdk/test/execution.js +2 -2
  531. package/dist/sdk/test/json-path.d.ts +2 -2
  532. package/dist/sdk/test/linked-command-detection.d.ts +10 -10
  533. package/dist/sdk/test/measurements.d.ts +11 -11
  534. package/dist/sdk/test/parsers.d.ts +1 -1
  535. package/dist/sdk/test/parsers.js +1 -1
  536. package/dist/sdk/test/prerequisites.d.ts +6 -0
  537. package/dist/sdk/test/prerequisites.js +2 -0
  538. package/dist/sdk/test/runs.d.ts +52 -52
  539. package/dist/sdk/test/trust.d.ts +12 -12
  540. package/dist/sdk/test/trust.js +1 -1
  541. package/dist/sdk/test/update.d.ts +55 -0
  542. package/dist/sdk/test/update.js +2 -0
  543. package/dist/sdk/testing.d.ts +319 -319
  544. package/dist/sdk/traceability/source-traceability.d.ts +65 -65
  545. package/dist/sdk/workspace-contracts.d.ts +37 -37
  546. package/dist/sdk/workspace-memory.d.ts +60 -60
  547. package/dist/sdk/workspace-recipe.d.ts +9 -9
  548. package/dist/sdk/workspace-snapshot.d.ts +97 -97
  549. package/dist/sdk/workspace-transaction-gc.d.ts +32 -32
  550. package/dist/sdk/workspace-transaction.d.ts +47 -47
  551. package/dist/sdk/workspace.d.ts +6 -6
  552. package/dist/types.d.ts +978 -974
  553. package/dist/types.js +1 -1
  554. package/docs/BUILD_AND_RELEASE_ACCEPTANCE.md +5 -2
  555. package/docs/DEFECT_RECURRENCE.md +12 -0
  556. package/docs/EXTENSIONS.md +2 -2
  557. package/docs/LINKED_TEST_EDITS.md +79 -0
  558. package/docs/MERGE_SAFETY.md +27 -1
  559. package/docs/RECURRENCE_RECOVERY_CONTRACTS.md +17 -4
  560. package/docs/RELATIONSHIP_GRAPH.md +26 -0
  561. package/docs/RELEASING.md +25 -8
  562. package/docs/SDK.md +204 -637
  563. package/docs/SDK_CONSUMER_RECEIPTS.md +67 -0
  564. package/docs/SDK_EVIDENCE_TRACEABILITY.md +4 -0
  565. package/docs/TESTING.md +13 -0
  566. package/docs/generated/FLAG_LEXICON_BUDGETS.md +2 -2
  567. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +11 -3
  568. package/docs/performance/runner-qualification.md +36 -0
  569. package/marketplace.json +1 -1
  570. package/node_modules/@opentelemetry/core/build/esm/version.d.ts +1 -1
  571. package/node_modules/@opentelemetry/core/build/esm/version.js +1 -1
  572. package/node_modules/@opentelemetry/core/build/esnext/version.d.ts +1 -1
  573. package/node_modules/@opentelemetry/core/build/esnext/version.js +1 -1
  574. package/node_modules/@opentelemetry/core/build/src/version.d.ts +1 -1
  575. package/node_modules/@opentelemetry/core/build/src/version.js +1 -1
  576. package/node_modules/@opentelemetry/core/package.json +2 -2
  577. package/node_modules/@opentelemetry/resources/build/esm/version.d.ts +1 -1
  578. package/node_modules/@opentelemetry/resources/build/esm/version.js +1 -1
  579. package/node_modules/@opentelemetry/resources/build/esnext/version.d.ts +1 -1
  580. package/node_modules/@opentelemetry/resources/build/esnext/version.js +1 -1
  581. package/node_modules/@opentelemetry/resources/build/src/version.d.ts +1 -1
  582. package/node_modules/@opentelemetry/resources/build/src/version.js +1 -1
  583. package/node_modules/@opentelemetry/resources/package.json +3 -3
  584. package/node_modules/@opentelemetry/sdk-trace/build/esm/StackContextManager.d.ts +57 -0
  585. package/node_modules/@opentelemetry/sdk-trace/build/esm/StackContextManager.js +105 -0
  586. package/node_modules/@opentelemetry/sdk-trace/build/esm/index.d.ts +1 -0
  587. package/node_modules/@opentelemetry/sdk-trace/build/esm/index.js +1 -0
  588. package/node_modules/@opentelemetry/sdk-trace/build/esm/version.d.ts +1 -1
  589. package/node_modules/@opentelemetry/sdk-trace/build/esm/version.js +1 -1
  590. package/node_modules/@opentelemetry/sdk-trace/build/esnext/StackContextManager.d.ts +57 -0
  591. package/node_modules/@opentelemetry/sdk-trace/build/esnext/StackContextManager.js +105 -0
  592. package/node_modules/@opentelemetry/sdk-trace/build/esnext/index.d.ts +1 -0
  593. package/node_modules/@opentelemetry/sdk-trace/build/esnext/index.js +1 -0
  594. package/node_modules/@opentelemetry/sdk-trace/build/esnext/version.d.ts +1 -1
  595. package/node_modules/@opentelemetry/sdk-trace/build/esnext/version.js +1 -1
  596. package/node_modules/@opentelemetry/sdk-trace/build/src/StackContextManager.d.ts +57 -0
  597. package/node_modules/@opentelemetry/sdk-trace/build/src/StackContextManager.js +109 -0
  598. package/node_modules/@opentelemetry/sdk-trace/build/src/index.d.ts +1 -0
  599. package/node_modules/@opentelemetry/sdk-trace/build/src/index.js +3 -1
  600. package/node_modules/@opentelemetry/sdk-trace/build/src/version.d.ts +1 -1
  601. package/node_modules/@opentelemetry/sdk-trace/build/src/version.js +1 -1
  602. package/node_modules/@opentelemetry/sdk-trace/package.json +5 -5
  603. package/node_modules/@opentelemetry/sdk-trace-base/build/esm/version.d.ts +1 -1
  604. package/node_modules/@opentelemetry/sdk-trace-base/build/esm/version.js +1 -1
  605. package/node_modules/@opentelemetry/sdk-trace-base/build/esnext/version.d.ts +1 -1
  606. package/node_modules/@opentelemetry/sdk-trace-base/build/esnext/version.js +1 -1
  607. package/node_modules/@opentelemetry/sdk-trace-base/build/src/version.d.ts +1 -1
  608. package/node_modules/@opentelemetry/sdk-trace-base/build/src/version.js +1 -1
  609. package/node_modules/@opentelemetry/sdk-trace-base/package.json +7 -7
  610. package/node_modules/@sentry/core/build/cjs/browser.js +3 -0
  611. package/node_modules/@sentry/core/build/cjs/fetch.js +10 -9
  612. package/node_modules/@sentry/core/build/cjs/index.js +3 -0
  613. package/node_modules/@sentry/core/build/cjs/integrations/http/add-outgoing-request-breadcrumb.js +2 -1
  614. package/node_modules/@sentry/core/build/cjs/integrations/http/get-outgoing-span-data.js +3 -2
  615. package/node_modules/@sentry/core/build/cjs/integrations/http/server-subscription.js +7 -3
  616. package/node_modules/@sentry/core/build/cjs/integrations/requestdata.js +23 -9
  617. package/node_modules/@sentry/core/build/cjs/server.js +3 -0
  618. package/node_modules/@sentry/core/build/cjs/utils/data-collection/filterCollectedUrl.js +24 -0
  619. package/node_modules/@sentry/core/build/cjs/utils/data-collection/filterKeyValueData.js +17 -23
  620. package/node_modules/@sentry/core/build/cjs/utils/data-collection/filterQueryParams.js +8 -15
  621. package/node_modules/@sentry/core/build/cjs/utils/data-collection/filterUrlQuery.js +20 -0
  622. package/node_modules/@sentry/core/build/cjs/utils/url.js +4 -3
  623. package/node_modules/@sentry/core/build/cjs/utils/version.js +1 -1
  624. package/node_modules/@sentry/core/build/esm/browser.js +1 -0
  625. package/node_modules/@sentry/core/build/esm/fetch.js +10 -9
  626. package/node_modules/@sentry/core/build/esm/index.js +1 -0
  627. package/node_modules/@sentry/core/build/esm/integrations/http/add-outgoing-request-breadcrumb.js +2 -1
  628. package/node_modules/@sentry/core/build/esm/integrations/http/get-outgoing-span-data.js +3 -2
  629. package/node_modules/@sentry/core/build/esm/integrations/http/server-subscription.js +7 -3
  630. package/node_modules/@sentry/core/build/esm/integrations/requestdata.js +23 -9
  631. package/node_modules/@sentry/core/build/esm/package.json +1 -1
  632. package/node_modules/@sentry/core/build/esm/server.js +1 -0
  633. package/node_modules/@sentry/core/build/esm/utils/data-collection/filterCollectedUrl.js +21 -0
  634. package/node_modules/@sentry/core/build/esm/utils/data-collection/filterKeyValueData.js +18 -25
  635. package/node_modules/@sentry/core/build/esm/utils/data-collection/filterQueryParams.js +9 -16
  636. package/node_modules/@sentry/core/build/esm/utils/data-collection/filterUrlQuery.js +18 -0
  637. package/node_modules/@sentry/core/build/esm/utils/url.js +4 -3
  638. package/node_modules/@sentry/core/build/esm/utils/version.js +1 -1
  639. package/node_modules/@sentry/core/build/types/shared-exports.d.ts +1 -0
  640. package/node_modules/@sentry/core/build/types/utils/data-collection/filterCollectedUrl.d.ts +21 -0
  641. package/node_modules/@sentry/core/build/types/utils/data-collection/filterKeyValueData.d.ts +1 -0
  642. package/node_modules/@sentry/core/build/types/utils/data-collection/filterQueryParams.d.ts +2 -3
  643. package/node_modules/@sentry/core/build/types/utils/data-collection/filterUrlQuery.d.ts +13 -0
  644. package/node_modules/@sentry/core/build/types/utils/url.d.ts +4 -1
  645. package/node_modules/@sentry/core/build/types-ts3.8/shared-exports.d.ts +1 -0
  646. package/node_modules/@sentry/core/build/types-ts3.8/utils/data-collection/filterCollectedUrl.d.ts +21 -0
  647. package/node_modules/@sentry/core/build/types-ts3.8/utils/data-collection/filterKeyValueData.d.ts +1 -0
  648. package/node_modules/@sentry/core/build/types-ts3.8/utils/data-collection/filterQueryParams.d.ts +2 -3
  649. package/node_modules/@sentry/core/build/types-ts3.8/utils/data-collection/filterUrlQuery.d.ts +13 -0
  650. package/node_modules/@sentry/core/build/types-ts3.8/utils/url.d.ts +4 -1
  651. package/node_modules/@sentry/core/package.json +3 -2
  652. package/node_modules/@sentry/node/build/cjs/integrations/tracing/vercelai/instrumentation.js +3 -0
  653. package/node_modules/@sentry/node/build/esm/integrations/tracing/vercelai/instrumentation.js +3 -0
  654. package/node_modules/@sentry/node/build/esm/package.json +1 -1
  655. package/node_modules/@sentry/node/package.json +7 -6
  656. package/node_modules/@sentry/node-core/build/cjs/integrations/anr/index.js +1 -1
  657. package/node_modules/@sentry/node-core/build/cjs/integrations/http/httpServerSpansIntegration.js +6 -3
  658. package/node_modules/@sentry/node-core/build/cjs/integrations/local-variables/local-variables-async.js +1 -1
  659. package/node_modules/@sentry/node-core/build/cjs/integrations/node-fetch/undici-instrumentation.js +2 -2
  660. package/node_modules/@sentry/node-core/build/cjs/light/client.js +7 -0
  661. package/node_modules/@sentry/node-core/build/cjs/sdk/client.js +7 -0
  662. package/node_modules/@sentry/node-core/build/cjs/utils/outgoingFetchRequest.js +1 -1
  663. package/node_modules/@sentry/node-core/build/esm/integrations/anr/index.js +1 -1
  664. package/node_modules/@sentry/node-core/build/esm/integrations/anr/worker-script.js +2 -2
  665. package/node_modules/@sentry/node-core/build/esm/integrations/http/httpServerSpansIntegration.js +7 -4
  666. package/node_modules/@sentry/node-core/build/esm/integrations/local-variables/local-variables-async.js +1 -1
  667. package/node_modules/@sentry/node-core/build/esm/integrations/local-variables/worker-script.js +1 -1
  668. package/node_modules/@sentry/node-core/build/esm/integrations/node-fetch/undici-instrumentation.js +3 -3
  669. package/node_modules/@sentry/node-core/build/esm/light/client.js +8 -1
  670. package/node_modules/@sentry/node-core/build/esm/package.json +1 -1
  671. package/node_modules/@sentry/node-core/build/esm/sdk/client.js +8 -1
  672. package/node_modules/@sentry/node-core/build/esm/utils/outgoingFetchRequest.js +2 -2
  673. package/node_modules/@sentry/node-core/build/types/light/client.d.ts +1 -0
  674. package/node_modules/@sentry/node-core/build/types/sdk/client.d.ts +1 -0
  675. package/node_modules/@sentry/node-core/build/types-ts3.8/light/client.d.ts +1 -0
  676. package/node_modules/@sentry/node-core/build/types-ts3.8/sdk/client.d.ts +1 -0
  677. package/node_modules/@sentry/node-core/package.json +5 -4
  678. package/node_modules/@sentry/opentelemetry/build/cjs/{asyncContextStrategy-BJ5buq_A.js → asyncContextStrategy-BR-l9zjD.js} +8 -6
  679. package/node_modules/@sentry/opentelemetry/build/cjs/index.browser.js +1 -1
  680. package/node_modules/@sentry/opentelemetry/build/cjs/index.js +1 -1
  681. package/node_modules/@sentry/opentelemetry/build/esm/{asyncContextStrategy-Bx5F5tCX.js → asyncContextStrategy-BQfM_LMv.js} +9 -7
  682. package/node_modules/@sentry/opentelemetry/build/esm/index.browser.js +1 -1
  683. package/node_modules/@sentry/opentelemetry/build/esm/index.js +2 -2
  684. package/node_modules/@sentry/opentelemetry/build/esm/package.json +1 -1
  685. package/node_modules/@sentry/opentelemetry/package.json +4 -3
  686. package/node_modules/@sentry/server-utils/build/cjs/tracing-channel.js +1 -0
  687. package/node_modules/@sentry/server-utils/build/esm/package.json +1 -1
  688. package/node_modules/@sentry/server-utils/build/esm/tracing-channel.js +1 -0
  689. package/node_modules/@sentry/server-utils/build/types/tracing-channel.d.ts +3 -1
  690. package/node_modules/@sentry/server-utils/build/types-ts3.8/tracing-channel.d.ts +3 -1
  691. package/node_modules/@sentry/server-utils/package.json +4 -3
  692. package/node_modules/cjs-module-lexer/README.md +8 -3
  693. package/node_modules/cjs-module-lexer/dist/lexer.js +1 -1
  694. package/node_modules/cjs-module-lexer/dist/lexer.mjs +2 -2
  695. package/node_modules/cjs-module-lexer/lexer.js +48 -9
  696. package/node_modules/cjs-module-lexer/package.json +3 -2
  697. package/node_modules/es-module-lexer/dist/lexer.asm.js +2 -2
  698. package/node_modules/es-module-lexer/dist/lexer.cjs +1 -1
  699. package/node_modules/es-module-lexer/dist/lexer.js +2 -2
  700. package/node_modules/es-module-lexer/dist/lexer.minimal.asm.js +2 -2
  701. package/node_modules/es-module-lexer/dist/lexer.minimal.cjs +1 -1
  702. package/node_modules/es-module-lexer/dist/lexer.minimal.js +2 -2
  703. package/node_modules/es-module-lexer/package.json +1 -1
  704. package/node_modules/import-in-the-middle/CHANGELOG.md +7 -0
  705. package/node_modules/import-in-the-middle/lib/get-esm-exports.mjs +7 -0
  706. package/node_modules/import-in-the-middle/package.json +1 -1
  707. package/package.json +2 -2
  708. package/packages/pm-beads/extensions/beads/runtime.ts +2 -2
  709. package/packages/pm-beads/package.json +1 -1
  710. package/packages/pm-calendar/package.json +1 -1
  711. package/packages/pm-command-kit/package.json +1 -1
  712. package/packages/pm-digital-twin/package.json +1 -1
  713. package/packages/pm-governance-audit/package.json +1 -1
  714. package/packages/pm-guide-shell/package.json +1 -1
  715. package/packages/pm-kanban/package.json +1 -1
  716. package/packages/pm-lifecycle-hooks/package.json +1 -1
  717. package/packages/pm-linked-test-adapters/package.json +1 -1
  718. package/packages/pm-search-advanced/package.json +1 -1
  719. package/packages/pm-templates/package.json +1 -1
  720. package/packages/pm-todos/package.json +1 -1
  721. package/packages/pm-vcs/package.json +1 -1
  722. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  723. package/plugins/pm-claude/package.json +1 -1
  724. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  725. package/plugins/pm-codex/package.json +1 -1
  726. package/plugins/pm-codex/plugin.json +1 -1
  727. package/runtime-dependencies.json +1 -1
  728. package/scripts/finalize-build.mjs +37 -0
  729. package/dist/cli-bundle/chunks/chunk-BXSXT5Z6.js +0 -2
  730. package/dist/cli-bundle/chunks/chunk-KNW3RSLS.js +0 -30
  731. package/dist/cli-bundle/chunks/chunk-MEWBSWE3.js +0 -2
  732. package/dist/cli-bundle/chunks/chunk-RBPOO46D.js +0 -20
  733. package/dist/cli-bundle/chunks/chunk-YMLF6QT7.js +0 -234
  734. package/dist/cli-bundle/chunks/register-operations-PDOBQZUJ.js +0 -2
  735. package/dist/cli-bundle/focused-chunks/chunk-2CJWTLQG.js +0 -2
  736. package/dist/cli-bundle/focused-chunks/chunk-B3YW6H2I.js +0 -26
  737. package/dist/cli-bundle/focused-chunks/chunk-GVGFUD52.js +0 -8
  738. package/dist/cli-bundle/focused-chunks/chunk-MJQ253F3.js +0 -2
  739. package/dist/cli-bundle/focused-chunks/chunk-PBCYGO7X.js +0 -3
  740. package/dist/cli-bundle/focused-chunks/chunk-WOEZJUA2.js +0 -2
@@ -1,23 +1,16 @@
1
1
  import { FILTERED_VALUE } from './filtering-snippets.js';
2
- import { filterKeyValueData } from './filterKeyValueData.js';
2
+ import { shouldFilterDataKey } from './filterKeyValueData.js';
3
3
 
4
4
  function filterQueryParams(queryString, behavior) {
5
- if (behavior === false) {
6
- return {};
7
- }
8
- try {
9
- const params = new URLSearchParams(queryString);
10
- const parsed = {};
11
- params.forEach((value, key) => {
12
- parsed[key] = value;
13
- });
14
- if (Object.keys(parsed).length === 0) {
15
- return {};
16
- }
17
- return filterKeyValueData(parsed, behavior);
18
- } catch {
19
- return FILTERED_VALUE;
5
+ if (!queryString || behavior === false) {
6
+ return void 0;
20
7
  }
8
+ return queryString.split("&").map((pair) => {
9
+ const separatorIndex = pair.indexOf("=");
10
+ const encodedKey = separatorIndex === -1 ? pair : pair.slice(0, separatorIndex);
11
+ const key = new URLSearchParams(`${encodedKey}=`).keys().next().value;
12
+ return key !== void 0 && shouldFilterDataKey(key, behavior) ? `${encodedKey}=${FILTERED_VALUE}` : pair;
13
+ }).join("&");
21
14
  }
22
15
 
23
16
  export { filterQueryParams };
@@ -0,0 +1,18 @@
1
+ import { filterQueryParams } from './filterQueryParams.js';
2
+
3
+ function filterUrlQuery(url, behavior) {
4
+ const fragmentStart = url.indexOf("#");
5
+ const queryEnd = fragmentStart === -1 ? url.length : fragmentStart;
6
+ const queryStart = url.indexOf("?");
7
+ if (queryStart === -1 || queryStart > queryEnd) {
8
+ return url;
9
+ }
10
+ const prefix = url.slice(0, queryStart);
11
+ const query = url.slice(queryStart + 1, queryEnd);
12
+ const suffix = url.slice(queryEnd);
13
+ const filtered = filterQueryParams(query, behavior);
14
+ return filtered ? `${prefix}?${filtered}${suffix}` : `${prefix}${suffix}`;
15
+ }
16
+
17
+ export { filterUrlQuery };
18
+ //# sourceMappingURL=filterUrlQuery.js.map
@@ -1,5 +1,6 @@
1
1
  import { URL_FULL } from '@sentry/conventions/attributes';
2
2
  import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../semanticAttributes.js';
3
+ import { filterCollectedUrlQuery, filterCollectedUrl } from './data-collection/filterCollectedUrl.js';
3
4
 
4
5
  const DEFAULT_BASE_URL = "thismessage:/";
5
6
  function isURLObjectRelative(url) {
@@ -49,7 +50,7 @@ function getHttpSpanNameFromUrlObject(urlObject, kind, request, routeName) {
49
50
  const route = routeName ? routeName : urlObject ? kind === "client" ? getSanitizedUrlStringFromUrlObject(urlObject) : urlObject.pathname : "/";
50
51
  return `${method} ${route}`;
51
52
  }
52
- function getHttpSpanDetailsFromUrlObject(urlObject, kind, spanOrigin, request, routeName) {
53
+ function getHttpSpanDetailsFromUrlObject(urlObject, kind, spanOrigin, request, routeName, client) {
53
54
  const attributes = {
54
55
  [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: spanOrigin,
55
56
  [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "url"
@@ -63,7 +64,7 @@ function getHttpSpanDetailsFromUrlObject(urlObject, kind, spanOrigin, request, r
63
64
  }
64
65
  if (urlObject) {
65
66
  if (urlObject.search) {
66
- attributes["url.query"] = urlObject.search;
67
+ attributes["url.query"] = filterCollectedUrlQuery(urlObject.search, client);
67
68
  }
68
69
  if (urlObject.hash) {
69
70
  attributes["url.fragment"] = urlObject.hash;
@@ -75,7 +76,7 @@ function getHttpSpanDetailsFromUrlObject(urlObject, kind, spanOrigin, request, r
75
76
  }
76
77
  }
77
78
  if (!isURLObjectRelative(urlObject)) {
78
- attributes[URL_FULL] = urlObject.href;
79
+ attributes[URL_FULL] = filterCollectedUrl(urlObject.href, client);
79
80
  if (urlObject.port) {
80
81
  attributes["url.port"] = urlObject.port;
81
82
  }
@@ -1,4 +1,4 @@
1
- const SDK_VERSION = "10.75.1" ;
1
+ const SDK_VERSION = "10.76.0" ;
2
2
 
3
3
  export { SDK_VERSION };
4
4
  //# sourceMappingURL=version.js.map
@@ -31,6 +31,7 @@ export { _INTERNAL_skipAiProviderWrapping, _INTERNAL_shouldSkipAiProviderWrappin
31
31
  export { filterKeyValueData as _INTERNAL_filterKeyValueData } from './utils/data-collection/filterKeyValueData';
32
32
  export { filterCookies as _INTERNAL_filterCookies } from './utils/data-collection/filterCookies';
33
33
  export { filterQueryParams as _INTERNAL_filterQueryParams } from './utils/data-collection/filterQueryParams';
34
+ export { filterCollectedUrl, filterCollectedUrlQuery } from './utils/data-collection/filterCollectedUrl';
34
35
  export { envToBool } from './utils/envToBool';
35
36
  export { applyScopeDataToEvent, mergeScopeData, getCombinedScopeData } from './utils/scopeData';
36
37
  export { prepareEvent } from './utils/prepareEvent';
@@ -0,0 +1,21 @@
1
+ import type { Client } from '../../client';
2
+ /**
3
+ * Applies `dataCollection.urlQueryParams` to a URL the SDK collected itself, for use as `url.full`.
4
+ *
5
+ * Call this at every site where instrumentation records a URL. Routing the SDK's own URLs through a
6
+ * helper is what makes the filtering provenance-correct: a URL a user attaches themselves never passes
7
+ * through here, and `dataCollection` is only meant to gate automatically collected data.
8
+ *
9
+ * Pass the `client` the URL belongs to whenever one is at hand — falling back to `getClient()` resolves
10
+ * against the current scope, which is the wrong client in a multi-client setup.
11
+ */
12
+ export declare function filterCollectedUrl(url: string, client?: Client): string;
13
+ export declare function filterCollectedUrl(url: string | undefined, client?: Client): string | undefined;
14
+ /**
15
+ * Applies `dataCollection.urlQueryParams` to a query string the SDK collected itself, for use as
16
+ * `url.query`. Returns `undefined` when the query must not be collected at all.
17
+ *
18
+ * See {@link filterCollectedUrl} for why this is a helper and why passing `client` is preferred.
19
+ */
20
+ export declare function filterCollectedUrlQuery(query: string | undefined, client?: Client): string | undefined;
21
+ //# sourceMappingURL=filterCollectedUrl.d.ts.map
@@ -1,4 +1,5 @@
1
1
  import type { CollectBehavior } from '../../types/datacollection';
2
+ export declare function shouldFilterDataKey(key: string, behavior: CollectBehavior, additionalDenyTerms?: string[]): boolean;
2
3
  /**
3
4
  * Filters a key-value record according to a `CollectBehavior`.
4
5
  *
@@ -2,8 +2,7 @@ import type { CollectBehavior } from '../../types/datacollection';
2
2
  /**
3
3
  * Filters a query parameter string according to a `CollectBehavior`.
4
4
  *
5
- * When individual params can be parsed, each key-value pair is filtered
6
- * independently. When parsing fails, the entire string is replaced with `[Filtered]`.
5
+ * Parameter names are decoded for filtering, while the original encoding, order, and duplicate keys are preserved.
7
6
  */
8
- export declare function filterQueryParams(queryString: string, behavior: CollectBehavior): Record<string, string> | string;
7
+ export declare function filterQueryParams(queryString: string, behavior: CollectBehavior): string | undefined;
9
8
  //# sourceMappingURL=filterQueryParams.d.ts.map
@@ -0,0 +1,13 @@
1
+ import type { CollectBehavior } from '../../types/datacollection';
2
+ /**
3
+ * Applies a `CollectBehavior` to the query string of a full URL, leaving every other URL component
4
+ * (scheme, host, path, fragment) untouched.
5
+ *
6
+ * The query is located by string offsets rather than by parsing, so the URL is returned byte-for-byte
7
+ * apart from the query itself. This keeps relative URLs, non-HTTP schemes and unusual encodings intact,
8
+ * none of which survive a `URL` round-trip.
9
+ *
10
+ * Returns the URL with its query filtered, or with the query removed entirely when collection is off.
11
+ */
12
+ export declare function filterUrlQuery(url: string, behavior: CollectBehavior): string;
13
+ //# sourceMappingURL=filterUrlQuery.d.ts.map
@@ -1,3 +1,4 @@
1
+ import type { Client } from '../client';
1
2
  import type { SpanAttributes } from '../types/span';
2
3
  type PartialURL = {
3
4
  host?: string;
@@ -48,9 +49,11 @@ type PartialRequest = {
48
49
  * @param spanOrigin - The origin of the span
49
50
  * @param request - The request object, see {@link PartialRequest}
50
51
  * @param routeName - The name of the route, must be low cardinality
52
+ * @param client - The client the span belongs to, used to resolve `dataCollection.urlQueryParams`.
53
+ * Falls back to the current scope's client when omitted, which is the wrong one in a multi-client setup.
51
54
  * @returns The span name and attributes for the HTTP operation
52
55
  */
53
- export declare function getHttpSpanDetailsFromUrlObject(urlObject: URLObject | undefined, kind: 'server' | 'client', spanOrigin: string, request?: PartialRequest, routeName?: string): [name: string, attributes: SpanAttributes];
56
+ export declare function getHttpSpanDetailsFromUrlObject(urlObject: URLObject | undefined, kind: 'server' | 'client', spanOrigin: string, request?: PartialRequest, routeName?: string, client?: Client): [name: string, attributes: SpanAttributes];
54
57
  /**
55
58
  * Parses string form of URL into an object
56
59
  * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B
@@ -28,6 +28,7 @@ export { _INTERNAL_skipAiProviderWrapping, _INTERNAL_shouldSkipAiProviderWrappin
28
28
  export { filterKeyValueData as _INTERNAL_filterKeyValueData } from './utils/data-collection/filterKeyValueData';
29
29
  export { filterCookies as _INTERNAL_filterCookies } from './utils/data-collection/filterCookies';
30
30
  export { filterQueryParams as _INTERNAL_filterQueryParams } from './utils/data-collection/filterQueryParams';
31
+ export { filterCollectedUrl, filterCollectedUrlQuery } from './utils/data-collection/filterCollectedUrl';
31
32
  export { envToBool } from './utils/envToBool';
32
33
  export { applyScopeDataToEvent, mergeScopeData, getCombinedScopeData } from './utils/scopeData';
33
34
  export { prepareEvent } from './utils/prepareEvent';
@@ -0,0 +1,21 @@
1
+ import { Client } from '../../client';
2
+ /**
3
+ * Applies `dataCollection.urlQueryParams` to a URL the SDK collected itself, for use as `url.full`.
4
+ *
5
+ * Call this at every site where instrumentation records a URL. Routing the SDK's own URLs through a
6
+ * helper is what makes the filtering provenance-correct: a URL a user attaches themselves never passes
7
+ * through here, and `dataCollection` is only meant to gate automatically collected data.
8
+ *
9
+ * Pass the `client` the URL belongs to whenever one is at hand — falling back to `getClient()` resolves
10
+ * against the current scope, which is the wrong client in a multi-client setup.
11
+ */
12
+ export declare function filterCollectedUrl(url: string, client?: Client): string;
13
+ export declare function filterCollectedUrl(url: string | undefined, client?: Client): string | undefined;
14
+ /**
15
+ * Applies `dataCollection.urlQueryParams` to a query string the SDK collected itself, for use as
16
+ * `url.query`. Returns `undefined` when the query must not be collected at all.
17
+ *
18
+ * See {@link filterCollectedUrl} for why this is a helper and why passing `client` is preferred.
19
+ */
20
+ export declare function filterCollectedUrlQuery(query: string | undefined, client?: Client): string | undefined;
21
+ //# sourceMappingURL=filterCollectedUrl.d.ts.map
@@ -1,4 +1,5 @@
1
1
  import { CollectBehavior } from '../../types/datacollection';
2
+ export declare function shouldFilterDataKey(key: string, behavior: CollectBehavior, additionalDenyTerms?: string[]): boolean;
2
3
  /**
3
4
  * Filters a key-value record according to a `CollectBehavior`.
4
5
  *
@@ -2,8 +2,7 @@ import { CollectBehavior } from '../../types/datacollection';
2
2
  /**
3
3
  * Filters a query parameter string according to a `CollectBehavior`.
4
4
  *
5
- * When individual params can be parsed, each key-value pair is filtered
6
- * independently. When parsing fails, the entire string is replaced with `[Filtered]`.
5
+ * Parameter names are decoded for filtering, while the original encoding, order, and duplicate keys are preserved.
7
6
  */
8
- export declare function filterQueryParams(queryString: string, behavior: CollectBehavior): Record<string, string> | string;
7
+ export declare function filterQueryParams(queryString: string, behavior: CollectBehavior): string | undefined;
9
8
  //# sourceMappingURL=filterQueryParams.d.ts.map
@@ -0,0 +1,13 @@
1
+ import { CollectBehavior } from '../../types/datacollection';
2
+ /**
3
+ * Applies a `CollectBehavior` to the query string of a full URL, leaving every other URL component
4
+ * (scheme, host, path, fragment) untouched.
5
+ *
6
+ * The query is located by string offsets rather than by parsing, so the URL is returned byte-for-byte
7
+ * apart from the query itself. This keeps relative URLs, non-HTTP schemes and unusual encodings intact,
8
+ * none of which survive a `URL` round-trip.
9
+ *
10
+ * Returns the URL with its query filtered, or with the query removed entirely when collection is off.
11
+ */
12
+ export declare function filterUrlQuery(url: string, behavior: CollectBehavior): string;
13
+ //# sourceMappingURL=filterUrlQuery.d.ts.map
@@ -1,3 +1,4 @@
1
+ import { Client } from '../client';
1
2
  import { SpanAttributes } from '../types/span';
2
3
  type PartialURL = {
3
4
  host?: string;
@@ -48,9 +49,11 @@ type PartialRequest = {
48
49
  * @param spanOrigin - The origin of the span
49
50
  * @param request - The request object, see {@link PartialRequest}
50
51
  * @param routeName - The name of the route, must be low cardinality
52
+ * @param client - The client the span belongs to, used to resolve `dataCollection.urlQueryParams`.
53
+ * Falls back to the current scope's client when omitted, which is the wrong one in a multi-client setup.
51
54
  * @returns The span name and attributes for the HTTP operation
52
55
  */
53
- export declare function getHttpSpanDetailsFromUrlObject(urlObject: URLObject | undefined, kind: 'server' | 'client', spanOrigin: string, request?: PartialRequest, routeName?: string): [
56
+ export declare function getHttpSpanDetailsFromUrlObject(urlObject: URLObject | undefined, kind: 'server' | 'client', spanOrigin: string, request?: PartialRequest, routeName?: string, client?: Client): [
54
57
  /*name*/ string,
55
58
  /*attributes*/ SpanAttributes
56
59
  ];
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/core",
3
- "version": "10.75.1",
3
+ "version": "10.76.0",
4
4
  "description": "Base implementation for all Sentry JavaScript SDKs",
5
5
  "repository": "git://github.com/getsentry/sentry-javascript.git",
6
6
  "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/core",
@@ -78,7 +78,8 @@
78
78
  }
79
79
  },
80
80
  "publishConfig": {
81
- "access": "public"
81
+ "access": "public",
82
+ "tag": "v10"
82
83
  },
83
84
  "scripts": {
84
85
  "build": "run-p build:transpile build:types",
@@ -25,6 +25,9 @@ function processToolCallResults(result) {
25
25
  if (typeof result !== "object" || result === null || !("content" in result)) {
26
26
  return;
27
27
  }
28
+ if (typeof result.consumeStream === "function") {
29
+ return;
30
+ }
28
31
  const resultObj = result;
29
32
  if (!Array.isArray(resultObj.content)) {
30
33
  return;
@@ -23,6 +23,9 @@ function processToolCallResults(result) {
23
23
  if (typeof result !== "object" || result === null || !("content" in result)) {
24
24
  return;
25
25
  }
26
+ if (typeof result.consumeStream === "function") {
27
+ return;
28
+ }
26
29
  const resultObj = result;
27
30
  if (!Array.isArray(resultObj.content)) {
28
31
  return;
@@ -1 +1 @@
1
- {"type":"module","version":"10.75.1","sideEffects":false}
1
+ {"type":"module","version":"10.76.0","sideEffects":false}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/node",
3
- "version": "10.75.1",
3
+ "version": "10.76.0",
4
4
  "description": "Sentry Node SDK using OpenTelemetry for performance instrumentation",
5
5
  "repository": "git://github.com/getsentry/sentry-javascript.git",
6
6
  "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/node",
@@ -62,17 +62,18 @@
62
62
  }
63
63
  },
64
64
  "publishConfig": {
65
- "access": "public"
65
+ "access": "public",
66
+ "tag": "v10"
66
67
  },
67
68
  "dependencies": {
68
69
  "@opentelemetry/api": "^1.9.1",
69
70
  "@opentelemetry/instrumentation": "^0.220.0",
70
71
  "@opentelemetry/sdk-trace-base": "^2.9.0",
71
72
  "@sentry/conventions": "^0.16.0",
72
- "@sentry/core": "10.75.1",
73
- "@sentry/node-core": "10.75.1",
74
- "@sentry/opentelemetry": "10.75.1",
75
- "@sentry/server-utils": "10.75.1",
73
+ "@sentry/core": "10.76.0",
74
+ "@sentry/node-core": "10.76.0",
75
+ "@sentry/opentelemetry": "10.76.0",
76
+ "@sentry/server-utils": "10.76.0",
76
77
  "import-in-the-middle": "^3.0.0"
77
78
  },
78
79
  "devDependencies": {
@@ -7,7 +7,7 @@ const nodeVersion = require('../../nodeVersion.js');
7
7
  const debug = require('../../utils/debug.js');
8
8
 
9
9
  const { isPromise } = util.types;
10
- const base64WorkerScript = "LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjc1LjEgKDgwMjVhOTIpIHwgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdCAqLwppbXBvcnR7U2Vzc2lvbiBhcyB0fWZyb20ibm9kZTppbnNwZWN0b3IiO2ltcG9ydHt3b3JrZXJEYXRhIGFzIG4scGFyZW50UG9ydCBhcyBlfWZyb20ibm9kZTp3b3JrZXJfdGhyZWFkcyI7aW1wb3J0e3Bvc2l4IGFzIHIsc2VwIGFzIG99ZnJvbSJub2RlOnBhdGgiO2ltcG9ydCphcyBpIGZyb20ibm9kZTpodHRwIjtpbXBvcnQqYXMgcyBmcm9tIm5vZGU6aHR0cHMiO2ltcG9ydHtSZWFkYWJsZSBhcyBjfWZyb20ibm9kZTpzdHJlYW0iO2ltcG9ydHtjcmVhdGVHemlwIGFzIHV9ZnJvbSJub2RlOnpsaWIiO2ltcG9ydCphcyBhIGZyb20ibm9kZTpuZXQiO2ltcG9ydCphcyBmIGZyb20ibm9kZTp0bHMiO2NvbnN0IGg9InVuZGVmaW5lZCI9PXR5cGVvZiBfX1NFTlRSWV9ERUJVR19ffHxfX1NFTlRSWV9ERUJVR19fLHA9Z2xvYmFsVGhpcyxkPSIxMC43NS4xIjtmdW5jdGlvbiBsKCl7cmV0dXJuIGcocCkscH1mdW5jdGlvbiBnKHQpe2NvbnN0IG49dC5fX1NFTlRSWV9fPXQuX19TRU5UUllfX3x8e307cmV0dXJuIG4udmVyc2lvbj1uLnZlcnNpb258fGQsbltkXT1uW2RdfHx7fX1mdW5jdGlvbiBtKHQsbixlPXApe2NvbnN0IHI9ZS5fX1NFTlRSWV9fPWUuX19TRU5UUllfX3x8e30sbz1yW2RdPXJbZF18fHt9O3JldHVybiBvW3RdfHwob1t0XT1uKCkpfWNvbnN0IHk9e307ZnVuY3Rpb24gYih0KXtpZighKCJjb25zb2xlImluIHApKXJldHVybiB0KCk7Y29uc3Qgbj1wLmNvbnNvbGUsZT17fSxyPU9iamVjdC5rZXlzKHkpO3IuZm9yRWFjaCh0PT57Y29uc3Qgcj15W3RdO2VbdF09blt0XSxuW3RdPXJ9KTt0cnl7cmV0dXJuIHQoKX1maW5hbGx5e3IuZm9yRWFjaCh0PT57blt0XT1lW3RdfSl9fWZ1bmN0aW9uIHYoKXtyZXR1cm4gUygpLmVuYWJsZWR9ZnVuY3Rpb24gXyh0LC4uLm4pe2gmJnYoKSYmYigoKT0+e3AuY29uc29sZVt0XShgU2VudHJ5IExvZ2dlciBbJHt0fV06YCwuLi5uKX0pfWZ1bmN0aW9uIFMoKXtyZXR1cm4gaD9tKCJsb2dnZXJTZXR0aW5ncyIsKCk9Pih7ZW5hYmxlZDohMX0pKTp7ZW5hYmxlZDohMX19Y29uc3Qgdz17ZW5hYmxlOmZ1bmN0aW9uKCl7UygpLmVuYWJsZWQ9ITB9LGRpc2FibGU6ZnVuY3Rpb24oKXtTKCkuZW5hYmxlZD0hMX0saXNFbmFibGVkOnYsbG9nOmZ1bmN0aW9uKC4uLnQpe18oImxvZyIsLi4udCl9LHdhcm46ZnVuY3Rpb24oLi4udCl7Xygid2FybiIsLi4udCl9LGVycm9yOmZ1bmN0aW9uKC4uLnQpe18oImVycm9yIiwuLi50KX19LCQ9L2NhcHR1cmVNZXNzYWdlfGNhcHR1cmVFeGNlcHRpb24vO2Z1bmN0aW9uIEUodCl7cmV0dXJuIHRbdC5sZW5ndGgtMV18fHt9fWNvbnN0IHg9Ijxhbm9ueW1vdXM+Ijtjb25zdCBOPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gQyh0LG4pe3JldHVybiBOLmNhbGwodCk9PT1gW29iamVjdCAke259XWB9ZnVuY3Rpb24gaih0KXtyZXR1cm4gQm9vbGVhbih0Py50aGVuJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVuKX1mdW5jdGlvbiBSKHQsbil7dHJ5e3JldHVybiB0IGluc3RhbmNlb2Ygbn1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gQSh0KXtpZihmdW5jdGlvbih0KXtzd2l0Y2goTi5jYWxsKHQpKXtjYXNlIltvYmplY3QgRXJyb3JdIjpjYXNlIltvYmplY3QgRXhjZXB0aW9uXSI6Y2FzZSJbb2JqZWN0IERPTUV4Y2VwdGlvbl0iOmNhc2UiW29iamVjdCBXZWJBc3NlbWJseS5FeGNlcHRpb25dIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiBSKHQsRXJyb3IpfX0odCkpcmV0dXJue21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2ssLi4uSSh0KX07aWYobj10LCJ1bmRlZmluZWQiIT10eXBlb2YgRXZlbnQmJlIobixFdmVudCkpe2NvbnN0e3R5cGU6bix0YXJnZXQ6ZSxjdXJyZW50VGFyZ2V0OnIsZGV0YWlsOm99PXQ7cmV0dXJue3R5cGU6bix0YXJnZXQ6ZSxjdXJyZW50VGFyZ2V0OnIsLi4ubz97ZGV0YWlsOm99Ont9LC4uLkkodCl9fXZhciBuO3JldHVybiB0fWZ1bmN0aW9uIEkodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZihuPXQpJiZudWxsIT09bj9PYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkpOnt9O3ZhciBufWxldCBPO2Z1bmN0aW9uIFQodCl7aWYodm9pZCAwIT09TylyZXR1cm4gTz9PKHQpOnQoKTtjb25zdCBuPVN5bWJvbC5mb3IoIl9fU0VOVFJZX1NBRkVfUkFORE9NX0lEX1dSQVBQRVJfXyIpLGU9cDtyZXR1cm4gbiBpbiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtuXT8oTz1lW25dLE8odCkpOihPPW51bGwsdCgpKX1mdW5jdGlvbiBrKCl7cmV0dXJuIFQoKCk9Pk1hdGgucmFuZG9tKCkpfWZ1bmN0aW9uIFAoKXtyZXR1cm4gVCgoKT0+RGF0ZS5ub3coKSl9Y29uc3QgRD1TeW1ib2wuZm9yKCJzZW50cnkuc2tpcE5vcm1hbGl6YXRpb24iKSxVPVN5bWJvbC5mb3IoInNlbnRyeS5vdmVycmlkZU5vcm1hbGl6YXRpb25EZXB0aCIpO2Z1bmN0aW9uIEIodCxuPTEwMCxlPTEvMCl7dHJ5e3JldHVybiBMKCIiLHQsbixlKX1jYXRjaCh0KXtyZXR1cm57RVJST1I6YCoqbm9uLXNlcmlhbGl6YWJsZSoqICgke3R9KWB9fX1mdW5jdGlvbiBMKHQsbixlPTEvMCxyPTEvMCxvPWZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgV2Vha1NldDtmdW5jdGlvbiBuKG4pe3JldHVybiEhdC5oYXMobil8fCh0LmFkZChuKSwhMSl9ZnVuY3Rpb24gZShuKXt0LmRlbGV0ZShuKX1yZXR1cm5bbixlXX0oKSl7Y29uc3RbaSxzXT1vO2lmKG51bGw9PW58fFsiYm9vbGVhbiIsInN0cmluZyJdLmluY2x1ZGVzKHR5cGVvZiBuKXx8Im51bWJlciI9PXR5cGVvZiBuJiZOdW1iZXIuaXNGaW5pdGUobikpcmV0dXJuIG47Y29uc3QgYz1mdW5jdGlvbih0LG4pe3RyeXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmbj09PWdsb2JhbClyZXR1cm4iW0dsb2JhbF0iO2lmKCJudW1iZXIiPT10eXBlb2YgbiYmIU51bWJlci5pc0Zpbml0ZShuKSlyZXR1cm5gWyR7bn1dYDtpZigiZnVuY3Rpb24iPT10eXBlb2YgbilyZXR1cm5gW0Z1bmN0aW9uOiAke2Z1bmN0aW9uKHQpe3RyeXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQubmFtZXx8eH1jYXRjaHtyZXR1cm4geH19KG4pfV1gO2lmKCJzeW1ib2wiPT10eXBlb2YgbilyZXR1cm5gWyR7U3RyaW5nKG4pfV1gO2lmKCJiaWdpbnQiPT10eXBlb2YgbilyZXR1cm5gW0JpZ0ludDogJHtTdHJpbmcobil9XWA7Y29uc3QgdD1mdW5jdGlvbih0KXtjb25zdCBuPU9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtyZXR1cm4gbj8uY29uc3RydWN0b3I/bi5jb25zdHJ1Y3Rvci5uYW1lOiJudWxsIHByb3RvdHlwZSJ9KG4pO3JldHVybmBbb2JqZWN0ICR7dH1dYH1jYXRjaCh0KXtyZXR1cm5gKipub24tc2VyaWFsaXphYmxlKiogKCR7dH0pYH19KDAsbik7aWYoIWMuc3RhcnRzV2l0aCgiW29iamVjdCAiKSlyZXR1cm4gYztpZihmdW5jdGlvbih0KXtyZXR1cm4gQm9vbGVhbih0W0RdKX0obikpcmV0dXJuIG47Y29uc3QgdT1mdW5jdGlvbih0KXtjb25zdCBuPXRbVV07cmV0dXJuIm51bWJlciI9PXR5cGVvZiBuP246dm9pZCAwfShuKSxhPXZvaWQgMCE9PXU/dTplO2lmKDA9PT1hKXJldHVybiBjLnJlcGxhY2UoIm9iamVjdCAiLCIiKTtpZihpKG4pKXJldHVybiJbQ2lyY3VsYXIgfl0iO2NvbnN0IGY9bjtpZihmJiYiZnVuY3Rpb24iPT10eXBlb2YgZi50b0pTT04pdHJ5e3JldHVybiBMKCIiLGYudG9KU09OKCksYS0xLHIsbyl9Y2F0Y2h7fWNvbnN0IGg9QXJyYXkuaXNBcnJheShuKT9bXTp7fTtsZXQgcD0wO2NvbnN0IGQ9QShuKTtmb3IoY29uc3QgdCBpbiBkKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGQsdCkpY29udGludWU7aWYocD49cil7aFt0XT0iW01heFByb3BlcnRpZXMgfl0iO2JyZWFrfWNvbnN0IG49ZFt0XTtoW3RdPUwodCxuLGEtMSxyLG8pLHArK31yZXR1cm4gcyhuKSxofWZ1bmN0aW9uIE0odCxuKXtjb25zdCBlPW4ucmVwbGFjZSgvXFwvZywiLyIpLnJlcGxhY2UoL1t8XFx7fSgpW1xdXiQrKj8uXS9nLCJcXCQmIik7bGV0IHI9dDt0cnl7cj1kZWNvZGVVUkkodCl9Y2F0Y2h7fXJldHVybiByLnJlcGxhY2UoL1xcL2csIi8iKS5yZXBsYWNlKC93ZWJwYWNrOlwvPy9nLCIiKS5yZXBsYWNlKG5ldyBSZWdFeHAoYChmaWxlOi8vKT8vKiR7ZX0vKmAsImlnIiksImFwcDovLy8iKX1mdW5jdGlvbiB6KHQsbj0wKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHR8fDA9PT1ufHx0Lmxlbmd0aDw9bj90OmAke3Quc2xpY2UoMCxuKX0uLi5gfWxldCBGO2Z1bmN0aW9uIEcodD1mdW5jdGlvbigpe2NvbnN0IHQ9cDtyZXR1cm4gdC5jcnlwdG98fHQubXNDcnlwdG99KCkpe3RyeXtpZih0Py5yYW5kb21VVUlEKXJldHVybiBUKCgpPT50LnJhbmRvbVVVSUQoKSkucmVwbGFjZSgvLS9nLCIiKX1jYXRjaHt9cmV0dXJuIEZ8fChGPSIxMDAwMDAwMDEwMDA0MDAwODAwMDEwMDAwMDAwMDAwMCIpLEYucmVwbGFjZSgvWzAxOF0vZyx0PT4odF4oMTYqaygpJjE1KT4+dC80KS50b1N0cmluZygxNikpfWZ1bmN0aW9uIEooKXtyZXR1cm4gUCgpLzFlM31sZXQgVztmdW5jdGlvbiBZKCl7cmV0dXJuKFc/PyhXPWZ1bmN0aW9uKCl7Y29uc3R7cGVyZm9ybWFuY2U6dH09cDtpZighdD8ubm93fHwhdC50aW1lT3JpZ2luKXJldHVybiBKO2NvbnN0IG49dC50aW1lT3JpZ2luO3JldHVybigpPT4obitUKCgpPT50Lm5vdygpKSkvMWUzfSgpKSkoKX1mdW5jdGlvbiBIKHQpe2NvbnN0IG49WSgpLGU9e3NpZDpHKCksaW5pdDohMCx0aW1lc3RhbXA6bixzdGFydGVkOm4sZHVyYXRpb246MCxzdGF0dXM6Im9rIixlcnJvcnM6MCxpZ25vcmVEdXJhdGlvbjohMSx0b0pTT046KCk9PmZ1bmN0aW9uKHQpe3JldHVybntzaWQ6YCR7dC5zaWR9YCxpbml0OnQuaW5pdCxzdGFydGVkOm5ldyBEYXRlKDFlMyp0LnN0YXJ0ZWQpLnRvSVNPU3RyaW5nKCksdGltZXN0YW1wOm5ldyBEYXRlKDFlMyp0LnRpbWVzdGFtcCkudG9JU09TdHJpbmcoKSxzdGF0dXM6dC5zdGF0dXMsZXJyb3JzOnQuZXJyb3JzLGRpZDoibnVtYmVyIj09dHlwZW9mIHQuZGlkfHwic3RyaW5nIj09dHlwZW9mIHQuZGlkP2Ake3QuZGlkfWA6dm9pZCAwLGR1cmF0aW9uOnQuZHVyYXRpb24sYWJub3JtYWxfbWVjaGFuaXNtOnQuYWJub3JtYWxfbWVjaGFuaXNtLGF0dHJzOntyZWxlYXNlOnQucmVsZWFzZSxlbnZpcm9ubWVudDp0LmVudmlyb25tZW50LGlwX2FkZHJlc3M6dC5pcEFkZHJlc3MsdXNlcl9hZ2VudDp0LnVzZXJBZ2VudH19fShlKX07cmV0dXJuIHQmJksoZSx0KSxlfWZ1bmN0aW9uIEsodCxuPXt9KXtpZihuLnVzZXImJighdC5pcEFkZHJlc3MmJm4udXNlci5pcF9hZGRyZXNzJiYodC5pcEFkZHJlc3M9bi51c2VyLmlwX2FkZHJlc3MpLHQuZGlkfHxuLmRpZHx8KHQuZGlkPW4udXNlci5pZHx8bi51c2VyLmVtYWlsfHxuLnVzZXIudXNlcm5hbWUpKSx0LnRpbWVzdGFtcD1uLnRpbWVzdGFtcHx8WSgpLG4uYWJub3JtYWxfbWVjaGFuaXNtJiYodC5hYm5vcm1hbF9tZWNoYW5pc209bi5hYm5vcm1hbF9tZWNoYW5pc20pLG4uaWdub3JlRHVyYXRpb24mJih0Lmlnbm9yZUR1cmF0aW9uPW4uaWdub3JlRHVyYXRpb24pLG4uc2lkJiYodC5zaWQ9MzI9PT1uLnNpZC5sZW5ndGg/bi5zaWQ6RygpKSx2b2lkIDAhPT1uLmluaXQmJih0LmluaXQ9bi5pbml0KSwhdC5kaWQmJm4uZGlkJiYodC5kaWQ9YCR7bi5kaWR9YCksIm51bWJlciI9PXR5cGVvZiBuLnN0YXJ0ZWQmJih0LnN0YXJ0ZWQ9bi5zdGFydGVkKSx0Lmlnbm9yZUR1cmF0aW9uKXQuZHVyYXRpb249dm9pZCAwO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBuLmR1cmF0aW9uKXQuZHVyYXRpb249bi5kdXJhdGlvbjtlbHNle2NvbnN0IG49dC50aW1lc3RhbXAtdC5zdGFydGVkO3QuZHVyYXRpb249bj49MD9uOjB9bi5yZWxlYXNlJiYodC5yZWxlYXNlPW4ucmVsZWFzZSksbi5lbnZpcm9ubWVudCYmKHQuZW52aXJvbm1lbnQ9bi5lbnZpcm9ubWVudCksIXQuaXBBZGRyZXNzJiZuLmlwQWRkcmVzcyYmKHQuaXBBZGRyZXNzPW4uaXBBZGRyZXNzKSwhdC51c2VyQWdlbnQmJm4udXNlckFnZW50JiYodC51c2VyQWdlbnQ9bi51c2VyQWdlbnQpLCJudW1iZXIiPT10eXBlb2Ygbi5lcnJvcnMmJih0LmVycm9ycz1uLmVycm9ycyksbi5zdGF0dXMmJih0LnN0YXR1cz1uLnN0YXR1cyl9ZnVuY3Rpb24gWih0LG4sZT0yKXtpZighbnx8Im9iamVjdCIhPXR5cGVvZiBufHxlPD0wKXJldHVybiBuO2lmKHQmJjA9PT1PYmplY3Qua2V5cyhuKS5sZW5ndGgpcmV0dXJuIHQ7Y29uc3Qgcj17Li4udH07Zm9yKGNvbnN0IHQgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobix0KSYmKHJbdF09WihyW3RdLG5bdF0sZS0xKSk7cmV0dXJuIHJ9ZnVuY3Rpb24gcSgpe3JldHVybiBHKCl9ZnVuY3Rpb24gVigpe3JldHVybiBHKCkuc3Vic3RyaW5nKDE2KX1mdW5jdGlvbiBRKHQpe2lmKHQpe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmImRlcmVmImluIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmRlcmVmKXRyeXtyZXR1cm4gdC5kZXJlZigpfWNhdGNoe3JldHVybn1yZXR1cm4gdH19Y29uc3QgWD0iX3NlbnRyeVNwYW4iO2Z1bmN0aW9uIHR0KHQsbil7bj9mdW5jdGlvbih0LG4sZSl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4se3ZhbHVlOmUsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9Y2F0Y2h7aCYmdy5sb2coYEZhaWxlZCB0byBhZGQgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgIiR7U3RyaW5nKG4pfSIgdG8gb2JqZWN0YCx0KX19KHQsWCxmdW5jdGlvbih0KXt0cnl7Y29uc3Qgbj1wLldlYWtSZWY7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pcmV0dXJuIG5ldyBuKHQpfWNhdGNoe31yZXR1cm4gdH0obikpOmRlbGV0ZSB0W1hdfWZ1bmN0aW9uIG50KHQpe3JldHVybiBRKHRbWF0pfWNsYXNzIGV0e2NvbnN0cnVjdG9yKCl7dGhpcy50PSExLHRoaXMubz1bXSx0aGlzLmk9W10sdGhpcy51PVtdLHRoaXMuaD1bXSx0aGlzLnA9e30sdGhpcy5sPXt9LHRoaXMubT17fSx0aGlzLnY9e30sdGhpcy5fPXt9LHRoaXMuUz17fSx0aGlzLk49e3RyYWNlSWQ6cSgpLHNhbXBsZVJhbmQ6aygpfX1jbG9uZSgpe2NvbnN0IHQ9bmV3IGV0O3JldHVybiB0LnU9Wy4uLnRoaXMudV0sdC5sPXsuLi50aGlzLmx9LHQubT17Li4udGhpcy5tfSx0LnY9ey4uLnRoaXMudn0sdC5fPXsuLi50aGlzLl99LHRoaXMuXy5mbGFncyYmKHQuXy5mbGFncz17dmFsdWVzOlsuLi50aGlzLl8uZmxhZ3MudmFsdWVzXX0pLHQucD10aGlzLnAsdC5DPXRoaXMuQyx0Lmo9dGhpcy5qLHQuUj10aGlzLlIsdC5BPXRoaXMuQSx0Lmk9Wy4uLnRoaXMuaV0sdC5oPVsuLi50aGlzLmhdLHQuUz17Li4udGhpcy5TfSx0Lk49ey4uLnRoaXMuTn0sdC5JPXRoaXMuSSx0Lk89dGhpcy5PLHQuVD10aGlzLlQsdHQodCxudCh0aGlzKSksdH1zZXRDbGllbnQodCl7dGhpcy5JPXR9c2V0TGFzdEV2ZW50SWQodCl7dGhpcy5PPXR9Z2V0Q2xpZW50KCl7cmV0dXJuIHRoaXMuSX1sYXN0RXZlbnRJZCgpe3JldHVybiB0aGlzLk99YWRkU2NvcGVMaXN0ZW5lcih0KXt0aGlzLm8ucHVzaCh0KX1hZGRFdmVudFByb2Nlc3Nvcih0KXtyZXR1cm4gdGhpcy5pLnB1c2godCksdGhpc31zZXRVc2VyKHQpe3JldHVybiB0aGlzLnA9dHx8e2VtYWlsOnZvaWQgMCxpZDp2b2lkIDAsaXBfYWRkcmVzczp2b2lkIDAsdXNlcm5hbWU6dm9pZCAwfSx0aGlzLmomJksodGhpcy5qLHt1c2VyOnR9KSx0aGlzLmsoKSx0aGlzfWdldFVzZXIoKXtyZXR1cm4gdGhpcy5wfXNldENvbnZlcnNhdGlvbklkKHQpe3JldHVybiB0aGlzLlQ9dHx8dm9pZCAwLHRoaXMuaygpLHRoaXN9c2V0VGFncyh0KXtyZXR1cm4gdGhpcy5sPXsuLi50aGlzLmwsLi4udH0sdGhpcy5rKCksdGhpc31zZXRUYWcodCxuKXtyZXR1cm4gdGhpcy5zZXRUYWdzKHtbdF06bn0pfXNldEF0dHJpYnV0ZXModCl7cmV0dXJuIHRoaXMubT17Li4udGhpcy5tLC4uLnR9LHRoaXMuaygpLHRoaXN9c2V0QXR0cmlidXRlKHQsbil7cmV0dXJuIHRoaXMuc2V0QXR0cmlidXRlcyh7W3RdOm59KX1yZW1vdmVBdHRyaWJ1dGUodCl7cmV0dXJuIHQgaW4gdGhpcy5tJiYoZGVsZXRlIHRoaXMubVt0XSx0aGlzLmsoKSksdGhpc31zZXRFeHRyYXModCl7cmV0dXJuIHRoaXMudj17Li4udGhpcy52LC4uLnR9LHRoaXMuaygpLHRoaXN9c2V0RXh0cmEodCxuKXtyZXR1cm4gdGhpcy52PXsuLi50aGlzLnYsW3RdOm59LHRoaXMuaygpLHRoaXN9c2V0RmluZ2VycHJpbnQodCl7cmV0dXJuIHRoaXMuQT10LHRoaXMuaygpLHRoaXN9c2V0TGV2ZWwodCl7cmV0dXJuIHRoaXMuQz10LHRoaXMuaygpLHRoaXN9c2V0VHJhbnNhY3Rpb25OYW1lKHQpe3JldHVybiB0aGlzLlI9dCx0aGlzLmsoKSx0aGlzfXNldENvbnRleHQodCxuKXtyZXR1cm4gbnVsbD09PW4/ZGVsZXRlIHRoaXMuX1t0XTp0aGlzLl9bdF09bix0aGlzLmsoKSx0aGlzfXNldFNlc3Npb24odCl7cmV0dXJuIHQ/dGhpcy5qPXQ6ZGVsZXRlIHRoaXMuaix0aGlzLmsoKSx0aGlzfWdldFNlc3Npb24oKXtyZXR1cm4gdGhpcy5qfXVwZGF0ZSh0KXtpZighdClyZXR1cm4gdGhpcztjb25zdCBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QodGhpcyk6dCxlPW4gaW5zdGFuY2VvZiBldD9uLmdldFNjb3BlRGF0YSgpOkMobiwiT2JqZWN0Iik/dDp2b2lkIDA7Y29uc3R7dGFnczpyLGF0dHJpYnV0ZXM6byxleHRyYTppLHVzZXI6cyxjb250ZXh0czpjLGxldmVsOnUsZmluZ2VycHJpbnQ6YT1bXSxwcm9wYWdhdGlvbkNvbnRleHQ6Zixjb252ZXJzYXRpb25JZDpofT1lfHx7fTtyZXR1cm4gdGhpcy5sPXsuLi50aGlzLmwsLi4ucn0sdGhpcy5tPXsuLi50aGlzLm0sLi4ub30sdGhpcy52PXsuLi50aGlzLnYsLi4uaX0sdGhpcy5fPXsuLi50aGlzLl8sLi4uY30scyYmT2JqZWN0LmtleXMocykubGVuZ3RoJiYodGhpcy5wPXMpLHUmJih0aGlzLkM9dSksYS5sZW5ndGgmJih0aGlzLkE9YSksZiYmKHRoaXMuTj1mKSxoJiYodGhpcy5UPWgpLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy51PVtdLHRoaXMubD17fSx0aGlzLm09e30sdGhpcy52PXt9LHRoaXMucD17fSx0aGlzLl89e30sdGhpcy5DPXZvaWQgMCx0aGlzLlI9dm9pZCAwLHRoaXMuQT12b2lkIDAsdGhpcy5qPXZvaWQgMCx0aGlzLlQ9dm9pZCAwLHR0KHRoaXMsdm9pZCAwKSx0aGlzLmg9W10sdGhpcy5zZXRQcm9wYWdhdGlvbkNvbnRleHQoe3RyYWNlSWQ6cSgpLHNhbXBsZVJhbmQ6aygpfSksdGhpcy5rKCksdGhpc31hZGRCcmVhZGNydW1iKHQsbil7Y29uc3QgZT0ibnVtYmVyIj09dHlwZW9mIG4/bjoxMDA7aWYoZTw9MClyZXR1cm4gdGhpcztjb25zdCByPXt0aW1lc3RhbXA6SigpLC4uLnQsbWVzc2FnZTp0Lm1lc3NhZ2U/eih0Lm1lc3NhZ2UsMjA0OCk6dC5tZXNzYWdlfTtyZXR1cm4gdGhpcy51LnB1c2gociksdGhpcy51Lmxlbmd0aD5lJiYodGhpcy51PXRoaXMudS5zbGljZSgtZSksdGhpcy5JPy5yZWNvcmREcm9wcGVkRXZlbnQoImJ1ZmZlcl9vdmVyZmxvdyIsImxvZ19pdGVtIikpLHRoaXMuaygpLHRoaXN9Z2V0TGFzdEJyZWFkY3J1bWIoKXtyZXR1cm4gdGhpcy51W3RoaXMudS5sZW5ndGgtMV19Y2xlYXJCcmVhZGNydW1icygpe3JldHVybiB0aGlzLnU9W10sdGhpcy5rKCksdGhpc31hZGRBdHRhY2htZW50KHQpe3JldHVybiB0aGlzLmgucHVzaCh0KSx0aGlzfWNsZWFyQXR0YWNobWVudHMoKXtyZXR1cm4gdGhpcy5oPVtdLHRoaXN9Z2V0U2NvcGVEYXRhKCl7cmV0dXJue2JyZWFkY3J1bWJzOnRoaXMudSxhdHRhY2htZW50czp0aGlzLmgsY29udGV4dHM6dGhpcy5fLHRhZ3M6dGhpcy5sLGF0dHJpYnV0ZXM6dGhpcy5tLGV4dHJhOnRoaXMudix1c2VyOnRoaXMucCxsZXZlbDp0aGlzLkMsZmluZ2VycHJpbnQ6dGhpcy5BfHxbXSxldmVudFByb2Nlc3NvcnM6dGhpcy5pLHByb3BhZ2F0aW9uQ29udGV4dDp0aGlzLk4sc2RrUHJvY2Vzc2luZ01ldGFkYXRhOnRoaXMuUyx0cmFuc2FjdGlvbk5hbWU6dGhpcy5SLHNwYW46bnQodGhpcyksY29udmVyc2F0aW9uSWQ6dGhpcy5UfX1zZXRTREtQcm9jZXNzaW5nTWV0YWRhdGEodCl7cmV0dXJuIHRoaXMuUz1aKHRoaXMuUyx0LDIpLHRoaXN9c2V0UHJvcGFnYXRpb25Db250ZXh0KHQpe3JldHVybiB0aGlzLk49dCx0aGlzfWdldFByb3BhZ2F0aW9uQ29udGV4dCgpe3JldHVybiB0aGlzLk59Y2FwdHVyZUV4Y2VwdGlvbih0LG4pe2NvbnN0IGU9bj8uZXZlbnRfaWR8fEcoKTtpZighdGhpcy5JKXJldHVybiBoJiZ3Lndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBleGNlcHRpb24hIiksZTtjb25zdCByPW5ldyBFcnJvcigiU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbiIpO3JldHVybiB0aGlzLkkuY2FwdHVyZUV4Y2VwdGlvbih0LHtvcmlnaW5hbEV4Y2VwdGlvbjp0LHN5bnRoZXRpY0V4Y2VwdGlvbjpyLC4uLm4sZXZlbnRfaWQ6ZX0sdGhpcyksZX1jYXB0dXJlTWVzc2FnZSh0LG4sZSl7Y29uc3Qgcj1lPy5ldmVudF9pZHx8RygpO2lmKCF0aGlzLkkpcmV0dXJuIGgmJncud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIG1lc3NhZ2UhIikscjtjb25zdCBvPWU/LnN5bnRoZXRpY0V4Y2VwdGlvbj8/bmV3IEVycm9yKHQpO3JldHVybiB0aGlzLkkuY2FwdHVyZU1lc3NhZ2UodCxuLHtvcmlnaW5hbEV4Y2VwdGlvbjp0LHN5bnRoZXRpY0V4Y2VwdGlvbjpvLC4uLmUsZXZlbnRfaWQ6cn0sdGhpcykscn1jYXB0dXJlRXZlbnQodCxuKXtjb25zdCBlPXQuZXZlbnRfaWR8fG4/LmV2ZW50X2lkfHxHKCk7cmV0dXJuIHRoaXMuST8odGhpcy5JLmNhcHR1cmVFdmVudCh0LHsuLi5uLGV2ZW50X2lkOmV9LHRoaXMpLGUpOihoJiZ3Lndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBldmVudCEiKSxlKX1rKCl7dGhpcy50fHwodGhpcy50PSEwLHRoaXMuby5mb3JFYWNoKHQ9Pnt0KHRoaXMpfSksdGhpcy50PSExKX19Y29uc3QgcnQ9dD0+dCBpbnN0YW5jZW9mIFByb21pc2UmJiF0W290XSxvdD1TeW1ib2woImNoYWluZWQgUHJvbWlzZUxpa2UiKSxpdD0odCxuKT0+e2lmKCFuKXJldHVybiB0O2xldCBlPSExO2Zvcihjb25zdCByIGluIHQpe2lmKHIgaW4gbiljb250aW51ZTtlPSEwO2NvbnN0IG89dFtyXTsiZnVuY3Rpb24iPT10eXBlb2Ygbz9PYmplY3QuZGVmaW5lUHJvcGVydHkobixyLHt2YWx1ZTooLi4ubik9Pm8uYXBwbHkodCxuKSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm5bcl09b31yZXR1cm4gZSYmT2JqZWN0LmFzc2lnbihuLHtbb3RdOiEwfSksbn07Y2xhc3Mgc3R7Y29uc3RydWN0b3IodCxuKXtsZXQgZSxyO2U9dHx8bmV3IGV0LHI9bnx8bmV3IGV0LHRoaXMuUD1be3Njb3BlOmV9XSx0aGlzLkQ9cn13aXRoU2NvcGUodCl7Y29uc3Qgbj10aGlzLlUoKTtsZXQgZTt0cnl7ZT10KG4pfWNhdGNoKHQpe3Rocm93IHRoaXMuQigpLHR9cmV0dXJuIGooZSk/KCh0LG4sZSk9Pntjb25zdCByPXQudGhlbih0PT4obih0KSx0KSx0PT57dGhyb3cgZSh0KSx0fSk7cmV0dXJuIHJ0KHIpJiZydCh0KT9yOml0KHQscil9KShlLCgpPT50aGlzLkIoKSwoKT0+dGhpcy5CKCkpOih0aGlzLkIoKSxlKX1nZXRDbGllbnQoKXtyZXR1cm4gdGhpcy5nZXRTdGFja1RvcCgpLmNsaWVudH1nZXRTY29wZSgpe3JldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuc2NvcGV9Z2V0SXNvbGF0aW9uU2NvcGUoKXtyZXR1cm4gdGhpcy5EfWdldFN0YWNrVG9wKCl7cmV0dXJuIHRoaXMuUFt0aGlzLlAubGVuZ3RoLTFdfVUoKXtjb25zdCB0PXRoaXMuZ2V0U2NvcGUoKS5jbG9uZSgpO3JldHVybiB0aGlzLlAucHVzaCh7Y2xpZW50OnRoaXMuZ2V0Q2xpZW50KCksc2NvcGU6dH0pLHR9Qigpe3JldHVybiEodGhpcy5QLmxlbmd0aDw9MSkmJiEhdGhpcy5QLnBvcCgpfX1mdW5jdGlvbiBjdCgpe2NvbnN0IHQ9ZyhsKCkpO3JldHVybiB0LnN0YWNrPXQuc3RhY2t8fG5ldyBzdChtKCJkZWZhdWx0Q3VycmVudFNjb3BlIiwoKT0+bmV3IGV0KSxtKCJkZWZhdWx0SXNvbGF0aW9uU2NvcGUiLCgpPT5uZXcgZXQpKX1mdW5jdGlvbiB1dCh0KXtyZXR1cm4gY3QoKS53aXRoU2NvcGUodCl9ZnVuY3Rpb24gYXQodCxuKXtjb25zdCBlPWN0KCk7cmV0dXJuIGUud2l0aFNjb3BlKCgpPT4oZS5nZXRTdGFja1RvcCgpLnNjb3BlPXQsbih0KSkpfWZ1bmN0aW9uIGZ0KHQpe3JldHVybiBjdCgpLndpdGhTY29wZSgoKT0+dChjdCgpLmdldElzb2xhdGlvblNjb3BlKCkpKX1mdW5jdGlvbiBodCh0KXtjb25zdCBuPWcodCk7cmV0dXJuIG4uYWNzP24uYWNzOnt3aXRoSXNvbGF0aW9uU2NvcGU6ZnQsd2l0aFNjb3BlOnV0LHdpdGhTZXRTY29wZTphdCx3aXRoU2V0SXNvbGF0aW9uU2NvcGU6KHQsbik9PmZ0KG4pLGdldEN1cnJlbnRTY29wZTooKT0+Y3QoKS5nZXRTY29wZSgpLGdldElzb2xhdGlvblNjb3BlOigpPT5jdCgpLmdldElzb2xhdGlvblNjb3BlKCl9fWZ1bmN0aW9uIHB0KCl7cmV0dXJuIGh0KGwoKSkuZ2V0Q3VycmVudFNjb3BlKCkuZ2V0Q2xpZW50KCl9ZnVuY3Rpb24gZHQodCl7Y29uc3Qgbj10O3JldHVybntzY29wZTpuLl9zZW50cnlTY29wZSxpc29sYXRpb25TY29wZTpRKG4uX3NlbnRyeUlzb2xhdGlvblNjb3BlKX19Y29uc3QgbHQ9InNlbnRyeS0iO2Z1bmN0aW9uIGd0KHQpe2NvbnN0IG49ZnVuY3Rpb24odCl7aWYoIXR8fChuPXQsIUMobiwiU3RyaW5nIikmJiFBcnJheS5pc0FycmF5KHQpKSlyZXR1cm47dmFyIG47aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdC5yZWR1Y2UoKHQsbik9Pntjb25zdCBlPW10KG4pO3JldHVybiBPYmplY3QuZW50cmllcyhlKS5mb3JFYWNoKChbbixlXSk9Pnt0W25dPWV9KSx0fSx7fSk7cmV0dXJuIG10KHQpfSh0KTtpZighbilyZXR1cm47Y29uc3QgZT1PYmplY3QuZW50cmllcyhuKS5yZWR1Y2UoKHQsW24sZV0pPT57aWYobi5zdGFydHNXaXRoKGx0KSl7dFtuLnNsaWNlKDcpXT1lfXJldHVybiB0fSx7fSk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmxlbmd0aD4wP2U6dm9pZCAwfWZ1bmN0aW9uIG10KHQpe3JldHVybiB0LnNwbGl0KCIsIikubWFwKHQ9Pntjb25zdCBuPXQuaW5kZXhPZigiPSIpO2lmKC0xPT09bilyZXR1cm5bXTtyZXR1cm5bdC5zbGljZSgwLG4pLHQuc2xpY2UobisxKV0ubWFwKHQ9Pnt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0LnRyaW0oKSl9Y2F0Y2h7cmV0dXJufX0pfSkucmVkdWNlKCh0LFtuLGVdKT0+KG4mJmUmJih0W25dPWUpLHQpLHt9KX1jb25zdCB5dD0vXm8oXGQrKVwuLztmdW5jdGlvbiBidCh0LG49ITEpe2NvbnN0e2hvc3Q6ZSxwYXRoOnIscGFzczpvLHBvcnQ6aSxwcm9qZWN0SWQ6cyxwcm90b2NvbDpjLHB1YmxpY0tleTp1fT10O3JldHVybmAke2N9Oi8vJHt1fSR7biYmbz9gOiR7b31gOiIifUAke2V9JHtpP2A6JHtpfWA6IiJ9LyR7cj9gJHtyfS9gOnJ9JHtzfWB9ZnVuY3Rpb24gdnQodCl7Y29uc3Qgbj10LmdldE9wdGlvbnMoKSx7aG9zdDplfT10LmdldERzbigpfHx7fTtsZXQgcjtyZXR1cm4gbi5vcmdJZD9yPVN0cmluZyhuLm9yZ0lkKTplJiYocj1mdW5jdGlvbih0KXtjb25zdCBuPXQubWF0Y2goeXQpO3JldHVybiBuPy5bMV19KGUpKSxyfWZ1bmN0aW9uIF90KHQpe2NvbnN0e3NwYW5JZDpuLHRyYWNlSWQ6ZSxpc1JlbW90ZTpyfT10LnNwYW5Db250ZXh0KCksbz1yP246RXQodCkucGFyZW50X3NwYW5faWQsaT1kdCh0KS5zY29wZTtyZXR1cm57cGFyZW50X3NwYW5faWQ6byxzcGFuX2lkOnI/aT8uZ2V0UHJvcGFnYXRpb25Db250ZXh0KCkucHJvcGFnYXRpb25TcGFuSWR8fFYoKTpuLHRyYWNlX2lkOmV9fWZ1bmN0aW9uIFN0KHQpe3JldHVybiB0JiZ0Lmxlbmd0aD4wP3QubWFwKCh7Y29udGV4dDp7c3BhbklkOnQsdHJhY2VJZDpuLHRyYWNlRmxhZ3M6ZSwuLi5yfSxhdHRyaWJ1dGVzOm99KT0+KHtzcGFuX2lkOnQsdHJhY2VfaWQ6bixzYW1wbGVkOjE9PT1lLGF0dHJpYnV0ZXM6bywuLi5yfSkpOnZvaWQgMH1mdW5jdGlvbiB3dCh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/JHQodCk6QXJyYXkuaXNBcnJheSh0KT90WzBdK3RbMV0vMWU5OnQgaW5zdGFuY2VvZiBEYXRlPyR0KHQuZ2V0VGltZSgpKTpZKCl9ZnVuY3Rpb24gJHQodCl7cmV0dXJuIHQ+OTk5OTk5OTk5OT90LzFlMzp0fWZ1bmN0aW9uIEV0KHQpe2lmKGZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LmdldFNwYW5KU09OfSh0KSlyZXR1cm4gdC5nZXRTcGFuSlNPTigpO2NvbnN0e3NwYW5JZDpuLHRyYWNlSWQ6ZX09dC5zcGFuQ29udGV4dCgpO2lmKGZ1bmN0aW9uKHQpe2NvbnN0IG49dDtyZXR1cm4hIShuLmF0dHJpYnV0ZXMmJm4uc3RhcnRUaW1lJiZuLm5hbWUmJm4uZW5kVGltZSYmbi5zdGF0dXMpfSh0KSl7Y29uc3R7YXR0cmlidXRlczpyLHN0YXJ0VGltZTpvLG5hbWU6aSxlbmRUaW1lOnMsc3RhdHVzOmMsbGlua3M6dX09dDtyZXR1cm57c3Bhbl9pZDpuLHRyYWNlX2lkOmUsZGF0YTpyLGRlc2NyaXB0aW9uOmkscGFyZW50X3NwYW5faWQ6eHQodCksc3RhcnRfdGltZXN0YW1wOnd0KG8pLHRpbWVzdGFtcDp3dChzKXx8dm9pZCAwLHN0YXR1czpOdChjKSxvcDpyWyJzZW50cnkub3AiXSxvcmlnaW46clsic2VudHJ5Lm9yaWdpbiJdLGxpbmtzOlN0KHUpfX1yZXR1cm57c3Bhbl9pZDpuLHRyYWNlX2lkOmUsc3RhcnRfdGltZXN0YW1wOjAsZGF0YTp7fX19ZnVuY3Rpb24geHQodCl7cmV0dXJuInBhcmVudFNwYW5JZCJpbiB0P3QucGFyZW50U3BhbklkOiJwYXJlbnRTcGFuQ29udGV4dCJpbiB0P3QucGFyZW50U3BhbkNvbnRleHQ/LnNwYW5JZDp2b2lkIDB9ZnVuY3Rpb24gTnQodCl7aWYodCYmMCE9PXQuY29kZSlyZXR1cm4gMT09PXQuY29kZT8ib2siOnQubWVzc2FnZXx8ImludGVybmFsX2Vycm9yIn1jb25zdCBDdD1mdW5jdGlvbih0KXtyZXR1cm4gdC5fc2VudHJ5Um9vdFNwYW58fHR9O2Z1bmN0aW9uIGp0KHQpe2lmKCJib29sZWFuIj09dHlwZW9mIF9fU0VOVFJZX1RSQUNJTkdfXyYmIV9fU0VOVFJZX1RSQUNJTkdfXylyZXR1cm4hMTtjb25zdCBuPXR8fHB0KCk/LmdldE9wdGlvbnMoKTtyZXR1cm4hKCFufHxudWxsPT1uLnRyYWNlc1NhbXBsZVJhdGUmJiFuLnRyYWNlc1NhbXBsZXIpfWNvbnN0IFJ0PVN5bWJvbC5mb3IoInNlbnRyeS5ub25SZWNvcmRpbmdTcGFuIik7ZnVuY3Rpb24gQXQodCxuKXtjb25zdCBlPW4uZ2V0T3B0aW9ucygpLHtwdWJsaWNLZXk6cn09bi5nZXREc24oKXx8e30sbz17ZW52aXJvbm1lbnQ6ZS5lbnZpcm9ubWVudHx8InByb2R1Y3Rpb24iLHJlbGVhc2U6ZS5yZWxlYXNlLHB1YmxpY19rZXk6cix0cmFjZV9pZDp0LG9yZ19pZDp2dChuKX07cmV0dXJuIG4uZW1pdCgiY3JlYXRlRHNjIixvKSxvfWZ1bmN0aW9uIEl0KHQsbil7Y29uc3QgZT1uLmdldFByb3BhZ2F0aW9uQ29udGV4dCgpO3JldHVybiBlLmRzY3x8QXQoZS50cmFjZUlkLHQpfWZ1bmN0aW9uIE90KHQpe2NvbnN0IG49cHQoKTtpZighbilyZXR1cm57fTtjb25zdCBlPUN0KHQpLHI9RXQoZSksbz1yLmRhdGEsaT1lLnNwYW5Db250ZXh0KCkudHJhY2VTdGF0ZSxzPWk/LmdldCgic2VudHJ5LnNhbXBsZV9yYXRlIik/P29bInNlbnRyeS5zYW1wbGVfcmF0ZSJdPz9vWyJzZW50cnkucHJldmlvdXNfdHJhY2Vfc2FtcGxlX3JhdGUiXTtmdW5jdGlvbiBjKHQpe3JldHVybiJudW1iZXIiIT10eXBlb2YgcyYmInN0cmluZyIhPXR5cGVvZiBzfHwodC5zYW1wbGVfcmF0ZT1gJHtzfWApLHR9Y29uc3QgdT1lLl9mcm96ZW5Ec2M7aWYodSlyZXR1cm4gYyh1KTtjb25zdCBhPWZ1bmN0aW9uKHQpe3JldHVybiEhdCYmITA9PT10W1J0XX0oZSksZj1hJiYiaWdub3JlZCI9PT1lLmRyb3BSZWFzb247aWYoYSYmKCFqdChuLmdldE9wdGlvbnMoKSl8fGYpKXtjb25zdCB0PWR0KGUpLnNjb3BlO2lmKHQpe2NvbnN0IGU9ey4uLkl0KG4sdCl9O3JldHVybiBmJiYoZS5zYW1wbGVkPSJmYWxzZSIpLGMoZSl9fWNvbnN0IGg9aT8uZ2V0KCJzZW50cnkuZHNjIikscD1oJiZndChoKTtpZihwKXJldHVybiBjKHApO2NvbnN0IGQ9QXQodC5zcGFuQ29udGV4dCgpLnRyYWNlSWQsbiksbD1vWyJzZW50cnkuc291cmNlIl0/P29bInNlbnRyeS5zZWdtZW50Lm5hbWUuc291cmNlIl0sZz1yLmRlc2NyaXB0aW9uO3JldHVybiJ1cmwiIT09bCYmZyYmKGQudHJhbnNhY3Rpb249ZyksanQoKSYmKGQuc2FtcGxlZD1TdHJpbmcoZnVuY3Rpb24odCl7Y29uc3R7dHJhY2VGbGFnczpufT10LnNwYW5Db250ZXh0KCk7cmV0dXJuIDE9PT1ufShlKSksZC5zYW1wbGVfcmFuZD1pPy5nZXQoInNlbnRyeS5zYW1wbGVfcmFuZCIpPz9kdChlKS5zY29wZT8uZ2V0UHJvcGFnYXRpb25Db250ZXh0KCkuc2FtcGxlUmFuZC50b1N0cmluZygpKSxjKGQpLG4uZW1pdCgiY3JlYXRlRHNjIixkLGUpLGR9ZnVuY3Rpb24gVHQodCxuPVtdKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiBrdCh0LG4pe2NvbnN0IGU9dFsxXTtmb3IoY29uc3QgdCBvZiBlKXtpZihuKHQsdFswXS50eXBlKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBQdCh0KXtjb25zdCBuPWcocCk7cmV0dXJuIG4uZW5jb2RlUG9seWZpbGw/bi5lbmNvZGVQb2x5ZmlsbCh0KToobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUodCl9ZnVuY3Rpb24gRHQodCl7Y29uc3RbbixlXT10O2xldCByPUpTT04uc3RyaW5naWZ5KG4pO2Z1bmN0aW9uIG8odCl7InN0cmluZyI9PXR5cGVvZiByP3I9InN0cmluZyI9PXR5cGVvZiB0P3IrdDpbUHQociksdF06ci5wdXNoKCJzdHJpbmciPT10eXBlb2YgdD9QdCh0KTp0KX1mb3IoY29uc3QgdCBvZiBlKXtjb25zdFtuLGVdPXQ7aWYobyhgXG4ke0pTT04uc3RyaW5naWZ5KG4pfVxuYCksInN0cmluZyI9PXR5cGVvZiBlfHxlIGluc3RhbmNlb2YgVWludDhBcnJheSlvKGUpO2Vsc2V7bGV0IHQ7dHJ5e3Q9SlNPTi5zdHJpbmdpZnkoZSl9Y2F0Y2h7dD1KU09OLnN0cmluZ2lmeShCKGUpKX1vKHQpfX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHI/cjpmdW5jdGlvbih0KXtjb25zdCBuPXQucmVkdWNlKCh0LG4pPT50K24ubGVuZ3RoLDApLGU9bmV3IFVpbnQ4QXJyYXkobik7bGV0IHI9MDtmb3IoY29uc3QgbiBvZiB0KWUuc2V0KG4scikscis9bi5sZW5ndGg7cmV0dXJuIGV9KHIpfWNvbnN0IFV0PXtzZXNzaW9uczoic2Vzc2lvbiIsZXZlbnQ6ImVycm9yIixjbGllbnRfcmVwb3J0OiJpbnRlcm5hbCIsdXNlcl9yZXBvcnQ6ImRlZmF1bHQiLHByb2ZpbGVfY2h1bms6InByb2ZpbGUiLHJlcGxheV9ldmVudDoicmVwbGF5IixyZXBsYXlfcmVjb3JkaW5nOiJyZXBsYXkiLGNoZWNrX2luOiJtb25pdG9yIixyYXdfc2VjdXJpdHk6InNlY3VyaXR5Iixsb2c6ImxvZ19pdGVtIix0cmFjZV9tZXRyaWM6Im1ldHJpYyJ9O2Z1bmN0aW9uIEJ0KHQpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdCBpbiBVdH0odCk/VXRbdF06dH1mdW5jdGlvbiBMdCh0KXtpZighdD8uc2RrKXJldHVybjtjb25zdHtuYW1lOm4sdmVyc2lvbjplfT10LnNkaztyZXR1cm57bmFtZTpuLHZlcnNpb246ZX19ZnVuY3Rpb24gTXQodCxuLGUscil7Y29uc3Qgbz1MdChlKSxpPXQudHlwZSYmInJlcGxheV9ldmVudCIhPT10LnR5cGU/dC50eXBlOiJldmVudCI7IWZ1bmN0aW9uKHQsbil7aWYoIW4pcmV0dXJuIHQ7Y29uc3QgZT10LnNka3x8e307dC5zZGs9ey4uLmUsbmFtZTplLm5hbWV8fG4ubmFtZSx2ZXJzaW9uOmUudmVyc2lvbnx8bi52ZXJzaW9uLGludGVncmF0aW9uczpbLi4udC5zZGs/LmludGVncmF0aW9uc3x8W10sLi4ubi5pbnRlZ3JhdGlvbnN8fFtdXSxwYWNrYWdlczpbLi4udC5zZGs/LnBhY2thZ2VzfHxbXSwuLi5uLnBhY2thZ2VzfHxbXV0sc2V0dGluZ3M6dC5zZGs/LnNldHRpbmdzfHxuLnNldHRpbmdzP3suLi50LnNkaz8uc2V0dGluZ3MsLi4ubi5zZXR0aW5nc306dm9pZCAwfX0odCxlPy5zZGspO2NvbnN0IHM9ZnVuY3Rpb24odCxuLGUscil7Y29uc3Qgbz10LnNka1Byb2Nlc3NpbmdNZXRhZGF0YT8uZHluYW1pY1NhbXBsaW5nQ29udGV4dDtyZXR1cm57ZXZlbnRfaWQ6dC5ldmVudF9pZCxzZW50X2F0Om5ldyBEYXRlKFAoKSkudG9JU09TdHJpbmcoKSwuLi5uJiZ7c2RrOm59LC4uLiEhZSYmciYme2RzbjpidChyKX0sLi4ubyYme3RyYWNlOm99fX0odCxvLHIsbik7ZGVsZXRlIHQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhO3JldHVybiBUdChzLFtbe3R5cGU6aX0sdF1dKX1jb25zdCB6dD0iX19TRU5UUllfU1VQUFJFU1NfVFJBQ0lOR19fIjtmdW5jdGlvbiBGdCh0KXtjb25zdCBuPWh0KGwoKSk7cmV0dXJuIG4uc3VwcHJlc3NUcmFjaW5nP24uc3VwcHJlc3NUcmFjaW5nKHQpOmZ1bmN0aW9uKC4uLnQpe2NvbnN0IG49aHQobCgpKTtpZigyPT09dC5sZW5ndGgpe2NvbnN0W2Uscl09dDtyZXR1cm4gZT9uLndpdGhTZXRTY29wZShlLHIpOm4ud2l0aFNjb3BlKHIpfXJldHVybiBuLndpdGhTY29wZSh0WzBdKX0obj0+e24uc2V0U0RLUHJvY2Vzc2luZ01ldGFkYXRhKHtbenRdOiEwfSk7Y29uc3QgZT10KCk7cmV0dXJuIG4uc2V0U0RLUHJvY2Vzc2luZ01ldGFkYXRhKHtbenRdOnZvaWQgMH0pLGV9KX1mdW5jdGlvbiBHdCh0LG4pe2NvbnN0e2ZpbmdlcnByaW50OmUsc3BhbjpyLGJyZWFkY3J1bWJzOm8sc2RrUHJvY2Vzc2luZ01ldGFkYXRhOml9PW47IWZ1bmN0aW9uKHQsbil7Y29uc3R7ZXh0cmE6ZSx0YWdzOnIsdXNlcjpvLGNvbnRleHRzOmksbGV2ZWw6cyx0cmFuc2FjdGlvbk5hbWU6Y309bjtPYmplY3Qua2V5cyhlKS5sZW5ndGgmJih0LmV4dHJhPXsuLi5lLC4uLnQuZXh0cmF9KTtPYmplY3Qua2V5cyhyKS5sZW5ndGgmJih0LnRhZ3M9ey4uLnIsLi4udC50YWdzfSk7T2JqZWN0LmtleXMobykubGVuZ3RoJiYodC51c2VyPXsuLi5vLC4uLnQudXNlcn0pO09iamVjdC5rZXlzKGkpLmxlbmd0aCYmKHQuY29udGV4dHM9ey4uLmksLi4udC5jb250ZXh0c30pO3MmJih0LmxldmVsPXMpO2MmJiJ0cmFuc2FjdGlvbiIhPT10LnR5cGUmJih0LnRyYW5zYWN0aW9uPWMpfSh0LG4pLHImJmZ1bmN0aW9uKHQsbil7dC5jb250ZXh0cz17dHJhY2U6X3QobiksLi4udC5jb250ZXh0c30sdC5zZGtQcm9jZXNzaW5nTWV0YWRhdGE9e2R5bmFtaWNTYW1wbGluZ0NvbnRleHQ6T3QobiksLi4udC5zZGtQcm9jZXNzaW5nTWV0YWRhdGF9O2NvbnN0IGU9Q3Qobikscj1FdChlKS5kZXNjcmlwdGlvbjtyJiYhdC50cmFuc2FjdGlvbiYmInRyYW5zYWN0aW9uIj09PXQudHlwZSYmKHQudHJhbnNhY3Rpb249cil9KHQsciksZnVuY3Rpb24odCxuKXt0LmZpbmdlcnByaW50PXQuZmluZ2VycHJpbnQ/QXJyYXkuaXNBcnJheSh0LmZpbmdlcnByaW50KT90LmZpbmdlcnByaW50Olt0LmZpbmdlcnByaW50XTpbXSxuJiYodC5maW5nZXJwcmludD10LmZpbmdlcnByaW50LmNvbmNhdChuKSk7dC5maW5nZXJwcmludC5sZW5ndGh8fGRlbGV0ZSB0LmZpbmdlcnByaW50fSh0LGUpLGZ1bmN0aW9uKHQsbil7Y29uc3QgZT1bLi4udC5icmVhZGNydW1ic3x8W10sLi4ubl07dC5icmVhZGNydW1icz1lLmxlbmd0aD9lOnZvaWQgMH0odCxvKSxmdW5jdGlvbih0LG4pe3Quc2RrUHJvY2Vzc2luZ01ldGFkYXRhPXsuLi50LnNka1Byb2Nlc3NpbmdNZXRhZGF0YSwuLi5ufX0odCxpKX1jbGFzcyBKdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLkw9MCx0aGlzLk09W10sdGhpcy5GKHQpfXRoZW4odCxuKXtyZXR1cm4gbmV3IEp0KChlLHIpPT57dGhpcy5NLnB1c2goWyExLG49PntpZih0KXRyeXtlKHQobikpfWNhdGNoKHQpe3IodCl9ZWxzZSBlKG4pfSx0PT57aWYobil0cnl7ZShuKHQpKX1jYXRjaCh0KXtyKHQpfWVsc2Ugcih0KX1dKSx0aGlzLkcoKX0pfWNhdGNoKHQpe3JldHVybiB0aGlzLnRoZW4odD0+dCx0KX1maW5hbGx5KHQpe3JldHVybiBuZXcgSnQoKG4sZSk9PntsZXQgcixvO3JldHVybiB0aGlzLnRoZW4obj0+e289ITEscj1uLHQmJnQoKX0sbj0+e289ITAscj1uLHQmJnQoKX0pLnRoZW4oKCk9PntvP2Uocik6bihyKX0pfSl9Rygpe2lmKDA9PT10aGlzLkwpcmV0dXJuO2NvbnN0IHQ9dGhpcy5NLnNsaWNlKCk7dGhpcy5NPVtdLHQuZm9yRWFjaCh0PT57dFswXXx8KDE9PT10aGlzLkwmJnRbMV0odGhpcy5KKSwyPT09dGhpcy5MJiZ0WzJdKHRoaXMuSiksdFswXT0hMCl9KX1GKHQpe2NvbnN0IG49KHQsbik9PnswPT09dGhpcy5MJiYoaihuKT9uLnRoZW4oZSxyKToodGhpcy5MPXQsdGhpcy5KPW4sdGhpcy5HKCkpKX0sZT10PT57bigxLHQpfSxyPXQ9PntuKDIsdCl9O3RyeXt0KGUscil9Y2F0Y2godCl7cih0KX19fWNvbnN0IFd0PVN5bWJvbC5mb3IoIlNlbnRyeUJ1ZmZlckZ1bGxFcnJvciIpO2Z1bmN0aW9uIFl0KHQ9MTAwKXtjb25zdCBuPW5ldyBTZXQ7ZnVuY3Rpb24gZSh0KXtuLmRlbGV0ZSh0KX1yZXR1cm57Z2V0ICQoKXtyZXR1cm4gQXJyYXkuZnJvbShuKX0sYWRkOmZ1bmN0aW9uKHIpe2lmKCEobi5zaXplPHQpKXJldHVybiBvPVd0LG5ldyBKdCgodCxuKT0+e24obyl9KTt2YXIgbztjb25zdCBpPXIoKTtyZXR1cm4gbi5hZGQoaSksaS50aGVuKCgpPT5lKGkpLCgpPT5lKGkpKSxpfSxkcmFpbjpmdW5jdGlvbih0KXtpZighbi5zaXplKXJldHVybiBlPSEwLG5ldyBKdCh0PT57dChlKX0pO3ZhciBlO2NvbnN0IHI9UHJvbWlzZS5hbGxTZXR0bGVkKEFycmF5LmZyb20obikpLnRoZW4oKCk9PiEwKTtpZighdClyZXR1cm4gcjtjb25zdCBvPVtyLG5ldyBQcm9taXNlKG49PntyZXR1cm4ib2JqZWN0Ij09dHlwZW9mKGU9c2V0VGltZW91dCgoKT0+bighMSksdCkpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS51bnJlZiYmZS51bnJlZigpLGU7dmFyIGV9KV07cmV0dXJuIFByb21pc2UucmFjZShvKX19fWZ1bmN0aW9uIEh0KHQse3N0YXR1c0NvZGU6bixoZWFkZXJzOmV9LHI9UCgpKXtjb25zdCBvPXsuLi50fSxpPWU/LlsieC1zZW50cnktcmF0ZS1saW1pdHMiXSxzPWU/LlsicmV0cnktYWZ0ZXIiXTtpZihpKWZvcihjb25zdCB0IG9mIGkudHJpbSgpLnNwbGl0KCIsIikpe2NvbnN0W24sZSwsLGldPXQuc3BsaXQoIjoiLDUpLHM9cGFyc2VJbnQobiwxMCksYz0xZTMqKGlzTmFOKHMpPzYwOnMpO2lmKGUpZm9yKGNvbnN0IHQgb2YgZS5zcGxpdCgiOyIpKSJtZXRyaWNfYnVja2V0Ij09PXQmJmkmJiFpLnNwbGl0KCI7IikuaW5jbHVkZXMoImN1c3RvbSIpfHwob1t0XT1yK2MpO2Vsc2Ugby5hbGw9citjfWVsc2Ugcz9vLmFsbD1yK2Z1bmN0aW9uKHQsbj1QKCkpe2NvbnN0IGU9cGFyc2VJbnQoYCR7dH1gLDEwKTtpZighaXNOYU4oZSkpcmV0dXJuIDFlMyplO2NvbnN0IHI9RGF0ZS5wYXJzZShgJHt0fWApO3JldHVybiBpc05hTihyKT82ZTQ6ci1ufShzLHIpOjQyOT09PW4mJihvLmFsbD1yKzZlNCk7cmV0dXJuIG99ZnVuY3Rpb24gS3QodCxuLGU9WXQodC5idWZmZXJTaXplfHw2NCkpe2xldCByPXt9O3JldHVybntzZW5kOmZ1bmN0aW9uKHQpe2NvbnN0IG89W107aWYoa3QodCwodCxuKT0+e2NvbnN0IGU9QnQobik7KGZ1bmN0aW9uKHQsbixlPVAoKSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbbl18fHQuYWxsfHwwfSh0LG4pPmV9KShyLGUpfHxvLnB1c2godCl9KSwwPT09by5sZW5ndGgpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7Y29uc3QgaT1UdCh0WzBdLG8pLHM9dD0+eyFmdW5jdGlvbih0LG4pe3JldHVybiBrdCh0LCh0LGUpPT5uLmluY2x1ZGVzKGUpKX0oaSxbImNsaWVudF9yZXBvcnQiXSk/a3QoaSwodCxuKT0+e30pOmgmJncud2FybihgRHJvcHBpbmcgY2xpZW50IHJlcG9ydC4gV2lsbCBub3Qgc2VuZCBvdXRjb21lcyAocmVhc29uOiAke3R9KS5gKX07cmV0dXJuIGUuYWRkKCgpPT5uKHtib2R5OkR0KGkpfSkudGhlbih0PT40MTM9PT10LnN0YXR1c0NvZGU/KGgmJncuZXJyb3IoIlNlbnRyeSByZXNwb25kZWQgd2l0aCBzdGF0dXMgY29kZSA0MTMuIEVudmVsb3BlIHdhcyBkaXNjYXJkZWQgZHVlIHRvIGV4Y2VlZGluZyBzaXplIGxpbWl0cy4iKSxzKCJzZW5kX2Vycm9yIiksdCk6KGgmJnZvaWQgMCE9PXQuc3RhdHVzQ29kZSYmKHQuc3RhdHVzQ29kZTwyMDB8fHQuc3RhdHVzQ29kZT49MzAwKSYmdy53YXJuKGBTZW50cnkgcmVzcG9uZGVkIHdpdGggc3RhdHVzIGNvZGUgJHt0LnN0YXR1c0NvZGV9IHRvIHNlbnQgZXZlbnQuYCkscj1IdChyLHQpLHQpLHQ9Pnt0aHJvdyBzKCJuZXR3b3JrX2Vycm9yIiksaCYmdy5lcnJvcigiRW5jb3VudGVyZWQgZXJyb3IgcnVubmluZyB0cmFuc3BvcnQgcmVxdWVzdDoiLHQpLHR9KSkudGhlbih0PT50LHQ9PntpZih0PT09V3QpcmV0dXJuIGgmJncuZXJyb3IoIlNraXBwZWQgc2VuZGluZyBldmVudCBiZWNhdXNlIGJ1ZmZlciBpcyBmdWxsLiIpLHMoInF1ZXVlX292ZXJmbG93IiksUHJvbWlzZS5yZXNvbHZlKHt9KTt0aHJvdyB0fSl9LGZsdXNoOnQ9PmUuZHJhaW4odCl9fWNvbnN0IFp0PS9eKFxTKzpcXHxcLz8pKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteL1xcXSs/fCkoXC5bXi4vXFxdKnwpKSg/OlsvXFxdKikkLztmdW5jdGlvbiBxdCh0KXtjb25zdCBuPWZ1bmN0aW9uKHQpe2NvbnN0IG49dC5sZW5ndGg+MTAyND9gPHRydW5jYXRlZD4ke3Quc2xpY2UoLTEwMjQpfWA6dCxlPVp0LmV4ZWMobik7cmV0dXJuIGU/ZS5zbGljZSgxKTpbXX0odCksZT1uWzBdfHwiIjtsZXQgcj1uWzFdO3JldHVybiBlfHxyPyhyJiYocj1yLnNsaWNlKDAsci5sZW5ndGgtMSkpLGUrcik6Ii4ifWZ1bmN0aW9uIFZ0KHQsbj0hMSl7cmV0dXJuIShufHx0JiYhdC5zdGFydHNXaXRoKCIvIikmJiF0Lm1hdGNoKC9eW0EtWl06LykmJiF0LnN0YXJ0c1dpdGgoIi4iKSYmIXQubWF0Y2goL15bYS16QS1aXShbYS16QS1aMC05LlwtK10pKjpcL1wvLykpJiZ2b2lkIDAhPT10JiYhdC5pbmNsdWRlcygibm9kZV9tb2R1bGVzLyIpfXZhciBRdDtjb25zdCBYdD1TeW1ib2woIkFnZW50QmFzZUludGVybmFsU3RhdGUiKTtjbGFzcyB0biBleHRlbmRzKFF0PWkuQWdlbnQsUXQpe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXNbWHRdPXt9fWlzU2VjdXJlRW5kcG9pbnQodCl7aWYodCl7aWYoImJvb2xlYW4iPT10eXBlb2YgdC5zZWN1cmVFbmRwb2ludClyZXR1cm4gdC5zZWN1cmVFbmRwb2ludDtpZigic3RyaW5nIj09dHlwZW9mIHQucHJvdG9jb2wpcmV0dXJuImh0dHBzOiI9PT10LnByb3RvY29sfWNvbnN0e3N0YWNrOm59PW5ldyBFcnJvcjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG4mJm4uc3BsaXQoIlxuIikuc29tZSh0PT4tMSE9PXQuaW5kZXhPZigiKGh0dHBzLmpzOiIpfHwtMSE9PXQuaW5kZXhPZigibm9kZTpodHRwczoiKSl9Y3JlYXRlU29ja2V0KHQsbixlKXtjb25zdCByPXsuLi5uLHNlY3VyZUVuZHBvaW50OnRoaXMuaXNTZWN1cmVFbmRwb2ludChuKX07UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+dGhpcy5jb25uZWN0KHQscikpLnRoZW4obz0+e2lmKG8gaW5zdGFuY2VvZiBpLkFnZW50KXJldHVybiBvLmFkZFJlcXVlc3QodCxyKTt0aGlzW1h0XS5jdXJyZW50U29ja2V0PW8sc3VwZXIuY3JlYXRlU29ja2V0KHQsbixlKX0sZSl9Y3JlYXRlQ29ubmVjdGlvbigpe2NvbnN0IHQ9dGhpc1tYdF0uY3VycmVudFNvY2tldDtpZih0aGlzW1h0XS5jdXJyZW50U29ja2V0PXZvaWQgMCwhdCl0aHJvdyBuZXcgRXJyb3IoIk5vIHNvY2tldCB3YXMgcmV0dXJuZWQgaW4gdGhlIGBjb25uZWN0KClgIGZ1bmN0aW9uIik7cmV0dXJuIHR9Z2V0IGRlZmF1bHRQb3J0KCl7cmV0dXJuIHRoaXNbWHRdLmRlZmF1bHRQb3J0Pz8oImh0dHBzOiI9PT10aGlzLnByb3RvY29sPzQ0Mzo4MCl9c2V0IGRlZmF1bHRQb3J0KHQpe3RoaXNbWHRdJiYodGhpc1tYdF0uZGVmYXVsdFBvcnQ9dCl9Z2V0IHByb3RvY29sKCl7cmV0dXJuIHRoaXNbWHRdLnByb3RvY29sPz8odGhpcy5pc1NlY3VyZUVuZHBvaW50KCk/Imh0dHBzOiI6Imh0dHA6Iil9c2V0IHByb3RvY29sKHQpe3RoaXNbWHRdJiYodGhpc1tYdF0ucHJvdG9jb2w9dCl9fWZ1bmN0aW9uIG5uKC4uLnQpe3cubG9nKCJbaHR0cHMtcHJveHktYWdlbnQ6cGFyc2UtcHJveHktcmVzcG9uc2VdIiwuLi50KX1mdW5jdGlvbiBlbih0KXtyZXR1cm4gbmV3IFByb21pc2UoKG4sZSk9PntsZXQgcj0wO2NvbnN0IG89W107ZnVuY3Rpb24gaSgpe2NvbnN0IGM9dC5yZWFkKCk7Yz9mdW5jdGlvbihjKXtvLnB1c2goYykscis9Yy5sZW5ndGg7Y29uc3QgdT1CdWZmZXIuY29uY2F0KG8sciksYT11LmluZGV4T2YoIlxyXG5cclxuIik7aWYoLTE9PT1hKXJldHVybiBubigiaGF2ZSBub3QgcmVjZWl2ZWQgZW5kIG9mIEhUVFAgaGVhZGVycyB5ZXQuLi4iKSx2b2lkIGkoKTtjb25zdCBmPXUuc3ViYXJyYXkoMCxhKS50b1N0cmluZygiYXNjaWkiKS5zcGxpdCgiXHJcbiIpLGg9Zi5zaGlmdCgpO2lmKCFoKXJldHVybiB0LmRlc3Ryb3koKSxlKG5ldyBFcnJvcigiTm8gaGVhZGVyIHJlY2VpdmVkIGZyb20gcHJveHkgQ09OTkVDVCByZXNwb25zZSIpKTtjb25zdCBwPWguc3BsaXQoIiAiKSxkPSsocFsxXXx8MCksbD1wLnNsaWNlKDIpLmpvaW4oIiAiKSxnPXt9O2Zvcihjb25zdCBuIG9mIGYpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9bi5pbmRleE9mKCI6Iik7aWYoLTE9PT1yKXJldHVybiB0LmRlc3Ryb3koKSxlKG5ldyBFcnJvcihgSW52YWxpZCBoZWFkZXIgZnJvbSBwcm94eSBDT05ORUNUIHJlc3BvbnNlOiAiJHtufSJgKSk7Y29uc3Qgbz1uLnNsaWNlKDAscikudG9Mb3dlckNhc2UoKSxpPW4uc2xpY2UocisxKS50cmltU3RhcnQoKSxzPWdbb107InN0cmluZyI9PXR5cGVvZiBzP2dbb109W3MsaV06QXJyYXkuaXNBcnJheShzKT9zLnB1c2goaSk6Z1tvXT1pfW5uKCJnb3QgcHJveHkgc2VydmVyIHJlc3BvbnNlOiAlbyAlbyIsaCxnKSxzKCksbih7Y29ubmVjdDp7c3RhdHVzQ29kZTpkLHN0YXR1c1RleHQ6bCxoZWFkZXJzOmd9LGJ1ZmZlcmVkOnV9KX0oYyk6dC5vbmNlKCJyZWFkYWJsZSIsaSl9ZnVuY3Rpb24gcygpe3QucmVtb3ZlTGlzdGVuZXIoImVuZCIsYyksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLHUpLHQucmVtb3ZlTGlzdGVuZXIoInJlYWRhYmxlIixpKX1mdW5jdGlvbiBjKCl7cygpLG5uKCJvbmVuZCIpLGUobmV3IEVycm9yKCJQcm94eSBjb25uZWN0aW9uIGVuZGVkIGJlZm9yZSByZWNlaXZpbmcgQ09OTkVDVCByZXNwb25zZSIpKX1mdW5jdGlvbiB1KHQpe3MoKSxubigib25lcnJvciAlbyIsdCksZSh0KX10Lm9uKCJlcnJvciIsdSksdC5vbigiZW5kIixjKSxpKCl9KX1mdW5jdGlvbiBybiguLi50KXt3LmxvZygiW2h0dHBzLXByb3h5LWFnZW50XSIsLi4udCl9Y2xhc3Mgb24gZXh0ZW5kcyB0bntjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKG4pLHRoaXMub3B0aW9ucz17fSx0aGlzLnByb3h5PSJzdHJpbmciPT10eXBlb2YgdD9uZXcgVVJMKHQpOnQsdGhpcy5wcm94eUhlYWRlcnM9bj8uaGVhZGVycz8/e30scm4oIkNyZWF0aW5nIG5ldyBIdHRwc1Byb3h5QWdlbnQgaW5zdGFuY2U6ICVvIix0aGlzLnByb3h5LmhyZWYpO2NvbnN0IGU9KHRoaXMucHJveHkuaG9zdG5hbWV8fHRoaXMucHJveHkuaG9zdCkucmVwbGFjZSgvXlxbfFxdJC9nLCIiKSxyPXRoaXMucHJveHkucG9ydD9wYXJzZUludCh0aGlzLnByb3h5LnBvcnQsMTApOiJodHRwczoiPT09dGhpcy5wcm94eS5wcm90b2NvbD80NDM6ODA7dGhpcy5jb25uZWN0T3B0cz17QUxQTlByb3RvY29sczpbImh0dHAvMS4xIl0sLi4ubj9jbihuLCJoZWFkZXJzIik6bnVsbCxob3N0OmUscG9ydDpyfX1hc3luYyBjb25uZWN0KHQsbil7Y29uc3R7cHJveHk6ZX09dGhpcztpZighbi5ob3N0KXRocm93IG5ldyBUeXBlRXJyb3IoJ05vICJob3N0IiBwcm92aWRlZCcpO2xldCByO2lmKCJodHRwczoiPT09ZS5wcm90b2NvbCl7cm4oIkNyZWF0aW5nIGB0bHMuU29ja2V0YDogJW8iLHRoaXMuY29ubmVjdE9wdHMpO2NvbnN0IHQ9dGhpcy5jb25uZWN0T3B0cy5zZXJ2ZXJuYW1lfHx0aGlzLmNvbm5lY3RPcHRzLmhvc3Q7cj1mLmNvbm5lY3Qoey4uLnRoaXMuY29ubmVjdE9wdHMsc2VydmVybmFtZTp0JiZhLmlzSVAodCk/dm9pZCAwOnR9KX1lbHNlIHJuKCJDcmVhdGluZyBgbmV0LlNvY2tldGA6ICVvIix0aGlzLmNvbm5lY3RPcHRzKSxyPWEuY29ubmVjdCh0aGlzLmNvbm5lY3RPcHRzKTtjb25zdCBvPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnByb3h5SGVhZGVycz90aGlzLnByb3h5SGVhZGVycygpOnsuLi50aGlzLnByb3h5SGVhZGVyc30saT1hLmlzSVB2NihuLmhvc3QpP2BbJHtuLmhvc3R9XWA6bi5ob3N0O2xldCBzPWBDT05ORUNUICR7aX06JHtuLnBvcnR9IEhUVFAvMS4xXHJcbmA7aWYoZS51c2VybmFtZXx8ZS5wYXNzd29yZCl7Y29uc3QgdD1gJHtkZWNvZGVVUklDb21wb25lbnQoZS51c2VybmFtZSl9OiR7ZGVjb2RlVVJJQ29tcG9uZW50KGUucGFzc3dvcmQpfWA7b1siUHJveHktQXV0aG9yaXphdGlvbiJdPWBCYXNpYyAke0J1ZmZlci5mcm9tKHQpLnRvU3RyaW5nKCJiYXNlNjQiKX1gfW8uSG9zdD1gJHtpfToke24ucG9ydH1gLG9bIlByb3h5LUNvbm5lY3Rpb24iXXx8KG9bIlByb3h5LUNvbm5lY3Rpb24iXT10aGlzLmtlZXBBbGl2ZT8iS2VlcC1BbGl2ZSI6ImNsb3NlIik7Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmtleXMobykpcys9YCR7dH06ICR7b1t0XX1cclxuYDtjb25zdCBjPWVuKHIpO3Iud3JpdGUoYCR7c31cclxuYCk7Y29uc3R7Y29ubmVjdDp1LGJ1ZmZlcmVkOmh9PWF3YWl0IGM7aWYodC5lbWl0KCJwcm94eUNvbm5lY3QiLHUpLHRoaXMuZW1pdCgicHJveHlDb25uZWN0Iix1LHQpLDIwMD09PXUuc3RhdHVzQ29kZSl7aWYodC5vbmNlKCJzb2NrZXQiLHNuKSxuLnNlY3VyZUVuZHBvaW50KXtybigiVXBncmFkaW5nIHNvY2tldCBjb25uZWN0aW9uIHRvIFRMUyIpO2NvbnN0IHQ9bi5zZXJ2ZXJuYW1lfHxuLmhvc3Q7cmV0dXJuIGYuY29ubmVjdCh7Li4uY24obiwiaG9zdCIsInBhdGgiLCJwb3J0Iiksc29ja2V0OnIsc2VydmVybmFtZTphLmlzSVAodCk/dm9pZCAwOnR9KX1yZXR1cm4gcn1yLmRlc3Ryb3koKTtjb25zdCBwPW5ldyBhLlNvY2tldCh7d3JpdGFibGU6ITF9KTtyZXR1cm4gcC5yZWFkYWJsZT0hMCx0Lm9uY2UoInNvY2tldCIsdD0+e3JuKCJSZXBsYXlpbmcgcHJveHkgYnVmZmVyIGZvciBmYWlsZWQgcmVxdWVzdCIpLHQucHVzaChoKSx0LnB1c2gobnVsbCl9KSxwfX1mdW5jdGlvbiBzbih0KXt0LnJlc3VtZSgpfWZ1bmN0aW9uIGNuKHQsLi4ubil7Y29uc3QgZT17fTtsZXQgcjtmb3IociBpbiB0KW4uaW5jbHVkZXMocil8fChlW3JdPXRbcl0pO3JldHVybiBlfW9uLnByb3RvY29scz1bImh0dHAiLCJodHRwcyJdO2Z1bmN0aW9uIHVuKHQpe3JldHVybiB0LnJlcGxhY2UoL15bQS1aXTovLCIiKS5yZXBsYWNlKC9cXC9nLCIvIil9Y29uc3QgYW49bjtsZXQgZm4saG49MCxwbj17fTtmdW5jdGlvbiBkbih0KXthbi5kZWJ1ZyYmY29uc29sZS5sb2coYFtBTlIgV29ya2VyXSAke3R9YCl9dmFyIGxuLGduLG1uO2NvbnN0IHluPWZ1bmN0aW9uKHQpe2xldCBuO3RyeXtuPW5ldyBVUkwodC51cmwpfWNhdGNoKG4pe3JldHVybiBiKCgpPT57Y29uc29sZS53YXJuKCJbQHNlbnRyeS9ub2RlXTogSW52YWxpZCBkc24gb3IgdHVubmVsIG9wdGlvbiwgd2lsbCBub3Qgc2VuZCBhbnkgZXZlbnRzLiBUaGUgdHVubmVsIG9wdGlvbiBtdXN0IGJlIGEgZnVsbCBVUkwgd2hlbiB1c2VkLiIpfSksS3QodCwoKT0+UHJvbWlzZS5yZXNvbHZlKHt9KSl9Y29uc3QgZT0iaHR0cHM6Ij09PW4ucHJvdG9jb2wscj1mdW5jdGlvbih0LG4pe2NvbnN0e25vX3Byb3h5OmV9PXByb2Nlc3MuZW52LHI9ZT8uc3BsaXQoIiwiKS5zb21lKG49PnQuaG9zdC5lbmRzV2l0aChuKXx8dC5ob3N0bmFtZS5lbmRzV2l0aChuKSk7cmV0dXJuIHI/dm9pZCAwOm59KG4sdC5wcm94eXx8KGU/cHJvY2Vzcy5lbnYuaHR0cHNfcHJveHk6dm9pZCAwKXx8cHJvY2Vzcy5lbnYuaHR0cF9wcm94eSksbz1lP3M6aSxhPXZvaWQgMCE9PXQua2VlcEFsaXZlJiZ0LmtlZXBBbGl2ZSxmPXI/bmV3IG9uKHIpOm5ldyBvLkFnZW50KHtrZWVwQWxpdmU6YSxtYXhTb2NrZXRzOjMwLHRpbWVvdXQ6MmUzfSksaD1mdW5jdGlvbih0LG4sZSl7Y29uc3R7aG9zdG5hbWU6cixwYXRobmFtZTpvLHBvcnQ6aSxwcm90b2NvbDpzLHNlYXJjaDphfT1uZXcgVVJMKHQudXJsKTtyZXR1cm4gZnVuY3Rpb24oZil7cmV0dXJuIG5ldyBQcm9taXNlKChoLHApPT57RnQoKCk9PntsZXQgZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGMoe3JlYWQoKXt0aGlzLnB1c2godCksdGhpcy5wdXNoKG51bGwpfX0pfShmLmJvZHkpO2NvbnN0IGw9ey4uLnQuaGVhZGVyc307Zi5ib2R5Lmxlbmd0aD4zMjc2OCYmKGxbImNvbnRlbnQtZW5jb2RpbmciXT0iZ3ppcCIsZD1kLnBpcGUodSgpKSk7Y29uc3QgZz1yLnN0YXJ0c1dpdGgoIlsiKSxtPW4ucmVxdWVzdCh7bWV0aG9kOiJQT1NUIixhZ2VudDplLGhlYWRlcnM6bCxob3N0bmFtZTpnP3Iuc2xpY2UoMSwtMSk6cixwYXRoOmAke299JHthfWAscG9ydDppLHByb3RvY29sOnMsY2E6dC5jYUNlcnRzfSx0PT57dC5vbigiZGF0YSIsKCk9Pnt9KSx0Lm9uKCJlbmQiLCgpPT57fSksdC5zZXRFbmNvZGluZygidXRmOCIpO2NvbnN0IG49dC5oZWFkZXJzWyJyZXRyeS1hZnRlciJdPz9udWxsLGU9dC5oZWFkZXJzWyJ4LXNlbnRyeS1yYXRlLWxpbWl0cyJdPz9udWxsO2goe3N0YXR1c0NvZGU6dC5zdGF0dXNDb2RlLGhlYWRlcnM6eyJyZXRyeS1hZnRlciI6biwieC1zZW50cnktcmF0ZS1saW1pdHMiOkFycmF5LmlzQXJyYXkoZSk/ZVswXXx8bnVsbDplfX0pfSk7bS5vbigiZXJyb3IiLHApLGQucGlwZShtKX0pfSl9fSh0LHQuaHR0cE1vZHVsZT8/byxmKTtyZXR1cm4gS3QodCxoKX0oe3VybDoobG49YW4uZHNuLGduPWFuLnR1bm5lbCxtbj1hbi5zZGtNZXRhZGF0YS5zZGssZ258fGAke2Z1bmN0aW9uKHQpe3JldHVybmAke2Z1bmN0aW9uKHQpe2NvbnN0IG49dC5wcm90b2NvbD9gJHt0LnByb3RvY29sfTpgOiIiLGU9dC5wb3J0P2A6JHt0LnBvcnR9YDoiIjtyZXR1cm5gJHtufS8vJHt0Lmhvc3R9JHtlfSR7dC5wYXRoP2AvJHt0LnBhdGh9YDoiIn0vYXBpL2B9KHQpfSR7dC5wcm9qZWN0SWR9L2VudmVsb3BlL2B9KGxuKX0/JHtmdW5jdGlvbih0LG4pe2NvbnN0IGU9e3NlbnRyeV92ZXJzaW9uOiI3In07cmV0dXJuIHQucHVibGljS2V5JiYoZS5zZW50cnlfa2V5PXQucHVibGljS2V5KSxuJiYoZS5zZW50cnlfY2xpZW50PWAke24ubmFtZX0vJHtuLnZlcnNpb259YCksbmV3IFVSTFNlYXJjaFBhcmFtcyhlKS50b1N0cmluZygpfShsbixtbil9YCl9KTthc3luYyBmdW5jdGlvbiBibigpe2lmKGZuKXtkbigiU2VuZGluZyBhYm5vcm1hbCBzZXNzaW9uIiksSyhmbix7c3RhdHVzOiJhYm5vcm1hbCIsYWJub3JtYWxfbWVjaGFuaXNtOiJhbnJfZm9yZWdyb3VuZCIscmVsZWFzZTphbi5yZWxlYXNlLGVudmlyb25tZW50OmFuLmVudmlyb25tZW50fSk7Y29uc3QgdD1mdW5jdGlvbih0LG4sZSxyKXtjb25zdCBvPUx0KGUpO3JldHVybiBUdCh7c2VudF9hdDpuZXcgRGF0ZShQKCkpLnRvSVNPU3RyaW5nKCksLi4ubyYme3NkazpvfSwuLi4hIXImJm4mJntkc246YnQobil9fSxbImFnZ3JlZ2F0ZXMiaW4gdD9be3R5cGU6InNlc3Npb25zIn0sdF06W3t0eXBlOiJzZXNzaW9uIn0sdC50b0pTT04oKV1dKX0oZm4sYW4uZHNuLGFuLnNka01ldGFkYXRhLGFuLnR1bm5lbCk7ZG4oSlNPTi5zdHJpbmdpZnkodCkpLGF3YWl0IHluLnNlbmQodCk7dHJ5e2U/LnBvc3RNZXNzYWdlKCJzZXNzaW9uLWVuZGVkIil9Y2F0Y2h7fX19ZnVuY3Rpb24gdm4odCl7aWYoIXQpcmV0dXJuO2NvbnN0IG49ZnVuY3Rpb24odCl7aWYoIXQubGVuZ3RoKXJldHVybltdO2NvbnN0IG49QXJyYXkuZnJvbSh0KTtyZXR1cm4vc2VudHJ5V3JhcHBlZC8udGVzdChFKG4pLmZ1bmN0aW9ufHwiIikmJm4ucG9wKCksbi5yZXZlcnNlKCksJC50ZXN0KEUobikuZnVuY3Rpb258fCIiKSYmKG4ucG9wKCksJC50ZXN0KEUobikuZnVuY3Rpb258fCIiKSYmbi5wb3AoKSksbi5zbGljZSgwLDUwKS5tYXAodD0+KHsuLi50LGZpbGVuYW1lOnQuZmlsZW5hbWV8fEUobikuZmlsZW5hbWUsZnVuY3Rpb246dC5mdW5jdGlvbnx8Ij8ifSkpfSh0KTtpZihhbi5hcHBSb290UGF0aClmb3IoY29uc3QgdCBvZiBuKXQuZmlsZW5hbWUmJih0LmZpbGVuYW1lPU0odC5maWxlbmFtZSxhbi5hcHBSb290UGF0aCkpO3JldHVybiBufWFzeW5jIGZ1bmN0aW9uIF9uKHQsbil7aWYoaG4+PWFuLm1heEFuckV2ZW50cylyZXR1cm47aG4rPTEsYXdhaXQgYm4oKSxkbigiU2VuZGluZyBldmVudCIpO2NvbnN0IGU9e2V2ZW50X2lkOkcoKSxjb250ZXh0czphbi5jb250ZXh0cyxyZWxlYXNlOmFuLnJlbGVhc2UsZW52aXJvbm1lbnQ6YW4uZW52aXJvbm1lbnQsZGlzdDphbi5kaXN0LHBsYXRmb3JtOiJub2RlIixsZXZlbDoiZXJyb3IiLGV4Y2VwdGlvbjp7dmFsdWVzOlt7dHlwZToiQXBwbGljYXRpb25Ob3RSZXNwb25kaW5nIix2YWx1ZTpgQXBwbGljYXRpb24gTm90IFJlc3BvbmRpbmcgZm9yIGF0IGxlYXN0ICR7YW4uYW5yVGhyZXNob2xkfSBtc2Asc3RhY2t0cmFjZTp7ZnJhbWVzOnZuKHQpfSxtZWNoYW5pc206e3R5cGU6IkFOUiJ9fV19LHRhZ3M6YW4uc3RhdGljVGFnc307biYmZnVuY3Rpb24odCxuKXtpZihHdCh0LG4pLCF0LmNvbnRleHRzPy50cmFjZSl7Y29uc3R7dHJhY2VJZDplLHBhcmVudFNwYW5JZDpyLHByb3BhZ2F0aW9uU3BhbklkOm99PW4ucHJvcGFnYXRpb25Db250ZXh0O3QuY29udGV4dHM9e3RyYWNlOnt0cmFjZV9pZDplLHNwYW5faWQ6b3x8VigpLHBhcmVudF9zcGFuX2lkOnJ9LC4uLnQuY29udGV4dHN9fX0oZSxuKSxmdW5jdGlvbih0KXtpZigwPT09T2JqZWN0LmtleXMocG4pLmxlbmd0aClyZXR1cm47Y29uc3Qgbj1hbi5hcHBSb290UGF0aD97fTpwbjtpZihhbi5hcHBSb290UGF0aClmb3IoY29uc3RbdCxlXW9mIE9iamVjdC5lbnRyaWVzKHBuKSluW00odCxhbi5hcHBSb290UGF0aCldPWU7Y29uc3QgZT1uZXcgTWFwO2Zvcihjb25zdCByIG9mIHQuZXhjZXB0aW9uPy52YWx1ZXN8fFtdKWZvcihjb25zdCB0IG9mIHIuc3RhY2t0cmFjZT8uZnJhbWVzfHxbXSl7Y29uc3Qgcj10LmFic19wYXRofHx0LmZpbGVuYW1lO3ImJm5bcl0mJmUuc2V0KHIsbltyXSl9aWYoZS5zaXplPjApe2NvbnN0IG49W107Zm9yKGNvbnN0W3Qscl1vZiBlLmVudHJpZXMoKSluLnB1c2goe3R5cGU6InNvdXJjZW1hcCIsY29kZV9maWxlOnQsZGVidWdfaWQ6cn0pO3QuZGVidWdfbWV0YT17aW1hZ2VzOm59fX0oZSk7Y29uc3Qgcj1NdChlLGFuLmRzbixhbi5zZGtNZXRhZGF0YSxhbi50dW5uZWwpO2RuKEpTT04uc3RyaW5naWZ5KHIpKSxhd2FpdCB5bi5zZW5kKHIpLGF3YWl0IHluLmZsdXNoKDJlMyksaG4+PWFuLm1heEFuckV2ZW50cyYmc2V0VGltZW91dCgoKT0+e3Byb2Nlc3MuZXhpdCgwKX0sNWUzKX1sZXQgU247aWYoZG4oIlN0YXJ0ZWQiKSxhbi5jYXB0dXJlU3RhY2tUcmFjZSl7ZG4oIkNvbm5lY3RpbmcgdG8gZGVidWdnZXIiKTtjb25zdCBuPW5ldyB0O24uY29ubmVjdFRvTWFpblRocmVhZCgpLGRuKCJDb25uZWN0ZWQgdG8gZGVidWdnZXIiKTtjb25zdCBlPW5ldyBNYXA7bi5vbigiRGVidWdnZXIuc2NyaXB0UGFyc2VkIix0PT57ZS5zZXQodC5wYXJhbXMuc2NyaXB0SWQsdC5wYXJhbXMudXJsKX0pLG4ub24oIkRlYnVnZ2VyLnBhdXNlZCIsdD0+e2lmKCJvdGhlciI9PT10LnBhcmFtcy5yZWFzb24pdHJ5e2RuKCJEZWJ1Z2dlciBwYXVzZWQiKTtjb25zdCBpPVsuLi50LnBhcmFtcy5jYWxsRnJhbWVzXSxzPWFuLmFwcFJvb3RQYXRoP2Z1bmN0aW9uKHQ9KHByb2Nlc3MuYXJndlsxXT9xdChwcm9jZXNzLmFyZ3ZbMV0pOnByb2Nlc3MuY3dkKCkpLG49IlxcIj09PW8pe2NvbnN0IGU9bj91bih0KTp0O3JldHVybiB0PT57aWYoIXQpcmV0dXJuO2NvbnN0IG89bj91bih0KTp0O2xldHtkaXI6aSxiYXNlOnMsZXh0OmN9PXIucGFyc2Uobyk7Ii5qcyIhPT1jJiYiLm1qcyIhPT1jJiYiLmNqcyIhPT1jfHwocz1zLnNsaWNlKDAsLTEqYy5sZW5ndGgpKTtjb25zdCB1PWRlY29kZVVSSUNvbXBvbmVudChzKTtpfHwoaT0iLiIpO2NvbnN0IGE9aS5sYXN0SW5kZXhPZigiL25vZGVfbW9kdWxlcyIpO2lmKGE+LTEpcmV0dXJuYCR7aS5zbGljZShhKzE0KS5yZXBsYWNlKC9cLy9nLCIuIil9OiR7dX1gO2lmKGkuc3RhcnRzV2l0aChlKSl7Y29uc3QgdD1pLnNsaWNlKGUubGVuZ3RoKzEpLnJlcGxhY2UoL1wvL2csIi4iKTtyZXR1cm4gdD9gJHt0fToke3V9YDp1fXJldHVybiB1fX0oYW4uYXBwUm9vdFBhdGgpOigpPT57fSxjPWkubWFwKHQ9PmZ1bmN0aW9uKHQsbixlKXtjb25zdCByPW4/bi5yZXBsYWNlKC9eZmlsZTpcL1wvLywiIik6dm9pZCAwLG89dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXI/dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXIrMTp2b2lkIDAsaT10LmxvY2F0aW9uLmxpbmVOdW1iZXI/dC5sb2NhdGlvbi5saW5lTnVtYmVyKzE6dm9pZCAwO3JldHVybntmaWxlbmFtZTpyLG1vZHVsZTplKHIpLGZ1bmN0aW9uOnQuZnVuY3Rpb25OYW1lfHwiPyIsY29sbm86byxsaW5lbm86aSxpbl9hcHA6cj9WdChyKTp2b2lkIDB9fSh0LGUuZ2V0KHQubG9jYXRpb24uc2NyaXB0SWQpLHMpKSx1PXNldFRpbWVvdXQoKCk9PntfbihjKS50aGVuKG51bGwsKCk9PntkbigiU2VuZGluZyBBTlIgZXZlbnQgZmFpbGVkLiIpfSl9LDVlMyk7bi5wb3N0KCJSdW50aW1lLmV2YWx1YXRlIix7ZXhwcmVzc2lvbjoiZ2xvYmFsLl9fU0VOVFJZX0dFVF9TQ09QRVNfXygpOyIsc2lsZW50OiEwLHJldHVybkJ5VmFsdWU6ITB9LCh0LGUpPT57dCYmZG4oYEVycm9yIGV4ZWN1dGluZyBzY3JpcHQ6ICcke3QubWVzc2FnZX0nYCksY2xlYXJUaW1lb3V0KHUpO2NvbnN0IHI9ZT8ucmVzdWx0P2UucmVzdWx0LnZhbHVlOnZvaWQgMDtuLnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpLG4ucG9zdCgiRGVidWdnZXIuZGlzYWJsZSIpLF9uKGMscikudGhlbihudWxsLCgpPT57ZG4oIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZC4iKX0pfSl9Y2F0Y2godCl7dGhyb3cgbi5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKSxuLnBvc3QoIkRlYnVnZ2VyLmRpc2FibGUiKSx0fX0pLFNuPSgpPT57dHJ5e24ucG9zdCgiRGVidWdnZXIuZW5hYmxlIiwoKT0+e24ucG9zdCgiRGVidWdnZXIucGF1c2UiKX0pfWNhdGNoe319fWNvbnN0e3BvbGw6d259PWZ1bmN0aW9uKHQsbixlLHIpe2NvbnN0IG89dCgpO2xldCBpPSExLHM9ITA7cmV0dXJuIHNldEludGVydmFsKCgpPT57Y29uc3QgdD1vLmdldFRpbWVNcygpOyExPT09aSYmdD5uK2UmJihpPSEwLHMmJnIoKSksdDxuK2UmJihpPSExKX0sMjApLHtwb2xsOigpPT57by5yZXNldCgpfSxlbmFibGVkOnQ9PntzPXR9fX0oZnVuY3Rpb24oKXtsZXQgdD1wcm9jZXNzLmhydGltZSgpO3JldHVybntnZXRUaW1lTXM6KCk9Pntjb25zdFtuLGVdPXByb2Nlc3MuaHJ0aW1lKHQpO3JldHVybiBNYXRoLmZsb29yKDFlMypuK2UvMWU2KX0scmVzZXQ6KCk9Pnt0PXByb2Nlc3MuaHJ0aW1lKCl9fX0sYW4ucG9sbEludGVydmFsLGFuLmFuclRocmVzaG9sZCxmdW5jdGlvbigpe2RuKCJXYXRjaGRvZyB0aW1lb3V0IiksU24/KGRuKCJQYXVzaW5nIGRlYnVnZ2VyIHRvIGNhcHR1cmUgc3RhY2sgdHJhY2UiKSxTbigpKTooZG4oIkNhcHR1cmluZyBldmVudCB3aXRob3V0IGEgc3RhY2sgdHJhY2UiKSxfbigpLnRoZW4obnVsbCwoKT0+e2RuKCJTZW5kaW5nIEFOUiBldmVudCBmYWlsZWQgb24gd2F0Y2hkb2cgdGltZW91dC4iKX0pKX0pO2U/Lm9uKCJtZXNzYWdlIix0PT57dC5zZXNzaW9uJiYoZm49SCh0LnNlc3Npb24pKSx0LmRlYnVnSW1hZ2VzJiYocG49dC5kZWJ1Z0ltYWdlcyksd24oKX0pOw==";
10
+ const base64WorkerScript = "LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjc2LjAgKDBlMGI1Y2EpIHwgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdCAqLwppbXBvcnR7U2Vzc2lvbiBhcyB0fWZyb20ibm9kZTppbnNwZWN0b3IiO2ltcG9ydHt3b3JrZXJEYXRhIGFzIG4scGFyZW50UG9ydCBhcyBlfWZyb20ibm9kZTp3b3JrZXJfdGhyZWFkcyI7aW1wb3J0e3Bvc2l4IGFzIHIsc2VwIGFzIG99ZnJvbSJub2RlOnBhdGgiO2ltcG9ydCphcyBpIGZyb20ibm9kZTpodHRwIjtpbXBvcnQqYXMgcyBmcm9tIm5vZGU6aHR0cHMiO2ltcG9ydHtSZWFkYWJsZSBhcyBjfWZyb20ibm9kZTpzdHJlYW0iO2ltcG9ydHtjcmVhdGVHemlwIGFzIHV9ZnJvbSJub2RlOnpsaWIiO2ltcG9ydCphcyBhIGZyb20ibm9kZTpuZXQiO2ltcG9ydCphcyBmIGZyb20ibm9kZTp0bHMiO2NvbnN0IGg9InVuZGVmaW5lZCI9PXR5cGVvZiBfX1NFTlRSWV9ERUJVR19ffHxfX1NFTlRSWV9ERUJVR19fLHA9Z2xvYmFsVGhpcyxkPSIxMC43Ni4wIjtmdW5jdGlvbiBsKCl7cmV0dXJuIGcocCkscH1mdW5jdGlvbiBnKHQpe2NvbnN0IG49dC5fX1NFTlRSWV9fPXQuX19TRU5UUllfX3x8e307cmV0dXJuIG4udmVyc2lvbj1uLnZlcnNpb258fGQsbltkXT1uW2RdfHx7fX1mdW5jdGlvbiBtKHQsbixlPXApe2NvbnN0IHI9ZS5fX1NFTlRSWV9fPWUuX19TRU5UUllfX3x8e30sbz1yW2RdPXJbZF18fHt9O3JldHVybiBvW3RdfHwob1t0XT1uKCkpfWNvbnN0IHk9e307ZnVuY3Rpb24gYih0KXtpZighKCJjb25zb2xlImluIHApKXJldHVybiB0KCk7Y29uc3Qgbj1wLmNvbnNvbGUsZT17fSxyPU9iamVjdC5rZXlzKHkpO3IuZm9yRWFjaCh0PT57Y29uc3Qgcj15W3RdO2VbdF09blt0XSxuW3RdPXJ9KTt0cnl7cmV0dXJuIHQoKX1maW5hbGx5e3IuZm9yRWFjaCh0PT57blt0XT1lW3RdfSl9fWZ1bmN0aW9uIHYoKXtyZXR1cm4gUygpLmVuYWJsZWR9ZnVuY3Rpb24gXyh0LC4uLm4pe2gmJnYoKSYmYigoKT0+e3AuY29uc29sZVt0XShgU2VudHJ5IExvZ2dlciBbJHt0fV06YCwuLi5uKX0pfWZ1bmN0aW9uIFMoKXtyZXR1cm4gaD9tKCJsb2dnZXJTZXR0aW5ncyIsKCk9Pih7ZW5hYmxlZDohMX0pKTp7ZW5hYmxlZDohMX19Y29uc3Qgdz17ZW5hYmxlOmZ1bmN0aW9uKCl7UygpLmVuYWJsZWQ9ITB9LGRpc2FibGU6ZnVuY3Rpb24oKXtTKCkuZW5hYmxlZD0hMX0saXNFbmFibGVkOnYsbG9nOmZ1bmN0aW9uKC4uLnQpe18oImxvZyIsLi4udCl9LHdhcm46ZnVuY3Rpb24oLi4udCl7Xygid2FybiIsLi4udCl9LGVycm9yOmZ1bmN0aW9uKC4uLnQpe18oImVycm9yIiwuLi50KX19LCQ9L2NhcHR1cmVNZXNzYWdlfGNhcHR1cmVFeGNlcHRpb24vO2Z1bmN0aW9uIEUodCl7cmV0dXJuIHRbdC5sZW5ndGgtMV18fHt9fWNvbnN0IHg9Ijxhbm9ueW1vdXM+Ijtjb25zdCBOPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gQyh0LG4pe3JldHVybiBOLmNhbGwodCk9PT1gW29iamVjdCAke259XWB9ZnVuY3Rpb24gaih0KXtyZXR1cm4gQm9vbGVhbih0Py50aGVuJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVuKX1mdW5jdGlvbiBSKHQsbil7dHJ5e3JldHVybiB0IGluc3RhbmNlb2Ygbn1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gQSh0KXtpZihmdW5jdGlvbih0KXtzd2l0Y2goTi5jYWxsKHQpKXtjYXNlIltvYmplY3QgRXJyb3JdIjpjYXNlIltvYmplY3QgRXhjZXB0aW9uXSI6Y2FzZSJbb2JqZWN0IERPTUV4Y2VwdGlvbl0iOmNhc2UiW29iamVjdCBXZWJBc3NlbWJseS5FeGNlcHRpb25dIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiBSKHQsRXJyb3IpfX0odCkpcmV0dXJue21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2ssLi4uSSh0KX07aWYobj10LCJ1bmRlZmluZWQiIT10eXBlb2YgRXZlbnQmJlIobixFdmVudCkpe2NvbnN0e3R5cGU6bix0YXJnZXQ6ZSxjdXJyZW50VGFyZ2V0OnIsZGV0YWlsOm99PXQ7cmV0dXJue3R5cGU6bix0YXJnZXQ6ZSxjdXJyZW50VGFyZ2V0OnIsLi4ubz97ZGV0YWlsOm99Ont9LC4uLkkodCl9fXZhciBuO3JldHVybiB0fWZ1bmN0aW9uIEkodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZihuPXQpJiZudWxsIT09bj9PYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkpOnt9O3ZhciBufWxldCBPO2Z1bmN0aW9uIFQodCl7aWYodm9pZCAwIT09TylyZXR1cm4gTz9PKHQpOnQoKTtjb25zdCBuPVN5bWJvbC5mb3IoIl9fU0VOVFJZX1NBRkVfUkFORE9NX0lEX1dSQVBQRVJfXyIpLGU9cDtyZXR1cm4gbiBpbiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtuXT8oTz1lW25dLE8odCkpOihPPW51bGwsdCgpKX1mdW5jdGlvbiBrKCl7cmV0dXJuIFQoKCk9Pk1hdGgucmFuZG9tKCkpfWZ1bmN0aW9uIFAoKXtyZXR1cm4gVCgoKT0+RGF0ZS5ub3coKSl9Y29uc3QgRD1TeW1ib2wuZm9yKCJzZW50cnkuc2tpcE5vcm1hbGl6YXRpb24iKSxVPVN5bWJvbC5mb3IoInNlbnRyeS5vdmVycmlkZU5vcm1hbGl6YXRpb25EZXB0aCIpO2Z1bmN0aW9uIEIodCxuPTEwMCxlPTEvMCl7dHJ5e3JldHVybiBMKCIiLHQsbixlKX1jYXRjaCh0KXtyZXR1cm57RVJST1I6YCoqbm9uLXNlcmlhbGl6YWJsZSoqICgke3R9KWB9fX1mdW5jdGlvbiBMKHQsbixlPTEvMCxyPTEvMCxvPWZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgV2Vha1NldDtmdW5jdGlvbiBuKG4pe3JldHVybiEhdC5oYXMobil8fCh0LmFkZChuKSwhMSl9ZnVuY3Rpb24gZShuKXt0LmRlbGV0ZShuKX1yZXR1cm5bbixlXX0oKSl7Y29uc3RbaSxzXT1vO2lmKG51bGw9PW58fFsiYm9vbGVhbiIsInN0cmluZyJdLmluY2x1ZGVzKHR5cGVvZiBuKXx8Im51bWJlciI9PXR5cGVvZiBuJiZOdW1iZXIuaXNGaW5pdGUobikpcmV0dXJuIG47Y29uc3QgYz1mdW5jdGlvbih0LG4pe3RyeXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmbj09PWdsb2JhbClyZXR1cm4iW0dsb2JhbF0iO2lmKCJudW1iZXIiPT10eXBlb2YgbiYmIU51bWJlci5pc0Zpbml0ZShuKSlyZXR1cm5gWyR7bn1dYDtpZigiZnVuY3Rpb24iPT10eXBlb2YgbilyZXR1cm5gW0Z1bmN0aW9uOiAke2Z1bmN0aW9uKHQpe3RyeXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQubmFtZXx8eH1jYXRjaHtyZXR1cm4geH19KG4pfV1gO2lmKCJzeW1ib2wiPT10eXBlb2YgbilyZXR1cm5gWyR7U3RyaW5nKG4pfV1gO2lmKCJiaWdpbnQiPT10eXBlb2YgbilyZXR1cm5gW0JpZ0ludDogJHtTdHJpbmcobil9XWA7Y29uc3QgdD1mdW5jdGlvbih0KXtjb25zdCBuPU9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtyZXR1cm4gbj8uY29uc3RydWN0b3I/bi5jb25zdHJ1Y3Rvci5uYW1lOiJudWxsIHByb3RvdHlwZSJ9KG4pO3JldHVybmBbb2JqZWN0ICR7dH1dYH1jYXRjaCh0KXtyZXR1cm5gKipub24tc2VyaWFsaXphYmxlKiogKCR7dH0pYH19KDAsbik7aWYoIWMuc3RhcnRzV2l0aCgiW29iamVjdCAiKSlyZXR1cm4gYztpZihmdW5jdGlvbih0KXtyZXR1cm4gQm9vbGVhbih0W0RdKX0obikpcmV0dXJuIG47Y29uc3QgdT1mdW5jdGlvbih0KXtjb25zdCBuPXRbVV07cmV0dXJuIm51bWJlciI9PXR5cGVvZiBuP246dm9pZCAwfShuKSxhPXZvaWQgMCE9PXU/dTplO2lmKDA9PT1hKXJldHVybiBjLnJlcGxhY2UoIm9iamVjdCAiLCIiKTtpZihpKG4pKXJldHVybiJbQ2lyY3VsYXIgfl0iO2NvbnN0IGY9bjtpZihmJiYiZnVuY3Rpb24iPT10eXBlb2YgZi50b0pTT04pdHJ5e3JldHVybiBMKCIiLGYudG9KU09OKCksYS0xLHIsbyl9Y2F0Y2h7fWNvbnN0IGg9QXJyYXkuaXNBcnJheShuKT9bXTp7fTtsZXQgcD0wO2NvbnN0IGQ9QShuKTtmb3IoY29uc3QgdCBpbiBkKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGQsdCkpY29udGludWU7aWYocD49cil7aFt0XT0iW01heFByb3BlcnRpZXMgfl0iO2JyZWFrfWNvbnN0IG49ZFt0XTtoW3RdPUwodCxuLGEtMSxyLG8pLHArK31yZXR1cm4gcyhuKSxofWZ1bmN0aW9uIE0odCxuKXtjb25zdCBlPW4ucmVwbGFjZSgvXFwvZywiLyIpLnJlcGxhY2UoL1t8XFx7fSgpW1xdXiQrKj8uXS9nLCJcXCQmIik7bGV0IHI9dDt0cnl7cj1kZWNvZGVVUkkodCl9Y2F0Y2h7fXJldHVybiByLnJlcGxhY2UoL1xcL2csIi8iKS5yZXBsYWNlKC93ZWJwYWNrOlwvPy9nLCIiKS5yZXBsYWNlKG5ldyBSZWdFeHAoYChmaWxlOi8vKT8vKiR7ZX0vKmAsImlnIiksImFwcDovLy8iKX1mdW5jdGlvbiB6KHQsbj0wKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHR8fDA9PT1ufHx0Lmxlbmd0aDw9bj90OmAke3Quc2xpY2UoMCxuKX0uLi5gfWxldCBGO2Z1bmN0aW9uIEcodD1mdW5jdGlvbigpe2NvbnN0IHQ9cDtyZXR1cm4gdC5jcnlwdG98fHQubXNDcnlwdG99KCkpe3RyeXtpZih0Py5yYW5kb21VVUlEKXJldHVybiBUKCgpPT50LnJhbmRvbVVVSUQoKSkucmVwbGFjZSgvLS9nLCIiKX1jYXRjaHt9cmV0dXJuIEZ8fChGPSIxMDAwMDAwMDEwMDA0MDAwODAwMDEwMDAwMDAwMDAwMCIpLEYucmVwbGFjZSgvWzAxOF0vZyx0PT4odF4oMTYqaygpJjE1KT4+dC80KS50b1N0cmluZygxNikpfWZ1bmN0aW9uIEooKXtyZXR1cm4gUCgpLzFlM31sZXQgVztmdW5jdGlvbiBZKCl7cmV0dXJuKFc/PyhXPWZ1bmN0aW9uKCl7Y29uc3R7cGVyZm9ybWFuY2U6dH09cDtpZighdD8ubm93fHwhdC50aW1lT3JpZ2luKXJldHVybiBKO2NvbnN0IG49dC50aW1lT3JpZ2luO3JldHVybigpPT4obitUKCgpPT50Lm5vdygpKSkvMWUzfSgpKSkoKX1mdW5jdGlvbiBIKHQpe2NvbnN0IG49WSgpLGU9e3NpZDpHKCksaW5pdDohMCx0aW1lc3RhbXA6bixzdGFydGVkOm4sZHVyYXRpb246MCxzdGF0dXM6Im9rIixlcnJvcnM6MCxpZ25vcmVEdXJhdGlvbjohMSx0b0pTT046KCk9PmZ1bmN0aW9uKHQpe3JldHVybntzaWQ6YCR7dC5zaWR9YCxpbml0OnQuaW5pdCxzdGFydGVkOm5ldyBEYXRlKDFlMyp0LnN0YXJ0ZWQpLnRvSVNPU3RyaW5nKCksdGltZXN0YW1wOm5ldyBEYXRlKDFlMyp0LnRpbWVzdGFtcCkudG9JU09TdHJpbmcoKSxzdGF0dXM6dC5zdGF0dXMsZXJyb3JzOnQuZXJyb3JzLGRpZDoibnVtYmVyIj09dHlwZW9mIHQuZGlkfHwic3RyaW5nIj09dHlwZW9mIHQuZGlkP2Ake3QuZGlkfWA6dm9pZCAwLGR1cmF0aW9uOnQuZHVyYXRpb24sYWJub3JtYWxfbWVjaGFuaXNtOnQuYWJub3JtYWxfbWVjaGFuaXNtLGF0dHJzOntyZWxlYXNlOnQucmVsZWFzZSxlbnZpcm9ubWVudDp0LmVudmlyb25tZW50LGlwX2FkZHJlc3M6dC5pcEFkZHJlc3MsdXNlcl9hZ2VudDp0LnVzZXJBZ2VudH19fShlKX07cmV0dXJuIHQmJksoZSx0KSxlfWZ1bmN0aW9uIEsodCxuPXt9KXtpZihuLnVzZXImJighdC5pcEFkZHJlc3MmJm4udXNlci5pcF9hZGRyZXNzJiYodC5pcEFkZHJlc3M9bi51c2VyLmlwX2FkZHJlc3MpLHQuZGlkfHxuLmRpZHx8KHQuZGlkPW4udXNlci5pZHx8bi51c2VyLmVtYWlsfHxuLnVzZXIudXNlcm5hbWUpKSx0LnRpbWVzdGFtcD1uLnRpbWVzdGFtcHx8WSgpLG4uYWJub3JtYWxfbWVjaGFuaXNtJiYodC5hYm5vcm1hbF9tZWNoYW5pc209bi5hYm5vcm1hbF9tZWNoYW5pc20pLG4uaWdub3JlRHVyYXRpb24mJih0Lmlnbm9yZUR1cmF0aW9uPW4uaWdub3JlRHVyYXRpb24pLG4uc2lkJiYodC5zaWQ9MzI9PT1uLnNpZC5sZW5ndGg/bi5zaWQ6RygpKSx2b2lkIDAhPT1uLmluaXQmJih0LmluaXQ9bi5pbml0KSwhdC5kaWQmJm4uZGlkJiYodC5kaWQ9YCR7bi5kaWR9YCksIm51bWJlciI9PXR5cGVvZiBuLnN0YXJ0ZWQmJih0LnN0YXJ0ZWQ9bi5zdGFydGVkKSx0Lmlnbm9yZUR1cmF0aW9uKXQuZHVyYXRpb249dm9pZCAwO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBuLmR1cmF0aW9uKXQuZHVyYXRpb249bi5kdXJhdGlvbjtlbHNle2NvbnN0IG49dC50aW1lc3RhbXAtdC5zdGFydGVkO3QuZHVyYXRpb249bj49MD9uOjB9bi5yZWxlYXNlJiYodC5yZWxlYXNlPW4ucmVsZWFzZSksbi5lbnZpcm9ubWVudCYmKHQuZW52aXJvbm1lbnQ9bi5lbnZpcm9ubWVudCksIXQuaXBBZGRyZXNzJiZuLmlwQWRkcmVzcyYmKHQuaXBBZGRyZXNzPW4uaXBBZGRyZXNzKSwhdC51c2VyQWdlbnQmJm4udXNlckFnZW50JiYodC51c2VyQWdlbnQ9bi51c2VyQWdlbnQpLCJudW1iZXIiPT10eXBlb2Ygbi5lcnJvcnMmJih0LmVycm9ycz1uLmVycm9ycyksbi5zdGF0dXMmJih0LnN0YXR1cz1uLnN0YXR1cyl9ZnVuY3Rpb24gWih0LG4sZT0yKXtpZighbnx8Im9iamVjdCIhPXR5cGVvZiBufHxlPD0wKXJldHVybiBuO2lmKHQmJjA9PT1PYmplY3Qua2V5cyhuKS5sZW5ndGgpcmV0dXJuIHQ7Y29uc3Qgcj17Li4udH07Zm9yKGNvbnN0IHQgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobix0KSYmKHJbdF09WihyW3RdLG5bdF0sZS0xKSk7cmV0dXJuIHJ9ZnVuY3Rpb24gcSgpe3JldHVybiBHKCl9ZnVuY3Rpb24gVigpe3JldHVybiBHKCkuc3Vic3RyaW5nKDE2KX1mdW5jdGlvbiBRKHQpe2lmKHQpe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmImRlcmVmImluIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmRlcmVmKXRyeXtyZXR1cm4gdC5kZXJlZigpfWNhdGNoe3JldHVybn1yZXR1cm4gdH19Y29uc3QgWD0iX3NlbnRyeVNwYW4iO2Z1bmN0aW9uIHR0KHQsbil7bj9mdW5jdGlvbih0LG4sZSl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4se3ZhbHVlOmUsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9Y2F0Y2h7aCYmdy5sb2coYEZhaWxlZCB0byBhZGQgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgIiR7U3RyaW5nKG4pfSIgdG8gb2JqZWN0YCx0KX19KHQsWCxmdW5jdGlvbih0KXt0cnl7Y29uc3Qgbj1wLldlYWtSZWY7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pcmV0dXJuIG5ldyBuKHQpfWNhdGNoe31yZXR1cm4gdH0obikpOmRlbGV0ZSB0W1hdfWZ1bmN0aW9uIG50KHQpe3JldHVybiBRKHRbWF0pfWNsYXNzIGV0e2NvbnN0cnVjdG9yKCl7dGhpcy50PSExLHRoaXMubz1bXSx0aGlzLmk9W10sdGhpcy51PVtdLHRoaXMuaD1bXSx0aGlzLnA9e30sdGhpcy5sPXt9LHRoaXMubT17fSx0aGlzLnY9e30sdGhpcy5fPXt9LHRoaXMuUz17fSx0aGlzLk49e3RyYWNlSWQ6cSgpLHNhbXBsZVJhbmQ6aygpfX1jbG9uZSgpe2NvbnN0IHQ9bmV3IGV0O3JldHVybiB0LnU9Wy4uLnRoaXMudV0sdC5sPXsuLi50aGlzLmx9LHQubT17Li4udGhpcy5tfSx0LnY9ey4uLnRoaXMudn0sdC5fPXsuLi50aGlzLl99LHRoaXMuXy5mbGFncyYmKHQuXy5mbGFncz17dmFsdWVzOlsuLi50aGlzLl8uZmxhZ3MudmFsdWVzXX0pLHQucD10aGlzLnAsdC5DPXRoaXMuQyx0Lmo9dGhpcy5qLHQuUj10aGlzLlIsdC5BPXRoaXMuQSx0Lmk9Wy4uLnRoaXMuaV0sdC5oPVsuLi50aGlzLmhdLHQuUz17Li4udGhpcy5TfSx0Lk49ey4uLnRoaXMuTn0sdC5JPXRoaXMuSSx0Lk89dGhpcy5PLHQuVD10aGlzLlQsdHQodCxudCh0aGlzKSksdH1zZXRDbGllbnQodCl7dGhpcy5JPXR9c2V0TGFzdEV2ZW50SWQodCl7dGhpcy5PPXR9Z2V0Q2xpZW50KCl7cmV0dXJuIHRoaXMuSX1sYXN0RXZlbnRJZCgpe3JldHVybiB0aGlzLk99YWRkU2NvcGVMaXN0ZW5lcih0KXt0aGlzLm8ucHVzaCh0KX1hZGRFdmVudFByb2Nlc3Nvcih0KXtyZXR1cm4gdGhpcy5pLnB1c2godCksdGhpc31zZXRVc2VyKHQpe3JldHVybiB0aGlzLnA9dHx8e2VtYWlsOnZvaWQgMCxpZDp2b2lkIDAsaXBfYWRkcmVzczp2b2lkIDAsdXNlcm5hbWU6dm9pZCAwfSx0aGlzLmomJksodGhpcy5qLHt1c2VyOnR9KSx0aGlzLmsoKSx0aGlzfWdldFVzZXIoKXtyZXR1cm4gdGhpcy5wfXNldENvbnZlcnNhdGlvbklkKHQpe3JldHVybiB0aGlzLlQ9dHx8dm9pZCAwLHRoaXMuaygpLHRoaXN9c2V0VGFncyh0KXtyZXR1cm4gdGhpcy5sPXsuLi50aGlzLmwsLi4udH0sdGhpcy5rKCksdGhpc31zZXRUYWcodCxuKXtyZXR1cm4gdGhpcy5zZXRUYWdzKHtbdF06bn0pfXNldEF0dHJpYnV0ZXModCl7cmV0dXJuIHRoaXMubT17Li4udGhpcy5tLC4uLnR9LHRoaXMuaygpLHRoaXN9c2V0QXR0cmlidXRlKHQsbil7cmV0dXJuIHRoaXMuc2V0QXR0cmlidXRlcyh7W3RdOm59KX1yZW1vdmVBdHRyaWJ1dGUodCl7cmV0dXJuIHQgaW4gdGhpcy5tJiYoZGVsZXRlIHRoaXMubVt0XSx0aGlzLmsoKSksdGhpc31zZXRFeHRyYXModCl7cmV0dXJuIHRoaXMudj17Li4udGhpcy52LC4uLnR9LHRoaXMuaygpLHRoaXN9c2V0RXh0cmEodCxuKXtyZXR1cm4gdGhpcy52PXsuLi50aGlzLnYsW3RdOm59LHRoaXMuaygpLHRoaXN9c2V0RmluZ2VycHJpbnQodCl7cmV0dXJuIHRoaXMuQT10LHRoaXMuaygpLHRoaXN9c2V0TGV2ZWwodCl7cmV0dXJuIHRoaXMuQz10LHRoaXMuaygpLHRoaXN9c2V0VHJhbnNhY3Rpb25OYW1lKHQpe3JldHVybiB0aGlzLlI9dCx0aGlzLmsoKSx0aGlzfXNldENvbnRleHQodCxuKXtyZXR1cm4gbnVsbD09PW4/ZGVsZXRlIHRoaXMuX1t0XTp0aGlzLl9bdF09bix0aGlzLmsoKSx0aGlzfXNldFNlc3Npb24odCl7cmV0dXJuIHQ/dGhpcy5qPXQ6ZGVsZXRlIHRoaXMuaix0aGlzLmsoKSx0aGlzfWdldFNlc3Npb24oKXtyZXR1cm4gdGhpcy5qfXVwZGF0ZSh0KXtpZighdClyZXR1cm4gdGhpcztjb25zdCBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QodGhpcyk6dCxlPW4gaW5zdGFuY2VvZiBldD9uLmdldFNjb3BlRGF0YSgpOkMobiwiT2JqZWN0Iik/dDp2b2lkIDA7Y29uc3R7dGFnczpyLGF0dHJpYnV0ZXM6byxleHRyYTppLHVzZXI6cyxjb250ZXh0czpjLGxldmVsOnUsZmluZ2VycHJpbnQ6YT1bXSxwcm9wYWdhdGlvbkNvbnRleHQ6Zixjb252ZXJzYXRpb25JZDpofT1lfHx7fTtyZXR1cm4gdGhpcy5sPXsuLi50aGlzLmwsLi4ucn0sdGhpcy5tPXsuLi50aGlzLm0sLi4ub30sdGhpcy52PXsuLi50aGlzLnYsLi4uaX0sdGhpcy5fPXsuLi50aGlzLl8sLi4uY30scyYmT2JqZWN0LmtleXMocykubGVuZ3RoJiYodGhpcy5wPXMpLHUmJih0aGlzLkM9dSksYS5sZW5ndGgmJih0aGlzLkE9YSksZiYmKHRoaXMuTj1mKSxoJiYodGhpcy5UPWgpLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy51PVtdLHRoaXMubD17fSx0aGlzLm09e30sdGhpcy52PXt9LHRoaXMucD17fSx0aGlzLl89e30sdGhpcy5DPXZvaWQgMCx0aGlzLlI9dm9pZCAwLHRoaXMuQT12b2lkIDAsdGhpcy5qPXZvaWQgMCx0aGlzLlQ9dm9pZCAwLHR0KHRoaXMsdm9pZCAwKSx0aGlzLmg9W10sdGhpcy5zZXRQcm9wYWdhdGlvbkNvbnRleHQoe3RyYWNlSWQ6cSgpLHNhbXBsZVJhbmQ6aygpfSksdGhpcy5rKCksdGhpc31hZGRCcmVhZGNydW1iKHQsbil7Y29uc3QgZT0ibnVtYmVyIj09dHlwZW9mIG4/bjoxMDA7aWYoZTw9MClyZXR1cm4gdGhpcztjb25zdCByPXt0aW1lc3RhbXA6SigpLC4uLnQsbWVzc2FnZTp0Lm1lc3NhZ2U/eih0Lm1lc3NhZ2UsMjA0OCk6dC5tZXNzYWdlfTtyZXR1cm4gdGhpcy51LnB1c2gociksdGhpcy51Lmxlbmd0aD5lJiYodGhpcy51PXRoaXMudS5zbGljZSgtZSksdGhpcy5JPy5yZWNvcmREcm9wcGVkRXZlbnQoImJ1ZmZlcl9vdmVyZmxvdyIsImxvZ19pdGVtIikpLHRoaXMuaygpLHRoaXN9Z2V0TGFzdEJyZWFkY3J1bWIoKXtyZXR1cm4gdGhpcy51W3RoaXMudS5sZW5ndGgtMV19Y2xlYXJCcmVhZGNydW1icygpe3JldHVybiB0aGlzLnU9W10sdGhpcy5rKCksdGhpc31hZGRBdHRhY2htZW50KHQpe3JldHVybiB0aGlzLmgucHVzaCh0KSx0aGlzfWNsZWFyQXR0YWNobWVudHMoKXtyZXR1cm4gdGhpcy5oPVtdLHRoaXN9Z2V0U2NvcGVEYXRhKCl7cmV0dXJue2JyZWFkY3J1bWJzOnRoaXMudSxhdHRhY2htZW50czp0aGlzLmgsY29udGV4dHM6dGhpcy5fLHRhZ3M6dGhpcy5sLGF0dHJpYnV0ZXM6dGhpcy5tLGV4dHJhOnRoaXMudix1c2VyOnRoaXMucCxsZXZlbDp0aGlzLkMsZmluZ2VycHJpbnQ6dGhpcy5BfHxbXSxldmVudFByb2Nlc3NvcnM6dGhpcy5pLHByb3BhZ2F0aW9uQ29udGV4dDp0aGlzLk4sc2RrUHJvY2Vzc2luZ01ldGFkYXRhOnRoaXMuUyx0cmFuc2FjdGlvbk5hbWU6dGhpcy5SLHNwYW46bnQodGhpcyksY29udmVyc2F0aW9uSWQ6dGhpcy5UfX1zZXRTREtQcm9jZXNzaW5nTWV0YWRhdGEodCl7cmV0dXJuIHRoaXMuUz1aKHRoaXMuUyx0LDIpLHRoaXN9c2V0UHJvcGFnYXRpb25Db250ZXh0KHQpe3JldHVybiB0aGlzLk49dCx0aGlzfWdldFByb3BhZ2F0aW9uQ29udGV4dCgpe3JldHVybiB0aGlzLk59Y2FwdHVyZUV4Y2VwdGlvbih0LG4pe2NvbnN0IGU9bj8uZXZlbnRfaWR8fEcoKTtpZighdGhpcy5JKXJldHVybiBoJiZ3Lndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBleGNlcHRpb24hIiksZTtjb25zdCByPW5ldyBFcnJvcigiU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbiIpO3JldHVybiB0aGlzLkkuY2FwdHVyZUV4Y2VwdGlvbih0LHtvcmlnaW5hbEV4Y2VwdGlvbjp0LHN5bnRoZXRpY0V4Y2VwdGlvbjpyLC4uLm4sZXZlbnRfaWQ6ZX0sdGhpcyksZX1jYXB0dXJlTWVzc2FnZSh0LG4sZSl7Y29uc3Qgcj1lPy5ldmVudF9pZHx8RygpO2lmKCF0aGlzLkkpcmV0dXJuIGgmJncud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIG1lc3NhZ2UhIikscjtjb25zdCBvPWU/LnN5bnRoZXRpY0V4Y2VwdGlvbj8/bmV3IEVycm9yKHQpO3JldHVybiB0aGlzLkkuY2FwdHVyZU1lc3NhZ2UodCxuLHtvcmlnaW5hbEV4Y2VwdGlvbjp0LHN5bnRoZXRpY0V4Y2VwdGlvbjpvLC4uLmUsZXZlbnRfaWQ6cn0sdGhpcykscn1jYXB0dXJlRXZlbnQodCxuKXtjb25zdCBlPXQuZXZlbnRfaWR8fG4/LmV2ZW50X2lkfHxHKCk7cmV0dXJuIHRoaXMuST8odGhpcy5JLmNhcHR1cmVFdmVudCh0LHsuLi5uLGV2ZW50X2lkOmV9LHRoaXMpLGUpOihoJiZ3Lndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBldmVudCEiKSxlKX1rKCl7dGhpcy50fHwodGhpcy50PSEwLHRoaXMuby5mb3JFYWNoKHQ9Pnt0KHRoaXMpfSksdGhpcy50PSExKX19Y29uc3QgcnQ9dD0+dCBpbnN0YW5jZW9mIFByb21pc2UmJiF0W290XSxvdD1TeW1ib2woImNoYWluZWQgUHJvbWlzZUxpa2UiKSxpdD0odCxuKT0+e2lmKCFuKXJldHVybiB0O2xldCBlPSExO2Zvcihjb25zdCByIGluIHQpe2lmKHIgaW4gbiljb250aW51ZTtlPSEwO2NvbnN0IG89dFtyXTsiZnVuY3Rpb24iPT10eXBlb2Ygbz9PYmplY3QuZGVmaW5lUHJvcGVydHkobixyLHt2YWx1ZTooLi4ubik9Pm8uYXBwbHkodCxuKSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm5bcl09b31yZXR1cm4gZSYmT2JqZWN0LmFzc2lnbihuLHtbb3RdOiEwfSksbn07Y2xhc3Mgc3R7Y29uc3RydWN0b3IodCxuKXtsZXQgZSxyO2U9dHx8bmV3IGV0LHI9bnx8bmV3IGV0LHRoaXMuUD1be3Njb3BlOmV9XSx0aGlzLkQ9cn13aXRoU2NvcGUodCl7Y29uc3Qgbj10aGlzLlUoKTtsZXQgZTt0cnl7ZT10KG4pfWNhdGNoKHQpe3Rocm93IHRoaXMuQigpLHR9cmV0dXJuIGooZSk/KCh0LG4sZSk9Pntjb25zdCByPXQudGhlbih0PT4obih0KSx0KSx0PT57dGhyb3cgZSh0KSx0fSk7cmV0dXJuIHJ0KHIpJiZydCh0KT9yOml0KHQscil9KShlLCgpPT50aGlzLkIoKSwoKT0+dGhpcy5CKCkpOih0aGlzLkIoKSxlKX1nZXRDbGllbnQoKXtyZXR1cm4gdGhpcy5nZXRTdGFja1RvcCgpLmNsaWVudH1nZXRTY29wZSgpe3JldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuc2NvcGV9Z2V0SXNvbGF0aW9uU2NvcGUoKXtyZXR1cm4gdGhpcy5EfWdldFN0YWNrVG9wKCl7cmV0dXJuIHRoaXMuUFt0aGlzLlAubGVuZ3RoLTFdfVUoKXtjb25zdCB0PXRoaXMuZ2V0U2NvcGUoKS5jbG9uZSgpO3JldHVybiB0aGlzLlAucHVzaCh7Y2xpZW50OnRoaXMuZ2V0Q2xpZW50KCksc2NvcGU6dH0pLHR9Qigpe3JldHVybiEodGhpcy5QLmxlbmd0aDw9MSkmJiEhdGhpcy5QLnBvcCgpfX1mdW5jdGlvbiBjdCgpe2NvbnN0IHQ9ZyhsKCkpO3JldHVybiB0LnN0YWNrPXQuc3RhY2t8fG5ldyBzdChtKCJkZWZhdWx0Q3VycmVudFNjb3BlIiwoKT0+bmV3IGV0KSxtKCJkZWZhdWx0SXNvbGF0aW9uU2NvcGUiLCgpPT5uZXcgZXQpKX1mdW5jdGlvbiB1dCh0KXtyZXR1cm4gY3QoKS53aXRoU2NvcGUodCl9ZnVuY3Rpb24gYXQodCxuKXtjb25zdCBlPWN0KCk7cmV0dXJuIGUud2l0aFNjb3BlKCgpPT4oZS5nZXRTdGFja1RvcCgpLnNjb3BlPXQsbih0KSkpfWZ1bmN0aW9uIGZ0KHQpe3JldHVybiBjdCgpLndpdGhTY29wZSgoKT0+dChjdCgpLmdldElzb2xhdGlvblNjb3BlKCkpKX1mdW5jdGlvbiBodCh0KXtjb25zdCBuPWcodCk7cmV0dXJuIG4uYWNzP24uYWNzOnt3aXRoSXNvbGF0aW9uU2NvcGU6ZnQsd2l0aFNjb3BlOnV0LHdpdGhTZXRTY29wZTphdCx3aXRoU2V0SXNvbGF0aW9uU2NvcGU6KHQsbik9PmZ0KG4pLGdldEN1cnJlbnRTY29wZTooKT0+Y3QoKS5nZXRTY29wZSgpLGdldElzb2xhdGlvblNjb3BlOigpPT5jdCgpLmdldElzb2xhdGlvblNjb3BlKCl9fWZ1bmN0aW9uIHB0KCl7cmV0dXJuIGh0KGwoKSkuZ2V0Q3VycmVudFNjb3BlKCkuZ2V0Q2xpZW50KCl9ZnVuY3Rpb24gZHQodCl7Y29uc3Qgbj10O3JldHVybntzY29wZTpuLl9zZW50cnlTY29wZSxpc29sYXRpb25TY29wZTpRKG4uX3NlbnRyeUlzb2xhdGlvblNjb3BlKX19Y29uc3QgbHQ9InNlbnRyeS0iO2Z1bmN0aW9uIGd0KHQpe2NvbnN0IG49ZnVuY3Rpb24odCl7aWYoIXR8fChuPXQsIUMobiwiU3RyaW5nIikmJiFBcnJheS5pc0FycmF5KHQpKSlyZXR1cm47dmFyIG47aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdC5yZWR1Y2UoKHQsbik9Pntjb25zdCBlPW10KG4pO3JldHVybiBPYmplY3QuZW50cmllcyhlKS5mb3JFYWNoKChbbixlXSk9Pnt0W25dPWV9KSx0fSx7fSk7cmV0dXJuIG10KHQpfSh0KTtpZighbilyZXR1cm47Y29uc3QgZT1PYmplY3QuZW50cmllcyhuKS5yZWR1Y2UoKHQsW24sZV0pPT57aWYobi5zdGFydHNXaXRoKGx0KSl7dFtuLnNsaWNlKDcpXT1lfXJldHVybiB0fSx7fSk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmxlbmd0aD4wP2U6dm9pZCAwfWZ1bmN0aW9uIG10KHQpe3JldHVybiB0LnNwbGl0KCIsIikubWFwKHQ9Pntjb25zdCBuPXQuaW5kZXhPZigiPSIpO2lmKC0xPT09bilyZXR1cm5bXTtyZXR1cm5bdC5zbGljZSgwLG4pLHQuc2xpY2UobisxKV0ubWFwKHQ9Pnt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0LnRyaW0oKSl9Y2F0Y2h7cmV0dXJufX0pfSkucmVkdWNlKCh0LFtuLGVdKT0+KG4mJmUmJih0W25dPWUpLHQpLHt9KX1jb25zdCB5dD0vXm8oXGQrKVwuLztmdW5jdGlvbiBidCh0LG49ITEpe2NvbnN0e2hvc3Q6ZSxwYXRoOnIscGFzczpvLHBvcnQ6aSxwcm9qZWN0SWQ6cyxwcm90b2NvbDpjLHB1YmxpY0tleTp1fT10O3JldHVybmAke2N9Oi8vJHt1fSR7biYmbz9gOiR7b31gOiIifUAke2V9JHtpP2A6JHtpfWA6IiJ9LyR7cj9gJHtyfS9gOnJ9JHtzfWB9ZnVuY3Rpb24gdnQodCl7Y29uc3Qgbj10LmdldE9wdGlvbnMoKSx7aG9zdDplfT10LmdldERzbigpfHx7fTtsZXQgcjtyZXR1cm4gbi5vcmdJZD9yPVN0cmluZyhuLm9yZ0lkKTplJiYocj1mdW5jdGlvbih0KXtjb25zdCBuPXQubWF0Y2goeXQpO3JldHVybiBuPy5bMV19KGUpKSxyfWZ1bmN0aW9uIF90KHQpe2NvbnN0e3NwYW5JZDpuLHRyYWNlSWQ6ZSxpc1JlbW90ZTpyfT10LnNwYW5Db250ZXh0KCksbz1yP246RXQodCkucGFyZW50X3NwYW5faWQsaT1kdCh0KS5zY29wZTtyZXR1cm57cGFyZW50X3NwYW5faWQ6byxzcGFuX2lkOnI/aT8uZ2V0UHJvcGFnYXRpb25Db250ZXh0KCkucHJvcGFnYXRpb25TcGFuSWR8fFYoKTpuLHRyYWNlX2lkOmV9fWZ1bmN0aW9uIFN0KHQpe3JldHVybiB0JiZ0Lmxlbmd0aD4wP3QubWFwKCh7Y29udGV4dDp7c3BhbklkOnQsdHJhY2VJZDpuLHRyYWNlRmxhZ3M6ZSwuLi5yfSxhdHRyaWJ1dGVzOm99KT0+KHtzcGFuX2lkOnQsdHJhY2VfaWQ6bixzYW1wbGVkOjE9PT1lLGF0dHJpYnV0ZXM6bywuLi5yfSkpOnZvaWQgMH1mdW5jdGlvbiB3dCh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/JHQodCk6QXJyYXkuaXNBcnJheSh0KT90WzBdK3RbMV0vMWU5OnQgaW5zdGFuY2VvZiBEYXRlPyR0KHQuZ2V0VGltZSgpKTpZKCl9ZnVuY3Rpb24gJHQodCl7cmV0dXJuIHQ+OTk5OTk5OTk5OT90LzFlMzp0fWZ1bmN0aW9uIEV0KHQpe2lmKGZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LmdldFNwYW5KU09OfSh0KSlyZXR1cm4gdC5nZXRTcGFuSlNPTigpO2NvbnN0e3NwYW5JZDpuLHRyYWNlSWQ6ZX09dC5zcGFuQ29udGV4dCgpO2lmKGZ1bmN0aW9uKHQpe2NvbnN0IG49dDtyZXR1cm4hIShuLmF0dHJpYnV0ZXMmJm4uc3RhcnRUaW1lJiZuLm5hbWUmJm4uZW5kVGltZSYmbi5zdGF0dXMpfSh0KSl7Y29uc3R7YXR0cmlidXRlczpyLHN0YXJ0VGltZTpvLG5hbWU6aSxlbmRUaW1lOnMsc3RhdHVzOmMsbGlua3M6dX09dDtyZXR1cm57c3Bhbl9pZDpuLHRyYWNlX2lkOmUsZGF0YTpyLGRlc2NyaXB0aW9uOmkscGFyZW50X3NwYW5faWQ6eHQodCksc3RhcnRfdGltZXN0YW1wOnd0KG8pLHRpbWVzdGFtcDp3dChzKXx8dm9pZCAwLHN0YXR1czpOdChjKSxvcDpyWyJzZW50cnkub3AiXSxvcmlnaW46clsic2VudHJ5Lm9yaWdpbiJdLGxpbmtzOlN0KHUpfX1yZXR1cm57c3Bhbl9pZDpuLHRyYWNlX2lkOmUsc3RhcnRfdGltZXN0YW1wOjAsZGF0YTp7fX19ZnVuY3Rpb24geHQodCl7cmV0dXJuInBhcmVudFNwYW5JZCJpbiB0P3QucGFyZW50U3BhbklkOiJwYXJlbnRTcGFuQ29udGV4dCJpbiB0P3QucGFyZW50U3BhbkNvbnRleHQ/LnNwYW5JZDp2b2lkIDB9ZnVuY3Rpb24gTnQodCl7aWYodCYmMCE9PXQuY29kZSlyZXR1cm4gMT09PXQuY29kZT8ib2siOnQubWVzc2FnZXx8ImludGVybmFsX2Vycm9yIn1jb25zdCBDdD1mdW5jdGlvbih0KXtyZXR1cm4gdC5fc2VudHJ5Um9vdFNwYW58fHR9O2Z1bmN0aW9uIGp0KHQpe2lmKCJib29sZWFuIj09dHlwZW9mIF9fU0VOVFJZX1RSQUNJTkdfXyYmIV9fU0VOVFJZX1RSQUNJTkdfXylyZXR1cm4hMTtjb25zdCBuPXR8fHB0KCk/LmdldE9wdGlvbnMoKTtyZXR1cm4hKCFufHxudWxsPT1uLnRyYWNlc1NhbXBsZVJhdGUmJiFuLnRyYWNlc1NhbXBsZXIpfWNvbnN0IFJ0PVN5bWJvbC5mb3IoInNlbnRyeS5ub25SZWNvcmRpbmdTcGFuIik7ZnVuY3Rpb24gQXQodCxuKXtjb25zdCBlPW4uZ2V0T3B0aW9ucygpLHtwdWJsaWNLZXk6cn09bi5nZXREc24oKXx8e30sbz17ZW52aXJvbm1lbnQ6ZS5lbnZpcm9ubWVudHx8InByb2R1Y3Rpb24iLHJlbGVhc2U6ZS5yZWxlYXNlLHB1YmxpY19rZXk6cix0cmFjZV9pZDp0LG9yZ19pZDp2dChuKX07cmV0dXJuIG4uZW1pdCgiY3JlYXRlRHNjIixvKSxvfWZ1bmN0aW9uIEl0KHQsbil7Y29uc3QgZT1uLmdldFByb3BhZ2F0aW9uQ29udGV4dCgpO3JldHVybiBlLmRzY3x8QXQoZS50cmFjZUlkLHQpfWZ1bmN0aW9uIE90KHQpe2NvbnN0IG49cHQoKTtpZighbilyZXR1cm57fTtjb25zdCBlPUN0KHQpLHI9RXQoZSksbz1yLmRhdGEsaT1lLnNwYW5Db250ZXh0KCkudHJhY2VTdGF0ZSxzPWk/LmdldCgic2VudHJ5LnNhbXBsZV9yYXRlIik/P29bInNlbnRyeS5zYW1wbGVfcmF0ZSJdPz9vWyJzZW50cnkucHJldmlvdXNfdHJhY2Vfc2FtcGxlX3JhdGUiXTtmdW5jdGlvbiBjKHQpe3JldHVybiJudW1iZXIiIT10eXBlb2YgcyYmInN0cmluZyIhPXR5cGVvZiBzfHwodC5zYW1wbGVfcmF0ZT1gJHtzfWApLHR9Y29uc3QgdT1lLl9mcm96ZW5Ec2M7aWYodSlyZXR1cm4gYyh1KTtjb25zdCBhPWZ1bmN0aW9uKHQpe3JldHVybiEhdCYmITA9PT10W1J0XX0oZSksZj1hJiYiaWdub3JlZCI9PT1lLmRyb3BSZWFzb247aWYoYSYmKCFqdChuLmdldE9wdGlvbnMoKSl8fGYpKXtjb25zdCB0PWR0KGUpLnNjb3BlO2lmKHQpe2NvbnN0IGU9ey4uLkl0KG4sdCl9O3JldHVybiBmJiYoZS5zYW1wbGVkPSJmYWxzZSIpLGMoZSl9fWNvbnN0IGg9aT8uZ2V0KCJzZW50cnkuZHNjIikscD1oJiZndChoKTtpZihwKXJldHVybiBjKHApO2NvbnN0IGQ9QXQodC5zcGFuQ29udGV4dCgpLnRyYWNlSWQsbiksbD1vWyJzZW50cnkuc291cmNlIl0/P29bInNlbnRyeS5zZWdtZW50Lm5hbWUuc291cmNlIl0sZz1yLmRlc2NyaXB0aW9uO3JldHVybiJ1cmwiIT09bCYmZyYmKGQudHJhbnNhY3Rpb249ZyksanQoKSYmKGQuc2FtcGxlZD1TdHJpbmcoZnVuY3Rpb24odCl7Y29uc3R7dHJhY2VGbGFnczpufT10LnNwYW5Db250ZXh0KCk7cmV0dXJuIDE9PT1ufShlKSksZC5zYW1wbGVfcmFuZD1pPy5nZXQoInNlbnRyeS5zYW1wbGVfcmFuZCIpPz9kdChlKS5zY29wZT8uZ2V0UHJvcGFnYXRpb25Db250ZXh0KCkuc2FtcGxlUmFuZC50b1N0cmluZygpKSxjKGQpLG4uZW1pdCgiY3JlYXRlRHNjIixkLGUpLGR9ZnVuY3Rpb24gVHQodCxuPVtdKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiBrdCh0LG4pe2NvbnN0IGU9dFsxXTtmb3IoY29uc3QgdCBvZiBlKXtpZihuKHQsdFswXS50eXBlKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBQdCh0KXtjb25zdCBuPWcocCk7cmV0dXJuIG4uZW5jb2RlUG9seWZpbGw/bi5lbmNvZGVQb2x5ZmlsbCh0KToobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUodCl9ZnVuY3Rpb24gRHQodCl7Y29uc3RbbixlXT10O2xldCByPUpTT04uc3RyaW5naWZ5KG4pO2Z1bmN0aW9uIG8odCl7InN0cmluZyI9PXR5cGVvZiByP3I9InN0cmluZyI9PXR5cGVvZiB0P3IrdDpbUHQociksdF06ci5wdXNoKCJzdHJpbmciPT10eXBlb2YgdD9QdCh0KTp0KX1mb3IoY29uc3QgdCBvZiBlKXtjb25zdFtuLGVdPXQ7aWYobyhgXG4ke0pTT04uc3RyaW5naWZ5KG4pfVxuYCksInN0cmluZyI9PXR5cGVvZiBlfHxlIGluc3RhbmNlb2YgVWludDhBcnJheSlvKGUpO2Vsc2V7bGV0IHQ7dHJ5e3Q9SlNPTi5zdHJpbmdpZnkoZSl9Y2F0Y2h7dD1KU09OLnN0cmluZ2lmeShCKGUpKX1vKHQpfX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHI/cjpmdW5jdGlvbih0KXtjb25zdCBuPXQucmVkdWNlKCh0LG4pPT50K24ubGVuZ3RoLDApLGU9bmV3IFVpbnQ4QXJyYXkobik7bGV0IHI9MDtmb3IoY29uc3QgbiBvZiB0KWUuc2V0KG4scikscis9bi5sZW5ndGg7cmV0dXJuIGV9KHIpfWNvbnN0IFV0PXtzZXNzaW9uczoic2Vzc2lvbiIsZXZlbnQ6ImVycm9yIixjbGllbnRfcmVwb3J0OiJpbnRlcm5hbCIsdXNlcl9yZXBvcnQ6ImRlZmF1bHQiLHByb2ZpbGVfY2h1bms6InByb2ZpbGUiLHJlcGxheV9ldmVudDoicmVwbGF5IixyZXBsYXlfcmVjb3JkaW5nOiJyZXBsYXkiLGNoZWNrX2luOiJtb25pdG9yIixyYXdfc2VjdXJpdHk6InNlY3VyaXR5Iixsb2c6ImxvZ19pdGVtIix0cmFjZV9tZXRyaWM6Im1ldHJpYyJ9O2Z1bmN0aW9uIEJ0KHQpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdCBpbiBVdH0odCk/VXRbdF06dH1mdW5jdGlvbiBMdCh0KXtpZighdD8uc2RrKXJldHVybjtjb25zdHtuYW1lOm4sdmVyc2lvbjplfT10LnNkaztyZXR1cm57bmFtZTpuLHZlcnNpb246ZX19ZnVuY3Rpb24gTXQodCxuLGUscil7Y29uc3Qgbz1MdChlKSxpPXQudHlwZSYmInJlcGxheV9ldmVudCIhPT10LnR5cGU/dC50eXBlOiJldmVudCI7IWZ1bmN0aW9uKHQsbil7aWYoIW4pcmV0dXJuIHQ7Y29uc3QgZT10LnNka3x8e307dC5zZGs9ey4uLmUsbmFtZTplLm5hbWV8fG4ubmFtZSx2ZXJzaW9uOmUudmVyc2lvbnx8bi52ZXJzaW9uLGludGVncmF0aW9uczpbLi4udC5zZGs/LmludGVncmF0aW9uc3x8W10sLi4ubi5pbnRlZ3JhdGlvbnN8fFtdXSxwYWNrYWdlczpbLi4udC5zZGs/LnBhY2thZ2VzfHxbXSwuLi5uLnBhY2thZ2VzfHxbXV0sc2V0dGluZ3M6dC5zZGs/LnNldHRpbmdzfHxuLnNldHRpbmdzP3suLi50LnNkaz8uc2V0dGluZ3MsLi4ubi5zZXR0aW5nc306dm9pZCAwfX0odCxlPy5zZGspO2NvbnN0IHM9ZnVuY3Rpb24odCxuLGUscil7Y29uc3Qgbz10LnNka1Byb2Nlc3NpbmdNZXRhZGF0YT8uZHluYW1pY1NhbXBsaW5nQ29udGV4dDtyZXR1cm57ZXZlbnRfaWQ6dC5ldmVudF9pZCxzZW50X2F0Om5ldyBEYXRlKFAoKSkudG9JU09TdHJpbmcoKSwuLi5uJiZ7c2RrOm59LC4uLiEhZSYmciYme2RzbjpidChyKX0sLi4ubyYme3RyYWNlOm99fX0odCxvLHIsbik7ZGVsZXRlIHQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhO3JldHVybiBUdChzLFtbe3R5cGU6aX0sdF1dKX1jb25zdCB6dD0iX19TRU5UUllfU1VQUFJFU1NfVFJBQ0lOR19fIjtmdW5jdGlvbiBGdCh0KXtjb25zdCBuPWh0KGwoKSk7cmV0dXJuIG4uc3VwcHJlc3NUcmFjaW5nP24uc3VwcHJlc3NUcmFjaW5nKHQpOmZ1bmN0aW9uKC4uLnQpe2NvbnN0IG49aHQobCgpKTtpZigyPT09dC5sZW5ndGgpe2NvbnN0W2Uscl09dDtyZXR1cm4gZT9uLndpdGhTZXRTY29wZShlLHIpOm4ud2l0aFNjb3BlKHIpfXJldHVybiBuLndpdGhTY29wZSh0WzBdKX0obj0+e24uc2V0U0RLUHJvY2Vzc2luZ01ldGFkYXRhKHtbenRdOiEwfSk7Y29uc3QgZT10KCk7cmV0dXJuIG4uc2V0U0RLUHJvY2Vzc2luZ01ldGFkYXRhKHtbenRdOnZvaWQgMH0pLGV9KX1mdW5jdGlvbiBHdCh0LG4pe2NvbnN0e2ZpbmdlcnByaW50OmUsc3BhbjpyLGJyZWFkY3J1bWJzOm8sc2RrUHJvY2Vzc2luZ01ldGFkYXRhOml9PW47IWZ1bmN0aW9uKHQsbil7Y29uc3R7ZXh0cmE6ZSx0YWdzOnIsdXNlcjpvLGNvbnRleHRzOmksbGV2ZWw6cyx0cmFuc2FjdGlvbk5hbWU6Y309bjtPYmplY3Qua2V5cyhlKS5sZW5ndGgmJih0LmV4dHJhPXsuLi5lLC4uLnQuZXh0cmF9KTtPYmplY3Qua2V5cyhyKS5sZW5ndGgmJih0LnRhZ3M9ey4uLnIsLi4udC50YWdzfSk7T2JqZWN0LmtleXMobykubGVuZ3RoJiYodC51c2VyPXsuLi5vLC4uLnQudXNlcn0pO09iamVjdC5rZXlzKGkpLmxlbmd0aCYmKHQuY29udGV4dHM9ey4uLmksLi4udC5jb250ZXh0c30pO3MmJih0LmxldmVsPXMpO2MmJiJ0cmFuc2FjdGlvbiIhPT10LnR5cGUmJih0LnRyYW5zYWN0aW9uPWMpfSh0LG4pLHImJmZ1bmN0aW9uKHQsbil7dC5jb250ZXh0cz17dHJhY2U6X3QobiksLi4udC5jb250ZXh0c30sdC5zZGtQcm9jZXNzaW5nTWV0YWRhdGE9e2R5bmFtaWNTYW1wbGluZ0NvbnRleHQ6T3QobiksLi4udC5zZGtQcm9jZXNzaW5nTWV0YWRhdGF9O2NvbnN0IGU9Q3Qobikscj1FdChlKS5kZXNjcmlwdGlvbjtyJiYhdC50cmFuc2FjdGlvbiYmInRyYW5zYWN0aW9uIj09PXQudHlwZSYmKHQudHJhbnNhY3Rpb249cil9KHQsciksZnVuY3Rpb24odCxuKXt0LmZpbmdlcnByaW50PXQuZmluZ2VycHJpbnQ/QXJyYXkuaXNBcnJheSh0LmZpbmdlcnByaW50KT90LmZpbmdlcnByaW50Olt0LmZpbmdlcnByaW50XTpbXSxuJiYodC5maW5nZXJwcmludD10LmZpbmdlcnByaW50LmNvbmNhdChuKSk7dC5maW5nZXJwcmludC5sZW5ndGh8fGRlbGV0ZSB0LmZpbmdlcnByaW50fSh0LGUpLGZ1bmN0aW9uKHQsbil7Y29uc3QgZT1bLi4udC5icmVhZGNydW1ic3x8W10sLi4ubl07dC5icmVhZGNydW1icz1lLmxlbmd0aD9lOnZvaWQgMH0odCxvKSxmdW5jdGlvbih0LG4pe3Quc2RrUHJvY2Vzc2luZ01ldGFkYXRhPXsuLi50LnNka1Byb2Nlc3NpbmdNZXRhZGF0YSwuLi5ufX0odCxpKX1jbGFzcyBKdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLkw9MCx0aGlzLk09W10sdGhpcy5GKHQpfXRoZW4odCxuKXtyZXR1cm4gbmV3IEp0KChlLHIpPT57dGhpcy5NLnB1c2goWyExLG49PntpZih0KXRyeXtlKHQobikpfWNhdGNoKHQpe3IodCl9ZWxzZSBlKG4pfSx0PT57aWYobil0cnl7ZShuKHQpKX1jYXRjaCh0KXtyKHQpfWVsc2Ugcih0KX1dKSx0aGlzLkcoKX0pfWNhdGNoKHQpe3JldHVybiB0aGlzLnRoZW4odD0+dCx0KX1maW5hbGx5KHQpe3JldHVybiBuZXcgSnQoKG4sZSk9PntsZXQgcixvO3JldHVybiB0aGlzLnRoZW4obj0+e289ITEscj1uLHQmJnQoKX0sbj0+e289ITAscj1uLHQmJnQoKX0pLnRoZW4oKCk9PntvP2Uocik6bihyKX0pfSl9Rygpe2lmKDA9PT10aGlzLkwpcmV0dXJuO2NvbnN0IHQ9dGhpcy5NLnNsaWNlKCk7dGhpcy5NPVtdLHQuZm9yRWFjaCh0PT57dFswXXx8KDE9PT10aGlzLkwmJnRbMV0odGhpcy5KKSwyPT09dGhpcy5MJiZ0WzJdKHRoaXMuSiksdFswXT0hMCl9KX1GKHQpe2NvbnN0IG49KHQsbik9PnswPT09dGhpcy5MJiYoaihuKT9uLnRoZW4oZSxyKToodGhpcy5MPXQsdGhpcy5KPW4sdGhpcy5HKCkpKX0sZT10PT57bigxLHQpfSxyPXQ9PntuKDIsdCl9O3RyeXt0KGUscil9Y2F0Y2godCl7cih0KX19fWNvbnN0IFd0PVN5bWJvbC5mb3IoIlNlbnRyeUJ1ZmZlckZ1bGxFcnJvciIpO2Z1bmN0aW9uIFl0KHQ9MTAwKXtjb25zdCBuPW5ldyBTZXQ7ZnVuY3Rpb24gZSh0KXtuLmRlbGV0ZSh0KX1yZXR1cm57Z2V0ICQoKXtyZXR1cm4gQXJyYXkuZnJvbShuKX0sYWRkOmZ1bmN0aW9uKHIpe2lmKCEobi5zaXplPHQpKXJldHVybiBvPVd0LG5ldyBKdCgodCxuKT0+e24obyl9KTt2YXIgbztjb25zdCBpPXIoKTtyZXR1cm4gbi5hZGQoaSksaS50aGVuKCgpPT5lKGkpLCgpPT5lKGkpKSxpfSxkcmFpbjpmdW5jdGlvbih0KXtpZighbi5zaXplKXJldHVybiBlPSEwLG5ldyBKdCh0PT57dChlKX0pO3ZhciBlO2NvbnN0IHI9UHJvbWlzZS5hbGxTZXR0bGVkKEFycmF5LmZyb20obikpLnRoZW4oKCk9PiEwKTtpZighdClyZXR1cm4gcjtjb25zdCBvPVtyLG5ldyBQcm9taXNlKG49PntyZXR1cm4ib2JqZWN0Ij09dHlwZW9mKGU9c2V0VGltZW91dCgoKT0+bighMSksdCkpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS51bnJlZiYmZS51bnJlZigpLGU7dmFyIGV9KV07cmV0dXJuIFByb21pc2UucmFjZShvKX19fWZ1bmN0aW9uIEh0KHQse3N0YXR1c0NvZGU6bixoZWFkZXJzOmV9LHI9UCgpKXtjb25zdCBvPXsuLi50fSxpPWU/LlsieC1zZW50cnktcmF0ZS1saW1pdHMiXSxzPWU/LlsicmV0cnktYWZ0ZXIiXTtpZihpKWZvcihjb25zdCB0IG9mIGkudHJpbSgpLnNwbGl0KCIsIikpe2NvbnN0W24sZSwsLGldPXQuc3BsaXQoIjoiLDUpLHM9cGFyc2VJbnQobiwxMCksYz0xZTMqKGlzTmFOKHMpPzYwOnMpO2lmKGUpZm9yKGNvbnN0IHQgb2YgZS5zcGxpdCgiOyIpKSJtZXRyaWNfYnVja2V0Ij09PXQmJmkmJiFpLnNwbGl0KCI7IikuaW5jbHVkZXMoImN1c3RvbSIpfHwob1t0XT1yK2MpO2Vsc2Ugby5hbGw9citjfWVsc2Ugcz9vLmFsbD1yK2Z1bmN0aW9uKHQsbj1QKCkpe2NvbnN0IGU9cGFyc2VJbnQoYCR7dH1gLDEwKTtpZighaXNOYU4oZSkpcmV0dXJuIDFlMyplO2NvbnN0IHI9RGF0ZS5wYXJzZShgJHt0fWApO3JldHVybiBpc05hTihyKT82ZTQ6ci1ufShzLHIpOjQyOT09PW4mJihvLmFsbD1yKzZlNCk7cmV0dXJuIG99ZnVuY3Rpb24gS3QodCxuLGU9WXQodC5idWZmZXJTaXplfHw2NCkpe2xldCByPXt9O3JldHVybntzZW5kOmZ1bmN0aW9uKHQpe2NvbnN0IG89W107aWYoa3QodCwodCxuKT0+e2NvbnN0IGU9QnQobik7KGZ1bmN0aW9uKHQsbixlPVAoKSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbbl18fHQuYWxsfHwwfSh0LG4pPmV9KShyLGUpfHxvLnB1c2godCl9KSwwPT09by5sZW5ndGgpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7Y29uc3QgaT1UdCh0WzBdLG8pLHM9dD0+eyFmdW5jdGlvbih0LG4pe3JldHVybiBrdCh0LCh0LGUpPT5uLmluY2x1ZGVzKGUpKX0oaSxbImNsaWVudF9yZXBvcnQiXSk/a3QoaSwodCxuKT0+e30pOmgmJncud2FybihgRHJvcHBpbmcgY2xpZW50IHJlcG9ydC4gV2lsbCBub3Qgc2VuZCBvdXRjb21lcyAocmVhc29uOiAke3R9KS5gKX07cmV0dXJuIGUuYWRkKCgpPT5uKHtib2R5OkR0KGkpfSkudGhlbih0PT40MTM9PT10LnN0YXR1c0NvZGU/KGgmJncuZXJyb3IoIlNlbnRyeSByZXNwb25kZWQgd2l0aCBzdGF0dXMgY29kZSA0MTMuIEVudmVsb3BlIHdhcyBkaXNjYXJkZWQgZHVlIHRvIGV4Y2VlZGluZyBzaXplIGxpbWl0cy4iKSxzKCJzZW5kX2Vycm9yIiksdCk6KGgmJnZvaWQgMCE9PXQuc3RhdHVzQ29kZSYmKHQuc3RhdHVzQ29kZTwyMDB8fHQuc3RhdHVzQ29kZT49MzAwKSYmdy53YXJuKGBTZW50cnkgcmVzcG9uZGVkIHdpdGggc3RhdHVzIGNvZGUgJHt0LnN0YXR1c0NvZGV9IHRvIHNlbnQgZXZlbnQuYCkscj1IdChyLHQpLHQpLHQ9Pnt0aHJvdyBzKCJuZXR3b3JrX2Vycm9yIiksaCYmdy5lcnJvcigiRW5jb3VudGVyZWQgZXJyb3IgcnVubmluZyB0cmFuc3BvcnQgcmVxdWVzdDoiLHQpLHR9KSkudGhlbih0PT50LHQ9PntpZih0PT09V3QpcmV0dXJuIGgmJncuZXJyb3IoIlNraXBwZWQgc2VuZGluZyBldmVudCBiZWNhdXNlIGJ1ZmZlciBpcyBmdWxsLiIpLHMoInF1ZXVlX292ZXJmbG93IiksUHJvbWlzZS5yZXNvbHZlKHt9KTt0aHJvdyB0fSl9LGZsdXNoOnQ9PmUuZHJhaW4odCl9fWNvbnN0IFp0PS9eKFxTKzpcXHxcLz8pKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteL1xcXSs/fCkoXC5bXi4vXFxdKnwpKSg/OlsvXFxdKikkLztmdW5jdGlvbiBxdCh0KXtjb25zdCBuPWZ1bmN0aW9uKHQpe2NvbnN0IG49dC5sZW5ndGg+MTAyND9gPHRydW5jYXRlZD4ke3Quc2xpY2UoLTEwMjQpfWA6dCxlPVp0LmV4ZWMobik7cmV0dXJuIGU/ZS5zbGljZSgxKTpbXX0odCksZT1uWzBdfHwiIjtsZXQgcj1uWzFdO3JldHVybiBlfHxyPyhyJiYocj1yLnNsaWNlKDAsci5sZW5ndGgtMSkpLGUrcik6Ii4ifWZ1bmN0aW9uIFZ0KHQsbj0hMSl7cmV0dXJuIShufHx0JiYhdC5zdGFydHNXaXRoKCIvIikmJiF0Lm1hdGNoKC9eW0EtWl06LykmJiF0LnN0YXJ0c1dpdGgoIi4iKSYmIXQubWF0Y2goL15bYS16QS1aXShbYS16QS1aMC05LlwtK10pKjpcL1wvLykpJiZ2b2lkIDAhPT10JiYhdC5pbmNsdWRlcygibm9kZV9tb2R1bGVzLyIpfXZhciBRdDtjb25zdCBYdD1TeW1ib2woIkFnZW50QmFzZUludGVybmFsU3RhdGUiKTtjbGFzcyB0biBleHRlbmRzKFF0PWkuQWdlbnQsUXQpe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXNbWHRdPXt9fWlzU2VjdXJlRW5kcG9pbnQodCl7aWYodCl7aWYoImJvb2xlYW4iPT10eXBlb2YgdC5zZWN1cmVFbmRwb2ludClyZXR1cm4gdC5zZWN1cmVFbmRwb2ludDtpZigic3RyaW5nIj09dHlwZW9mIHQucHJvdG9jb2wpcmV0dXJuImh0dHBzOiI9PT10LnByb3RvY29sfWNvbnN0e3N0YWNrOm59PW5ldyBFcnJvcjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG4mJm4uc3BsaXQoIlxuIikuc29tZSh0PT4tMSE9PXQuaW5kZXhPZigiKGh0dHBzLmpzOiIpfHwtMSE9PXQuaW5kZXhPZigibm9kZTpodHRwczoiKSl9Y3JlYXRlU29ja2V0KHQsbixlKXtjb25zdCByPXsuLi5uLHNlY3VyZUVuZHBvaW50OnRoaXMuaXNTZWN1cmVFbmRwb2ludChuKX07UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+dGhpcy5jb25uZWN0KHQscikpLnRoZW4obz0+e2lmKG8gaW5zdGFuY2VvZiBpLkFnZW50KXJldHVybiBvLmFkZFJlcXVlc3QodCxyKTt0aGlzW1h0XS5jdXJyZW50U29ja2V0PW8sc3VwZXIuY3JlYXRlU29ja2V0KHQsbixlKX0sZSl9Y3JlYXRlQ29ubmVjdGlvbigpe2NvbnN0IHQ9dGhpc1tYdF0uY3VycmVudFNvY2tldDtpZih0aGlzW1h0XS5jdXJyZW50U29ja2V0PXZvaWQgMCwhdCl0aHJvdyBuZXcgRXJyb3IoIk5vIHNvY2tldCB3YXMgcmV0dXJuZWQgaW4gdGhlIGBjb25uZWN0KClgIGZ1bmN0aW9uIik7cmV0dXJuIHR9Z2V0IGRlZmF1bHRQb3J0KCl7cmV0dXJuIHRoaXNbWHRdLmRlZmF1bHRQb3J0Pz8oImh0dHBzOiI9PT10aGlzLnByb3RvY29sPzQ0Mzo4MCl9c2V0IGRlZmF1bHRQb3J0KHQpe3RoaXNbWHRdJiYodGhpc1tYdF0uZGVmYXVsdFBvcnQ9dCl9Z2V0IHByb3RvY29sKCl7cmV0dXJuIHRoaXNbWHRdLnByb3RvY29sPz8odGhpcy5pc1NlY3VyZUVuZHBvaW50KCk/Imh0dHBzOiI6Imh0dHA6Iil9c2V0IHByb3RvY29sKHQpe3RoaXNbWHRdJiYodGhpc1tYdF0ucHJvdG9jb2w9dCl9fWZ1bmN0aW9uIG5uKC4uLnQpe3cubG9nKCJbaHR0cHMtcHJveHktYWdlbnQ6cGFyc2UtcHJveHktcmVzcG9uc2VdIiwuLi50KX1mdW5jdGlvbiBlbih0KXtyZXR1cm4gbmV3IFByb21pc2UoKG4sZSk9PntsZXQgcj0wO2NvbnN0IG89W107ZnVuY3Rpb24gaSgpe2NvbnN0IGM9dC5yZWFkKCk7Yz9mdW5jdGlvbihjKXtvLnB1c2goYykscis9Yy5sZW5ndGg7Y29uc3QgdT1CdWZmZXIuY29uY2F0KG8sciksYT11LmluZGV4T2YoIlxyXG5cclxuIik7aWYoLTE9PT1hKXJldHVybiBubigiaGF2ZSBub3QgcmVjZWl2ZWQgZW5kIG9mIEhUVFAgaGVhZGVycyB5ZXQuLi4iKSx2b2lkIGkoKTtjb25zdCBmPXUuc3ViYXJyYXkoMCxhKS50b1N0cmluZygiYXNjaWkiKS5zcGxpdCgiXHJcbiIpLGg9Zi5zaGlmdCgpO2lmKCFoKXJldHVybiB0LmRlc3Ryb3koKSxlKG5ldyBFcnJvcigiTm8gaGVhZGVyIHJlY2VpdmVkIGZyb20gcHJveHkgQ09OTkVDVCByZXNwb25zZSIpKTtjb25zdCBwPWguc3BsaXQoIiAiKSxkPSsocFsxXXx8MCksbD1wLnNsaWNlKDIpLmpvaW4oIiAiKSxnPXt9O2Zvcihjb25zdCBuIG9mIGYpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9bi5pbmRleE9mKCI6Iik7aWYoLTE9PT1yKXJldHVybiB0LmRlc3Ryb3koKSxlKG5ldyBFcnJvcihgSW52YWxpZCBoZWFkZXIgZnJvbSBwcm94eSBDT05ORUNUIHJlc3BvbnNlOiAiJHtufSJgKSk7Y29uc3Qgbz1uLnNsaWNlKDAscikudG9Mb3dlckNhc2UoKSxpPW4uc2xpY2UocisxKS50cmltU3RhcnQoKSxzPWdbb107InN0cmluZyI9PXR5cGVvZiBzP2dbb109W3MsaV06QXJyYXkuaXNBcnJheShzKT9zLnB1c2goaSk6Z1tvXT1pfW5uKCJnb3QgcHJveHkgc2VydmVyIHJlc3BvbnNlOiAlbyAlbyIsaCxnKSxzKCksbih7Y29ubmVjdDp7c3RhdHVzQ29kZTpkLHN0YXR1c1RleHQ6bCxoZWFkZXJzOmd9LGJ1ZmZlcmVkOnV9KX0oYyk6dC5vbmNlKCJyZWFkYWJsZSIsaSl9ZnVuY3Rpb24gcygpe3QucmVtb3ZlTGlzdGVuZXIoImVuZCIsYyksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLHUpLHQucmVtb3ZlTGlzdGVuZXIoInJlYWRhYmxlIixpKX1mdW5jdGlvbiBjKCl7cygpLG5uKCJvbmVuZCIpLGUobmV3IEVycm9yKCJQcm94eSBjb25uZWN0aW9uIGVuZGVkIGJlZm9yZSByZWNlaXZpbmcgQ09OTkVDVCByZXNwb25zZSIpKX1mdW5jdGlvbiB1KHQpe3MoKSxubigib25lcnJvciAlbyIsdCksZSh0KX10Lm9uKCJlcnJvciIsdSksdC5vbigiZW5kIixjKSxpKCl9KX1mdW5jdGlvbiBybiguLi50KXt3LmxvZygiW2h0dHBzLXByb3h5LWFnZW50XSIsLi4udCl9Y2xhc3Mgb24gZXh0ZW5kcyB0bntjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKG4pLHRoaXMub3B0aW9ucz17fSx0aGlzLnByb3h5PSJzdHJpbmciPT10eXBlb2YgdD9uZXcgVVJMKHQpOnQsdGhpcy5wcm94eUhlYWRlcnM9bj8uaGVhZGVycz8/e30scm4oIkNyZWF0aW5nIG5ldyBIdHRwc1Byb3h5QWdlbnQgaW5zdGFuY2U6ICVvIix0aGlzLnByb3h5LmhyZWYpO2NvbnN0IGU9KHRoaXMucHJveHkuaG9zdG5hbWV8fHRoaXMucHJveHkuaG9zdCkucmVwbGFjZSgvXlxbfFxdJC9nLCIiKSxyPXRoaXMucHJveHkucG9ydD9wYXJzZUludCh0aGlzLnByb3h5LnBvcnQsMTApOiJodHRwczoiPT09dGhpcy5wcm94eS5wcm90b2NvbD80NDM6ODA7dGhpcy5jb25uZWN0T3B0cz17QUxQTlByb3RvY29sczpbImh0dHAvMS4xIl0sLi4ubj9jbihuLCJoZWFkZXJzIik6bnVsbCxob3N0OmUscG9ydDpyfX1hc3luYyBjb25uZWN0KHQsbil7Y29uc3R7cHJveHk6ZX09dGhpcztpZighbi5ob3N0KXRocm93IG5ldyBUeXBlRXJyb3IoJ05vICJob3N0IiBwcm92aWRlZCcpO2xldCByO2lmKCJodHRwczoiPT09ZS5wcm90b2NvbCl7cm4oIkNyZWF0aW5nIGB0bHMuU29ja2V0YDogJW8iLHRoaXMuY29ubmVjdE9wdHMpO2NvbnN0IHQ9dGhpcy5jb25uZWN0T3B0cy5zZXJ2ZXJuYW1lfHx0aGlzLmNvbm5lY3RPcHRzLmhvc3Q7cj1mLmNvbm5lY3Qoey4uLnRoaXMuY29ubmVjdE9wdHMsc2VydmVybmFtZTp0JiZhLmlzSVAodCk/dm9pZCAwOnR9KX1lbHNlIHJuKCJDcmVhdGluZyBgbmV0LlNvY2tldGA6ICVvIix0aGlzLmNvbm5lY3RPcHRzKSxyPWEuY29ubmVjdCh0aGlzLmNvbm5lY3RPcHRzKTtjb25zdCBvPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnByb3h5SGVhZGVycz90aGlzLnByb3h5SGVhZGVycygpOnsuLi50aGlzLnByb3h5SGVhZGVyc30saT1hLmlzSVB2NihuLmhvc3QpP2BbJHtuLmhvc3R9XWA6bi5ob3N0O2xldCBzPWBDT05ORUNUICR7aX06JHtuLnBvcnR9IEhUVFAvMS4xXHJcbmA7aWYoZS51c2VybmFtZXx8ZS5wYXNzd29yZCl7Y29uc3QgdD1gJHtkZWNvZGVVUklDb21wb25lbnQoZS51c2VybmFtZSl9OiR7ZGVjb2RlVVJJQ29tcG9uZW50KGUucGFzc3dvcmQpfWA7b1siUHJveHktQXV0aG9yaXphdGlvbiJdPWBCYXNpYyAke0J1ZmZlci5mcm9tKHQpLnRvU3RyaW5nKCJiYXNlNjQiKX1gfW8uSG9zdD1gJHtpfToke24ucG9ydH1gLG9bIlByb3h5LUNvbm5lY3Rpb24iXXx8KG9bIlByb3h5LUNvbm5lY3Rpb24iXT10aGlzLmtlZXBBbGl2ZT8iS2VlcC1BbGl2ZSI6ImNsb3NlIik7Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmtleXMobykpcys9YCR7dH06ICR7b1t0XX1cclxuYDtjb25zdCBjPWVuKHIpO3Iud3JpdGUoYCR7c31cclxuYCk7Y29uc3R7Y29ubmVjdDp1LGJ1ZmZlcmVkOmh9PWF3YWl0IGM7aWYodC5lbWl0KCJwcm94eUNvbm5lY3QiLHUpLHRoaXMuZW1pdCgicHJveHlDb25uZWN0Iix1LHQpLDIwMD09PXUuc3RhdHVzQ29kZSl7aWYodC5vbmNlKCJzb2NrZXQiLHNuKSxuLnNlY3VyZUVuZHBvaW50KXtybigiVXBncmFkaW5nIHNvY2tldCBjb25uZWN0aW9uIHRvIFRMUyIpO2NvbnN0IHQ9bi5zZXJ2ZXJuYW1lfHxuLmhvc3Q7cmV0dXJuIGYuY29ubmVjdCh7Li4uY24obiwiaG9zdCIsInBhdGgiLCJwb3J0Iiksc29ja2V0OnIsc2VydmVybmFtZTphLmlzSVAodCk/dm9pZCAwOnR9KX1yZXR1cm4gcn1yLmRlc3Ryb3koKTtjb25zdCBwPW5ldyBhLlNvY2tldCh7d3JpdGFibGU6ITF9KTtyZXR1cm4gcC5yZWFkYWJsZT0hMCx0Lm9uY2UoInNvY2tldCIsdD0+e3JuKCJSZXBsYXlpbmcgcHJveHkgYnVmZmVyIGZvciBmYWlsZWQgcmVxdWVzdCIpLHQucHVzaChoKSx0LnB1c2gobnVsbCl9KSxwfX1mdW5jdGlvbiBzbih0KXt0LnJlc3VtZSgpfWZ1bmN0aW9uIGNuKHQsLi4ubil7Y29uc3QgZT17fTtsZXQgcjtmb3IociBpbiB0KW4uaW5jbHVkZXMocil8fChlW3JdPXRbcl0pO3JldHVybiBlfW9uLnByb3RvY29scz1bImh0dHAiLCJodHRwcyJdO2Z1bmN0aW9uIHVuKHQpe3JldHVybiB0LnJlcGxhY2UoL15bQS1aXTovLCIiKS5yZXBsYWNlKC9cXC9nLCIvIil9Y29uc3QgYW49bjtsZXQgZm4saG49MCxwbj17fTtmdW5jdGlvbiBkbih0KXthbi5kZWJ1ZyYmY29uc29sZS5sb2coYFtBTlIgV29ya2VyXSAke3R9YCl9dmFyIGxuLGduLG1uO2NvbnN0IHluPWZ1bmN0aW9uKHQpe2xldCBuO3RyeXtuPW5ldyBVUkwodC51cmwpfWNhdGNoKG4pe3JldHVybiBiKCgpPT57Y29uc29sZS53YXJuKCJbQHNlbnRyeS9ub2RlXTogSW52YWxpZCBkc24gb3IgdHVubmVsIG9wdGlvbiwgd2lsbCBub3Qgc2VuZCBhbnkgZXZlbnRzLiBUaGUgdHVubmVsIG9wdGlvbiBtdXN0IGJlIGEgZnVsbCBVUkwgd2hlbiB1c2VkLiIpfSksS3QodCwoKT0+UHJvbWlzZS5yZXNvbHZlKHt9KSl9Y29uc3QgZT0iaHR0cHM6Ij09PW4ucHJvdG9jb2wscj1mdW5jdGlvbih0LG4pe2NvbnN0e25vX3Byb3h5OmV9PXByb2Nlc3MuZW52LHI9ZT8uc3BsaXQoIiwiKS5zb21lKG49PnQuaG9zdC5lbmRzV2l0aChuKXx8dC5ob3N0bmFtZS5lbmRzV2l0aChuKSk7cmV0dXJuIHI/dm9pZCAwOm59KG4sdC5wcm94eXx8KGU/cHJvY2Vzcy5lbnYuaHR0cHNfcHJveHk6dm9pZCAwKXx8cHJvY2Vzcy5lbnYuaHR0cF9wcm94eSksbz1lP3M6aSxhPXZvaWQgMCE9PXQua2VlcEFsaXZlJiZ0LmtlZXBBbGl2ZSxmPXI/bmV3IG9uKHIpOm5ldyBvLkFnZW50KHtrZWVwQWxpdmU6YSxtYXhTb2NrZXRzOjMwLHRpbWVvdXQ6MmUzfSksaD1mdW5jdGlvbih0LG4sZSl7Y29uc3R7aG9zdG5hbWU6cixwYXRobmFtZTpvLHBvcnQ6aSxwcm90b2NvbDpzLHNlYXJjaDphfT1uZXcgVVJMKHQudXJsKTtyZXR1cm4gZnVuY3Rpb24oZil7cmV0dXJuIG5ldyBQcm9taXNlKChoLHApPT57RnQoKCk9PntsZXQgZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGMoe3JlYWQoKXt0aGlzLnB1c2godCksdGhpcy5wdXNoKG51bGwpfX0pfShmLmJvZHkpO2NvbnN0IGw9ey4uLnQuaGVhZGVyc307Zi5ib2R5Lmxlbmd0aD4zMjc2OCYmKGxbImNvbnRlbnQtZW5jb2RpbmciXT0iZ3ppcCIsZD1kLnBpcGUodSgpKSk7Y29uc3QgZz1yLnN0YXJ0c1dpdGgoIlsiKSxtPW4ucmVxdWVzdCh7bWV0aG9kOiJQT1NUIixhZ2VudDplLGhlYWRlcnM6bCxob3N0bmFtZTpnP3Iuc2xpY2UoMSwtMSk6cixwYXRoOmAke299JHthfWAscG9ydDppLHByb3RvY29sOnMsY2E6dC5jYUNlcnRzfSx0PT57dC5vbigiZGF0YSIsKCk9Pnt9KSx0Lm9uKCJlbmQiLCgpPT57fSksdC5zZXRFbmNvZGluZygidXRmOCIpO2NvbnN0IG49dC5oZWFkZXJzWyJyZXRyeS1hZnRlciJdPz9udWxsLGU9dC5oZWFkZXJzWyJ4LXNlbnRyeS1yYXRlLWxpbWl0cyJdPz9udWxsO2goe3N0YXR1c0NvZGU6dC5zdGF0dXNDb2RlLGhlYWRlcnM6eyJyZXRyeS1hZnRlciI6biwieC1zZW50cnktcmF0ZS1saW1pdHMiOkFycmF5LmlzQXJyYXkoZSk/ZVswXXx8bnVsbDplfX0pfSk7bS5vbigiZXJyb3IiLHApLGQucGlwZShtKX0pfSl9fSh0LHQuaHR0cE1vZHVsZT8/byxmKTtyZXR1cm4gS3QodCxoKX0oe3VybDoobG49YW4uZHNuLGduPWFuLnR1bm5lbCxtbj1hbi5zZGtNZXRhZGF0YS5zZGssZ258fGAke2Z1bmN0aW9uKHQpe3JldHVybmAke2Z1bmN0aW9uKHQpe2NvbnN0IG49dC5wcm90b2NvbD9gJHt0LnByb3RvY29sfTpgOiIiLGU9dC5wb3J0P2A6JHt0LnBvcnR9YDoiIjtyZXR1cm5gJHtufS8vJHt0Lmhvc3R9JHtlfSR7dC5wYXRoP2AvJHt0LnBhdGh9YDoiIn0vYXBpL2B9KHQpfSR7dC5wcm9qZWN0SWR9L2VudmVsb3BlL2B9KGxuKX0/JHtmdW5jdGlvbih0LG4pe2NvbnN0IGU9e3NlbnRyeV92ZXJzaW9uOiI3In07cmV0dXJuIHQucHVibGljS2V5JiYoZS5zZW50cnlfa2V5PXQucHVibGljS2V5KSxuJiYoZS5zZW50cnlfY2xpZW50PWAke24ubmFtZX0vJHtuLnZlcnNpb259YCksbmV3IFVSTFNlYXJjaFBhcmFtcyhlKS50b1N0cmluZygpfShsbixtbil9YCl9KTthc3luYyBmdW5jdGlvbiBibigpe2lmKGZuKXtkbigiU2VuZGluZyBhYm5vcm1hbCBzZXNzaW9uIiksSyhmbix7c3RhdHVzOiJhYm5vcm1hbCIsYWJub3JtYWxfbWVjaGFuaXNtOiJhbnJfZm9yZWdyb3VuZCIscmVsZWFzZTphbi5yZWxlYXNlLGVudmlyb25tZW50OmFuLmVudmlyb25tZW50fSk7Y29uc3QgdD1mdW5jdGlvbih0LG4sZSxyKXtjb25zdCBvPUx0KGUpO3JldHVybiBUdCh7c2VudF9hdDpuZXcgRGF0ZShQKCkpLnRvSVNPU3RyaW5nKCksLi4ubyYme3NkazpvfSwuLi4hIXImJm4mJntkc246YnQobil9fSxbImFnZ3JlZ2F0ZXMiaW4gdD9be3R5cGU6InNlc3Npb25zIn0sdF06W3t0eXBlOiJzZXNzaW9uIn0sdC50b0pTT04oKV1dKX0oZm4sYW4uZHNuLGFuLnNka01ldGFkYXRhLGFuLnR1bm5lbCk7ZG4oSlNPTi5zdHJpbmdpZnkodCkpLGF3YWl0IHluLnNlbmQodCk7dHJ5e2U/LnBvc3RNZXNzYWdlKCJzZXNzaW9uLWVuZGVkIil9Y2F0Y2h7fX19ZnVuY3Rpb24gdm4odCl7aWYoIXQpcmV0dXJuO2NvbnN0IG49ZnVuY3Rpb24odCl7aWYoIXQubGVuZ3RoKXJldHVybltdO2NvbnN0IG49QXJyYXkuZnJvbSh0KTtyZXR1cm4vc2VudHJ5V3JhcHBlZC8udGVzdChFKG4pLmZ1bmN0aW9ufHwiIikmJm4ucG9wKCksbi5yZXZlcnNlKCksJC50ZXN0KEUobikuZnVuY3Rpb258fCIiKSYmKG4ucG9wKCksJC50ZXN0KEUobikuZnVuY3Rpb258fCIiKSYmbi5wb3AoKSksbi5zbGljZSgwLDUwKS5tYXAodD0+KHsuLi50LGZpbGVuYW1lOnQuZmlsZW5hbWV8fEUobikuZmlsZW5hbWUsZnVuY3Rpb246dC5mdW5jdGlvbnx8Ij8ifSkpfSh0KTtpZihhbi5hcHBSb290UGF0aClmb3IoY29uc3QgdCBvZiBuKXQuZmlsZW5hbWUmJih0LmZpbGVuYW1lPU0odC5maWxlbmFtZSxhbi5hcHBSb290UGF0aCkpO3JldHVybiBufWFzeW5jIGZ1bmN0aW9uIF9uKHQsbil7aWYoaG4+PWFuLm1heEFuckV2ZW50cylyZXR1cm47aG4rPTEsYXdhaXQgYm4oKSxkbigiU2VuZGluZyBldmVudCIpO2NvbnN0IGU9e2V2ZW50X2lkOkcoKSxjb250ZXh0czphbi5jb250ZXh0cyxyZWxlYXNlOmFuLnJlbGVhc2UsZW52aXJvbm1lbnQ6YW4uZW52aXJvbm1lbnQsZGlzdDphbi5kaXN0LHBsYXRmb3JtOiJub2RlIixsZXZlbDoiZXJyb3IiLGV4Y2VwdGlvbjp7dmFsdWVzOlt7dHlwZToiQXBwbGljYXRpb25Ob3RSZXNwb25kaW5nIix2YWx1ZTpgQXBwbGljYXRpb24gTm90IFJlc3BvbmRpbmcgZm9yIGF0IGxlYXN0ICR7YW4uYW5yVGhyZXNob2xkfSBtc2Asc3RhY2t0cmFjZTp7ZnJhbWVzOnZuKHQpfSxtZWNoYW5pc206e3R5cGU6IkFOUiJ9fV19LHRhZ3M6YW4uc3RhdGljVGFnc307biYmZnVuY3Rpb24odCxuKXtpZihHdCh0LG4pLCF0LmNvbnRleHRzPy50cmFjZSl7Y29uc3R7dHJhY2VJZDplLHBhcmVudFNwYW5JZDpyLHByb3BhZ2F0aW9uU3BhbklkOm99PW4ucHJvcGFnYXRpb25Db250ZXh0O3QuY29udGV4dHM9e3RyYWNlOnt0cmFjZV9pZDplLHNwYW5faWQ6b3x8VigpLHBhcmVudF9zcGFuX2lkOnJ9LC4uLnQuY29udGV4dHN9fX0oZSxuKSxmdW5jdGlvbih0KXtpZigwPT09T2JqZWN0LmtleXMocG4pLmxlbmd0aClyZXR1cm47Y29uc3Qgbj1hbi5hcHBSb290UGF0aD97fTpwbjtpZihhbi5hcHBSb290UGF0aClmb3IoY29uc3RbdCxlXW9mIE9iamVjdC5lbnRyaWVzKHBuKSluW00odCxhbi5hcHBSb290UGF0aCldPWU7Y29uc3QgZT1uZXcgTWFwO2Zvcihjb25zdCByIG9mIHQuZXhjZXB0aW9uPy52YWx1ZXN8fFtdKWZvcihjb25zdCB0IG9mIHIuc3RhY2t0cmFjZT8uZnJhbWVzfHxbXSl7Y29uc3Qgcj10LmFic19wYXRofHx0LmZpbGVuYW1lO3ImJm5bcl0mJmUuc2V0KHIsbltyXSl9aWYoZS5zaXplPjApe2NvbnN0IG49W107Zm9yKGNvbnN0W3Qscl1vZiBlLmVudHJpZXMoKSluLnB1c2goe3R5cGU6InNvdXJjZW1hcCIsY29kZV9maWxlOnQsZGVidWdfaWQ6cn0pO3QuZGVidWdfbWV0YT17aW1hZ2VzOm59fX0oZSk7Y29uc3Qgcj1NdChlLGFuLmRzbixhbi5zZGtNZXRhZGF0YSxhbi50dW5uZWwpO2RuKEpTT04uc3RyaW5naWZ5KHIpKSxhd2FpdCB5bi5zZW5kKHIpLGF3YWl0IHluLmZsdXNoKDJlMyksaG4+PWFuLm1heEFuckV2ZW50cyYmc2V0VGltZW91dCgoKT0+e3Byb2Nlc3MuZXhpdCgwKX0sNWUzKX1sZXQgU247aWYoZG4oIlN0YXJ0ZWQiKSxhbi5jYXB0dXJlU3RhY2tUcmFjZSl7ZG4oIkNvbm5lY3RpbmcgdG8gZGVidWdnZXIiKTtjb25zdCBuPW5ldyB0O24uY29ubmVjdFRvTWFpblRocmVhZCgpLGRuKCJDb25uZWN0ZWQgdG8gZGVidWdnZXIiKTtjb25zdCBlPW5ldyBNYXA7bi5vbigiRGVidWdnZXIuc2NyaXB0UGFyc2VkIix0PT57ZS5zZXQodC5wYXJhbXMuc2NyaXB0SWQsdC5wYXJhbXMudXJsKX0pLG4ub24oIkRlYnVnZ2VyLnBhdXNlZCIsdD0+e2lmKCJvdGhlciI9PT10LnBhcmFtcy5yZWFzb24pdHJ5e2RuKCJEZWJ1Z2dlciBwYXVzZWQiKTtjb25zdCBpPVsuLi50LnBhcmFtcy5jYWxsRnJhbWVzXSxzPWFuLmFwcFJvb3RQYXRoP2Z1bmN0aW9uKHQ9KHByb2Nlc3MuYXJndlsxXT9xdChwcm9jZXNzLmFyZ3ZbMV0pOnByb2Nlc3MuY3dkKCkpLG49IlxcIj09PW8pe2NvbnN0IGU9bj91bih0KTp0O3JldHVybiB0PT57aWYoIXQpcmV0dXJuO2NvbnN0IG89bj91bih0KTp0O2xldHtkaXI6aSxiYXNlOnMsZXh0OmN9PXIucGFyc2Uobyk7Ii5qcyIhPT1jJiYiLm1qcyIhPT1jJiYiLmNqcyIhPT1jfHwocz1zLnNsaWNlKDAsLTEqYy5sZW5ndGgpKTtjb25zdCB1PWRlY29kZVVSSUNvbXBvbmVudChzKTtpfHwoaT0iLiIpO2NvbnN0IGE9aS5sYXN0SW5kZXhPZigiL25vZGVfbW9kdWxlcyIpO2lmKGE+LTEpcmV0dXJuYCR7aS5zbGljZShhKzE0KS5yZXBsYWNlKC9cLy9nLCIuIil9OiR7dX1gO2lmKGkuc3RhcnRzV2l0aChlKSl7Y29uc3QgdD1pLnNsaWNlKGUubGVuZ3RoKzEpLnJlcGxhY2UoL1wvL2csIi4iKTtyZXR1cm4gdD9gJHt0fToke3V9YDp1fXJldHVybiB1fX0oYW4uYXBwUm9vdFBhdGgpOigpPT57fSxjPWkubWFwKHQ9PmZ1bmN0aW9uKHQsbixlKXtjb25zdCByPW4/bi5yZXBsYWNlKC9eZmlsZTpcL1wvLywiIik6dm9pZCAwLG89dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXI/dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXIrMTp2b2lkIDAsaT10LmxvY2F0aW9uLmxpbmVOdW1iZXI/dC5sb2NhdGlvbi5saW5lTnVtYmVyKzE6dm9pZCAwO3JldHVybntmaWxlbmFtZTpyLG1vZHVsZTplKHIpLGZ1bmN0aW9uOnQuZnVuY3Rpb25OYW1lfHwiPyIsY29sbm86byxsaW5lbm86aSxpbl9hcHA6cj9WdChyKTp2b2lkIDB9fSh0LGUuZ2V0KHQubG9jYXRpb24uc2NyaXB0SWQpLHMpKSx1PXNldFRpbWVvdXQoKCk9PntfbihjKS50aGVuKG51bGwsKCk9PntkbigiU2VuZGluZyBBTlIgZXZlbnQgZmFpbGVkLiIpfSl9LDVlMyk7bi5wb3N0KCJSdW50aW1lLmV2YWx1YXRlIix7ZXhwcmVzc2lvbjoiZ2xvYmFsLl9fU0VOVFJZX0dFVF9TQ09QRVNfXygpOyIsc2lsZW50OiEwLHJldHVybkJ5VmFsdWU6ITB9LCh0LGUpPT57dCYmZG4oYEVycm9yIGV4ZWN1dGluZyBzY3JpcHQ6ICcke3QubWVzc2FnZX0nYCksY2xlYXJUaW1lb3V0KHUpO2NvbnN0IHI9ZT8ucmVzdWx0P2UucmVzdWx0LnZhbHVlOnZvaWQgMDtuLnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpLG4ucG9zdCgiRGVidWdnZXIuZGlzYWJsZSIpLF9uKGMscikudGhlbihudWxsLCgpPT57ZG4oIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZC4iKX0pfSl9Y2F0Y2godCl7dGhyb3cgbi5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKSxuLnBvc3QoIkRlYnVnZ2VyLmRpc2FibGUiKSx0fX0pLFNuPSgpPT57dHJ5e24ucG9zdCgiRGVidWdnZXIuZW5hYmxlIiwoKT0+e24ucG9zdCgiRGVidWdnZXIucGF1c2UiKX0pfWNhdGNoe319fWNvbnN0e3BvbGw6d259PWZ1bmN0aW9uKHQsbixlLHIpe2NvbnN0IG89dCgpO2xldCBpPSExLHM9ITA7cmV0dXJuIHNldEludGVydmFsKCgpPT57Y29uc3QgdD1vLmdldFRpbWVNcygpOyExPT09aSYmdD5uK2UmJihpPSEwLHMmJnIoKSksdDxuK2UmJihpPSExKX0sMjApLHtwb2xsOigpPT57by5yZXNldCgpfSxlbmFibGVkOnQ9PntzPXR9fX0oZnVuY3Rpb24oKXtsZXQgdD1wcm9jZXNzLmhydGltZSgpO3JldHVybntnZXRUaW1lTXM6KCk9Pntjb25zdFtuLGVdPXByb2Nlc3MuaHJ0aW1lKHQpO3JldHVybiBNYXRoLmZsb29yKDFlMypuK2UvMWU2KX0scmVzZXQ6KCk9Pnt0PXByb2Nlc3MuaHJ0aW1lKCl9fX0sYW4ucG9sbEludGVydmFsLGFuLmFuclRocmVzaG9sZCxmdW5jdGlvbigpe2RuKCJXYXRjaGRvZyB0aW1lb3V0IiksU24/KGRuKCJQYXVzaW5nIGRlYnVnZ2VyIHRvIGNhcHR1cmUgc3RhY2sgdHJhY2UiKSxTbigpKTooZG4oIkNhcHR1cmluZyBldmVudCB3aXRob3V0IGEgc3RhY2sgdHJhY2UiKSxfbigpLnRoZW4obnVsbCwoKT0+e2RuKCJTZW5kaW5nIEFOUiBldmVudCBmYWlsZWQgb24gd2F0Y2hkb2cgdGltZW91dC4iKX0pKX0pO2U/Lm9uKCJtZXNzYWdlIix0PT57dC5zZXNzaW9uJiYoZm49SCh0LnNlc3Npb24pKSx0LmRlYnVnSW1hZ2VzJiYocG49dC5kZWJ1Z0ltYWdlcyksd24oKX0pOw==";
11
11
  const DEFAULT_INTERVAL = 50;
12
12
  const DEFAULT_HANG_THRESHOLD = 5e3;
13
13
  function log(message, ...args) {
@@ -57,13 +57,16 @@ const _httpServerSpansIntegration = ((options = {}) => {
57
57
  [core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "http.server",
58
58
  [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.http.otel.http",
59
59
  [attributes.SENTRY_HTTP_PREFETCH]: isKnownPrefetchRequest(request) || void 0,
60
- [attributes.URL_FULL]: urlObj && !core.isURLObjectRelative(urlObj) ? urlObj.href : void 0,
60
+ [attributes.URL_FULL]: urlObj && !core.isURLObjectRelative(urlObj) ? core.filterCollectedUrl(urlObj.href, client) : void 0,
61
61
  [attributes.URL_PATH]: urlObj?.pathname ?? httpTargetWithoutQueryFragment,
62
62
  // Old Semantic Conventions attributes - added for compatibility with what `@opentelemetry/instrumentation-http` output before
63
63
  /* eslint-disable typescript/no-deprecated */
64
- [attributes.HTTP_URL]: fullUrl,
64
+ [attributes.HTTP_URL]: core.filterCollectedUrl(fullUrl, client),
65
65
  [attributes.HTTP_METHOD]: normalizedRequest.method,
66
- [attributes.HTTP_TARGET]: urlObj ? `${urlObj.pathname}${urlObj.search}` : httpTargetWithoutQueryFragment,
66
+ [attributes.HTTP_TARGET]: core.filterCollectedUrl(
67
+ urlObj ? `${urlObj.pathname}${urlObj.search}` : httpTargetWithoutQueryFragment,
68
+ client
69
+ ),
67
70
  [attributes.HTTP_HOST]: host,
68
71
  [attributes.NET_HOST_NAME]: hostname,
69
72
  [attributes.HTTP_CLIENT_IP]: typeof ips === "string" ? ips.split(",")[0] : void 0,
@@ -5,7 +5,7 @@ const core = require('@sentry/core');
5
5
  const debug = require('../../utils/debug.js');
6
6
  const common = require('./common.js');
7
7
 
8
- const base64WorkerScript = "LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjc1LjEgKDgwMjVhOTIpIHwgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdCAqLwppbXBvcnR7U2Vzc2lvbiBhcyBlfWZyb20ibm9kZTppbnNwZWN0b3IvcHJvbWlzZXMiO2ltcG9ydHt3b3JrZXJEYXRhIGFzIHR9ZnJvbSJub2RlOndvcmtlcl90aHJlYWRzIjtjb25zdCBuPWdsb2JhbFRoaXMsaT17fTtjb25zdCBvPSJfX1NFTlRSWV9FUlJPUl9MT0NBTF9WQVJJQUJMRVNfXyI7Y29uc3QgYT10O2Z1bmN0aW9uIHMoLi4uZSl7YS5kZWJ1ZyYmZnVuY3Rpb24oZSl7aWYoISgiY29uc29sZSJpbiBuKSlyZXR1cm4gZSgpO2NvbnN0IHQ9bi5jb25zb2xlLG89e30sYT1PYmplY3Qua2V5cyhpKTthLmZvckVhY2goZT0+e2NvbnN0IG49aVtlXTtvW2VdPXRbZV0sdFtlXT1ufSk7dHJ5e3JldHVybiBlKCl9ZmluYWxseXthLmZvckVhY2goZT0+e3RbZV09b1tlXX0pfX0oKCk9PmNvbnNvbGUubG9nKCJbTG9jYWxWYXJpYWJsZXMgV29ya2VyXSIsLi4uZSkpfWFzeW5jIGZ1bmN0aW9uIGMoZSx0LG4saSl7Y29uc3Qgbz1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuZ2V0UHJvcGVydGllcyIse29iamVjdElkOnQsb3duUHJvcGVydGllczohMH0pO2lbbl09by5yZXN1bHQuZmlsdGVyKGU9PiJsZW5ndGgiIT09ZS5uYW1lJiYhaXNOYU4ocGFyc2VJbnQoZS5uYW1lLDEwKSkpLnNvcnQoKGUsdCk9PnBhcnNlSW50KGUubmFtZSwxMCktcGFyc2VJbnQodC5uYW1lLDEwKSkubWFwKGU9PmUudmFsdWU/LnZhbHVlKX1hc3luYyBmdW5jdGlvbiByKGUsdCxuLGkpe2NvbnN0IG89YXdhaXQgZS5wb3N0KCJSdW50aW1lLmdldFByb3BlcnRpZXMiLHtvYmplY3RJZDp0LG93blByb3BlcnRpZXM6ITB9KTtpW25dPW8ucmVzdWx0Lm1hcChlPT5bZS5uYW1lLGUudmFsdWU/LnZhbHVlXSkucmVkdWNlKChlLFt0LG5dKT0+KGVbdF09bixlKSx7fSl9ZnVuY3Rpb24gdShlLHQpe2UudmFsdWUmJigidmFsdWUiaW4gZS52YWx1ZT92b2lkIDA9PT1lLnZhbHVlLnZhbHVlfHxudWxsPT09ZS52YWx1ZS52YWx1ZT90W2UubmFtZV09YDwke2UudmFsdWUudmFsdWV9PmA6dFtlLm5hbWVdPWUudmFsdWUudmFsdWU6ImRlc2NyaXB0aW9uImluIGUudmFsdWUmJiJmdW5jdGlvbiIhPT1lLnZhbHVlLnR5cGU/dFtlLm5hbWVdPWA8JHtlLnZhbHVlLmRlc2NyaXB0aW9ufT5gOiJ1bmRlZmluZWQiPT09ZS52YWx1ZS50eXBlJiYodFtlLm5hbWVdPSI8dW5kZWZpbmVkPiIpKX1hc3luYyBmdW5jdGlvbiBsKGUsdCl7Y29uc3Qgbj1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuZ2V0UHJvcGVydGllcyIse29iamVjdElkOnQsb3duUHJvcGVydGllczohMH0pLGk9e307Zm9yKGNvbnN0IHQgb2Ygbi5yZXN1bHQpaWYodC52YWx1ZT8ub2JqZWN0SWQmJiJBcnJheSI9PT10LnZhbHVlLmNsYXNzTmFtZSl7Y29uc3Qgbj10LnZhbHVlLm9iamVjdElkO2F3YWl0IGMoZSxuLHQubmFtZSxpKX1lbHNlIGlmKHQudmFsdWU/Lm9iamVjdElkJiYiT2JqZWN0Ij09PXQudmFsdWUuY2xhc3NOYW1lKXtjb25zdCBuPXQudmFsdWUub2JqZWN0SWQ7YXdhaXQgcihlLG4sdC5uYW1lLGkpfWVsc2UgdC52YWx1ZSYmdSh0LGkpO3JldHVybiBpfWxldCBmOyhhc3luYyBmdW5jdGlvbigpe2NvbnN0IHQ9bmV3IGU7dC5jb25uZWN0VG9NYWluVGhyZWFkKCkscygiQ29ubmVjdGVkIHRvIG1haW4gdGhyZWFkIik7bGV0IG49ITE7dC5vbigiRGVidWdnZXIucmVzdW1lZCIsKCk9PntuPSExfSksdC5vbigiRGVidWdnZXIucGF1c2VkIixlPT57bj0hMCxhc3luYyBmdW5jdGlvbihlLHtyZWFzb246dCxkYXRhOntvYmplY3RJZDpufSxjYWxsRnJhbWVzOml9KXtpZigiZXhjZXB0aW9uIiE9PXQmJiJwcm9taXNlUmVqZWN0aW9uIiE9PXQpcmV0dXJuO2lmKGY/LigpLG51bGw9PW4pcmV0dXJuO2NvbnN0IGE9W107Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0e3Njb3BlQ2hhaW46bixmdW5jdGlvbk5hbWU6byx0aGlzOnN9PWlbdF0sYz1uLmZpbmQoZT0+ImxvY2FsIj09PWUudHlwZSkscj0iZ2xvYmFsIiE9PXMuY2xhc3NOYW1lJiZzLmNsYXNzTmFtZT9gJHtzLmNsYXNzTmFtZX0uJHtvfWA6bztpZih2b2lkIDA9PT1jPy5vYmplY3Qub2JqZWN0SWQpYVt0XT17ZnVuY3Rpb246cn07ZWxzZXtjb25zdCBuPWF3YWl0IGwoZSxjLm9iamVjdC5vYmplY3RJZCk7YVt0XT17ZnVuY3Rpb246cix2YXJzOm59fX1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuY2FsbEZ1bmN0aW9uT24iLHtmdW5jdGlvbkRlY2xhcmF0aW9uOmBmdW5jdGlvbigpIHsgdGhpcy4ke299ID0gdGhpcy4ke299IHx8ICR7SlNPTi5zdHJpbmdpZnkoYSl9OyB9YCxzaWxlbnQ6ITAsb2JqZWN0SWQ6bn0pLGF3YWl0IGUucG9zdCgiUnVudGltZS5yZWxlYXNlT2JqZWN0Iix7b2JqZWN0SWQ6bn0pfSh0LGUucGFyYW1zKS50aGVuKGFzeW5jKCk9PntuJiZhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpfSxhc3luYyBlPT57biYmYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKX0pfSksYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5lbmFibGUiKTtjb25zdCBpPSExIT09YS5jYXB0dXJlQWxsRXhjZXB0aW9ucztpZihhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zIix7c3RhdGU6aT8iYWxsIjoidW5jYXVnaHQifSksaSl7Y29uc3QgZT1hLm1heEV4Y2VwdGlvbnNQZXJTZWNvbmR8fDUwO2Y9ZnVuY3Rpb24oZSx0LG4pe2xldCBpPTAsbz01LGE9MDtyZXR1cm4gc2V0SW50ZXJ2YWwoKCk9PnswPT09YT9pPmUmJihvKj0yLG4obyksbz44NjQwMCYmKG89ODY0MDApLGE9byk6KGEtPTEsMD09PWEmJnQoKSksaT0wfSwxZTMpLnVucmVmKCksKCk9PntpKz0xfX0oZSxhc3luYygpPT57cygiUmF0ZS1saW1pdCBsaWZ0ZWQuIiksYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyIse3N0YXRlOiJhbGwifSl9LGFzeW5jIGU9PntzKGBSYXRlLWxpbWl0IGV4Y2VlZGVkLiBEaXNhYmxpbmcgY2FwdHVyaW5nIG9mIGNhdWdodCBleGNlcHRpb25zIGZvciAke2V9IHNlY29uZHMuYCksYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyIse3N0YXRlOiJ1bmNhdWdodCJ9KX0pfX0pKCkuY2F0Y2goZT0+e3MoIkZhaWxlZCB0byBzdGFydCBkZWJ1Z2dlciIsZSl9KSxzZXRJbnRlcnZhbCgoKT0+e30sMWU0KTs=";
8
+ const base64WorkerScript = "LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjc2LjAgKDBlMGI1Y2EpIHwgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdCAqLwppbXBvcnR7U2Vzc2lvbiBhcyBlfWZyb20ibm9kZTppbnNwZWN0b3IvcHJvbWlzZXMiO2ltcG9ydHt3b3JrZXJEYXRhIGFzIHR9ZnJvbSJub2RlOndvcmtlcl90aHJlYWRzIjtjb25zdCBuPWdsb2JhbFRoaXMsaT17fTtjb25zdCBvPSJfX1NFTlRSWV9FUlJPUl9MT0NBTF9WQVJJQUJMRVNfXyI7Y29uc3QgYT10O2Z1bmN0aW9uIHMoLi4uZSl7YS5kZWJ1ZyYmZnVuY3Rpb24oZSl7aWYoISgiY29uc29sZSJpbiBuKSlyZXR1cm4gZSgpO2NvbnN0IHQ9bi5jb25zb2xlLG89e30sYT1PYmplY3Qua2V5cyhpKTthLmZvckVhY2goZT0+e2NvbnN0IG49aVtlXTtvW2VdPXRbZV0sdFtlXT1ufSk7dHJ5e3JldHVybiBlKCl9ZmluYWxseXthLmZvckVhY2goZT0+e3RbZV09b1tlXX0pfX0oKCk9PmNvbnNvbGUubG9nKCJbTG9jYWxWYXJpYWJsZXMgV29ya2VyXSIsLi4uZSkpfWFzeW5jIGZ1bmN0aW9uIGMoZSx0LG4saSl7Y29uc3Qgbz1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuZ2V0UHJvcGVydGllcyIse29iamVjdElkOnQsb3duUHJvcGVydGllczohMH0pO2lbbl09by5yZXN1bHQuZmlsdGVyKGU9PiJsZW5ndGgiIT09ZS5uYW1lJiYhaXNOYU4ocGFyc2VJbnQoZS5uYW1lLDEwKSkpLnNvcnQoKGUsdCk9PnBhcnNlSW50KGUubmFtZSwxMCktcGFyc2VJbnQodC5uYW1lLDEwKSkubWFwKGU9PmUudmFsdWU/LnZhbHVlKX1hc3luYyBmdW5jdGlvbiByKGUsdCxuLGkpe2NvbnN0IG89YXdhaXQgZS5wb3N0KCJSdW50aW1lLmdldFByb3BlcnRpZXMiLHtvYmplY3RJZDp0LG93blByb3BlcnRpZXM6ITB9KTtpW25dPW8ucmVzdWx0Lm1hcChlPT5bZS5uYW1lLGUudmFsdWU/LnZhbHVlXSkucmVkdWNlKChlLFt0LG5dKT0+KGVbdF09bixlKSx7fSl9ZnVuY3Rpb24gdShlLHQpe2UudmFsdWUmJigidmFsdWUiaW4gZS52YWx1ZT92b2lkIDA9PT1lLnZhbHVlLnZhbHVlfHxudWxsPT09ZS52YWx1ZS52YWx1ZT90W2UubmFtZV09YDwke2UudmFsdWUudmFsdWV9PmA6dFtlLm5hbWVdPWUudmFsdWUudmFsdWU6ImRlc2NyaXB0aW9uImluIGUudmFsdWUmJiJmdW5jdGlvbiIhPT1lLnZhbHVlLnR5cGU/dFtlLm5hbWVdPWA8JHtlLnZhbHVlLmRlc2NyaXB0aW9ufT5gOiJ1bmRlZmluZWQiPT09ZS52YWx1ZS50eXBlJiYodFtlLm5hbWVdPSI8dW5kZWZpbmVkPiIpKX1hc3luYyBmdW5jdGlvbiBsKGUsdCl7Y29uc3Qgbj1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuZ2V0UHJvcGVydGllcyIse29iamVjdElkOnQsb3duUHJvcGVydGllczohMH0pLGk9e307Zm9yKGNvbnN0IHQgb2Ygbi5yZXN1bHQpaWYodC52YWx1ZT8ub2JqZWN0SWQmJiJBcnJheSI9PT10LnZhbHVlLmNsYXNzTmFtZSl7Y29uc3Qgbj10LnZhbHVlLm9iamVjdElkO2F3YWl0IGMoZSxuLHQubmFtZSxpKX1lbHNlIGlmKHQudmFsdWU/Lm9iamVjdElkJiYiT2JqZWN0Ij09PXQudmFsdWUuY2xhc3NOYW1lKXtjb25zdCBuPXQudmFsdWUub2JqZWN0SWQ7YXdhaXQgcihlLG4sdC5uYW1lLGkpfWVsc2UgdC52YWx1ZSYmdSh0LGkpO3JldHVybiBpfWxldCBmOyhhc3luYyBmdW5jdGlvbigpe2NvbnN0IHQ9bmV3IGU7dC5jb25uZWN0VG9NYWluVGhyZWFkKCkscygiQ29ubmVjdGVkIHRvIG1haW4gdGhyZWFkIik7bGV0IG49ITE7dC5vbigiRGVidWdnZXIucmVzdW1lZCIsKCk9PntuPSExfSksdC5vbigiRGVidWdnZXIucGF1c2VkIixlPT57bj0hMCxhc3luYyBmdW5jdGlvbihlLHtyZWFzb246dCxkYXRhOntvYmplY3RJZDpufSxjYWxsRnJhbWVzOml9KXtpZigiZXhjZXB0aW9uIiE9PXQmJiJwcm9taXNlUmVqZWN0aW9uIiE9PXQpcmV0dXJuO2lmKGY/LigpLG51bGw9PW4pcmV0dXJuO2NvbnN0IGE9W107Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0e3Njb3BlQ2hhaW46bixmdW5jdGlvbk5hbWU6byx0aGlzOnN9PWlbdF0sYz1uLmZpbmQoZT0+ImxvY2FsIj09PWUudHlwZSkscj0iZ2xvYmFsIiE9PXMuY2xhc3NOYW1lJiZzLmNsYXNzTmFtZT9gJHtzLmNsYXNzTmFtZX0uJHtvfWA6bztpZih2b2lkIDA9PT1jPy5vYmplY3Qub2JqZWN0SWQpYVt0XT17ZnVuY3Rpb246cn07ZWxzZXtjb25zdCBuPWF3YWl0IGwoZSxjLm9iamVjdC5vYmplY3RJZCk7YVt0XT17ZnVuY3Rpb246cix2YXJzOm59fX1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuY2FsbEZ1bmN0aW9uT24iLHtmdW5jdGlvbkRlY2xhcmF0aW9uOmBmdW5jdGlvbigpIHsgdGhpcy4ke299ID0gdGhpcy4ke299IHx8ICR7SlNPTi5zdHJpbmdpZnkoYSl9OyB9YCxzaWxlbnQ6ITAsb2JqZWN0SWQ6bn0pLGF3YWl0IGUucG9zdCgiUnVudGltZS5yZWxlYXNlT2JqZWN0Iix7b2JqZWN0SWQ6bn0pfSh0LGUucGFyYW1zKS50aGVuKGFzeW5jKCk9PntuJiZhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpfSxhc3luYyBlPT57biYmYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKX0pfSksYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5lbmFibGUiKTtjb25zdCBpPSExIT09YS5jYXB0dXJlQWxsRXhjZXB0aW9ucztpZihhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zIix7c3RhdGU6aT8iYWxsIjoidW5jYXVnaHQifSksaSl7Y29uc3QgZT1hLm1heEV4Y2VwdGlvbnNQZXJTZWNvbmR8fDUwO2Y9ZnVuY3Rpb24oZSx0LG4pe2xldCBpPTAsbz01LGE9MDtyZXR1cm4gc2V0SW50ZXJ2YWwoKCk9PnswPT09YT9pPmUmJihvKj0yLG4obyksbz44NjQwMCYmKG89ODY0MDApLGE9byk6KGEtPTEsMD09PWEmJnQoKSksaT0wfSwxZTMpLnVucmVmKCksKCk9PntpKz0xfX0oZSxhc3luYygpPT57cygiUmF0ZS1saW1pdCBsaWZ0ZWQuIiksYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyIse3N0YXRlOiJhbGwifSl9LGFzeW5jIGU9PntzKGBSYXRlLWxpbWl0IGV4Y2VlZGVkLiBEaXNhYmxpbmcgY2FwdHVyaW5nIG9mIGNhdWdodCBleGNlcHRpb25zIGZvciAke2V9IHNlY29uZHMuYCksYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyIse3N0YXRlOiJ1bmNhdWdodCJ9KX0pfX0pKCkuY2F0Y2goZT0+e3MoIkZhaWxlZCB0byBzdGFydCBkZWJ1Z2dlciIsZSl9KSxzZXRJbnRlcnZhbCgoKT0+e30sMWU0KTs=";
9
9
  function log(...args) {
10
10
  core.debug.log("[LocalVariables]", ...args);
11
11
  }