@cartanova/qgrid-cli 2.4.8 → 2.4.9

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 (735) hide show
  1. package/README.ko.md +18 -11
  2. package/README.md +18 -11
  3. package/bundle/.env +0 -0
  4. package/bundle/dist/_virtual/{_@oxc-project_runtime@0.122.0/helpers → _@oxc-project_runtime@0.140.0/helpers/esm}/decorate.js +2 -2
  5. package/bundle/dist/_virtual/{_@oxc-project_runtime@0.122.0/helpers → _@oxc-project_runtime@0.140.0/helpers/esm}/decorateMetadata.js +2 -2
  6. package/bundle/dist/_virtual/_rolldown/runtime.js +2 -3
  7. package/bundle/dist/application/monit/log-buffer.js +3 -2
  8. package/bundle/dist/application/monit/monit.frame.js +5 -6
  9. package/bundle/dist/application/monit/monit.types.js +1 -2
  10. package/bundle/dist/application/qgrid/conv-routing.js +1 -2
  11. package/bundle/dist/application/qgrid/oauth.js +1 -2
  12. package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -2
  13. package/bundle/dist/application/qgrid/qgrid-response-format.js +1 -2
  14. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +76 -47
  15. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +1 -2
  16. package/bundle/dist/application/qgrid/qgrid.frame.js +73 -97
  17. package/bundle/dist/application/qgrid/qgrid.types.js +11 -10
  18. package/bundle/dist/application/qgrid/token-subscriber.js +3 -2
  19. package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -2
  20. package/bundle/dist/application/qgrid/tool-emulation.js +1 -2
  21. package/bundle/dist/application/queries.generated.js +1 -2
  22. package/bundle/dist/application/request-log/request-log.model.js +116 -47
  23. package/bundle/dist/application/request-log/request-log.types.js +1 -2
  24. package/bundle/dist/application/request-log-step/request-log-step.model.js +3 -4
  25. package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -2
  26. package/bundle/dist/application/sonamu.generated.js +14 -15
  27. package/bundle/dist/application/sonamu.generated.sso.js +1 -2
  28. package/bundle/dist/application/token/token.model.js +3 -4
  29. package/bundle/dist/application/token/token.types.js +1 -2
  30. package/bundle/dist/codex-protocol/AbsolutePathBuf.js +0 -1
  31. package/bundle/dist/codex-protocol/AgentPath.js +0 -1
  32. package/bundle/dist/codex-protocol/ApplyPatchApprovalParams.js +0 -1
  33. package/bundle/dist/codex-protocol/ApplyPatchApprovalResponse.js +0 -1
  34. package/bundle/dist/codex-protocol/AuthMode.js +0 -1
  35. package/bundle/dist/codex-protocol/ClientInfo.js +0 -1
  36. package/bundle/dist/codex-protocol/ClientNotification.js +0 -1
  37. package/bundle/dist/codex-protocol/ClientRequest.js +0 -1
  38. package/bundle/dist/codex-protocol/CollaborationMode.js +0 -1
  39. package/bundle/dist/codex-protocol/ContentItem.js +0 -1
  40. package/bundle/dist/codex-protocol/ConversationGitInfo.js +0 -1
  41. package/bundle/dist/codex-protocol/ConversationSummary.js +0 -1
  42. package/bundle/dist/codex-protocol/ExecCommandApprovalParams.js +0 -1
  43. package/bundle/dist/codex-protocol/ExecCommandApprovalResponse.js +0 -1
  44. package/bundle/dist/codex-protocol/ExecPolicyAmendment.js +0 -1
  45. package/bundle/dist/codex-protocol/FileChange.js +0 -1
  46. package/bundle/dist/codex-protocol/ForcedLoginMethod.js +0 -1
  47. package/bundle/dist/codex-protocol/FunctionCallOutputBody.js +0 -1
  48. package/bundle/dist/codex-protocol/FunctionCallOutputContentItem.js +0 -1
  49. package/bundle/dist/codex-protocol/FuzzyFileSearchMatchType.js +0 -1
  50. package/bundle/dist/codex-protocol/FuzzyFileSearchParams.js +0 -1
  51. package/bundle/dist/codex-protocol/FuzzyFileSearchResponse.js +0 -1
  52. package/bundle/dist/codex-protocol/FuzzyFileSearchResult.js +0 -1
  53. package/bundle/dist/codex-protocol/FuzzyFileSearchSessionCompletedNotification.js +0 -1
  54. package/bundle/dist/codex-protocol/FuzzyFileSearchSessionUpdatedNotification.js +0 -1
  55. package/bundle/dist/codex-protocol/GetAuthStatusParams.js +0 -1
  56. package/bundle/dist/codex-protocol/GetAuthStatusResponse.js +0 -1
  57. package/bundle/dist/codex-protocol/GetConversationSummaryParams.js +0 -1
  58. package/bundle/dist/codex-protocol/GetConversationSummaryResponse.js +0 -1
  59. package/bundle/dist/codex-protocol/GitDiffToRemoteParams.js +0 -1
  60. package/bundle/dist/codex-protocol/GitDiffToRemoteResponse.js +0 -1
  61. package/bundle/dist/codex-protocol/GitSha.js +0 -1
  62. package/bundle/dist/codex-protocol/ImageDetail.js +0 -1
  63. package/bundle/dist/codex-protocol/InitializeCapabilities.js +0 -1
  64. package/bundle/dist/codex-protocol/InitializeParams.js +0 -1
  65. package/bundle/dist/codex-protocol/InitializeResponse.js +0 -1
  66. package/bundle/dist/codex-protocol/InputModality.js +0 -1
  67. package/bundle/dist/codex-protocol/InternalSessionSource.js +0 -1
  68. package/bundle/dist/codex-protocol/LocalShellAction.js +0 -1
  69. package/bundle/dist/codex-protocol/LocalShellExecAction.js +0 -1
  70. package/bundle/dist/codex-protocol/LocalShellStatus.js +0 -1
  71. package/bundle/dist/codex-protocol/MessagePhase.js +0 -1
  72. package/bundle/dist/codex-protocol/ModeKind.js +0 -1
  73. package/bundle/dist/codex-protocol/NetworkPolicyAmendment.js +0 -1
  74. package/bundle/dist/codex-protocol/NetworkPolicyRuleAction.js +0 -1
  75. package/bundle/dist/codex-protocol/ParsedCommand.js +0 -1
  76. package/bundle/dist/codex-protocol/Personality.js +0 -1
  77. package/bundle/dist/codex-protocol/PlanType.js +0 -1
  78. package/bundle/dist/codex-protocol/RealtimeConversationVersion.js +0 -1
  79. package/bundle/dist/codex-protocol/RealtimeOutputModality.js +0 -1
  80. package/bundle/dist/codex-protocol/RealtimeVoice.js +0 -1
  81. package/bundle/dist/codex-protocol/RealtimeVoicesList.js +0 -1
  82. package/bundle/dist/codex-protocol/ReasoningEffort.js +0 -1
  83. package/bundle/dist/codex-protocol/ReasoningItemContent.js +0 -1
  84. package/bundle/dist/codex-protocol/ReasoningItemReasoningSummary.js +0 -1
  85. package/bundle/dist/codex-protocol/ReasoningSummary.js +0 -1
  86. package/bundle/dist/codex-protocol/RequestId.js +0 -1
  87. package/bundle/dist/codex-protocol/Resource.js +0 -1
  88. package/bundle/dist/codex-protocol/ResourceContent.js +0 -1
  89. package/bundle/dist/codex-protocol/ResourceTemplate.js +0 -1
  90. package/bundle/dist/codex-protocol/ResponseItem.js +0 -1
  91. package/bundle/dist/codex-protocol/ReviewDecision.js +0 -1
  92. package/bundle/dist/codex-protocol/ServerNotification.js +0 -1
  93. package/bundle/dist/codex-protocol/ServerRequest.js +0 -1
  94. package/bundle/dist/codex-protocol/SessionSource.js +0 -1
  95. package/bundle/dist/codex-protocol/Settings.js +0 -1
  96. package/bundle/dist/codex-protocol/SubAgentSource.js +0 -1
  97. package/bundle/dist/codex-protocol/ThreadId.js +0 -1
  98. package/bundle/dist/codex-protocol/ThreadMemoryMode.js +0 -1
  99. package/bundle/dist/codex-protocol/Tool.js +0 -1
  100. package/bundle/dist/codex-protocol/Verbosity.js +0 -1
  101. package/bundle/dist/codex-protocol/WebSearchAction.js +0 -1
  102. package/bundle/dist/codex-protocol/WebSearchContextSize.js +0 -1
  103. package/bundle/dist/codex-protocol/WebSearchLocation.js +0 -1
  104. package/bundle/dist/codex-protocol/WebSearchMode.js +0 -1
  105. package/bundle/dist/codex-protocol/WebSearchToolConfig.js +0 -1
  106. package/bundle/dist/codex-protocol/index.js +0 -1
  107. package/bundle/dist/codex-protocol/serde_json/JsonValue.js +0 -1
  108. package/bundle/dist/codex-protocol/v2/Account.js +0 -1
  109. package/bundle/dist/codex-protocol/v2/AccountLoginCompletedNotification.js +0 -1
  110. package/bundle/dist/codex-protocol/v2/AccountRateLimitsUpdatedNotification.js +0 -1
  111. package/bundle/dist/codex-protocol/v2/AccountUpdatedNotification.js +0 -1
  112. package/bundle/dist/codex-protocol/v2/ActivePermissionProfile.js +0 -1
  113. package/bundle/dist/codex-protocol/v2/ActivePermissionProfileModification.js +0 -1
  114. package/bundle/dist/codex-protocol/v2/AddCreditsNudgeCreditType.js +0 -1
  115. package/bundle/dist/codex-protocol/v2/AddCreditsNudgeEmailStatus.js +0 -1
  116. package/bundle/dist/codex-protocol/v2/AdditionalFileSystemPermissions.js +0 -1
  117. package/bundle/dist/codex-protocol/v2/AdditionalNetworkPermissions.js +0 -1
  118. package/bundle/dist/codex-protocol/v2/AdditionalPermissionProfile.js +0 -1
  119. package/bundle/dist/codex-protocol/v2/AgentMessageDeltaNotification.js +0 -1
  120. package/bundle/dist/codex-protocol/v2/AnalyticsConfig.js +0 -1
  121. package/bundle/dist/codex-protocol/v2/AppBranding.js +0 -1
  122. package/bundle/dist/codex-protocol/v2/AppInfo.js +0 -1
  123. package/bundle/dist/codex-protocol/v2/AppListUpdatedNotification.js +0 -1
  124. package/bundle/dist/codex-protocol/v2/AppMetadata.js +0 -1
  125. package/bundle/dist/codex-protocol/v2/AppReview.js +0 -1
  126. package/bundle/dist/codex-protocol/v2/AppScreenshot.js +0 -1
  127. package/bundle/dist/codex-protocol/v2/AppSummary.js +0 -1
  128. package/bundle/dist/codex-protocol/v2/AppToolApproval.js +0 -1
  129. package/bundle/dist/codex-protocol/v2/AppToolsConfig.js +0 -1
  130. package/bundle/dist/codex-protocol/v2/ApprovalsReviewer.js +0 -1
  131. package/bundle/dist/codex-protocol/v2/AppsConfig.js +0 -1
  132. package/bundle/dist/codex-protocol/v2/AppsDefaultConfig.js +0 -1
  133. package/bundle/dist/codex-protocol/v2/AppsListParams.js +0 -1
  134. package/bundle/dist/codex-protocol/v2/AppsListResponse.js +0 -1
  135. package/bundle/dist/codex-protocol/v2/AskForApproval.js +0 -1
  136. package/bundle/dist/codex-protocol/v2/AutoReviewDecisionSource.js +0 -1
  137. package/bundle/dist/codex-protocol/v2/ByteRange.js +0 -1
  138. package/bundle/dist/codex-protocol/v2/CancelLoginAccountParams.js +0 -1
  139. package/bundle/dist/codex-protocol/v2/CancelLoginAccountResponse.js +0 -1
  140. package/bundle/dist/codex-protocol/v2/CancelLoginAccountStatus.js +0 -1
  141. package/bundle/dist/codex-protocol/v2/ChatgptAuthTokensRefreshParams.js +0 -1
  142. package/bundle/dist/codex-protocol/v2/ChatgptAuthTokensRefreshReason.js +0 -1
  143. package/bundle/dist/codex-protocol/v2/ChatgptAuthTokensRefreshResponse.js +0 -1
  144. package/bundle/dist/codex-protocol/v2/CodexErrorInfo.js +0 -1
  145. package/bundle/dist/codex-protocol/v2/CollabAgentState.js +0 -1
  146. package/bundle/dist/codex-protocol/v2/CollabAgentStatus.js +0 -1
  147. package/bundle/dist/codex-protocol/v2/CollabAgentTool.js +0 -1
  148. package/bundle/dist/codex-protocol/v2/CollabAgentToolCallStatus.js +0 -1
  149. package/bundle/dist/codex-protocol/v2/CollaborationModeMask.js +0 -1
  150. package/bundle/dist/codex-protocol/v2/CommandAction.js +0 -1
  151. package/bundle/dist/codex-protocol/v2/CommandExecOutputDeltaNotification.js +0 -1
  152. package/bundle/dist/codex-protocol/v2/CommandExecOutputStream.js +0 -1
  153. package/bundle/dist/codex-protocol/v2/CommandExecParams.js +0 -1
  154. package/bundle/dist/codex-protocol/v2/CommandExecResizeParams.js +0 -1
  155. package/bundle/dist/codex-protocol/v2/CommandExecResizeResponse.js +0 -1
  156. package/bundle/dist/codex-protocol/v2/CommandExecResponse.js +0 -1
  157. package/bundle/dist/codex-protocol/v2/CommandExecTerminalSize.js +0 -1
  158. package/bundle/dist/codex-protocol/v2/CommandExecTerminateParams.js +0 -1
  159. package/bundle/dist/codex-protocol/v2/CommandExecTerminateResponse.js +0 -1
  160. package/bundle/dist/codex-protocol/v2/CommandExecWriteParams.js +0 -1
  161. package/bundle/dist/codex-protocol/v2/CommandExecWriteResponse.js +0 -1
  162. package/bundle/dist/codex-protocol/v2/CommandExecutionApprovalDecision.js +0 -1
  163. package/bundle/dist/codex-protocol/v2/CommandExecutionOutputDeltaNotification.js +0 -1
  164. package/bundle/dist/codex-protocol/v2/CommandExecutionRequestApprovalParams.js +0 -1
  165. package/bundle/dist/codex-protocol/v2/CommandExecutionRequestApprovalResponse.js +0 -1
  166. package/bundle/dist/codex-protocol/v2/CommandExecutionSource.js +0 -1
  167. package/bundle/dist/codex-protocol/v2/CommandExecutionStatus.js +0 -1
  168. package/bundle/dist/codex-protocol/v2/CommandMigration.js +0 -1
  169. package/bundle/dist/codex-protocol/v2/Config.js +0 -1
  170. package/bundle/dist/codex-protocol/v2/ConfigBatchWriteParams.js +0 -1
  171. package/bundle/dist/codex-protocol/v2/ConfigEdit.js +0 -1
  172. package/bundle/dist/codex-protocol/v2/ConfigLayer.js +0 -1
  173. package/bundle/dist/codex-protocol/v2/ConfigLayerMetadata.js +0 -1
  174. package/bundle/dist/codex-protocol/v2/ConfigLayerSource.js +0 -1
  175. package/bundle/dist/codex-protocol/v2/ConfigReadParams.js +0 -1
  176. package/bundle/dist/codex-protocol/v2/ConfigReadResponse.js +0 -1
  177. package/bundle/dist/codex-protocol/v2/ConfigRequirements.js +0 -1
  178. package/bundle/dist/codex-protocol/v2/ConfigRequirementsReadResponse.js +0 -1
  179. package/bundle/dist/codex-protocol/v2/ConfigValueWriteParams.js +0 -1
  180. package/bundle/dist/codex-protocol/v2/ConfigWarningNotification.js +0 -1
  181. package/bundle/dist/codex-protocol/v2/ConfigWriteResponse.js +0 -1
  182. package/bundle/dist/codex-protocol/v2/ConfiguredHookHandler.js +0 -1
  183. package/bundle/dist/codex-protocol/v2/ConfiguredHookMatcherGroup.js +0 -1
  184. package/bundle/dist/codex-protocol/v2/ContextCompactedNotification.js +0 -1
  185. package/bundle/dist/codex-protocol/v2/CreditsSnapshot.js +0 -1
  186. package/bundle/dist/codex-protocol/v2/DeprecationNoticeNotification.js +0 -1
  187. package/bundle/dist/codex-protocol/v2/DynamicToolCallOutputContentItem.js +0 -1
  188. package/bundle/dist/codex-protocol/v2/DynamicToolCallParams.js +0 -1
  189. package/bundle/dist/codex-protocol/v2/DynamicToolCallResponse.js +0 -1
  190. package/bundle/dist/codex-protocol/v2/DynamicToolCallStatus.js +0 -1
  191. package/bundle/dist/codex-protocol/v2/DynamicToolSpec.js +0 -1
  192. package/bundle/dist/codex-protocol/v2/ErrorNotification.js +0 -1
  193. package/bundle/dist/codex-protocol/v2/ExecPolicyAmendment.js +0 -1
  194. package/bundle/dist/codex-protocol/v2/ExperimentalFeature.js +0 -1
  195. package/bundle/dist/codex-protocol/v2/ExperimentalFeatureEnablementSetParams.js +0 -1
  196. package/bundle/dist/codex-protocol/v2/ExperimentalFeatureEnablementSetResponse.js +0 -1
  197. package/bundle/dist/codex-protocol/v2/ExperimentalFeatureListParams.js +0 -1
  198. package/bundle/dist/codex-protocol/v2/ExperimentalFeatureListResponse.js +0 -1
  199. package/bundle/dist/codex-protocol/v2/ExperimentalFeatureStage.js +0 -1
  200. package/bundle/dist/codex-protocol/v2/ExternalAgentConfigDetectParams.js +0 -1
  201. package/bundle/dist/codex-protocol/v2/ExternalAgentConfigDetectResponse.js +0 -1
  202. package/bundle/dist/codex-protocol/v2/ExternalAgentConfigImportCompletedNotification.js +0 -1
  203. package/bundle/dist/codex-protocol/v2/ExternalAgentConfigImportParams.js +0 -1
  204. package/bundle/dist/codex-protocol/v2/ExternalAgentConfigImportResponse.js +0 -1
  205. package/bundle/dist/codex-protocol/v2/ExternalAgentConfigMigrationItem.js +0 -1
  206. package/bundle/dist/codex-protocol/v2/ExternalAgentConfigMigrationItemType.js +0 -1
  207. package/bundle/dist/codex-protocol/v2/FeedbackUploadParams.js +0 -1
  208. package/bundle/dist/codex-protocol/v2/FeedbackUploadResponse.js +0 -1
  209. package/bundle/dist/codex-protocol/v2/FileChangeApprovalDecision.js +0 -1
  210. package/bundle/dist/codex-protocol/v2/FileChangeOutputDeltaNotification.js +0 -1
  211. package/bundle/dist/codex-protocol/v2/FileChangePatchUpdatedNotification.js +0 -1
  212. package/bundle/dist/codex-protocol/v2/FileChangeRequestApprovalParams.js +0 -1
  213. package/bundle/dist/codex-protocol/v2/FileChangeRequestApprovalResponse.js +0 -1
  214. package/bundle/dist/codex-protocol/v2/FileSystemAccessMode.js +0 -1
  215. package/bundle/dist/codex-protocol/v2/FileSystemPath.js +0 -1
  216. package/bundle/dist/codex-protocol/v2/FileSystemSandboxEntry.js +0 -1
  217. package/bundle/dist/codex-protocol/v2/FileSystemSpecialPath.js +0 -1
  218. package/bundle/dist/codex-protocol/v2/FileUpdateChange.js +0 -1
  219. package/bundle/dist/codex-protocol/v2/FsChangedNotification.js +0 -1
  220. package/bundle/dist/codex-protocol/v2/FsCopyParams.js +0 -1
  221. package/bundle/dist/codex-protocol/v2/FsCopyResponse.js +0 -1
  222. package/bundle/dist/codex-protocol/v2/FsCreateDirectoryParams.js +0 -1
  223. package/bundle/dist/codex-protocol/v2/FsCreateDirectoryResponse.js +0 -1
  224. package/bundle/dist/codex-protocol/v2/FsGetMetadataParams.js +0 -1
  225. package/bundle/dist/codex-protocol/v2/FsGetMetadataResponse.js +0 -1
  226. package/bundle/dist/codex-protocol/v2/FsReadDirectoryEntry.js +0 -1
  227. package/bundle/dist/codex-protocol/v2/FsReadDirectoryParams.js +0 -1
  228. package/bundle/dist/codex-protocol/v2/FsReadDirectoryResponse.js +0 -1
  229. package/bundle/dist/codex-protocol/v2/FsReadFileParams.js +0 -1
  230. package/bundle/dist/codex-protocol/v2/FsReadFileResponse.js +0 -1
  231. package/bundle/dist/codex-protocol/v2/FsRemoveParams.js +0 -1
  232. package/bundle/dist/codex-protocol/v2/FsRemoveResponse.js +0 -1
  233. package/bundle/dist/codex-protocol/v2/FsUnwatchParams.js +0 -1
  234. package/bundle/dist/codex-protocol/v2/FsUnwatchResponse.js +0 -1
  235. package/bundle/dist/codex-protocol/v2/FsWatchParams.js +0 -1
  236. package/bundle/dist/codex-protocol/v2/FsWatchResponse.js +0 -1
  237. package/bundle/dist/codex-protocol/v2/FsWriteFileParams.js +0 -1
  238. package/bundle/dist/codex-protocol/v2/FsWriteFileResponse.js +0 -1
  239. package/bundle/dist/codex-protocol/v2/GetAccountParams.js +0 -1
  240. package/bundle/dist/codex-protocol/v2/GetAccountRateLimitsResponse.js +0 -1
  241. package/bundle/dist/codex-protocol/v2/GetAccountResponse.js +0 -1
  242. package/bundle/dist/codex-protocol/v2/GitInfo.js +0 -1
  243. package/bundle/dist/codex-protocol/v2/GrantedPermissionProfile.js +0 -1
  244. package/bundle/dist/codex-protocol/v2/GuardianApprovalReview.js +0 -1
  245. package/bundle/dist/codex-protocol/v2/GuardianApprovalReviewAction.js +0 -1
  246. package/bundle/dist/codex-protocol/v2/GuardianApprovalReviewStatus.js +0 -1
  247. package/bundle/dist/codex-protocol/v2/GuardianCommandSource.js +0 -1
  248. package/bundle/dist/codex-protocol/v2/GuardianRiskLevel.js +0 -1
  249. package/bundle/dist/codex-protocol/v2/GuardianUserAuthorization.js +0 -1
  250. package/bundle/dist/codex-protocol/v2/GuardianWarningNotification.js +0 -1
  251. package/bundle/dist/codex-protocol/v2/HookCompletedNotification.js +0 -1
  252. package/bundle/dist/codex-protocol/v2/HookErrorInfo.js +0 -1
  253. package/bundle/dist/codex-protocol/v2/HookEventName.js +0 -1
  254. package/bundle/dist/codex-protocol/v2/HookExecutionMode.js +0 -1
  255. package/bundle/dist/codex-protocol/v2/HookHandlerType.js +0 -1
  256. package/bundle/dist/codex-protocol/v2/HookMetadata.js +0 -1
  257. package/bundle/dist/codex-protocol/v2/HookMigration.js +0 -1
  258. package/bundle/dist/codex-protocol/v2/HookOutputEntry.js +0 -1
  259. package/bundle/dist/codex-protocol/v2/HookOutputEntryKind.js +0 -1
  260. package/bundle/dist/codex-protocol/v2/HookPromptFragment.js +0 -1
  261. package/bundle/dist/codex-protocol/v2/HookRunStatus.js +0 -1
  262. package/bundle/dist/codex-protocol/v2/HookRunSummary.js +0 -1
  263. package/bundle/dist/codex-protocol/v2/HookScope.js +0 -1
  264. package/bundle/dist/codex-protocol/v2/HookSource.js +0 -1
  265. package/bundle/dist/codex-protocol/v2/HookStartedNotification.js +0 -1
  266. package/bundle/dist/codex-protocol/v2/HookTrustStatus.js +0 -1
  267. package/bundle/dist/codex-protocol/v2/HooksListEntry.js +0 -1
  268. package/bundle/dist/codex-protocol/v2/HooksListParams.js +0 -1
  269. package/bundle/dist/codex-protocol/v2/HooksListResponse.js +0 -1
  270. package/bundle/dist/codex-protocol/v2/ItemCompletedNotification.js +0 -1
  271. package/bundle/dist/codex-protocol/v2/ItemGuardianApprovalReviewCompletedNotification.js +0 -1
  272. package/bundle/dist/codex-protocol/v2/ItemGuardianApprovalReviewStartedNotification.js +0 -1
  273. package/bundle/dist/codex-protocol/v2/ItemStartedNotification.js +0 -1
  274. package/bundle/dist/codex-protocol/v2/ListMcpServerStatusParams.js +0 -1
  275. package/bundle/dist/codex-protocol/v2/ListMcpServerStatusResponse.js +0 -1
  276. package/bundle/dist/codex-protocol/v2/LoginAccountParams.js +0 -1
  277. package/bundle/dist/codex-protocol/v2/LoginAccountResponse.js +0 -1
  278. package/bundle/dist/codex-protocol/v2/LogoutAccountResponse.js +0 -1
  279. package/bundle/dist/codex-protocol/v2/ManagedHooksRequirements.js +0 -1
  280. package/bundle/dist/codex-protocol/v2/MarketplaceAddParams.js +0 -1
  281. package/bundle/dist/codex-protocol/v2/MarketplaceAddResponse.js +0 -1
  282. package/bundle/dist/codex-protocol/v2/MarketplaceInterface.js +0 -1
  283. package/bundle/dist/codex-protocol/v2/MarketplaceLoadErrorInfo.js +0 -1
  284. package/bundle/dist/codex-protocol/v2/MarketplaceRemoveParams.js +0 -1
  285. package/bundle/dist/codex-protocol/v2/MarketplaceRemoveResponse.js +0 -1
  286. package/bundle/dist/codex-protocol/v2/MarketplaceUpgradeErrorInfo.js +0 -1
  287. package/bundle/dist/codex-protocol/v2/MarketplaceUpgradeParams.js +0 -1
  288. package/bundle/dist/codex-protocol/v2/MarketplaceUpgradeResponse.js +0 -1
  289. package/bundle/dist/codex-protocol/v2/McpAuthStatus.js +0 -1
  290. package/bundle/dist/codex-protocol/v2/McpElicitationArrayType.js +0 -1
  291. package/bundle/dist/codex-protocol/v2/McpElicitationBooleanSchema.js +0 -1
  292. package/bundle/dist/codex-protocol/v2/McpElicitationBooleanType.js +0 -1
  293. package/bundle/dist/codex-protocol/v2/McpElicitationConstOption.js +0 -1
  294. package/bundle/dist/codex-protocol/v2/McpElicitationEnumSchema.js +0 -1
  295. package/bundle/dist/codex-protocol/v2/McpElicitationLegacyTitledEnumSchema.js +0 -1
  296. package/bundle/dist/codex-protocol/v2/McpElicitationMultiSelectEnumSchema.js +0 -1
  297. package/bundle/dist/codex-protocol/v2/McpElicitationNumberSchema.js +0 -1
  298. package/bundle/dist/codex-protocol/v2/McpElicitationNumberType.js +0 -1
  299. package/bundle/dist/codex-protocol/v2/McpElicitationObjectType.js +0 -1
  300. package/bundle/dist/codex-protocol/v2/McpElicitationPrimitiveSchema.js +0 -1
  301. package/bundle/dist/codex-protocol/v2/McpElicitationSchema.js +0 -1
  302. package/bundle/dist/codex-protocol/v2/McpElicitationSingleSelectEnumSchema.js +0 -1
  303. package/bundle/dist/codex-protocol/v2/McpElicitationStringFormat.js +0 -1
  304. package/bundle/dist/codex-protocol/v2/McpElicitationStringSchema.js +0 -1
  305. package/bundle/dist/codex-protocol/v2/McpElicitationStringType.js +0 -1
  306. package/bundle/dist/codex-protocol/v2/McpElicitationTitledEnumItems.js +0 -1
  307. package/bundle/dist/codex-protocol/v2/McpElicitationTitledMultiSelectEnumSchema.js +0 -1
  308. package/bundle/dist/codex-protocol/v2/McpElicitationTitledSingleSelectEnumSchema.js +0 -1
  309. package/bundle/dist/codex-protocol/v2/McpElicitationUntitledEnumItems.js +0 -1
  310. package/bundle/dist/codex-protocol/v2/McpElicitationUntitledMultiSelectEnumSchema.js +0 -1
  311. package/bundle/dist/codex-protocol/v2/McpElicitationUntitledSingleSelectEnumSchema.js +0 -1
  312. package/bundle/dist/codex-protocol/v2/McpResourceReadParams.js +0 -1
  313. package/bundle/dist/codex-protocol/v2/McpResourceReadResponse.js +0 -1
  314. package/bundle/dist/codex-protocol/v2/McpServerElicitationAction.js +0 -1
  315. package/bundle/dist/codex-protocol/v2/McpServerElicitationRequestParams.js +0 -1
  316. package/bundle/dist/codex-protocol/v2/McpServerElicitationRequestResponse.js +0 -1
  317. package/bundle/dist/codex-protocol/v2/McpServerMigration.js +0 -1
  318. package/bundle/dist/codex-protocol/v2/McpServerOauthLoginCompletedNotification.js +0 -1
  319. package/bundle/dist/codex-protocol/v2/McpServerOauthLoginParams.js +0 -1
  320. package/bundle/dist/codex-protocol/v2/McpServerOauthLoginResponse.js +0 -1
  321. package/bundle/dist/codex-protocol/v2/McpServerRefreshResponse.js +0 -1
  322. package/bundle/dist/codex-protocol/v2/McpServerStartupState.js +0 -1
  323. package/bundle/dist/codex-protocol/v2/McpServerStatus.js +0 -1
  324. package/bundle/dist/codex-protocol/v2/McpServerStatusDetail.js +0 -1
  325. package/bundle/dist/codex-protocol/v2/McpServerStatusUpdatedNotification.js +0 -1
  326. package/bundle/dist/codex-protocol/v2/McpServerToolCallParams.js +0 -1
  327. package/bundle/dist/codex-protocol/v2/McpServerToolCallResponse.js +0 -1
  328. package/bundle/dist/codex-protocol/v2/McpToolCallError.js +0 -1
  329. package/bundle/dist/codex-protocol/v2/McpToolCallProgressNotification.js +0 -1
  330. package/bundle/dist/codex-protocol/v2/McpToolCallResult.js +0 -1
  331. package/bundle/dist/codex-protocol/v2/McpToolCallStatus.js +0 -1
  332. package/bundle/dist/codex-protocol/v2/MemoryCitation.js +0 -1
  333. package/bundle/dist/codex-protocol/v2/MemoryCitationEntry.js +0 -1
  334. package/bundle/dist/codex-protocol/v2/MergeStrategy.js +0 -1
  335. package/bundle/dist/codex-protocol/v2/MigrationDetails.js +0 -1
  336. package/bundle/dist/codex-protocol/v2/Model.js +0 -1
  337. package/bundle/dist/codex-protocol/v2/ModelAvailabilityNux.js +0 -1
  338. package/bundle/dist/codex-protocol/v2/ModelListParams.js +0 -1
  339. package/bundle/dist/codex-protocol/v2/ModelListResponse.js +0 -1
  340. package/bundle/dist/codex-protocol/v2/ModelProviderCapabilitiesReadParams.js +0 -1
  341. package/bundle/dist/codex-protocol/v2/ModelProviderCapabilitiesReadResponse.js +0 -1
  342. package/bundle/dist/codex-protocol/v2/ModelRerouteReason.js +0 -1
  343. package/bundle/dist/codex-protocol/v2/ModelReroutedNotification.js +0 -1
  344. package/bundle/dist/codex-protocol/v2/ModelServiceTier.js +0 -1
  345. package/bundle/dist/codex-protocol/v2/ModelUpgradeInfo.js +0 -1
  346. package/bundle/dist/codex-protocol/v2/ModelVerification.js +0 -1
  347. package/bundle/dist/codex-protocol/v2/ModelVerificationNotification.js +0 -1
  348. package/bundle/dist/codex-protocol/v2/NetworkAccess.js +0 -1
  349. package/bundle/dist/codex-protocol/v2/NetworkApprovalContext.js +0 -1
  350. package/bundle/dist/codex-protocol/v2/NetworkApprovalProtocol.js +0 -1
  351. package/bundle/dist/codex-protocol/v2/NetworkDomainPermission.js +0 -1
  352. package/bundle/dist/codex-protocol/v2/NetworkPolicyAmendment.js +0 -1
  353. package/bundle/dist/codex-protocol/v2/NetworkPolicyRuleAction.js +0 -1
  354. package/bundle/dist/codex-protocol/v2/NetworkRequirements.js +0 -1
  355. package/bundle/dist/codex-protocol/v2/NetworkUnixSocketPermission.js +0 -1
  356. package/bundle/dist/codex-protocol/v2/NonSteerableTurnKind.js +0 -1
  357. package/bundle/dist/codex-protocol/v2/OverriddenMetadata.js +0 -1
  358. package/bundle/dist/codex-protocol/v2/PatchApplyStatus.js +0 -1
  359. package/bundle/dist/codex-protocol/v2/PatchChangeKind.js +0 -1
  360. package/bundle/dist/codex-protocol/v2/PermissionGrantScope.js +0 -1
  361. package/bundle/dist/codex-protocol/v2/PermissionProfile.js +0 -1
  362. package/bundle/dist/codex-protocol/v2/PermissionProfileFileSystemPermissions.js +0 -1
  363. package/bundle/dist/codex-protocol/v2/PermissionProfileModificationParams.js +0 -1
  364. package/bundle/dist/codex-protocol/v2/PermissionProfileNetworkPermissions.js +0 -1
  365. package/bundle/dist/codex-protocol/v2/PermissionProfileSelectionParams.js +0 -1
  366. package/bundle/dist/codex-protocol/v2/PermissionsRequestApprovalParams.js +0 -1
  367. package/bundle/dist/codex-protocol/v2/PermissionsRequestApprovalResponse.js +0 -1
  368. package/bundle/dist/codex-protocol/v2/PlanDeltaNotification.js +0 -1
  369. package/bundle/dist/codex-protocol/v2/PluginAuthPolicy.js +0 -1
  370. package/bundle/dist/codex-protocol/v2/PluginAvailability.js +0 -1
  371. package/bundle/dist/codex-protocol/v2/PluginDetail.js +0 -1
  372. package/bundle/dist/codex-protocol/v2/PluginHookSummary.js +0 -1
  373. package/bundle/dist/codex-protocol/v2/PluginInstallParams.js +0 -1
  374. package/bundle/dist/codex-protocol/v2/PluginInstallPolicy.js +0 -1
  375. package/bundle/dist/codex-protocol/v2/PluginInstallResponse.js +0 -1
  376. package/bundle/dist/codex-protocol/v2/PluginInterface.js +0 -1
  377. package/bundle/dist/codex-protocol/v2/PluginListMarketplaceKind.js +0 -1
  378. package/bundle/dist/codex-protocol/v2/PluginListParams.js +0 -1
  379. package/bundle/dist/codex-protocol/v2/PluginListResponse.js +0 -1
  380. package/bundle/dist/codex-protocol/v2/PluginMarketplaceEntry.js +0 -1
  381. package/bundle/dist/codex-protocol/v2/PluginReadParams.js +0 -1
  382. package/bundle/dist/codex-protocol/v2/PluginReadResponse.js +0 -1
  383. package/bundle/dist/codex-protocol/v2/PluginShareContext.js +0 -1
  384. package/bundle/dist/codex-protocol/v2/PluginShareDeleteParams.js +0 -1
  385. package/bundle/dist/codex-protocol/v2/PluginShareDeleteResponse.js +0 -1
  386. package/bundle/dist/codex-protocol/v2/PluginShareDiscoverability.js +0 -1
  387. package/bundle/dist/codex-protocol/v2/PluginShareListItem.js +0 -1
  388. package/bundle/dist/codex-protocol/v2/PluginShareListParams.js +0 -1
  389. package/bundle/dist/codex-protocol/v2/PluginShareListResponse.js +0 -1
  390. package/bundle/dist/codex-protocol/v2/PluginSharePrincipal.js +0 -1
  391. package/bundle/dist/codex-protocol/v2/PluginSharePrincipalType.js +0 -1
  392. package/bundle/dist/codex-protocol/v2/PluginShareSaveParams.js +0 -1
  393. package/bundle/dist/codex-protocol/v2/PluginShareSaveResponse.js +0 -1
  394. package/bundle/dist/codex-protocol/v2/PluginShareTarget.js +0 -1
  395. package/bundle/dist/codex-protocol/v2/PluginShareUpdateDiscoverability.js +0 -1
  396. package/bundle/dist/codex-protocol/v2/PluginShareUpdateTargetsParams.js +0 -1
  397. package/bundle/dist/codex-protocol/v2/PluginShareUpdateTargetsResponse.js +0 -1
  398. package/bundle/dist/codex-protocol/v2/PluginSkillReadParams.js +0 -1
  399. package/bundle/dist/codex-protocol/v2/PluginSkillReadResponse.js +0 -1
  400. package/bundle/dist/codex-protocol/v2/PluginSource.js +0 -1
  401. package/bundle/dist/codex-protocol/v2/PluginSummary.js +0 -1
  402. package/bundle/dist/codex-protocol/v2/PluginUninstallParams.js +0 -1
  403. package/bundle/dist/codex-protocol/v2/PluginUninstallResponse.js +0 -1
  404. package/bundle/dist/codex-protocol/v2/PluginsMigration.js +0 -1
  405. package/bundle/dist/codex-protocol/v2/ProcessExitedNotification.js +0 -1
  406. package/bundle/dist/codex-protocol/v2/ProcessOutputDeltaNotification.js +0 -1
  407. package/bundle/dist/codex-protocol/v2/ProcessOutputStream.js +0 -1
  408. package/bundle/dist/codex-protocol/v2/ProcessTerminalSize.js +0 -1
  409. package/bundle/dist/codex-protocol/v2/ProfileV2.js +0 -1
  410. package/bundle/dist/codex-protocol/v2/RateLimitReachedType.js +0 -1
  411. package/bundle/dist/codex-protocol/v2/RateLimitSnapshot.js +0 -1
  412. package/bundle/dist/codex-protocol/v2/RateLimitWindow.js +0 -1
  413. package/bundle/dist/codex-protocol/v2/RawResponseItemCompletedNotification.js +0 -1
  414. package/bundle/dist/codex-protocol/v2/ReasoningEffortOption.js +0 -1
  415. package/bundle/dist/codex-protocol/v2/ReasoningSummaryPartAddedNotification.js +0 -1
  416. package/bundle/dist/codex-protocol/v2/ReasoningSummaryTextDeltaNotification.js +0 -1
  417. package/bundle/dist/codex-protocol/v2/ReasoningTextDeltaNotification.js +0 -1
  418. package/bundle/dist/codex-protocol/v2/RemoteControlConnectionStatus.js +0 -1
  419. package/bundle/dist/codex-protocol/v2/RemoteControlStatusChangedNotification.js +0 -1
  420. package/bundle/dist/codex-protocol/v2/RequestPermissionProfile.js +0 -1
  421. package/bundle/dist/codex-protocol/v2/ResidencyRequirement.js +0 -1
  422. package/bundle/dist/codex-protocol/v2/ReviewDelivery.js +0 -1
  423. package/bundle/dist/codex-protocol/v2/ReviewStartParams.js +0 -1
  424. package/bundle/dist/codex-protocol/v2/ReviewStartResponse.js +0 -1
  425. package/bundle/dist/codex-protocol/v2/ReviewTarget.js +0 -1
  426. package/bundle/dist/codex-protocol/v2/SandboxMode.js +0 -1
  427. package/bundle/dist/codex-protocol/v2/SandboxPolicy.js +0 -1
  428. package/bundle/dist/codex-protocol/v2/SandboxWorkspaceWrite.js +0 -1
  429. package/bundle/dist/codex-protocol/v2/SendAddCreditsNudgeEmailParams.js +0 -1
  430. package/bundle/dist/codex-protocol/v2/SendAddCreditsNudgeEmailResponse.js +0 -1
  431. package/bundle/dist/codex-protocol/v2/ServerRequestResolvedNotification.js +0 -1
  432. package/bundle/dist/codex-protocol/v2/SessionMigration.js +0 -1
  433. package/bundle/dist/codex-protocol/v2/SessionSource.js +0 -1
  434. package/bundle/dist/codex-protocol/v2/SkillDependencies.js +0 -1
  435. package/bundle/dist/codex-protocol/v2/SkillErrorInfo.js +0 -1
  436. package/bundle/dist/codex-protocol/v2/SkillInterface.js +0 -1
  437. package/bundle/dist/codex-protocol/v2/SkillMetadata.js +0 -1
  438. package/bundle/dist/codex-protocol/v2/SkillScope.js +0 -1
  439. package/bundle/dist/codex-protocol/v2/SkillSummary.js +0 -1
  440. package/bundle/dist/codex-protocol/v2/SkillToolDependency.js +0 -1
  441. package/bundle/dist/codex-protocol/v2/SkillsChangedNotification.js +0 -1
  442. package/bundle/dist/codex-protocol/v2/SkillsConfigWriteParams.js +0 -1
  443. package/bundle/dist/codex-protocol/v2/SkillsConfigWriteResponse.js +0 -1
  444. package/bundle/dist/codex-protocol/v2/SkillsListEntry.js +0 -1
  445. package/bundle/dist/codex-protocol/v2/SkillsListParams.js +0 -1
  446. package/bundle/dist/codex-protocol/v2/SkillsListResponse.js +0 -1
  447. package/bundle/dist/codex-protocol/v2/SortDirection.js +0 -1
  448. package/bundle/dist/codex-protocol/v2/SubagentMigration.js +0 -1
  449. package/bundle/dist/codex-protocol/v2/TerminalInteractionNotification.js +0 -1
  450. package/bundle/dist/codex-protocol/v2/TextElement.js +0 -1
  451. package/bundle/dist/codex-protocol/v2/TextPosition.js +0 -1
  452. package/bundle/dist/codex-protocol/v2/TextRange.js +0 -1
  453. package/bundle/dist/codex-protocol/v2/Thread.js +0 -1
  454. package/bundle/dist/codex-protocol/v2/ThreadActiveFlag.js +0 -1
  455. package/bundle/dist/codex-protocol/v2/ThreadApproveGuardianDeniedActionParams.js +0 -1
  456. package/bundle/dist/codex-protocol/v2/ThreadApproveGuardianDeniedActionResponse.js +0 -1
  457. package/bundle/dist/codex-protocol/v2/ThreadArchiveParams.js +0 -1
  458. package/bundle/dist/codex-protocol/v2/ThreadArchiveResponse.js +0 -1
  459. package/bundle/dist/codex-protocol/v2/ThreadArchivedNotification.js +0 -1
  460. package/bundle/dist/codex-protocol/v2/ThreadClosedNotification.js +0 -1
  461. package/bundle/dist/codex-protocol/v2/ThreadCompactStartParams.js +0 -1
  462. package/bundle/dist/codex-protocol/v2/ThreadCompactStartResponse.js +0 -1
  463. package/bundle/dist/codex-protocol/v2/ThreadForkParams.js +0 -1
  464. package/bundle/dist/codex-protocol/v2/ThreadForkResponse.js +0 -1
  465. package/bundle/dist/codex-protocol/v2/ThreadGoal.js +0 -1
  466. package/bundle/dist/codex-protocol/v2/ThreadGoalClearedNotification.js +0 -1
  467. package/bundle/dist/codex-protocol/v2/ThreadGoalStatus.js +0 -1
  468. package/bundle/dist/codex-protocol/v2/ThreadGoalUpdatedNotification.js +0 -1
  469. package/bundle/dist/codex-protocol/v2/ThreadInjectItemsParams.js +0 -1
  470. package/bundle/dist/codex-protocol/v2/ThreadInjectItemsResponse.js +0 -1
  471. package/bundle/dist/codex-protocol/v2/ThreadItem.js +0 -1
  472. package/bundle/dist/codex-protocol/v2/ThreadListParams.js +0 -1
  473. package/bundle/dist/codex-protocol/v2/ThreadListResponse.js +0 -1
  474. package/bundle/dist/codex-protocol/v2/ThreadLoadedListParams.js +0 -1
  475. package/bundle/dist/codex-protocol/v2/ThreadLoadedListResponse.js +0 -1
  476. package/bundle/dist/codex-protocol/v2/ThreadMetadataGitInfoUpdateParams.js +0 -1
  477. package/bundle/dist/codex-protocol/v2/ThreadMetadataUpdateParams.js +0 -1
  478. package/bundle/dist/codex-protocol/v2/ThreadMetadataUpdateResponse.js +0 -1
  479. package/bundle/dist/codex-protocol/v2/ThreadNameUpdatedNotification.js +0 -1
  480. package/bundle/dist/codex-protocol/v2/ThreadReadParams.js +0 -1
  481. package/bundle/dist/codex-protocol/v2/ThreadReadResponse.js +0 -1
  482. package/bundle/dist/codex-protocol/v2/ThreadRealtimeAudioChunk.js +0 -1
  483. package/bundle/dist/codex-protocol/v2/ThreadRealtimeClosedNotification.js +0 -1
  484. package/bundle/dist/codex-protocol/v2/ThreadRealtimeErrorNotification.js +0 -1
  485. package/bundle/dist/codex-protocol/v2/ThreadRealtimeItemAddedNotification.js +0 -1
  486. package/bundle/dist/codex-protocol/v2/ThreadRealtimeOutputAudioDeltaNotification.js +0 -1
  487. package/bundle/dist/codex-protocol/v2/ThreadRealtimeSdpNotification.js +0 -1
  488. package/bundle/dist/codex-protocol/v2/ThreadRealtimeStartTransport.js +0 -1
  489. package/bundle/dist/codex-protocol/v2/ThreadRealtimeStartedNotification.js +0 -1
  490. package/bundle/dist/codex-protocol/v2/ThreadRealtimeTranscriptDeltaNotification.js +0 -1
  491. package/bundle/dist/codex-protocol/v2/ThreadRealtimeTranscriptDoneNotification.js +0 -1
  492. package/bundle/dist/codex-protocol/v2/ThreadResumeParams.js +0 -1
  493. package/bundle/dist/codex-protocol/v2/ThreadResumeResponse.js +0 -1
  494. package/bundle/dist/codex-protocol/v2/ThreadRollbackParams.js +0 -1
  495. package/bundle/dist/codex-protocol/v2/ThreadRollbackResponse.js +0 -1
  496. package/bundle/dist/codex-protocol/v2/ThreadSetNameParams.js +0 -1
  497. package/bundle/dist/codex-protocol/v2/ThreadSetNameResponse.js +0 -1
  498. package/bundle/dist/codex-protocol/v2/ThreadShellCommandParams.js +0 -1
  499. package/bundle/dist/codex-protocol/v2/ThreadShellCommandResponse.js +0 -1
  500. package/bundle/dist/codex-protocol/v2/ThreadSortKey.js +0 -1
  501. package/bundle/dist/codex-protocol/v2/ThreadSource.js +0 -1
  502. package/bundle/dist/codex-protocol/v2/ThreadSourceKind.js +0 -1
  503. package/bundle/dist/codex-protocol/v2/ThreadStartParams.js +0 -1
  504. package/bundle/dist/codex-protocol/v2/ThreadStartResponse.js +0 -1
  505. package/bundle/dist/codex-protocol/v2/ThreadStartSource.js +0 -1
  506. package/bundle/dist/codex-protocol/v2/ThreadStartedNotification.js +0 -1
  507. package/bundle/dist/codex-protocol/v2/ThreadStatus.js +0 -1
  508. package/bundle/dist/codex-protocol/v2/ThreadStatusChangedNotification.js +0 -1
  509. package/bundle/dist/codex-protocol/v2/ThreadTokenUsage.js +0 -1
  510. package/bundle/dist/codex-protocol/v2/ThreadTokenUsageUpdatedNotification.js +0 -1
  511. package/bundle/dist/codex-protocol/v2/ThreadUnarchiveParams.js +0 -1
  512. package/bundle/dist/codex-protocol/v2/ThreadUnarchiveResponse.js +0 -1
  513. package/bundle/dist/codex-protocol/v2/ThreadUnarchivedNotification.js +0 -1
  514. package/bundle/dist/codex-protocol/v2/ThreadUnsubscribeParams.js +0 -1
  515. package/bundle/dist/codex-protocol/v2/ThreadUnsubscribeResponse.js +0 -1
  516. package/bundle/dist/codex-protocol/v2/ThreadUnsubscribeStatus.js +0 -1
  517. package/bundle/dist/codex-protocol/v2/TokenUsageBreakdown.js +0 -1
  518. package/bundle/dist/codex-protocol/v2/ToolRequestUserInputAnswer.js +0 -1
  519. package/bundle/dist/codex-protocol/v2/ToolRequestUserInputOption.js +0 -1
  520. package/bundle/dist/codex-protocol/v2/ToolRequestUserInputParams.js +0 -1
  521. package/bundle/dist/codex-protocol/v2/ToolRequestUserInputQuestion.js +0 -1
  522. package/bundle/dist/codex-protocol/v2/ToolRequestUserInputResponse.js +0 -1
  523. package/bundle/dist/codex-protocol/v2/ToolsV2.js +0 -1
  524. package/bundle/dist/codex-protocol/v2/Turn.js +0 -1
  525. package/bundle/dist/codex-protocol/v2/TurnCompletedNotification.js +0 -1
  526. package/bundle/dist/codex-protocol/v2/TurnDiffUpdatedNotification.js +0 -1
  527. package/bundle/dist/codex-protocol/v2/TurnEnvironmentParams.js +0 -1
  528. package/bundle/dist/codex-protocol/v2/TurnError.js +0 -1
  529. package/bundle/dist/codex-protocol/v2/TurnInterruptParams.js +0 -1
  530. package/bundle/dist/codex-protocol/v2/TurnInterruptResponse.js +0 -1
  531. package/bundle/dist/codex-protocol/v2/TurnItemsView.js +0 -1
  532. package/bundle/dist/codex-protocol/v2/TurnPlanStep.js +0 -1
  533. package/bundle/dist/codex-protocol/v2/TurnPlanStepStatus.js +0 -1
  534. package/bundle/dist/codex-protocol/v2/TurnPlanUpdatedNotification.js +0 -1
  535. package/bundle/dist/codex-protocol/v2/TurnStartParams.js +0 -1
  536. package/bundle/dist/codex-protocol/v2/TurnStartResponse.js +0 -1
  537. package/bundle/dist/codex-protocol/v2/TurnStartedNotification.js +0 -1
  538. package/bundle/dist/codex-protocol/v2/TurnStatus.js +0 -1
  539. package/bundle/dist/codex-protocol/v2/TurnSteerParams.js +0 -1
  540. package/bundle/dist/codex-protocol/v2/TurnSteerResponse.js +0 -1
  541. package/bundle/dist/codex-protocol/v2/UserInput.js +0 -1
  542. package/bundle/dist/codex-protocol/v2/WarningNotification.js +0 -1
  543. package/bundle/dist/codex-protocol/v2/WebSearchAction.js +0 -1
  544. package/bundle/dist/codex-protocol/v2/WindowsSandboxReadiness.js +0 -1
  545. package/bundle/dist/codex-protocol/v2/WindowsSandboxReadinessResponse.js +0 -1
  546. package/bundle/dist/codex-protocol/v2/WindowsSandboxSetupCompletedNotification.js +0 -1
  547. package/bundle/dist/codex-protocol/v2/WindowsSandboxSetupMode.js +0 -1
  548. package/bundle/dist/codex-protocol/v2/WindowsSandboxSetupStartParams.js +0 -1
  549. package/bundle/dist/codex-protocol/v2/WindowsSandboxSetupStartResponse.js +0 -1
  550. package/bundle/dist/codex-protocol/v2/WindowsWorldWritableWarningNotification.js +0 -1
  551. package/bundle/dist/codex-protocol/v2/WriteStatus.js +0 -1
  552. package/bundle/dist/i18n/en.js +1 -2
  553. package/bundle/dist/i18n/ko.js +1 -2
  554. package/bundle/dist/i18n/sd.generated.js +54 -21
  555. package/bundle/dist/index.js +1 -2
  556. package/bundle/dist/migrations/20260410171405_create__request_logs.js +1 -2
  557. package/bundle/dist/migrations/20260410171406_create__tokens.js +1 -2
  558. package/bundle/dist/migrations/20260411120624_alter_tokens_alter2.js +1 -2
  559. package/bundle/dist/migrations/20260415113716_alter_tokens_add_ord.js +1 -2
  560. package/bundle/dist/migrations/20260415134649_alter_request_logs_alter1.js +1 -2
  561. package/bundle/dist/migrations/20260421223627_alter_request_logs_add1_alter1.js +1 -2
  562. package/bundle/dist/migrations/20260423180818_alter_request_logs_add1_alter1.js +1 -2
  563. package/bundle/dist/migrations/20260423182017_alter_request_logs_add2_drop1_alter1.js +1 -2
  564. package/bundle/dist/migrations/20260423183613_alter_request_logs_add1_alter1.js +1 -2
  565. package/bundle/dist/migrations/20260518145411_alter_tokens_add2_drop4_alter1.js +1 -2
  566. package/bundle/dist/migrations/20260520112853_alter_request_logs_add3_alter1.js +1 -2
  567. package/bundle/dist/migrations/20260520124755_alter_request_logs_drop1_alter1.js +1 -2
  568. package/bundle/dist/migrations/20260520130420_create__request_log_steps.js +1 -2
  569. package/bundle/dist/migrations/20260520134908_alter_request_logs_add2_alter8.js +1 -2
  570. package/bundle/dist/migrations/20260520134909_alter_request_log_steps_add1_alter3.js +1 -2
  571. package/bundle/dist/migrations/20260520141449_alter_request_logs_add1_alter1.js +1 -2
  572. package/bundle/dist/migrations/20260521134025_alter_request_log_steps_alter1.js +1 -2
  573. package/bundle/dist/migrations/20260521134026_alter_request_log_steps_foreigns.js +1 -2
  574. package/bundle/dist/migrations/20260522181721_alter_request_log_steps_add2_alter1.js +1 -2
  575. package/bundle/dist/migrations/20260630223950_alter_tokens_add1_alter1.js +1 -2
  576. package/bundle/dist/migrations/20260701105327_alter_request_logs_add1_alter1.js +1 -2
  577. package/bundle/dist/migrations/20260701105328_alter_request_log_steps_add1_alter1.js +1 -2
  578. package/bundle/dist/migrations/20260705140614_alter_request_logs_add1_alter1.js +1 -2
  579. package/bundle/dist/migrations/20260706120000_alter_request_logs_add_image_cost.js +1 -2
  580. package/bundle/dist/migrations/20260710090000_alter_tokens_add_weight.js +1 -2
  581. package/bundle/dist/migrations/20260718180824_alter_request_logs_add5_alter1.js +1 -2
  582. package/bundle/dist/migrations/20260718180825_alter_request_log_steps_add7_alter1.js +1 -2
  583. package/bundle/dist/migrations/20260722174410_alter_request_logs_alter3.js +17 -0
  584. package/bundle/dist/migrations/20260722174411_alter_request_log_steps_alter3.js +17 -0
  585. package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +255 -4
  586. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +1507 -0
  587. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +887 -0
  588. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +2756 -0
  589. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +8 -0
  590. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +8 -0
  591. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +922 -0
  592. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +386 -0
  593. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +121 -0
  594. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +51 -0
  595. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +1317 -0
  596. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +561 -0
  597. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +40 -0
  598. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +272 -0
  599. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +27 -0
  600. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +77 -0
  601. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +381 -0
  602. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +51 -0
  603. package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +103 -3
  604. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +1 -1
  605. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +1 -1
  606. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +1 -1
  607. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +1 -1
  608. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +1 -1
  609. package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +2 -3
  610. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +4 -4
  611. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +2 -2
  612. package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +18 -7
  613. package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +18 -3
  614. 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_2519c2e8d8013fcbc7b443879bc9da6d/node_modules/vite/dist/node/module-runner.js +1265 -0
  615. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +6 -3
  616. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +8 -8
  617. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +5 -5
  618. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +3 -3
  619. 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_ms_f9cfcfeddd63e656d4010c98521af26c/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +46 -0
  620. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +66 -6
  621. 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_ms_f9cfcfeddd63e656d4010c98521af26c/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +3044 -0
  622. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +19 -4
  623. 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_ms_f9cfcfeddd63e656d4010c98521af26c/node_modules/vitest/dist/index.js +28 -0
  624. package/bundle/dist/server-bootstrap.js +1 -2
  625. package/bundle/dist/sonamu.config.js +11 -27
  626. package/bundle/dist/startup-migrations.js +1 -2
  627. package/bundle/dist/testing/fixture.js +1 -2
  628. package/bundle/dist/testing/global.js +6 -7
  629. package/bundle/dist/testing/setup-mocks.js +3 -4
  630. package/bundle/dist/testing/test-database-name.js +5 -8
  631. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +8 -8
  632. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +1 -2
  633. package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +1 -2
  634. package/bundle/dist/utils/providers/anthropic/claude-session.js +5 -7
  635. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +1 -2
  636. package/bundle/dist/utils/providers/common/credentials.js +1 -2
  637. package/bundle/dist/utils/providers/common/model-cost.js +3 -3
  638. package/bundle/dist/utils/providers/common/provider-dispatcher.js +0 -1
  639. package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -2
  640. package/bundle/dist/utils/providers/common/strictifier.js +2 -2
  641. package/bundle/dist/utils/providers/common/token-picker.js +1 -2
  642. package/bundle/dist/utils/providers/common/ttft.js +1 -2
  643. package/bundle/dist/utils/providers/openai/codex-rpc.js +4 -2
  644. package/bundle/dist/utils/providers/openai/codex-worker.js +2 -2
  645. package/bundle/dist/utils/providers/openai/openai-constants.js +1 -2
  646. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +103 -40
  647. package/bundle/dist/utils/providers/openai/openai-quota.js +1 -2
  648. package/bundle/dist/utils/providers/openai/openai-refresh.js +1 -2
  649. package/bundle/dist/utils/subset-loaders.js +1 -2
  650. package/bundle/src/application/monit/monit.frame.test.ts +2 -2
  651. package/bundle/src/application/monit/monit.frame.ts +2 -2
  652. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +242 -8
  653. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +97 -57
  654. package/bundle/src/application/qgrid/qgrid.frame.test.ts +400 -96
  655. package/bundle/src/application/qgrid/qgrid.frame.ts +85 -123
  656. package/bundle/src/application/qgrid/qgrid.types.ts +35 -27
  657. package/bundle/src/application/request-log/request-log.entity.json +2 -2
  658. package/bundle/src/application/request-log/request-log.model.test.ts +325 -21
  659. package/bundle/src/application/request-log/request-log.model.ts +233 -125
  660. package/bundle/src/application/request-log-step/request-log-step.entity.json +2 -2
  661. package/bundle/src/application/sonamu.generated.http +2 -2
  662. package/bundle/src/application/sonamu.generated.ts +13 -13
  663. package/bundle/src/i18n/sd.generated.ts +83 -14
  664. package/bundle/src/migrations/20260722174410_alter_request_logs_alter3.ts +19 -0
  665. package/bundle/src/migrations/20260722174411_alter_request_log_steps_alter3.ts +19 -0
  666. package/bundle/src/sonamu.config.ts +5 -23
  667. package/bundle/src/testing/global.ts +5 -5
  668. package/bundle/src/testing/test-database-name.test.ts +5 -5
  669. package/bundle/src/testing/test-database-name.ts +9 -8
  670. package/bundle/src/utils/providers/anthropic/anthropic-constants.test.ts +10 -6
  671. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +9 -5
  672. package/bundle/src/utils/providers/anthropic/claude-session.test.ts +18 -3
  673. package/bundle/src/utils/providers/anthropic/claude-session.ts +4 -4
  674. package/bundle/src/utils/providers/common/model-cost.test.ts +1 -0
  675. package/bundle/src/utils/providers/common/model-cost.ts +1 -0
  676. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +440 -0
  677. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +143 -45
  678. package/bundle/web-dist/client/assets/{index-CmuPjbCl.js → index-ioEghlNo.js} +3 -3
  679. package/bundle/web-dist/client/assets/logs-TGA3XE4C.js +1 -0
  680. package/bundle/web-dist/client/assets/{monit-B5Edhvy-.js → monit-DLynJGca.js} +1 -1
  681. package/bundle/web-dist/client/assets/{routes-UPWScORY.js → routes-DugjmKS_.js} +1 -1
  682. package/bundle/web-dist/client/assets/{sd.generated-DYuKzBY6.js → sd.generated-DbBC73_z.js} +1 -1
  683. package/bundle/web-dist/client/assets/{services.generated-D_SkWOo-.js → services.generated-BWyAypSh.js} +1 -1
  684. package/bundle/web-dist/client/assets/{show-pRp-eZIK.js → show-DSswR7Cy.js} +2 -2
  685. package/bundle/web-dist/client/assets/{tokens-DJlttxCM.js → tokens-C5djVO__.js} +1 -1
  686. package/bundle/web-dist/client/assets/{use-update-token-mutation-CpFGLWUl.js → use-update-token-mutation-DeDBiZiM.js} +1 -1
  687. package/bundle/web-dist/client/index.html +2 -2
  688. package/bundle/web-dist/server/assets/{lazyRouteComponent-Cu6IkL8A.js → lazyRouteComponent-BCJr868T.js} +1 -1
  689. package/bundle/web-dist/server/assets/{logs-Dx2knN2T.js → logs-33YNafdW.js} +32 -11
  690. package/bundle/web-dist/server/assets/{monit-DU6PLatf.js → monit--9mVsjNU.js} +2 -2
  691. package/bundle/web-dist/server/assets/{routes-CTco1oJZ.js → routes-BK3Xh1UB.js} +3 -3
  692. package/bundle/web-dist/server/assets/{sd.generated-qzuRe35X.js → sd.generated-C3gcvRcU.js} +1 -0
  693. package/bundle/web-dist/server/assets/{services.generated-C8q1M41a.js → services.generated-B2_Auwvk.js} +1 -1
  694. package/bundle/web-dist/server/assets/{show-B3q8_GDh.js → show-Dxxxe608.js} +15 -9
  695. package/bundle/web-dist/server/assets/{tokens-Bvjn15h9.js → tokens-BWPVvdfi.js} +3 -3
  696. package/bundle/web-dist/server/assets/{use-update-token-mutation-BlZo6swF.js → use-update-token-mutation-CNBgTysy.js} +1 -1
  697. package/bundle/web-dist/server/entry-server.generated.js +23 -23
  698. package/dist/cli.d.ts +1 -0
  699. package/dist/cli.js +18 -12
  700. package/package.json +6 -6
  701. package/skills/qgrid/SKILL.md +4 -0
  702. package/skills/qgrid/references/ai-sdk-provider-contract.md +28 -2
  703. package/skills/qgrid/references/anthropic-claude-code-runtime.md +5 -4
  704. package/skills/qgrid/references/cli-env-and-server-boot.md +20 -8
  705. package/skills/qgrid/references/decision-rationale.md +4 -0
  706. package/skills/qgrid/references/docs-workflow.md +10 -0
  707. package/skills/qgrid/references/openai-codex-runtime.md +11 -3
  708. package/skills/qgrid/references/provider-runtime-differences.md +3 -3
  709. package/skills/qgrid/references/request-log-run-lifecycle.md +46 -28
  710. package/skills/qgrid/references/sonamu-api-web-flow.md +4 -0
  711. package/skills/qgrid/references/token-auth-quota-lifecycle.md +6 -0
  712. package/skills/qgrid/references/tool-calling-and-multiturn.md +8 -7
  713. package/skills/qgrid/references/verification-and-debugging.md +1 -1
  714. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.2/node_modules/@vitest/expect/dist/index.js +0 -1484
  715. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js +0 -887
  716. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2746
  717. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/index.js +0 -8
  718. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/utils.js +0 -8
  719. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.2/node_modules/@vitest/snapshot/dist/index.js +0 -662
  720. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.2/node_modules/@vitest/spy/dist/index.js +0 -386
  721. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -82
  722. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/constants.js +0 -48
  723. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/diff.js +0 -1307
  724. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/display.js +0 -558
  725. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/error.js +0 -33
  726. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/helpers.js +0 -226
  727. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/offset.js +0 -27
  728. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/serialize.js +0 -77
  729. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/source-map.js +0 -374
  730. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/timers.js +0 -37
  731. package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.9.2_@emnapi_runtime@1.9.2_@types_node@25.0.7_esbuild@0.27.4_jiti@2.6.1_sass@1.98.0_tsx@4.21.0/node_modules/vite/dist/node/module-runner.js +0 -426
  732. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496/node_modules/vitest/dist/chunks/index.DOa3dzoN.js +0 -16
  733. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496/node_modules/vitest/dist/chunks/test.p_J6dB8a.js +0 -2910
  734. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496/node_modules/vitest/dist/index.js +0 -28
  735. package/bundle/web-dist/client/assets/logs-cXOsDli3.js +0 -1
@@ -0,0 +1,1317 @@
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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