@cartanova/qgrid-cli 2.10.10 → 2.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/bundle/dist/_virtual/_rolldown/runtime.js +1 -10
  2. package/bundle/dist/application/monit/log-buffer.js +12 -6
  3. package/bundle/dist/application/monit/monit.frame.js +11 -3
  4. package/bundle/dist/application/monit/monit.types.js +1 -1
  5. package/bundle/dist/application/qgrid/conv-routing.js +9 -6
  6. package/bundle/dist/application/qgrid/expired-token-reminder.js +2 -2
  7. package/bundle/dist/application/qgrid/oauth.js +31 -4
  8. package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -1
  9. package/bundle/dist/application/qgrid/qgrid-response-format.js +21 -19
  10. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +40 -33
  11. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +128 -93
  12. package/bundle/dist/application/qgrid/qgrid.frame.js +930 -49
  13. package/bundle/dist/application/qgrid/qgrid.types.js +212 -5
  14. package/bundle/dist/application/qgrid/schema-prompt.js +75 -48
  15. package/bundle/dist/application/qgrid/slack-user-map.js +1 -1
  16. package/bundle/dist/application/qgrid/token-death.js +1 -1
  17. package/bundle/dist/application/qgrid/token-subscriber.js +83 -30
  18. package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -1
  19. package/bundle/dist/application/qgrid/token-window-keepalive.js +8 -6
  20. package/bundle/dist/application/qgrid/tool-emulation-schema.js +13 -13
  21. package/bundle/dist/application/qgrid/tool-emulation.js +19 -15
  22. package/bundle/dist/application/request-log/json-schema-type-text.js +29 -12
  23. package/bundle/dist/application/request-log/request-log.model.js +83 -70
  24. package/bundle/dist/application/request-log/request-log.types.js +1 -1
  25. package/bundle/dist/application/request-log/zod-code-format.js +1 -1
  26. package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
  27. package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -1
  28. package/bundle/dist/application/setting/setting.constant.js +1 -1
  29. package/bundle/dist/application/setting/setting.model.js +2 -2
  30. package/bundle/dist/application/setting/setting.store.js +2 -2
  31. package/bundle/dist/application/setting/setting.types.js +1 -1
  32. package/bundle/dist/application/sonamu.generated.js +32 -16
  33. package/bundle/dist/application/sonamu.generated.sso.js +1 -1
  34. package/bundle/dist/application/token/token.model.js +26 -9
  35. package/bundle/dist/application/token/token.types.js +20 -3
  36. package/bundle/dist/i18n/en.js +15 -1
  37. package/bundle/dist/i18n/ko.js +15 -1
  38. package/bundle/dist/i18n/sd.generated.js +1 -1
  39. package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +8 -6
  40. package/bundle/dist/server-bootstrap.js +4 -2
  41. package/bundle/dist/server-error-handler.js +1 -1
  42. package/bundle/dist/sonamu.config.js +37 -8
  43. package/bundle/dist/startup-migrations.js +17 -7
  44. package/bundle/dist/testing/global.js +1 -1
  45. package/bundle/dist/testing/schema-bench.js +0 -0
  46. package/bundle/dist/testing/test-database-name.js +1 -1
  47. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
  48. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +11 -5
  49. package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +4 -4
  50. package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
  51. package/bundle/dist/utils/providers/anthropic/claude-session.js +20 -19
  52. package/bundle/dist/utils/providers/anthropic/fence-strip.js +1 -1
  53. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +49 -23
  54. package/bundle/dist/utils/providers/common/credentials.js +5 -1
  55. package/bundle/dist/utils/providers/common/effort.js +3 -3
  56. package/bundle/dist/utils/providers/common/model-cost.js +69 -14
  57. package/bundle/dist/utils/providers/common/provider-types.js +29 -1
  58. package/bundle/dist/utils/providers/common/schema-validation.js +78 -40
  59. package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -1
  60. package/bundle/dist/utils/providers/common/strictifier.js +62 -43
  61. package/bundle/dist/utils/providers/common/thinking.js +3 -2
  62. package/bundle/dist/utils/providers/common/ttft.js +1 -1
  63. package/bundle/dist/utils/providers/grok/grok-backend-protocol.js +427 -0
  64. package/bundle/dist/utils/providers/grok/grok-constants.js +55 -0
  65. package/bundle/dist/utils/providers/grok/grok-direct-client.js +196 -0
  66. package/bundle/dist/utils/providers/grok/grok-dispatcher.js +1313 -0
  67. package/bundle/dist/utils/providers/grok/grok-headers.js +118 -0
  68. package/bundle/dist/utils/providers/grok/grok-media-client.js +420 -0
  69. package/bundle/dist/utils/providers/grok/grok-models.js +114 -0
  70. package/bundle/dist/utils/providers/grok/grok-oauth.js +455 -0
  71. package/bundle/dist/utils/providers/grok/grok-quota.js +119 -0
  72. package/bundle/dist/utils/providers/grok/grok-refresh.js +192 -0
  73. package/bundle/dist/utils/providers/grok/grok-types.js +186 -0
  74. package/bundle/dist/utils/providers/grok/grok-voice-client.js +199 -0
  75. package/bundle/dist/utils/providers/grok/index.js +11 -0
  76. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +111 -83
  77. package/bundle/dist/utils/providers/openai/openai-callback-relay.js +3 -2
  78. package/bundle/dist/utils/providers/openai/openai-constants.js +1 -1
  79. package/bundle/dist/utils/providers/openai/openai-direct-client.js +23 -7
  80. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +143 -106
  81. package/bundle/dist/utils/providers/openai/openai-image-generation.js +48 -33
  82. package/bundle/dist/utils/providers/openai/openai-oauth.js +28 -13
  83. package/bundle/dist/utils/providers/openai/openai-quota.js +38 -27
  84. package/bundle/dist/utils/providers/openai/openai-refresh.js +17 -9
  85. package/bundle/dist/utils/providers/openai/openai-sse.js +1 -1
  86. package/bundle/dist/utils/providers/openai/openai-transport-config.js +1 -1
  87. package/bundle/dist/utils/quiet-hours.js +1 -1
  88. package/bundle/dist/utils/slack-notify.js +14 -8
  89. package/bundle/dist/utils/subset-loaders.js +4 -5
  90. package/bundle/src/application/monit/log-buffer.ts +23 -9
  91. package/bundle/src/application/monit/monit.frame.ts +22 -5
  92. package/bundle/src/application/monit/monit.types.ts +6 -0
  93. package/bundle/src/application/qgrid/conv-routing.test.ts +76 -4
  94. package/bundle/src/application/qgrid/conv-routing.ts +35 -9
  95. package/bundle/src/application/qgrid/expired-token-reminder.ts +9 -1
  96. package/bundle/src/application/qgrid/oauth.ts +51 -15
  97. package/bundle/src/application/qgrid/qgrid-image-generation.ts +9 -0
  98. package/bundle/src/application/qgrid/qgrid-response-format.ts +50 -25
  99. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +19 -0
  100. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +84 -40
  101. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +97 -0
  102. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +274 -126
  103. package/bundle/src/application/qgrid/qgrid.frame.test.ts +1013 -3
  104. package/bundle/src/application/qgrid/qgrid.frame.ts +1415 -60
  105. package/bundle/src/application/qgrid/qgrid.types.ts +335 -0
  106. package/bundle/src/application/qgrid/schema-prompt.ts +105 -41
  107. package/bundle/src/application/qgrid/slack-user-map.ts +5 -0
  108. package/bundle/src/application/qgrid/token-death.ts +4 -0
  109. package/bundle/src/application/qgrid/token-subscriber.test.ts +21 -19
  110. package/bundle/src/application/qgrid/token-subscriber.ts +186 -53
  111. package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -0
  112. package/bundle/src/application/qgrid/token-window-keepalive.ts +49 -6
  113. package/bundle/src/application/qgrid/tool-emulation-schema.ts +33 -29
  114. package/bundle/src/application/qgrid/tool-emulation.ts +52 -27
  115. package/bundle/src/application/request-log/json-schema-type-text.test.ts +5 -5
  116. package/bundle/src/application/request-log/json-schema-type-text.ts +81 -26
  117. package/bundle/src/application/request-log/request-log.model.test.ts +111 -4
  118. package/bundle/src/application/request-log/request-log.model.ts +277 -146
  119. package/bundle/src/application/request-log/request-log.types.ts +6 -0
  120. package/bundle/src/application/request-log/zod-code-format.ts +11 -0
  121. package/bundle/src/application/request-log-step/request-log-step.model.ts +1 -0
  122. package/bundle/src/application/request-log-step/request-log-step.types.ts +2 -0
  123. package/bundle/src/application/setting/setting.constant.ts +9 -0
  124. package/bundle/src/application/setting/setting.model.ts +12 -2
  125. package/bundle/src/application/setting/setting.store.ts +5 -1
  126. package/bundle/src/application/setting/setting.types.ts +8 -0
  127. package/bundle/src/application/sonamu.generated.http +133 -0
  128. package/bundle/src/application/sonamu.generated.sso.ts +2 -0
  129. package/bundle/src/application/sonamu.generated.ts +15 -0
  130. package/bundle/src/application/token/token.identity.test.ts +20 -0
  131. package/bundle/src/application/token/token.model.ts +66 -7
  132. package/bundle/src/application/token/token.types.ts +24 -1
  133. package/bundle/src/i18n/en.ts +19 -0
  134. package/bundle/src/i18n/ko.ts +21 -0
  135. package/bundle/src/i18n/sd.generated.ts +23 -2
  136. package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +16 -8
  137. package/bundle/src/server-bootstrap.ts +4 -2
  138. package/bundle/src/server-error-handler.ts +1 -0
  139. package/bundle/src/sonamu.config.ts +69 -7
  140. package/bundle/src/startup-migrations.ts +27 -9
  141. package/bundle/src/testing/global.ts +20 -0
  142. package/bundle/src/testing/schema-bench.ts +105 -30
  143. package/bundle/src/testing/test-database-name.ts +2 -0
  144. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +8 -0
  145. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +41 -6
  146. package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +7 -3
  147. package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +6 -0
  148. package/bundle/src/utils/providers/anthropic/claude-session.ts +58 -24
  149. package/bundle/src/utils/providers/anthropic/fence-strip.ts +11 -0
  150. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +110 -45
  151. package/bundle/src/utils/providers/common/credentials.ts +8 -0
  152. package/bundle/src/utils/providers/common/effort.ts +9 -2
  153. package/bundle/src/utils/providers/common/model-cost.test.ts +48 -1
  154. package/bundle/src/utils/providers/common/model-cost.ts +259 -158
  155. package/bundle/src/utils/providers/common/provider-dispatcher.ts +98 -2
  156. package/bundle/src/utils/providers/common/provider-types.ts +46 -3
  157. package/bundle/src/utils/providers/common/schema-validation.test.ts +5 -1
  158. package/bundle/src/utils/providers/common/schema-validation.ts +124 -56
  159. package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -0
  160. package/bundle/src/utils/providers/common/strictifier.ts +185 -59
  161. package/bundle/src/utils/providers/common/thinking.ts +2 -2
  162. package/bundle/src/utils/providers/common/ttft.ts +4 -2
  163. package/bundle/src/utils/providers/grok/__fixtures__/golden-responses-1.0.60.json +164 -0
  164. package/bundle/src/utils/providers/grok/grok-backend-protocol.test.ts +325 -0
  165. package/bundle/src/utils/providers/grok/grok-backend-protocol.ts +721 -0
  166. package/bundle/src/utils/providers/grok/grok-constants.ts +105 -0
  167. package/bundle/src/utils/providers/grok/grok-direct-client.test.ts +179 -0
  168. package/bundle/src/utils/providers/grok/grok-direct-client.ts +313 -0
  169. package/bundle/src/utils/providers/grok/grok-dispatcher.test.ts +1395 -0
  170. package/bundle/src/utils/providers/grok/grok-dispatcher.ts +2105 -0
  171. package/bundle/src/utils/providers/grok/grok-headers.test.ts +149 -0
  172. package/bundle/src/utils/providers/grok/grok-headers.ts +199 -0
  173. package/bundle/src/utils/providers/grok/grok-media-client.test.ts +446 -0
  174. package/bundle/src/utils/providers/grok/grok-media-client.ts +703 -0
  175. package/bundle/src/utils/providers/grok/grok-models.test.ts +96 -0
  176. package/bundle/src/utils/providers/grok/grok-models.ts +161 -0
  177. package/bundle/src/utils/providers/grok/grok-oauth.test.ts +406 -0
  178. package/bundle/src/utils/providers/grok/grok-oauth.ts +771 -0
  179. package/bundle/src/utils/providers/grok/grok-quota.test.ts +142 -0
  180. package/bundle/src/utils/providers/grok/grok-quota.ts +198 -0
  181. package/bundle/src/utils/providers/grok/grok-refresh.test.ts +239 -0
  182. package/bundle/src/utils/providers/grok/grok-refresh.ts +325 -0
  183. package/bundle/src/utils/providers/grok/grok-types.test.ts +252 -0
  184. package/bundle/src/utils/providers/grok/grok-types.ts +374 -0
  185. package/bundle/src/utils/providers/grok/grok-voice-client.test.ts +321 -0
  186. package/bundle/src/utils/providers/grok/grok-voice-client.ts +284 -0
  187. package/bundle/src/utils/providers/grok/index.ts +20 -0
  188. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +221 -137
  189. package/bundle/src/utils/providers/openai/openai-callback-relay.ts +12 -1
  190. package/bundle/src/utils/providers/openai/openai-constants.ts +2 -0
  191. package/bundle/src/utils/providers/openai/openai-direct-client.ts +111 -21
  192. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +322 -169
  193. package/bundle/src/utils/providers/openai/openai-image-generation.ts +116 -36
  194. package/bundle/src/utils/providers/openai/openai-oauth.ts +48 -20
  195. package/bundle/src/utils/providers/openai/openai-quota.ts +77 -46
  196. package/bundle/src/utils/providers/openai/openai-refresh.ts +42 -18
  197. package/bundle/src/utils/providers/openai/openai-sse.ts +27 -3
  198. package/bundle/src/utils/providers/openai/openai-transport-config.ts +2 -0
  199. package/bundle/src/utils/quiet-hours.ts +12 -1
  200. package/bundle/src/utils/slack-notify.ts +44 -13
  201. package/bundle/src/utils/subset-loaders.ts +7 -7
  202. package/bundle/web-dist/client/assets/clsx-5XM_pHvN.js +1 -0
  203. package/bundle/web-dist/client/assets/index-Be2qCZmI.css +1 -0
  204. package/bundle/web-dist/client/assets/index-C96h3feE.js +32 -0
  205. package/bundle/web-dist/client/assets/logs-DBM6U0QD.js +1 -0
  206. package/bundle/web-dist/client/assets/monit-BBjXa7vB.js +1 -0
  207. package/bundle/web-dist/client/assets/routes-Crz_PQzi.js +5 -0
  208. package/bundle/web-dist/client/assets/{services.generated-NP-ValHd.js → services.generated-B5lc3aIC.js} +5 -5
  209. package/bundle/web-dist/client/assets/settings-Cdwm3OBB.js +1 -0
  210. package/bundle/web-dist/client/assets/show-DBUhALT1.js +2 -0
  211. package/bundle/web-dist/client/assets/tokens-CVQAVJTo.js +1 -0
  212. package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
  213. package/bundle/web-dist/client/assets/use-oauth-login-flow-BfxYI4Oh.js +1 -0
  214. package/bundle/web-dist/client/assets/use-update-token-mutation-qKBC2sn7.js +1 -0
  215. package/bundle/web-dist/client/assets/{vendor-tanstack-DJRQAbrY.js → vendor-tanstack-DRPs09ai.js} +1 -1
  216. package/bundle/web-dist/client/index.html +5 -5
  217. package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
  218. package/bundle/web-dist/server/assets/{lazyRouteComponent-CgBdabgd.js → lazyRouteComponent-AKiHfZWp.js} +129 -2
  219. package/bundle/web-dist/server/assets/{logs-BMyR98rU.js → logs-B7QmGJq3.js} +18 -14
  220. package/bundle/web-dist/server/assets/{monit-ZPt66W5M.js → monit-DFt7x3bh.js} +13 -12
  221. package/bundle/web-dist/server/assets/{plus-BZ9I0VgC.js → plus-DaYQRpBt.js} +1 -1
  222. package/bundle/web-dist/server/assets/{react-dom-Ds75e4Jl.js → react-dom-Cv23mm1K.js} +2 -129
  223. package/bundle/web-dist/server/assets/{refresh-cw-CztCFis-.js → refresh-cw-BpXNsAy-.js} +1 -1
  224. package/bundle/web-dist/server/assets/{request-model-DjGldb-h.js → request-model-eHE6YbaF.js} +1 -1
  225. package/bundle/web-dist/server/assets/{routes-Ct-k7nBA.js → routes-_Y-PJfgO.js} +110 -39
  226. package/bundle/web-dist/server/assets/{services.generated-BA4AcAf5.js → services.generated-CMJ8AHbO.js} +582 -172
  227. package/bundle/web-dist/server/assets/{settings-CBUZ47Xx.js → settings-JwJKxn2e.js} +14 -14
  228. package/bundle/web-dist/server/assets/{show-LSFIzvO2.js → show-BEv6z1v_.js} +90 -60
  229. package/bundle/web-dist/server/assets/{tokens-DxrBW512.js → tokens-CNT4mI-f.js} +162 -50
  230. package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
  231. package/bundle/web-dist/server/assets/use-oauth-login-flow-jkAkT3X6.js +2345 -0
  232. package/bundle/web-dist/server/assets/{use-update-token-mutation-pkArIzCP.js → use-update-token-mutation-Sm6kh02m.js} +1 -1
  233. package/bundle/web-dist/server/entry-server.generated.js +1644 -21655
  234. package/dist/cli.js +9 -9
  235. package/package.json +4 -11
  236. package/postinstall.mjs +12 -0
  237. package/skills/qgrid/SKILL.md +1 -0
  238. package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
  239. package/skills/qgrid/references/decision-rationale.md +23 -0
  240. package/skills/qgrid/references/grok-runtime.md +89 -0
  241. package/skills/qgrid/references/provider-runtime-differences.md +30 -29
  242. package/skills/qgrid/references/repo-map.md +10 -0
  243. package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
  244. package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
  245. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
  246. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
  247. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
  248. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
  249. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
  250. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
  251. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
  252. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
  253. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
  254. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
  255. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
  256. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
  257. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
  258. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
  259. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
  260. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
  261. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
  262. package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
  263. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
  264. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
  265. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
  266. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
  267. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
  268. package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
  269. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
  270. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
  271. package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
  272. package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
  273. package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_5b35fc1fb85d2af4d105e0d74f940f50/node_modules/vite/dist/node/module-runner.js +0 -1265
  274. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +0 -9
  275. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +0 -41
  276. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +0 -19
  277. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +0 -202
  278. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +0 -46
  279. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +0 -119
  280. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +0 -3044
  281. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +0 -59
  282. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/index.js +0 -28
  283. package/bundle/dist/testing/setup-mocks.js +0 -16
  284. package/bundle/src/testing/setup-mocks.ts +0 -44
  285. package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
  286. package/bundle/web-dist/client/assets/index-DZwzUfI-.js +0 -106
  287. package/bundle/web-dist/client/assets/logs-Cog79DU5.js +0 -1
  288. package/bundle/web-dist/client/assets/monit-2auznBys.js +0 -1
  289. package/bundle/web-dist/client/assets/routes-B0lTeLK-.js +0 -5
  290. package/bundle/web-dist/client/assets/settings-D8ZxZGSJ.js +0 -1
  291. package/bundle/web-dist/client/assets/show-CFSERlnM.js +0 -2
  292. package/bundle/web-dist/client/assets/tokens-CZXUyI7O.js +0 -1
  293. package/bundle/web-dist/client/assets/use-oauth-login-flow-hboOs3wG.js +0 -1
  294. package/bundle/web-dist/client/assets/use-update-token-mutation-BQHS0byG.js +0 -1
  295. package/bundle/web-dist/server/assets/use-oauth-login-flow-Gn8flMK5.js +0 -178
  296. package/dist/cli.d.ts +0 -10
  297. /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
  298. /package/bundle/web-dist/client/assets/{plus-B62CuqT8.js → plus-BsQdY7PS.js} +0 -0
  299. /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
  300. /package/bundle/web-dist/client/assets/{refresh-cw-NNcU0Cmq.js → refresh-cw-D9IUmT23.js} +0 -0
  301. /package/bundle/web-dist/client/assets/{request-model-CojtinqK.js → request-model-Bpp_rkK8.js} +0 -0
  302. /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
@@ -1,1317 +0,0 @@
1
- import y from "../../../../../tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js";
2
- import { format, plugins } from "../../../../../@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js";
3
- import { stringify } from "./display.js";
4
- import "./constants.js";
5
- import { deepClone, getOwnProperties, getType as getType$1 } from "./helpers.js";
6
- /**
7
- * Class representing one diff tuple.
8
- * Attempts to look like a two-element array (which is what this used to be).
9
- * @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL.
10
- * @param {string} text Text to be deleted, inserted, or retained.
11
- * @constructor
12
- */
13
- var Diff = class {
14
- 0;
15
- 1;
16
- constructor(op, text) {
17
- this[0] = op;
18
- this[1] = text;
19
- }
20
- };
21
- /**
22
- * Determine the common prefix of two strings.
23
- * @param {string} text1 First string.
24
- * @param {string} text2 Second string.
25
- * @return {number} The number of characters common to the start of each
26
- * string.
27
- */
28
- function diff_commonPrefix(text1, text2) {
29
- if (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) return 0;
30
- let pointermin = 0;
31
- let pointermax = Math.min(text1.length, text2.length);
32
- let pointermid = pointermax;
33
- let pointerstart = 0;
34
- while (pointermin < pointermid) {
35
- if (text1.substring(pointerstart, pointermid) === text2.substring(pointerstart, pointermid)) {
36
- pointermin = pointermid;
37
- pointerstart = pointermin;
38
- } else pointermax = pointermid;
39
- pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);
40
- }
41
- return pointermid;
42
- }
43
- /**
44
- * Determine the common suffix of two strings.
45
- * @param {string} text1 First string.
46
- * @param {string} text2 Second string.
47
- * @return {number} The number of characters common to the end of each string.
48
- */
49
- function diff_commonSuffix(text1, text2) {
50
- if (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) return 0;
51
- let pointermin = 0;
52
- let pointermax = Math.min(text1.length, text2.length);
53
- let pointermid = pointermax;
54
- let pointerend = 0;
55
- while (pointermin < pointermid) {
56
- if (text1.substring(text1.length - pointermid, text1.length - pointerend) === text2.substring(text2.length - pointermid, text2.length - pointerend)) {
57
- pointermin = pointermid;
58
- pointerend = pointermin;
59
- } else pointermax = pointermid;
60
- pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);
61
- }
62
- return pointermid;
63
- }
64
- /**
65
- * Determine if the suffix of one string is the prefix of another.
66
- * @param {string} text1 First string.
67
- * @param {string} text2 Second string.
68
- * @return {number} The number of characters common to the end of the first
69
- * string and the start of the second string.
70
- * @private
71
- */
72
- function diff_commonOverlap_(text1, text2) {
73
- const text1_length = text1.length;
74
- const text2_length = text2.length;
75
- if (text1_length === 0 || text2_length === 0) return 0;
76
- if (text1_length > text2_length) text1 = text1.substring(text1_length - text2_length);
77
- else if (text1_length < text2_length) text2 = text2.substring(0, text1_length);
78
- const text_length = Math.min(text1_length, text2_length);
79
- if (text1 === text2) return text_length;
80
- let best = 0;
81
- let length = 1;
82
- while (true) {
83
- const pattern = text1.substring(text_length - length);
84
- const found = text2.indexOf(pattern);
85
- if (found === -1) return best;
86
- length += found;
87
- if (found === 0 || text1.substring(text_length - length) === text2.substring(0, length)) {
88
- best = length;
89
- length++;
90
- }
91
- }
92
- }
93
- /**
94
- * Reduce the number of edits by eliminating semantically trivial equalities.
95
- * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.
96
- */
97
- function diff_cleanupSemantic(diffs) {
98
- let changes = false;
99
- const equalities = [];
100
- let equalitiesLength = 0;
101
- /** @type {?string} */
102
- let lastEquality = null;
103
- let pointer = 0;
104
- let length_insertions1 = 0;
105
- let length_deletions1 = 0;
106
- let length_insertions2 = 0;
107
- let length_deletions2 = 0;
108
- while (pointer < diffs.length) {
109
- if (diffs[pointer][0] === 0) {
110
- equalities[equalitiesLength++] = pointer;
111
- length_insertions1 = length_insertions2;
112
- length_deletions1 = length_deletions2;
113
- length_insertions2 = 0;
114
- length_deletions2 = 0;
115
- lastEquality = diffs[pointer][1];
116
- } else {
117
- if (diffs[pointer][0] === 1) length_insertions2 += diffs[pointer][1].length;
118
- else length_deletions2 += diffs[pointer][1].length;
119
- if (lastEquality && lastEquality.length <= Math.max(length_insertions1, length_deletions1) && lastEquality.length <= Math.max(length_insertions2, length_deletions2)) {
120
- diffs.splice(equalities[equalitiesLength - 1], 0, new Diff(-1, lastEquality));
121
- diffs[equalities[equalitiesLength - 1] + 1][0] = 1;
122
- equalitiesLength--;
123
- equalitiesLength--;
124
- pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;
125
- length_insertions1 = 0;
126
- length_deletions1 = 0;
127
- length_insertions2 = 0;
128
- length_deletions2 = 0;
129
- lastEquality = null;
130
- changes = true;
131
- }
132
- }
133
- pointer++;
134
- }
135
- if (changes) diff_cleanupMerge(diffs);
136
- diff_cleanupSemanticLossless(diffs);
137
- pointer = 1;
138
- while (pointer < diffs.length) {
139
- if (diffs[pointer - 1][0] === -1 && diffs[pointer][0] === 1) {
140
- const deletion = diffs[pointer - 1][1];
141
- const insertion = diffs[pointer][1];
142
- const overlap_length1 = diff_commonOverlap_(deletion, insertion);
143
- const overlap_length2 = diff_commonOverlap_(insertion, deletion);
144
- if (overlap_length1 >= overlap_length2) {
145
- if (overlap_length1 >= deletion.length / 2 || overlap_length1 >= insertion.length / 2) {
146
- diffs.splice(pointer, 0, new Diff(0, insertion.substring(0, overlap_length1)));
147
- diffs[pointer - 1][1] = deletion.substring(0, deletion.length - overlap_length1);
148
- diffs[pointer + 1][1] = insertion.substring(overlap_length1);
149
- pointer++;
150
- }
151
- } else if (overlap_length2 >= deletion.length / 2 || overlap_length2 >= insertion.length / 2) {
152
- diffs.splice(pointer, 0, new Diff(0, deletion.substring(0, overlap_length2)));
153
- diffs[pointer - 1][0] = 1;
154
- diffs[pointer - 1][1] = insertion.substring(0, insertion.length - overlap_length2);
155
- diffs[pointer + 1][0] = -1;
156
- diffs[pointer + 1][1] = deletion.substring(overlap_length2);
157
- pointer++;
158
- }
159
- pointer++;
160
- }
161
- pointer++;
162
- }
163
- }
164
- const nonAlphaNumericRegex_ = /[^a-z0-9]/i;
165
- const whitespaceRegex_ = /\s/;
166
- const linebreakRegex_ = /[\r\n]/;
167
- const blanklineEndRegex_ = /\n\r?\n$/;
168
- const blanklineStartRegex_ = /^\r?\n\r?\n/;
169
- /**
170
- * Look for single edits surrounded on both sides by equalities
171
- * which can be shifted sideways to align the edit to a word boundary.
172
- * e.g: The c<ins>at c</ins>ame. -> The <ins>cat </ins>came.
173
- * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.
174
- */
175
- function diff_cleanupSemanticLossless(diffs) {
176
- let pointer = 1;
177
- while (pointer < diffs.length - 1) {
178
- if (diffs[pointer - 1][0] === 0 && diffs[pointer + 1][0] === 0) {
179
- let equality1 = diffs[pointer - 1][1];
180
- let edit = diffs[pointer][1];
181
- let equality2 = diffs[pointer + 1][1];
182
- const commonOffset = diff_commonSuffix(equality1, edit);
183
- if (commonOffset) {
184
- const commonString = edit.substring(edit.length - commonOffset);
185
- equality1 = equality1.substring(0, equality1.length - commonOffset);
186
- edit = commonString + edit.substring(0, edit.length - commonOffset);
187
- equality2 = commonString + equality2;
188
- }
189
- let bestEquality1 = equality1;
190
- let bestEdit = edit;
191
- let bestEquality2 = equality2;
192
- let bestScore = diff_cleanupSemanticScore_(equality1, edit) + diff_cleanupSemanticScore_(edit, equality2);
193
- while (edit.charAt(0) === equality2.charAt(0)) {
194
- equality1 += edit.charAt(0);
195
- edit = edit.substring(1) + equality2.charAt(0);
196
- equality2 = equality2.substring(1);
197
- const score = diff_cleanupSemanticScore_(equality1, edit) + diff_cleanupSemanticScore_(edit, equality2);
198
- if (score >= bestScore) {
199
- bestScore = score;
200
- bestEquality1 = equality1;
201
- bestEdit = edit;
202
- bestEquality2 = equality2;
203
- }
204
- }
205
- if (diffs[pointer - 1][1] !== bestEquality1) {
206
- if (bestEquality1) diffs[pointer - 1][1] = bestEquality1;
207
- else {
208
- diffs.splice(pointer - 1, 1);
209
- pointer--;
210
- }
211
- diffs[pointer][1] = bestEdit;
212
- if (bestEquality2) diffs[pointer + 1][1] = bestEquality2;
213
- else {
214
- diffs.splice(pointer + 1, 1);
215
- pointer--;
216
- }
217
- }
218
- }
219
- pointer++;
220
- }
221
- }
222
- /**
223
- * Reorder and merge like edit sections. Merge equalities.
224
- * Any edit section can move as long as it doesn't cross an equality.
225
- * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.
226
- */
227
- function diff_cleanupMerge(diffs) {
228
- diffs.push(new Diff(0, ""));
229
- let pointer = 0;
230
- let count_delete = 0;
231
- let count_insert = 0;
232
- let text_delete = "";
233
- let text_insert = "";
234
- let commonlength;
235
- while (pointer < diffs.length) switch (diffs[pointer][0]) {
236
- case 1:
237
- count_insert++;
238
- text_insert += diffs[pointer][1];
239
- pointer++;
240
- break;
241
- case -1:
242
- count_delete++;
243
- text_delete += diffs[pointer][1];
244
- pointer++;
245
- break;
246
- case 0:
247
- if (count_delete + count_insert > 1) {
248
- if (count_delete !== 0 && count_insert !== 0) {
249
- commonlength = diff_commonPrefix(text_insert, text_delete);
250
- if (commonlength !== 0) {
251
- if (pointer - count_delete - count_insert > 0 && diffs[pointer - count_delete - count_insert - 1][0] === 0) diffs[pointer - count_delete - count_insert - 1][1] += text_insert.substring(0, commonlength);
252
- else {
253
- diffs.splice(0, 0, new Diff(0, text_insert.substring(0, commonlength)));
254
- pointer++;
255
- }
256
- text_insert = text_insert.substring(commonlength);
257
- text_delete = text_delete.substring(commonlength);
258
- }
259
- commonlength = diff_commonSuffix(text_insert, text_delete);
260
- if (commonlength !== 0) {
261
- diffs[pointer][1] = text_insert.substring(text_insert.length - commonlength) + diffs[pointer][1];
262
- text_insert = text_insert.substring(0, text_insert.length - commonlength);
263
- text_delete = text_delete.substring(0, text_delete.length - commonlength);
264
- }
265
- }
266
- pointer -= count_delete + count_insert;
267
- diffs.splice(pointer, count_delete + count_insert);
268
- if (text_delete.length) {
269
- diffs.splice(pointer, 0, new Diff(-1, text_delete));
270
- pointer++;
271
- }
272
- if (text_insert.length) {
273
- diffs.splice(pointer, 0, new Diff(1, text_insert));
274
- pointer++;
275
- }
276
- pointer++;
277
- } else if (pointer !== 0 && diffs[pointer - 1][0] === 0) {
278
- diffs[pointer - 1][1] += diffs[pointer][1];
279
- diffs.splice(pointer, 1);
280
- } else pointer++;
281
- count_insert = 0;
282
- count_delete = 0;
283
- text_delete = "";
284
- text_insert = "";
285
- break;
286
- }
287
- if (diffs.at(-1)?.[1] === "") diffs.pop();
288
- let changes = false;
289
- pointer = 1;
290
- while (pointer < diffs.length - 1) {
291
- if (diffs[pointer - 1][0] === 0 && diffs[pointer + 1][0] === 0) {
292
- if (diffs[pointer][1].substring(diffs[pointer][1].length - diffs[pointer - 1][1].length) === diffs[pointer - 1][1]) {
293
- diffs[pointer][1] = diffs[pointer - 1][1] + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length);
294
- diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];
295
- diffs.splice(pointer - 1, 1);
296
- changes = true;
297
- } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) === diffs[pointer + 1][1]) {
298
- diffs[pointer - 1][1] += diffs[pointer + 1][1];
299
- diffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1];
300
- diffs.splice(pointer + 1, 1);
301
- changes = true;
302
- }
303
- }
304
- pointer++;
305
- }
306
- if (changes) diff_cleanupMerge(diffs);
307
- }
308
- /**
309
- * Given two strings, compute a score representing whether the internal
310
- * boundary falls on logical boundaries.
311
- * Scores range from 6 (best) to 0 (worst).
312
- * Closure, but does not reference any external variables.
313
- * @param {string} one First string.
314
- * @param {string} two Second string.
315
- * @return {number} The score.
316
- * @private
317
- */
318
- function diff_cleanupSemanticScore_(one, two) {
319
- if (!one || !two) return 6;
320
- const char1 = one.charAt(one.length - 1);
321
- const char2 = two.charAt(0);
322
- const nonAlphaNumeric1 = char1.match(nonAlphaNumericRegex_);
323
- const nonAlphaNumeric2 = char2.match(nonAlphaNumericRegex_);
324
- const whitespace1 = nonAlphaNumeric1 && char1.match(whitespaceRegex_);
325
- const whitespace2 = nonAlphaNumeric2 && char2.match(whitespaceRegex_);
326
- const lineBreak1 = whitespace1 && char1.match(linebreakRegex_);
327
- const lineBreak2 = whitespace2 && char2.match(linebreakRegex_);
328
- const blankLine1 = lineBreak1 && one.match(blanklineEndRegex_);
329
- const blankLine2 = lineBreak2 && two.match(blanklineStartRegex_);
330
- if (blankLine1 || blankLine2) return 5;
331
- else if (lineBreak1 || lineBreak2) return 4;
332
- else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) return 3;
333
- else if (whitespace1 || whitespace2) return 2;
334
- else if (nonAlphaNumeric1 || nonAlphaNumeric2) return 1;
335
- return 0;
336
- }
337
- /**
338
- * Copyright (c) Meta Platforms, Inc. and affiliates.
339
- *
340
- * This source code is licensed under the MIT license found in the
341
- * LICENSE file in the root directory of this source tree.
342
- */
343
- const NO_DIFF_MESSAGE = "Compared values have no visual difference.";
344
- const SIMILAR_MESSAGE = "Compared values serialize to the same structure.\nPrinting internal object structure without calling `toJSON` instead.";
345
- function getDefaultExportFromCjs(x) {
346
- return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
347
- }
348
- var build = {};
349
- var hasRequiredBuild;
350
- function requireBuild() {
351
- if (hasRequiredBuild) return build;
352
- hasRequiredBuild = 1;
353
- Object.defineProperty(build, "__esModule", { value: true });
354
- build.default = diffSequence;
355
- /**
356
- * Copyright (c) Meta Platforms, Inc. and affiliates.
357
- *
358
- * This source code is licensed under the MIT license found in the
359
- * LICENSE file in the root directory of this source tree.
360
- *
361
- */
362
- const pkg = "diff-sequences";
363
- const NOT_YET_SET = 0;
364
- const countCommonItemsF = (aIndex, aEnd, bIndex, bEnd, isCommon) => {
365
- let nCommon = 0;
366
- while (aIndex < aEnd && bIndex < bEnd && isCommon(aIndex, bIndex)) {
367
- aIndex += 1;
368
- bIndex += 1;
369
- nCommon += 1;
370
- }
371
- return nCommon;
372
- };
373
- const countCommonItemsR = (aStart, aIndex, bStart, bIndex, isCommon) => {
374
- let nCommon = 0;
375
- while (aStart <= aIndex && bStart <= bIndex && isCommon(aIndex, bIndex)) {
376
- aIndex -= 1;
377
- bIndex -= 1;
378
- nCommon += 1;
379
- }
380
- return nCommon;
381
- };
382
- const extendPathsF = (d, aEnd, bEnd, bF, isCommon, aIndexesF, iMaxF) => {
383
- let iF = 0;
384
- let kF = -d;
385
- let aFirst = aIndexesF[iF];
386
- let aIndexPrev1 = aFirst;
387
- aIndexesF[iF] += countCommonItemsF(aFirst + 1, aEnd, bF + aFirst - kF + 1, bEnd, isCommon);
388
- const nF = d < iMaxF ? d : iMaxF;
389
- for (iF += 1, kF += 2; iF <= nF; iF += 1, kF += 2) {
390
- if (iF !== d && aIndexPrev1 < aIndexesF[iF]) aFirst = aIndexesF[iF];
391
- else {
392
- aFirst = aIndexPrev1 + 1;
393
- if (aEnd <= aFirst) return iF - 1;
394
- }
395
- aIndexPrev1 = aIndexesF[iF];
396
- aIndexesF[iF] = aFirst + countCommonItemsF(aFirst + 1, aEnd, bF + aFirst - kF + 1, bEnd, isCommon);
397
- }
398
- return iMaxF;
399
- };
400
- const extendPathsR = (d, aStart, bStart, bR, isCommon, aIndexesR, iMaxR) => {
401
- let iR = 0;
402
- let kR = d;
403
- let aFirst = aIndexesR[iR];
404
- let aIndexPrev1 = aFirst;
405
- aIndexesR[iR] -= countCommonItemsR(aStart, aFirst - 1, bStart, bR + aFirst - kR - 1, isCommon);
406
- const nR = d < iMaxR ? d : iMaxR;
407
- for (iR += 1, kR -= 2; iR <= nR; iR += 1, kR -= 2) {
408
- if (iR !== d && aIndexesR[iR] < aIndexPrev1) aFirst = aIndexesR[iR];
409
- else {
410
- aFirst = aIndexPrev1 - 1;
411
- if (aFirst < aStart) return iR - 1;
412
- }
413
- aIndexPrev1 = aIndexesR[iR];
414
- aIndexesR[iR] = aFirst - countCommonItemsR(aStart, aFirst - 1, bStart, bR + aFirst - kR - 1, isCommon);
415
- }
416
- return iMaxR;
417
- };
418
- const extendOverlappablePathsF = (d, aStart, aEnd, bStart, bEnd, isCommon, aIndexesF, iMaxF, aIndexesR, iMaxR, division) => {
419
- const bF = bStart - aStart;
420
- const aLength = aEnd - aStart;
421
- const baDeltaLength = bEnd - bStart - aLength;
422
- const kMinOverlapF = -baDeltaLength - (d - 1);
423
- const kMaxOverlapF = -baDeltaLength + (d - 1);
424
- let aIndexPrev1 = NOT_YET_SET;
425
- const nF = d < iMaxF ? d : iMaxF;
426
- for (let iF = 0, kF = -d; iF <= nF; iF += 1, kF += 2) {
427
- const insert = iF === 0 || iF !== d && aIndexPrev1 < aIndexesF[iF];
428
- const aLastPrev = insert ? aIndexesF[iF] : aIndexPrev1;
429
- const aFirst = insert ? aLastPrev : aLastPrev + 1;
430
- const bFirst = bF + aFirst - kF;
431
- const nCommonF = countCommonItemsF(aFirst + 1, aEnd, bFirst + 1, bEnd, isCommon);
432
- const aLast = aFirst + nCommonF;
433
- aIndexPrev1 = aIndexesF[iF];
434
- aIndexesF[iF] = aLast;
435
- if (kMinOverlapF <= kF && kF <= kMaxOverlapF) {
436
- const iR = (d - 1 - (kF + baDeltaLength)) / 2;
437
- if (iR <= iMaxR && aIndexesR[iR] - 1 <= aLast) {
438
- const bLastPrev = bF + aLastPrev - (insert ? kF + 1 : kF - 1);
439
- const nCommonR = countCommonItemsR(aStart, aLastPrev, bStart, bLastPrev, isCommon);
440
- const aIndexPrevFirst = aLastPrev - nCommonR;
441
- const bIndexPrevFirst = bLastPrev - nCommonR;
442
- const aEndPreceding = aIndexPrevFirst + 1;
443
- const bEndPreceding = bIndexPrevFirst + 1;
444
- division.nChangePreceding = d - 1;
445
- if (d - 1 === aEndPreceding + bEndPreceding - aStart - bStart) {
446
- division.aEndPreceding = aStart;
447
- division.bEndPreceding = bStart;
448
- } else {
449
- division.aEndPreceding = aEndPreceding;
450
- division.bEndPreceding = bEndPreceding;
451
- }
452
- division.nCommonPreceding = nCommonR;
453
- if (nCommonR !== 0) {
454
- division.aCommonPreceding = aEndPreceding;
455
- division.bCommonPreceding = bEndPreceding;
456
- }
457
- division.nCommonFollowing = nCommonF;
458
- if (nCommonF !== 0) {
459
- division.aCommonFollowing = aFirst + 1;
460
- division.bCommonFollowing = bFirst + 1;
461
- }
462
- const aStartFollowing = aLast + 1;
463
- const bStartFollowing = bFirst + nCommonF + 1;
464
- division.nChangeFollowing = d - 1;
465
- if (d - 1 === aEnd + bEnd - aStartFollowing - bStartFollowing) {
466
- division.aStartFollowing = aEnd;
467
- division.bStartFollowing = bEnd;
468
- } else {
469
- division.aStartFollowing = aStartFollowing;
470
- division.bStartFollowing = bStartFollowing;
471
- }
472
- return true;
473
- }
474
- }
475
- }
476
- return false;
477
- };
478
- const extendOverlappablePathsR = (d, aStart, aEnd, bStart, bEnd, isCommon, aIndexesF, iMaxF, aIndexesR, iMaxR, division) => {
479
- const bR = bEnd - aEnd;
480
- const aLength = aEnd - aStart;
481
- const baDeltaLength = bEnd - bStart - aLength;
482
- const kMinOverlapR = baDeltaLength - d;
483
- const kMaxOverlapR = baDeltaLength + d;
484
- let aIndexPrev1 = NOT_YET_SET;
485
- const nR = d < iMaxR ? d : iMaxR;
486
- for (let iR = 0, kR = d; iR <= nR; iR += 1, kR -= 2) {
487
- const insert = iR === 0 || iR !== d && aIndexesR[iR] < aIndexPrev1;
488
- const aLastPrev = insert ? aIndexesR[iR] : aIndexPrev1;
489
- const aFirst = insert ? aLastPrev : aLastPrev - 1;
490
- const bFirst = bR + aFirst - kR;
491
- const nCommonR = countCommonItemsR(aStart, aFirst - 1, bStart, bFirst - 1, isCommon);
492
- const aLast = aFirst - nCommonR;
493
- aIndexPrev1 = aIndexesR[iR];
494
- aIndexesR[iR] = aLast;
495
- if (kMinOverlapR <= kR && kR <= kMaxOverlapR) {
496
- const iF = (d + (kR - baDeltaLength)) / 2;
497
- if (iF <= iMaxF && aLast - 1 <= aIndexesF[iF]) {
498
- const bLast = bFirst - nCommonR;
499
- division.nChangePreceding = d;
500
- if (d === aLast + bLast - aStart - bStart) {
501
- division.aEndPreceding = aStart;
502
- division.bEndPreceding = bStart;
503
- } else {
504
- division.aEndPreceding = aLast;
505
- division.bEndPreceding = bLast;
506
- }
507
- division.nCommonPreceding = nCommonR;
508
- if (nCommonR !== 0) {
509
- division.aCommonPreceding = aLast;
510
- division.bCommonPreceding = bLast;
511
- }
512
- division.nChangeFollowing = d - 1;
513
- if (d === 1) {
514
- division.nCommonFollowing = 0;
515
- division.aStartFollowing = aEnd;
516
- division.bStartFollowing = bEnd;
517
- } else {
518
- const bLastPrev = bR + aLastPrev - (insert ? kR - 1 : kR + 1);
519
- const nCommonF = countCommonItemsF(aLastPrev, aEnd, bLastPrev, bEnd, isCommon);
520
- division.nCommonFollowing = nCommonF;
521
- if (nCommonF !== 0) {
522
- division.aCommonFollowing = aLastPrev;
523
- division.bCommonFollowing = bLastPrev;
524
- }
525
- const aStartFollowing = aLastPrev + nCommonF;
526
- const bStartFollowing = bLastPrev + nCommonF;
527
- if (d - 1 === aEnd + bEnd - aStartFollowing - bStartFollowing) {
528
- division.aStartFollowing = aEnd;
529
- division.bStartFollowing = bEnd;
530
- } else {
531
- division.aStartFollowing = aStartFollowing;
532
- division.bStartFollowing = bStartFollowing;
533
- }
534
- }
535
- return true;
536
- }
537
- }
538
- }
539
- return false;
540
- };
541
- const divide = (nChange, aStart, aEnd, bStart, bEnd, isCommon, aIndexesF, aIndexesR, division) => {
542
- const bF = bStart - aStart;
543
- const bR = bEnd - aEnd;
544
- const aLength = aEnd - aStart;
545
- const bLength = bEnd - bStart;
546
- const baDeltaLength = bLength - aLength;
547
- let iMaxF = aLength;
548
- let iMaxR = aLength;
549
- aIndexesF[0] = aStart - 1;
550
- aIndexesR[0] = aEnd;
551
- if (baDeltaLength % 2 === 0) {
552
- const dMin = (nChange || baDeltaLength) / 2;
553
- const dMax = (aLength + bLength) / 2;
554
- for (let d = 1; d <= dMax; d += 1) {
555
- iMaxF = extendPathsF(d, aEnd, bEnd, bF, isCommon, aIndexesF, iMaxF);
556
- if (d < dMin) iMaxR = extendPathsR(d, aStart, bStart, bR, isCommon, aIndexesR, iMaxR);
557
- else if (extendOverlappablePathsR(d, aStart, aEnd, bStart, bEnd, isCommon, aIndexesF, iMaxF, aIndexesR, iMaxR, division)) return;
558
- }
559
- } else {
560
- const dMin = ((nChange || baDeltaLength) + 1) / 2;
561
- const dMax = (aLength + bLength + 1) / 2;
562
- let d = 1;
563
- iMaxF = extendPathsF(d, aEnd, bEnd, bF, isCommon, aIndexesF, iMaxF);
564
- for (d += 1; d <= dMax; d += 1) {
565
- iMaxR = extendPathsR(d - 1, aStart, bStart, bR, isCommon, aIndexesR, iMaxR);
566
- if (d < dMin) iMaxF = extendPathsF(d, aEnd, bEnd, bF, isCommon, aIndexesF, iMaxF);
567
- else if (extendOverlappablePathsF(d, aStart, aEnd, bStart, bEnd, isCommon, aIndexesF, iMaxF, aIndexesR, iMaxR, division)) return;
568
- }
569
- }
570
- /* istanbul ignore next */
571
- throw new Error(`${pkg}: no overlap aStart=${aStart} aEnd=${aEnd} bStart=${bStart} bEnd=${bEnd}`);
572
- };
573
- const findSubsequences = (nChange, aStart, aEnd, bStart, bEnd, transposed, callbacks, aIndexesF, aIndexesR, division) => {
574
- if (bEnd - bStart < aEnd - aStart) {
575
- transposed = !transposed;
576
- if (transposed && callbacks.length === 1) {
577
- const { foundSubsequence, isCommon } = callbacks[0];
578
- callbacks[1] = {
579
- foundSubsequence: (nCommon, bCommon, aCommon) => {
580
- foundSubsequence(nCommon, aCommon, bCommon);
581
- },
582
- isCommon: (bIndex, aIndex) => isCommon(aIndex, bIndex)
583
- };
584
- }
585
- const tStart = aStart;
586
- const tEnd = aEnd;
587
- aStart = bStart;
588
- aEnd = bEnd;
589
- bStart = tStart;
590
- bEnd = tEnd;
591
- }
592
- const { foundSubsequence, isCommon } = callbacks[transposed ? 1 : 0];
593
- divide(nChange, aStart, aEnd, bStart, bEnd, isCommon, aIndexesF, aIndexesR, division);
594
- const { nChangePreceding, aEndPreceding, bEndPreceding, nCommonPreceding, aCommonPreceding, bCommonPreceding, nCommonFollowing, aCommonFollowing, bCommonFollowing, nChangeFollowing, aStartFollowing, bStartFollowing } = division;
595
- if (aStart < aEndPreceding && bStart < bEndPreceding) findSubsequences(nChangePreceding, aStart, aEndPreceding, bStart, bEndPreceding, transposed, callbacks, aIndexesF, aIndexesR, division);
596
- if (nCommonPreceding !== 0) foundSubsequence(nCommonPreceding, aCommonPreceding, bCommonPreceding);
597
- if (nCommonFollowing !== 0) foundSubsequence(nCommonFollowing, aCommonFollowing, bCommonFollowing);
598
- if (aStartFollowing < aEnd && bStartFollowing < bEnd) findSubsequences(nChangeFollowing, aStartFollowing, aEnd, bStartFollowing, bEnd, transposed, callbacks, aIndexesF, aIndexesR, division);
599
- };
600
- const validateLength = (name, arg) => {
601
- if (typeof arg !== "number") throw new TypeError(`${pkg}: ${name} typeof ${typeof arg} is not a number`);
602
- if (!Number.isSafeInteger(arg)) throw new RangeError(`${pkg}: ${name} value ${arg} is not a safe integer`);
603
- if (arg < 0) throw new RangeError(`${pkg}: ${name} value ${arg} is a negative integer`);
604
- };
605
- const validateCallback = (name, arg) => {
606
- const type = typeof arg;
607
- if (type !== "function") throw new TypeError(`${pkg}: ${name} typeof ${type} is not a function`);
608
- };
609
- function diffSequence(aLength, bLength, isCommon, foundSubsequence) {
610
- validateLength("aLength", aLength);
611
- validateLength("bLength", bLength);
612
- validateCallback("isCommon", isCommon);
613
- validateCallback("foundSubsequence", foundSubsequence);
614
- const nCommonF = countCommonItemsF(0, aLength, 0, bLength, isCommon);
615
- if (nCommonF !== 0) foundSubsequence(nCommonF, 0, 0);
616
- if (aLength !== nCommonF || bLength !== nCommonF) {
617
- const aStart = nCommonF;
618
- const bStart = nCommonF;
619
- const nCommonR = countCommonItemsR(aStart, aLength - 1, bStart, bLength - 1, isCommon);
620
- const aEnd = aLength - nCommonR;
621
- const bEnd = bLength - nCommonR;
622
- const nCommonFR = nCommonF + nCommonR;
623
- if (aLength !== nCommonFR && bLength !== nCommonFR) findSubsequences(0, aStart, aEnd, bStart, bEnd, false, [{
624
- foundSubsequence,
625
- isCommon
626
- }], [NOT_YET_SET], [NOT_YET_SET], {
627
- aCommonFollowing: NOT_YET_SET,
628
- aCommonPreceding: NOT_YET_SET,
629
- aEndPreceding: NOT_YET_SET,
630
- aStartFollowing: NOT_YET_SET,
631
- bCommonFollowing: NOT_YET_SET,
632
- bCommonPreceding: NOT_YET_SET,
633
- bEndPreceding: NOT_YET_SET,
634
- bStartFollowing: NOT_YET_SET,
635
- nChangeFollowing: NOT_YET_SET,
636
- nChangePreceding: NOT_YET_SET,
637
- nCommonFollowing: NOT_YET_SET,
638
- nCommonPreceding: NOT_YET_SET
639
- });
640
- if (nCommonR !== 0) foundSubsequence(nCommonR, aEnd, bEnd);
641
- }
642
- }
643
- return build;
644
- }
645
- var diffSequences = /*@__PURE__*/ getDefaultExportFromCjs(/* @__PURE__ */ requireBuild());
646
- function formatTrailingSpaces(line, trailingSpaceFormatter) {
647
- return line.replace(/\s+$/, (match) => trailingSpaceFormatter(match));
648
- }
649
- function printDiffLine(line, isFirstOrLast, color, indicator, trailingSpaceFormatter, emptyFirstOrLastLinePlaceholder) {
650
- return line.length !== 0 ? color(`${indicator} ${formatTrailingSpaces(line, trailingSpaceFormatter)}`) : indicator !== " " ? color(indicator) : isFirstOrLast && emptyFirstOrLastLinePlaceholder.length !== 0 ? color(`${indicator} ${emptyFirstOrLastLinePlaceholder}`) : "";
651
- }
652
- function printDeleteLine(line, isFirstOrLast, { aColor, aIndicator, changeLineTrailingSpaceColor, emptyFirstOrLastLinePlaceholder }) {
653
- return printDiffLine(line, isFirstOrLast, aColor, aIndicator, changeLineTrailingSpaceColor, emptyFirstOrLastLinePlaceholder);
654
- }
655
- function printInsertLine(line, isFirstOrLast, { bColor, bIndicator, changeLineTrailingSpaceColor, emptyFirstOrLastLinePlaceholder }) {
656
- return printDiffLine(line, isFirstOrLast, bColor, bIndicator, changeLineTrailingSpaceColor, emptyFirstOrLastLinePlaceholder);
657
- }
658
- function printCommonLine(line, isFirstOrLast, { commonColor, commonIndicator, commonLineTrailingSpaceColor, emptyFirstOrLastLinePlaceholder }) {
659
- return printDiffLine(line, isFirstOrLast, commonColor, commonIndicator, commonLineTrailingSpaceColor, emptyFirstOrLastLinePlaceholder);
660
- }
661
- function createPatchMark(aStart, aEnd, bStart, bEnd, { patchColor }) {
662
- return patchColor(`@@ -${aStart + 1},${aEnd - aStart} +${bStart + 1},${bEnd - bStart} @@`);
663
- }
664
- function joinAlignedDiffsNoExpand(diffs, options) {
665
- const iLength = diffs.length;
666
- const nContextLines = options.contextLines;
667
- const nContextLines2 = nContextLines + nContextLines;
668
- let jLength = iLength;
669
- let hasExcessAtStartOrEnd = false;
670
- let nExcessesBetweenChanges = 0;
671
- let i = 0;
672
- while (i !== iLength) {
673
- const iStart = i;
674
- while (i !== iLength && diffs[i][0] === 0) i += 1;
675
- if (iStart !== i) if (iStart === 0) {
676
- if (i > nContextLines) {
677
- jLength -= i - nContextLines;
678
- hasExcessAtStartOrEnd = true;
679
- }
680
- } else if (i === iLength) {
681
- const n = i - iStart;
682
- if (n > nContextLines) {
683
- jLength -= n - nContextLines;
684
- hasExcessAtStartOrEnd = true;
685
- }
686
- } else {
687
- const n = i - iStart;
688
- if (n > nContextLines2) {
689
- jLength -= n - nContextLines2;
690
- nExcessesBetweenChanges += 1;
691
- }
692
- }
693
- while (i !== iLength && diffs[i][0] !== 0) i += 1;
694
- }
695
- const hasPatch = nExcessesBetweenChanges !== 0 || hasExcessAtStartOrEnd;
696
- if (nExcessesBetweenChanges !== 0) jLength += nExcessesBetweenChanges + 1;
697
- else if (hasExcessAtStartOrEnd) jLength += 1;
698
- const jLast = jLength - 1;
699
- const lines = [];
700
- let jPatchMark = 0;
701
- if (hasPatch) lines.push("");
702
- let aStart = 0;
703
- let bStart = 0;
704
- let aEnd = 0;
705
- let bEnd = 0;
706
- const pushCommonLine = (line) => {
707
- const j = lines.length;
708
- lines.push(printCommonLine(line, j === 0 || j === jLast, options));
709
- aEnd += 1;
710
- bEnd += 1;
711
- };
712
- const pushDeleteLine = (line) => {
713
- const j = lines.length;
714
- lines.push(printDeleteLine(line, j === 0 || j === jLast, options));
715
- aEnd += 1;
716
- };
717
- const pushInsertLine = (line) => {
718
- const j = lines.length;
719
- lines.push(printInsertLine(line, j === 0 || j === jLast, options));
720
- bEnd += 1;
721
- };
722
- i = 0;
723
- while (i !== iLength) {
724
- let iStart = i;
725
- while (i !== iLength && diffs[i][0] === 0) i += 1;
726
- if (iStart !== i) if (iStart === 0) {
727
- if (i > nContextLines) {
728
- iStart = i - nContextLines;
729
- aStart = iStart;
730
- bStart = iStart;
731
- aEnd = aStart;
732
- bEnd = bStart;
733
- }
734
- for (let iCommon = iStart; iCommon !== i; iCommon += 1) pushCommonLine(diffs[iCommon][1]);
735
- } else if (i === iLength) {
736
- const iEnd = i - iStart > nContextLines ? iStart + nContextLines : i;
737
- for (let iCommon = iStart; iCommon !== iEnd; iCommon += 1) pushCommonLine(diffs[iCommon][1]);
738
- } else {
739
- const nCommon = i - iStart;
740
- if (nCommon > nContextLines2) {
741
- const iEnd = iStart + nContextLines;
742
- for (let iCommon = iStart; iCommon !== iEnd; iCommon += 1) pushCommonLine(diffs[iCommon][1]);
743
- lines[jPatchMark] = createPatchMark(aStart, aEnd, bStart, bEnd, options);
744
- jPatchMark = lines.length;
745
- lines.push("");
746
- const nOmit = nCommon - nContextLines2;
747
- aStart = aEnd + nOmit;
748
- bStart = bEnd + nOmit;
749
- aEnd = aStart;
750
- bEnd = bStart;
751
- for (let iCommon = i - nContextLines; iCommon !== i; iCommon += 1) pushCommonLine(diffs[iCommon][1]);
752
- } else for (let iCommon = iStart; iCommon !== i; iCommon += 1) pushCommonLine(diffs[iCommon][1]);
753
- }
754
- while (i !== iLength && diffs[i][0] === -1) {
755
- pushDeleteLine(diffs[i][1]);
756
- i += 1;
757
- }
758
- while (i !== iLength && diffs[i][0] === 1) {
759
- pushInsertLine(diffs[i][1]);
760
- i += 1;
761
- }
762
- }
763
- if (hasPatch) lines[jPatchMark] = createPatchMark(aStart, aEnd, bStart, bEnd, options);
764
- return lines.join("\n");
765
- }
766
- function joinAlignedDiffsExpand(diffs, options) {
767
- return diffs.map((diff, i, diffs) => {
768
- const line = diff[1];
769
- const isFirstOrLast = i === 0 || i === diffs.length - 1;
770
- switch (diff[0]) {
771
- case -1: return printDeleteLine(line, isFirstOrLast, options);
772
- case 1: return printInsertLine(line, isFirstOrLast, options);
773
- default: return printCommonLine(line, isFirstOrLast, options);
774
- }
775
- }).join("\n");
776
- }
777
- const noColor = (string) => string;
778
- const DIFF_CONTEXT_DEFAULT = 5;
779
- const DIFF_TRUNCATE_THRESHOLD_DEFAULT = 0;
780
- function getDefaultOptions() {
781
- return {
782
- aAnnotation: "Expected",
783
- aColor: y.green,
784
- aIndicator: "-",
785
- bAnnotation: "Received",
786
- bColor: y.red,
787
- bIndicator: "+",
788
- changeColor: y.inverse,
789
- changeLineTrailingSpaceColor: noColor,
790
- commonColor: y.dim,
791
- commonIndicator: " ",
792
- commonLineTrailingSpaceColor: noColor,
793
- compareKeys: void 0,
794
- contextLines: DIFF_CONTEXT_DEFAULT,
795
- emptyFirstOrLastLinePlaceholder: "",
796
- expand: false,
797
- includeChangeCounts: false,
798
- omitAnnotationLines: false,
799
- patchColor: y.yellow,
800
- printBasicPrototype: false,
801
- truncateThreshold: DIFF_TRUNCATE_THRESHOLD_DEFAULT,
802
- truncateAnnotation: "... Diff result is truncated",
803
- truncateAnnotationColor: noColor
804
- };
805
- }
806
- function getCompareKeys(compareKeys) {
807
- return compareKeys && typeof compareKeys === "function" ? compareKeys : void 0;
808
- }
809
- function getContextLines(contextLines) {
810
- return typeof contextLines === "number" && Number.isSafeInteger(contextLines) && contextLines >= 0 ? contextLines : DIFF_CONTEXT_DEFAULT;
811
- }
812
- function normalizeDiffOptions(options = {}) {
813
- return {
814
- ...getDefaultOptions(),
815
- ...options,
816
- compareKeys: getCompareKeys(options.compareKeys),
817
- contextLines: getContextLines(options.contextLines)
818
- };
819
- }
820
- function isEmptyString(lines) {
821
- return lines.length === 1 && lines[0].length === 0;
822
- }
823
- function countChanges(diffs) {
824
- let a = 0;
825
- let b = 0;
826
- diffs.forEach((diff) => {
827
- switch (diff[0]) {
828
- case -1:
829
- a += 1;
830
- break;
831
- case 1:
832
- b += 1;
833
- break;
834
- }
835
- });
836
- return {
837
- a,
838
- b
839
- };
840
- }
841
- function printAnnotation({ aAnnotation, aColor, aIndicator, bAnnotation, bColor, bIndicator, includeChangeCounts, omitAnnotationLines }, changeCounts) {
842
- if (omitAnnotationLines) return "";
843
- let aRest = "";
844
- let bRest = "";
845
- if (includeChangeCounts) {
846
- const aCount = String(changeCounts.a);
847
- const bCount = String(changeCounts.b);
848
- const baAnnotationLengthDiff = bAnnotation.length - aAnnotation.length;
849
- const aAnnotationPadding = " ".repeat(Math.max(0, baAnnotationLengthDiff));
850
- const bAnnotationPadding = " ".repeat(Math.max(0, -baAnnotationLengthDiff));
851
- const baCountLengthDiff = bCount.length - aCount.length;
852
- const aCountPadding = " ".repeat(Math.max(0, baCountLengthDiff));
853
- const bCountPadding = " ".repeat(Math.max(0, -baCountLengthDiff));
854
- aRest = `${aAnnotationPadding} ${aIndicator} ${aCountPadding}${aCount}`;
855
- bRest = `${bAnnotationPadding} ${bIndicator} ${bCountPadding}${bCount}`;
856
- }
857
- const a = `${aIndicator} ${aAnnotation}${aRest}`;
858
- const b = `${bIndicator} ${bAnnotation}${bRest}`;
859
- return `${aColor(a)}\n${bColor(b)}\n\n`;
860
- }
861
- function printDiffLines(diffs, truncated, options) {
862
- return printAnnotation(options, countChanges(diffs)) + (options.expand ? joinAlignedDiffsExpand(diffs, options) : joinAlignedDiffsNoExpand(diffs, options)) + (truncated ? options.truncateAnnotationColor(`\n${options.truncateAnnotation}`) : "");
863
- }
864
- function diffLinesUnified(aLines, bLines, options) {
865
- const normalizedOptions = normalizeDiffOptions(options);
866
- const [diffs, truncated] = diffLinesRaw(isEmptyString(aLines) ? [] : aLines, isEmptyString(bLines) ? [] : bLines, normalizedOptions);
867
- return printDiffLines(diffs, truncated, normalizedOptions);
868
- }
869
- function diffLinesUnified2(aLinesDisplay, bLinesDisplay, aLinesCompare, bLinesCompare, options) {
870
- if (isEmptyString(aLinesDisplay) && isEmptyString(aLinesCompare)) {
871
- aLinesDisplay = [];
872
- aLinesCompare = [];
873
- }
874
- if (isEmptyString(bLinesDisplay) && isEmptyString(bLinesCompare)) {
875
- bLinesDisplay = [];
876
- bLinesCompare = [];
877
- }
878
- if (aLinesDisplay.length !== aLinesCompare.length || bLinesDisplay.length !== bLinesCompare.length) return diffLinesUnified(aLinesDisplay, bLinesDisplay, options);
879
- const [diffs, truncated] = diffLinesRaw(aLinesCompare, bLinesCompare, options);
880
- let aIndex = 0;
881
- let bIndex = 0;
882
- diffs.forEach((diff) => {
883
- switch (diff[0]) {
884
- case -1:
885
- diff[1] = aLinesDisplay[aIndex];
886
- aIndex += 1;
887
- break;
888
- case 1:
889
- diff[1] = bLinesDisplay[bIndex];
890
- bIndex += 1;
891
- break;
892
- default:
893
- diff[1] = bLinesDisplay[bIndex];
894
- aIndex += 1;
895
- bIndex += 1;
896
- }
897
- });
898
- return printDiffLines(diffs, truncated, normalizeDiffOptions(options));
899
- }
900
- function diffLinesRaw(aLines, bLines, options) {
901
- const truncate = options?.truncateThreshold ?? false;
902
- const truncateThreshold = Math.max(Math.floor(options?.truncateThreshold ?? 0), 0);
903
- const aLength = truncate ? Math.min(aLines.length, truncateThreshold) : aLines.length;
904
- const bLength = truncate ? Math.min(bLines.length, truncateThreshold) : bLines.length;
905
- const truncated = aLength !== aLines.length || bLength !== bLines.length;
906
- const isCommon = (aIndex, bIndex) => aLines[aIndex] === bLines[bIndex];
907
- const diffs = [];
908
- let aIndex = 0;
909
- let bIndex = 0;
910
- const foundSubsequence = (nCommon, aCommon, bCommon) => {
911
- for (; aIndex !== aCommon; aIndex += 1) diffs.push(new Diff(-1, aLines[aIndex]));
912
- for (; bIndex !== bCommon; bIndex += 1) diffs.push(new Diff(1, bLines[bIndex]));
913
- for (; nCommon !== 0; nCommon -= 1, aIndex += 1, bIndex += 1) diffs.push(new Diff(0, bLines[bIndex]));
914
- };
915
- diffSequences(aLength, bLength, isCommon, foundSubsequence);
916
- for (; aIndex !== aLength; aIndex += 1) diffs.push(new Diff(-1, aLines[aIndex]));
917
- for (; bIndex !== bLength; bIndex += 1) diffs.push(new Diff(1, bLines[bIndex]));
918
- return [diffs, truncated];
919
- }
920
- function getType(value) {
921
- if (value === void 0) return "undefined";
922
- else if (value === null) return "null";
923
- else if (Array.isArray(value)) return "array";
924
- else if (typeof value === "boolean") return "boolean";
925
- else if (typeof value === "function") return "function";
926
- else if (typeof value === "number") return "number";
927
- else if (typeof value === "string") return "string";
928
- else if (typeof value === "bigint") return "bigint";
929
- else if (typeof value === "object") {
930
- if (value != null) {
931
- if (value.constructor === RegExp) return "regexp";
932
- else if (value.constructor === Map) return "map";
933
- else if (value.constructor === Set) return "set";
934
- else if (value.constructor === Date) return "date";
935
- }
936
- return "object";
937
- } else if (typeof value === "symbol") return "symbol";
938
- throw new Error(`value of unknown type: ${value}`);
939
- }
940
- function getNewLineSymbol(string) {
941
- return string.includes("\r\n") ? "\r\n" : "\n";
942
- }
943
- function diffStrings(a, b, options) {
944
- const truncate = options?.truncateThreshold ?? false;
945
- const truncateThreshold = Math.max(Math.floor(options?.truncateThreshold ?? 0), 0);
946
- let aLength = a.length;
947
- let bLength = b.length;
948
- if (truncate) {
949
- const aMultipleLines = a.includes("\n");
950
- const bMultipleLines = b.includes("\n");
951
- const aNewLineSymbol = getNewLineSymbol(a);
952
- const bNewLineSymbol = getNewLineSymbol(b);
953
- const _a = aMultipleLines ? `${a.split(aNewLineSymbol, truncateThreshold).join(aNewLineSymbol)}\n` : a;
954
- const _b = bMultipleLines ? `${b.split(bNewLineSymbol, truncateThreshold).join(bNewLineSymbol)}\n` : b;
955
- aLength = _a.length;
956
- bLength = _b.length;
957
- }
958
- const truncated = aLength !== a.length || bLength !== b.length;
959
- const isCommon = (aIndex, bIndex) => a[aIndex] === b[bIndex];
960
- let aIndex = 0;
961
- let bIndex = 0;
962
- const diffs = [];
963
- const foundSubsequence = (nCommon, aCommon, bCommon) => {
964
- if (aIndex !== aCommon) diffs.push(new Diff(-1, a.slice(aIndex, aCommon)));
965
- if (bIndex !== bCommon) diffs.push(new Diff(1, b.slice(bIndex, bCommon)));
966
- aIndex = aCommon + nCommon;
967
- bIndex = bCommon + nCommon;
968
- diffs.push(new Diff(0, b.slice(bCommon, bIndex)));
969
- };
970
- diffSequences(aLength, bLength, isCommon, foundSubsequence);
971
- if (aIndex !== aLength) diffs.push(new Diff(-1, a.slice(aIndex)));
972
- if (bIndex !== bLength) diffs.push(new Diff(1, b.slice(bIndex)));
973
- return [diffs, truncated];
974
- }
975
- function concatenateRelevantDiffs(op, diffs, changeColor) {
976
- return diffs.reduce((reduced, diff) => reduced + (diff[0] === 0 ? diff[1] : diff[0] === op && diff[1].length !== 0 ? changeColor(diff[1]) : ""), "");
977
- }
978
- var ChangeBuffer = class {
979
- op;
980
- line;
981
- lines;
982
- changeColor;
983
- constructor(op, changeColor) {
984
- this.op = op;
985
- this.line = [];
986
- this.lines = [];
987
- this.changeColor = changeColor;
988
- }
989
- pushSubstring(substring) {
990
- this.pushDiff(new Diff(this.op, substring));
991
- }
992
- pushLine() {
993
- this.lines.push(this.line.length !== 1 ? new Diff(this.op, concatenateRelevantDiffs(this.op, this.line, this.changeColor)) : this.line[0][0] === this.op ? this.line[0] : new Diff(this.op, this.line[0][1]));
994
- this.line.length = 0;
995
- }
996
- isLineEmpty() {
997
- return this.line.length === 0;
998
- }
999
- pushDiff(diff) {
1000
- this.line.push(diff);
1001
- }
1002
- align(diff) {
1003
- const string = diff[1];
1004
- if (string.includes("\n")) {
1005
- const substrings = string.split("\n");
1006
- const iLast = substrings.length - 1;
1007
- substrings.forEach((substring, i) => {
1008
- if (i < iLast) {
1009
- this.pushSubstring(substring);
1010
- this.pushLine();
1011
- } else if (substring.length !== 0) this.pushSubstring(substring);
1012
- });
1013
- } else this.pushDiff(diff);
1014
- }
1015
- moveLinesTo(lines) {
1016
- if (!this.isLineEmpty()) this.pushLine();
1017
- lines.push(...this.lines);
1018
- this.lines.length = 0;
1019
- }
1020
- };
1021
- var CommonBuffer = class {
1022
- deleteBuffer;
1023
- insertBuffer;
1024
- lines;
1025
- constructor(deleteBuffer, insertBuffer) {
1026
- this.deleteBuffer = deleteBuffer;
1027
- this.insertBuffer = insertBuffer;
1028
- this.lines = [];
1029
- }
1030
- pushDiffCommonLine(diff) {
1031
- this.lines.push(diff);
1032
- }
1033
- pushDiffChangeLines(diff) {
1034
- const isDiffEmpty = diff[1].length === 0;
1035
- if (!isDiffEmpty || this.deleteBuffer.isLineEmpty()) this.deleteBuffer.pushDiff(diff);
1036
- if (!isDiffEmpty || this.insertBuffer.isLineEmpty()) this.insertBuffer.pushDiff(diff);
1037
- }
1038
- flushChangeLines() {
1039
- this.deleteBuffer.moveLinesTo(this.lines);
1040
- this.insertBuffer.moveLinesTo(this.lines);
1041
- }
1042
- align(diff) {
1043
- const op = diff[0];
1044
- const string = diff[1];
1045
- if (string.includes("\n")) {
1046
- const substrings = string.split("\n");
1047
- const iLast = substrings.length - 1;
1048
- substrings.forEach((substring, i) => {
1049
- if (i === 0) {
1050
- const subdiff = new Diff(op, substring);
1051
- if (this.deleteBuffer.isLineEmpty() && this.insertBuffer.isLineEmpty()) {
1052
- this.flushChangeLines();
1053
- this.pushDiffCommonLine(subdiff);
1054
- } else {
1055
- this.pushDiffChangeLines(subdiff);
1056
- this.flushChangeLines();
1057
- }
1058
- } else if (i < iLast) this.pushDiffCommonLine(new Diff(op, substring));
1059
- else if (substring.length !== 0) this.pushDiffChangeLines(new Diff(op, substring));
1060
- });
1061
- } else this.pushDiffChangeLines(diff);
1062
- }
1063
- getLines() {
1064
- this.flushChangeLines();
1065
- return this.lines;
1066
- }
1067
- };
1068
- function getAlignedDiffs(diffs, changeColor) {
1069
- const deleteBuffer = new ChangeBuffer(-1, changeColor);
1070
- const insertBuffer = new ChangeBuffer(1, changeColor);
1071
- const commonBuffer = new CommonBuffer(deleteBuffer, insertBuffer);
1072
- diffs.forEach((diff) => {
1073
- switch (diff[0]) {
1074
- case -1:
1075
- deleteBuffer.align(diff);
1076
- break;
1077
- case 1:
1078
- insertBuffer.align(diff);
1079
- break;
1080
- default: commonBuffer.align(diff);
1081
- }
1082
- });
1083
- return commonBuffer.getLines();
1084
- }
1085
- function hasCommonDiff(diffs, isMultiline) {
1086
- if (isMultiline) {
1087
- const iLast = diffs.length - 1;
1088
- return diffs.some((diff, i) => diff[0] === 0 && (i !== iLast || diff[1] !== "\n"));
1089
- }
1090
- return diffs.some((diff) => diff[0] === 0);
1091
- }
1092
- function diffStringsUnified(a, b, options) {
1093
- if (a !== b && a.length !== 0 && b.length !== 0) {
1094
- const isMultiline = a.includes("\n") || b.includes("\n");
1095
- const [diffs, truncated] = diffStringsRaw(isMultiline ? `${a}\n` : a, isMultiline ? `${b}\n` : b, true, options);
1096
- if (hasCommonDiff(diffs, isMultiline)) {
1097
- const optionsNormalized = normalizeDiffOptions(options);
1098
- return printDiffLines(getAlignedDiffs(diffs, optionsNormalized.changeColor), truncated, optionsNormalized);
1099
- }
1100
- }
1101
- return diffLinesUnified(a.split("\n"), b.split("\n"), options);
1102
- }
1103
- function diffStringsRaw(a, b, cleanup, options) {
1104
- const [diffs, truncated] = diffStrings(a, b, options);
1105
- if (cleanup) diff_cleanupSemantic(diffs);
1106
- return [diffs, truncated];
1107
- }
1108
- function getCommonMessage(message, options) {
1109
- const { commonColor } = normalizeDiffOptions(options);
1110
- return commonColor(message);
1111
- }
1112
- const { AsymmetricMatcher, DOMCollection, DOMElement, Immutable, ReactElement, ReactTestComponent } = plugins;
1113
- const PLUGINS = [
1114
- ReactTestComponent,
1115
- ReactElement,
1116
- DOMElement,
1117
- DOMCollection,
1118
- Immutable,
1119
- AsymmetricMatcher,
1120
- plugins.Error
1121
- ];
1122
- const FORMAT_OPTIONS = {
1123
- maxDepth: 20,
1124
- plugins: PLUGINS
1125
- };
1126
- const FALLBACK_FORMAT_OPTIONS = {
1127
- callToJSON: false,
1128
- maxDepth: 8,
1129
- plugins: PLUGINS
1130
- };
1131
- const DEFAULT_MEMORIZE = (_, v) => v;
1132
- /**
1133
- * @param a Expected value
1134
- * @param b Received value
1135
- * @param options Diff options
1136
- * @returns {string | null} a string diff
1137
- */
1138
- function diff(a, b, options, memorize = DEFAULT_MEMORIZE) {
1139
- if (Object.is(a, b)) return "";
1140
- const aType = getType(a);
1141
- let expectedType = aType;
1142
- let omitDifference = false;
1143
- if (aType === "object" && typeof a.asymmetricMatch === "function") {
1144
- if (a.$$typeof !== Symbol.for("jest.asymmetricMatcher")) return;
1145
- if (typeof a.getExpectedType !== "function") return;
1146
- expectedType = a.getExpectedType();
1147
- omitDifference = expectedType === "string";
1148
- }
1149
- if (expectedType !== getType(b)) {
1150
- const { aAnnotation, aColor, aIndicator, bAnnotation, bColor, bIndicator } = normalizeDiffOptions(options);
1151
- const formatOptions = getFormatOptions(FALLBACK_FORMAT_OPTIONS, options);
1152
- let aDisplay = format(a, formatOptions);
1153
- let bDisplay = format(b, formatOptions);
1154
- const MAX_LENGTH = 1e5;
1155
- function truncate(s) {
1156
- return s.length <= MAX_LENGTH ? s : `${s.slice(0, MAX_LENGTH)}...`;
1157
- }
1158
- aDisplay = memorize("expected", truncate(aDisplay));
1159
- bDisplay = memorize("actual", truncate(bDisplay));
1160
- return `${`${aColor(`${aIndicator} ${aAnnotation}:`)}\n${aDisplay}`}\n\n${`${bColor(`${bIndicator} ${bAnnotation}:`)}\n${bDisplay}`}`;
1161
- }
1162
- if (omitDifference) return;
1163
- switch (aType) {
1164
- case "string": return diffLinesUnified(a.split("\n"), b.split("\n"), options);
1165
- case "boolean":
1166
- case "number": return comparePrimitive(a, b, options, memorize);
1167
- case "map": return compareObjects(sortMap(a), sortMap(b), options, memorize);
1168
- case "set": return compareObjects(sortSet(a), sortSet(b), options, memorize);
1169
- default: return compareObjects(a, b, options, memorize);
1170
- }
1171
- }
1172
- function createMemorize(memory) {
1173
- return (pointer, stringifiedValue) => {
1174
- memory[pointer] = stringifiedValue;
1175
- return stringifiedValue;
1176
- };
1177
- }
1178
- function comparePrimitive(a, b, options, memorize = DEFAULT_MEMORIZE) {
1179
- const aFormat = memorize("expected", format(a, FORMAT_OPTIONS));
1180
- const bFormat = memorize("actual", format(b, FORMAT_OPTIONS));
1181
- return aFormat === bFormat ? "" : diffLinesUnified(aFormat.split("\n"), bFormat.split("\n"), options);
1182
- }
1183
- function sortMap(map) {
1184
- return new Map(Array.from(map.entries()).sort());
1185
- }
1186
- function sortSet(set) {
1187
- return new Set(Array.from(set.values()).sort());
1188
- }
1189
- function compareObjects(a, b, options, memorize = DEFAULT_MEMORIZE) {
1190
- let difference;
1191
- let hasThrown = false;
1192
- try {
1193
- difference = getObjectsDifference(a, b, getFormatOptions(FORMAT_OPTIONS, options), options, memorize);
1194
- } catch {
1195
- hasThrown = true;
1196
- }
1197
- const noDiffMessage = getCommonMessage(NO_DIFF_MESSAGE, options);
1198
- if (difference === void 0 || difference === noDiffMessage) {
1199
- difference = getObjectsDifference(a, b, getFormatOptions(FALLBACK_FORMAT_OPTIONS, options), options, memorize);
1200
- if (difference !== noDiffMessage && !hasThrown) difference = `${getCommonMessage(SIMILAR_MESSAGE, options)}\n\n${difference}`;
1201
- }
1202
- return difference;
1203
- }
1204
- function getDefaultFormatOptions(options) {
1205
- return getFormatOptions(FORMAT_OPTIONS, options);
1206
- }
1207
- function getFormatOptions(formatOptions, options) {
1208
- const { compareKeys, printBasicPrototype, maxDepth } = normalizeDiffOptions(options);
1209
- return {
1210
- ...formatOptions,
1211
- compareKeys,
1212
- printBasicPrototype,
1213
- maxDepth: maxDepth ?? formatOptions.maxDepth
1214
- };
1215
- }
1216
- function getObjectsDifference(a, b, formatOptions, options, memorize = DEFAULT_MEMORIZE) {
1217
- const formatOptionsZeroIndent = {
1218
- ...formatOptions,
1219
- indent: 0
1220
- };
1221
- const aCompare = format(a, formatOptionsZeroIndent);
1222
- const bCompare = format(b, formatOptionsZeroIndent);
1223
- if (aCompare === bCompare) return getCommonMessage(NO_DIFF_MESSAGE, options);
1224
- else {
1225
- const aDisplay = memorize("expected", format(a, formatOptions));
1226
- const bDisplay = memorize("actual", format(b, formatOptions));
1227
- return diffLinesUnified2(aDisplay.split("\n"), bDisplay.split("\n"), aCompare.split("\n"), bCompare.split("\n"), options);
1228
- }
1229
- }
1230
- const MAX_DIFF_STRING_LENGTH = 2e4;
1231
- function isAsymmetricMatcher(data) {
1232
- return getType$1(data) === "Object" && typeof data.asymmetricMatch === "function";
1233
- }
1234
- function isReplaceable(obj1, obj2) {
1235
- const obj1Type = getType$1(obj1);
1236
- return obj1Type === getType$1(obj2) && (obj1Type === "Object" || obj1Type === "Array");
1237
- }
1238
- function printDiffOrStringify(received, expected, options, memory) {
1239
- const { aAnnotation, bAnnotation } = normalizeDiffOptions(options);
1240
- if (typeof expected === "string" && typeof received === "string" && expected.length > 0 && received.length > 0 && expected.length <= MAX_DIFF_STRING_LENGTH && received.length <= MAX_DIFF_STRING_LENGTH && expected !== received) {
1241
- if (expected.includes("\n") || received.includes("\n")) return diffStringsUnified(expected, received, options);
1242
- const [diffs] = diffStringsRaw(expected, received, true);
1243
- const hasCommonDiff = diffs.some((diff) => diff[0] === 0);
1244
- const printLabel = getLabelPrinter(aAnnotation, bAnnotation);
1245
- return `${printLabel(aAnnotation) + printExpected(getCommonAndChangedSubstrings(diffs, -1, hasCommonDiff))}\n${printLabel(bAnnotation) + printReceived(getCommonAndChangedSubstrings(diffs, 1, hasCommonDiff))}`;
1246
- }
1247
- const clonedExpected = deepClone(expected, { forceWritable: true });
1248
- const { replacedExpected, replacedActual } = replaceAsymmetricMatcher(deepClone(received, { forceWritable: true }), clonedExpected);
1249
- return diff(replacedExpected, replacedActual, options, memory ? createMemorize(memory) : DEFAULT_MEMORIZE);
1250
- }
1251
- function replaceAsymmetricMatcher(actual, expected, actualReplaced = /* @__PURE__ */ new WeakSet(), expectedReplaced = /* @__PURE__ */ new WeakSet()) {
1252
- if (actual instanceof Error && expected instanceof Error && typeof actual.cause !== "undefined" && typeof expected.cause === "undefined") {
1253
- delete actual.cause;
1254
- return {
1255
- replacedActual: actual,
1256
- replacedExpected: expected
1257
- };
1258
- }
1259
- if (!isReplaceable(actual, expected)) return {
1260
- replacedActual: actual,
1261
- replacedExpected: expected
1262
- };
1263
- if (actualReplaced.has(actual) || expectedReplaced.has(expected)) return {
1264
- replacedActual: actual,
1265
- replacedExpected: expected
1266
- };
1267
- actualReplaced.add(actual);
1268
- expectedReplaced.add(expected);
1269
- getOwnProperties(expected).forEach((key) => {
1270
- const expectedValue = expected[key];
1271
- const actualValue = actual[key];
1272
- if (isAsymmetricMatcher(expectedValue)) {
1273
- if (expectedValue.asymmetricMatch(actualValue)) expected[key] = actualValue;
1274
- else if ("sample" in expectedValue && expectedValue.sample !== void 0 && isReplaceable(actualValue, expectedValue.sample)) {
1275
- const replaced = replaceAsymmetricMatcher(actualValue, expectedValue.sample, actualReplaced, expectedReplaced);
1276
- actual[key] = replaced.replacedActual;
1277
- expected[key] = replaced.replacedExpected;
1278
- }
1279
- } else if (isAsymmetricMatcher(actualValue)) {
1280
- if (actualValue.asymmetricMatch(expectedValue)) actual[key] = expectedValue;
1281
- else if ("sample" in actualValue && actualValue.sample !== void 0 && isReplaceable(actualValue.sample, expectedValue)) {
1282
- const replaced = replaceAsymmetricMatcher(actualValue.sample, expectedValue, actualReplaced, expectedReplaced);
1283
- actual[key] = replaced.replacedActual;
1284
- expected[key] = replaced.replacedExpected;
1285
- }
1286
- } else if (isReplaceable(actualValue, expectedValue)) {
1287
- const replaced = replaceAsymmetricMatcher(actualValue, expectedValue, actualReplaced, expectedReplaced);
1288
- actual[key] = replaced.replacedActual;
1289
- expected[key] = replaced.replacedExpected;
1290
- }
1291
- });
1292
- return {
1293
- replacedActual: actual,
1294
- replacedExpected: expected
1295
- };
1296
- }
1297
- function getLabelPrinter(...strings) {
1298
- const maxLength = strings.reduce((max, string) => string.length > max ? string.length : max, 0);
1299
- return (string) => `${string}: ${" ".repeat(maxLength - string.length)}`;
1300
- }
1301
- const SPACE_SYMBOL = "·";
1302
- function replaceTrailingSpaces(text) {
1303
- return text.replace(/\s+$/gm, (spaces) => SPACE_SYMBOL.repeat(spaces.length));
1304
- }
1305
- function printReceived(object) {
1306
- return y.red(replaceTrailingSpaces(stringify(object)));
1307
- }
1308
- function printExpected(value) {
1309
- return y.green(replaceTrailingSpaces(stringify(value)));
1310
- }
1311
- function getCommonAndChangedSubstrings(diffs, op, hasCommonDiff) {
1312
- return diffs.reduce((reduced, diff) => reduced + (diff[0] === 0 ? diff[1] : diff[0] === op ? hasCommonDiff ? y.inverse(diff[1]) : diff[1] : ""), "");
1313
- }
1314
- //#endregion
1315
- export { Diff, diff, diffLinesRaw, diffLinesUnified, diffLinesUnified2, diffStringsRaw, diffStringsUnified, getDefaultFormatOptions, getLabelPrinter, printDiffOrStringify, replaceAsymmetricMatcher };
1316
-
1317
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi5qcyIsIm5hbWVzIjpbImMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHZpdGVzdCt1dGlsc0A0LjEuMTAvbm9kZV9tb2R1bGVzL0B2aXRlc3QvdXRpbHMvZGlzdC9kaWZmLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBsdWdpbnMsIGZvcm1hdCB9IGZyb20gJ0B2aXRlc3QvcHJldHR5LWZvcm1hdCc7XG5pbXBvcnQgYyBmcm9tICd0aW55cmFpbmJvdyc7XG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuL2Rpc3BsYXkuanMnO1xuaW1wb3J0IHsgZGVlcENsb25lLCBnZXRPd25Qcm9wZXJ0aWVzLCBnZXRUeXBlIGFzIGdldFR5cGUkMSB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgJy4vY29uc3RhbnRzLmpzJztcblxuLyoqXG4qIERpZmYgTWF0Y2ggYW5kIFBhdGNoXG4qIENvcHlyaWdodCAyMDE4IFRoZSBkaWZmLW1hdGNoLXBhdGNoIEF1dGhvcnMuXG4qIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZGlmZi1tYXRjaC1wYXRjaFxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuLyoqXG4qIEBmaWxlb3ZlcnZpZXcgQ29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gdGV4dHMgdG8gY3JlYXRlIGEgcGF0Y2guXG4qIEFwcGxpZXMgdGhlIHBhdGNoIG9udG8gYW5vdGhlciB0ZXh0LCBhbGxvd2luZyBmb3IgZXJyb3JzLlxuKiBAYXV0aG9yIGZyYXNlckBnb29nbGUuY29tIChOZWlsIEZyYXNlcilcbiovXG4vKipcbiogQ0hBTkdFUyBieSBwZWRyb3R0aW1hcmsgdG8gZGlmZl9tYXRjaF9wYXRjaF91bmNvbXByZXNzZWQudHMgZmlsZTpcbipcbiogMS4gRGVsZXRlIGFueXRoaW5nIG5vdCBuZWVkZWQgdG8gdXNlIGRpZmZfY2xlYW51cFNlbWFudGljIG1ldGhvZFxuKiAyLiBDb252ZXJ0IGZyb20gcHJvdG90eXBlIHByb3BlcnRpZXMgdG8gdmFyIGRlY2xhcmF0aW9uc1xuKiAzLiBDb252ZXJ0IERpZmYgdG8gY2xhc3MgZnJvbSBjb25zdHJ1Y3RvciBhbmQgcHJvdG90eXBlXG4qIDQuIEFkZCB0eXBlIGFubm90YXRpb25zIGZvciBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXNcbiogNS4gQWRkIGV4cG9ydHNcbiovXG4vKipcbiogVGhlIGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhIGRpZmYgaXMgYW4gYXJyYXkgb2YgdHVwbGVzOlxuKiBbW0RJRkZfREVMRVRFLCAnSGVsbG8nXSwgW0RJRkZfSU5TRVJULCAnR29vZGJ5ZSddLCBbRElGRl9FUVVBTCwgJyB3b3JsZC4nXV1cbiogd2hpY2ggbWVhbnM6IGRlbGV0ZSAnSGVsbG8nLCBhZGQgJ0dvb2RieWUnIGFuZCBrZWVwICcgd29ybGQuJ1xuKi9cbmNvbnN0IERJRkZfREVMRVRFID0gLTE7XG5jb25zdCBESUZGX0lOU0VSVCA9IDE7XG5jb25zdCBESUZGX0VRVUFMID0gMDtcbi8qKlxuKiBDbGFzcyByZXByZXNlbnRpbmcgb25lIGRpZmYgdHVwbGUuXG4qIEF0dGVtcHRzIHRvIGxvb2sgbGlrZSBhIHR3by1lbGVtZW50IGFycmF5ICh3aGljaCBpcyB3aGF0IHRoaXMgdXNlZCB0byBiZSkuXG4qIEBwYXJhbSB7bnVtYmVyfSBvcCBPcGVyYXRpb24sIG9uZSBvZjogRElGRl9ERUxFVEUsIERJRkZfSU5TRVJULCBESUZGX0VRVUFMLlxuKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUZXh0IHRvIGJlIGRlbGV0ZWQsIGluc2VydGVkLCBvciByZXRhaW5lZC5cbiogQGNvbnN0cnVjdG9yXG4qL1xuY2xhc3MgRGlmZiB7XG5cdDA7XG5cdDE7XG5cdGNvbnN0cnVjdG9yKG9wLCB0ZXh0KSB7XG5cdFx0dGhpc1swXSA9IG9wO1xuXHRcdHRoaXNbMV0gPSB0ZXh0O1xuXHR9XG59XG4vKipcbiogRGV0ZXJtaW5lIHRoZSBjb21tb24gcHJlZml4IG9mIHR3byBzdHJpbmdzLlxuKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLlxuKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgU2Vjb25kIHN0cmluZy5cbiogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29tbW9uIHRvIHRoZSBzdGFydCBvZiBlYWNoXG4qICAgICBzdHJpbmcuXG4qL1xuZnVuY3Rpb24gZGlmZl9jb21tb25QcmVmaXgodGV4dDEsIHRleHQyKSB7XG5cdC8vIFF1aWNrIGNoZWNrIGZvciBjb21tb24gbnVsbCBjYXNlcy5cblx0aWYgKCF0ZXh0MSB8fCAhdGV4dDIgfHwgdGV4dDEuY2hhckF0KDApICE9PSB0ZXh0Mi5jaGFyQXQoMCkpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXHQvLyBCaW5hcnkgc2VhcmNoLlxuXHQvLyBQZXJmb3JtYW5jZSBhbmFseXNpczogaHR0cHM6Ly9uZWlsLmZyYXNlci5uYW1lL25ld3MvMjAwNy8xMC8wOS9cblx0bGV0IHBvaW50ZXJtaW4gPSAwO1xuXHRsZXQgcG9pbnRlcm1heCA9IE1hdGgubWluKHRleHQxLmxlbmd0aCwgdGV4dDIubGVuZ3RoKTtcblx0bGV0IHBvaW50ZXJtaWQgPSBwb2ludGVybWF4O1xuXHRsZXQgcG9pbnRlcnN0YXJ0ID0gMDtcblx0d2hpbGUgKHBvaW50ZXJtaW4gPCBwb2ludGVybWlkKSB7XG5cdFx0aWYgKHRleHQxLnN1YnN0cmluZyhwb2ludGVyc3RhcnQsIHBvaW50ZXJtaWQpID09PSB0ZXh0Mi5zdWJzdHJpbmcocG9pbnRlcnN0YXJ0LCBwb2ludGVybWlkKSkge1xuXHRcdFx0cG9pbnRlcm1pbiA9IHBvaW50ZXJtaWQ7XG5cdFx0XHRwb2ludGVyc3RhcnQgPSBwb2ludGVybWluO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwb2ludGVybWF4ID0gcG9pbnRlcm1pZDtcblx0XHR9XG5cdFx0cG9pbnRlcm1pZCA9IE1hdGguZmxvb3IoKHBvaW50ZXJtYXggLSBwb2ludGVybWluKSAvIDIgKyBwb2ludGVybWluKTtcblx0fVxuXHRyZXR1cm4gcG9pbnRlcm1pZDtcbn1cbi8qKlxuKiBEZXRlcm1pbmUgdGhlIGNvbW1vbiBzdWZmaXggb2YgdHdvIHN0cmluZ3MuXG4qIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBGaXJzdCBzdHJpbmcuXG4qIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBTZWNvbmQgc3RyaW5nLlxuKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb21tb24gdG8gdGhlIGVuZCBvZiBlYWNoIHN0cmluZy5cbiovXG5mdW5jdGlvbiBkaWZmX2NvbW1vblN1ZmZpeCh0ZXh0MSwgdGV4dDIpIHtcblx0Ly8gUXVpY2sgY2hlY2sgZm9yIGNvbW1vbiBudWxsIGNhc2VzLlxuXHRpZiAoIXRleHQxIHx8ICF0ZXh0MiB8fCB0ZXh0MS5jaGFyQXQodGV4dDEubGVuZ3RoIC0gMSkgIT09IHRleHQyLmNoYXJBdCh0ZXh0Mi5sZW5ndGggLSAxKSkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cdC8vIEJpbmFyeSBzZWFyY2guXG5cdC8vIFBlcmZvcm1hbmNlIGFuYWx5c2lzOiBodHRwczovL25laWwuZnJhc2VyLm5hbWUvbmV3cy8yMDA3LzEwLzA5L1xuXHRsZXQgcG9pbnRlcm1pbiA9IDA7XG5cdGxldCBwb2ludGVybWF4ID0gTWF0aC5taW4odGV4dDEubGVuZ3RoLCB0ZXh0Mi5sZW5ndGgpO1xuXHRsZXQgcG9pbnRlcm1pZCA9IHBvaW50ZXJtYXg7XG5cdGxldCBwb2ludGVyZW5kID0gMDtcblx0d2hpbGUgKHBvaW50ZXJtaW4gPCBwb2ludGVybWlkKSB7XG5cdFx0aWYgKHRleHQxLnN1YnN0cmluZyh0ZXh0MS5sZW5ndGggLSBwb2ludGVybWlkLCB0ZXh0MS5sZW5ndGggLSBwb2ludGVyZW5kKSA9PT0gdGV4dDIuc3Vic3RyaW5nKHRleHQyLmxlbmd0aCAtIHBvaW50ZXJtaWQsIHRleHQyLmxlbmd0aCAtIHBvaW50ZXJlbmQpKSB7XG5cdFx0XHRwb2ludGVybWluID0gcG9pbnRlcm1pZDtcblx0XHRcdHBvaW50ZXJlbmQgPSBwb2ludGVybWluO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwb2ludGVybWF4ID0gcG9pbnRlcm1pZDtcblx0XHR9XG5cdFx0cG9pbnRlcm1pZCA9IE1hdGguZmxvb3IoKHBvaW50ZXJtYXggLSBwb2ludGVybWluKSAvIDIgKyBwb2ludGVybWluKTtcblx0fVxuXHRyZXR1cm4gcG9pbnRlcm1pZDtcbn1cbi8qKlxuKiBEZXRlcm1pbmUgaWYgdGhlIHN1ZmZpeCBvZiBvbmUgc3RyaW5nIGlzIHRoZSBwcmVmaXggb2YgYW5vdGhlci5cbiogQHBhcmFtIHtzdHJpbmd9IHRleHQxIEZpcnN0IHN0cmluZy5cbiogQHBhcmFtIHtzdHJpbmd9IHRleHQyIFNlY29uZCBzdHJpbmcuXG4qIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvbW1vbiB0byB0aGUgZW5kIG9mIHRoZSBmaXJzdFxuKiAgICAgc3RyaW5nIGFuZCB0aGUgc3RhcnQgb2YgdGhlIHNlY29uZCBzdHJpbmcuXG4qIEBwcml2YXRlXG4qL1xuZnVuY3Rpb24gZGlmZl9jb21tb25PdmVybGFwXyh0ZXh0MSwgdGV4dDIpIHtcblx0Ly8gQ2FjaGUgdGhlIHRleHQgbGVuZ3RocyB0byBwcmV2ZW50IG11bHRpcGxlIGNhbGxzLlxuXHRjb25zdCB0ZXh0MV9sZW5ndGggPSB0ZXh0MS5sZW5ndGg7XG5cdGNvbnN0IHRleHQyX2xlbmd0aCA9IHRleHQyLmxlbmd0aDtcblx0Ly8gRWxpbWluYXRlIHRoZSBudWxsIGNhc2UuXG5cdGlmICh0ZXh0MV9sZW5ndGggPT09IDAgfHwgdGV4dDJfbGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblx0Ly8gVHJ1bmNhdGUgdGhlIGxvbmdlciBzdHJpbmcuXG5cdGlmICh0ZXh0MV9sZW5ndGggPiB0ZXh0Ml9sZW5ndGgpIHtcblx0XHR0ZXh0MSA9IHRleHQxLnN1YnN0cmluZyh0ZXh0MV9sZW5ndGggLSB0ZXh0Ml9sZW5ndGgpO1xuXHR9IGVsc2UgaWYgKHRleHQxX2xlbmd0aCA8IHRleHQyX2xlbmd0aCkge1xuXHRcdHRleHQyID0gdGV4dDIuc3Vic3RyaW5nKDAsIHRleHQxX2xlbmd0aCk7XG5cdH1cblx0Y29uc3QgdGV4dF9sZW5ndGggPSBNYXRoLm1pbih0ZXh0MV9sZW5ndGgsIHRleHQyX2xlbmd0aCk7XG5cdC8vIFF1aWNrIGNoZWNrIGZvciB0aGUgd29yc3QgY2FzZS5cblx0aWYgKHRleHQxID09PSB0ZXh0Mikge1xuXHRcdHJldHVybiB0ZXh0X2xlbmd0aDtcblx0fVxuXHQvLyBTdGFydCBieSBsb29raW5nIGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIgbWF0Y2hcblx0Ly8gYW5kIGluY3JlYXNlIGxlbmd0aCB1bnRpbCBubyBtYXRjaCBpcyBmb3VuZC5cblx0Ly8gUGVyZm9ybWFuY2UgYW5hbHlzaXM6IGh0dHBzOi8vbmVpbC5mcmFzZXIubmFtZS9uZXdzLzIwMTAvMTEvMDQvXG5cdGxldCBiZXN0ID0gMDtcblx0bGV0IGxlbmd0aCA9IDE7XG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0Y29uc3QgcGF0dGVybiA9IHRleHQxLnN1YnN0cmluZyh0ZXh0X2xlbmd0aCAtIGxlbmd0aCk7XG5cdFx0Y29uc3QgZm91bmQgPSB0ZXh0Mi5pbmRleE9mKHBhdHRlcm4pO1xuXHRcdGlmIChmb3VuZCA9PT0gLTEpIHtcblx0XHRcdHJldHVybiBiZXN0O1xuXHRcdH1cblx0XHRsZW5ndGggKz0gZm91bmQ7XG5cdFx0aWYgKGZvdW5kID09PSAwIHx8IHRleHQxLnN1YnN0cmluZyh0ZXh0X2xlbmd0aCAtIGxlbmd0aCkgPT09IHRleHQyLnN1YnN0cmluZygwLCBsZW5ndGgpKSB7XG5cdFx0XHRiZXN0ID0gbGVuZ3RoO1xuXHRcdFx0bGVuZ3RoKys7XG5cdFx0fVxuXHR9XG59XG4vKipcbiogUmVkdWNlIHRoZSBudW1iZXIgb2YgZWRpdHMgYnkgZWxpbWluYXRpbmcgc2VtYW50aWNhbGx5IHRyaXZpYWwgZXF1YWxpdGllcy5cbiogQHBhcmFtIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSBkaWZmcyBBcnJheSBvZiBkaWZmIHR1cGxlcy5cbiovXG5mdW5jdGlvbiBkaWZmX2NsZWFudXBTZW1hbnRpYyhkaWZmcykge1xuXHRsZXQgY2hhbmdlcyA9IGZhbHNlO1xuXHRjb25zdCBlcXVhbGl0aWVzID0gW107XG5cdGxldCBlcXVhbGl0aWVzTGVuZ3RoID0gMDtcblx0LyoqIEB0eXBlIHs/c3RyaW5nfSAqL1xuXHRsZXQgbGFzdEVxdWFsaXR5ID0gbnVsbDtcblx0Ly8gQWx3YXlzIGVxdWFsIHRvIGRpZmZzW2VxdWFsaXRpZXNbZXF1YWxpdGllc0xlbmd0aCAtIDFdXVsxXVxuXHRsZXQgcG9pbnRlciA9IDA7XG5cdC8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2hhbmdlZCBwcmlvciB0byB0aGUgZXF1YWxpdHkuXG5cdGxldCBsZW5ndGhfaW5zZXJ0aW9uczEgPSAwO1xuXHRsZXQgbGVuZ3RoX2RlbGV0aW9uczEgPSAwO1xuXHQvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGNoYW5nZWQgYWZ0ZXIgdGhlIGVxdWFsaXR5LlxuXHRsZXQgbGVuZ3RoX2luc2VydGlvbnMyID0gMDtcblx0bGV0IGxlbmd0aF9kZWxldGlvbnMyID0gMDtcblx0d2hpbGUgKHBvaW50ZXIgPCBkaWZmcy5sZW5ndGgpIHtcblx0XHRpZiAoZGlmZnNbcG9pbnRlcl1bMF0gPT09IERJRkZfRVFVQUwpIHtcblx0XHRcdC8vIEVxdWFsaXR5IGZvdW5kLlxuXHRcdFx0ZXF1YWxpdGllc1tlcXVhbGl0aWVzTGVuZ3RoKytdID0gcG9pbnRlcjtcblx0XHRcdGxlbmd0aF9pbnNlcnRpb25zMSA9IGxlbmd0aF9pbnNlcnRpb25zMjtcblx0XHRcdGxlbmd0aF9kZWxldGlvbnMxID0gbGVuZ3RoX2RlbGV0aW9uczI7XG5cdFx0XHRsZW5ndGhfaW5zZXJ0aW9uczIgPSAwO1xuXHRcdFx0bGVuZ3RoX2RlbGV0aW9uczIgPSAwO1xuXHRcdFx0bGFzdEVxdWFsaXR5ID0gZGlmZnNbcG9pbnRlcl1bMV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEFuIGluc2VydGlvbiBvciBkZWxldGlvbi5cblx0XHRcdGlmIChkaWZmc1twb2ludGVyXVswXSA9PT0gRElGRl9JTlNFUlQpIHtcblx0XHRcdFx0bGVuZ3RoX2luc2VydGlvbnMyICs9IGRpZmZzW3BvaW50ZXJdWzFdLmxlbmd0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGxlbmd0aF9kZWxldGlvbnMyICs9IGRpZmZzW3BvaW50ZXJdWzFdLmxlbmd0aDtcblx0XHRcdH1cblx0XHRcdC8vIEVsaW1pbmF0ZSBhbiBlcXVhbGl0eSB0aGF0IGlzIHNtYWxsZXIgb3IgZXF1YWwgdG8gdGhlIGVkaXRzIG9uIGJvdGhcblx0XHRcdC8vIHNpZGVzIG9mIGl0LlxuXHRcdFx0aWYgKGxhc3RFcXVhbGl0eSAmJiBsYXN0RXF1YWxpdHkubGVuZ3RoIDw9IE1hdGgubWF4KGxlbmd0aF9pbnNlcnRpb25zMSwgbGVuZ3RoX2RlbGV0aW9uczEpICYmIGxhc3RFcXVhbGl0eS5sZW5ndGggPD0gTWF0aC5tYXgobGVuZ3RoX2luc2VydGlvbnMyLCBsZW5ndGhfZGVsZXRpb25zMikpIHtcblx0XHRcdFx0Ly8gRHVwbGljYXRlIHJlY29yZC5cblx0XHRcdFx0ZGlmZnMuc3BsaWNlKGVxdWFsaXRpZXNbZXF1YWxpdGllc0xlbmd0aCAtIDFdLCAwLCBuZXcgRGlmZihESUZGX0RFTEVURSwgbGFzdEVxdWFsaXR5KSk7XG5cdFx0XHRcdC8vIENoYW5nZSBzZWNvbmQgY29weSB0byBpbnNlcnQuXG5cdFx0XHRcdGRpZmZzW2VxdWFsaXRpZXNbZXF1YWxpdGllc0xlbmd0aCAtIDFdICsgMV1bMF0gPSBESUZGX0lOU0VSVDtcblx0XHRcdFx0Ly8gVGhyb3cgYXdheSB0aGUgZXF1YWxpdHkgd2UganVzdCBkZWxldGVkLlxuXHRcdFx0XHRlcXVhbGl0aWVzTGVuZ3RoLS07XG5cdFx0XHRcdC8vIFRocm93IGF3YXkgdGhlIHByZXZpb3VzIGVxdWFsaXR5IChpdCBuZWVkcyB0byBiZSByZWV2YWx1YXRlZCkuXG5cdFx0XHRcdGVxdWFsaXRpZXNMZW5ndGgtLTtcblx0XHRcdFx0cG9pbnRlciA9IGVxdWFsaXRpZXNMZW5ndGggPiAwID8gZXF1YWxpdGllc1tlcXVhbGl0aWVzTGVuZ3RoIC0gMV0gOiAtMTtcblx0XHRcdFx0bGVuZ3RoX2luc2VydGlvbnMxID0gMDtcblx0XHRcdFx0bGVuZ3RoX2RlbGV0aW9uczEgPSAwO1xuXHRcdFx0XHRsZW5ndGhfaW5zZXJ0aW9uczIgPSAwO1xuXHRcdFx0XHRsZW5ndGhfZGVsZXRpb25zMiA9IDA7XG5cdFx0XHRcdGxhc3RFcXVhbGl0eSA9IG51bGw7XG5cdFx0XHRcdGNoYW5nZXMgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRwb2ludGVyKys7XG5cdH1cblx0Ly8gTm9ybWFsaXplIHRoZSBkaWZmLlxuXHRpZiAoY2hhbmdlcykge1xuXHRcdGRpZmZfY2xlYW51cE1lcmdlKGRpZmZzKTtcblx0fVxuXHRkaWZmX2NsZWFudXBTZW1hbnRpY0xvc3NsZXNzKGRpZmZzKTtcblx0Ly8gRmluZCBhbnkgb3ZlcmxhcHMgYmV0d2VlbiBkZWxldGlvbnMgYW5kIGluc2VydGlvbnMuXG5cdC8vIGUuZzogPGRlbD5hYmN4eHg8L2RlbD48aW5zPnh4eGRlZjwvaW5zPlxuXHQvLyAgIC0+IDxkZWw+YWJjPC9kZWw+eHh4PGlucz5kZWY8L2lucz5cblx0Ly8gZS5nOiA8ZGVsPnh4eGFiYzwvZGVsPjxpbnM+ZGVmeHh4PC9pbnM+XG5cdC8vICAgLT4gPGlucz5kZWY8L2lucz54eHg8ZGVsPmFiYzwvZGVsPlxuXHQvLyBPbmx5IGV4dHJhY3QgYW4gb3ZlcmxhcCBpZiBpdCBpcyBhcyBiaWcgYXMgdGhlIGVkaXQgYWhlYWQgb3IgYmVoaW5kIGl0LlxuXHRwb2ludGVyID0gMTtcblx0d2hpbGUgKHBvaW50ZXIgPCBkaWZmcy5sZW5ndGgpIHtcblx0XHRpZiAoZGlmZnNbcG9pbnRlciAtIDFdWzBdID09PSBESUZGX0RFTEVURSAmJiBkaWZmc1twb2ludGVyXVswXSA9PT0gRElGRl9JTlNFUlQpIHtcblx0XHRcdGNvbnN0IGRlbGV0aW9uID0gZGlmZnNbcG9pbnRlciAtIDFdWzFdO1xuXHRcdFx0Y29uc3QgaW5zZXJ0aW9uID0gZGlmZnNbcG9pbnRlcl1bMV07XG5cdFx0XHRjb25zdCBvdmVybGFwX2xlbmd0aDEgPSBkaWZmX2NvbW1vbk92ZXJsYXBfKGRlbGV0aW9uLCBpbnNlcnRpb24pO1xuXHRcdFx0Y29uc3Qgb3ZlcmxhcF9sZW5ndGgyID0gZGlmZl9jb21tb25PdmVybGFwXyhpbnNlcnRpb24sIGRlbGV0aW9uKTtcblx0XHRcdGlmIChvdmVybGFwX2xlbmd0aDEgPj0gb3ZlcmxhcF9sZW5ndGgyKSB7XG5cdFx0XHRcdGlmIChvdmVybGFwX2xlbmd0aDEgPj0gZGVsZXRpb24ubGVuZ3RoIC8gMiB8fCBvdmVybGFwX2xlbmd0aDEgPj0gaW5zZXJ0aW9uLmxlbmd0aCAvIDIpIHtcblx0XHRcdFx0XHQvLyBPdmVybGFwIGZvdW5kLiAgSW5zZXJ0IGFuIGVxdWFsaXR5IGFuZCB0cmltIHRoZSBzdXJyb3VuZGluZyBlZGl0cy5cblx0XHRcdFx0XHRkaWZmcy5zcGxpY2UocG9pbnRlciwgMCwgbmV3IERpZmYoRElGRl9FUVVBTCwgaW5zZXJ0aW9uLnN1YnN0cmluZygwLCBvdmVybGFwX2xlbmd0aDEpKSk7XG5cdFx0XHRcdFx0ZGlmZnNbcG9pbnRlciAtIDFdWzFdID0gZGVsZXRpb24uc3Vic3RyaW5nKDAsIGRlbGV0aW9uLmxlbmd0aCAtIG92ZXJsYXBfbGVuZ3RoMSk7XG5cdFx0XHRcdFx0ZGlmZnNbcG9pbnRlciArIDFdWzFdID0gaW5zZXJ0aW9uLnN1YnN0cmluZyhvdmVybGFwX2xlbmd0aDEpO1xuXHRcdFx0XHRcdHBvaW50ZXIrKztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKG92ZXJsYXBfbGVuZ3RoMiA+PSBkZWxldGlvbi5sZW5ndGggLyAyIHx8IG92ZXJsYXBfbGVuZ3RoMiA+PSBpbnNlcnRpb24ubGVuZ3RoIC8gMikge1xuXHRcdFx0XHRcdC8vIFJldmVyc2Ugb3ZlcmxhcCBmb3VuZC5cblx0XHRcdFx0XHQvLyBJbnNlcnQgYW4gZXF1YWxpdHkgYW5kIHN3YXAgYW5kIHRyaW0gdGhlIHN1cnJvdW5kaW5nIGVkaXRzLlxuXHRcdFx0XHRcdGRpZmZzLnNwbGljZShwb2ludGVyLCAwLCBuZXcgRGlmZihESUZGX0VRVUFMLCBkZWxldGlvbi5zdWJzdHJpbmcoMCwgb3ZlcmxhcF9sZW5ndGgyKSkpO1xuXHRcdFx0XHRcdGRpZmZzW3BvaW50ZXIgLSAxXVswXSA9IERJRkZfSU5TRVJUO1xuXHRcdFx0XHRcdGRpZmZzW3BvaW50ZXIgLSAxXVsxXSA9IGluc2VydGlvbi5zdWJzdHJpbmcoMCwgaW5zZXJ0aW9uLmxlbmd0aCAtIG92ZXJsYXBfbGVuZ3RoMik7XG5cdFx0XHRcdFx0ZGlmZnNbcG9pbnRlciArIDFdWzBdID0gRElGRl9ERUxFVEU7XG5cdFx0XHRcdFx0ZGlmZnNbcG9pbnRlciArIDFdWzFdID0gZGVsZXRpb24uc3Vic3RyaW5nKG92ZXJsYXBfbGVuZ3RoMik7XG5cdFx0XHRcdFx0cG9pbnRlcisrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRwb2ludGVyKys7XG5cdFx0fVxuXHRcdHBvaW50ZXIrKztcblx0fVxufVxuLy8gRGVmaW5lIHNvbWUgcmVnZXggcGF0dGVybnMgZm9yIG1hdGNoaW5nIGJvdW5kYXJpZXMuXG5jb25zdCBub25BbHBoYU51bWVyaWNSZWdleF8gPSAvW15hLXowLTldL2k7XG5jb25zdCB3aGl0ZXNwYWNlUmVnZXhfID0gL1xccy87XG5jb25zdCBsaW5lYnJlYWtSZWdleF8gPSAvW1xcclxcbl0vO1xuY29uc3QgYmxhbmtsaW5lRW5kUmVnZXhfID0gL1xcblxccj9cXG4kLztcbmNvbnN0IGJsYW5rbGluZVN0YXJ0UmVnZXhfID0gL15cXHI/XFxuXFxyP1xcbi87XG4vKipcbiogTG9vayBmb3Igc2luZ2xlIGVkaXRzIHN1cnJvdW5kZWQgb24gYm90aCBzaWRlcyBieSBlcXVhbGl0aWVzXG4qIHdoaWNoIGNhbiBiZSBzaGlmdGVkIHNpZGV3YXlzIHRvIGFsaWduIHRoZSBlZGl0IHRvIGEgd29yZCBib3VuZGFyeS5cbiogZS5nOiBUaGUgYzxpbnM+YXQgYzwvaW5zPmFtZS4gLT4gVGhlIDxpbnM+Y2F0IDwvaW5zPmNhbWUuXG4qIEBwYXJhbSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5EaWZmPn0gZGlmZnMgQXJyYXkgb2YgZGlmZiB0dXBsZXMuXG4qL1xuZnVuY3Rpb24gZGlmZl9jbGVhbnVwU2VtYW50aWNMb3NzbGVzcyhkaWZmcykge1xuXHRsZXQgcG9pbnRlciA9IDE7XG5cdC8vIEludGVudGlvbmFsbHkgaWdub3JlIHRoZSBmaXJzdCBhbmQgbGFzdCBlbGVtZW50IChkb24ndCBuZWVkIGNoZWNraW5nKS5cblx0d2hpbGUgKHBvaW50ZXIgPCBkaWZmcy5sZW5ndGggLSAxKSB7XG5cdFx0aWYgKGRpZmZzW3BvaW50ZXIgLSAxXVswXSA9PT0gRElGRl9FUVVBTCAmJiBkaWZmc1twb2ludGVyICsgMV1bMF0gPT09IERJRkZfRVFVQUwpIHtcblx0XHRcdC8vIFRoaXMgaXMgYSBzaW5nbGUgZWRpdCBzdXJyb3VuZGVkIGJ5IGVxdWFsaXRpZXMuXG5cdFx0XHRsZXQgZXF1YWxpdHkxID0gZGlmZnNbcG9pbnRlciAtIDFdWzFdO1xuXHRcdFx0bGV0IGVkaXQgPSBkaWZmc1twb2ludGVyXVsxXTtcblx0XHRcdGxldCBlcXVhbGl0eTIgPSBkaWZmc1twb2ludGVyICsgMV1bMV07XG5cdFx0XHQvLyBGaXJzdCwgc2hpZnQgdGhlIGVkaXQgYXMgZmFyIGxlZnQgYXMgcG9zc2libGUuXG5cdFx0XHRjb25zdCBjb21tb25PZmZzZXQgPSBkaWZmX2NvbW1vblN1ZmZpeChlcXVhbGl0eTEsIGVkaXQpO1xuXHRcdFx0aWYgKGNvbW1vbk9mZnNldCkge1xuXHRcdFx0XHRjb25zdCBjb21tb25TdHJpbmcgPSBlZGl0LnN1YnN0cmluZyhlZGl0Lmxlbmd0aCAtIGNvbW1vbk9mZnNldCk7XG5cdFx0XHRcdGVxdWFsaXR5MSA9IGVxdWFsaXR5MS5zdWJzdHJpbmcoMCwgZXF1YWxpdHkxLmxlbmd0aCAtIGNvbW1vbk9mZnNldCk7XG5cdFx0XHRcdGVkaXQgPSBjb21tb25TdHJpbmcgKyBlZGl0LnN1YnN0cmluZygwLCBlZGl0Lmxlbmd0aCAtIGNvbW1vbk9mZnNldCk7XG5cdFx0XHRcdGVxdWFsaXR5MiA9IGNvbW1vblN0cmluZyArIGVxdWFsaXR5Mjtcblx0XHRcdH1cblx0XHRcdC8vIFNlY29uZCwgc3RlcCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyIHJpZ2h0LCBsb29raW5nIGZvciB0aGUgYmVzdCBmaXQuXG5cdFx0XHRsZXQgYmVzdEVxdWFsaXR5MSA9IGVxdWFsaXR5MTtcblx0XHRcdGxldCBiZXN0RWRpdCA9IGVkaXQ7XG5cdFx0XHRsZXQgYmVzdEVxdWFsaXR5MiA9IGVxdWFsaXR5Mjtcblx0XHRcdGxldCBiZXN0U2NvcmUgPSBkaWZmX2NsZWFudXBTZW1hbnRpY1Njb3JlXyhlcXVhbGl0eTEsIGVkaXQpICsgZGlmZl9jbGVhbnVwU2VtYW50aWNTY29yZV8oZWRpdCwgZXF1YWxpdHkyKTtcblx0XHRcdHdoaWxlIChlZGl0LmNoYXJBdCgwKSA9PT0gZXF1YWxpdHkyLmNoYXJBdCgwKSkge1xuXHRcdFx0XHRlcXVhbGl0eTEgKz0gZWRpdC5jaGFyQXQoMCk7XG5cdFx0XHRcdGVkaXQgPSBlZGl0LnN1YnN0cmluZygxKSArIGVxdWFsaXR5Mi5jaGFyQXQoMCk7XG5cdFx0XHRcdGVxdWFsaXR5MiA9IGVxdWFsaXR5Mi5zdWJzdHJpbmcoMSk7XG5cdFx0XHRcdGNvbnN0IHNjb3JlID0gZGlmZl9jbGVhbnVwU2VtYW50aWNTY29yZV8oZXF1YWxpdHkxLCBlZGl0KSArIGRpZmZfY2xlYW51cFNlbWFudGljU2NvcmVfKGVkaXQsIGVxdWFsaXR5Mik7XG5cdFx0XHRcdC8vIFRoZSA+PSBlbmNvdXJhZ2VzIHRyYWlsaW5nIHJhdGhlciB0aGFuIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiBlZGl0cy5cblx0XHRcdFx0aWYgKHNjb3JlID49IGJlc3RTY29yZSkge1xuXHRcdFx0XHRcdGJlc3RTY29yZSA9IHNjb3JlO1xuXHRcdFx0XHRcdGJlc3RFcXVhbGl0eTEgPSBlcXVhbGl0eTE7XG5cdFx0XHRcdFx0YmVzdEVkaXQgPSBlZGl0O1xuXHRcdFx0XHRcdGJlc3RFcXVhbGl0eTIgPSBlcXVhbGl0eTI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChkaWZmc1twb2ludGVyIC0gMV1bMV0gIT09IGJlc3RFcXVhbGl0eTEpIHtcblx0XHRcdFx0Ly8gV2UgaGF2ZSBhbiBpbXByb3ZlbWVudCwgc2F2ZSBpdCBiYWNrIHRvIHRoZSBkaWZmLlxuXHRcdFx0XHRpZiAoYmVzdEVxdWFsaXR5MSkge1xuXHRcdFx0XHRcdGRpZmZzW3BvaW50ZXIgLSAxXVsxXSA9IGJlc3RFcXVhbGl0eTE7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGlmZnMuc3BsaWNlKHBvaW50ZXIgLSAxLCAxKTtcblx0XHRcdFx0XHRwb2ludGVyLS07XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGlmZnNbcG9pbnRlcl1bMV0gPSBiZXN0RWRpdDtcblx0XHRcdFx0aWYgKGJlc3RFcXVhbGl0eTIpIHtcblx0XHRcdFx0XHRkaWZmc1twb2ludGVyICsgMV1bMV0gPSBiZXN0RXF1YWxpdHkyO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRpZmZzLnNwbGljZShwb2ludGVyICsgMSwgMSk7XG5cdFx0XHRcdFx0cG9pbnRlci0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHBvaW50ZXIrKztcblx0fVxufVxuLyoqXG4qIFJlb3JkZXIgYW5kIG1lcmdlIGxpa2UgZWRpdCBzZWN0aW9ucy4gIE1lcmdlIGVxdWFsaXRpZXMuXG4qIEFueSBlZGl0IHNlY3Rpb24gY2FuIG1vdmUgYXMgbG9uZyBhcyBpdCBkb2Vzbid0IGNyb3NzIGFuIGVxdWFsaXR5LlxuKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuKi9cbmZ1bmN0aW9uIGRpZmZfY2xlYW51cE1lcmdlKGRpZmZzKSB7XG5cdC8vIEFkZCBhIGR1bW15IGVudHJ5IGF0IHRoZSBlbmQuXG5cdGRpZmZzLnB1c2gobmV3IERpZmYoRElGRl9FUVVBTCwgXCJcIikpO1xuXHRsZXQgcG9pbnRlciA9IDA7XG5cdGxldCBjb3VudF9kZWxldGUgPSAwO1xuXHRsZXQgY291bnRfaW5zZXJ0ID0gMDtcblx0bGV0IHRleHRfZGVsZXRlID0gXCJcIjtcblx0bGV0IHRleHRfaW5zZXJ0ID0gXCJcIjtcblx0bGV0IGNvbW1vbmxlbmd0aDtcblx0d2hpbGUgKHBvaW50ZXIgPCBkaWZmcy5sZW5ndGgpIHtcblx0XHRzd2l0Y2ggKGRpZmZzW3BvaW50ZXJdWzBdKSB7XG5cdFx0XHRjYXNlIERJRkZfSU5TRVJUOlxuXHRcdFx0XHRjb3VudF9pbnNlcnQrKztcblx0XHRcdFx0dGV4dF9pbnNlcnQgKz0gZGlmZnNbcG9pbnRlcl1bMV07XG5cdFx0XHRcdHBvaW50ZXIrKztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIERJRkZfREVMRVRFOlxuXHRcdFx0XHRjb3VudF9kZWxldGUrKztcblx0XHRcdFx0dGV4dF9kZWxldGUgKz0gZGlmZnNbcG9pbnRlcl1bMV07XG5cdFx0XHRcdHBvaW50ZXIrKztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIERJRkZfRVFVQUw6XG5cdFx0XHRcdC8vIFVwb24gcmVhY2hpbmcgYW4gZXF1YWxpdHksIGNoZWNrIGZvciBwcmlvciByZWR1bmRhbmNpZXMuXG5cdFx0XHRcdGlmIChjb3VudF9kZWxldGUgKyBjb3VudF9pbnNlcnQgPiAxKSB7XG5cdFx0XHRcdFx0aWYgKGNvdW50X2RlbGV0ZSAhPT0gMCAmJiBjb3VudF9pbnNlcnQgIT09IDApIHtcblx0XHRcdFx0XHRcdC8vIEZhY3RvciBvdXQgYW55IGNvbW1vbiBwcmVmaXhlcy5cblx0XHRcdFx0XHRcdGNvbW1vbmxlbmd0aCA9IGRpZmZfY29tbW9uUHJlZml4KHRleHRfaW5zZXJ0LCB0ZXh0X2RlbGV0ZSk7XG5cdFx0XHRcdFx0XHRpZiAoY29tbW9ubGVuZ3RoICE9PSAwKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChwb2ludGVyIC0gY291bnRfZGVsZXRlIC0gY291bnRfaW5zZXJ0ID4gMCAmJiBkaWZmc1twb2ludGVyIC0gY291bnRfZGVsZXRlIC0gY291bnRfaW5zZXJ0IC0gMV1bMF0gPT09IERJRkZfRVFVQUwpIHtcblx0XHRcdFx0XHRcdFx0XHRkaWZmc1twb2ludGVyIC0gY291bnRfZGVsZXRlIC0gY291bnRfaW5zZXJ0IC0gMV1bMV0gKz0gdGV4dF9pbnNlcnQuc3Vic3RyaW5nKDAsIGNvbW1vbmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0ZGlmZnMuc3BsaWNlKDAsIDAsIG5ldyBEaWZmKERJRkZfRVFVQUwsIHRleHRfaW5zZXJ0LnN1YnN0cmluZygwLCBjb21tb25sZW5ndGgpKSk7XG5cdFx0XHRcdFx0XHRcdFx0cG9pbnRlcisrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRleHRfaW5zZXJ0ID0gdGV4dF9pbnNlcnQuc3Vic3RyaW5nKGNvbW1vbmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRcdHRleHRfZGVsZXRlID0gdGV4dF9kZWxldGUuc3Vic3RyaW5nKGNvbW1vbmxlbmd0aCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBGYWN0b3Igb3V0IGFueSBjb21tb24gc3VmZml4ZXMuXG5cdFx0XHRcdFx0XHRjb21tb25sZW5ndGggPSBkaWZmX2NvbW1vblN1ZmZpeCh0ZXh0X2luc2VydCwgdGV4dF9kZWxldGUpO1xuXHRcdFx0XHRcdFx0aWYgKGNvbW1vbmxlbmd0aCAhPT0gMCkge1xuXHRcdFx0XHRcdFx0XHRkaWZmc1twb2ludGVyXVsxXSA9IHRleHRfaW5zZXJ0LnN1YnN0cmluZyh0ZXh0X2luc2VydC5sZW5ndGggLSBjb21tb25sZW5ndGgpICsgZGlmZnNbcG9pbnRlcl1bMV07XG5cdFx0XHRcdFx0XHRcdHRleHRfaW5zZXJ0ID0gdGV4dF9pbnNlcnQuc3Vic3RyaW5nKDAsIHRleHRfaW5zZXJ0Lmxlbmd0aCAtIGNvbW1vbmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRcdHRleHRfZGVsZXRlID0gdGV4dF9kZWxldGUuc3Vic3RyaW5nKDAsIHRleHRfZGVsZXRlLmxlbmd0aCAtIGNvbW1vbmxlbmd0aCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIERlbGV0ZSB0aGUgb2ZmZW5kaW5nIHJlY29yZHMgYW5kIGFkZCB0aGUgbWVyZ2VkIG9uZXMuXG5cdFx0XHRcdFx0cG9pbnRlciAtPSBjb3VudF9kZWxldGUgKyBjb3VudF9pbnNlcnQ7XG5cdFx0XHRcdFx0ZGlmZnMuc3BsaWNlKHBvaW50ZXIsIGNvdW50X2RlbGV0ZSArIGNvdW50X2luc2VydCk7XG5cdFx0XHRcdFx0aWYgKHRleHRfZGVsZXRlLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0ZGlmZnMuc3BsaWNlKHBvaW50ZXIsIDAsIG5ldyBEaWZmKERJRkZfREVMRVRFLCB0ZXh0X2RlbGV0ZSkpO1xuXHRcdFx0XHRcdFx0cG9pbnRlcisrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodGV4dF9pbnNlcnQubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRkaWZmcy5zcGxpY2UocG9pbnRlciwgMCwgbmV3IERpZmYoRElGRl9JTlNFUlQsIHRleHRfaW5zZXJ0KSk7XG5cdFx0XHRcdFx0XHRwb2ludGVyKys7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBvaW50ZXIrKztcblx0XHRcdFx0fSBlbHNlIGlmIChwb2ludGVyICE9PSAwICYmIGRpZmZzW3BvaW50ZXIgLSAxXVswXSA9PT0gRElGRl9FUVVBTCkge1xuXHRcdFx0XHRcdC8vIE1lcmdlIHRoaXMgZXF1YWxpdHkgd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuXHRcdFx0XHRcdGRpZmZzW3BvaW50ZXIgLSAxXVsxXSArPSBkaWZmc1twb2ludGVyXVsxXTtcblx0XHRcdFx0XHRkaWZmcy5zcGxpY2UocG9pbnRlciwgMSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cG9pbnRlcisrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvdW50X2luc2VydCA9IDA7XG5cdFx0XHRcdGNvdW50X2RlbGV0ZSA9IDA7XG5cdFx0XHRcdHRleHRfZGVsZXRlID0gXCJcIjtcblx0XHRcdFx0dGV4dF9pbnNlcnQgPSBcIlwiO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblx0aWYgKGRpZmZzLmF0KC0xKT8uWzFdID09PSBcIlwiKSB7XG5cdFx0ZGlmZnMucG9wKCk7XG5cdH1cblx0Ly8gU2Vjb25kIHBhc3M6IGxvb2sgZm9yIHNpbmdsZSBlZGl0cyBzdXJyb3VuZGVkIG9uIGJvdGggc2lkZXMgYnkgZXF1YWxpdGllc1xuXHQvLyB3aGljaCBjYW4gYmUgc2hpZnRlZCBzaWRld2F5cyB0byBlbGltaW5hdGUgYW4gZXF1YWxpdHkuXG5cdC8vIGUuZzogQTxpbnM+QkE8L2lucz5DIC0+IDxpbnM+QUI8L2lucz5BQ1xuXHRsZXQgY2hhbmdlcyA9IGZhbHNlO1xuXHRwb2ludGVyID0gMTtcblx0Ly8gSW50ZW50aW9uYWxseSBpZ25vcmUgdGhlIGZpcnN0IGFuZCBsYXN0IGVsZW1lbnQgKGRvbid0IG5lZWQgY2hlY2tpbmcpLlxuXHR3aGlsZSAocG9pbnRlciA8IGRpZmZzLmxlbmd0aCAtIDEpIHtcblx0XHRpZiAoZGlmZnNbcG9pbnRlciAtIDFdWzBdID09PSBESUZGX0VRVUFMICYmIGRpZmZzW3BvaW50ZXIgKyAxXVswXSA9PT0gRElGRl9FUVVBTCkge1xuXHRcdFx0Ly8gVGhpcyBpcyBhIHNpbmdsZSBlZGl0IHN1cnJvdW5kZWQgYnkgZXF1YWxpdGllcy5cblx0XHRcdGlmIChkaWZmc1twb2ludGVyXVsxXS5zdWJzdHJpbmcoZGlmZnNbcG9pbnRlcl1bMV0ubGVuZ3RoIC0gZGlmZnNbcG9pbnRlciAtIDFdWzFdLmxlbmd0aCkgPT09IGRpZmZzW3BvaW50ZXIgLSAxXVsxXSkge1xuXHRcdFx0XHQvLyBTaGlmdCB0aGUgZWRpdCBvdmVyIHRoZSBwcmV2aW91cyBlcXVhbGl0eS5cblx0XHRcdFx0ZGlmZnNbcG9pbnRlcl1bMV0gPSBkaWZmc1twb2ludGVyIC0gMV1bMV0gKyBkaWZmc1twb2ludGVyXVsxXS5zdWJzdHJpbmcoMCwgZGlmZnNbcG9pbnRlcl1bMV0ubGVuZ3RoIC0gZGlmZnNbcG9pbnRlciAtIDFdWzFdLmxlbmd0aCk7XG5cdFx0XHRcdGRpZmZzW3BvaW50ZXIgKyAxXVsxXSA9IGRpZmZzW3BvaW50ZXIgLSAxXVsxXSArIGRpZmZzW3BvaW50ZXIgKyAxXVsxXTtcblx0XHRcdFx0ZGlmZnMuc3BsaWNlKHBvaW50ZXIgLSAxLCAxKTtcblx0XHRcdFx0Y2hhbmdlcyA9IHRydWU7XG5cdFx0XHR9IGVsc2UgaWYgKGRpZmZzW3BvaW50ZXJdWzFdLnN1YnN0cmluZygwLCBkaWZmc1twb2ludGVyICsgMV1bMV0ubGVuZ3RoKSA9PT0gZGlmZnNbcG9pbnRlciArIDFdWzFdKSB7XG5cdFx0XHRcdC8vIFNoaWZ0IHRoZSBlZGl0IG92ZXIgdGhlIG5leHQgZXF1YWxpdHkuXG5cdFx0XHRcdGRpZmZzW3BvaW50ZXIgLSAxXVsxXSArPSBkaWZmc1twb2ludGVyICsgMV1bMV07XG5cdFx0XHRcdGRpZmZzW3BvaW50ZXJdWzFdID0gZGlmZnNbcG9pbnRlcl1bMV0uc3Vic3RyaW5nKGRpZmZzW3BvaW50ZXIgKyAxXVsxXS5sZW5ndGgpICsgZGlmZnNbcG9pbnRlciArIDFdWzFdO1xuXHRcdFx0XHRkaWZmcy5zcGxpY2UocG9pbnRlciArIDEsIDEpO1xuXHRcdFx0XHRjaGFuZ2VzID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cG9pbnRlcisrO1xuXHR9XG5cdC8vIElmIHNoaWZ0cyB3ZXJlIG1hZGUsIHRoZSBkaWZmIG5lZWRzIHJlb3JkZXJpbmcgYW5kIGFub3RoZXIgc2hpZnQgc3dlZXAuXG5cdGlmIChjaGFuZ2VzKSB7XG5cdFx0ZGlmZl9jbGVhbnVwTWVyZ2UoZGlmZnMpO1xuXHR9XG59XG4vKipcbiogR2l2ZW4gdHdvIHN0cmluZ3MsIGNvbXB1dGUgYSBzY29yZSByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgaW50ZXJuYWxcbiogYm91bmRhcnkgZmFsbHMgb24gbG9naWNhbCBib3VuZGFyaWVzLlxuKiBTY29yZXMgcmFuZ2UgZnJvbSA2IChiZXN0KSB0byAwICh3b3JzdCkuXG4qIENsb3N1cmUsIGJ1dCBkb2VzIG5vdCByZWZlcmVuY2UgYW55IGV4dGVybmFsIHZhcmlhYmxlcy5cbiogQHBhcmFtIHtzdHJpbmd9IG9uZSBGaXJzdCBzdHJpbmcuXG4qIEBwYXJhbSB7c3RyaW5nfSB0d28gU2Vjb25kIHN0cmluZy5cbiogQHJldHVybiB7bnVtYmVyfSBUaGUgc2NvcmUuXG4qIEBwcml2YXRlXG4qL1xuZnVuY3Rpb24gZGlmZl9jbGVhbnVwU2VtYW50aWNTY29yZV8ob25lLCB0d28pIHtcblx0aWYgKCFvbmUgfHwgIXR3bykge1xuXHRcdC8vIEVkZ2VzIGFyZSB0aGUgYmVzdC5cblx0XHRyZXR1cm4gNjtcblx0fVxuXHQvLyBFYWNoIHBvcnQgb2YgdGhpcyBmdW5jdGlvbiBiZWhhdmVzIHNsaWdodGx5IGRpZmZlcmVudGx5IGR1ZSB0b1xuXHQvLyBzdWJ0bGUgZGlmZmVyZW5jZXMgaW4gZWFjaCBsYW5ndWFnZSdzIGRlZmluaXRpb24gb2YgdGhpbmdzIGxpa2Vcblx0Ly8gJ3doaXRlc3BhY2UnLiAgU2luY2UgdGhpcyBmdW5jdGlvbidzIHB1cnBvc2UgaXMgbGFyZ2VseSBjb3NtZXRpYyxcblx0Ly8gdGhlIGNob2ljZSBoYXMgYmVlbiBtYWRlIHRvIHVzZSBlYWNoIGxhbmd1YWdlJ3MgbmF0aXZlIGZlYXR1cmVzXG5cdC8vIHJhdGhlciB0aGFuIGZvcmNlIHRvdGFsIGNvbmZvcm1pdHkuXG5cdGNvbnN0IGNoYXIxID0gb25lLmNoYXJBdChvbmUubGVuZ3RoIC0gMSk7XG5cdGNvbnN0IGNoYXIyID0gdHdvLmNoYXJBdCgwKTtcblx0Y29uc3Qgbm9uQWxwaGFOdW1lcmljMSA9IGNoYXIxLm1hdGNoKG5vbkFscGhhTnVtZXJpY1JlZ2V4Xyk7XG5cdGNvbnN0IG5vbkFscGhhTnVtZXJpYzIgPSBjaGFyMi5tYXRjaChub25BbHBoYU51bWVyaWNSZWdleF8pO1xuXHRjb25zdCB3aGl0ZXNwYWNlMSA9IG5vbkFscGhhTnVtZXJpYzEgJiYgY2hhcjEubWF0Y2god2hpdGVzcGFjZVJlZ2V4Xyk7XG5cdGNvbnN0IHdoaXRlc3BhY2UyID0gbm9uQWxwaGFOdW1lcmljMiAmJiBjaGFyMi5tYXRjaCh3aGl0ZXNwYWNlUmVnZXhfKTtcblx0Y29uc3QgbGluZUJyZWFrMSA9IHdoaXRlc3BhY2UxICYmIGNoYXIxLm1hdGNoKGxpbmVicmVha1JlZ2V4Xyk7XG5cdGNvbnN0IGxpbmVCcmVhazIgPSB3aGl0ZXNwYWNlMiAmJiBjaGFyMi5tYXRjaChsaW5lYnJlYWtSZWdleF8pO1xuXHRjb25zdCBibGFua0xpbmUxID0gbGluZUJyZWFrMSAmJiBvbmUubWF0Y2goYmxhbmtsaW5lRW5kUmVnZXhfKTtcblx0Y29uc3QgYmxhbmtMaW5lMiA9IGxpbmVCcmVhazIgJiYgdHdvLm1hdGNoKGJsYW5rbGluZVN0YXJ0UmVnZXhfKTtcblx0aWYgKGJsYW5rTGluZTEgfHwgYmxhbmtMaW5lMikge1xuXHRcdC8vIEZpdmUgcG9pbnRzIGZvciBibGFuayBsaW5lcy5cblx0XHRyZXR1cm4gNTtcblx0fSBlbHNlIGlmIChsaW5lQnJlYWsxIHx8IGxpbmVCcmVhazIpIHtcblx0XHQvLyBGb3VyIHBvaW50cyBmb3IgbGluZSBicmVha3MuXG5cdFx0cmV0dXJuIDQ7XG5cdH0gZWxzZSBpZiAobm9uQWxwaGFOdW1lcmljMSAmJiAhd2hpdGVzcGFjZTEgJiYgd2hpdGVzcGFjZTIpIHtcblx0XHQvLyBUaHJlZSBwb2ludHMgZm9yIGVuZCBvZiBzZW50ZW5jZXMuXG5cdFx0cmV0dXJuIDM7XG5cdH0gZWxzZSBpZiAod2hpdGVzcGFjZTEgfHwgd2hpdGVzcGFjZTIpIHtcblx0XHQvLyBUd28gcG9pbnRzIGZvciB3aGl0ZXNwYWNlLlxuXHRcdHJldHVybiAyO1xuXHR9IGVsc2UgaWYgKG5vbkFscGhhTnVtZXJpYzEgfHwgbm9uQWxwaGFOdW1lcmljMikge1xuXHRcdC8vIE9uZSBwb2ludCBmb3Igbm9uLWFscGhhbnVtZXJpYy5cblx0XHRyZXR1cm4gMTtcblx0fVxuXHRyZXR1cm4gMDtcbn1cblxuLyoqXG4qIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuXG4qXG4qIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4qL1xuY29uc3QgTk9fRElGRl9NRVNTQUdFID0gXCJDb21wYXJlZCB2YWx1ZXMgaGF2ZSBubyB2aXN1YWwgZGlmZmVyZW5jZS5cIjtcbmNvbnN0IFNJTUlMQVJfTUVTU0FHRSA9IFwiQ29tcGFyZWQgdmFsdWVzIHNlcmlhbGl6ZSB0byB0aGUgc2FtZSBzdHJ1Y3R1cmUuXFxuXCIgKyBcIlByaW50aW5nIGludGVybmFsIG9iamVjdCBzdHJ1Y3R1cmUgd2l0aG91dCBjYWxsaW5nIGB0b0pTT05gIGluc3RlYWQuXCI7XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHgpIHtcblx0cmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCBcImRlZmF1bHRcIikgPyB4W1wiZGVmYXVsdFwiXSA6IHg7XG59XG5cbnZhciBidWlsZCA9IHt9O1xuXG52YXIgaGFzUmVxdWlyZWRCdWlsZDtcblxuZnVuY3Rpb24gcmVxdWlyZUJ1aWxkICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkQnVpbGQpIHJldHVybiBidWlsZDtcblx0aGFzUmVxdWlyZWRCdWlsZCA9IDE7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGJ1aWxkLCAnX19lc01vZHVsZScsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0YnVpbGQuZGVmYXVsdCA9IGRpZmZTZXF1ZW5jZTtcblx0LyoqXG5cdCAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuXG5cdCAqXG5cdCAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuXHQgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5cdCAqXG5cdCAqL1xuXG5cdC8vIFRoaXMgZGlmZi1zZXF1ZW5jZXMgcGFja2FnZSBpbXBsZW1lbnRzIHRoZSBsaW5lYXIgc3BhY2UgdmFyaWF0aW9uIGluXG5cdC8vIEFuIE8oTkQpIERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBJdHMgVmFyaWF0aW9ucyBieSBFdWdlbmUgVy4gTXllcnNcblxuXHQvLyBSZWxhdGlvbnNoaXAgaW4gbm90YXRpb24gYmV0d2VlbiBNeWVycyBwYXBlciBhbmQgdGhpcyBwYWNrYWdlOlxuXHQvLyBBIGlzIGFcblx0Ly8gTiBpcyBhTGVuZ3RoLCBhRW5kIC0gYVN0YXJ0LCBhbmQgc28gb25cblx0Ly8geCBpcyBhSW5kZXgsIGFGaXJzdCwgYUxhc3QsIGFuZCBzbyBvblxuXHQvLyBCIGlzIGJcblx0Ly8gTSBpcyBiTGVuZ3RoLCBiRW5kIC0gYlN0YXJ0LCBhbmQgc28gb25cblx0Ly8geSBpcyBiSW5kZXgsIGJGaXJzdCwgYkxhc3QsIGFuZCBzbyBvblxuXHQvLyDOlCA9IE4gLSBNIGlzIG5lZ2F0aXZlIG9mIGJhRGVsdGFMZW5ndGggPSBiTGVuZ3RoIC0gYUxlbmd0aFxuXHQvLyBEIGlzIGRcblx0Ly8gayBpcyBrRlxuXHQvLyBrICsgzpQgaXMga0YgPSBrUiAtIGJhRGVsdGFMZW5ndGhcblx0Ly8gViBpcyBhSW5kZXhlc0Ygb3IgYUluZGV4ZXNSIChzZWUgY29tbWVudCBiZWxvdyBhYm91dCBJbmRleGVzIHR5cGUpXG5cdC8vIGluZGV4IGludGVydmFscyBbMSwgTl0gYW5kIFsxLCBNXSBhcmUgWzAsIGFMZW5ndGgpIGFuZCBbMCwgYkxlbmd0aClcblx0Ly8gc3RhcnRpbmcgcG9pbnQgaW4gZm9yd2FyZCBkaXJlY3Rpb24gKDAsIDApIGlzICgtMSwgLTEpXG5cdC8vIHN0YXJ0aW5nIHBvaW50IGluIHJldmVyc2UgZGlyZWN0aW9uIChOICsgMSwgTSArIDEpIGlzIChhTGVuZ3RoLCBiTGVuZ3RoKVxuXG5cdC8vIFRoZSDigJxlZGl0IGdyYXBo4oCdIGZvciBzZXF1ZW5jZXMgYSBhbmQgYiBjb3JyZXNwb25kcyB0byBpdGVtczpcblx0Ly8gaW4gYSBvbiB0aGUgaG9yaXpvbnRhbCBheGlzXG5cdC8vIGluIGIgb24gdGhlIHZlcnRpY2FsIGF4aXNcblx0Ly9cblx0Ly8gR2l2ZW4gYS1jb29yZGluYXRlIG9mIGEgcG9pbnQgaW4gYSBkaWFnb25hbCwgeW91IGNhbiBjb21wdXRlIGItY29vcmRpbmF0ZS5cblx0Ly9cblx0Ly8gRm9yd2FyZCBkaWFnb25hbHMga0Y6XG5cdC8vIHplcm8gZGlhZ29uYWwgaW50ZXJzZWN0cyB0b3AgbGVmdCBjb3JuZXJcblx0Ly8gcG9zaXRpdmUgZGlhZ29uYWxzIGludGVyc2VjdCB0b3AgZWRnZVxuXHQvLyBuZWdhdGl2ZSBkaWFnb25hbHMgaW5zZXJzZWN0IGxlZnQgZWRnZVxuXHQvL1xuXHQvLyBSZXZlcnNlIGRpYWdvbmFscyBrUjpcblx0Ly8gemVybyBkaWFnb25hbCBpbnRlcnNlY3RzIGJvdHRvbSByaWdodCBjb3JuZXJcblx0Ly8gcG9zaXRpdmUgZGlhZ29uYWxzIGludGVyc2VjdCByaWdodCBlZGdlXG5cdC8vIG5lZ2F0aXZlIGRpYWdvbmFscyBpbnRlcnNlY3QgYm90dG9tIGVkZ2VcblxuXHQvLyBUaGUgZ3JhcGggY29udGFpbnMgYSBkaXJlY3RlZCBhY3ljbGljIGdyYXBoIG9mIGVkZ2VzOlxuXHQvLyBob3Jpem9udGFsOiBkZWxldGUgYW4gaXRlbSBmcm9tIGFcblx0Ly8gdmVydGljYWw6IGluc2VydCBhbiBpdGVtIGZyb20gYlxuXHQvLyBkaWFnb25hbDogY29tbW9uIGl0ZW0gaW4gYSBhbmQgYlxuXHQvL1xuXHQvLyBUaGUgYWxnb3JpdGhtIHNvbHZlcyBkdWFsIHByb2JsZW1zIGluIHRoZSBncmFwaCBhbmFsb2d5OlxuXHQvLyBGaW5kIGxvbmdlc3QgY29tbW9uIHN1YnNlcXVlbmNlOiBwYXRoIHdpdGggbWF4aW11bSBudW1iZXIgb2YgZGlhZ29uYWwgZWRnZXNcblx0Ly8gRmluZCBzaG9ydGVzdCBlZGl0IHNjcmlwdDogcGF0aCB3aXRoIG1pbmltdW0gbnVtYmVyIG9mIG5vbi1kaWFnb25hbCBlZGdlc1xuXG5cdC8vIElucHV0IGNhbGxiYWNrIGZ1bmN0aW9uIGNvbXBhcmVzIGl0ZW1zIGF0IGluZGV4ZXMgaW4gdGhlIHNlcXVlbmNlcy5cblxuXHQvLyBPdXRwdXQgY2FsbGJhY2sgZnVuY3Rpb24gcmVjZWl2ZXMgdGhlIG51bWJlciBvZiBhZGphY2VudCBpdGVtc1xuXHQvLyBhbmQgc3RhcnRpbmcgaW5kZXhlcyBvZiBlYWNoIGNvbW1vbiBzdWJzZXF1ZW5jZS5cblx0Ly8gRWl0aGVyIG9yaWdpbmFsIGZ1bmN0aW9ucyBvciB3cmFwcGVkIHRvIHN3YXAgaW5kZXhlcyBpZiBncmFwaCBpcyB0cmFuc3Bvc2VkLlxuXHQvLyBJbmRleGVzIGluIHNlcXVlbmNlIGEgb2YgbGFzdCBwb2ludCBvZiBmb3J3YXJkIG9yIHJldmVyc2UgcGF0aHMgaW4gZ3JhcGguXG5cdC8vIE15ZXJzIGFsZ29yaXRobSBpbmRleGVzIGJ5IGRpYWdvbmFsIGsgd2hpY2ggZm9yIG5lZ2F0aXZlIGlzIGJhZCBkZW9wdCBpbiBWOC5cblx0Ly8gVGhpcyBwYWNrYWdlIGluZGV4ZXMgYnkgaUYgYW5kIGlSIHdoaWNoIGFyZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVyby5cblx0Ly8gYW5kIGFsc28gdXBkYXRlcyB0aGUgaW5kZXggYXJyYXlzIGluIHBsYWNlIHRvIGN1dCBtZW1vcnkgaW4gaGFsZi5cblx0Ly8ga0YgPSAyICogaUYgLSBkXG5cdC8vIGtSID0gZCAtIDIgKiBpUlxuXHQvLyBEaXZpc2lvbiBvZiBpbmRleCBpbnRlcnZhbHMgaW4gc2VxdWVuY2VzIGEgYW5kIGIgYXQgdGhlIG1pZGRsZSBjaGFuZ2UuXG5cdC8vIEludmFyaWFudDogaW50ZXJ2YWxzIGRvIG5vdCBoYXZlIGNvbW1vbiBpdGVtcyBhdCB0aGUgc3RhcnQgb3IgZW5kLlxuXHRjb25zdCBwa2cgPSAnZGlmZi1zZXF1ZW5jZXMnOyAvLyBmb3IgZXJyb3IgbWVzc2FnZXNcblx0Y29uc3QgTk9UX1lFVF9TRVQgPSAwOyAvLyBzbWFsbCBpbnQgaW5zdGVhZCBvZiB1bmRlZmluZWQgdG8gYXZvaWQgZGVvcHQgaW4gVjhcblxuXHQvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBjb21tb24gaXRlbXMgdGhhdCBmb2xsb3cgaW4gZm9yd2FyZCBkaXJlY3Rpb24uXG5cdC8vIFRoZSBsZW5ndGggb2Ygd2hhdCBNeWVycyBwYXBlciBjYWxscyBhIOKAnHNuYWtl4oCdIGluIGEgZm9yd2FyZCBwYXRoLlxuXHRjb25zdCBjb3VudENvbW1vbkl0ZW1zRiA9IChhSW5kZXgsIGFFbmQsIGJJbmRleCwgYkVuZCwgaXNDb21tb24pID0+IHtcblx0ICBsZXQgbkNvbW1vbiA9IDA7XG5cdCAgd2hpbGUgKGFJbmRleCA8IGFFbmQgJiYgYkluZGV4IDwgYkVuZCAmJiBpc0NvbW1vbihhSW5kZXgsIGJJbmRleCkpIHtcblx0ICAgIGFJbmRleCArPSAxO1xuXHQgICAgYkluZGV4ICs9IDE7XG5cdCAgICBuQ29tbW9uICs9IDE7XG5cdCAgfVxuXHQgIHJldHVybiBuQ29tbW9uO1xuXHR9O1xuXG5cdC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbW1vbiBpdGVtcyB0aGF0IHByZWNlZGUgaW4gcmV2ZXJzZSBkaXJlY3Rpb24uXG5cdC8vIFRoZSBsZW5ndGggb2Ygd2hhdCBNeWVycyBwYXBlciBjYWxscyBhIOKAnHNuYWtl4oCdIGluIGEgcmV2ZXJzZSBwYXRoLlxuXHRjb25zdCBjb3VudENvbW1vbkl0ZW1zUiA9IChhU3RhcnQsIGFJbmRleCwgYlN0YXJ0LCBiSW5kZXgsIGlzQ29tbW9uKSA9PiB7XG5cdCAgbGV0IG5Db21tb24gPSAwO1xuXHQgIHdoaWxlIChhU3RhcnQgPD0gYUluZGV4ICYmIGJTdGFydCA8PSBiSW5kZXggJiYgaXNDb21tb24oYUluZGV4LCBiSW5kZXgpKSB7XG5cdCAgICBhSW5kZXggLT0gMTtcblx0ICAgIGJJbmRleCAtPSAxO1xuXHQgICAgbkNvbW1vbiArPSAxO1xuXHQgIH1cblx0ICByZXR1cm4gbkNvbW1vbjtcblx0fTtcblxuXHQvLyBBIHNpbXBsZSBmdW5jdGlvbiB0byBleHRlbmQgZm9yd2FyZCBwYXRocyBmcm9tIChkIC0gMSkgdG8gZCBjaGFuZ2VzXG5cdC8vIHdoZW4gZm9yd2FyZCBhbmQgcmV2ZXJzZSBwYXRocyBjYW5ub3QgeWV0IG92ZXJsYXAuXG5cdGNvbnN0IGV4dGVuZFBhdGhzRiA9IChcblx0ICBkLFxuXHQgIGFFbmQsXG5cdCAgYkVuZCxcblx0ICBiRixcblx0ICBpc0NvbW1vbixcblx0ICBhSW5kZXhlc0YsXG5cdCAgaU1heEYgLy8gcmV0dXJuIHRoZSB2YWx1ZSBiZWNhdXNlIG9wdGltaXphdGlvbiBtaWdodCBkZWNyZWFzZSBpdFxuXHQpID0+IHtcblx0ICAvLyBVbnJvbGwgdGhlIGZpcnN0IGl0ZXJhdGlvbi5cblx0ICBsZXQgaUYgPSAwO1xuXHQgIGxldCBrRiA9IC1kOyAvLyBrRiA9IDIgKiBpRiAtIGRcblx0ICBsZXQgYUZpcnN0ID0gYUluZGV4ZXNGW2lGXTsgLy8gaW4gZmlyc3QgaXRlcmF0aW9uIGFsd2F5cyBpbnNlcnRcblx0ICBsZXQgYUluZGV4UHJldjEgPSBhRmlyc3Q7IC8vIHByZXYgdmFsdWUgb2YgW2lGIC0gMV0gaW4gbmV4dCBpdGVyYXRpb25cblx0ICBhSW5kZXhlc0ZbaUZdICs9IGNvdW50Q29tbW9uSXRlbXNGKFxuXHQgICAgYUZpcnN0ICsgMSxcblx0ICAgIGFFbmQsXG5cdCAgICBiRiArIGFGaXJzdCAtIGtGICsgMSxcblx0ICAgIGJFbmQsXG5cdCAgICBpc0NvbW1vblxuXHQgICk7XG5cblx0ICAvLyBPcHRpbWl6YXRpb246IHNraXAgZGlhZ29uYWxzIGluIHdoaWNoIHBhdGhzIGNhbm5vdCBldmVyIG92ZXJsYXAuXG5cdCAgY29uc3QgbkYgPSBkIDwgaU1heEYgPyBkIDogaU1heEY7XG5cblx0ICAvLyBUaGUgZGlhZ29uYWxzIGtGIGFyZSBvZGQgd2hlbiBkIGlzIG9kZCBhbmQgZXZlbiB3aGVuIGQgaXMgZXZlbi5cblx0ICBmb3IgKGlGICs9IDEsIGtGICs9IDI7IGlGIDw9IG5GOyBpRiArPSAxLCBrRiArPSAyKSB7XG5cdCAgICAvLyBUbyBnZXQgZmlyc3QgcG9pbnQgb2YgcGF0aCBzZWdtZW50LCBtb3ZlIG9uZSBjaGFuZ2UgaW4gZm9yd2FyZCBkaXJlY3Rpb25cblx0ICAgIC8vIGZyb20gbGFzdCBwb2ludCBvZiBwcmV2aW91cyBwYXRoIHNlZ21lbnQgaW4gYW4gYWRqYWNlbnQgZGlhZ29uYWwuXG5cdCAgICAvLyBJbiBsYXN0IHBvc3NpYmxlIGl0ZXJhdGlvbiB3aGVuIGlGID09PSBkIGFuZCBrRiA9PT0gZCBhbHdheXMgZGVsZXRlLlxuXHQgICAgaWYgKGlGICE9PSBkICYmIGFJbmRleFByZXYxIDwgYUluZGV4ZXNGW2lGXSkge1xuXHQgICAgICBhRmlyc3QgPSBhSW5kZXhlc0ZbaUZdOyAvLyB2ZXJ0aWNhbCB0byBpbnNlcnQgZnJvbSBiXG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBhRmlyc3QgPSBhSW5kZXhQcmV2MSArIDE7IC8vIGhvcml6b250YWwgdG8gZGVsZXRlIGZyb20gYVxuXG5cdCAgICAgIGlmIChhRW5kIDw9IGFGaXJzdCkge1xuXHQgICAgICAgIC8vIE9wdGltaXphdGlvbjogZGVsZXRlIG1vdmVkIHBhc3QgcmlnaHQgb2YgZ3JhcGguXG5cdCAgICAgICAgcmV0dXJuIGlGIC0gMTtcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICAvLyBUbyBnZXQgbGFzdCBwb2ludCBvZiBwYXRoIHNlZ21lbnQsIG1vdmUgYWxvbmcgZGlhZ29uYWwgb2YgY29tbW9uIGl0ZW1zLlxuXHQgICAgYUluZGV4UHJldjEgPSBhSW5kZXhlc0ZbaUZdO1xuXHQgICAgYUluZGV4ZXNGW2lGXSA9XG5cdCAgICAgIGFGaXJzdCArXG5cdCAgICAgIGNvdW50Q29tbW9uSXRlbXNGKGFGaXJzdCArIDEsIGFFbmQsIGJGICsgYUZpcnN0IC0ga0YgKyAxLCBiRW5kLCBpc0NvbW1vbik7XG5cdCAgfVxuXHQgIHJldHVybiBpTWF4Rjtcblx0fTtcblxuXHQvLyBBIHNpbXBsZSBmdW5jdGlvbiB0byBleHRlbmQgcmV2ZXJzZSBwYXRocyBmcm9tIChkIC0gMSkgdG8gZCBjaGFuZ2VzXG5cdC8vIHdoZW4gcmV2ZXJzZSBhbmQgZm9yd2FyZCBwYXRocyBjYW5ub3QgeWV0IG92ZXJsYXAuXG5cdGNvbnN0IGV4dGVuZFBhdGhzUiA9IChcblx0ICBkLFxuXHQgIGFTdGFydCxcblx0ICBiU3RhcnQsXG5cdCAgYlIsXG5cdCAgaXNDb21tb24sXG5cdCAgYUluZGV4ZXNSLFxuXHQgIGlNYXhSIC8vIHJldHVybiB0aGUgdmFsdWUgYmVjYXVzZSBvcHRpbWl6YXRpb24gbWlnaHQgZGVjcmVhc2UgaXRcblx0KSA9PiB7XG5cdCAgLy8gVW5yb2xsIHRoZSBmaXJzdCBpdGVyYXRpb24uXG5cdCAgbGV0IGlSID0gMDtcblx0ICBsZXQga1IgPSBkOyAvLyBrUiA9IGQgLSAyICogaVJcblx0ICBsZXQgYUZpcnN0ID0gYUluZGV4ZXNSW2lSXTsgLy8gaW4gZmlyc3QgaXRlcmF0aW9uIGFsd2F5cyBpbnNlcnRcblx0ICBsZXQgYUluZGV4UHJldjEgPSBhRmlyc3Q7IC8vIHByZXYgdmFsdWUgb2YgW2lSIC0gMV0gaW4gbmV4dCBpdGVyYXRpb25cblx0ICBhSW5kZXhlc1JbaVJdIC09IGNvdW50Q29tbW9uSXRlbXNSKFxuXHQgICAgYVN0YXJ0LFxuXHQgICAgYUZpcnN0IC0gMSxcblx0ICAgIGJTdGFydCxcblx0ICAgIGJSICsgYUZpcnN0IC0ga1IgLSAxLFxuXHQgICAgaXNDb21tb25cblx0ICApO1xuXG5cdCAgLy8gT3B0aW1pemF0aW9uOiBza2lwIGRpYWdvbmFscyBpbiB3aGljaCBwYXRocyBjYW5ub3QgZXZlciBvdmVybGFwLlxuXHQgIGNvbnN0IG5SID0gZCA8IGlNYXhSID8gZCA6IGlNYXhSO1xuXG5cdCAgLy8gVGhlIGRpYWdvbmFscyBrUiBhcmUgb2RkIHdoZW4gZCBpcyBvZGQgYW5kIGV2ZW4gd2hlbiBkIGlzIGV2ZW4uXG5cdCAgZm9yIChpUiArPSAxLCBrUiAtPSAyOyBpUiA8PSBuUjsgaVIgKz0gMSwga1IgLT0gMikge1xuXHQgICAgLy8gVG8gZ2V0IGZpcnN0IHBvaW50IG9mIHBhdGggc2VnbWVudCwgbW92ZSBvbmUgY2hhbmdlIGluIHJldmVyc2UgZGlyZWN0aW9uXG5cdCAgICAvLyBmcm9tIGxhc3QgcG9pbnQgb2YgcHJldmlvdXMgcGF0aCBzZWdtZW50IGluIGFuIGFkamFjZW50IGRpYWdvbmFsLlxuXHQgICAgLy8gSW4gbGFzdCBwb3NzaWJsZSBpdGVyYXRpb24gd2hlbiBpUiA9PT0gZCBhbmQga1IgPT09IC1kIGFsd2F5cyBkZWxldGUuXG5cdCAgICBpZiAoaVIgIT09IGQgJiYgYUluZGV4ZXNSW2lSXSA8IGFJbmRleFByZXYxKSB7XG5cdCAgICAgIGFGaXJzdCA9IGFJbmRleGVzUltpUl07IC8vIHZlcnRpY2FsIHRvIGluc2VydCBmcm9tIGJcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGFGaXJzdCA9IGFJbmRleFByZXYxIC0gMTsgLy8gaG9yaXpvbnRhbCB0byBkZWxldGUgZnJvbSBhXG5cblx0ICAgICAgaWYgKGFGaXJzdCA8IGFTdGFydCkge1xuXHQgICAgICAgIC8vIE9wdGltaXphdGlvbjogZGVsZXRlIG1vdmVkIHBhc3QgbGVmdCBvZiBncmFwaC5cblx0ICAgICAgICByZXR1cm4gaVIgLSAxO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIC8vIFRvIGdldCBsYXN0IHBvaW50IG9mIHBhdGggc2VnbWVudCwgbW92ZSBhbG9uZyBkaWFnb25hbCBvZiBjb21tb24gaXRlbXMuXG5cdCAgICBhSW5kZXhQcmV2MSA9IGFJbmRleGVzUltpUl07XG5cdCAgICBhSW5kZXhlc1JbaVJdID1cblx0ICAgICAgYUZpcnN0IC1cblx0ICAgICAgY291bnRDb21tb25JdGVtc1IoXG5cdCAgICAgICAgYVN0YXJ0LFxuXHQgICAgICAgIGFGaXJzdCAtIDEsXG5cdCAgICAgICAgYlN0YXJ0LFxuXHQgICAgICAgIGJSICsgYUZpcnN0IC0ga1IgLSAxLFxuXHQgICAgICAgIGlzQ29tbW9uXG5cdCAgICAgICk7XG5cdCAgfVxuXHQgIHJldHVybiBpTWF4Ujtcblx0fTtcblxuXHQvLyBBIGNvbXBsZXRlIGZ1bmN0aW9uIHRvIGV4dGVuZCBmb3J3YXJkIHBhdGhzIGZyb20gKGQgLSAxKSB0byBkIGNoYW5nZXMuXG5cdC8vIFJldHVybiB0cnVlIGlmIGEgcGF0aCBvdmVybGFwcyByZXZlcnNlIHBhdGggb2YgKGQgLSAxKSBjaGFuZ2VzIGluIGl0cyBkaWFnb25hbC5cblx0Y29uc3QgZXh0ZW5kT3ZlcmxhcHBhYmxlUGF0aHNGID0gKFxuXHQgIGQsXG5cdCAgYVN0YXJ0LFxuXHQgIGFFbmQsXG5cdCAgYlN0YXJ0LFxuXHQgIGJFbmQsXG5cdCAgaXNDb21tb24sXG5cdCAgYUluZGV4ZXNGLFxuXHQgIGlNYXhGLFxuXHQgIGFJbmRleGVzUixcblx0ICBpTWF4Uixcblx0ICBkaXZpc2lvbiAvLyB1cGRhdGUgcHJvcCB2YWx1ZXMgaWYgcmV0dXJuIHRydWVcblx0KSA9PiB7XG5cdCAgY29uc3QgYkYgPSBiU3RhcnQgLSBhU3RhcnQ7IC8vIGJJbmRleCA9IGJGICsgYUluZGV4IC0ga0Zcblx0ICBjb25zdCBhTGVuZ3RoID0gYUVuZCAtIGFTdGFydDtcblx0ICBjb25zdCBiTGVuZ3RoID0gYkVuZCAtIGJTdGFydDtcblx0ICBjb25zdCBiYURlbHRhTGVuZ3RoID0gYkxlbmd0aCAtIGFMZW5ndGg7IC8vIGtGID0ga1IgLSBiYURlbHRhTGVuZ3RoXG5cblx0ICAvLyBSYW5nZSBvZiBkaWFnb25hbHMgaW4gd2hpY2ggZm9yd2FyZCBhbmQgcmV2ZXJzZSBwYXRocyBtaWdodCBvdmVybGFwLlxuXHQgIGNvbnN0IGtNaW5PdmVybGFwRiA9IC1iYURlbHRhTGVuZ3RoIC0gKGQgLSAxKTsgLy8gLShkIC0gMSkgPD0ga1Jcblx0ICBjb25zdCBrTWF4T3ZlcmxhcEYgPSAtYmFEZWx0YUxlbmd0aCArIChkIC0gMSk7IC8vIGtSIDw9IChkIC0gMSlcblxuXHQgIGxldCBhSW5kZXhQcmV2MSA9IE5PVF9ZRVRfU0VUOyAvLyBwcmV2IHZhbHVlIG9mIFtpRiAtIDFdIGluIG5leHQgaXRlcmF0aW9uXG5cblx0ICAvLyBPcHRpbWl6YXRpb246IHNraXAgZGlhZ29uYWxzIGluIHdoaWNoIHBhdGhzIGNhbm5vdCBldmVyIG92ZXJsYXAuXG5cdCAgY29uc3QgbkYgPSBkIDwgaU1heEYgPyBkIDogaU1heEY7XG5cblx0ICAvLyBUaGUgZGlhZ29uYWxzIGtGID0gMiAqIGlGIC0gZCBhcmUgb2RkIHdoZW4gZCBpcyBvZGQgYW5kIGV2ZW4gd2hlbiBkIGlzIGV2ZW4uXG5cdCAgZm9yIChsZXQgaUYgPSAwLCBrRiA9IC1kOyBpRiA8PSBuRjsgaUYgKz0gMSwga0YgKz0gMikge1xuXHQgICAgLy8gVG8gZ2V0IGZpcnN0IHBvaW50IG9mIHBhdGggc2VnbWVudCwgbW92ZSBvbmUgY2hhbmdlIGluIGZvcndhcmQgZGlyZWN0aW9uXG5cdCAgICAvLyBmcm9tIGxhc3QgcG9pbnQgb2YgcHJldmlvdXMgcGF0aCBzZWdtZW50IGluIGFuIGFkamFjZW50IGRpYWdvbmFsLlxuXHQgICAgLy8gSW4gZmlyc3QgaXRlcmF0aW9uIHdoZW4gaUYgPT09IDAgYW5kIGtGID09PSAtZCBhbHdheXMgaW5zZXJ0LlxuXHQgICAgLy8gSW4gbGFzdCBwb3NzaWJsZSBpdGVyYXRpb24gd2hlbiBpRiA9PT0gZCBhbmQga0YgPT09IGQgYWx3YXlzIGRlbGV0ZS5cblx0ICAgIGNvbnN0IGluc2VydCA9IGlGID09PSAwIHx8IChpRiAhPT0gZCAmJiBhSW5kZXhQcmV2MSA8IGFJbmRleGVzRltpRl0pO1xuXHQgICAgY29uc3QgYUxhc3RQcmV2ID0gaW5zZXJ0ID8gYUluZGV4ZXNGW2lGXSA6IGFJbmRleFByZXYxO1xuXHQgICAgY29uc3QgYUZpcnN0ID0gaW5zZXJ0XG5cdCAgICAgID8gYUxhc3RQcmV2IC8vIHZlcnRpY2FsIHRvIGluc2VydCBmcm9tIGJcblx0ICAgICAgOiBhTGFzdFByZXYgKyAxOyAvLyBob3Jpem9udGFsIHRvIGRlbGV0ZSBmcm9tIGFcblxuXHQgICAgLy8gVG8gZ2V0IGxhc3QgcG9pbnQgb2YgcGF0aCBzZWdtZW50LCBtb3ZlIGFsb25nIGRpYWdvbmFsIG9mIGNvbW1vbiBpdGVtcy5cblx0ICAgIGNvbnN0IGJGaXJzdCA9IGJGICsgYUZpcnN0IC0ga0Y7XG5cdCAgICBjb25zdCBuQ29tbW9uRiA9IGNvdW50Q29tbW9uSXRlbXNGKFxuXHQgICAgICBhRmlyc3QgKyAxLFxuXHQgICAgICBhRW5kLFxuXHQgICAgICBiRmlyc3QgKyAxLFxuXHQgICAgICBiRW5kLFxuXHQgICAgICBpc0NvbW1vblxuXHQgICAgKTtcblx0ICAgIGNvbnN0IGFMYXN0ID0gYUZpcnN0ICsgbkNvbW1vbkY7XG5cdCAgICBhSW5kZXhQcmV2MSA9IGFJbmRleGVzRltpRl07XG5cdCAgICBhSW5kZXhlc0ZbaUZdID0gYUxhc3Q7XG5cdCAgICBpZiAoa01pbk92ZXJsYXBGIDw9IGtGICYmIGtGIDw9IGtNYXhPdmVybGFwRikge1xuXHQgICAgICAvLyBTb2x2ZSBmb3IgaVIgb2YgcmV2ZXJzZSBwYXRoIHdpdGggKGQgLSAxKSBjaGFuZ2VzIGluIGRpYWdvbmFsIGtGOlxuXHQgICAgICAvLyBrUiA9IGtGICsgYmFEZWx0YUxlbmd0aFxuXHQgICAgICAvLyBrUiA9IChkIC0gMSkgLSAyICogaVJcblx0ICAgICAgY29uc3QgaVIgPSAoZCAtIDEgLSAoa0YgKyBiYURlbHRhTGVuZ3RoKSkgLyAyO1xuXG5cdCAgICAgIC8vIElmIHRoaXMgZm9yd2FyZCBwYXRoIG92ZXJsYXBzIHRoZSByZXZlcnNlIHBhdGggaW4gdGhpcyBkaWFnb25hbCxcblx0ICAgICAgLy8gdGhlbiB0aGlzIGlzIHRoZSBtaWRkbGUgY2hhbmdlIG9mIHRoZSBpbmRleCBpbnRlcnZhbHMuXG5cdCAgICAgIGlmIChpUiA8PSBpTWF4UiAmJiBhSW5kZXhlc1JbaVJdIC0gMSA8PSBhTGFzdCkge1xuXHQgICAgICAgIC8vIFVubGlrZSB0aGUgTXllcnMgYWxnb3JpdGhtIHdoaWNoIGZpbmRzIG9ubHkgdGhlIG1pZGRsZSDigJxzbmFrZeKAnVxuXHQgICAgICAgIC8vIHRoaXMgcGFja2FnZSBjYW4gZmluZCB0d28gY29tbW9uIHN1YnNlcXVlbmNlcyBwZXIgZGl2aXNpb24uXG5cdCAgICAgICAgLy8gTGFzdCBwb2ludCBvZiBwcmV2aW91cyBwYXRoIHNlZ21lbnQgaXMgb24gYW4gYWRqYWNlbnQgZGlhZ29uYWwuXG5cdCAgICAgICAgY29uc3QgYkxhc3RQcmV2ID0gYkYgKyBhTGFzdFByZXYgLSAoaW5zZXJ0ID8ga0YgKyAxIDoga0YgLSAxKTtcblxuXHQgICAgICAgIC8vIEJlY2F1c2Ugb2YgaW52YXJpYW50IHRoYXQgaW50ZXJ2YWxzIHByZWNlZGluZyB0aGUgbWlkZGxlIGNoYW5nZVxuXHQgICAgICAgIC8vIGNhbm5vdCBoYXZlIGNvbW1vbiBpdGVtcyBhdCB0aGUgZW5kLFxuXHQgICAgICAgIC8vIG1vdmUgaW4gcmV2ZXJzZSBkaXJlY3Rpb24gYWxvbmcgYSBkaWFnb25hbCBvZiBjb21tb24gaXRlbXMuXG5cdCAgICAgICAgY29uc3QgbkNvbW1vblIgPSBjb3VudENvbW1vbkl0ZW1zUihcblx0ICAgICAgICAgIGFTdGFydCxcblx0ICAgICAgICAgIGFMYXN0UHJldixcblx0ICAgICAgICAgIGJTdGFydCxcblx0ICAgICAgICAgIGJMYXN0UHJldixcblx0ICAgICAgICAgIGlzQ29tbW9uXG5cdCAgICAgICAgKTtcblx0ICAgICAgICBjb25zdCBhSW5kZXhQcmV2Rmlyc3QgPSBhTGFzdFByZXYgLSBuQ29tbW9uUjtcblx0ICAgICAgICBjb25zdCBiSW5kZXhQcmV2Rmlyc3QgPSBiTGFzdFByZXYgLSBuQ29tbW9uUjtcblx0ICAgICAgICBjb25zdCBhRW5kUHJlY2VkaW5nID0gYUluZGV4UHJldkZpcnN0ICsgMTtcblx0ICAgICAgICBjb25zdCBiRW5kUHJlY2VkaW5nID0gYkluZGV4UHJldkZpcnN0ICsgMTtcblx0ICAgICAgICBkaXZpc2lvbi5uQ2hhbmdlUHJlY2VkaW5nID0gZCAtIDE7XG5cdCAgICAgICAgaWYgKGQgLSAxID09PSBhRW5kUHJlY2VkaW5nICsgYkVuZFByZWNlZGluZyAtIGFTdGFydCAtIGJTdGFydCkge1xuXHQgICAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBudW1iZXIgb2YgcHJlY2VkaW5nIGNoYW5nZXMgaW4gZm9yd2FyZCBkaXJlY3Rpb25cblx0ICAgICAgICAgIC8vIGlzIGVxdWFsIHRvIG51bWJlciBvZiBpdGVtcyBpbiBwcmVjZWRpbmcgaW50ZXJ2YWwsXG5cdCAgICAgICAgICAvLyB0aGVyZWZvcmUgaXQgY2Fubm90IGNvbnRhaW4gYW55IGNvbW1vbiBpdGVtcy5cblx0ICAgICAgICAgIGRpdmlzaW9uLmFFbmRQcmVjZWRpbmcgPSBhU3RhcnQ7XG5cdCAgICAgICAgICBkaXZpc2lvbi5iRW5kUHJlY2VkaW5nID0gYlN0YXJ0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBkaXZpc2lvbi5hRW5kUHJlY2VkaW5nID0gYUVuZFByZWNlZGluZztcblx0ICAgICAgICAgIGRpdmlzaW9uLmJFbmRQcmVjZWRpbmcgPSBiRW5kUHJlY2VkaW5nO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBkaXZpc2lvbi5uQ29tbW9uUHJlY2VkaW5nID0gbkNvbW1vblI7XG5cdCAgICAgICAgaWYgKG5Db21tb25SICE9PSAwKSB7XG5cdCAgICAgICAgICBkaXZpc2lvbi5hQ29tbW9uUHJlY2VkaW5nID0gYUVuZFByZWNlZGluZztcblx0ICAgICAgICAgIGRpdmlzaW9uLmJDb21tb25QcmVjZWRpbmcgPSBiRW5kUHJlY2VkaW5nO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBkaXZpc2lvbi5uQ29tbW9uRm9sbG93aW5nID0gbkNvbW1vbkY7XG5cdCAgICAgICAgaWYgKG5Db21tb25GICE9PSAwKSB7XG5cdCAgICAgICAgICBkaXZpc2lvbi5hQ29tbW9uRm9sbG93aW5nID0gYUZpcnN0ICsgMTtcblx0ICAgICAgICAgIGRpdmlzaW9uLmJDb21tb25Gb2xsb3dpbmcgPSBiRmlyc3QgKyAxO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb25zdCBhU3RhcnRGb2xsb3dpbmcgPSBhTGFzdCArIDE7XG5cdCAgICAgICAgY29uc3QgYlN0YXJ0Rm9sbG93aW5nID0gYkZpcnN0ICsgbkNvbW1vbkYgKyAxO1xuXHQgICAgICAgIGRpdmlzaW9uLm5DaGFuZ2VGb2xsb3dpbmcgPSBkIC0gMTtcblx0ICAgICAgICBpZiAoZCAtIDEgPT09IGFFbmQgKyBiRW5kIC0gYVN0YXJ0Rm9sbG93aW5nIC0gYlN0YXJ0Rm9sbG93aW5nKSB7XG5cdCAgICAgICAgICAvLyBPcHRpbWl6YXRpb246IG51bWJlciBvZiBjaGFuZ2VzIGluIHJldmVyc2UgZGlyZWN0aW9uXG5cdCAgICAgICAgICAvLyBpcyBlcXVhbCB0byBudW1iZXIgb2YgaXRlbXMgaW4gZm9sbG93aW5nIGludGVydmFsLFxuXHQgICAgICAgICAgLy8gdGhlcmVmb3JlIGl0IGNhbm5vdCBjb250YWluIGFueSBjb21tb24gaXRlbXMuXG5cdCAgICAgICAgICBkaXZpc2lvbi5hU3RhcnRGb2xsb3dpbmcgPSBhRW5kO1xuXHQgICAgICAgICAgZGl2aXNpb24uYlN0YXJ0Rm9sbG93aW5nID0gYkVuZDtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgZGl2aXNpb24uYVN0YXJ0Rm9sbG93aW5nID0gYVN0YXJ0Rm9sbG93aW5nO1xuXHQgICAgICAgICAgZGl2aXNpb24uYlN0YXJ0Rm9sbG93aW5nID0gYlN0YXJ0Rm9sbG93aW5nO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0ICByZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0Ly8gQSBjb21wbGV0ZSBmdW5jdGlvbiB0byBleHRlbmQgcmV2ZXJzZSBwYXRocyBmcm9tIChkIC0gMSkgdG8gZCBjaGFuZ2VzLlxuXHQvLyBSZXR1cm4gdHJ1ZSBpZiBhIHBhdGggb3ZlcmxhcHMgZm9yd2FyZCBwYXRoIG9mIGQgY2hhbmdlcyBpbiBpdHMgZGlhZ29uYWwuXG5cdGNvbnN0IGV4dGVuZE92ZXJsYXBwYWJsZVBhdGhzUiA9IChcblx0ICBkLFxuXHQgIGFTdGFydCxcblx0ICBhRW5kLFxuXHQgIGJTdGFydCxcblx0ICBiRW5kLFxuXHQgIGlzQ29tbW9uLFxuXHQgIGFJbmRleGVzRixcblx0ICBpTWF4Rixcblx0ICBhSW5kZXhlc1IsXG5cdCAgaU1heFIsXG5cdCAgZGl2aXNpb24gLy8gdXBkYXRlIHByb3AgdmFsdWVzIGlmIHJldHVybiB0cnVlXG5cdCkgPT4ge1xuXHQgIGNvbnN0IGJSID0gYkVuZCAtIGFFbmQ7IC8vIGJJbmRleCA9IGJSICsgYUluZGV4IC0ga1Jcblx0ICBjb25zdCBhTGVuZ3RoID0gYUVuZCAtIGFTdGFydDtcblx0ICBjb25zdCBiTGVuZ3RoID0gYkVuZCAtIGJTdGFydDtcblx0ICBjb25zdCBiYURlbHRhTGVuZ3RoID0gYkxlbmd0aCAtIGFMZW5ndGg7IC8vIGtSID0ga0YgKyBiYURlbHRhTGVuZ3RoXG5cblx0ICAvLyBSYW5nZSBvZiBkaWFnb25hbHMgaW4gd2hpY2ggZm9yd2FyZCBhbmQgcmV2ZXJzZSBwYXRocyBtaWdodCBvdmVybGFwLlxuXHQgIGNvbnN0IGtNaW5PdmVybGFwUiA9IGJhRGVsdGFMZW5ndGggLSBkOyAvLyAtZCA8PSBrRlxuXHQgIGNvbnN0IGtNYXhPdmVybGFwUiA9IGJhRGVsdGFMZW5ndGggKyBkOyAvLyBrRiA8PSBkXG5cblx0ICBsZXQgYUluZGV4UHJldjEgPSBOT1RfWUVUX1NFVDsgLy8gcHJldiB2YWx1ZSBvZiBbaVIgLSAxXSBpbiBuZXh0IGl0ZXJhdGlvblxuXG5cdCAgLy8gT3B0aW1pemF0aW9uOiBza2lwIGRpYWdvbmFscyBpbiB3aGljaCBwYXRocyBjYW5ub3QgZXZlciBvdmVybGFwLlxuXHQgIGNvbnN0IG5SID0gZCA8IGlNYXhSID8gZCA6IGlNYXhSO1xuXG5cdCAgLy8gVGhlIGRpYWdvbmFscyBrUiA9IGQgLSAyICogaVIgYXJlIG9kZCB3aGVuIGQgaXMgb2RkIGFuZCBldmVuIHdoZW4gZCBpcyBldmVuLlxuXHQgIGZvciAobGV0IGlSID0gMCwga1IgPSBkOyBpUiA8PSBuUjsgaVIgKz0gMSwga1IgLT0gMikge1xuXHQgICAgLy8gVG8gZ2V0IGZpcnN0IHBvaW50IG9mIHBhdGggc2VnbWVudCwgbW92ZSBvbmUgY2hhbmdlIGluIHJldmVyc2UgZGlyZWN0aW9uXG5cdCAgICAvLyBmcm9tIGxhc3QgcG9pbnQgb2YgcHJldmlvdXMgcGF0aCBzZWdtZW50IGluIGFuIGFkamFjZW50IGRpYWdvbmFsLlxuXHQgICAgLy8gSW4gZmlyc3QgaXRlcmF0aW9uIHdoZW4gaVIgPT09IDAgYW5kIGtSID09PSBkIGFsd2F5cyBpbnNlcnQuXG5cdCAgICAvLyBJbiBsYXN0IHBvc3NpYmxlIGl0ZXJhdGlvbiB3aGVuIGlSID09PSBkIGFuZCBrUiA9PT0gLWQgYWx3YXlzIGRlbGV0ZS5cblx0ICAgIGNvbnN0IGluc2VydCA9IGlSID09PSAwIHx8IChpUiAhPT0gZCAmJiBhSW5kZXhlc1JbaVJdIDwgYUluZGV4UHJldjEpO1xuXHQgICAgY29uc3QgYUxhc3RQcmV2ID0gaW5zZXJ0ID8gYUluZGV4ZXNSW2lSXSA6IGFJbmRleFByZXYxO1xuXHQgICAgY29uc3QgYUZpcnN0ID0gaW5zZXJ0XG5cdCAgICAgID8gYUxhc3RQcmV2IC8vIHZlcnRpY2FsIHRvIGluc2VydCBmcm9tIGJcblx0ICAgICAgOiBhTGFzdFByZXYgLSAxOyAvLyBob3Jpem9udGFsIHRvIGRlbGV0ZSBmcm9tIGFcblxuXHQgICAgLy8gVG8gZ2V0IGxhc3QgcG9pbnQgb2YgcGF0aCBzZWdtZW50LCBtb3ZlIGFsb25nIGRpYWdvbmFsIG9mIGNvbW1vbiBpdGVtcy5cblx0ICAgIGNvbnN0IGJGaXJzdCA9IGJSICsgYUZpcnN0IC0ga1I7XG5cdCAgICBjb25zdCBuQ29tbW9uUiA9IGNvdW50Q29tbW9uSXRlbXNSKFxuXHQgICAgICBhU3RhcnQsXG5cdCAgICAgIGFGaXJzdCAtIDEsXG5cdCAgICAgIGJTdGFydCxcblx0ICAgICAgYkZpcnN0IC0gMSxcblx0ICAgICAgaXNDb21tb25cblx0ICAgICk7XG5cdCAgICBjb25zdCBhTGFzdCA9IGFGaXJzdCAtIG5Db21tb25SO1xuXHQgICAgYUluZGV4UHJldjEgPSBhSW5kZXhlc1JbaVJdO1xuXHQgICAgYUluZGV4ZXNSW2lSXSA9IGFMYXN0O1xuXHQgICAgaWYgKGtNaW5PdmVybGFwUiA8PSBrUiAmJiBrUiA8PSBrTWF4T3ZlcmxhcFIpIHtcblx0ICAgICAgLy8gU29sdmUgZm9yIGlGIG9mIGZvcndhcmQgcGF0aCB3aXRoIGQgY2hhbmdlcyBpbiBkaWFnb25hbCBrUjpcblx0ICAgICAgLy8ga0YgPSBrUiAtIGJhRGVsdGFMZW5ndGhcblx0ICAgICAgLy8ga0YgPSAyICogaUYgLSBkXG5cdCAgICAgIGNvbnN0IGlGID0gKGQgKyAoa1IgLSBiYURlbHRhTGVuZ3RoKSkgLyAyO1xuXG5cdCAgICAgIC8vIElmIHRoaXMgcmV2ZXJzZSBwYXRoIG92ZXJsYXBzIHRoZSBmb3J3YXJkIHBhdGggaW4gdGhpcyBkaWFnb25hbCxcblx0ICAgICAgLy8gdGhlbiB0aGlzIGlzIGEgbWlkZGxlIGNoYW5nZSBvZiB0aGUgaW5kZXggaW50ZXJ2YWxzLlxuXHQgICAgICBpZiAoaUYgPD0gaU1heEYgJiYgYUxhc3QgLSAxIDw9IGFJbmRleGVzRltpRl0pIHtcblx0ICAgICAgICBjb25zdCBiTGFzdCA9IGJGaXJzdCAtIG5Db21tb25SO1xuXHQgICAgICAgIGRpdmlzaW9uLm5DaGFuZ2VQcmVjZWRpbmcgPSBkO1xuXHQgICAgICAgIGlmIChkID09PSBhTGFzdCArIGJMYXN0IC0gYVN0YXJ0IC0gYlN0YXJ0KSB7XG5cdCAgICAgICAgICAvLyBPcHRpbWl6YXRpb246IG51bWJlciBvZiBjaGFuZ2VzIGluIHJldmVyc2UgZGlyZWN0aW9uXG5cdCAgICAgICAgICAvLyBpcyBlcXVhbCB0byBudW1iZXIgb2YgaXRlbXMgaW4gcHJlY2VkaW5nIGludGVydmFsLFxuXHQgICAgICAgICAgLy8gdGhlcmVmb3JlIGl0IGNhbm5vdCBjb250YWluIGFueSBjb21tb24gaXRlbXMuXG5cdCAgICAgICAgICBkaXZpc2lvbi5hRW5kUHJlY2VkaW5nID0gYVN0YXJ0O1xuXHQgICAgICAgICAgZGl2aXNpb24uYkVuZFByZWNlZGluZyA9IGJTdGFydDtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgZGl2aXNpb24uYUVuZFByZWNlZGluZyA9IGFMYXN0O1xuXHQgICAgICAgICAgZGl2aXNpb24uYkVuZFByZWNlZGluZyA9IGJMYXN0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBkaXZpc2lvbi5uQ29tbW9uUHJlY2VkaW5nID0gbkNvbW1vblI7XG5cdCAgICAgICAgaWYgKG5Db21tb25SICE9PSAwKSB7XG5cdCAgICAgICAgICAvLyBUaGUgbGFzdCBwb2ludCBvZiByZXZlcnNlIHBhdGggc2VnbWVudCBpcyBzdGFydCBvZiBjb21tb24gc3Vic2VxdWVuY2UuXG5cdCAgICAgICAgICBkaXZpc2lvbi5hQ29tbW9uUHJlY2VkaW5nID0gYUxhc3Q7XG5cdCAgICAgICAgICBkaXZpc2lvbi5iQ29tbW9uUHJlY2VkaW5nID0gYkxhc3Q7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGRpdmlzaW9uLm5DaGFuZ2VGb2xsb3dpbmcgPSBkIC0gMTtcblx0ICAgICAgICBpZiAoZCA9PT0gMSkge1xuXHQgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gcHJldmlvdXMgcGF0aCBzZWdtZW50LlxuXHQgICAgICAgICAgZGl2aXNpb24ubkNvbW1vbkZvbGxvd2luZyA9IDA7XG5cdCAgICAgICAgICBkaXZpc2lvbi5hU3RhcnRGb2xsb3dpbmcgPSBhRW5kO1xuXHQgICAgICAgICAgZGl2aXNpb24uYlN0YXJ0Rm9sbG93aW5nID0gYkVuZDtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgLy8gVW5saWtlIHRoZSBNeWVycyBhbGdvcml0aG0gd2hpY2ggZmluZHMgb25seSB0aGUgbWlkZGxlIOKAnHNuYWtl4oCdXG5cdCAgICAgICAgICAvLyB0aGlzIHBhY2thZ2UgY2FuIGZpbmQgdHdvIGNvbW1vbiBzdWJzZXF1ZW5jZXMgcGVyIGRpdmlzaW9uLlxuXHQgICAgICAgICAgLy8gTGFzdCBwb2ludCBvZiBwcmV2aW91cyBwYXRoIHNlZ21lbnQgaXMgb24gYW4gYWRqYWNlbnQgZGlhZ29uYWwuXG5cdCAgICAgICAgICBjb25zdCBiTGFzdFByZXYgPSBiUiArIGFMYXN0UHJldiAtIChpbnNlcnQgPyBrUiAtIDEgOiBrUiArIDEpO1xuXG5cdCAgICAgICAgICAvLyBCZWNhdXNlIG9mIGludmFyaWFudCB0aGF0IGludGVydmFscyBmb2xsb3dpbmcgdGhlIG1pZGRsZSBjaGFuZ2Vcblx0ICAgICAgICAgIC8vIGNhbm5vdCBoYXZlIGNvbW1vbiBpdGVtcyBhdCB0aGUgc3RhcnQsXG5cdCAgICAgICAgICAvLyBtb3ZlIGluIGZvcndhcmQgZGlyZWN0aW9uIGFsb25nIGEgZGlhZ29uYWwgb2YgY29tbW9uIGl0ZW1zLlxuXHQgICAgICAgICAgY29uc3QgbkNvbW1vbkYgPSBjb3VudENvbW1vbkl0ZW1zRihcblx0ICAgICAgICAgICAgYUxhc3RQcmV2LFxuXHQgICAgICAgICAgICBhRW5kLFxuXHQgICAgICAgICAgICBiTGFzdFByZXYsXG5cdCAgICAgICAgICAgIGJFbmQsXG5cdCAgICAgICAgICAgIGlzQ29tbW9uXG5cdCAgICAgICAgICApO1xuXHQgICAgICAgICAgZGl2aXNpb24ubkNvbW1vbkZvbGxvd2luZyA9IG5Db21tb25GO1xuXHQgICAgICAgICAgaWYgKG5Db21tb25GICE9PSAwKSB7XG5cdCAgICAgICAgICAgIC8vIFRoZSBsYXN0IHBvaW50IG9mIHJldmVyc2UgcGF0aCBzZWdtZW50IGlzIHN0YXJ0IG9mIGNvbW1vbiBzdWJzZXF1ZW5jZS5cblx0ICAgICAgICAgICAgZGl2aXNpb24uYUNvbW1vbkZvbGxvd2luZyA9IGFMYXN0UHJldjtcblx0ICAgICAgICAgICAgZGl2aXNpb24uYkNvbW1vbkZvbGxvd2luZyA9IGJMYXN0UHJldjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGNvbnN0IGFTdGFydEZvbGxvd2luZyA9IGFMYXN0UHJldiArIG5Db21tb25GOyAvLyBhRmlyc3RQcmV2XG5cdCAgICAgICAgICBjb25zdCBiU3RhcnRGb2xsb3dpbmcgPSBiTGFzdFByZXYgKyBuQ29tbW9uRjsgLy8gYkZpcnN0UHJldlxuXG5cdCAgICAgICAgICBpZiAoZCAtIDEgPT09IGFFbmQgKyBiRW5kIC0gYVN0YXJ0Rm9sbG93aW5nIC0gYlN0YXJ0Rm9sbG93aW5nKSB7XG5cdCAgICAgICAgICAgIC8vIE9wdGltaXphdGlvbjogbnVtYmVyIG9mIGNoYW5nZXMgaW4gZm9yd2FyZCBkaXJlY3Rpb25cblx0ICAgICAgICAgICAgLy8gaXMgZXF1YWwgdG8gbnVtYmVyIG9mIGl0ZW1zIGluIGZvbGxvd2luZyBpbnRlcnZhbCxcblx0ICAgICAgICAgICAgLy8gdGhlcmVmb3JlIGl0IGNhbm5vdCBjb250YWluIGFueSBjb21tb24gaXRlbXMuXG5cdCAgICAgICAgICAgIGRpdmlzaW9uLmFTdGFydEZvbGxvd2luZyA9IGFFbmQ7XG5cdCAgICAgICAgICAgIGRpdmlzaW9uLmJTdGFydEZvbGxvd2luZyA9IGJFbmQ7XG5cdCAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBkaXZpc2lvbi5hU3RhcnRGb2xsb3dpbmcgPSBhU3RhcnRGb2xsb3dpbmc7XG5cdCAgICAgICAgICAgIGRpdmlzaW9uLmJTdGFydEZvbGxvd2luZyA9IGJTdGFydEZvbGxvd2luZztcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdCAgcmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cdC8vIEdpdmVuIGluZGV4IGludGVydmFscyBhbmQgaW5wdXQgZnVuY3Rpb24gdG8gY29tcGFyZSBpdGVtcyBhdCBpbmRleGVzLFxuXHQvLyBkaXZpZGUgYXQgdGhlIG1pZGRsZSBjaGFuZ2UuXG5cdC8vXG5cdC8vIERPIE5PVCBDQUxMIGlmIHN0YXJ0ID09PSBlbmQsIGJlY2F1c2UgaW50ZXJ2YWwgY2Fubm90IGNvbnRhaW4gY29tbW9uIGl0ZW1zXG5cdC8vIGFuZCBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gd2lsbCB0aHJvdyB0aGUg4oCcbm8gb3ZlcmxhcOKAnSBlcnJvci5cblx0Y29uc3QgZGl2aWRlID0gKFxuXHQgIG5DaGFuZ2UsXG5cdCAgYVN0YXJ0LFxuXHQgIGFFbmQsXG5cdCAgYlN0YXJ0LFxuXHQgIGJFbmQsXG5cdCAgaXNDb21tb24sXG5cdCAgYUluZGV4ZXNGLFxuXHQgIGFJbmRleGVzUixcblx0ICBkaXZpc2lvbiAvLyBvdXRwdXRcblx0KSA9PiB7XG5cdCAgY29uc3QgYkYgPSBiU3RhcnQgLSBhU3RhcnQ7IC8vIGJJbmRleCA9IGJGICsgYUluZGV4IC0ga0Zcblx0ICBjb25zdCBiUiA9IGJFbmQgLSBhRW5kOyAvLyBiSW5kZXggPSBiUiArIGFJbmRleCAtIGtSXG5cdCAgY29uc3QgYUxlbmd0aCA9IGFFbmQgLSBhU3RhcnQ7XG5cdCAgY29uc3QgYkxlbmd0aCA9IGJFbmQgLSBiU3RhcnQ7XG5cblx0ICAvLyBCZWNhdXNlIGdyYXBoIGhhcyBzcXVhcmUgb3IgcG9ydHJhaXQgb3JpZW50YXRpb24sXG5cdCAgLy8gbGVuZ3RoIGRpZmZlcmVuY2UgaXMgbWluaW11bSBudW1iZXIgb2YgaXRlbXMgdG8gaW5zZXJ0IGZyb20gYi5cblx0ICAvLyBDb3JyZXNwb25kaW5nIGZvcndhcmQgYW5kIHJldmVyc2UgZGlhZ29uYWxzIGluIGdyYXBoXG5cdCAgLy8gZGVwZW5kIG9uIGxlbmd0aCBkaWZmZXJlbmNlIG9mIHRoZSBzZXF1ZW5jZXM6XG5cdCAgLy8ga0YgPSBrUiAtIGJhRGVsdGFMZW5ndGhcblx0ICAvLyBrUiA9IGtGICsgYmFEZWx0YUxlbmd0aFxuXHQgIGNvbnN0IGJhRGVsdGFMZW5ndGggPSBiTGVuZ3RoIC0gYUxlbmd0aDtcblxuXHQgIC8vIE9wdGltaXphdGlvbjogbWF4IGRpYWdvbmFsIGluIGdyYXBoIGludGVyc2VjdHMgY29ybmVyIG9mIHNob3J0ZXIgc2lkZS5cblx0ICBsZXQgaU1heEYgPSBhTGVuZ3RoO1xuXHQgIGxldCBpTWF4UiA9IGFMZW5ndGg7XG5cblx0ICAvLyBJbml0aWFsaXplIG5vIGNoYW5nZXMgeWV0IGluIGZvcndhcmQgb3IgcmV2ZXJzZSBkaXJlY3Rpb246XG5cdCAgYUluZGV4ZXNGWzBdID0gYVN0YXJ0IC0gMTsgLy8gYXQgb3BlbiBzdGFydCBvZiBpbnRlcnZhbCwgb3V0c2lkZSBjbG9zZWQgc3RhcnRcblx0ICBhSW5kZXhlc1JbMF0gPSBhRW5kOyAvLyBhdCBvcGVuIGVuZCBvZiBpbnRlcnZhbFxuXG5cdCAgaWYgKGJhRGVsdGFMZW5ndGggJSAyID09PSAwKSB7XG5cdCAgICAvLyBUaGUgbnVtYmVyIG9mIGNoYW5nZXMgaW4gcGF0aHMgaXMgMiAqIGQgaWYgbGVuZ3RoIGRpZmZlcmVuY2UgaXMgZXZlbi5cblx0ICAgIGNvbnN0IGRNaW4gPSAobkNoYW5nZSB8fCBiYURlbHRhTGVuZ3RoKSAvIDI7XG5cdCAgICBjb25zdCBkTWF4ID0gKGFMZW5ndGggKyBiTGVuZ3RoKSAvIDI7XG5cdCAgICBmb3IgKGxldCBkID0gMTsgZCA8PSBkTWF4OyBkICs9IDEpIHtcblx0ICAgICAgaU1heEYgPSBleHRlbmRQYXRoc0YoZCwgYUVuZCwgYkVuZCwgYkYsIGlzQ29tbW9uLCBhSW5kZXhlc0YsIGlNYXhGKTtcblx0ICAgICAgaWYgKGQgPCBkTWluKSB7XG5cdCAgICAgICAgaU1heFIgPSBleHRlbmRQYXRoc1IoZCwgYVN0YXJ0LCBiU3RhcnQsIGJSLCBpc0NvbW1vbiwgYUluZGV4ZXNSLCBpTWF4Uik7XG5cdCAgICAgIH0gZWxzZSBpZiAoXG5cdCAgICAgICAgLy8gSWYgYSByZXZlcnNlIHBhdGggb3ZlcmxhcHMgYSBmb3J3YXJkIHBhdGggaW4gdGhlIHNhbWUgZGlhZ29uYWwsXG5cdCAgICAgICAgLy8gcmV0dXJuIGEgZGl2aXNpb24gb2YgdGhlIGluZGV4IGludGVydmFscyBhdCB0aGUgbWlkZGxlIGNoYW5nZS5cblx0ICAgICAgICBleHRlbmRPdmVybGFwcGFibGVQYXRoc1IoXG5cdCAgICAgICAgICBkLFxuXHQgICAgICAgICAgYVN0YXJ0LFxuXHQgICAgICAgICAgYUVuZCxcblx0ICAgICAgICAgIGJTdGFydCxcblx0ICAgICAgICAgIGJFbmQsXG5cdCAgICAgICAgICBpc0NvbW1vbixcblx0ICAgICAgICAgIGFJbmRleGVzRixcblx0ICAgICAgICAgIGlNYXhGLFxuXHQgICAgICAgICAgYUluZGV4ZXNSLFxuXHQgICAgICAgICAgaU1heFIsXG5cdCAgICAgICAgICBkaXZpc2lvblxuXHQgICAgICAgIClcblx0ICAgICAgKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIC8vIFRoZSBudW1iZXIgb2YgY2hhbmdlcyBpbiBwYXRocyBpcyAyICogZCAtIDEgaWYgbGVuZ3RoIGRpZmZlcmVuY2UgaXMgb2RkLlxuXHQgICAgY29uc3QgZE1pbiA9ICgobkNoYW5nZSB8fCBiYURlbHRhTGVuZ3RoKSArIDEpIC8gMjtcblx0ICAgIGNvbnN0IGRNYXggPSAoYUxlbmd0aCArIGJMZW5ndGggKyAxKSAvIDI7XG5cblx0ICAgIC8vIFVucm9sbCBmaXJzdCBoYWxmIGl0ZXJhdGlvbiBzbyBsb29wIGV4dGVuZHMgdGhlIHJlbGV2YW50IHBhaXJzIG9mIHBhdGhzLlxuXHQgICAgLy8gQmVjYXVzZSBvZiBpbnZhcmlhbnQgdGhhdCBpbnRlcnZhbHMgaGF2ZSBubyBjb21tb24gaXRlbXMgYXQgc3RhcnQgb3IgZW5kLFxuXHQgICAgLy8gYW5kIGxpbWl0YXRpb24gbm90IHRvIGNhbGwgZGl2aWRlIHdpdGggZW1wdHkgaW50ZXJ2YWxzLFxuXHQgICAgLy8gdGhlcmVmb3JlIGl0IGNhbm5vdCBiZSBjYWxsZWQgaWYgYSBmb3J3YXJkIHBhdGggd2l0aCBvbmUgY2hhbmdlXG5cdCAgICAvLyB3b3VsZCBvdmVybGFwIGEgcmV2ZXJzZSBwYXRoIHdpdGggbm8gY2hhbmdlcywgZXZlbiBpZiBkTWluID09PSAxLlxuXHQgICAgbGV0IGQgPSAxO1xuXHQgICAgaU1heEYgPSBleHRlbmRQYXRoc0YoZCwgYUVuZCwgYkVuZCwgYkYsIGlzQ29tbW9uLCBhSW5kZXhlc0YsIGlNYXhGKTtcblx0ICAgIGZvciAoZCArPSAxOyBkIDw9IGRNYXg7IGQgKz0gMSkge1xuXHQgICAgICBpTWF4UiA9IGV4dGVuZFBhdGhzUihcblx0ICAgICAgICBkIC0gMSxcblx0ICAgICAgICBhU3RhcnQsXG5cdCAgICAgICAgYlN0YXJ0LFxuXHQgICAgICAgIGJSLFxuXHQgICAgICAgIGlzQ29tbW9uLFxuXHQgICAgICAgIGFJbmRleGVzUixcblx0ICAgICAgICBpTWF4UlxuXHQgICAgICApO1xuXHQgICAgICBpZiAoZCA8IGRNaW4pIHtcblx0ICAgICAgICBpTWF4RiA9IGV4dGVuZFBhdGhzRihkLCBhRW5kLCBiRW5kLCBiRiwgaXNDb21tb24sIGFJbmRleGVzRiwgaU1heEYpO1xuXHQgICAgICB9IGVsc2UgaWYgKFxuXHQgICAgICAgIC8vIElmIGEgZm9yd2FyZCBwYXRoIG92ZXJsYXBzIGEgcmV2ZXJzZSBwYXRoIGluIHRoZSBzYW1lIGRpYWdvbmFsLFxuXHQgICAgICAgIC8vIHJldHVybiBhIGRpdmlzaW9uIG9mIHRoZSBpbmRleCBpbnRlcnZhbHMgYXQgdGhlIG1pZGRsZSBjaGFuZ2UuXG5cdCAgICAgICAgZXh0ZW5kT3ZlcmxhcHBhYmxlUGF0aHNGKFxuXHQgICAgICAgICAgZCxcblx0ICAgICAgICAgIGFTdGFydCxcblx0ICAgICAgICAgIGFFbmQsXG5cdCAgICAgICAgICBiU3RhcnQsXG5cdCAgICAgICAgICBiRW5kLFxuXHQgICAgICAgICAgaXNDb21tb24sXG5cdCAgICAgICAgICBhSW5kZXhlc0YsXG5cdCAgICAgICAgICBpTWF4Rixcblx0ICAgICAgICAgIGFJbmRleGVzUixcblx0ICAgICAgICAgIGlNYXhSLFxuXHQgICAgICAgICAgZGl2aXNpb25cblx0ICAgICAgICApXG5cdCAgICAgICkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblxuXHQgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdCAgdGhyb3cgbmV3IEVycm9yKFxuXHQgICAgYCR7cGtnfTogbm8gb3ZlcmxhcCBhU3RhcnQ9JHthU3RhcnR9IGFFbmQ9JHthRW5kfSBiU3RhcnQ9JHtiU3RhcnR9IGJFbmQ9JHtiRW5kfWBcblx0ICApO1xuXHR9O1xuXG5cdC8vIEdpdmVuIGluZGV4IGludGVydmFscyBhbmQgaW5wdXQgZnVuY3Rpb24gdG8gY29tcGFyZSBpdGVtcyBhdCBpbmRleGVzLFxuXHQvLyByZXR1cm4gYnkgb3V0cHV0IGZ1bmN0aW9uIHRoZSBudW1iZXIgb2YgYWRqYWNlbnQgaXRlbXMgYW5kIHN0YXJ0aW5nIGluZGV4ZXNcblx0Ly8gb2YgZWFjaCBjb21tb24gc3Vic2VxdWVuY2UuIERpdmlkZSBhbmQgY29ucXVlciB3aXRoIG9ubHkgbGluZWFyIHNwYWNlLlxuXHQvL1xuXHQvLyBUaGUgaW5kZXggaW50ZXJ2YWxzIGFyZSBoYWxmIG9wZW4gW3N0YXJ0LCBlbmQpIGxpa2UgYXJyYXkgc2xpY2UgbWV0aG9kLlxuXHQvLyBETyBOT1QgQ0FMTCBpZiBzdGFydCA9PT0gZW5kLCBiZWNhdXNlIGludGVydmFsIGNhbm5vdCBjb250YWluIGNvbW1vbiBpdGVtc1xuXHQvLyBhbmQgYmVjYXVzZSBkaXZpZGUgZnVuY3Rpb24gd2lsbCB0aHJvdyB0aGUg4oCcbm8gb3ZlcmxhcOKAnSBlcnJvci5cblx0Y29uc3QgZmluZFN1YnNlcXVlbmNlcyA9IChcblx0ICBuQ2hhbmdlLFxuXHQgIGFTdGFydCxcblx0ICBhRW5kLFxuXHQgIGJTdGFydCxcblx0ICBiRW5kLFxuXHQgIHRyYW5zcG9zZWQsXG5cdCAgY2FsbGJhY2tzLFxuXHQgIGFJbmRleGVzRixcblx0ICBhSW5kZXhlc1IsXG5cdCAgZGl2aXNpb24gLy8gdGVtcG9yYXJ5IG1lbW9yeSwgbm90IGlucHV0IG5vciBvdXRwdXRcblx0KSA9PiB7XG5cdCAgaWYgKGJFbmQgLSBiU3RhcnQgPCBhRW5kIC0gYVN0YXJ0KSB7XG5cdCAgICAvLyBUcmFuc3Bvc2UgZ3JhcGggc28gaXQgaGFzIHBvcnRyYWl0IGluc3RlYWQgb2YgbGFuZHNjYXBlIG9yaWVudGF0aW9uLlxuXHQgICAgLy8gQWx3YXlzIGNvbXBhcmUgc2hvcnRlciB0byBsb25nZXIgc2VxdWVuY2UgZm9yIGNvbnNpc3RlbmN5IGFuZCBvcHRpbWl6YXRpb24uXG5cdCAgICB0cmFuc3Bvc2VkID0gIXRyYW5zcG9zZWQ7XG5cdCAgICBpZiAodHJhbnNwb3NlZCAmJiBjYWxsYmFja3MubGVuZ3RoID09PSAxKSB7XG5cdCAgICAgIC8vIExhemlseSB3cmFwIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byBzd2FwIGFyZ3MgaWYgZ3JhcGggaXMgdHJhbnNwb3NlZC5cblx0ICAgICAgY29uc3Qge2ZvdW5kU3Vic2VxdWVuY2UsIGlzQ29tbW9ufSA9IGNhbGxiYWNrc1swXTtcblx0ICAgICAgY2FsbGJhY2tzWzFdID0ge1xuXHQgICAgICAgIGZvdW5kU3Vic2VxdWVuY2U6IChuQ29tbW9uLCBiQ29tbW9uLCBhQ29tbW9uKSA9PiB7XG5cdCAgICAgICAgICBmb3VuZFN1YnNlcXVlbmNlKG5Db21tb24sIGFDb21tb24sIGJDb21tb24pO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgaXNDb21tb246IChiSW5kZXgsIGFJbmRleCkgPT4gaXNDb21tb24oYUluZGV4LCBiSW5kZXgpXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICBjb25zdCB0U3RhcnQgPSBhU3RhcnQ7XG5cdCAgICBjb25zdCB0RW5kID0gYUVuZDtcblx0ICAgIGFTdGFydCA9IGJTdGFydDtcblx0ICAgIGFFbmQgPSBiRW5kO1xuXHQgICAgYlN0YXJ0ID0gdFN0YXJ0O1xuXHQgICAgYkVuZCA9IHRFbmQ7XG5cdCAgfVxuXHQgIGNvbnN0IHtmb3VuZFN1YnNlcXVlbmNlLCBpc0NvbW1vbn0gPSBjYWxsYmFja3NbdHJhbnNwb3NlZCA/IDEgOiAwXTtcblxuXHQgIC8vIERpdmlkZSB0aGUgaW5kZXggaW50ZXJ2YWxzIGF0IHRoZSBtaWRkbGUgY2hhbmdlLlxuXHQgIGRpdmlkZShcblx0ICAgIG5DaGFuZ2UsXG5cdCAgICBhU3RhcnQsXG5cdCAgICBhRW5kLFxuXHQgICAgYlN0YXJ0LFxuXHQgICAgYkVuZCxcblx0ICAgIGlzQ29tbW9uLFxuXHQgICAgYUluZGV4ZXNGLFxuXHQgICAgYUluZGV4ZXNSLFxuXHQgICAgZGl2aXNpb25cblx0ICApO1xuXHQgIGNvbnN0IHtcblx0ICAgIG5DaGFuZ2VQcmVjZWRpbmcsXG5cdCAgICBhRW5kUHJlY2VkaW5nLFxuXHQgICAgYkVuZFByZWNlZGluZyxcblx0ICAgIG5Db21tb25QcmVjZWRpbmcsXG5cdCAgICBhQ29tbW9uUHJlY2VkaW5nLFxuXHQgICAgYkNvbW1vblByZWNlZGluZyxcblx0ICAgIG5Db21tb25Gb2xsb3dpbmcsXG5cdCAgICBhQ29tbW9uRm9sbG93aW5nLFxuXHQgICAgYkNvbW1vbkZvbGxvd2luZyxcblx0ICAgIG5DaGFuZ2VGb2xsb3dpbmcsXG5cdCAgICBhU3RhcnRGb2xsb3dpbmcsXG5cdCAgICBiU3RhcnRGb2xsb3dpbmdcblx0ICB9ID0gZGl2aXNpb247XG5cblx0ICAvLyBVbmxlc3MgZWl0aGVyIGluZGV4IGludGVydmFsIGlzIGVtcHR5LCB0aGV5IG1pZ2h0IGNvbnRhaW4gY29tbW9uIGl0ZW1zLlxuXHQgIGlmIChhU3RhcnQgPCBhRW5kUHJlY2VkaW5nICYmIGJTdGFydCA8IGJFbmRQcmVjZWRpbmcpIHtcblx0ICAgIC8vIFJlY3Vyc2VseSBmaW5kIGFuZCByZXR1cm4gY29tbW9uIHN1YnNlcXVlbmNlcyBwcmVjZWRpbmcgdGhlIGRpdmlzaW9uLlxuXHQgICAgZmluZFN1YnNlcXVlbmNlcyhcblx0ICAgICAgbkNoYW5nZVByZWNlZGluZyxcblx0ICAgICAgYVN0YXJ0LFxuXHQgICAgICBhRW5kUHJlY2VkaW5nLFxuXHQgICAgICBiU3RhcnQsXG5cdCAgICAgIGJFbmRQcmVjZWRpbmcsXG5cdCAgICAgIHRyYW5zcG9zZWQsXG5cdCAgICAgIGNhbGxiYWNrcyxcblx0ICAgICAgYUluZGV4ZXNGLFxuXHQgICAgICBhSW5kZXhlc1IsXG5cdCAgICAgIGRpdmlzaW9uXG5cdCAgICApO1xuXHQgIH1cblxuXHQgIC8vIFJldHVybiBjb21tb24gc3Vic2VxdWVuY2VzIHRoYXQgYXJlIGFkamFjZW50IHRvIHRoZSBtaWRkbGUgY2hhbmdlLlxuXHQgIGlmIChuQ29tbW9uUHJlY2VkaW5nICE9PSAwKSB7XG5cdCAgICBmb3VuZFN1YnNlcXVlbmNlKG5Db21tb25QcmVjZWRpbmcsIGFDb21tb25QcmVjZWRpbmcsIGJDb21tb25QcmVjZWRpbmcpO1xuXHQgIH1cblx0ICBpZiAobkNvbW1vbkZvbGxvd2luZyAhPT0gMCkge1xuXHQgICAgZm91bmRTdWJzZXF1ZW5jZShuQ29tbW9uRm9sbG93aW5nLCBhQ29tbW9uRm9sbG93aW5nLCBiQ29tbW9uRm9sbG93aW5nKTtcblx0ICB9XG5cblx0ICAvLyBVbmxlc3MgZWl0aGVyIGluZGV4IGludGVydmFsIGlzIGVtcHR5LCB0aGV5IG1pZ2h0IGNvbnRhaW4gY29tbW9uIGl0ZW1zLlxuXHQgIGlmIChhU3RhcnRGb2xsb3dpbmcgPCBhRW5kICYmIGJTdGFydEZvbGxvd2luZyA8IGJFbmQpIHtcblx0ICAgIC8vIFJlY3Vyc2VseSBmaW5kIGFuZCByZXR1cm4gY29tbW9uIHN1YnNlcXVlbmNlcyBmb2xsb3dpbmcgdGhlIGRpdmlzaW9uLlxuXHQgICAgZmluZFN1YnNlcXVlbmNlcyhcblx0ICAgICAgbkNoYW5nZUZvbGxvd2luZyxcblx0ICAgICAgYVN0YXJ0Rm9sbG93aW5nLFxuXHQgICAgICBhRW5kLFxuXHQgICAgICBiU3RhcnRGb2xsb3dpbmcsXG5cdCAgICAgIGJFbmQsXG5cdCAgICAgIHRyYW5zcG9zZWQsXG5cdCAgICAgIGNhbGxiYWNrcyxcblx0ICAgICAgYUluZGV4ZXNGLFxuXHQgICAgICBhSW5kZXhlc1IsXG5cdCAgICAgIGRpdmlzaW9uXG5cdCAgICApO1xuXHQgIH1cblx0fTtcblx0Y29uc3QgdmFsaWRhdGVMZW5ndGggPSAobmFtZSwgYXJnKSA9PiB7XG5cdCAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInKSB7XG5cdCAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke3BrZ306ICR7bmFtZX0gdHlwZW9mICR7dHlwZW9mIGFyZ30gaXMgbm90IGEgbnVtYmVyYCk7XG5cdCAgfVxuXHQgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoYXJnKSkge1xuXHQgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCR7cGtnfTogJHtuYW1lfSB2YWx1ZSAke2FyZ30gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG5cdCAgfVxuXHQgIGlmIChhcmcgPCAwKSB7XG5cdCAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJHtwa2d9OiAke25hbWV9IHZhbHVlICR7YXJnfSBpcyBhIG5lZ2F0aXZlIGludGVnZXJgKTtcblx0ICB9XG5cdH07XG5cdGNvbnN0IHZhbGlkYXRlQ2FsbGJhY2sgPSAobmFtZSwgYXJnKSA9PiB7XG5cdCAgY29uc3QgdHlwZSA9IHR5cGVvZiBhcmc7XG5cdCAgaWYgKHR5cGUgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7cGtnfTogJHtuYW1lfSB0eXBlb2YgJHt0eXBlfSBpcyBub3QgYSBmdW5jdGlvbmApO1xuXHQgIH1cblx0fTtcblxuXHQvLyBDb21wYXJlIGl0ZW1zIGluIHR3byBzZXF1ZW5jZXMgdG8gZmluZCBhIGxvbmdlc3QgY29tbW9uIHN1YnNlcXVlbmNlLlxuXHQvLyBHaXZlbiBsZW5ndGhzIG9mIHNlcXVlbmNlcyBhbmQgaW5wdXQgZnVuY3Rpb24gdG8gY29tcGFyZSBpdGVtcyBhdCBpbmRleGVzLFxuXHQvLyByZXR1cm4gYnkgb3V0cHV0IGZ1bmN0aW9uIHRoZSBudW1iZXIgb2YgYWRqYWNlbnQgaXRlbXMgYW5kIHN0YXJ0aW5nIGluZGV4ZXNcblx0Ly8gb2YgZWFjaCBjb21tb24gc3Vic2VxdWVuY2UuXG5cdGZ1bmN0aW9uIGRpZmZTZXF1ZW5jZShhTGVuZ3RoLCBiTGVuZ3RoLCBpc0NvbW1vbiwgZm91bmRTdWJzZXF1ZW5jZSkge1xuXHQgIHZhbGlkYXRlTGVuZ3RoKCdhTGVuZ3RoJywgYUxlbmd0aCk7XG5cdCAgdmFsaWRhdGVMZW5ndGgoJ2JMZW5ndGgnLCBiTGVuZ3RoKTtcblx0ICB2YWxpZGF0ZUNhbGxiYWNrKCdpc0NvbW1vbicsIGlzQ29tbW9uKTtcblx0ICB2YWxpZGF0ZUNhbGxiYWNrKCdmb3VuZFN1YnNlcXVlbmNlJywgZm91bmRTdWJzZXF1ZW5jZSk7XG5cblx0ICAvLyBDb3VudCBjb21tb24gaXRlbXMgZnJvbSB0aGUgc3RhcnQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLlxuXHQgIGNvbnN0IG5Db21tb25GID0gY291bnRDb21tb25JdGVtc0YoMCwgYUxlbmd0aCwgMCwgYkxlbmd0aCwgaXNDb21tb24pO1xuXHQgIGlmIChuQ29tbW9uRiAhPT0gMCkge1xuXHQgICAgZm91bmRTdWJzZXF1ZW5jZShuQ29tbW9uRiwgMCwgMCk7XG5cdCAgfVxuXG5cdCAgLy8gVW5sZXNzIGJvdGggc2VxdWVuY2VzIGNvbnNpc3Qgb2YgY29tbW9uIGl0ZW1zIG9ubHksXG5cdCAgLy8gZmluZCBjb21tb24gaXRlbXMgaW4gdGhlIGhhbGYtdHJpbW1lZCBpbmRleCBpbnRlcnZhbHMuXG5cdCAgaWYgKGFMZW5ndGggIT09IG5Db21tb25GIHx8IGJMZW5ndGggIT09IG5Db21tb25GKSB7XG5cdCAgICAvLyBJbnZhcmlhbnQ6IGludGVydmFscyBkbyBub3QgaGF2ZSBjb21tb24gaXRlbXMgYXQgdGhlIHN0YXJ0LlxuXHQgICAgLy8gVGhlIHN0YXJ0IG9mIGFuIGluZGV4IGludGVydmFsIGlzIGNsb3NlZCBsaWtlIGFycmF5IHNsaWNlIG1ldGhvZC5cblx0ICAgIGNvbnN0IGFTdGFydCA9IG5Db21tb25GO1xuXHQgICAgY29uc3QgYlN0YXJ0ID0gbkNvbW1vbkY7XG5cblx0ICAgIC8vIENvdW50IGNvbW1vbiBpdGVtcyBmcm9tIHRoZSBlbmQgaW4gdGhlIHJldmVyc2UgZGlyZWN0aW9uLlxuXHQgICAgY29uc3QgbkNvbW1vblIgPSBjb3VudENvbW1vbkl0ZW1zUihcblx0ICAgICAgYVN0YXJ0LFxuXHQgICAgICBhTGVuZ3RoIC0gMSxcblx0ICAgICAgYlN0YXJ0LFxuXHQgICAgICBiTGVuZ3RoIC0gMSxcblx0ICAgICAgaXNDb21tb25cblx0ICAgICk7XG5cblx0ICAgIC8vIEludmFyaWFudDogaW50ZXJ2YWxzIGRvIG5vdCBoYXZlIGNvbW1vbiBpdGVtcyBhdCB0aGUgZW5kLlxuXHQgICAgLy8gVGhlIGVuZCBvZiBhbiBpbmRleCBpbnRlcnZhbCBpcyBvcGVuIGxpa2UgYXJyYXkgc2xpY2UgbWV0aG9kLlxuXHQgICAgY29uc3QgYUVuZCA9IGFMZW5ndGggLSBuQ29tbW9uUjtcblx0ICAgIGNvbnN0IGJFbmQgPSBiTGVuZ3RoIC0gbkNvbW1vblI7XG5cblx0ICAgIC8vIFVubGVzcyBvbmUgc2VxdWVuY2UgY29uc2lzdHMgb2YgY29tbW9uIGl0ZW1zIG9ubHksXG5cdCAgICAvLyB0aGVyZWZvcmUgdGhlIG90aGVyIHRyaW1tZWQgaW5kZXggaW50ZXJ2YWwgY29uc2lzdHMgb2YgY2hhbmdlcyBvbmx5LFxuXHQgICAgLy8gZmluZCBjb21tb24gaXRlbXMgaW4gdGhlIHRyaW1tZWQgaW5kZXggaW50ZXJ2YWxzLlxuXHQgICAgY29uc3QgbkNvbW1vbkZSID0gbkNvbW1vbkYgKyBuQ29tbW9uUjtcblx0ICAgIGlmIChhTGVuZ3RoICE9PSBuQ29tbW9uRlIgJiYgYkxlbmd0aCAhPT0gbkNvbW1vbkZSKSB7XG5cdCAgICAgIGNvbnN0IG5DaGFuZ2UgPSAwOyAvLyBudW1iZXIgb2YgY2hhbmdlIGl0ZW1zIGlzIG5vdCB5ZXQga25vd25cblx0ICAgICAgY29uc3QgdHJhbnNwb3NlZCA9IGZhbHNlOyAvLyBjYWxsIHRoZSBvcmlnaW5hbCB1bndyYXBwZWQgZnVuY3Rpb25zXG5cdCAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IFtcblx0ICAgICAgICB7XG5cdCAgICAgICAgICBmb3VuZFN1YnNlcXVlbmNlLFxuXHQgICAgICAgICAgaXNDb21tb25cblx0ICAgICAgICB9XG5cdCAgICAgIF07XG5cblx0ICAgICAgLy8gSW5kZXhlcyBpbiBzZXF1ZW5jZSBhIG9mIGxhc3QgcG9pbnRzIGluIGZ1cnRoZXN0IHJlYWNoaW5nIHBhdGhzXG5cdCAgICAgIC8vIGZyb20gb3V0c2lkZSB0aGUgc3RhcnQgYXQgdG9wIGxlZnQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uOlxuXHQgICAgICBjb25zdCBhSW5kZXhlc0YgPSBbTk9UX1lFVF9TRVRdO1xuXHQgICAgICAvLyBmcm9tIHRoZSBlbmQgYXQgYm90dG9tIHJpZ2h0IGluIHRoZSByZXZlcnNlIGRpcmVjdGlvbjpcblx0ICAgICAgY29uc3QgYUluZGV4ZXNSID0gW05PVF9ZRVRfU0VUXTtcblxuXHQgICAgICAvLyBJbml0aWFsaXplIG9uZSBvYmplY3QgYXMgb3V0cHV0IG9mIGFsbCBjYWxscyB0byBkaXZpZGUgZnVuY3Rpb24uXG5cdCAgICAgIGNvbnN0IGRpdmlzaW9uID0ge1xuXHQgICAgICAgIGFDb21tb25Gb2xsb3dpbmc6IE5PVF9ZRVRfU0VULFxuXHQgICAgICAgIGFDb21tb25QcmVjZWRpbmc6IE5PVF9ZRVRfU0VULFxuXHQgICAgICAgIGFFbmRQcmVjZWRpbmc6IE5PVF9ZRVRfU0VULFxuXHQgICAgICAgIGFTdGFydEZvbGxvd2luZzogTk9UX1lFVF9TRVQsXG5cdCAgICAgICAgYkNvbW1vbkZvbGxvd2luZzogTk9UX1lFVF9TRVQsXG5cdCAgICAgICAgYkNvbW1vblByZWNlZGluZzogTk9UX1lFVF9TRVQsXG5cdCAgICAgICAgYkVuZFByZWNlZGluZzogTk9UX1lFVF9TRVQsXG5cdCAgICAgICAgYlN0YXJ0Rm9sbG93aW5nOiBOT1RfWUVUX1NFVCxcblx0ICAgICAgICBuQ2hhbmdlRm9sbG93aW5nOiBOT1RfWUVUX1NFVCxcblx0ICAgICAgICBuQ2hhbmdlUHJlY2VkaW5nOiBOT1RfWUVUX1NFVCxcblx0ICAgICAgICBuQ29tbW9uRm9sbG93aW5nOiBOT1RfWUVUX1NFVCxcblx0ICAgICAgICBuQ29tbW9uUHJlY2VkaW5nOiBOT1RfWUVUX1NFVFxuXHQgICAgICB9O1xuXG5cdCAgICAgIC8vIEZpbmQgYW5kIHJldHVybiBjb21tb24gc3Vic2VxdWVuY2VzIGluIHRoZSB0cmltbWVkIGluZGV4IGludGVydmFscy5cblx0ICAgICAgZmluZFN1YnNlcXVlbmNlcyhcblx0ICAgICAgICBuQ2hhbmdlLFxuXHQgICAgICAgIGFTdGFydCxcblx0ICAgICAgICBhRW5kLFxuXHQgICAgICAgIGJTdGFydCxcblx0ICAgICAgICBiRW5kLFxuXHQgICAgICAgIHRyYW5zcG9zZWQsXG5cdCAgICAgICAgY2FsbGJhY2tzLFxuXHQgICAgICAgIGFJbmRleGVzRixcblx0ICAgICAgICBhSW5kZXhlc1IsXG5cdCAgICAgICAgZGl2aXNpb25cblx0ICAgICAgKTtcblx0ICAgIH1cblx0ICAgIGlmIChuQ29tbW9uUiAhPT0gMCkge1xuXHQgICAgICBmb3VuZFN1YnNlcXVlbmNlKG5Db21tb25SLCBhRW5kLCBiRW5kKTtcblx0ICAgIH1cblx0ICB9XG5cdH1cblx0cmV0dXJuIGJ1aWxkO1xufVxuXG52YXIgYnVpbGRFeHBvcnRzID0gLypAX19QVVJFX18qLyByZXF1aXJlQnVpbGQoKTtcbnZhciBkaWZmU2VxdWVuY2VzID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKGJ1aWxkRXhwb3J0cyk7XG5cbmZ1bmN0aW9uIGZvcm1hdFRyYWlsaW5nU3BhY2VzKGxpbmUsIHRyYWlsaW5nU3BhY2VGb3JtYXR0ZXIpIHtcblx0cmV0dXJuIGxpbmUucmVwbGFjZSgvXFxzKyQvLCAobWF0Y2gpID0+IHRyYWlsaW5nU3BhY2VGb3JtYXR0ZXIobWF0Y2gpKTtcbn1cbmZ1bmN0aW9uIHByaW50RGlmZkxpbmUobGluZSwgaXNGaXJzdE9yTGFzdCwgY29sb3IsIGluZGljYXRvciwgdHJhaWxpbmdTcGFjZUZvcm1hdHRlciwgZW1wdHlGaXJzdE9yTGFzdExpbmVQbGFjZWhvbGRlcikge1xuXHRyZXR1cm4gbGluZS5sZW5ndGggIT09IDAgPyBjb2xvcihgJHtpbmRpY2F0b3J9ICR7Zm9ybWF0VHJhaWxpbmdTcGFjZXMobGluZSwgdHJhaWxpbmdTcGFjZUZvcm1hdHRlcil9YCkgOiBpbmRpY2F0b3IgIT09IFwiIFwiID8gY29sb3IoaW5kaWNhdG9yKSA6IGlzRmlyc3RPckxhc3QgJiYgZW1wdHlGaXJzdE9yTGFzdExpbmVQbGFjZWhvbGRlci5sZW5ndGggIT09IDAgPyBjb2xvcihgJHtpbmRpY2F0b3J9ICR7ZW1wdHlGaXJzdE9yTGFzdExpbmVQbGFjZWhvbGRlcn1gKSA6IFwiXCI7XG59XG5mdW5jdGlvbiBwcmludERlbGV0ZUxpbmUobGluZSwgaXNGaXJzdE9yTGFzdCwgeyBhQ29sb3IsIGFJbmRpY2F0b3IsIGNoYW5nZUxpbmVUcmFpbGluZ1NwYWNlQ29sb3IsIGVtcHR5Rmlyc3RPckxhc3RMaW5lUGxhY2Vob2xkZXIgfSkge1xuXHRyZXR1cm4gcHJpbnREaWZmTGluZShsaW5lLCBpc0ZpcnN0T3JMYXN0LCBhQ29sb3IsIGFJbmRpY2F0b3IsIGNoYW5nZUxpbmVUcmFpbGluZ1NwYWNlQ29sb3IsIGVtcHR5Rmlyc3RPckxhc3RMaW5lUGxhY2Vob2xkZXIpO1xufVxuZnVuY3Rpb24gcHJpbnRJbnNlcnRMaW5lKGxpbmUsIGlzRmlyc3RPckxhc3QsIHsgYkNvbG9yLCBiSW5kaWNhdG9yLCBjaGFuZ2VMaW5lVHJhaWxpbmdTcGFjZUNvbG9yLCBlbXB0eUZpcnN0T3JMYXN0TGluZVBsYWNlaG9sZGVyIH0pIHtcblx0cmV0dXJuIHByaW50RGlmZkxpbmUobGluZSwgaXNGaXJzdE9yTGFzdCwgYkNvbG9yLCBiSW5kaWNhdG9yLCBjaGFuZ2VMaW5lVHJhaWxpbmdTcGFjZUNvbG9yLCBlbXB0eUZpcnN0T3JMYXN0TGluZVBsYWNlaG9sZGVyKTtcbn1cbmZ1bmN0aW9uIHByaW50Q29tbW9uTGluZShsaW5lLCBpc0ZpcnN0T3JMYXN0LCB7IGNvbW1vbkNvbG9yLCBjb21tb25JbmRpY2F0b3IsIGNvbW1vbkxpbmVUcmFpbGluZ1NwYWNlQ29sb3IsIGVtcHR5Rmlyc3RPckxhc3RMaW5lUGxhY2Vob2xkZXIgfSkge1xuXHRyZXR1cm4gcHJpbnREaWZmTGluZShsaW5lLCBpc0ZpcnN0T3JMYXN0LCBjb21tb25Db2xvciwgY29tbW9uSW5kaWNhdG9yLCBjb21tb25MaW5lVHJhaWxpbmdTcGFjZUNvbG9yLCBlbXB0eUZpcnN0T3JMYXN0TGluZVBsYWNlaG9sZGVyKTtcbn1cbi8vIEluIEdOVSBkaWZmIGZvcm1hdCwgaW5kZXhlcyBhcmUgb25lLWJhc2VkIGluc3RlYWQgb2YgemVyby1iYXNlZC5cbmZ1bmN0aW9uIGNyZWF0ZVBhdGNoTWFyayhhU3RhcnQsIGFFbmQsIGJTdGFydCwgYkVuZCwgeyBwYXRjaENvbG9yIH0pIHtcblx0cmV0dXJuIHBhdGNoQ29sb3IoYEBAIC0ke2FTdGFydCArIDF9LCR7YUVuZCAtIGFTdGFydH0gKyR7YlN0YXJ0ICsgMX0sJHtiRW5kIC0gYlN0YXJ0fSBAQGApO1xufVxuLy8gamVzdCAtLW5vLWV4cGFuZFxuLy9cbi8vIEdpdmVuIGFycmF5IG9mIGFsaWduZWQgc3RyaW5ncyB3aXRoIGludmVyc2UgaGlnaGxpZ2h0IGZvcm1hdHRpbmcsXG4vLyByZXR1cm4gam9pbmVkIGxpbmVzIHdpdGggZGlmZiBmb3JtYXR0aW5nIChhbmQgcGF0Y2ggbWFya3MsIGlmIG5lZWRlZCkuXG5mdW5jdGlvbiBqb2luQWxpZ25lZERpZmZzTm9FeHBhbmQoZGlmZnMsIG9wdGlvbnMpIHtcblx0Y29uc3QgaUxlbmd0aCA9IGRpZmZzLmxlbmd0aDtcblx0Y29uc3QgbkNvbnRleHRMaW5lcyA9IG9wdGlvbnMuY29udGV4dExpbmVzO1xuXHRjb25zdCBuQ29udGV4dExpbmVzMiA9IG5Db250ZXh0TGluZXMgKyBuQ29udGV4dExpbmVzO1xuXHQvLyBGaXJzdCBwYXNzOiBjb3VudCBvdXRwdXQgbGluZXMgYW5kIHNlZSBpZiBpdCBoYXMgcGF0Y2hlcy5cblx0bGV0IGpMZW5ndGggPSBpTGVuZ3RoO1xuXHRsZXQgaGFzRXhjZXNzQXRTdGFydE9yRW5kID0gZmFsc2U7XG5cdGxldCBuRXhjZXNzZXNCZXR3ZWVuQ2hhbmdlcyA9IDA7XG5cdGxldCBpID0gMDtcblx0d2hpbGUgKGkgIT09IGlMZW5ndGgpIHtcblx0XHRjb25zdCBpU3RhcnQgPSBpO1xuXHRcdHdoaWxlIChpICE9PSBpTGVuZ3RoICYmIGRpZmZzW2ldWzBdID09PSBESUZGX0VRVUFMKSB7XG5cdFx0XHRpICs9IDE7XG5cdFx0fVxuXHRcdGlmIChpU3RhcnQgIT09IGkpIHtcblx0XHRcdGlmIChpU3RhcnQgPT09IDApIHtcblx0XHRcdFx0Ly8gYXQgc3RhcnRcblx0XHRcdFx0aWYgKGkgPiBuQ29udGV4dExpbmVzKSB7XG5cdFx0XHRcdFx0akxlbmd0aCAtPSBpIC0gbkNvbnRleHRMaW5lcztcblx0XHRcdFx0XHRoYXNFeGNlc3NBdFN0YXJ0T3JFbmQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGkgPT09IGlMZW5ndGgpIHtcblx0XHRcdFx0Ly8gYXQgZW5kXG5cdFx0XHRcdGNvbnN0IG4gPSBpIC0gaVN0YXJ0O1xuXHRcdFx0XHRpZiAobiA+IG5Db250ZXh0TGluZXMpIHtcblx0XHRcdFx0XHRqTGVuZ3RoIC09IG4gLSBuQ29udGV4dExpbmVzO1xuXHRcdFx0XHRcdGhhc0V4Y2Vzc0F0U3RhcnRPckVuZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGJldHdlZW4gY2hhbmdlc1xuXHRcdFx0XHRjb25zdCBuID0gaSAtIGlTdGFydDtcblx0XHRcdFx0aWYgKG4gPiBuQ29udGV4dExpbmVzMikge1xuXHRcdFx0XHRcdGpMZW5ndGggLT0gbiAtIG5Db250ZXh0TGluZXMyO1xuXHRcdFx0XHRcdG5FeGNlc3Nlc0JldHdlZW5DaGFuZ2VzICs9IDE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKGkgIT09IGlMZW5ndGggJiYgZGlmZnNbaV1bMF0gIT09IERJRkZfRVFVQUwpIHtcblx0XHRcdGkgKz0gMTtcblx0XHR9XG5cdH1cblx0Y29uc3QgaGFzUGF0Y2ggPSBuRXhjZXNzZXNCZXR3ZWVuQ2hhbmdlcyAhPT0gMCB8fCBoYXNFeGNlc3NBdFN0YXJ0T3JFbmQ7XG5cdGlmIChuRXhjZXNzZXNCZXR3ZWVuQ2hhbmdlcyAhPT0gMCkge1xuXHRcdGpMZW5ndGggKz0gbkV4Y2Vzc2VzQmV0d2VlbkNoYW5nZXMgKyAxO1xuXHR9IGVsc2UgaWYgKGhhc0V4Y2Vzc0F0U3RhcnRPckVuZCkge1xuXHRcdGpMZW5ndGggKz0gMTtcblx0fVxuXHRjb25zdCBqTGFzdCA9IGpMZW5ndGggLSAxO1xuXHRjb25zdCBsaW5lcyA9IFtdO1xuXHRsZXQgalBhdGNoTWFyayA9IDA7XG5cdGlmIChoYXNQYXRjaCkge1xuXHRcdGxpbmVzLnB1c2goXCJcIik7XG5cdH1cblx0Ly8gSW5kZXhlcyBvZiBleHBlY3RlZCBvciByZWNlaXZlZCBsaW5lcyBpbiBjdXJyZW50IHBhdGNoOlxuXHRsZXQgYVN0YXJ0ID0gMDtcblx0bGV0IGJTdGFydCA9IDA7XG5cdGxldCBhRW5kID0gMDtcblx0bGV0IGJFbmQgPSAwO1xuXHRjb25zdCBwdXNoQ29tbW9uTGluZSA9IChsaW5lKSA9PiB7XG5cdFx0Y29uc3QgaiA9IGxpbmVzLmxlbmd0aDtcblx0XHRsaW5lcy5wdXNoKHByaW50Q29tbW9uTGluZShsaW5lLCBqID09PSAwIHx8IGogPT09IGpMYXN0LCBvcHRpb25zKSk7XG5cdFx0YUVuZCArPSAxO1xuXHRcdGJFbmQgKz0gMTtcblx0fTtcblx0Y29uc3QgcHVzaERlbGV0ZUxpbmUgPSAobGluZSkgPT4ge1xuXHRcdGNvbnN0IGogPSBsaW5lcy5sZW5ndGg7XG5cdFx0bGluZXMucHVzaChwcmludERlbGV0ZUxpbmUobGluZSwgaiA9PT0gMCB8fCBqID09PSBqTGFzdCwgb3B0aW9ucykpO1xuXHRcdGFFbmQgKz0gMTtcblx0fTtcblx0Y29uc3QgcHVzaEluc2VydExpbmUgPSAobGluZSkgPT4ge1xuXHRcdGNvbnN0IGogPSBsaW5lcy5sZW5ndGg7XG5cdFx0bGluZXMucHVzaChwcmludEluc2VydExpbmUobGluZSwgaiA9PT0gMCB8fCBqID09PSBqTGFzdCwgb3B0aW9ucykpO1xuXHRcdGJFbmQgKz0gMTtcblx0fTtcblx0Ly8gU2Vjb25kIHBhc3M6IHB1c2ggbGluZXMgd2l0aCBkaWZmIGZvcm1hdHRpbmcgKGFuZCBwYXRjaCBtYXJrcywgaWYgbmVlZGVkKS5cblx0aSA9IDA7XG5cdHdoaWxlIChpICE9PSBpTGVuZ3RoKSB7XG5cdFx0bGV0IGlTdGFydCA9IGk7XG5cdFx0d2hpbGUgKGkgIT09IGlMZW5ndGggJiYgZGlmZnNbaV1bMF0gPT09IERJRkZfRVFVQUwpIHtcblx0XHRcdGkgKz0gMTtcblx0XHR9XG5cdFx0aWYgKGlTdGFydCAhPT0gaSkge1xuXHRcdFx0aWYgKGlTdGFydCA9PT0gMCkge1xuXHRcdFx0XHQvLyBhdCBiZWdpbm5pbmdcblx0XHRcdFx0aWYgKGkgPiBuQ29udGV4dExpbmVzKSB7XG5cdFx0XHRcdFx0aVN0YXJ0ID0gaSAtIG5Db250ZXh0TGluZXM7XG5cdFx0XHRcdFx0YVN0YXJ0ID0gaVN0YXJ0O1xuXHRcdFx0XHRcdGJTdGFydCA9IGlTdGFydDtcblx0XHRcdFx0XHRhRW5kID0gYVN0YXJ0O1xuXHRcdFx0XHRcdGJFbmQgPSBiU3RhcnQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChsZXQgaUNvbW1vbiA9IGlTdGFydDsgaUNvbW1vbiAhPT0gaTsgaUNvbW1vbiArPSAxKSB7XG5cdFx0XHRcdFx0cHVzaENvbW1vbkxpbmUoZGlmZnNbaUNvbW1vbl1bMV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGkgPT09IGlMZW5ndGgpIHtcblx0XHRcdFx0Ly8gYXQgZW5kXG5cdFx0XHRcdGNvbnN0IGlFbmQgPSBpIC0gaVN0YXJ0ID4gbkNvbnRleHRMaW5lcyA/IGlTdGFydCArIG5Db250ZXh0TGluZXMgOiBpO1xuXHRcdFx0XHRmb3IgKGxldCBpQ29tbW9uID0gaVN0YXJ0OyBpQ29tbW9uICE9PSBpRW5kOyBpQ29tbW9uICs9IDEpIHtcblx0XHRcdFx0XHRwdXNoQ29tbW9uTGluZShkaWZmc1tpQ29tbW9uXVsxXSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGJldHdlZW4gY2hhbmdlc1xuXHRcdFx0XHRjb25zdCBuQ29tbW9uID0gaSAtIGlTdGFydDtcblx0XHRcdFx0aWYgKG5Db21tb24gPiBuQ29udGV4dExpbmVzMikge1xuXHRcdFx0XHRcdGNvbnN0IGlFbmQgPSBpU3RhcnQgKyBuQ29udGV4dExpbmVzO1xuXHRcdFx0XHRcdGZvciAobGV0IGlDb21tb24gPSBpU3RhcnQ7IGlDb21tb24gIT09IGlFbmQ7IGlDb21tb24gKz0gMSkge1xuXHRcdFx0XHRcdFx0cHVzaENvbW1vbkxpbmUoZGlmZnNbaUNvbW1vbl1bMV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRsaW5lc1tqUGF0Y2hNYXJrXSA9IGNyZWF0ZVBhdGNoTWFyayhhU3RhcnQsIGFFbmQsIGJTdGFydCwgYkVuZCwgb3B0aW9ucyk7XG5cdFx0XHRcdFx0alBhdGNoTWFyayA9IGxpbmVzLmxlbmd0aDtcblx0XHRcdFx0XHRsaW5lcy5wdXNoKFwiXCIpO1xuXHRcdFx0XHRcdGNvbnN0IG5PbWl0ID0gbkNvbW1vbiAtIG5Db250ZXh0TGluZXMyO1xuXHRcdFx0XHRcdGFTdGFydCA9IGFFbmQgKyBuT21pdDtcblx0XHRcdFx0XHRiU3RhcnQgPSBiRW5kICsgbk9taXQ7XG5cdFx0XHRcdFx0YUVuZCA9IGFTdGFydDtcblx0XHRcdFx0XHRiRW5kID0gYlN0YXJ0O1xuXHRcdFx0XHRcdGZvciAobGV0IGlDb21tb24gPSBpIC0gbkNvbnRleHRMaW5lczsgaUNvbW1vbiAhPT0gaTsgaUNvbW1vbiArPSAxKSB7XG5cdFx0XHRcdFx0XHRwdXNoQ29tbW9uTGluZShkaWZmc1tpQ29tbW9uXVsxXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvciAobGV0IGlDb21tb24gPSBpU3RhcnQ7IGlDb21tb24gIT09IGk7IGlDb21tb24gKz0gMSkge1xuXHRcdFx0XHRcdFx0cHVzaENvbW1vbkxpbmUoZGlmZnNbaUNvbW1vbl1bMV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHR3aGlsZSAoaSAhPT0gaUxlbmd0aCAmJiBkaWZmc1tpXVswXSA9PT0gRElGRl9ERUxFVEUpIHtcblx0XHRcdHB1c2hEZWxldGVMaW5lKGRpZmZzW2ldWzFdKTtcblx0XHRcdGkgKz0gMTtcblx0XHR9XG5cdFx0d2hpbGUgKGkgIT09IGlMZW5ndGggJiYgZGlmZnNbaV1bMF0gPT09IERJRkZfSU5TRVJUKSB7XG5cdFx0XHRwdXNoSW5zZXJ0TGluZShkaWZmc1tpXVsxXSk7XG5cdFx0XHRpICs9IDE7XG5cdFx0fVxuXHR9XG5cdGlmIChoYXNQYXRjaCkge1xuXHRcdGxpbmVzW2pQYXRjaE1hcmtdID0gY3JlYXRlUGF0Y2hNYXJrKGFTdGFydCwgYUVuZCwgYlN0YXJ0LCBiRW5kLCBvcHRpb25zKTtcblx0fVxuXHRyZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbn1cbi8vIGplc3QgLS1leHBhbmRcbi8vXG4vLyBHaXZlbiBhcnJheSBvZiBhbGlnbmVkIHN0cmluZ3Mgd2l0aCBpbnZlcnNlIGhpZ2hsaWdodCBmb3JtYXR0aW5nLFxuLy8gcmV0dXJuIGpvaW5lZCBsaW5lcyB3aXRoIGRpZmYgZm9ybWF0dGluZy5cbmZ1bmN0aW9uIGpvaW5BbGlnbmVkRGlmZnNFeHBhbmQoZGlmZnMsIG9wdGlvbnMpIHtcblx0cmV0dXJuIGRpZmZzLm1hcCgoZGlmZiwgaSwgZGlmZnMpID0+IHtcblx0XHRjb25zdCBsaW5lID0gZGlmZlsxXTtcblx0XHRjb25zdCBpc0ZpcnN0T3JMYXN0ID0gaSA9PT0gMCB8fCBpID09PSBkaWZmcy5sZW5ndGggLSAxO1xuXHRcdHN3aXRjaCAoZGlmZlswXSkge1xuXHRcdFx0Y2FzZSBESUZGX0RFTEVURTogcmV0dXJuIHByaW50RGVsZXRlTGluZShsaW5lLCBpc0ZpcnN0T3JMYXN0LCBvcHRpb25zKTtcblx0XHRcdGNhc2UgRElGRl9JTlNFUlQ6IHJldHVybiBwcmludEluc2VydExpbmUobGluZSwgaXNGaXJzdE9yTGFzdCwgb3B0aW9ucyk7XG5cdFx0XHRkZWZhdWx0OiByZXR1cm4gcHJpbnRDb21tb25MaW5lKGxpbmUsIGlzRmlyc3RPckxhc3QsIG9wdGlvbnMpO1xuXHRcdH1cblx0fSkuam9pbihcIlxcblwiKTtcbn1cblxuY29uc3Qgbm9Db2xvciA9IChzdHJpbmcpID0+IHN0cmluZztcbmNvbnN0IERJRkZfQ09OVEVYVF9ERUZBVUxUID0gNTtcbmNvbnN0IERJRkZfVFJVTkNBVEVfVEhSRVNIT0xEX0RFRkFVTFQgPSAwO1xuZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnMoKSB7XG5cdHJldHVybiB7XG5cdFx0YUFubm90YXRpb246IFwiRXhwZWN0ZWRcIixcblx0XHRhQ29sb3I6IGMuZ3JlZW4sXG5cdFx0YUluZGljYXRvcjogXCItXCIsXG5cdFx0YkFubm90YXRpb246IFwiUmVjZWl2ZWRcIixcblx0XHRiQ29sb3I6IGMucmVkLFxuXHRcdGJJbmRpY2F0b3I6IFwiK1wiLFxuXHRcdGNoYW5nZUNvbG9yOiBjLmludmVyc2UsXG5cdFx0Y2hhbmdlTGluZVRyYWlsaW5nU3BhY2VDb2xvcjogbm9Db2xvcixcblx0XHRjb21tb25Db2xvcjogYy5kaW0sXG5cdFx0Y29tbW9uSW5kaWNhdG9yOiBcIiBcIixcblx0XHRjb21tb25MaW5lVHJhaWxpbmdTcGFjZUNvbG9yOiBub0NvbG9yLFxuXHRcdGNvbXBhcmVLZXlzOiB1bmRlZmluZWQsXG5cdFx0Y29udGV4dExpbmVzOiBESUZGX0NPTlRFWFRfREVGQVVMVCxcblx0XHRlbXB0eUZpcnN0T3JMYXN0TGluZVBsYWNlaG9sZGVyOiBcIlwiLFxuXHRcdGV4cGFuZDogZmFsc2UsXG5cdFx0aW5jbHVkZUNoYW5nZUNvdW50czogZmFsc2UsXG5cdFx0b21pdEFubm90YXRpb25MaW5lczogZmFsc2UsXG5cdFx0cGF0Y2hDb2xvcjogYy55ZWxsb3csXG5cdFx0cHJpbnRCYXNpY1Byb3RvdHlwZTogZmFsc2UsXG5cdFx0dHJ1bmNhdGVUaHJlc2hvbGQ6IERJRkZfVFJVTkNBVEVfVEhSRVNIT0xEX0RFRkFVTFQsXG5cdFx0dHJ1bmNhdGVBbm5vdGF0aW9uOiBcIi4uLiBEaWZmIHJlc3VsdCBpcyB0cnVuY2F0ZWRcIixcblx0XHR0cnVuY2F0ZUFubm90YXRpb25Db2xvcjogbm9Db2xvclxuXHR9O1xufVxuZnVuY3Rpb24gZ2V0Q29tcGFyZUtleXMoY29tcGFyZUtleXMpIHtcblx0cmV0dXJuIGNvbXBhcmVLZXlzICYmIHR5cGVvZiBjb21wYXJlS2V5cyA9PT0gXCJmdW5jdGlvblwiID8gY29tcGFyZUtleXMgOiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBnZXRDb250ZXh0TGluZXMoY29udGV4dExpbmVzKSB7XG5cdHJldHVybiB0eXBlb2YgY29udGV4dExpbmVzID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKGNvbnRleHRMaW5lcykgJiYgY29udGV4dExpbmVzID49IDAgPyBjb250ZXh0TGluZXMgOiBESUZGX0NPTlRFWFRfREVGQVVMVDtcbn1cbi8vIFB1cmUgZnVuY3Rpb24gcmV0dXJucyBvcHRpb25zIHdpdGggYWxsIHByb3BlcnRpZXMuXG5mdW5jdGlvbiBub3JtYWxpemVEaWZmT3B0aW9ucyhvcHRpb25zID0ge30pIHtcblx0cmV0dXJuIHtcblx0XHQuLi5nZXREZWZhdWx0T3B0aW9ucygpLFxuXHRcdC4uLm9wdGlvbnMsXG5cdFx0Y29tcGFyZUtleXM6IGdldENvbXBhcmVLZXlzKG9wdGlvbnMuY29tcGFyZUtleXMpLFxuXHRcdGNvbnRleHRMaW5lczogZ2V0Q29udGV4dExpbmVzKG9wdGlvbnMuY29udGV4dExpbmVzKVxuXHR9O1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5U3RyaW5nKGxpbmVzKSB7XG5cdHJldHVybiBsaW5lcy5sZW5ndGggPT09IDEgJiYgbGluZXNbMF0ubGVuZ3RoID09PSAwO1xufVxuZnVuY3Rpb24gY291bnRDaGFuZ2VzKGRpZmZzKSB7XG5cdGxldCBhID0gMDtcblx0bGV0IGIgPSAwO1xuXHRkaWZmcy5mb3JFYWNoKChkaWZmKSA9PiB7XG5cdFx0c3dpdGNoIChkaWZmWzBdKSB7XG5cdFx0XHRjYXNlIERJRkZfREVMRVRFOlxuXHRcdFx0XHRhICs9IDE7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBESUZGX0lOU0VSVDpcblx0XHRcdFx0YiArPSAxO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGEsXG5cdFx0YlxuXHR9O1xufVxuZnVuY3Rpb24gcHJpbnRBbm5vdGF0aW9uKHsgYUFubm90YXRpb24sIGFDb2xvciwgYUluZGljYXRvciwgYkFubm90YXRpb24sIGJDb2xvciwgYkluZGljYXRvciwgaW5jbHVkZUNoYW5nZUNvdW50cywgb21pdEFubm90YXRpb25MaW5lcyB9LCBjaGFuZ2VDb3VudHMpIHtcblx0aWYgKG9taXRBbm5vdGF0aW9uTGluZXMpIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXHRsZXQgYVJlc3QgPSBcIlwiO1xuXHRsZXQgYlJlc3QgPSBcIlwiO1xuXHRpZiAoaW5jbHVkZUNoYW5nZUNvdW50cykge1xuXHRcdGNvbnN0IGFDb3VudCA9IFN0cmluZyhjaGFuZ2VDb3VudHMuYSk7XG5cdFx0Y29uc3QgYkNvdW50ID0gU3RyaW5nKGNoYW5nZUNvdW50cy5iKTtcblx0XHQvLyBQYWRkaW5nIHJpZ2h0IGFsaWducyB0aGUgZW5kcyBvZiB0aGUgYW5ub3RhdGlvbnMuXG5cdFx0Y29uc3QgYmFBbm5vdGF0aW9uTGVuZ3RoRGlmZiA9IGJBbm5vdGF0aW9uLmxlbmd0aCAtIGFBbm5vdGF0aW9uLmxlbmd0aDtcblx0XHRjb25zdCBhQW5ub3RhdGlvblBhZGRpbmcgPSBcIiBcIi5yZXBlYXQoTWF0aC5tYXgoMCwgYmFBbm5vdGF0aW9uTGVuZ3RoRGlmZikpO1xuXHRcdGNvbnN0IGJBbm5vdGF0aW9uUGFkZGluZyA9IFwiIFwiLnJlcGVhdChNYXRoLm1heCgwLCAtYmFBbm5vdGF0aW9uTGVuZ3RoRGlmZikpO1xuXHRcdC8vIFBhZGRpbmcgbGVmdCBhbGlnbnMgdGhlIGVuZHMgb2YgdGhlIGNvdW50cy5cblx0XHRjb25zdCBiYUNvdW50TGVuZ3RoRGlmZiA9IGJDb3VudC5sZW5ndGggLSBhQ291bnQubGVuZ3RoO1xuXHRcdGNvbnN0IGFDb3VudFBhZGRpbmcgPSBcIiBcIi5yZXBlYXQoTWF0aC5tYXgoMCwgYmFDb3VudExlbmd0aERpZmYpKTtcblx0XHRjb25zdCBiQ291bnRQYWRkaW5nID0gXCIgXCIucmVwZWF0KE1hdGgubWF4KDAsIC1iYUNvdW50TGVuZ3RoRGlmZikpO1xuXHRcdGFSZXN0ID0gYCR7YUFubm90YXRpb25QYWRkaW5nfSAgJHthSW5kaWNhdG9yfSAke2FDb3VudFBhZGRpbmd9JHthQ291bnR9YDtcblx0XHRiUmVzdCA9IGAke2JBbm5vdGF0aW9uUGFkZGluZ30gICR7YkluZGljYXRvcn0gJHtiQ291bnRQYWRkaW5nfSR7YkNvdW50fWA7XG5cdH1cblx0Y29uc3QgYSA9IGAke2FJbmRpY2F0b3J9ICR7YUFubm90YXRpb259JHthUmVzdH1gO1xuXHRjb25zdCBiID0gYCR7YkluZGljYXRvcn0gJHtiQW5ub3RhdGlvbn0ke2JSZXN0fWA7XG5cdHJldHVybiBgJHthQ29sb3IoYSl9XFxuJHtiQ29sb3IoYil9XFxuXFxuYDtcbn1cbmZ1bmN0aW9uIHByaW50RGlmZkxpbmVzKGRpZmZzLCB0cnVuY2F0ZWQsIG9wdGlvbnMpIHtcblx0cmV0dXJuIHByaW50QW5ub3RhdGlvbihvcHRpb25zLCBjb3VudENoYW5nZXMoZGlmZnMpKSArIChvcHRpb25zLmV4cGFuZCA/IGpvaW5BbGlnbmVkRGlmZnNFeHBhbmQoZGlmZnMsIG9wdGlvbnMpIDogam9pbkFsaWduZWREaWZmc05vRXhwYW5kKGRpZmZzLCBvcHRpb25zKSkgKyAodHJ1bmNhdGVkID8gb3B0aW9ucy50cnVuY2F0ZUFubm90YXRpb25Db2xvcihgXFxuJHtvcHRpb25zLnRydW5jYXRlQW5ub3RhdGlvbn1gKSA6IFwiXCIpO1xufVxuLy8gQ29tcGFyZSB0d28gYXJyYXlzIG9mIHN0cmluZ3MgbGluZS1ieS1saW5lLiBGb3JtYXQgYXMgY29tcGFyaXNvbiBsaW5lcy5cbmZ1bmN0aW9uIGRpZmZMaW5lc1VuaWZpZWQoYUxpbmVzLCBiTGluZXMsIG9wdGlvbnMpIHtcblx0Y29uc3Qgbm9ybWFsaXplZE9wdGlvbnMgPSBub3JtYWxpemVEaWZmT3B0aW9ucyhvcHRpb25zKTtcblx0Y29uc3QgW2RpZmZzLCB0cnVuY2F0ZWRdID0gZGlmZkxpbmVzUmF3KGlzRW1wdHlTdHJpbmcoYUxpbmVzKSA/IFtdIDogYUxpbmVzLCBpc0VtcHR5U3RyaW5nKGJMaW5lcykgPyBbXSA6IGJMaW5lcywgbm9ybWFsaXplZE9wdGlvbnMpO1xuXHRyZXR1cm4gcHJpbnREaWZmTGluZXMoZGlmZnMsIHRydW5jYXRlZCwgbm9ybWFsaXplZE9wdGlvbnMpO1xufVxuLy8gR2l2ZW4gdHdvIHBhaXJzIG9mIGFycmF5cyBvZiBzdHJpbmdzOlxuLy8gQ29tcGFyZSB0aGUgcGFpciBvZiBjb21wYXJpc29uIGFycmF5cyBsaW5lLWJ5LWxpbmUuXG4vLyBGb3JtYXQgdGhlIGNvcnJlc3BvbmRpbmcgbGluZXMgaW4gdGhlIHBhaXIgb2YgZGlzcGxheWFibGUgYXJyYXlzLlxuZnVuY3Rpb24gZGlmZkxpbmVzVW5pZmllZDIoYUxpbmVzRGlzcGxheSwgYkxpbmVzRGlzcGxheSwgYUxpbmVzQ29tcGFyZSwgYkxpbmVzQ29tcGFyZSwgb3B0aW9ucykge1xuXHRpZiAoaXNFbXB0eVN0cmluZyhhTGluZXNEaXNwbGF5KSAmJiBpc0VtcHR5U3RyaW5nKGFMaW5lc0NvbXBhcmUpKSB7XG5cdFx0YUxpbmVzRGlzcGxheSA9IFtdO1xuXHRcdGFMaW5lc0NvbXBhcmUgPSBbXTtcblx0fVxuXHRpZiAoaXNFbXB0eVN0cmluZyhiTGluZXNEaXNwbGF5KSAmJiBpc0VtcHR5U3RyaW5nKGJMaW5lc0NvbXBhcmUpKSB7XG5cdFx0YkxpbmVzRGlzcGxheSA9IFtdO1xuXHRcdGJMaW5lc0NvbXBhcmUgPSBbXTtcblx0fVxuXHRpZiAoYUxpbmVzRGlzcGxheS5sZW5ndGggIT09IGFMaW5lc0NvbXBhcmUubGVuZ3RoIHx8IGJMaW5lc0Rpc3BsYXkubGVuZ3RoICE9PSBiTGluZXNDb21wYXJlLmxlbmd0aCkge1xuXHRcdC8vIEZhbGwgYmFjayB0byBkaWZmIG9mIGRpc3BsYXkgbGluZXMuXG5cdFx0cmV0dXJuIGRpZmZMaW5lc1VuaWZpZWQoYUxpbmVzRGlzcGxheSwgYkxpbmVzRGlzcGxheSwgb3B0aW9ucyk7XG5cdH1cblx0Y29uc3QgW2RpZmZzLCB0cnVuY2F0ZWRdID0gZGlmZkxpbmVzUmF3KGFMaW5lc0NvbXBhcmUsIGJMaW5lc0NvbXBhcmUsIG9wdGlvbnMpO1xuXHQvLyBSZXBsYWNlIGNvbXBhcmlzb24gbGluZXMgd2l0aCBkaXNwbGF5YWJsZSBsaW5lcy5cblx0bGV0IGFJbmRleCA9IDA7XG5cdGxldCBiSW5kZXggPSAwO1xuXHRkaWZmcy5mb3JFYWNoKChkaWZmKSA9PiB7XG5cdFx0c3dpdGNoIChkaWZmWzBdKSB7XG5cdFx0XHRjYXNlIERJRkZfREVMRVRFOlxuXHRcdFx0XHRkaWZmWzFdID0gYUxpbmVzRGlzcGxheVthSW5kZXhdO1xuXHRcdFx0XHRhSW5kZXggKz0gMTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIERJRkZfSU5TRVJUOlxuXHRcdFx0XHRkaWZmWzFdID0gYkxpbmVzRGlzcGxheVtiSW5kZXhdO1xuXHRcdFx0XHRiSW5kZXggKz0gMTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRkaWZmWzFdID0gYkxpbmVzRGlzcGxheVtiSW5kZXhdO1xuXHRcdFx0XHRhSW5kZXggKz0gMTtcblx0XHRcdFx0YkluZGV4ICs9IDE7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHByaW50RGlmZkxpbmVzKGRpZmZzLCB0cnVuY2F0ZWQsIG5vcm1hbGl6ZURpZmZPcHRpb25zKG9wdGlvbnMpKTtcbn1cbi8vIENvbXBhcmUgdHdvIGFycmF5cyBvZiBzdHJpbmdzIGxpbmUtYnktbGluZS5cbmZ1bmN0aW9uIGRpZmZMaW5lc1JhdyhhTGluZXMsIGJMaW5lcywgb3B0aW9ucykge1xuXHRjb25zdCB0cnVuY2F0ZSA9IG9wdGlvbnM/LnRydW5jYXRlVGhyZXNob2xkID8/IGZhbHNlO1xuXHRjb25zdCB0cnVuY2F0ZVRocmVzaG9sZCA9IE1hdGgubWF4KE1hdGguZmxvb3Iob3B0aW9ucz8udHJ1bmNhdGVUaHJlc2hvbGQgPz8gMCksIDApO1xuXHRjb25zdCBhTGVuZ3RoID0gdHJ1bmNhdGUgPyBNYXRoLm1pbihhTGluZXMubGVuZ3RoLCB0cnVuY2F0ZVRocmVzaG9sZCkgOiBhTGluZXMubGVuZ3RoO1xuXHRjb25zdCBiTGVuZ3RoID0gdHJ1bmNhdGUgPyBNYXRoLm1pbihiTGluZXMubGVuZ3RoLCB0cnVuY2F0ZVRocmVzaG9sZCkgOiBiTGluZXMubGVuZ3RoO1xuXHRjb25zdCB0cnVuY2F0ZWQgPSBhTGVuZ3RoICE9PSBhTGluZXMubGVuZ3RoIHx8IGJMZW5ndGggIT09IGJMaW5lcy5sZW5ndGg7XG5cdGNvbnN0IGlzQ29tbW9uID0gKGFJbmRleCwgYkluZGV4KSA9PiBhTGluZXNbYUluZGV4XSA9PT0gYkxpbmVzW2JJbmRleF07XG5cdGNvbnN0IGRpZmZzID0gW107XG5cdGxldCBhSW5kZXggPSAwO1xuXHRsZXQgYkluZGV4ID0gMDtcblx0Y29uc3QgZm91bmRTdWJzZXF1ZW5jZSA9IChuQ29tbW9uLCBhQ29tbW9uLCBiQ29tbW9uKSA9PiB7XG5cdFx0Zm9yICg7IGFJbmRleCAhPT0gYUNvbW1vbjsgYUluZGV4ICs9IDEpIHtcblx0XHRcdGRpZmZzLnB1c2gobmV3IERpZmYoRElGRl9ERUxFVEUsIGFMaW5lc1thSW5kZXhdKSk7XG5cdFx0fVxuXHRcdGZvciAoOyBiSW5kZXggIT09IGJDb21tb247IGJJbmRleCArPSAxKSB7XG5cdFx0XHRkaWZmcy5wdXNoKG5ldyBEaWZmKERJRkZfSU5TRVJULCBiTGluZXNbYkluZGV4XSkpO1xuXHRcdH1cblx0XHRmb3IgKDsgbkNvbW1vbiAhPT0gMDsgbkNvbW1vbiAtPSAxLCBhSW5kZXggKz0gMSwgYkluZGV4ICs9IDEpIHtcblx0XHRcdGRpZmZzLnB1c2gobmV3IERpZmYoRElGRl9FUVVBTCwgYkxpbmVzW2JJbmRleF0pKTtcblx0XHR9XG5cdH07XG5cdGRpZmZTZXF1ZW5jZXMoYUxlbmd0aCwgYkxlbmd0aCwgaXNDb21tb24sIGZvdW5kU3Vic2VxdWVuY2UpO1xuXHQvLyBBZnRlciB0aGUgbGFzdCBjb21tb24gc3Vic2VxdWVuY2UsIHB1c2ggcmVtYWluaW5nIGNoYW5nZSBpdGVtcy5cblx0Zm9yICg7IGFJbmRleCAhPT0gYUxlbmd0aDsgYUluZGV4ICs9IDEpIHtcblx0XHRkaWZmcy5wdXNoKG5ldyBEaWZmKERJRkZfREVMRVRFLCBhTGluZXNbYUluZGV4XSkpO1xuXHR9XG5cdGZvciAoOyBiSW5kZXggIT09IGJMZW5ndGg7IGJJbmRleCArPSAxKSB7XG5cdFx0ZGlmZnMucHVzaChuZXcgRGlmZihESUZGX0lOU0VSVCwgYkxpbmVzW2JJbmRleF0pKTtcblx0fVxuXHRyZXR1cm4gW2RpZmZzLCB0cnVuY2F0ZWRdO1xufVxuXG4vLyBnZXQgdGhlIHR5cGUgb2YgYSB2YWx1ZSB3aXRoIGhhbmRsaW5nIHRoZSBlZGdlIGNhc2VzIGxpa2UgYHR5cGVvZiBbXWBcbi8vIGFuZCBgdHlwZW9mIG51bGxgXG5mdW5jdGlvbiBnZXRUeXBlKHZhbHVlKSB7XG5cdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIFwidW5kZWZpbmVkXCI7XG5cdH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gXCJudWxsXCI7XG5cdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRyZXR1cm4gXCJhcnJheVwiO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRyZXR1cm4gXCJib29sZWFuXCI7XG5cdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRyZXR1cm4gXCJmdW5jdGlvblwiO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuXHRcdHJldHVybiBcIm51bWJlclwiO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBcInN0cmluZ1wiO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuXHRcdHJldHVybiBcImJpZ2ludFwiO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRpZiAodmFsdWUuY29uc3RydWN0b3IgPT09IFJlZ0V4cCkge1xuXHRcdFx0XHRyZXR1cm4gXCJyZWdleHBcIjtcblx0XHRcdH0gZWxzZSBpZiAodmFsdWUuY29uc3RydWN0b3IgPT09IE1hcCkge1xuXHRcdFx0XHRyZXR1cm4gXCJtYXBcIjtcblx0XHRcdH0gZWxzZSBpZiAodmFsdWUuY29uc3RydWN0b3IgPT09IFNldCkge1xuXHRcdFx0XHRyZXR1cm4gXCJzZXRcIjtcblx0XHRcdH0gZWxzZSBpZiAodmFsdWUuY29uc3RydWN0b3IgPT09IERhdGUpIHtcblx0XHRcdFx0cmV0dXJuIFwiZGF0ZVwiO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gXCJvYmplY3RcIjtcblx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3ltYm9sXCIpIHtcblx0XHRyZXR1cm4gXCJzeW1ib2xcIjtcblx0fVxuXHR0aHJvdyBuZXcgRXJyb3IoYHZhbHVlIG9mIHVua25vd24gdHlwZTogJHt2YWx1ZX1gKTtcbn1cblxuLy8gcGxhdGZvcm1zIGNvbXBhdGlibGVcbmZ1bmN0aW9uIGdldE5ld0xpbmVTeW1ib2woc3RyaW5nKSB7XG5cdHJldHVybiBzdHJpbmcuaW5jbHVkZXMoXCJcXHJcXG5cIikgPyBcIlxcclxcblwiIDogXCJcXG5cIjtcbn1cbmZ1bmN0aW9uIGRpZmZTdHJpbmdzKGEsIGIsIG9wdGlvbnMpIHtcblx0Y29uc3QgdHJ1bmNhdGUgPSBvcHRpb25zPy50cnVuY2F0ZVRocmVzaG9sZCA/PyBmYWxzZTtcblx0Y29uc3QgdHJ1bmNhdGVUaHJlc2hvbGQgPSBNYXRoLm1heChNYXRoLmZsb29yKG9wdGlvbnM/LnRydW5jYXRlVGhyZXNob2xkID8/IDApLCAwKTtcblx0bGV0IGFMZW5ndGggPSBhLmxlbmd0aDtcblx0bGV0IGJMZW5ndGggPSBiLmxlbmd0aDtcblx0aWYgKHRydW5jYXRlKSB7XG5cdFx0Y29uc3QgYU11bHRpcGxlTGluZXMgPSBhLmluY2x1ZGVzKFwiXFxuXCIpO1xuXHRcdGNvbnN0IGJNdWx0aXBsZUxpbmVzID0gYi5pbmNsdWRlcyhcIlxcblwiKTtcblx0XHRjb25zdCBhTmV3TGluZVN5bWJvbCA9IGdldE5ld0xpbmVTeW1ib2woYSk7XG5cdFx0Y29uc3QgYk5ld0xpbmVTeW1ib2wgPSBnZXROZXdMaW5lU3ltYm9sKGIpO1xuXHRcdC8vIG11bHRpcGxlLWxpbmVzIHN0cmluZyBleHBlY3RzIGEgbmV3bGluZSB0byBiZSBhcHBlbmRlZCBhdCB0aGUgZW5kXG5cdFx0Y29uc3QgX2EgPSBhTXVsdGlwbGVMaW5lcyA/IGAke2Euc3BsaXQoYU5ld0xpbmVTeW1ib2wsIHRydW5jYXRlVGhyZXNob2xkKS5qb2luKGFOZXdMaW5lU3ltYm9sKX1cXG5gIDogYTtcblx0XHRjb25zdCBfYiA9IGJNdWx0aXBsZUxpbmVzID8gYCR7Yi5zcGxpdChiTmV3TGluZVN5bWJvbCwgdHJ1bmNhdGVUaHJlc2hvbGQpLmpvaW4oYk5ld0xpbmVTeW1ib2wpfVxcbmAgOiBiO1xuXHRcdGFMZW5ndGggPSBfYS5sZW5ndGg7XG5cdFx0Ykxlbmd0aCA9IF9iLmxlbmd0aDtcblx0fVxuXHRjb25zdCB0cnVuY2F0ZWQgPSBhTGVuZ3RoICE9PSBhLmxlbmd0aCB8fCBiTGVuZ3RoICE9PSBiLmxlbmd0aDtcblx0Y29uc3QgaXNDb21tb24gPSAoYUluZGV4LCBiSW5kZXgpID0+IGFbYUluZGV4XSA9PT0gYltiSW5kZXhdO1xuXHRsZXQgYUluZGV4ID0gMDtcblx0bGV0IGJJbmRleCA9IDA7XG5cdGNvbnN0IGRpZmZzID0gW107XG5cdGNvbnN0IGZvdW5kU3Vic2VxdWVuY2UgPSAobkNvbW1vbiwgYUNvbW1vbiwgYkNvbW1vbikgPT4ge1xuXHRcdGlmIChhSW5kZXggIT09IGFDb21tb24pIHtcblx0XHRcdGRpZmZzLnB1c2gobmV3IERpZmYoRElGRl9ERUxFVEUsIGEuc2xpY2UoYUluZGV4LCBhQ29tbW9uKSkpO1xuXHRcdH1cblx0XHRpZiAoYkluZGV4ICE9PSBiQ29tbW9uKSB7XG5cdFx0XHRkaWZmcy5wdXNoKG5ldyBEaWZmKERJRkZfSU5TRVJULCBiLnNsaWNlKGJJbmRleCwgYkNvbW1vbikpKTtcblx0XHR9XG5cdFx0YUluZGV4ID0gYUNvbW1vbiArIG5Db21tb247XG5cdFx0YkluZGV4ID0gYkNvbW1vbiArIG5Db21tb247XG5cdFx0ZGlmZnMucHVzaChuZXcgRGlmZihESUZGX0VRVUFMLCBiLnNsaWNlKGJDb21tb24sIGJJbmRleCkpKTtcblx0fTtcblx0ZGlmZlNlcXVlbmNlcyhhTGVuZ3RoLCBiTGVuZ3RoLCBpc0NvbW1vbiwgZm91bmRTdWJzZXF1ZW5jZSk7XG5cdC8vIEFmdGVyIHRoZSBsYXN0IGNvbW1vbiBzdWJzZXF1ZW5jZSwgcHVzaCByZW1haW5pbmcgY2hhbmdlIGl0ZW1zLlxuXHRpZiAoYUluZGV4ICE9PSBhTGVuZ3RoKSB7XG5cdFx0ZGlmZnMucHVzaChuZXcgRGlmZihESUZGX0RFTEVURSwgYS5zbGljZShhSW5kZXgpKSk7XG5cdH1cblx0aWYgKGJJbmRleCAhPT0gYkxlbmd0aCkge1xuXHRcdGRpZmZzLnB1c2gobmV3IERpZmYoRElGRl9JTlNFUlQsIGIuc2xpY2UoYkluZGV4KSkpO1xuXHR9XG5cdHJldHVybiBbZGlmZnMsIHRydW5jYXRlZF07XG59XG5cbi8vIEdpdmVuIGNoYW5nZSBvcCBhbmQgYXJyYXkgb2YgZGlmZnMsIHJldHVybiBjb25jYXRlbmF0ZWQgc3RyaW5nOlxuLy8gKiBpbmNsdWRlIGNvbW1vbiBzdHJpbmdzXG4vLyAqIGluY2x1ZGUgY2hhbmdlIHN0cmluZ3Mgd2hpY2ggaGF2ZSBhcmd1bWVudCBvcCB3aXRoIGNoYW5nZUNvbG9yXG4vLyAqIGV4Y2x1ZGUgY2hhbmdlIHN0cmluZ3Mgd2hpY2ggaGF2ZSBvcHBvc2l0ZSBvcFxuZnVuY3Rpb24gY29uY2F0ZW5hdGVSZWxldmFudERpZmZzKG9wLCBkaWZmcywgY2hhbmdlQ29sb3IpIHtcblx0cmV0dXJuIGRpZmZzLnJlZHVjZSgocmVkdWNlZCwgZGlmZikgPT4gcmVkdWNlZCArIChkaWZmWzBdID09PSBESUZGX0VRVUFMID8gZGlmZlsxXSA6IGRpZmZbMF0gPT09IG9wICYmIGRpZmZbMV0ubGVuZ3RoICE9PSAwID8gY2hhbmdlQ29sb3IoZGlmZlsxXSkgOiBcIlwiKSwgXCJcIik7XG59XG4vLyBFbmNhcHN1bGF0ZSBjaGFuZ2UgbGluZXMgdW50aWwgZWl0aGVyIGEgY29tbW9uIG5ld2xpbmUgb3IgdGhlIGVuZC5cbmNsYXNzIENoYW5nZUJ1ZmZlciB7XG5cdG9wO1xuXHRsaW5lO1xuXHRsaW5lcztcblx0Y2hhbmdlQ29sb3I7XG5cdGNvbnN0cnVjdG9yKG9wLCBjaGFuZ2VDb2xvcikge1xuXHRcdHRoaXMub3AgPSBvcDtcblx0XHR0aGlzLmxpbmUgPSBbXTtcblx0XHR0aGlzLmxpbmVzID0gW107XG5cdFx0dGhpcy5jaGFuZ2VDb2xvciA9IGNoYW5nZUNvbG9yO1xuXHR9XG5cdHB1c2hTdWJzdHJpbmcoc3Vic3RyaW5nKSB7XG5cdFx0dGhpcy5wdXNoRGlmZihuZXcgRGlmZih0aGlzLm9wLCBzdWJzdHJpbmcpKTtcblx0fVxuXHRwdXNoTGluZSgpIHtcblx0XHQvLyBBc3N1bWUgY2FsbCBvbmx5IGlmIGxpbmUgaGFzIGF0IGxlYXN0IG9uZSBkaWZmLFxuXHRcdC8vIHRoZXJlZm9yZSBhbiBlbXB0eSBsaW5lIG11c3QgaGF2ZSBhIGRpZmYgd2hpY2ggaGFzIGFuIGVtcHR5IHN0cmluZy5cblx0XHQvLyBJZiBsaW5lIGhhcyBtdWx0aXBsZSBkaWZmcywgdGhlbiBhc3N1bWUgaXQgaGFzIGEgY29tbW9uIGRpZmYsXG5cdFx0Ly8gdGhlcmVmb3JlIGNoYW5nZSBkaWZmcyBoYXZlIGNoYW5nZSBjb2xvcjtcblx0XHQvLyBvdGhlcndpc2UgdGhlbiBpdCBoYXMgbGluZSBjb2xvciBvbmx5LlxuXHRcdHRoaXMubGluZXMucHVzaCh0aGlzLmxpbmUubGVuZ3RoICE9PSAxID8gbmV3IERpZmYodGhpcy5vcCwgY29uY2F0ZW5hdGVSZWxldmFudERpZmZzKHRoaXMub3AsIHRoaXMubGluZSwgdGhpcy5jaGFuZ2VDb2xvcikpIDogdGhpcy5saW5lWzBdWzBdID09PSB0aGlzLm9wID8gdGhpcy5saW5lWzBdIDogbmV3IERpZmYodGhpcy5vcCwgdGhpcy5saW5lWzBdWzFdKSk7XG5cdFx0dGhpcy5saW5lLmxlbmd0aCA9IDA7XG5cdH1cblx0aXNMaW5lRW1wdHkoKSB7XG5cdFx0cmV0dXJuIHRoaXMubGluZS5sZW5ndGggPT09IDA7XG5cdH1cblx0Ly8gTWlub3IgaW5wdXQgdG8gYnVmZmVyLlxuXHRwdXNoRGlmZihkaWZmKSB7XG5cdFx0dGhpcy5saW5lLnB1c2goZGlmZik7XG5cdH1cblx0Ly8gTWFpbiBpbnB1dCB0byBidWZmZXIuXG5cdGFsaWduKGRpZmYpIHtcblx0XHRjb25zdCBzdHJpbmcgPSBkaWZmWzFdO1xuXHRcdGlmIChzdHJpbmcuaW5jbHVkZXMoXCJcXG5cIikpIHtcblx0XHRcdGNvbnN0IHN1YnN0cmluZ3MgPSBzdHJpbmcuc3BsaXQoXCJcXG5cIik7XG5cdFx0XHRjb25zdCBpTGFzdCA9IHN1YnN0cmluZ3MubGVuZ3RoIC0gMTtcblx0XHRcdHN1YnN0cmluZ3MuZm9yRWFjaCgoc3Vic3RyaW5nLCBpKSA9PiB7XG5cdFx0XHRcdGlmIChpIDwgaUxhc3QpIHtcblx0XHRcdFx0XHQvLyBUaGUgZmlyc3Qgc3Vic3RyaW5nIGNvbXBsZXRlcyB0aGUgY3VycmVudCBjaGFuZ2UgbGluZS5cblx0XHRcdFx0XHQvLyBBIG1pZGRsZSBzdWJzdHJpbmcgaXMgYSBjaGFuZ2UgbGluZS5cblx0XHRcdFx0XHR0aGlzLnB1c2hTdWJzdHJpbmcoc3Vic3RyaW5nKTtcblx0XHRcdFx0XHR0aGlzLnB1c2hMaW5lKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc3Vic3RyaW5nLmxlbmd0aCAhPT0gMCkge1xuXHRcdFx0XHRcdC8vIFRoZSBsYXN0IHN1YnN0cmluZyBzdGFydHMgYSBjaGFuZ2UgbGluZSwgaWYgaXQgaXMgbm90IGVtcHR5LlxuXHRcdFx0XHRcdC8vIEltcG9ydGFudDogVGhpcyBub24tZW1wdHkgY29uZGl0aW9uIGFsc28gYXV0b21hdGljYWxseSBvbWl0c1xuXHRcdFx0XHRcdC8vIHRoZSBuZXdsaW5lIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgZXhwZWN0ZWQgYW5kIHJlY2VpdmVkIHN0cmluZ3MuXG5cdFx0XHRcdFx0dGhpcy5wdXNoU3Vic3RyaW5nKHN1YnN0cmluZyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBBcHBlbmQgbm9uLW11bHRpbGluZSBzdHJpbmcgdG8gY3VycmVudCBjaGFuZ2UgbGluZS5cblx0XHRcdHRoaXMucHVzaERpZmYoZGlmZik7XG5cdFx0fVxuXHR9XG5cdC8vIE91dHB1dCBmcm9tIGJ1ZmZlci5cblx0bW92ZUxpbmVzVG8obGluZXMpIHtcblx0XHRpZiAoIXRoaXMuaXNMaW5lRW1wdHkoKSkge1xuXHRcdFx0dGhpcy5wdXNoTGluZSgpO1xuXHRcdH1cblx0XHRsaW5lcy5wdXNoKC4uLnRoaXMubGluZXMpO1xuXHRcdHRoaXMubGluZXMubGVuZ3RoID0gMDtcblx0fVxufVxuLy8gRW5jYXBzdWxhdGUgY29tbW9uIGFuZCBjaGFuZ2UgbGluZXMuXG5jbGFzcyBDb21tb25CdWZmZXIge1xuXHRkZWxldGVCdWZmZXI7XG5cdGluc2VydEJ1ZmZlcjtcblx0bGluZXM7XG5cdGNvbnN0cnVjdG9yKGRlbGV0ZUJ1ZmZlciwgaW5zZXJ0QnVmZmVyKSB7XG5cdFx0dGhpcy5kZWxldGVCdWZmZXIgPSBkZWxldGVCdWZmZXI7XG5cdFx0dGhpcy5pbnNlcnRCdWZmZXIgPSBpbnNlcnRCdWZmZXI7XG5cdFx0dGhpcy5saW5lcyA9IFtdO1xuXHR9XG5cdHB1c2hEaWZmQ29tbW9uTGluZShkaWZmKSB7XG5cdFx0dGhpcy5saW5lcy5wdXNoKGRpZmYpO1xuXHR9XG5cdHB1c2hEaWZmQ2hhbmdlTGluZXMoZGlmZikge1xuXHRcdGNvbnN0IGlzRGlmZkVtcHR5ID0gZGlmZlsxXS5sZW5ndGggPT09IDA7XG5cdFx0Ly8gQW4gZW1wdHkgZGlmZiBzdHJpbmcgaXMgcmVkdW5kYW50LCB1bmxlc3MgYSBjaGFuZ2UgbGluZSBpcyBlbXB0eS5cblx0XHRpZiAoIWlzRGlmZkVtcHR5IHx8IHRoaXMuZGVsZXRlQnVmZmVyLmlzTGluZUVtcHR5KCkpIHtcblx0XHRcdHRoaXMuZGVsZXRlQnVmZmVyLnB1c2hEaWZmKGRpZmYpO1xuXHRcdH1cblx0XHRpZiAoIWlzRGlmZkVtcHR5IHx8IHRoaXMuaW5zZXJ0QnVmZmVyLmlzTGluZUVtcHR5KCkpIHtcblx0XHRcdHRoaXMuaW5zZXJ0QnVmZmVyLnB1c2hEaWZmKGRpZmYpO1xuXHRcdH1cblx0fVxuXHRmbHVzaENoYW5nZUxpbmVzKCkge1xuXHRcdHRoaXMuZGVsZXRlQnVmZmVyLm1vdmVMaW5lc1RvKHRoaXMubGluZXMpO1xuXHRcdHRoaXMuaW5zZXJ0QnVmZmVyLm1vdmVMaW5lc1RvKHRoaXMubGluZXMpO1xuXHR9XG5cdC8vIElucHV0IHRvIGJ1ZmZlci5cblx0YWxpZ24oZGlmZikge1xuXHRcdGNvbnN0IG9wID0gZGlmZlswXTtcblx0XHRjb25zdCBzdHJpbmcgPSBkaWZmWzFdO1xuXHRcdGlmIChzdHJpbmcuaW5jbHVkZXMoXCJcXG5cIikpIHtcblx0XHRcdGNvbnN0IHN1YnN0cmluZ3MgPSBzdHJpbmcuc3BsaXQoXCJcXG5cIik7XG5cdFx0XHRjb25zdCBpTGFzdCA9IHN1YnN0cmluZ3MubGVuZ3RoIC0gMTtcblx0XHRcdHN1YnN0cmluZ3MuZm9yRWFjaCgoc3Vic3RyaW5nLCBpKSA9PiB7XG5cdFx0XHRcdGlmIChpID09PSAwKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3ViZGlmZiA9IG5ldyBEaWZmKG9wLCBzdWJzdHJpbmcpO1xuXHRcdFx0XHRcdGlmICh0aGlzLmRlbGV0ZUJ1ZmZlci5pc0xpbmVFbXB0eSgpICYmIHRoaXMuaW5zZXJ0QnVmZmVyLmlzTGluZUVtcHR5KCkpIHtcblx0XHRcdFx0XHRcdC8vIElmIGJvdGggY3VycmVudCBjaGFuZ2UgbGluZXMgYXJlIGVtcHR5LFxuXHRcdFx0XHRcdFx0Ly8gdGhlbiB0aGUgZmlyc3Qgc3Vic3RyaW5nIGlzIGEgY29tbW9uIGxpbmUuXG5cdFx0XHRcdFx0XHR0aGlzLmZsdXNoQ2hhbmdlTGluZXMoKTtcblx0XHRcdFx0XHRcdHRoaXMucHVzaERpZmZDb21tb25MaW5lKHN1YmRpZmYpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBJZiBlaXRoZXIgY3VycmVudCBjaGFuZ2UgbGluZSBpcyBub24tZW1wdHksXG5cdFx0XHRcdFx0XHQvLyB0aGVuIHRoZSBmaXJzdCBzdWJzdHJpbmcgY29tcGxldGVzIHRoZSBjaGFuZ2UgbGluZXMuXG5cdFx0XHRcdFx0XHR0aGlzLnB1c2hEaWZmQ2hhbmdlTGluZXMoc3ViZGlmZik7XG5cdFx0XHRcdFx0XHR0aGlzLmZsdXNoQ2hhbmdlTGluZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoaSA8IGlMYXN0KSB7XG5cdFx0XHRcdFx0Ly8gQSBtaWRkbGUgc3Vic3RyaW5nIGlzIGEgY29tbW9uIGxpbmUuXG5cdFx0XHRcdFx0dGhpcy5wdXNoRGlmZkNvbW1vbkxpbmUobmV3IERpZmYob3AsIHN1YnN0cmluZykpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHN1YnN0cmluZy5sZW5ndGggIT09IDApIHtcblx0XHRcdFx0XHQvLyBUaGUgbGFzdCBzdWJzdHJpbmcgc3RhcnRzIGEgY2hhbmdlIGxpbmUsIGlmIGl0IGlzIG5vdCBlbXB0eS5cblx0XHRcdFx0XHQvLyBJbXBvcnRhbnQ6IFRoaXMgbm9uLWVtcHR5IGNvbmRpdGlvbiBhbHNvIGF1dG9tYXRpY2FsbHkgb21pdHNcblx0XHRcdFx0XHQvLyB0aGUgbmV3bGluZSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGV4cGVjdGVkIGFuZCByZWNlaXZlZCBzdHJpbmdzLlxuXHRcdFx0XHRcdHRoaXMucHVzaERpZmZDaGFuZ2VMaW5lcyhuZXcgRGlmZihvcCwgc3Vic3RyaW5nKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBBcHBlbmQgbm9uLW11bHRpbGluZSBzdHJpbmcgdG8gY3VycmVudCBjaGFuZ2UgbGluZXMuXG5cdFx0XHQvLyBJbXBvcnRhbnQ6IEl0IGNhbm5vdCBiZSBhdCB0aGUgZW5kIGZvbGxvd2luZyBlbXB0eSBjaGFuZ2UgbGluZXMsXG5cdFx0XHQvLyBiZWNhdXNlIG5ld2xpbmUgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiBleHBlY3RlZCBhbmQgcmVjZWl2ZWQgc3RyaW5ncy5cblx0XHRcdHRoaXMucHVzaERpZmZDaGFuZ2VMaW5lcyhkaWZmKTtcblx0XHR9XG5cdH1cblx0Ly8gT3V0cHV0IGZyb20gYnVmZmVyLlxuXHRnZXRMaW5lcygpIHtcblx0XHR0aGlzLmZsdXNoQ2hhbmdlTGluZXMoKTtcblx0XHRyZXR1cm4gdGhpcy5saW5lcztcblx0fVxufVxuLy8gR2l2ZW4gZGlmZnMgZnJvbSBleHBlY3RlZCBhbmQgcmVjZWl2ZWQgc3RyaW5ncyxcbi8vIHJldHVybiBuZXcgYXJyYXkgb2YgZGlmZnMgc3BsaXQgb3Igam9pbmVkIGludG8gbGluZXMuXG4vL1xuLy8gVG8gY29ycmVjdGx5IGFsaWduIGEgY2hhbmdlIGxpbmUgYXQgdGhlIGVuZCwgdGhlIGFsZ29yaXRobTpcbi8vICogYXNzdW1lcyB0aGF0IGEgbmV3bGluZSB3YXMgYXBwZW5kZWQgdG8gdGhlIHN0cmluZ3Ncbi8vICogb21pdHMgdGhlIGxhc3QgbmV3bGluZSBmcm9tIHRoZSBvdXRwdXQgYXJyYXlcbi8vXG4vLyBBc3N1bWUgdGhlIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQ6XG4vLyAqIGlmIGVpdGhlciBleHBlY3RlZCBvciByZWNlaXZlZCBpcyBlbXB0eSBzdHJpbmdcbi8vICogaWYgbmVpdGhlciBleHBlY3RlZCBub3IgcmVjZWl2ZWQgaXMgbXVsdGlsaW5lIHN0cmluZ1xuZnVuY3Rpb24gZ2V0QWxpZ25lZERpZmZzKGRpZmZzLCBjaGFuZ2VDb2xvcikge1xuXHRjb25zdCBkZWxldGVCdWZmZXIgPSBuZXcgQ2hhbmdlQnVmZmVyKERJRkZfREVMRVRFLCBjaGFuZ2VDb2xvcik7XG5cdGNvbnN0IGluc2VydEJ1ZmZlciA9IG5ldyBDaGFuZ2VCdWZmZXIoRElGRl9JTlNFUlQsIGNoYW5nZUNvbG9yKTtcblx0Y29uc3QgY29tbW9uQnVmZmVyID0gbmV3IENvbW1vbkJ1ZmZlcihkZWxldGVCdWZmZXIsIGluc2VydEJ1ZmZlcik7XG5cdGRpZmZzLmZvckVhY2goKGRpZmYpID0+IHtcblx0XHRzd2l0Y2ggKGRpZmZbMF0pIHtcblx0XHRcdGNhc2UgRElGRl9ERUxFVEU6XG5cdFx0XHRcdGRlbGV0ZUJ1ZmZlci5hbGlnbihkaWZmKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIERJRkZfSU5TRVJUOlxuXHRcdFx0XHRpbnNlcnRCdWZmZXIuYWxpZ24oZGlmZik7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogY29tbW9uQnVmZmVyLmFsaWduKGRpZmYpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBjb21tb25CdWZmZXIuZ2V0TGluZXMoKTtcbn1cblxuZnVuY3Rpb24gaGFzQ29tbW9uRGlmZihkaWZmcywgaXNNdWx0aWxpbmUpIHtcblx0aWYgKGlzTXVsdGlsaW5lKSB7XG5cdFx0Ly8gSW1wb3J0YW50OiBJZ25vcmUgY29tbW9uIG5ld2xpbmUgdGhhdCB3YXMgYXBwZW5kZWQgdG8gbXVsdGlsaW5lIHN0cmluZ3MhXG5cdFx0Y29uc3QgaUxhc3QgPSBkaWZmcy5sZW5ndGggLSAxO1xuXHRcdHJldHVybiBkaWZmcy5zb21lKChkaWZmLCBpKSA9PiBkaWZmWzBdID09PSBESUZGX0VRVUFMICYmIChpICE9PSBpTGFzdCB8fCBkaWZmWzFdICE9PSBcIlxcblwiKSk7XG5cdH1cblx0cmV0dXJuIGRpZmZzLnNvbWUoKGRpZmYpID0+IGRpZmZbMF0gPT09IERJRkZfRVFVQUwpO1xufVxuLy8gQ29tcGFyZSB0d28gc3RyaW5ncyBjaGFyYWN0ZXItYnktY2hhcmFjdGVyLlxuLy8gRm9ybWF0IGFzIGNvbXBhcmlzb24gbGluZXMgaW4gd2hpY2ggY2hhbmdlZCBzdWJzdHJpbmdzIGhhdmUgaW52ZXJzZSBjb2xvcnMuXG5mdW5jdGlvbiBkaWZmU3RyaW5nc1VuaWZpZWQoYSwgYiwgb3B0aW9ucykge1xuXHRpZiAoYSAhPT0gYiAmJiBhLmxlbmd0aCAhPT0gMCAmJiBiLmxlbmd0aCAhPT0gMCkge1xuXHRcdGNvbnN0IGlzTXVsdGlsaW5lID0gYS5pbmNsdWRlcyhcIlxcblwiKSB8fCBiLmluY2x1ZGVzKFwiXFxuXCIpO1xuXHRcdC8vIGdldEFsaWduZWREaWZmcyBhc3N1bWVzIHRoYXQgYSBuZXdsaW5lIHdhcyBhcHBlbmRlZCB0byB0aGUgc3RyaW5ncy5cblx0XHRjb25zdCBbZGlmZnMsIHRydW5jYXRlZF0gPSBkaWZmU3RyaW5nc1Jhdyhpc011bHRpbGluZSA/IGAke2F9XFxuYCA6IGEsIGlzTXVsdGlsaW5lID8gYCR7Yn1cXG5gIDogYiwgdHJ1ZSwgb3B0aW9ucyk7XG5cdFx0aWYgKGhhc0NvbW1vbkRpZmYoZGlmZnMsIGlzTXVsdGlsaW5lKSkge1xuXHRcdFx0Y29uc3Qgb3B0aW9uc05vcm1hbGl6ZWQgPSBub3JtYWxpemVEaWZmT3B0aW9ucyhvcHRpb25zKTtcblx0XHRcdGNvbnN0IGxpbmVzID0gZ2V0QWxpZ25lZERpZmZzKGRpZmZzLCBvcHRpb25zTm9ybWFsaXplZC5jaGFuZ2VDb2xvcik7XG5cdFx0XHRyZXR1cm4gcHJpbnREaWZmTGluZXMobGluZXMsIHRydW5jYXRlZCwgb3B0aW9uc05vcm1hbGl6ZWQpO1xuXHRcdH1cblx0fVxuXHQvLyBGYWxsIGJhY2sgdG8gbGluZS1ieS1saW5lIGRpZmYuXG5cdHJldHVybiBkaWZmTGluZXNVbmlmaWVkKGEuc3BsaXQoXCJcXG5cIiksIGIuc3BsaXQoXCJcXG5cIiksIG9wdGlvbnMpO1xufVxuLy8gQ29tcGFyZSB0d28gc3RyaW5ncyBjaGFyYWN0ZXItYnktY2hhcmFjdGVyLlxuLy8gT3B0aW9uYWxseSBjbGVhbiB1cCBzbWFsbCBjb21tb24gc3Vic3RyaW5ncywgYWxzbyBrbm93biBhcyBjaGFmZi5cbmZ1bmN0aW9uIGRpZmZTdHJpbmdzUmF3KGEsIGIsIGNsZWFudXAsIG9wdGlvbnMpIHtcblx0Y29uc3QgW2RpZmZzLCB0cnVuY2F0ZWRdID0gZGlmZlN0cmluZ3MoYSwgYiwgb3B0aW9ucyk7XG5cdGlmIChjbGVhbnVwKSB7XG5cdFx0ZGlmZl9jbGVhbnVwU2VtYW50aWMoZGlmZnMpO1xuXHR9XG5cdHJldHVybiBbZGlmZnMsIHRydW5jYXRlZF07XG59XG5cbmZ1bmN0aW9uIGdldENvbW1vbk1lc3NhZ2UobWVzc2FnZSwgb3B0aW9ucykge1xuXHRjb25zdCB7IGNvbW1vbkNvbG9yIH0gPSBub3JtYWxpemVEaWZmT3B0aW9ucyhvcHRpb25zKTtcblx0cmV0dXJuIGNvbW1vbkNvbG9yKG1lc3NhZ2UpO1xufVxuY29uc3QgeyBBc3ltbWV0cmljTWF0Y2hlciwgRE9NQ29sbGVjdGlvbiwgRE9NRWxlbWVudCwgSW1tdXRhYmxlLCBSZWFjdEVsZW1lbnQsIFJlYWN0VGVzdENvbXBvbmVudCB9ID0gcGx1Z2lucztcbmNvbnN0IFBMVUdJTlMgPSBbXG5cdFJlYWN0VGVzdENvbXBvbmVudCxcblx0UmVhY3RFbGVtZW50LFxuXHRET01FbGVtZW50LFxuXHRET01Db2xsZWN0aW9uLFxuXHRJbW11dGFibGUsXG5cdEFzeW1tZXRyaWNNYXRjaGVyLFxuXHRwbHVnaW5zLkVycm9yXG5dO1xuY29uc3QgRk9STUFUX09QVElPTlMgPSB7XG5cdG1heERlcHRoOiAyMCxcblx0cGx1Z2luczogUExVR0lOU1xufTtcbmNvbnN0IEZBTExCQUNLX0ZPUk1BVF9PUFRJT05TID0ge1xuXHRjYWxsVG9KU09OOiBmYWxzZSxcblx0bWF4RGVwdGg6IDgsXG5cdHBsdWdpbnM6IFBMVUdJTlNcbn07XG5jb25zdCBERUZBVUxUX01FTU9SSVpFID0gKF8sIHYpID0+IHY7XG4vLyBHZW5lcmF0ZSBhIHN0cmluZyB0aGF0IHdpbGwgaGlnaGxpZ2h0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHZhbHVlc1xuLy8gd2l0aCBncmVlbiBhbmQgcmVkLiAoc2ltaWxhciB0byBob3cgZ2l0aHViIGRvZXMgY29kZSBkaWZmaW5nKVxuLyoqXG4qIEBwYXJhbSBhIEV4cGVjdGVkIHZhbHVlXG4qIEBwYXJhbSBiIFJlY2VpdmVkIHZhbHVlXG4qIEBwYXJhbSBvcHRpb25zIERpZmYgb3B0aW9uc1xuKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gYSBzdHJpbmcgZGlmZlxuKi9cbmZ1bmN0aW9uIGRpZmYoYSwgYiwgb3B0aW9ucywgbWVtb3JpemUgPSBERUZBVUxUX01FTU9SSVpFKSB7XG5cdGlmIChPYmplY3QuaXMoYSwgYikpIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXHRjb25zdCBhVHlwZSA9IGdldFR5cGUoYSk7XG5cdGxldCBleHBlY3RlZFR5cGUgPSBhVHlwZTtcblx0bGV0IG9taXREaWZmZXJlbmNlID0gZmFsc2U7XG5cdGlmIChhVHlwZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYS5hc3ltbWV0cmljTWF0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdGlmIChhLiQkdHlwZW9mICE9PSBTeW1ib2wuZm9yKFwiamVzdC5hc3ltbWV0cmljTWF0Y2hlclwiKSkge1xuXHRcdFx0Ly8gRG8gbm90IGtub3cgZXhwZWN0ZWQgdHlwZSBvZiB1c2VyLWRlZmluZWQgYXN5bW1ldHJpYyBtYXRjaGVyLlxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiBhLmdldEV4cGVjdGVkVHlwZSAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHQvLyBGb3IgZXhhbXBsZSwgZXhwZWN0LmFueXRoaW5nKCkgbWF0Y2hlcyBlaXRoZXIgbnVsbCBvciB1bmRlZmluZWRcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGV4cGVjdGVkVHlwZSA9IGEuZ2V0RXhwZWN0ZWRUeXBlKCk7XG5cdFx0Ly8gUHJpbWl0aXZlIHR5cGVzIGJvb2xlYW4gYW5kIG51bWJlciBvbWl0IGRpZmZlcmVuY2UgYmVsb3cuXG5cdFx0Ly8gRm9yIGV4YW1wbGUsIG9taXQgZGlmZmVyZW5jZSBmb3IgZXhwZWN0LnN0cmluZ01hdGNoaW5nKHJlZ2V4cClcblx0XHRvbWl0RGlmZmVyZW5jZSA9IGV4cGVjdGVkVHlwZSA9PT0gXCJzdHJpbmdcIjtcblx0fVxuXHRpZiAoZXhwZWN0ZWRUeXBlICE9PSBnZXRUeXBlKGIpKSB7XG5cdFx0Y29uc3QgeyBhQW5ub3RhdGlvbiwgYUNvbG9yLCBhSW5kaWNhdG9yLCBiQW5ub3RhdGlvbiwgYkNvbG9yLCBiSW5kaWNhdG9yIH0gPSBub3JtYWxpemVEaWZmT3B0aW9ucyhvcHRpb25zKTtcblx0XHRjb25zdCBmb3JtYXRPcHRpb25zID0gZ2V0Rm9ybWF0T3B0aW9ucyhGQUxMQkFDS19GT1JNQVRfT1BUSU9OUywgb3B0aW9ucyk7XG5cdFx0bGV0IGFEaXNwbGF5ID0gZm9ybWF0KGEsIGZvcm1hdE9wdGlvbnMpO1xuXHRcdGxldCBiRGlzcGxheSA9IGZvcm1hdChiLCBmb3JtYXRPcHRpb25zKTtcblx0XHQvLyBldmVuIGlmIHByZXR0eUZvcm1hdCBwcmludHMgc3VjY2Vzc2Z1bGx5IGJpZyBvYmplY3RzLFxuXHRcdC8vIGxhcmdlIHN0cmluZyBjYW4gY2hva2UgbGF0ZXIgb24gKGNvbmNhdGVuYXRpb24/IFJQQz8pLFxuXHRcdC8vIHNvIHRydW5jYXRlIGl0IHRvIGEgcmVhc29uYWJsZSBsZW5ndGggaGVyZS5cblx0XHQvLyAoRm9yIGV4YW1wbGUsIHBsYXl3cmlnaHQncyBFbGVtZW50SGFuZGxlIGNhbiBiZWNvbWUgYWJvdXQgMjAwXzAwMF8wMDAgbGVuZ3RoIHN0cmluZylcblx0XHRjb25zdCBNQVhfTEVOR1RIID0gMWU1O1xuXHRcdGZ1bmN0aW9uIHRydW5jYXRlKHMpIHtcblx0XHRcdHJldHVybiBzLmxlbmd0aCA8PSBNQVhfTEVOR1RIID8gcyA6IGAke3Muc2xpY2UoMCwgTUFYX0xFTkdUSCl9Li4uYDtcblx0XHR9XG5cdFx0YURpc3BsYXkgPSBtZW1vcml6ZShcImV4cGVjdGVkXCIsIHRydW5jYXRlKGFEaXNwbGF5KSk7XG5cdFx0YkRpc3BsYXkgPSBtZW1vcml6ZShcImFjdHVhbFwiLCB0cnVuY2F0ZShiRGlzcGxheSkpO1xuXHRcdGNvbnN0IGFEaWZmID0gYCR7YUNvbG9yKGAke2FJbmRpY2F0b3J9ICR7YUFubm90YXRpb259OmApfVxcbiR7YURpc3BsYXl9YDtcblx0XHRjb25zdCBiRGlmZiA9IGAke2JDb2xvcihgJHtiSW5kaWNhdG9yfSAke2JBbm5vdGF0aW9ufTpgKX1cXG4ke2JEaXNwbGF5fWA7XG5cdFx0cmV0dXJuIGAke2FEaWZmfVxcblxcbiR7YkRpZmZ9YDtcblx0fVxuXHRpZiAob21pdERpZmZlcmVuY2UpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdHN3aXRjaCAoYVR5cGUpIHtcblx0XHRjYXNlIFwic3RyaW5nXCI6IHJldHVybiBkaWZmTGluZXNVbmlmaWVkKGEuc3BsaXQoXCJcXG5cIiksIGIuc3BsaXQoXCJcXG5cIiksIG9wdGlvbnMpO1xuXHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0Y2FzZSBcIm51bWJlclwiOiByZXR1cm4gY29tcGFyZVByaW1pdGl2ZShhLCBiLCBvcHRpb25zLCBtZW1vcml6ZSk7XG5cdFx0Y2FzZSBcIm1hcFwiOiByZXR1cm4gY29tcGFyZU9iamVjdHMoc29ydE1hcChhKSwgc29ydE1hcChiKSwgb3B0aW9ucywgbWVtb3JpemUpO1xuXHRcdGNhc2UgXCJzZXRcIjogcmV0dXJuIGNvbXBhcmVPYmplY3RzKHNvcnRTZXQoYSksIHNvcnRTZXQoYiksIG9wdGlvbnMsIG1lbW9yaXplKTtcblx0XHRkZWZhdWx0OiByZXR1cm4gY29tcGFyZU9iamVjdHMoYSwgYiwgb3B0aW9ucywgbWVtb3JpemUpO1xuXHR9XG59XG5mdW5jdGlvbiBjcmVhdGVNZW1vcml6ZShtZW1vcnkpIHtcblx0cmV0dXJuIChwb2ludGVyLCBzdHJpbmdpZmllZFZhbHVlKSA9PiB7XG5cdFx0bWVtb3J5W3BvaW50ZXJdID0gc3RyaW5naWZpZWRWYWx1ZTtcblx0XHRyZXR1cm4gc3RyaW5naWZpZWRWYWx1ZTtcblx0fTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVQcmltaXRpdmUoYSwgYiwgb3B0aW9ucywgbWVtb3JpemUgPSBERUZBVUxUX01FTU9SSVpFKSB7XG5cdGNvbnN0IGFGb3JtYXQgPSBtZW1vcml6ZShcImV4cGVjdGVkXCIsIGZvcm1hdChhLCBGT1JNQVRfT1BUSU9OUykpO1xuXHRjb25zdCBiRm9ybWF0ID0gbWVtb3JpemUoXCJhY3R1YWxcIiwgZm9ybWF0KGIsIEZPUk1BVF9PUFRJT05TKSk7XG5cdHJldHVybiBhRm9ybWF0ID09PSBiRm9ybWF0ID8gXCJcIiA6IGRpZmZMaW5lc1VuaWZpZWQoYUZvcm1hdC5zcGxpdChcIlxcblwiKSwgYkZvcm1hdC5zcGxpdChcIlxcblwiKSwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBzb3J0TWFwKG1hcCkge1xuXHRyZXR1cm4gbmV3IE1hcChBcnJheS5mcm9tKG1hcC5lbnRyaWVzKCkpLnNvcnQoKSk7XG59XG5mdW5jdGlvbiBzb3J0U2V0KHNldCkge1xuXHRyZXR1cm4gbmV3IFNldChBcnJheS5mcm9tKHNldC52YWx1ZXMoKSkuc29ydCgpKTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVPYmplY3RzKGEsIGIsIG9wdGlvbnMsIG1lbW9yaXplID0gREVGQVVMVF9NRU1PUklaRSkge1xuXHRsZXQgZGlmZmVyZW5jZTtcblx0bGV0IGhhc1Rocm93biA9IGZhbHNlO1xuXHR0cnkge1xuXHRcdGNvbnN0IGZvcm1hdE9wdGlvbnMgPSBnZXRGb3JtYXRPcHRpb25zKEZPUk1BVF9PUFRJT05TLCBvcHRpb25zKTtcblx0XHRkaWZmZXJlbmNlID0gZ2V0T2JqZWN0c0RpZmZlcmVuY2UoYSwgYiwgZm9ybWF0T3B0aW9ucywgb3B0aW9ucywgbWVtb3JpemUpO1xuXHR9IGNhdGNoIHtcblx0XHRoYXNUaHJvd24gPSB0cnVlO1xuXHR9XG5cdGNvbnN0IG5vRGlmZk1lc3NhZ2UgPSBnZXRDb21tb25NZXNzYWdlKE5PX0RJRkZfTUVTU0FHRSwgb3B0aW9ucyk7XG5cdC8vIElmIHRoZSBjb21wYXJpc29uIHlpZWxkcyBubyByZXN1bHRzLCBjb21wYXJlIGFnYWluIGJ1dCB0aGlzIHRpbWVcblx0Ly8gd2l0aG91dCBjYWxsaW5nIGB0b0pTT05gLiBJdCdzIGFsc28gcG9zc2libGUgdGhhdCB0b0pTT04gbWlnaHQgdGhyb3cuXG5cdGlmIChkaWZmZXJlbmNlID09PSB1bmRlZmluZWQgfHwgZGlmZmVyZW5jZSA9PT0gbm9EaWZmTWVzc2FnZSkge1xuXHRcdGNvbnN0IGZvcm1hdE9wdGlvbnMgPSBnZXRGb3JtYXRPcHRpb25zKEZBTExCQUNLX0ZPUk1BVF9PUFRJT05TLCBvcHRpb25zKTtcblx0XHRkaWZmZXJlbmNlID0gZ2V0T2JqZWN0c0RpZmZlcmVuY2UoYSwgYiwgZm9ybWF0T3B0aW9ucywgb3B0aW9ucywgbWVtb3JpemUpO1xuXHRcdGlmIChkaWZmZXJlbmNlICE9PSBub0RpZmZNZXNzYWdlICYmICFoYXNUaHJvd24pIHtcblx0XHRcdGRpZmZlcmVuY2UgPSBgJHtnZXRDb21tb25NZXNzYWdlKFNJTUlMQVJfTUVTU0FHRSwgb3B0aW9ucyl9XFxuXFxuJHtkaWZmZXJlbmNlfWA7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBkaWZmZXJlbmNlO1xufVxuZnVuY3Rpb24gZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnMob3B0aW9ucykge1xuXHRyZXR1cm4gZ2V0Rm9ybWF0T3B0aW9ucyhGT1JNQVRfT1BUSU9OUywgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBnZXRGb3JtYXRPcHRpb25zKGZvcm1hdE9wdGlvbnMsIG9wdGlvbnMpIHtcblx0Y29uc3QgeyBjb21wYXJlS2V5cywgcHJpbnRCYXNpY1Byb3RvdHlwZSwgbWF4RGVwdGggfSA9IG5vcm1hbGl6ZURpZmZPcHRpb25zKG9wdGlvbnMpO1xuXHRyZXR1cm4ge1xuXHRcdC4uLmZvcm1hdE9wdGlvbnMsXG5cdFx0Y29tcGFyZUtleXMsXG5cdFx0cHJpbnRCYXNpY1Byb3RvdHlwZSxcblx0XHRtYXhEZXB0aDogbWF4RGVwdGggPz8gZm9ybWF0T3B0aW9ucy5tYXhEZXB0aFxuXHR9O1xufVxuZnVuY3Rpb24gZ2V0T2JqZWN0c0RpZmZlcmVuY2UoYSwgYiwgZm9ybWF0T3B0aW9ucywgb3B0aW9ucywgbWVtb3JpemUgPSBERUZBVUxUX01FTU9SSVpFKSB7XG5cdGNvbnN0IGZvcm1hdE9wdGlvbnNaZXJvSW5kZW50ID0ge1xuXHRcdC4uLmZvcm1hdE9wdGlvbnMsXG5cdFx0aW5kZW50OiAwXG5cdH07XG5cdGNvbnN0IGFDb21wYXJlID0gZm9ybWF0KGEsIGZvcm1hdE9wdGlvbnNaZXJvSW5kZW50KTtcblx0Y29uc3QgYkNvbXBhcmUgPSBmb3JtYXQoYiwgZm9ybWF0T3B0aW9uc1plcm9JbmRlbnQpO1xuXHRpZiAoYUNvbXBhcmUgPT09IGJDb21wYXJlKSB7XG5cdFx0cmV0dXJuIGdldENvbW1vbk1lc3NhZ2UoTk9fRElGRl9NRVNTQUdFLCBvcHRpb25zKTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCBhRGlzcGxheSA9IG1lbW9yaXplKFwiZXhwZWN0ZWRcIiwgZm9ybWF0KGEsIGZvcm1hdE9wdGlvbnMpKTtcblx0XHRjb25zdCBiRGlzcGxheSA9IG1lbW9yaXplKFwiYWN0dWFsXCIsIGZvcm1hdChiLCBmb3JtYXRPcHRpb25zKSk7XG5cdFx0cmV0dXJuIGRpZmZMaW5lc1VuaWZpZWQyKGFEaXNwbGF5LnNwbGl0KFwiXFxuXCIpLCBiRGlzcGxheS5zcGxpdChcIlxcblwiKSwgYUNvbXBhcmUuc3BsaXQoXCJcXG5cIiksIGJDb21wYXJlLnNwbGl0KFwiXFxuXCIpLCBvcHRpb25zKTtcblx0fVxufVxuY29uc3QgTUFYX0RJRkZfU1RSSU5HX0xFTkdUSCA9IDJlNDtcbmZ1bmN0aW9uIGlzQXN5bW1ldHJpY01hdGNoZXIoZGF0YSkge1xuXHRjb25zdCB0eXBlID0gZ2V0VHlwZSQxKGRhdGEpO1xuXHRyZXR1cm4gdHlwZSA9PT0gXCJPYmplY3RcIiAmJiB0eXBlb2YgZGF0YS5hc3ltbWV0cmljTWF0Y2ggPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIGlzUmVwbGFjZWFibGUob2JqMSwgb2JqMikge1xuXHRjb25zdCBvYmoxVHlwZSA9IGdldFR5cGUkMShvYmoxKTtcblx0Y29uc3Qgb2JqMlR5cGUgPSBnZXRUeXBlJDEob2JqMik7XG5cdHJldHVybiBvYmoxVHlwZSA9PT0gb2JqMlR5cGUgJiYgKG9iajFUeXBlID09PSBcIk9iamVjdFwiIHx8IG9iajFUeXBlID09PSBcIkFycmF5XCIpO1xufVxuZnVuY3Rpb24gcHJpbnREaWZmT3JTdHJpbmdpZnkocmVjZWl2ZWQsIGV4cGVjdGVkLCBvcHRpb25zLCBtZW1vcnkpIHtcblx0Y29uc3QgeyBhQW5ub3RhdGlvbiwgYkFubm90YXRpb24gfSA9IG5vcm1hbGl6ZURpZmZPcHRpb25zKG9wdGlvbnMpO1xuXHRpZiAodHlwZW9mIGV4cGVjdGVkID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiByZWNlaXZlZCA9PT0gXCJzdHJpbmdcIiAmJiBleHBlY3RlZC5sZW5ndGggPiAwICYmIHJlY2VpdmVkLmxlbmd0aCA+IDAgJiYgZXhwZWN0ZWQubGVuZ3RoIDw9IE1BWF9ESUZGX1NUUklOR19MRU5HVEggJiYgcmVjZWl2ZWQubGVuZ3RoIDw9IE1BWF9ESUZGX1NUUklOR19MRU5HVEggJiYgZXhwZWN0ZWQgIT09IHJlY2VpdmVkKSB7XG5cdFx0aWYgKGV4cGVjdGVkLmluY2x1ZGVzKFwiXFxuXCIpIHx8IHJlY2VpdmVkLmluY2x1ZGVzKFwiXFxuXCIpKSB7XG5cdFx0XHRyZXR1cm4gZGlmZlN0cmluZ3NVbmlmaWVkKGV4cGVjdGVkLCByZWNlaXZlZCwgb3B0aW9ucyk7XG5cdFx0fVxuXHRcdGNvbnN0IFtkaWZmc10gPSBkaWZmU3RyaW5nc1JhdyhleHBlY3RlZCwgcmVjZWl2ZWQsIHRydWUpO1xuXHRcdGNvbnN0IGhhc0NvbW1vbkRpZmYgPSBkaWZmcy5zb21lKChkaWZmKSA9PiBkaWZmWzBdID09PSBESUZGX0VRVUFMKTtcblx0XHRjb25zdCBwcmludExhYmVsID0gZ2V0TGFiZWxQcmludGVyKGFBbm5vdGF0aW9uLCBiQW5ub3RhdGlvbik7XG5cdFx0Y29uc3QgZXhwZWN0ZWRMaW5lID0gcHJpbnRMYWJlbChhQW5ub3RhdGlvbikgKyBwcmludEV4cGVjdGVkKGdldENvbW1vbkFuZENoYW5nZWRTdWJzdHJpbmdzKGRpZmZzLCBESUZGX0RFTEVURSwgaGFzQ29tbW9uRGlmZikpO1xuXHRcdGNvbnN0IHJlY2VpdmVkTGluZSA9IHByaW50TGFiZWwoYkFubm90YXRpb24pICsgcHJpbnRSZWNlaXZlZChnZXRDb21tb25BbmRDaGFuZ2VkU3Vic3RyaW5ncyhkaWZmcywgRElGRl9JTlNFUlQsIGhhc0NvbW1vbkRpZmYpKTtcblx0XHRyZXR1cm4gYCR7ZXhwZWN0ZWRMaW5lfVxcbiR7cmVjZWl2ZWRMaW5lfWA7XG5cdH1cblx0Ly8gaWYgKGlzTGluZURpZmZhYmxlKGV4cGVjdGVkLCByZWNlaXZlZCkpIHtcblx0Y29uc3QgY2xvbmVkRXhwZWN0ZWQgPSBkZWVwQ2xvbmUoZXhwZWN0ZWQsIHsgZm9yY2VXcml0YWJsZTogdHJ1ZSB9KTtcblx0Y29uc3QgY2xvbmVkUmVjZWl2ZWQgPSBkZWVwQ2xvbmUocmVjZWl2ZWQsIHsgZm9yY2VXcml0YWJsZTogdHJ1ZSB9KTtcblx0Y29uc3QgeyByZXBsYWNlZEV4cGVjdGVkLCByZXBsYWNlZEFjdHVhbCB9ID0gcmVwbGFjZUFzeW1tZXRyaWNNYXRjaGVyKGNsb25lZFJlY2VpdmVkLCBjbG9uZWRFeHBlY3RlZCk7XG5cdGNvbnN0IG1lbW9yaXplID0gbWVtb3J5ID8gY3JlYXRlTWVtb3JpemUobWVtb3J5KSA6IERFRkFVTFRfTUVNT1JJWkU7XG5cdGNvbnN0IGRpZmZlcmVuY2UgPSBkaWZmKHJlcGxhY2VkRXhwZWN0ZWQsIHJlcGxhY2VkQWN0dWFsLCBvcHRpb25zLCBtZW1vcml6ZSk7XG5cdHJldHVybiBkaWZmZXJlbmNlO1xuXHQvLyB9XG5cdC8vIGNvbnN0IHByaW50TGFiZWwgPSBnZXRMYWJlbFByaW50ZXIoYUFubm90YXRpb24sIGJBbm5vdGF0aW9uKVxuXHQvLyBjb25zdCBleHBlY3RlZExpbmUgPSBwcmludExhYmVsKGFBbm5vdGF0aW9uKSArIHByaW50RXhwZWN0ZWQoZXhwZWN0ZWQpXG5cdC8vIGNvbnN0IHJlY2VpdmVkTGluZVxuXHQvLyAgID0gcHJpbnRMYWJlbChiQW5ub3RhdGlvbilcblx0Ly8gICArIChzdHJpbmdpZnkoZXhwZWN0ZWQpID09PSBzdHJpbmdpZnkocmVjZWl2ZWQpXG5cdC8vICAgICA/ICdzZXJpYWxpemVzIHRvIHRoZSBzYW1lIHN0cmluZydcblx0Ly8gICAgIDogcHJpbnRSZWNlaXZlZChyZWNlaXZlZCkpXG5cdC8vIHJldHVybiBgJHtleHBlY3RlZExpbmV9XFxuJHtyZWNlaXZlZExpbmV9YFxufVxuZnVuY3Rpb24gcmVwbGFjZUFzeW1tZXRyaWNNYXRjaGVyKGFjdHVhbCwgZXhwZWN0ZWQsIGFjdHVhbFJlcGxhY2VkID0gbmV3IFdlYWtTZXQoKSwgZXhwZWN0ZWRSZXBsYWNlZCA9IG5ldyBXZWFrU2V0KCkpIHtcblx0Ly8gaGFuZGxlIGFzeW1tZXRyaWMgRXJyb3IuY2F1c2UgZGlmZlxuXHRpZiAoYWN0dWFsIGluc3RhbmNlb2YgRXJyb3IgJiYgZXhwZWN0ZWQgaW5zdGFuY2VvZiBFcnJvciAmJiB0eXBlb2YgYWN0dWFsLmNhdXNlICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBleHBlY3RlZC5jYXVzZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdGRlbGV0ZSBhY3R1YWwuY2F1c2U7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHJlcGxhY2VkQWN0dWFsOiBhY3R1YWwsXG5cdFx0XHRyZXBsYWNlZEV4cGVjdGVkOiBleHBlY3RlZFxuXHRcdH07XG5cdH1cblx0aWYgKCFpc1JlcGxhY2VhYmxlKGFjdHVhbCwgZXhwZWN0ZWQpKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHJlcGxhY2VkQWN0dWFsOiBhY3R1YWwsXG5cdFx0XHRyZXBsYWNlZEV4cGVjdGVkOiBleHBlY3RlZFxuXHRcdH07XG5cdH1cblx0aWYgKGFjdHVhbFJlcGxhY2VkLmhhcyhhY3R1YWwpIHx8IGV4cGVjdGVkUmVwbGFjZWQuaGFzKGV4cGVjdGVkKSkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRyZXBsYWNlZEFjdHVhbDogYWN0dWFsLFxuXHRcdFx0cmVwbGFjZWRFeHBlY3RlZDogZXhwZWN0ZWRcblx0XHR9O1xuXHR9XG5cdGFjdHVhbFJlcGxhY2VkLmFkZChhY3R1YWwpO1xuXHRleHBlY3RlZFJlcGxhY2VkLmFkZChleHBlY3RlZCk7XG5cdGdldE93blByb3BlcnRpZXMoZXhwZWN0ZWQpLmZvckVhY2goKGtleSkgPT4ge1xuXHRcdGNvbnN0IGV4cGVjdGVkVmFsdWUgPSBleHBlY3RlZFtrZXldO1xuXHRcdGNvbnN0IGFjdHVhbFZhbHVlID0gYWN0dWFsW2tleV07XG5cdFx0aWYgKGlzQXN5bW1ldHJpY01hdGNoZXIoZXhwZWN0ZWRWYWx1ZSkpIHtcblx0XHRcdGlmIChleHBlY3RlZFZhbHVlLmFzeW1tZXRyaWNNYXRjaChhY3R1YWxWYWx1ZSkpIHtcblx0XHRcdFx0Ly8gV2hlbiBtYXRjaGVyIG1hdGNoZXMsIHJlcGxhY2UgZXhwZWN0ZWQgd2l0aCBhY3R1YWwgdmFsdWVcblx0XHRcdFx0Ly8gc28gdGhleSBhcHBlYXIgdGhlIHNhbWUgaW4gdGhlIGRpZmZcblx0XHRcdFx0ZXhwZWN0ZWRba2V5XSA9IGFjdHVhbFZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChcInNhbXBsZVwiIGluIGV4cGVjdGVkVmFsdWUgJiYgZXhwZWN0ZWRWYWx1ZS5zYW1wbGUgIT09IHVuZGVmaW5lZCAmJiBpc1JlcGxhY2VhYmxlKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlLnNhbXBsZSkpIHtcblx0XHRcdFx0Ly8gRm9yIGNvbnRhaW5lciBtYXRjaGVycyAoQXJyYXlDb250YWluaW5nLCBPYmplY3RDb250YWluaW5nKSwgdW53cmFwIGFuZCByZWN1cnNpdmVseSBwcm9jZXNzXG5cdFx0XHRcdC8vIE1hdGNoZXIgZG9lc24ndCBtYXRjaDogdW53cmFwIGJ1dCBrZWVwIHN0cnVjdHVyZSB0byBzaG93IG1pc21hdGNoXG5cdFx0XHRcdGNvbnN0IHJlcGxhY2VkID0gcmVwbGFjZUFzeW1tZXRyaWNNYXRjaGVyKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlLnNhbXBsZSwgYWN0dWFsUmVwbGFjZWQsIGV4cGVjdGVkUmVwbGFjZWQpO1xuXHRcdFx0XHRhY3R1YWxba2V5XSA9IHJlcGxhY2VkLnJlcGxhY2VkQWN0dWFsO1xuXHRcdFx0XHRleHBlY3RlZFtrZXldID0gcmVwbGFjZWQucmVwbGFjZWRFeHBlY3RlZDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGlzQXN5bW1ldHJpY01hdGNoZXIoYWN0dWFsVmFsdWUpKSB7XG5cdFx0XHRpZiAoYWN0dWFsVmFsdWUuYXN5bW1ldHJpY01hdGNoKGV4cGVjdGVkVmFsdWUpKSB7XG5cdFx0XHRcdGFjdHVhbFtrZXldID0gZXhwZWN0ZWRWYWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoXCJzYW1wbGVcIiBpbiBhY3R1YWxWYWx1ZSAmJiBhY3R1YWxWYWx1ZS5zYW1wbGUgIT09IHVuZGVmaW5lZCAmJiBpc1JlcGxhY2VhYmxlKGFjdHVhbFZhbHVlLnNhbXBsZSwgZXhwZWN0ZWRWYWx1ZSkpIHtcblx0XHRcdFx0Y29uc3QgcmVwbGFjZWQgPSByZXBsYWNlQXN5bW1ldHJpY01hdGNoZXIoYWN0dWFsVmFsdWUuc2FtcGxlLCBleHBlY3RlZFZhbHVlLCBhY3R1YWxSZXBsYWNlZCwgZXhwZWN0ZWRSZXBsYWNlZCk7XG5cdFx0XHRcdGFjdHVhbFtrZXldID0gcmVwbGFjZWQucmVwbGFjZWRBY3R1YWw7XG5cdFx0XHRcdGV4cGVjdGVkW2tleV0gPSByZXBsYWNlZC5yZXBsYWNlZEV4cGVjdGVkO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNSZXBsYWNlYWJsZShhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSkpIHtcblx0XHRcdGNvbnN0IHJlcGxhY2VkID0gcmVwbGFjZUFzeW1tZXRyaWNNYXRjaGVyKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlLCBhY3R1YWxSZXBsYWNlZCwgZXhwZWN0ZWRSZXBsYWNlZCk7XG5cdFx0XHRhY3R1YWxba2V5XSA9IHJlcGxhY2VkLnJlcGxhY2VkQWN0dWFsO1xuXHRcdFx0ZXhwZWN0ZWRba2V5XSA9IHJlcGxhY2VkLnJlcGxhY2VkRXhwZWN0ZWQ7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHtcblx0XHRyZXBsYWNlZEFjdHVhbDogYWN0dWFsLFxuXHRcdHJlcGxhY2VkRXhwZWN0ZWQ6IGV4cGVjdGVkXG5cdH07XG59XG5mdW5jdGlvbiBnZXRMYWJlbFByaW50ZXIoLi4uc3RyaW5ncykge1xuXHRjb25zdCBtYXhMZW5ndGggPSBzdHJpbmdzLnJlZHVjZSgobWF4LCBzdHJpbmcpID0+IHN0cmluZy5sZW5ndGggPiBtYXggPyBzdHJpbmcubGVuZ3RoIDogbWF4LCAwKTtcblx0cmV0dXJuIChzdHJpbmcpID0+IGAke3N0cmluZ306ICR7XCIgXCIucmVwZWF0KG1heExlbmd0aCAtIHN0cmluZy5sZW5ndGgpfWA7XG59XG5jb25zdCBTUEFDRV9TWU1CT0wgPSBcIsK3XCI7XG5mdW5jdGlvbiByZXBsYWNlVHJhaWxpbmdTcGFjZXModGV4dCkge1xuXHRyZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHMrJC9nbSwgKHNwYWNlcykgPT4gU1BBQ0VfU1lNQk9MLnJlcGVhdChzcGFjZXMubGVuZ3RoKSk7XG59XG5mdW5jdGlvbiBwcmludFJlY2VpdmVkKG9iamVjdCkge1xuXHRyZXR1cm4gYy5yZWQocmVwbGFjZVRyYWlsaW5nU3BhY2VzKHN0cmluZ2lmeShvYmplY3QpKSk7XG59XG5mdW5jdGlvbiBwcmludEV4cGVjdGVkKHZhbHVlKSB7XG5cdHJldHVybiBjLmdyZWVuKHJlcGxhY2VUcmFpbGluZ1NwYWNlcyhzdHJpbmdpZnkodmFsdWUpKSk7XG59XG5mdW5jdGlvbiBnZXRDb21tb25BbmRDaGFuZ2VkU3Vic3RyaW5ncyhkaWZmcywgb3AsIGhhc0NvbW1vbkRpZmYpIHtcblx0cmV0dXJuIGRpZmZzLnJlZHVjZSgocmVkdWNlZCwgZGlmZikgPT4gcmVkdWNlZCArIChkaWZmWzBdID09PSBESUZGX0VRVUFMID8gZGlmZlsxXSA6IGRpZmZbMF0gPT09IG9wID8gaGFzQ29tbW9uRGlmZiA/IGMuaW52ZXJzZShkaWZmWzFdKSA6IGRpZmZbMV0gOiBcIlwiKSwgXCJcIik7XG59XG5cbmV4cG9ydCB7IERJRkZfREVMRVRFLCBESUZGX0VRVUFMLCBESUZGX0lOU0VSVCwgRGlmZiwgZGlmZiwgZGlmZkxpbmVzUmF3LCBkaWZmTGluZXNVbmlmaWVkLCBkaWZmTGluZXNVbmlmaWVkMiwgZGlmZlN0cmluZ3NSYXcsIGRpZmZTdHJpbmdzVW5pZmllZCwgZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnMsIGdldExhYmVsUHJpbnRlciwgcHJpbnREaWZmT3JTdHJpbmdpZnksIHJlcGxhY2VBc3ltbWV0cmljTWF0Y2hlciB9O1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQW9EQSxJQUFNLE9BQU4sTUFBVztDQUNWO0NBQ0E7Q0FDQSxZQUFZLElBQUksTUFBTTtFQUNyQixLQUFLLEtBQUs7RUFDVixLQUFLLEtBQUs7Q0FDWDtBQUNE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