sonamu 0.12.0 → 0.13.0

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 (275) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +1 -2
  2. package/dist/ai/agents/agent.js +2 -3
  3. package/dist/ai/agents/index.js +1 -2
  4. package/dist/ai/index.js +1 -2
  5. package/dist/ai/providers/rtzr/api.js +1 -2
  6. package/dist/ai/providers/rtzr/error.js +2 -3
  7. package/dist/ai/providers/rtzr/model.js +1 -2
  8. package/dist/ai/providers/rtzr/options.js +1 -2
  9. package/dist/ai/providers/rtzr/provider.js +1 -2
  10. package/dist/ai/providers/rtzr/utils.js +1 -2
  11. package/dist/api/base-frame.js +4 -4
  12. package/dist/api/caster.d.ts +1 -1
  13. package/dist/api/caster.d.ts.map +1 -1
  14. package/dist/api/caster.js +9 -9
  15. package/dist/api/code-converters.js +6 -5
  16. package/dist/api/config.d.ts +1 -1
  17. package/dist/api/config.d.ts.map +1 -1
  18. package/dist/api/config.js +2 -3
  19. package/dist/api/context.d.ts +2 -3
  20. package/dist/api/context.d.ts.map +1 -1
  21. package/dist/api/context.js +2 -3
  22. package/dist/api/decorators.js +2 -3
  23. package/dist/api/http-validator.js +2 -3
  24. package/dist/api/index.js +8 -3
  25. package/dist/api/secret.js +1 -2
  26. package/dist/api/sonamu.d.ts +3 -5
  27. package/dist/api/sonamu.d.ts.map +1 -1
  28. package/dist/api/sonamu.js +19 -18
  29. package/dist/api/validator.js +1 -2
  30. package/dist/api/websocket-helpers.js +2 -3
  31. package/dist/auth/audit-log/builders.js +1 -2
  32. package/dist/auth/audit-log/client-ip.js +2 -3
  33. package/dist/auth/audit-log/events.js +1 -2
  34. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  35. package/dist/auth/audit-log/plugin.js +2 -3
  36. package/dist/auth/audit-log-ingestor.js +2 -3
  37. package/dist/auth/auth-generator.js +2 -3
  38. package/dist/auth/better-auth-entities.js +1 -2
  39. package/dist/auth/better-auth-request.js +2 -3
  40. package/dist/auth/index.js +2 -3
  41. package/dist/auth/knex-adapter.js +2 -3
  42. package/dist/auth/plugins/entity-definitions/admin.js +1 -2
  43. package/dist/auth/plugins/entity-definitions/anonymous.js +1 -2
  44. package/dist/auth/plugins/entity-definitions/api-key.js +1 -2
  45. package/dist/auth/plugins/entity-definitions/audit-log.js +1 -2
  46. package/dist/auth/plugins/entity-definitions/index.js +1 -2
  47. package/dist/auth/plugins/entity-definitions/jwt.js +1 -2
  48. package/dist/auth/plugins/entity-definitions/organization.js +1 -2
  49. package/dist/auth/plugins/entity-definitions/passkey.js +1 -2
  50. package/dist/auth/plugins/entity-definitions/phone-number.js +1 -2
  51. package/dist/auth/plugins/entity-definitions/sso.js +1 -2
  52. package/dist/auth/plugins/entity-definitions/two-factor.js +1 -2
  53. package/dist/auth/plugins/entity-definitions/username.js +1 -2
  54. package/dist/auth/plugins/wrappers/admin.d.ts +33 -32
  55. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  56. package/dist/auth/plugins/wrappers/admin.js +2 -3
  57. package/dist/auth/plugins/wrappers/anonymous.js +2 -3
  58. package/dist/auth/plugins/wrappers/api-key.js +2 -3
  59. package/dist/auth/plugins/wrappers/jwt.js +2 -3
  60. package/dist/auth/plugins/wrappers/organization.js +2 -3
  61. package/dist/auth/plugins/wrappers/passkey.js +2 -3
  62. package/dist/auth/plugins/wrappers/phone-number.d.ts +43 -1
  63. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  64. package/dist/auth/plugins/wrappers/phone-number.js +2 -3
  65. package/dist/auth/plugins/wrappers/sso.d.ts +138 -187
  66. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  67. package/dist/auth/plugins/wrappers/sso.js +1 -2
  68. package/dist/auth/plugins/wrappers/two-factor.d.ts +51 -10
  69. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  70. package/dist/auth/plugins/wrappers/two-factor.js +2 -3
  71. package/dist/auth/plugins/wrappers/username.d.ts +39 -5
  72. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  73. package/dist/auth/plugins/wrappers/username.js +2 -3
  74. package/dist/bin/build-config.js +5 -5
  75. package/dist/bin/compiler-policy.js +2 -3
  76. package/dist/bin/fixture.js +7 -5
  77. package/dist/bin/hmr-hook-register.js +1 -2
  78. package/dist/bin/migrate-targets.js +2 -3
  79. package/dist/bin/test-command.js +2 -3
  80. package/dist/bin/ts-loader-register.js +2 -3
  81. package/dist/bin/ts-loader-registration.js +2 -3
  82. package/dist/bin/typecheck-web.js +2 -3
  83. package/dist/cache/cache-manager.js +1 -2
  84. package/dist/cache/decorator.js +2 -3
  85. package/dist/cache/drivers.js +1 -2
  86. package/dist/cache/index.js +2 -3
  87. package/dist/cache-control/cache-control.js +1 -2
  88. package/dist/code-formatting/index.js +2 -3
  89. package/dist/code-formatting/oxfmt.js +2 -3
  90. package/dist/code-formatting/oxlint.js +2 -3
  91. package/dist/compress/compress.js +1 -2
  92. package/dist/compress/index.js +2 -2
  93. package/dist/compress/types.d.ts +1 -1
  94. package/dist/compress/types.d.ts.map +1 -1
  95. package/dist/cone/cone-generator.js +2 -3
  96. package/dist/database/_batch_update.js +1 -2
  97. package/dist/database/base-model.js +4 -4
  98. package/dist/database/db.js +4 -4
  99. package/dist/database/knex.js +2 -3
  100. package/dist/database/puri-wrapper.js +2 -3
  101. package/dist/database/puri.js +23 -22
  102. package/dist/database/puri.types.js +1 -2
  103. package/dist/database/transaction-context.js +1 -2
  104. package/dist/database/upsert-builder.js +2 -3
  105. package/dist/dict/en.js +2 -3
  106. package/dist/dict/index.js +3 -3
  107. package/dist/dict/ko.js +2 -3
  108. package/dist/dict/rc-keys.js +1 -2
  109. package/dist/dict/sd.js +2 -3
  110. package/dist/dict/sonamu-dictionary.js +7 -6
  111. package/dist/dict/utils.js +2 -3
  112. package/dist/entity/entity-manager.d.ts +66 -66
  113. package/dist/entity/entity-manager.js +4 -4
  114. package/dist/entity/entity-template-cone.js +2 -3
  115. package/dist/entity/entity.js +21 -18
  116. package/dist/env.js +1 -2
  117. package/dist/exceptions/error-handler.d.ts.map +1 -1
  118. package/dist/exceptions/error-handler.js +2 -3
  119. package/dist/exceptions/so-exceptions.js +2 -3
  120. package/dist/filter/index.js +3 -2
  121. package/dist/filter/types.js +1 -2
  122. package/dist/filter/utils.js +7 -6
  123. package/dist/index.js +39 -5
  124. package/dist/logger/category.js +2 -3
  125. package/dist/logger/configure.js +5 -5
  126. package/dist/migration/code-generation.js +23 -16
  127. package/dist/migration/index-where-predicate.js +2 -3
  128. package/dist/migration/migration-set.js +2 -3
  129. package/dist/migration/migrator.js +2 -3
  130. package/dist/migration/postgresql-schema-reader.js +6 -9
  131. package/dist/migration/slack-confirm.js +2 -3
  132. package/dist/naite/naite-reporter.js +2 -3
  133. package/dist/naite/naite.js +10 -8
  134. package/dist/runtime-type.js +2 -3
  135. package/dist/ssr/hmr-opt-out.js +1 -2
  136. package/dist/ssr/index.js +7 -4
  137. package/dist/ssr/registry.js +1 -2
  138. package/dist/ssr/renderer.js +2 -3
  139. package/dist/storage/base-file.js +1 -2
  140. package/dist/storage/buffered-file.js +2 -3
  141. package/dist/storage/drivers.js +1 -2
  142. package/dist/storage/index.js +2 -3
  143. package/dist/storage/s3-driver.js +1 -2
  144. package/dist/storage/storage-manager.js +2 -3
  145. package/dist/storage/uploaded-file.js +2 -3
  146. package/dist/stream/__tests__/ws-test-helpers.js +2 -3
  147. package/dist/stream/index.js +11 -2
  148. package/dist/stream/sse.js +1 -2
  149. package/dist/stream/ws-audience-resolver.js +2 -3
  150. package/dist/stream/ws-audience.js +1 -2
  151. package/dist/stream/ws-cluster-bus.js +1 -2
  152. package/dist/stream/ws-delivery.js +2 -3
  153. package/dist/stream/ws-frame.js +1 -2
  154. package/dist/stream/ws-local-connection-store.js +2 -3
  155. package/dist/stream/ws-presence-index.js +1 -2
  156. package/dist/stream/ws-presence-store.js +2 -3
  157. package/dist/stream/ws-registry.js +2 -3
  158. package/dist/stream/ws-session-id.js +1 -2
  159. package/dist/stream/ws-telemetry-memory.js +3 -4
  160. package/dist/stream/ws-telemetry-trace.js +1 -2
  161. package/dist/stream/ws-telemetry.js +2 -3
  162. package/dist/stream/ws.js +2 -3
  163. package/dist/syncer/api-parser.js +2 -3
  164. package/dist/syncer/checksum.js +4 -4
  165. package/dist/syncer/code-generator.js +4 -4
  166. package/dist/syncer/entity-operations.js +2 -3
  167. package/dist/syncer/event-batcher.js +1 -2
  168. package/dist/syncer/file-copy.js +2 -3
  169. package/dist/syncer/file-patterns.js +2 -3
  170. package/dist/syncer/file-tracking.js +2 -3
  171. package/dist/syncer/filesystem-dependencies.js +1 -2
  172. package/dist/syncer/index.js +8 -2
  173. package/dist/syncer/module-loader.js +8 -6
  174. package/dist/syncer/syncer-actions.js +8 -7
  175. package/dist/syncer/syncer.js +13 -8
  176. package/dist/syncer/watcher.js +2 -3
  177. package/dist/tasks/decorator.js +1 -2
  178. package/dist/tasks/step-wrapper.js +2 -3
  179. package/dist/tasks/workflow-manager.js +2 -3
  180. package/dist/template/entity-converter.js +17 -16
  181. package/dist/template/helpers.js +2 -3
  182. package/dist/template/implementations/entity.template.js +2 -3
  183. package/dist/template/implementations/entry-server.template.js +2 -3
  184. package/dist/template/implementations/generated.template.js +2 -3
  185. package/dist/template/implementations/generated_http.template.js +6 -6
  186. package/dist/template/implementations/generated_sso.template.js +2 -3
  187. package/dist/template/implementations/http_validators.template.js +2 -3
  188. package/dist/template/implementations/init_types.template.js +2 -3
  189. package/dist/template/implementations/model.template.js +4 -4
  190. package/dist/template/implementations/model_test.template.js +2 -3
  191. package/dist/template/implementations/queries.template.js +2 -3
  192. package/dist/template/implementations/sd.template.js +2 -3
  193. package/dist/template/implementations/services.template.js +2 -3
  194. package/dist/template/implementations/view_form.template.js +12 -9
  195. package/dist/template/implementations/view_id_all_select.template.js +2 -3
  196. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  197. package/dist/template/implementations/view_list.template.js +19 -17
  198. package/dist/template/implementations/view_search_input.template.js +2 -3
  199. package/dist/template/index.js +9 -3
  200. package/dist/template/template-manager.js +2 -3
  201. package/dist/template/template-types.js +1 -2
  202. package/dist/template/template.js +2 -3
  203. package/dist/template/zod-converter.js +54 -47
  204. package/dist/testing/_relation-graph.js +2 -3
  205. package/dist/testing/bootstrap.js +2 -3
  206. package/dist/testing/data-explorer.js +2 -3
  207. package/dist/testing/dev-test-routes.js +2 -3
  208. package/dist/testing/dev-vitest-manager.js +15 -12
  209. package/dist/testing/faker-mappings.js +1 -2
  210. package/dist/testing/filesystem.js +2 -3
  211. package/dist/testing/fixture-generator.js +2 -3
  212. package/dist/testing/fixture-loader.js +1 -2
  213. package/dist/testing/fixture-manager.js +12 -9
  214. package/dist/testing/global-setup.js +5 -5
  215. package/dist/testing/index.js +6 -3
  216. package/dist/testing/naite-vitest-reporter.js +1 -2
  217. package/dist/testing/parallel-db-manager.js +2 -3
  218. package/dist/testing/vitest-helpers.js +2 -3
  219. package/dist/tooling/__tests__/helpers/sonamu-test-root.js +2 -3
  220. package/dist/tooling/cdd-service.js +1 -2
  221. package/dist/tooling/cli-tooling.js +1 -2
  222. package/dist/tooling/fixture-service.js +1 -2
  223. package/dist/tooling/index.js +1 -2
  224. package/dist/tooling/test-run-client.js +2 -3
  225. package/dist/tsdown.api.config.js +1 -2
  226. package/dist/types/types.js +2 -3
  227. package/dist/ui/ai-api.d.ts.map +1 -1
  228. package/dist/ui/ai-api.js +4 -5
  229. package/dist/ui/ai-client.d.ts +2 -2
  230. package/dist/ui/ai-client.d.ts.map +1 -1
  231. package/dist/ui/ai-client.js +9 -8
  232. package/dist/ui/api.d.ts.map +1 -1
  233. package/dist/ui/api.js +11 -8
  234. package/dist/ui/async-route.js +1 -2
  235. package/dist/ui/cdd-service.js +22 -21
  236. package/dist/ui/migrations-api.js +6 -5
  237. package/dist/ui-web/assets/index-QDMyy31K.js +180 -0
  238. package/dist/ui-web/assets/index-dV7akMFB.css +1 -0
  239. package/dist/ui-web/index.html +2 -2
  240. package/dist/utils/async-utils.js +1 -2
  241. package/dist/utils/class-name.js +1 -2
  242. package/dist/utils/console-util.js +1 -2
  243. package/dist/utils/controller.js +2 -3
  244. package/dist/utils/esm-utils.js +1 -2
  245. package/dist/utils/fs-utils.js +2 -3
  246. package/dist/utils/lodash-able.js +1 -2
  247. package/dist/utils/model.js +1 -2
  248. package/dist/utils/object-utils.js +2 -3
  249. package/dist/utils/path-utils.js +2 -3
  250. package/dist/utils/process-utils.js +2 -3
  251. package/dist/utils/runtime-value.js +1 -2
  252. package/dist/utils/sql-parser.js +2 -3
  253. package/dist/utils/type-utils.js +8 -8
  254. package/dist/utils/utils.js +2 -3
  255. package/dist/utils/zod-error.js +2 -3
  256. package/dist/vector/chunking.js +1 -2
  257. package/dist/vector/config.js +1 -2
  258. package/dist/vector/embedding.js +4 -4
  259. package/package.json +63 -63
  260. package/src/ai/agents/agent.ts +1 -1
  261. package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
  262. package/src/api/__tests__/sonamu.websocket.test.ts +6 -10
  263. package/src/api/config.ts +1 -1
  264. package/src/api/context.ts +2 -8
  265. package/src/api/sonamu.ts +26 -21
  266. package/src/auth/audit-log/plugin.ts +2 -0
  267. package/src/compress/types.ts +1 -1
  268. package/src/exceptions/error-handler.ts +3 -2
  269. package/src/template/implementations/model.template.ts +3 -3
  270. package/src/template/implementations/view_list.template.ts +12 -13
  271. package/src/ui/ai-api.ts +4 -2
  272. package/src/ui/ai-client.ts +2 -2
  273. package/src/ui/api.ts +58 -62
  274. package/dist/ui-web/assets/index-BMdIyKXS.css +0 -1
  275. package/dist/ui-web/assets/index-LpE8u19O.js +0 -178
package/dist/stream/ws.js CHANGED
@@ -8,7 +8,7 @@ import { createWebSocketTelemetryController, init_ws_telemetry, isPromiseLike }
8
8
  import { WebSocketRegistry, init_ws_registry } from "./ws-registry.js";
9
9
  import { z } from "zod";
10
10
  import { randomUUID } from "node:crypto";
11
- //#region src/stream/ws.ts
11
+ // src/stream/ws.ts
12
12
  function createWebSocketRuntime(options = {}) {
13
13
  return new WebSocketRuntime(options);
14
14
  }
@@ -652,8 +652,7 @@ var init_ws = __esmMin((() => {
652
652
  }
653
653
  };
654
654
  }));
655
- //#endregion
656
655
  init_ws();
657
656
  export { WebSocketRuntime, createWebSocketRuntime, init_ws };
658
657
 
659
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyB0eXBlIEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuXG5pbXBvcnQgeyB0eXBlIFJhd0RhdGEsIHR5cGUgV2ViU29ja2V0IH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBydW50aW1lVHlwZU9mIH0gZnJvbSBcIi4uL3J1bnRpbWUtdHlwZVwiO1xuaW1wb3J0IHsgaXNTdHJpbmdWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0Q2x1c3RlckJ1cyB9IGZyb20gXCIuL3dzLWNsdXN0ZXItYnVzXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldEZyYW1lQ29ubmVjdGlvbiB9IGZyb20gXCIuL3dzLWNvcmVcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0Um91dGVEZWZpbml0aW9uIH0gZnJvbSBcIi4vd3MtZGVsaXZlcnlcIjtcbmltcG9ydCB7IGVuY29kZVdlYlNvY2tldEZyYW1lIH0gZnJvbSBcIi4vd3MtZnJhbWVcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0UHJlc2VuY2VTdG9yZSB9IGZyb20gXCIuL3dzLXByZXNlbmNlLXN0b3JlXCI7XG5pbXBvcnQge1xuICB0eXBlIE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uLFxuICBXZWJTb2NrZXRSZWdpc3RyeSxcbiAgdHlwZSBXZWJTb2NrZXRSZWdpc3RyeU9wdGlvbnMsXG4gIHR5cGUgV2ViU29ja2V0Um9vbUlkLFxuICB0eXBlIFdlYlNvY2tldFVzZXJJZCxcbn0gZnJvbSBcIi4vd3MtcmVnaXN0cnlcIjtcbmltcG9ydCB7IGNyZWF0ZVdlYlNvY2tldE5vZGVJZCwgY3JlYXRlV2ViU29ja2V0U2Vzc2lvbklkIH0gZnJvbSBcIi4vd3Mtc2Vzc2lvbi1pZFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvblNuYXBzaG90LFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0LFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5T3B0aW9ucyxcbiAgdHlwZSBUZWxlbWV0cnlJbnNwZWN0YWJsZUNvbm5lY3Rpb24sXG4gIGNyZWF0ZVdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIsXG4gIGlzUHJvbWlzZUxpa2UsXG59IGZyb20gXCIuL3dzLXRlbGVtZXRyeVwiO1xuaW1wb3J0IHsgcGFyc2VUcmFjZVBhcmVudCwgZ2VuZXJhdGVTcGFuSWQgfSBmcm9tIFwiLi93cy10ZWxlbWV0cnktdHJhY2VcIjtcblxuLy8gdHJhbnNwb3J0LWxldmVsIOyDgeyImOyZgCBxdWV1ZSB0aHJlc2hvbGTrpbwg7ZWcIO2MjOydvOyXkCDrqqjslYQgbGlmZWN5Y2xlL2JhY2twcmVzc3VyZSDsoJXssYXsnYQg7KSR7JWZ7ZmU7ZWoXG5jb25zdCBXU19DT05ORUNUSU5HID0gMDtcbmNvbnN0IFdTX09QRU4gPSAxO1xuY29uc3QgV1NfQ0xPU0VEID0gMztcbi8vIFJGQyA2NDU1IGNsb3NlIGNvZGVzIHVzZWQgYnkgU29uYW11J3MgV2ViU29ja2V0IHJ1bnRpbWUuXG5jb25zdCBXU19DTE9TRV9DT0RFX0dPSU5HX0FXQVkgPSAxMDAxO1xuY29uc3QgV1NfQ0xPU0VfQ09ERV9JTlZBTElEX0ZSQU1FX1BBWUxPQURfREFUQSA9IDEwMDc7XG5jb25zdCBXU19DTE9TRV9DT0RFX1BPTElDWV9WSU9MQVRJT04gPSAxMDA4O1xuY29uc3QgV1NfQ0xPU0VfQ09ERV9JTlRFUk5BTF9FUlJPUiA9IDEwMTE7XG5jb25zdCBXU19DTE9TRV9DT0RFX1RSWV9BR0FJTl9MQVRFUiA9IDEwMTM7XG5jb25zdCBNQVhfUEVORElOR19NRVNTQUdFUyA9IDEwMDtcbmNvbnN0IE1BWF9QRU5ESU5HX09VVEJPVU5EX01FU1NBR0VTID0gMV8wMDA7XG5jb25zdCBNQVhfU09DS0VUX0JVRkZFUkVEX0FNT1VOVCA9IDFfMDQ4XzU3NjtcbmNvbnN0IE9VVEJPVU5EX0JBVENIX1NJWkUgPSA1MDtcbmNvbnN0IE9VVEJPVU5EX1JFVFJZX0RFTEFZX01TID0gNTtcblxuLy8gZW52ZWxvcGXsnYQgYHtldmVudCwgZGF0YX1gIO2Yle2DnOuhnCDqs6DsoJXtlbQgc2VydmVyIGhhbmRsZXLsmYAgZ2VuZXJhdGVkIGNsaWVudOqwgCDqsJnsnYAgZnJhbWluZyBjb250cmFjdOulvCDsk7Dqsowg7ZWoXG4vLyBtZXRh64qUIG9wdGlvbmFs7J2066+A66GcIOq4sOyhtCBge2V2ZW50LCBkYXRhfWAg66mU7Iuc7KeA64+EIOq3uOuMgOuhnCDtjIzsi7HrkKggKGJhY2t3YXJkLWNvbXBhdGlibGUpXG5jb25zdCBXZWJTb2NrZXRFbnZlbG9wZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZXZlbnQ6IHouc3RyaW5nKCksXG4gIGRhdGE6IHouanNvbigpLFxuICBtZXRhOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICB0cmFjZXBhcmVudDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgdHJhY2VzdGF0ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxudHlwZSBNZXNzYWdlSGFuZGxlcjxUPiA9IChcbiAgZGF0YTogVCxcbiAgdGVsZW1ldHJ5Q29udGV4dD86IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0LFxuKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbnR5cGUgQ2xvc2VIYW5kbGVyID0gKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldEV2ZW50TWFwPEV2ZW50UGF5bG9hZCA9IG5ldmVyPiA9IFJlY29yZDxzdHJpbmcsIEV2ZW50UGF5bG9hZD47XG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUcmFuc3BvcnQgPSBQaWNrPFxuICBXZWJTb2NrZXQsXG4gIFwiYnVmZmVyZWRBbW91bnRcIiB8IFwiY2xvc2VcIiB8IFwicGluZ1wiIHwgXCJyZWFkeVN0YXRlXCIgfCBcInNlbmRcIiB8IFwidGVybWluYXRlXCJcbj4gJiB7XG4gIG9mZjogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8RXZlbnRFbWl0dGVyW1wib2ZmXCJdPikgPT4gdm9pZDtcbiAgb246ICguLi5hcmdzOiBQYXJhbWV0ZXJzPEV2ZW50RW1pdHRlcltcIm9uXCJdPikgPT4gdm9pZDtcbn07XG5cbnR5cGUgV2ViU29ja2V0RXZlbnRGaWVsZHMgPSBSZWNvcmQ8c3RyaW5nLCB6LlpvZFR5cGU+O1xudHlwZSBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRTY2hlbWEgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcz4gPSB6LmluZmVyPHouWm9kT2JqZWN0PFRTY2hlbWE+PjtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0T3V0RXZlbnRzPFRPdXQgZXh0ZW5kcyBvYmplY3QgPSBXZWJTb2NrZXRFdmVudE1hcD4gPSBUT3V0O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRJbkV2ZW50czxUSW4gZXh0ZW5kcyBvYmplY3QgPSBXZWJTb2NrZXRFdmVudE1hcD4gPSBUSW47XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0Q29ubmVjdGlvbjxcbiAgVE91dCBleHRlbmRzIG9iamVjdCA9IFdlYlNvY2tldEV2ZW50TWFwLFxuICBUSW4gZXh0ZW5kcyBvYmplY3QgPSBXZWJTb2NrZXRFdmVudE1hcCxcbj4gZXh0ZW5kcyBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiB7XG4gIHRyYW5zcG9ydDogXCJ3c1wiO1xuICBvbkNsb3NlKGNhbGxiYWNrOiBDbG9zZUhhbmRsZXIpOiB2b2lkO1xuICBvbk1lc3NhZ2U8SyBleHRlbmRzIGtleW9mIFdlYlNvY2tldEluRXZlbnRzPFRJbj4+KFxuICAgIGV2ZW50OiBLLFxuICAgIGhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyPFdlYlNvY2tldEluRXZlbnRzPFRJbj5bS10+LFxuICApOiB2b2lkO1xuICBwdWJsaXNoPEsgZXh0ZW5kcyBrZXlvZiBXZWJTb2NrZXRPdXRFdmVudHM8VE91dD4+KFxuICAgIGV2ZW50OiBLLFxuICAgIGRhdGE6IFdlYlNvY2tldE91dEV2ZW50czxUT3V0PltLXSxcbiAgKTogdm9pZDtcbiAgd2FpdEZvckNsb3NlKCk6IFByb21pc2U8dm9pZD47XG4gIC8vIOyVhOuemCBtdXRhdGlvbuydgCDrqZTrqqjrpqzrpbwg7KaJ7IucIOqwseyLoO2VmOqzoCwgc3RvcmUg67CY7JiB7J20IOuBneuCmOuptCByZXNvbHZl7ZWc64ukLiByZWplY3TtlZjsp4Ag7JWK64qU64ukXG4gIGpvaW4ocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiBQcm9taXNlPHZvaWQ+O1xuICBsZWF2ZShyb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IFByb21pc2U8dm9pZD47XG4gIHNldFVzZXJJZCh1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCk6IFByb21pc2U8dm9pZD47XG4gIGNsZWFyVXNlcklkKCk6IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCB0eXBlIEFueVdlYlNvY2tldENvbm5lY3Rpb24gPSBXZWJTb2NrZXRDb25uZWN0aW9uPG9iamVjdCwgb2JqZWN0PjtcblxudHlwZSBQYXJzZWRFbnZlbG9wZSA9IHouaW5mZXI8dHlwZW9mIFdlYlNvY2tldEVudmVsb3BlU2NoZW1hPjtcblxudHlwZSBXZWJTb2NrZXRDb25uZWN0aW9uT3B0aW9uczxcbiAgVE91dCBleHRlbmRzIFdlYlNvY2tldEV2ZW50RmllbGRzLFxuICBUSW4gZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcyxcbj4gPSB7XG4gIC8vIHJvdXRlIHRhYmxlIO2CpCjrs7TthrUgQVBJIHBhdGgpLiDsm5Dqsqkg64W465Oc6rCAIOuztOuCuCBlbnZlbG9wZeyXkOyEnCDsnbQg7Jew6rKw7J20IOuwm+ydhCBmcmFtZeydhCDqs6Drpbwg65WMIOyTtOuLpFxuICByb3V0ZUtleT86IHN0cmluZztcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBoZWFydGJlYXQ/OiBudW1iZXI7XG4gIGFjdGl2ZT86IGJvb2xlYW47XG4gIG91dEV2ZW50czogei5ab2RPYmplY3Q8VE91dD47XG4gIGluRXZlbnRzOiB6LlpvZE9iamVjdDxUSW4+O1xuICByZWdpc3RyeTogV2ViU29ja2V0UmVnaXN0cnk7XG4gIHRlbGVtZXRyeUNvbnRyb2xsZXI6IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFJ1bnRpbWVPcHRpb25zID0ge1xuICBub2RlSWQ/OiBzdHJpbmc7XG4gIHByZXNlbmNlU3RvcmU/OiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICBjbHVzdGVyQnVzPzogV2ViU29ja2V0Q2x1c3RlckJ1cztcbiAgdGVsZW1ldHJ5PzogYm9vbGVhbiB8IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnM7XG4gIC8vIHNodXRkb3duIOyLnCDsp4Ttlokg7KSR7J24IHN0b3JlIG11dGF0aW9u6rO8IHB1Ymxpc2jrpbwg6riw64uk66as64qUIOyDge2VnC4g6riw67O46rCSIDUwMDBtc1xuICBkcmFpblRpbWVvdXRNcz86IG51bWJlcjtcbn07XG5cbi8vIHJlZ2lzdHJ566W8IOyGjOycoO2VmOqzoCBjb25uZWN0aW9uIOyDneyEsS9zaHV0ZG93buydhCDri7Tri7ntlaguIFNvbmFtdSDslaDtlIzrpqzsvIDsnbTshZgg7IiY66qF7KO86riw7JmAIOqwmeydtCDsm4Dsp4HsnbTrj4TroZ0g7ISk6rOE7ZWoXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0UnVudGltZSB7XG4gIHJlYWRvbmx5IHJlZ2lzdHJ5OiBXZWJTb2NrZXRSZWdpc3RyeTtcbiAgcmVhZG9ubHkgdGVsZW1ldHJ5Q29udHJvbGxlcjogV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBXZWJTb2NrZXRSdW50aW1lT3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gbm9kZUlk66W8IOyjvOyngCDslYrsnLzrqbQgc3RvcmUvYnVz6rCAIOqwgOynhCBub2RlSWTrpbwg65Sw66W06rOgLCDrkZgg64ukIOyXhuycvOuptCBob3N0bmFtZS1waWQt656c642k7Jy866GcIOunjOuToOuLpC5cbiAgICAvLyBzdG9yZeuCmCBidXPsnZggbm9kZUlk6rCAIOydtCDqsJLqs7wg64uk66W066m0IHJlZ2lzdHJ5IOyDneyEsSDsi5wg7KaJ7IucIOyLpO2MqO2VnOuLpFxuICAgIGNvbnN0IHJlc29sdmVkTm9kZUlkID1cbiAgICAgIG9wdGlvbnMubm9kZUlkID8/XG4gICAgICBvcHRpb25zLnByZXNlbmNlU3RvcmU/Lm5vZGVJZCA/P1xuICAgICAgb3B0aW9ucy5jbHVzdGVyQnVzPy5ub2RlSWQgPz9cbiAgICAgIGNyZWF0ZVdlYlNvY2tldE5vZGVJZCgpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlciA9IGNyZWF0ZVdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIob3B0aW9ucy50ZWxlbWV0cnksIHtcbiAgICAgIHJ1bnRpbWVJZDogcmFuZG9tVVVJRCgpLFxuICAgICAgbm9kZUlkOiByZXNvbHZlZE5vZGVJZCxcbiAgICB9KTtcbiAgICBjb25zdCByZWdpc3RyeU9wdGlvbnM6IFdlYlNvY2tldFJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgICAgIG5vZGVJZDogcmVzb2x2ZWROb2RlSWQsXG4gICAgICBwcmVzZW5jZVN0b3JlOiBvcHRpb25zLnByZXNlbmNlU3RvcmUsXG4gICAgICBjbHVzdGVyQnVzOiBvcHRpb25zLmNsdXN0ZXJCdXMsXG4gICAgICB0ZWxlbWV0cnlDb250cm9sbGVyOiB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIsXG4gICAgICBkcmFpblRpbWVvdXRNczogb3B0aW9ucy5kcmFpblRpbWVvdXRNcyxcbiAgICB9O1xuICAgIHRoaXMucmVnaXN0cnkgPSBuZXcgV2ViU29ja2V0UmVnaXN0cnkocmVnaXN0cnlPcHRpb25zKTtcbiAgfVxuXG4gIC8vIHJvdXRlS2V567OEIG91dEV2ZW50c+ulvCDrk7HroZ3tlZzri6QuIOqwmeydgCDtgqTroZwg64uk7IucIO2YuOy2nO2VmOuptCDsiqTtgqTrp4jrpbwg6rWQ7LK07ZWc64ukXG4gIHJlZ2lzdGVyUm91dGUocm91dGVLZXk6IHN0cmluZywgcm91dGU6IHsgb3V0RXZlbnRzOiB6LlpvZE9iamVjdCB9KTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RyeS5yZWdpc3RlclJvdXRlKHJvdXRlS2V5LCByb3V0ZS5vdXRFdmVudHMpO1xuICB9XG5cbiAgLy8gcm91dGUgdGFibGUg7KCE7LK066W8IOq1kOyytO2VnOuLpC4g66qp66Gd7JeQIOyXhuuKlCByb3V0ZUtleeuKlCDsoJzqsbDrkJzri6RcbiAgcmVwbGFjZVJvdXRlcyhyb3V0ZXM6IFdlYlNvY2tldFJvdXRlRGVmaW5pdGlvbltdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RyeS5yZXBsYWNlUm91dGVzKHJvdXRlcyk7XG4gIH1cblxuICAvKipcbiAgICog7IaM7LyTIOumrOyKpOuEiOulvCDrj5nquLDroZwg67aZ7J206rOgIHJlZ2lzdHJ57JeQIOuTseuhne2VnOuLpC4gc3RvcmUucmVnaXN0ZXLqsIAg64Gd64KY66m0KOyLpO2MqO2VtOuPhCkgcmVzb2x2Ze2VnOuLpC5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyQ29ubmVjdGlvbjxcbiAgICBUT3V0U2NoZW1hIGV4dGVuZHMgV2ViU29ja2V0RXZlbnRGaWVsZHMsXG4gICAgVEluU2NoZW1hIGV4dGVuZHMgV2ViU29ja2V0RXZlbnRGaWVsZHMsXG4gID4oXG4gICAgc29ja2V0OiBXZWJTb2NrZXRUcmFuc3BvcnQsXG4gICAgb3B0aW9uczogT21pdDxcbiAgICAgIFdlYlNvY2tldENvbm5lY3Rpb25PcHRpb25zPFRPdXRTY2hlbWEsIFRJblNjaGVtYT4sXG4gICAgICBcInJlZ2lzdHJ5XCIgfCBcInRlbGVtZXRyeUNvbnRyb2xsZXJcIlxuICAgID4sXG4gICk6IFByb21pc2U8XG4gICAgV2ViU29ja2V0Q29ubmVjdGlvbjxJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRPdXRTY2hlbWE+LCBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRJblNjaGVtYT4+XG4gID4ge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBuZXcgV2ViU29ja2V0Q29ubmVjdGlvbkltcGwoc29ja2V0LCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgcmVnaXN0cnk6IHRoaXMucmVnaXN0cnksXG4gICAgICB0ZWxlbWV0cnlDb250cm9sbGVyOiB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIsXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5yZWdpc3RyeS5yZWdpc3Rlcihjb25uZWN0aW9uLCBvcHRpb25zLmFjdGl2ZSA/PyB0cnVlKTtcbiAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgfVxuXG4gIGFjdGl2YXRlQ29ubmVjdGlvbihjb25uZWN0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmFjdGl2YXRlKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBicm9hZGNhc3Q8RGF0YT4oZXZlbnQ6IHN0cmluZywgZGF0YTogRGF0YSwgbmFtZXNwYWNlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuYnJvYWRjYXN0KGV2ZW50LCBkYXRhLCBuYW1lc3BhY2UpO1xuICB9XG5cbiAgcHVibGlzaFRvUm9vbTxEYXRhPihcbiAgICByb29tSWQ6IFdlYlNvY2tldFJvb21JZCxcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRhdGE6IERhdGEsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5wdWJsaXNoVG9Sb29tKHJvb21JZCwgZXZlbnQsIGRhdGEsIG5hbWVzcGFjZSk7XG4gIH1cblxuICBwdWJsaXNoVG9Vc2VyPERhdGE+KFxuICAgIHVzZXJJZDogV2ViU29ja2V0VXNlcklkLFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgZGF0YTogRGF0YSxcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnB1Ymxpc2hUb1VzZXIodXNlcklkLCBldmVudCwgZGF0YSwgbmFtZXNwYWNlKTtcbiAgfVxuXG4gIHB1Ymxpc2hUb0F1ZGllbmNlPERhdGE+KGF1ZGllbmNlOiBXZWJTb2NrZXRBdWRpZW5jZSwgZXZlbnQ6IHN0cmluZywgZGF0YTogRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnB1Ymxpc2hUb0F1ZGllbmNlKGF1ZGllbmNlLCBldmVudCwgZGF0YSk7XG4gIH1cblxuICAvLyDtlITroZzshLjsiqQg7KKF66OMIOyLnCDsgrTslYTsnojripQg7Jew6rKw7J20IOuCqOyngCDslYrrj4TroZ0gcmVnaXN0cnnrpbwg7Iic7ZqM7ZW0IOydvOq0hCDsooXro4ztlahcbiAgYXN5bmMgc2h1dGRvd24oXG4gICAgY29kZTogbnVtYmVyID0gV1NfQ0xPU0VfQ09ERV9HT0lOR19BV0FZLFxuICAgIHJlYXNvbiA9IFwiU2VydmVyIHNodXR0aW5nIGRvd25cIixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWdpc3RyeS5zaHV0ZG93bihjb2RlLCByZWFzb24pO1xuICAgIGF3YWl0IHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5zaHV0ZG93bigpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTb2NrZXRSdW50aW1lKG9wdGlvbnM6IFdlYlNvY2tldFJ1bnRpbWVPcHRpb25zID0ge30pOiBXZWJTb2NrZXRSdW50aW1lIHtcbiAgcmV0dXJuIG5ldyBXZWJTb2NrZXRSdW50aW1lKG9wdGlvbnMpO1xufVxuXG5jbGFzcyBXZWJTb2NrZXRDb25uZWN0aW9uSW1wbDxcbiAgVE91dFNjaGVtYSBleHRlbmRzIFdlYlNvY2tldEV2ZW50RmllbGRzLFxuICBUSW5TY2hlbWEgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcyxcbj5cbiAgaW1wbGVtZW50c1xuICAgIFdlYlNvY2tldENvbm5lY3Rpb248SW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUT3V0U2NoZW1hPiwgSW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUSW5TY2hlbWE+PixcbiAgICBXZWJTb2NrZXRGcmFtZUNvbm5lY3Rpb24sXG4gICAgVGVsZW1ldHJ5SW5zcGVjdGFibGVDb25uZWN0aW9uLFxuICAgIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlclxue1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSB0cmFuc3BvcnQgPSBcIndzXCI7XG4gIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuICByZWFkb25seSByb3V0ZUtleT86IHN0cmluZztcbiAgcmVhZG9ubHkgb3V0RXZlbnRzOiB6LlpvZE9iamVjdDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNsb3NlQ2FsbGJhY2tzOiBDbG9zZUhhbmRsZXJbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxNZXNzYWdlSGFuZGxlcjx1bmtub3duPj4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ01lc3NhZ2VzOiBQYXJzZWRFbnZlbG9wZVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ091dGJvdW5kTWVzc2FnZXM6IEFycmF5PHsgcGF5bG9hZDogc3RyaW5nOyBldmVudDogc3RyaW5nIH0+ID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xvc2VQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVDbG9zZVByb21pc2U6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGVhcnRiZWF0TXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudFNjaGVtYXNJbjogUmVjb3JkPHN0cmluZywgei5ab2RUeXBlQW55PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25UcmFjZUlkPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25TcGFuSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aW9uU2FtcGxlZD86IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gIC8vIGNvbm5lY3Rpb24g7IiY66qFIOuPmeyViCDsnKDsp4DrkJjripQg7Iud67OE7J6QLiBzZXRVc2VySWQvY2xlYXJVc2VySWTroZwg7JeF642w7J207Yq465CY66mwIGVtaXQgaG90IHBhdGjsl5DshJwg66ek67KIIHJlZ2lzdHJ5IGxvb2t1cO2VmOyngCDslYrrj4TroZ0g7LqQ7Iuc7ZWoXG4gIHByaXZhdGUgY3VycmVudFVzZXJJZD86IHN0cmluZztcblxuICBnZXQgdXNlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXJJZDtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VkSW50ZXJuYWwgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbG9zZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhd2FpdGluZ1BvbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBoZWFydGJlYXRUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzc2FnZVF1ZXVlOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHByaXZhdGUgb3V0Ym91bmRGbHVzaFNjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc29ja2V0OiBXZWJTb2NrZXRUcmFuc3BvcnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBXZWJTb2NrZXRDb25uZWN0aW9uT3B0aW9uczxUT3V0U2NoZW1hLCBUSW5TY2hlbWE+LFxuICApIHtcbiAgICB0aGlzLmlkID0gY3JlYXRlV2ViU29ja2V0U2Vzc2lvbklkKG9wdGlvbnMucmVnaXN0cnkubm9kZUlkKTtcbiAgICB0aGlzLnJvdXRlS2V5ID0gb3B0aW9ucy5yb3V0ZUtleTtcbiAgICB0aGlzLm91dEV2ZW50cyA9IG9wdGlvbnMub3V0RXZlbnRzO1xuICAgIHRoaXMubmFtZXNwYWNlID0gb3B0aW9ucy5uYW1lc3BhY2UgPz8gXCJkZWZhdWx0XCI7XG4gICAgdGhpcy5oZWFydGJlYXRNcyA9IG9wdGlvbnMuaGVhcnRiZWF0ID8/IDMwMDAwO1xuICAgIHRoaXMuY29ubmVjdGlvblRyYWNlSWQgPSBvcHRpb25zLnRyYWNlSWQ7XG4gICAgdGhpcy5jb25uZWN0aW9uU3BhbklkID0gb3B0aW9ucy5zcGFuSWQ7XG4gICAgdGhpcy5jb25uZWN0aW9uUGFyZW50U3BhbklkID0gb3B0aW9ucy5wYXJlbnRTcGFuSWQ7XG4gICAgdGhpcy5jb25uZWN0aW9uU2FtcGxlZCA9IG9wdGlvbnMuc2FtcGxlZDtcbiAgICB0aGlzLmV2ZW50U2NoZW1hc0luID0gb3B0aW9ucy5pbkV2ZW50c1tcInNoYXBlXCJdO1xuXG4gICAgbGV0IHJlc29sdmVDbG9zZVByb21pc2UhOiAoKSA9PiB2b2lkO1xuICAgIHRoaXMuY2xvc2VQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHJlc29sdmVDbG9zZVByb21pc2UgPSByZXNvbHZlO1xuICAgIH0pO1xuICAgIHRoaXMucmVzb2x2ZUNsb3NlUHJvbWlzZSA9IHJlc29sdmVDbG9zZVByb21pc2U7XG5cbiAgICAvLyDrpqzsiqTrhIjrpbwg64+Z6riw66GcIOu2meyXrCByZWdpc3RyeSDrk7HroZ3snbQg64Gd64KY6riwIOyghOyXkCDri6vtmIDrj4QgY2xvc2Xrpbwg64aT7LmY7KeAIOyViuuKlOuLpC4g65Ox66Gd7J2AIHJ1bnRpbWXsnbQg7J207Ja07IScIOyImO2Wie2VnOuLpFxuICAgIHRoaXMuc29ja2V0Lm9uKFwibWVzc2FnZVwiLCB0aGlzLmhhbmRsZU1lc3NhZ2UpO1xuICAgIHRoaXMuc29ja2V0Lm9uKFwiY2xvc2VcIiwgdGhpcy5oYW5kbGVDbG9zZSk7XG4gICAgdGhpcy5zb2NrZXQub24oXCJlcnJvclwiLCB0aGlzLmhhbmRsZUVycm9yKTtcbiAgICB0aGlzLnNvY2tldC5vbihcInBvbmdcIiwgdGhpcy5oYW5kbGVQb25nKTtcbiAgICB0aGlzLnN0YXJ0SGVhcnRiZWF0KCk7XG4gIH1cblxuICBnZXQgY2xvc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNsb3NlZEludGVybmFsO1xuICB9XG5cbiAgb25DbG9zZShjYWxsYmFjazogQ2xvc2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIG9uTWVzc2FnZTxLIGV4dGVuZHMga2V5b2YgSW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUSW5TY2hlbWE+PihcbiAgICBldmVudDogSyxcbiAgICBoYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRJblNjaGVtYT5bS10+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBldmVudEtleSA9IFN0cmluZyhldmVudCk7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVycy5nZXQoZXZlbnRLZXkpID8/IFtdO1xuICAgIGhhbmRsZXJzLnB1c2goXG4gICAgICAvKiBTQUZFVFk6IOuTseuhneuQnCBXZWJTb2NrZXQg7J2067Kk7Yq4IOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIGhhbmRsZXIgYXMgTWVzc2FnZUhhbmRsZXI8dW5rbm93bj4sXG4gICAgKTtcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycy5zZXQoZXZlbnRLZXksIGhhbmRsZXJzKTtcbiAgICB0aGlzLmZsdXNoUGVuZGluZ01lc3NhZ2VzKGV2ZW50S2V5KTtcbiAgfVxuXG4gIHB1Ymxpc2g8SyBleHRlbmRzIGtleW9mIEluZmVyV2ViU29ja2V0RXZlbnRNYXA8VE91dFNjaGVtYT4+KFxuICAgIGV2ZW50OiBLLFxuICAgIGRhdGE6IEluZmVyV2ViU29ja2V0RXZlbnRNYXA8VE91dFNjaGVtYT5bS10sXG4gICk6IHZvaWQge1xuICAgIHRoaXMucHVibGlzaFZhbGlkYXRlZChTdHJpbmcoZXZlbnQpLCBkYXRhKTtcbiAgfVxuXG4gIHB1Ymxpc2hVbnR5cGVkPERhdGE+KGV2ZW50OiBzdHJpbmcsIGRhdGE6IERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnB1Ymxpc2hWYWxpZGF0ZWQoZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgd2FpdEZvckNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsb3NlUHJvbWlzZTtcbiAgfVxuXG4gIGpvaW4ocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LmpvaW4odGhpcy5pZCwgcm9vbUlkKTtcbiAgfVxuXG4gIGxlYXZlKHJvb21JZDogV2ViU29ja2V0Um9vbUlkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yZWdpc3RyeS5sZWF2ZSh0aGlzLmlkLCByb29tSWQpO1xuICB9XG5cbiAgc2V0VXNlcklkKHVzZXJJZDogV2ViU29ja2V0VXNlcklkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jdXJyZW50VXNlcklkID0gU3RyaW5nKHVzZXJJZCk7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yZWdpc3RyeS5zZXRVc2VySWQodGhpcy5pZCwgdXNlcklkKTtcbiAgfVxuXG4gIGNsZWFyVXNlcklkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY3VycmVudFVzZXJJZCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LmNsZWFyVXNlcklkKHRoaXMuaWQpO1xuICB9XG5cbiAgLy8gcmVnaXN0cnkgZmFuLW91dOydtCDsnbTrr7gg6rKA7KadwrfsnbjsvZTrlKntlZwgZnJhbWXsnYQg6re464yA66GcIOuztOuCuOuLpFxuICBzZW5kRnJhbWUoZXZlbnQ6IHN0cmluZywgZnJhbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdTX09QRU4pIHtcbiAgICAgIHRoaXMuZW1pdFB1Ymxpc2hEcm9wcGVkKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVucXVldWVPdXRib3VuZE1lc3NhZ2UoZnJhbWUsIGV2ZW50KTtcbiAgfVxuXG4gIGdldFRlbGVtZXRyeVNuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlbmRpbmdJbmJvdW5kTWVzc2FnZXM6IHRoaXMucGVuZGluZ01lc3NhZ2VzLmxlbmd0aCxcbiAgICAgIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiB0aGlzLnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzLmxlbmd0aCxcbiAgICAgIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IFdTX09QRU4gPyB0aGlzLnNvY2tldC5idWZmZXJlZEFtb3VudCA6IDAsXG4gICAgfTtcbiAgfVxuXG4gIGdldFRlbGVtZXRyeUNvbnRleHQoKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICB0cmFjZUlkOiB0aGlzLmNvbm5lY3Rpb25UcmFjZUlkLFxuICAgICAgc3BhbklkOiB0aGlzLmNvbm5lY3Rpb25TcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IHRoaXMuY29ubmVjdGlvblBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IHRoaXMuY29ubmVjdGlvblNhbXBsZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIOuqqOuToCB0ZWxlbWV0cnkgZW1pdCBzaXRl6rCAIOqzteycoO2VmOuKlCBjb25uZWN0aW9uLWxldmVsIGZpZWxkIOustuydjC5cbiAgLy8g7Zal7ZuEIGNvbm5lY3Rpb24tc2NvcGVkIOyLneuzhOyekChlLmcuIHRlbmFudElkKeqwgCDstpTqsIDrkKAg65WMIO2VnCDqs7Prp4wg7IaQ64yA66m0IOuQqFxuICBwcml2YXRlIHRlbGVtZXRyeUZpZWxkcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29ubmVjdGlvbklkOiB0aGlzLmlkLFxuICAgICAgbmFtZXNwYWNlOiB0aGlzLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogdGhpcy5jdXJyZW50VXNlcklkLFxuICAgICAgdHJhY2VJZDogdGhpcy5jb25uZWN0aW9uVHJhY2VJZCxcbiAgICAgIHNwYW5JZDogdGhpcy5jb25uZWN0aW9uU3BhbklkLFxuICAgICAgcGFyZW50U3BhbklkOiB0aGlzLmNvbm5lY3Rpb25QYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiB0aGlzLmNvbm5lY3Rpb25TYW1wbGVkLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVtaXRJbmJvdW5kUmVqZWN0ZWQocmVhc29uOiBzdHJpbmcsIGV2ZW50Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy50ZWxlbWV0cnlGaWVsZHMoKTtcbiAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MubWVzc2FnZS5yZWplY3RlZFwiLFxuICAgICAgbGV2ZWw6IFwid2FyblwiLFxuICAgICAgLi4uZmllbGRzLFxuICAgICAgZGV0YWlsOiBldmVudCAhPT0gdW5kZWZpbmVkID8geyByZWFzb24sIGV2ZW50IH0gOiB7IHJlYXNvbiB9LFxuICAgIH0pO1xuICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZE1ldHJpYyh7XG4gICAgICBuYW1lOiBcInNvbmFtdS53cy5tZXNzYWdlc1wiLFxuICAgICAga2luZDogXCJjb3VudGVyXCIsXG4gICAgICB2YWx1ZTogMSxcbiAgICAgIHVuaXQ6IFwiMVwiLFxuICAgICAgdGFnczogeyBkaXJlY3Rpb246IFwiaW5ib3VuZFwiLCBvdXRjb21lOiBcInJlamVjdGVkXCIgfSxcbiAgICAgIC4uLmZpZWxkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHRyYW5zcG9ydCDsooXro4wg64+E7KSRIOyYiOyZuOqwgCDrgpjrj4QgbWFya0Nsb3NlZOqwgCDrsJjrk5zsi5wg7Iuk7ZaJ65CY64+E66GdIHRyeS9maW5hbGx566GcIOqwkOyMiFxuICBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWRJbnRlcm5hbCB8fCB0aGlzLmNsb3NlU3RhcnRlZCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19DTE9TRUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlU3RhcnRlZCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2xvc2VUcmFuc3BvcnQoY29kZSwgcmVhc29uKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrQ2xvc2VkKGNvZGUsIHJlYXNvbik7XG4gICAgfVxuICB9XG5cbiAgLy8g7J2467CU7Jq065OcIOuplOyLnOyngOulvCDsiJzssKgg7LKY66asIO2BkOyXkCDsmKzrprwuIFNvbmFtdSBlbnZlbG9wZSDqsoDspp0g7IiY7ZaJXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlTWVzc2FnZSA9IChyYXc6IFJhd0RhdGEpID0+IHtcbiAgICB0aGlzLmVucXVldWVNZXNzYWdlVGFzayhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gbm9ybWFsaXplTWVzc2FnZShyYXcpO1xuICAgICAgY29uc3QgcGFyc2VkRW52ZWxvcGUgPSBzYWZlUGFyc2VFbnZlbG9wZSh0ZXh0KTtcbiAgICAgIGlmICghcGFyc2VkRW52ZWxvcGUpIHtcbiAgICAgICAgdGhpcy5lbWl0SW5ib3VuZFJlamVjdGVkKFwiaW52YWxpZFBheWxvYWRcIik7XG4gICAgICAgIHRoaXMuY2xvc2UoV1NfQ0xPU0VfQ09ERV9JTlZBTElEX0ZSQU1FX1BBWUxPQURfREFUQSwgXCJJbnZhbGlkIG1lc3NhZ2UgcGF5bG9hZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLnJlY2VpdmVkXCIsXG4gICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudDogcGFyc2VkRW52ZWxvcGUuZXZlbnQgfSxcbiAgICAgICAgcGF5bG9hZDogcGFyc2VkRW52ZWxvcGUuZGF0YSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LnRvdWNoKHRoaXMuaWQpO1xuICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaEVudmVsb3BlKHBhcnNlZEVudmVsb3BlKTtcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUNsb3NlID0gKGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IEJ1ZmZlciB8IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlYXNvblRleHQgPSBpc1N0cmluZ1ZhbHVlKHJlYXNvbikgPyByZWFzb24gOiByZWFzb24/LnRvU3RyaW5nKCk7XG4gICAgdGhpcy5tYXJrQ2xvc2VkKGNvZGUsIHJlYXNvblRleHQpO1xuICB9O1xuXG4gIC8vIOyGjOy8k+ydtCB0cmFuc3BvcnQgZXJyb3LrpbwgZW1pdO2VmOuptCDsponsi5wgMTAxMSBjbG9zZeuhnCDsiJjroLTsi5zsvJwg7IOB7YOcIOuIhOudveydhCDrp4nsnYxcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVFcnJvciA9ICgpID0+IHtcbiAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfSU5URVJOQUxfRVJST1IsIFwiV2ViU29ja2V0IHRyYW5zcG9ydCBlcnJvclwiKTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZVBvbmcgPSAoKSA9PiB7XG4gICAgdGhpcy5hd2FpdGluZ1BvbmcgPSBmYWxzZTtcbiAgICB0aGlzLm9wdGlvbnMucmVnaXN0cnkudG91Y2godGhpcy5pZCk7XG4gIH07XG5cbiAgLy8gZW52ZWxvcGXsnZggbWV0YS50cmFjZXBhcmVudOuhnOu2gO2EsCB0cmFjZSBjb250ZXh066W8IOy2lOy2nO2VqFxuICAvLyBpbnZhbGlkIHRyYWNlcGFyZW5064qUIOyXsOqysOydhCDqsbDrtoDtlZjsp4Ag7JWK6rOgIGRlYnVnIOugiOuyqCDqsr3qs6Drp4wgZW1pdO2VqFxuICBwcml2YXRlIHJlc29sdmVNZXNzYWdlVHJhY2VDb250ZXh0KFxuICAgIGVudmVsb3BlOiBQYXJzZWRFbnZlbG9wZSxcbiAgKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICAgIGNvbnN0IG1lc3NhZ2VTcGFuSWQgPSBnZW5lcmF0ZVNwYW5JZCgpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZ2V0VHJhY2VPcHRpb25zKCkucHJvcGFnYXRlTWVzc2FnZVRyYWNlICYmXG4gICAgICBlbnZlbG9wZS5tZXRhPy50cmFjZXBhcmVudFxuICAgICkge1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VUcmFjZVBhcmVudChlbnZlbG9wZS5tZXRhLnRyYWNlcGFyZW50KTtcbiAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0cmFjZUlkOiBwYXJzZWQudHJhY2VJZCxcbiAgICAgICAgICBzcGFuSWQ6IG1lc3NhZ2VTcGFuSWQsXG4gICAgICAgICAgcGFyZW50U3BhbklkOiBwYXJzZWQucGFyZW50SWQsXG4gICAgICAgICAgc2FtcGxlZDogcGFyc2VkLnNhbXBsZWQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBpbnZhbGlkIHRyYWNlcGFyZW50OiB3YXJuIGJ1dCBkbyBub3QgcmVqZWN0XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy50cmFjZS5pbnZhbGlkXCIsXG4gICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBzb3VyY2U6IFwibWVzc2FnZVwiLCB0cmFjZXBhcmVudDogZW52ZWxvcGUubWV0YS50cmFjZXBhcmVudCB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNlSWQ6IHRoaXMuY29ubmVjdGlvblRyYWNlSWQsXG4gICAgICBzcGFuSWQ6IG1lc3NhZ2VTcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IHRoaXMuY29ubmVjdGlvblNwYW5JZCA/PyB0aGlzLmNvbm5lY3Rpb25QYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiB0aGlzLmNvbm5lY3Rpb25TYW1wbGVkLFxuICAgIH07XG4gIH1cblxuICAvLyBldmVudCDsobTsnqwg7Jes67aAIOKGkiBzY2hlbWEg6rKA7KadIOKGkiBoYW5kbGVyIOyLpO2WiSDsiJzsnLzroZwg67aE6riw7ZWoXG4gIC8vIGhhbmRsZXLqsIAg7JWE7KeBIOuTseuhneuQmOyngCDslYrsnYAg7LSI6riwIOuplOyLnOyngOuKlCDrsoTtjbzsl5Ag67O06rSA7ZaI64uk6rCAIG9uTWVzc2FnZSDrk7HroZ0g7IucIGZsdXNo7ZWoXG4gIC8vIGhhbmRsZXLripQgYGF3YWl0YOycvOuhnCDsiJzssKgg7Iuk7ZaJ7ZW0IO2VnCBjb25uZWN0aW9uIOyViOydmCDrqZTsi5zsp4Ag7Iic7ISc66W8IOuztOyepe2VqFxuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoRW52ZWxvcGUoZW52ZWxvcGU6IFBhcnNlZEVudmVsb3BlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVycy5nZXQoZW52ZWxvcGUuZXZlbnQpO1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZXZlbnRTY2hlbWFzSW5bZW52ZWxvcGUuZXZlbnRdO1xuXG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRoaXMuZW1pdEluYm91bmRSZWplY3RlZChcInVua25vd25FdmVudFwiLCBlbnZlbG9wZS5ldmVudCk7XG4gICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfUE9MSUNZX1ZJT0xBVElPTiwgXCJVbmtub3duIGV2ZW50XCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5zYWZlUGFyc2UoZW52ZWxvcGUuZGF0YSk7XG4gICAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgdGhpcy5lbWl0SW5ib3VuZFJlamVjdGVkKFwiaW52YWxpZERhdGFcIiwgZW52ZWxvcGUuZXZlbnQpO1xuICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0lOVkFMSURfRlJBTUVfUEFZTE9BRF9EQVRBLCBcIkludmFsaWQgZXZlbnQgZGF0YVwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWhhbmRsZXJzIHx8IGhhbmRsZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMucGVuZGluZ01lc3NhZ2VzLmxlbmd0aCA+PSBNQVhfUEVORElOR19NRVNTQUdFUykge1xuICAgICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgICBuYW1lOiBcIndzLm1lc3NhZ2UuYnVmZmVyLmRyb3BwZWRcIixcbiAgICAgICAgICBsZXZlbDogXCJ3YXJuXCIsXG4gICAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGVudmVsb3BlLmV2ZW50IH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBlbmRpbmdNZXNzYWdlcy5zaGlmdCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5wZW5kaW5nTWVzc2FnZXMucHVzaChlbnZlbG9wZSk7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLmJ1ZmZlcmVkXCIsXG4gICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudDogZW52ZWxvcGUuZXZlbnQgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNlQ3R4ID0gdGhpcy5yZXNvbHZlTWVzc2FnZVRyYWNlQ29udGV4dChlbnZlbG9wZSk7XG4gICAgLy8gbWVzc2FnZS1sZXZlbCB0cmFjZeuKlCBjb25uZWN0aW9uLWxldmVsIHRyYWNl66W8IG92ZXJyaWRl7ZWoLiB1c2VySWQgLyBjb25uZWN0aW9uSWQgLyBuYW1lc3BhY2XripQg6re464yA66GcIOycoOyngFxuICAgIGNvbnN0IG1lc3NhZ2VUcmFjZUZpZWxkcyA9IHtcbiAgICAgIGNvbm5lY3Rpb25JZDogdGhpcy5pZCxcbiAgICAgIG5hbWVzcGFjZTogdGhpcy5uYW1lc3BhY2UsXG4gICAgICB1c2VySWQ6IHRoaXMuY3VycmVudFVzZXJJZCxcbiAgICAgIHRyYWNlSWQ6IHRyYWNlQ3R4LnRyYWNlSWQsXG4gICAgICBzcGFuSWQ6IHRyYWNlQ3R4LnNwYW5JZCxcbiAgICAgIHBhcmVudFNwYW5JZDogdHJhY2VDdHgucGFyZW50U3BhbklkLFxuICAgICAgc2FtcGxlZDogdHJhY2VDdHguc2FtcGxlZCxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgYXdhaXQgaGFuZGxlcihwYXJzZWQuZGF0YSwgdHJhY2VDdHgpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgIG5hbWU6IFwid3MubWVzc2FnZS5kaXNwYXRjaGVkXCIsXG4gICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgIC4uLm1lc3NhZ2VUcmFjZUZpZWxkcyxcbiAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBlbnZlbG9wZS5ldmVudCB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5yZWNvcmRNZXRyaWMoe1xuICAgICAgICBuYW1lOiBcInNvbmFtdS53cy5tZXNzYWdlc1wiLFxuICAgICAgICBraW5kOiBcImNvdW50ZXJcIixcbiAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgIHVuaXQ6IFwiMVwiLFxuICAgICAgICB0YWdzOiB7IGRpcmVjdGlvbjogXCJpbmJvdW5kXCIsIGV2ZW50OiBlbnZlbG9wZS5ldmVudCwgb3V0Y29tZTogXCJhY2NlcHRlZFwiIH0sXG4gICAgICAgIC4uLm1lc3NhZ2VUcmFjZUZpZWxkcyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLmZhaWxlZFwiLFxuICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAuLi5tZXNzYWdlVHJhY2VGaWVsZHMsXG4gICAgICAgIGRldGFpbDogeyBldmVudDogZW52ZWxvcGUuZXZlbnQgfSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaFBlbmRpbmdNZXNzYWdlcyhldmVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcmVtYWluaW5nOiBQYXJzZWRFbnZlbG9wZVtdID0gW107XG4gICAgY29uc3QgdG9GbHVzaDogUGFyc2VkRW52ZWxvcGVbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHRoaXMucGVuZGluZ01lc3NhZ2VzKSB7XG4gICAgICBpZiAobWVzc2FnZS5ldmVudCAhPT0gZXZlbnQpIHtcbiAgICAgICAgcmVtYWluaW5nLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0b0ZsdXNoLnB1c2gobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nTWVzc2FnZXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnBlbmRpbmdNZXNzYWdlcy5wdXNoKC4uLnJlbWFpbmluZyk7XG5cbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgdG9GbHVzaCkge1xuICAgICAgdGhpcy5lbnF1ZXVlTWVzc2FnZVRhc2soYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoRW52ZWxvcGUobWVzc2FnZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHB1Ymxpc2hWYWxpZGF0ZWQ8RGF0YT4oZXZlbnQ6IHN0cmluZywgZGF0YTogRGF0YSk6IHZvaWQge1xuICAgIGNvbnN0IGVuY29kaW5nID0gZW5jb2RlV2ViU29ja2V0RnJhbWUodGhpcy5vdXRFdmVudHMsIGV2ZW50LCBkYXRhKTtcbiAgICBpZiAoZW5jb2Rpbmcuc3RhdHVzID09PSBcInVua25vd25FdmVudFwiKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5wdWJsaXNoLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudCwgcmVhc29uOiBcInVua25vd25FdmVudFwiIH0sXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB3ZWJzb2NrZXQgZXZlbnQ6ICR7ZXZlbnR9YCk7XG4gICAgfVxuXG4gICAgaWYgKGVuY29kaW5nLnN0YXR1cyA9PT0gXCJpbnZhbGlkUGF5bG9hZFwiKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5wdWJsaXNoLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudCwgcmVhc29uOiBcImludmFsaWRQYXlsb2FkXCIgfSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdlYnNvY2tldCBldmVudCBwYXlsb2FkOiAke2V2ZW50fWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdTX09QRU4pIHtcbiAgICAgIHRoaXMuZW1pdFB1Ymxpc2hEcm9wcGVkKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVucXVldWVPdXRib3VuZE1lc3NhZ2UoZW5jb2RpbmcuZnJhbWUsIGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFB1Ymxpc2hEcm9wcGVkKGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MucHVibGlzaC5kcm9wcGVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIGRldGFpbDogeyBldmVudCwgcmVhc29uOiBcImNvbm5lY3Rpb25DbG9zZWRcIiB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gbGlzdGVuZXIg7ZW07KCcIC8gaGVhcnRiZWF0IOykkeuLqCAvIHBlbmRpbmcgcXVldWUg67mE7JuAIC8gcmVnaXN0cnkgdW5yZWdpc3RlciAvIG9uQ2xvc2Ug7Iuk7ZaJIC8gd2FpdEZvckNsb3NlIHJlc29sdmUg7J2EIO2VnCDqs7Psl5Ag66qo7JWEIOybkOyekOyggeycvOuhnCDsspjrpqztlahcbiAgLy8gYXN5bmMgb25DbG9zZeqwgCByZWplY3TtlbTrj4QgdW5oYW5kbGVkIHJlamVjdGlvbuycvOuhnCDsg4jsp4Ag7JWK64+E66GdIGNhdGNo66GcIOqyqeumrO2VqFxuICBwcml2YXRlIG1hcmtDbG9zZWQoY29kZT86IG51bWJlciwgX3JlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZWRJbnRlcm5hbCA9IHRydWU7XG4gICAgdGhpcy5jbG9zZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN0b3BIZWFydGJlYXQoKTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnRlbGVtZXRyeUZpZWxkcygpO1xuICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLmNsb3NlZFwiLFxuICAgICAgbGV2ZWw6IFwiaW5mb1wiLFxuICAgICAgLi4uZmllbGRzLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5nZXRUcmFjZU9wdGlvbnMoKS5yZWNvcmRDb25uZWN0aW9uTGlmZXRpbWVTcGFuKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5yZWNvcmRTcGFuKHtcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5jb25uZWN0aW9uLmxpZmV0aW1lXCIsXG4gICAgICAgIGtpbmQ6IFwic2VydmVyXCIsXG4gICAgICAgIGR1cmF0aW9uTXM6IHBlcmZvcm1hbmNlLm5vdygpIC0gdGhpcy5jb25uZWN0aW9uU3RhcnRlZEF0LFxuICAgICAgICBzdGF0dXM6IGRlcml2ZUxpZmV0aW1lU3RhdHVzKGNvZGUpLFxuICAgICAgICAuLi5maWVsZHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zb2NrZXQub2ZmKFwibWVzc2FnZVwiLCB0aGlzLmhhbmRsZU1lc3NhZ2UpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcImNsb3NlXCIsIHRoaXMuaGFuZGxlQ2xvc2UpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcImVycm9yXCIsIHRoaXMuaGFuZGxlRXJyb3IpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcInBvbmdcIiwgdGhpcy5oYW5kbGVQb25nKTtcbiAgICB0aGlzLmF3YWl0aW5nUG9uZyA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ01lc3NhZ2VzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPSAwO1xuICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyeS51bnJlZ2lzdGVyKHRoaXMuaWQpO1xuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jbG9zZUNhbGxiYWNrcy5zcGxpY2UoMCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKCk7XG4gICAgICAgIGlmIChpc1Byb21pc2VMaWtlKHJlc3VsdCkpIHtcbiAgICAgICAgICB2b2lkIHJlc3VsdC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBhc3luYyBjbG9zZSBjYWxsYmFja3MgbXVzdCBub3QgZXNjYXBlIGFzIHVuaGFuZGxlZCByZWplY3Rpb25zXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBjbG9zZSBjYWxsYmFja3MgbXVzdCBub3QgYmxvY2sgdHJhbnNwb3J0IGNsZWFudXBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZXNvbHZlQ2xvc2VQcm9taXNlKCk7XG4gIH1cblxuICAvLyBwb25n7J20IOyYpOyngCDslYrsnYAg7IOB7YOc7JeQ7IScIOuLpOydjCB0aWNr7J20IOyYpOuptCB0aW1lb3V0IGNsb3Nl66GcIOyymOumrO2VtCB6b21iaWUgY29ubmVjdGlvbuydhCDsoJXrpqztlahcbiAgcHJpdmF0ZSBzdGFydEhlYXJ0YmVhdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oZWFydGJlYXRNcyA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdTX09QRU4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hd2FpdGluZ1BvbmcpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgICAgbmFtZTogXCJ3cy5oZWFydGJlYXQudGltZW91dFwiLFxuICAgICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0dPSU5HX0FXQVksIFwiSGVhcnRiZWF0IHRpbWVvdXRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hd2FpdGluZ1BvbmcgPSB0cnVlO1xuICAgICAgdGhpcy5zb2NrZXQucGluZygpO1xuICAgIH0sIHRoaXMuaGVhcnRiZWF0TXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wSGVhcnRiZWF0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oZWFydGJlYXRUaW1lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydGJlYXRUaW1lcik7XG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IG51bGw7XG4gIH1cblxuICAvLyBjbG9zZeqwgCDsi6TtjKjtlbTrj4QgdGVybWluYXRlIO2PtOuwseq5jOyngCDsi5zrj4TtlZjqs6AsIOuBneuCtCDsi6TtjKjtlZjrqbQgbWFya0Nsb3NlZOyXkCDsg4Htg5wg7KCV66as66W8IOychOyehO2VqFxuICBwcml2YXRlIGNsb3NlVHJhbnNwb3J0KGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gV1NfT1BFTiB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19DT05ORUNUSU5HKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKGNvZGUsIHRydW5jYXRlQ2xvc2VSZWFzb24ocmVhc29uKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQudGVybWluYXRlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyB0cmFuc3BvcnQgaXMgYWxyZWFkeSBicm9rZW47IHN0YXRlIGNsZWFudXAgaXMgaGFuZGxlZCBieSBtYXJrQ2xvc2VkKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDsnbjrsJTsmrTrk5wgaGFuZGxlcuulvCBwcm9taXNlIGNoYWlu7Jy866GcIHNlcmlhbGl6ZSDtlZjqs6AsIGhhbmRsZXIg7JiI7Jm464qUIGNvbm5lY3Rpb24tbG9jYWwgMTAxMSBjbG9zZeuhnCDstpXshoztlahcbiAgcHJpdmF0ZSBlbnF1ZXVlTWVzc2FnZVRhc2sodGFzazogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gdGhpcy5tZXNzYWdlUXVldWVcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkSW50ZXJuYWwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0lOVEVSTkFMX0VSUk9SLCBcIk1lc3NhZ2UgaGFuZGxpbmcgZmFpbGVkXCIpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBxdWV1ZeqwgCDtlZzqs4Tsl5Ag64+E64us7ZWY66m0IDEwMTPsnLzroZwg64ur7JWEIOuKkOumsCDshozruYTsnpDqsIAg66mU66qo66as66W8IOuBneyXhuydtCDsnqHslYTrqLnsp4Ag66q77ZWY6rKMIO2VqFxuICAvLyB0ZWxlbWV0cnkgcHJldmlld+uKlCDsp4HroKztmZTrkJwgcGF5bG9hZOyXkOyEnCDrs7Xsm5DtlbQg7KCE7IahIOuNsOydtO2EsOyZgCDqsJnsnYAgSlNPTiDqs4Tslb3snYQg7Jyg7KeA7ZWoXG4gIHByaXZhdGUgZW5xdWV1ZU91dGJvdW5kTWVzc2FnZShwYXlsb2FkOiBzdHJpbmcsIGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPj0gTUFYX1BFTkRJTkdfT1VUQk9VTkRfTUVTU0FHRVMpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLmJhY2twcmVzc3VyZS5vdmVyZmxvd1wiLFxuICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfVFJZX0FHQUlOX0xBVEVSLCBcIldlYlNvY2tldCBiYWNrcHJlc3N1cmUgb3ZlcmZsb3dcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5wdXNoKHsgcGF5bG9hZCwgZXZlbnQgfSk7XG4gICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICBuYW1lOiBcIndzLnB1Ymxpc2gucXVldWVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIGRldGFpbDogeyBldmVudCB9LFxuICAgICAgcGF5bG9hZDogc2FmZVBhcnNlRW52ZWxvcGUocGF5bG9hZCk/LmRhdGEsXG4gICAgfSk7XG4gICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVPdXRib3VuZEZsdXNoKGRlbGF5TXM6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vdXRib3VuZEZsdXNoU2NoZWR1bGVkIHx8IHRoaXMuY2xvc2VkSW50ZXJuYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm91dGJvdW5kRmx1c2hTY2hlZHVsZWQgPSB0cnVlO1xuICAgIGNvbnN0IGZsdXNoID0gKCkgPT4ge1xuICAgICAgdGhpcy5vdXRib3VuZEZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmZsdXNoT3V0Ym91bmRNZXNzYWdlcygpO1xuICAgIH07XG5cbiAgICBpZiAoZGVsYXlNcyA+IDApIHtcbiAgICAgIHNldFRpbWVvdXQoZmx1c2gsIGRlbGF5TXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldEltbWVkaWF0ZShmbHVzaCk7XG4gIH1cblxuICAvLyBidWZmZXJlZEFtb3VudOqwgCDsnoTqs4TsuZjrpbwg64SY7Jy866m0IGZsdXNo66W8IOuvuOukhCBzb2NrZXQg64K067aAIO2BkOqwgCDthLDsp4Dsp4Ag7JWK64+E66GdIGJhY2twcmVzc3VyZeulvCDsobTspJHtlahcbiAgLy8g7ZWcIOuyiOyXkCDrsLDsuZgg64uo7JyE66Gc66eMIHNlbmTtlbQg64+Z6riwIOujqO2UhOqwgCDsnbTrsqTtirgg66Oo7ZSE66W8IOyepeyLnOqwhCDsoJDsnKDtlZjsp4Ag7JWK6rKMIO2VqFxuICBwcml2YXRlIGZsdXNoT3V0Ym91bmRNZXNzYWdlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWRJbnRlcm5hbCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSBXU19PUEVOKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLmJhY2twcmVzc3VyZS5kZWxheWVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goT1VUQk9VTkRfUkVUUllfREVMQVlfTVMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzZW50ID0gMDtcbiAgICB3aGlsZSAoXG4gICAgICBzZW50IDwgT1VUQk9VTkRfQkFUQ0hfU0laRSAmJlxuICAgICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19PUEVOXG4gICAgKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5zaGlmdCgpO1xuICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBwYXlsb2FkLCBldmVudCB9ID0gbmV4dDtcblxuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnRlbGVtZXRyeUZpZWxkcygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChwYXlsb2FkKTtcbiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgICBuYW1lOiBcIndzLnB1Ymxpc2guc2VudFwiLFxuICAgICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgIGRldGFpbDogeyBldmVudCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkU3Bhbih7XG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5wdWJsaXNoLnNlbmRcIixcbiAgICAgICAgICBraW5kOiBcInByb2R1Y2VyXCIsXG4gICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICBzdGF0dXM6IFwidW5zZXRcIixcbiAgICAgICAgICAuLi5maWVsZHMsXG4gICAgICAgICAgYXR0cmlidXRlczogeyBldmVudCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkTWV0cmljKHtcbiAgICAgICAgICBuYW1lOiBcInNvbmFtdS53cy5wdWJsaXNoZXNcIixcbiAgICAgICAgICBraW5kOiBcImNvdW50ZXJcIixcbiAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICB1bml0OiBcIjFcIixcbiAgICAgICAgICB0YWdzOiB7IG91dGNvbWU6IFwic2VudFwiLCBldmVudCB9LFxuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICAgIG5hbWU6IFwid3MucHVibGlzaC5mYWlsZWRcIixcbiAgICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZFNwYW4oe1xuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MucHVibGlzaC5zZW5kXCIsXG4gICAgICAgICAga2luZDogXCJwcm9kdWNlclwiLFxuICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZXZlbnQgfSxcbiAgICAgICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogcnVudGltZVR5cGVPZihlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfSU5URVJOQUxfRVJST1IsIFwiT3V0Ym91bmQgcHVibGlzaCBmYWlsZWRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VudCArPSAxO1xuICAgICAgaWYgKHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVuZGluZ091dGJvdW5kTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goXG4gICAgICAgIHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQgPyBPVVRCT1VORF9SRVRSWV9ERUxBWV9NUyA6IDAsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVNZXNzYWdlKHJhdzogUmF3RGF0YSk6IHN0cmluZyB7XG4gIGlmIChpc1N0cmluZ1ZhbHVlKHJhdykpIHtcbiAgICByZXR1cm4gcmF3O1xuICB9XG5cbiAgaWYgKHJhdyBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgIHJldHVybiByYXcudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgfVxuXG4gIGlmIChyYXcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShyYXcpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQocmF3LmZpbHRlcigoY2h1bmspOiBjaHVuayBpcyBCdWZmZXIgPT4gY2h1bmsgaW5zdGFuY2VvZiBCdWZmZXIpKS50b1N0cmluZyhcbiAgICAgIFwidXRmLThcIixcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJhdyk7XG59XG5cbmZ1bmN0aW9uIHNhZmVQYXJzZUVudmVsb3BlKHJhdzogc3RyaW5nKTogUGFyc2VkRW52ZWxvcGUgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPVxuICAgICAgLyogU0FGRVRZOiDrk7HroZ3rkJwgV2ViU29ja2V0IOydtOuypO2KuCDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBKU09OLnBhcnNlKFxuICAgICAgICByYXcsXG4gICAgICApIGFzIHVua25vd247XG4gICAgY29uc3QgdmFsaWRhdGVkID0gV2ViU29ja2V0RW52ZWxvcGVTY2hlbWEuc2FmZVBhcnNlKHBhcnNlZCk7XG4gICAgcmV0dXJuIHZhbGlkYXRlZC5zdWNjZXNzID8gdmFsaWRhdGVkLmRhdGEgOiBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBSRkMgNjQ1NeqwgCBjbG9zZSBmcmFtZSByZWFzb27snYQgMTIzIGJ5dGXroZwg7KCc7ZWc7ZWY66+A66GcIOy0iOqzvOu2hOydgCDsnpjrnbwg7KCE7IahIOyLpO2MqOulvCDrsKnsp4DtlahcbmZ1bmN0aW9uIHRydW5jYXRlQ2xvc2VSZWFzb24ocmVhc29uPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyZWFzb24pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKHJlYXNvbiwgXCJ1dGYtOFwiKSA8PSAxMjNcbiAgICA/IHJlYXNvblxuICAgIDogQnVmZmVyLmZyb20ocmVhc29uKS5zdWJhcnJheSgwLCAxMjMpLnRvU3RyaW5nKFwidXRmLThcIik7XG59XG5cbi8vIGNvbm5lY3Rpb24gbGlmZXRpbWUgc3BhbuydmCBzdGF0dXPrpbwgY2xvc2UgY29kZSDquLDspIDsnLzroZwg67aE6riw7ZWoICgxMDAwLzEwMDEg7KCV7IOBIOyiheujjCwg6re4IOyZuCBrbm93biBjb2RlIGVycm9yLCBjb2RlIOuvuOyDgeydgCB1bnNldClcbmZ1bmN0aW9uIGRlcml2ZUxpZmV0aW1lU3RhdHVzKGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCk6IFwib2tcIiB8IFwiZXJyb3JcIiB8IFwidW5zZXRcIiB7XG4gIGlmIChjb2RlID09PSB1bmRlZmluZWQpIHJldHVybiBcInVuc2V0XCI7XG4gIGlmIChjb2RlID09PSAxMDAwIHx8IGNvZGUgPT09IDEwMDEpIHJldHVybiBcIm9rXCI7XG4gIHJldHVybiBcImVycm9yXCI7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBZ1BBLFNBQWdCLHVCQUF1QixVQUFtQyxDQUFDLEdBQXFCO0NBQzlGLE9BQU8sSUFBSSxpQkFBaUIsT0FBTztBQUNyQztBQThwQkEsU0FBUyxpQkFBaUIsS0FBc0I7Q0FDOUMsSUFBSSxjQUFjLEdBQUcsR0FDbkIsT0FBTztDQUdULElBQUksZUFBZSxRQUNqQixPQUFPLElBQUksU0FBUyxPQUFPO0NBRzdCLElBQUksZUFBZSxhQUNqQixPQUFPLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU87Q0FHMUMsSUFBSSxNQUFNLFFBQVEsR0FBRyxHQUNuQixPQUFPLE9BQU8sT0FBTyxJQUFJLFFBQVEsVUFBMkIsaUJBQWlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FDcEYsT0FDRjtDQUdGLE9BQU8sS0FBSyxVQUFVLEdBQUc7QUFDM0I7QUFFQSxTQUFTLGtCQUFrQixLQUFvQztDQUM3RCxJQUFJO0VBQ0YsTUFBTSxTQUNnRCxLQUFLLE1BQ3ZELEdBQ0Y7RUFDRixNQUFNLFlBQVksd0JBQXdCLFVBQVUsTUFBTTtFQUMxRCxPQUFPLFVBQVUsVUFBVSxVQUFVLE9BQU87Q0FDOUMsUUFBUTtFQUNOLE9BQU87Q0FDVDtBQUNGO0FBR0EsU0FBUyxvQkFBb0IsUUFBcUM7Q0FDaEUsSUFBSSxDQUFDLFFBQ0g7Q0FHRixPQUFPLE9BQU8sV0FBVyxRQUFRLE9BQU8sS0FB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
658
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyB0eXBlIEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuXG5pbXBvcnQgeyB0eXBlIFJhd0RhdGEsIHR5cGUgV2ViU29ja2V0IH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBydW50aW1lVHlwZU9mIH0gZnJvbSBcIi4uL3J1bnRpbWUtdHlwZVwiO1xuaW1wb3J0IHsgaXNTdHJpbmdWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0Q2x1c3RlckJ1cyB9IGZyb20gXCIuL3dzLWNsdXN0ZXItYnVzXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldEZyYW1lQ29ubmVjdGlvbiB9IGZyb20gXCIuL3dzLWNvcmVcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0Um91dGVEZWZpbml0aW9uIH0gZnJvbSBcIi4vd3MtZGVsaXZlcnlcIjtcbmltcG9ydCB7IGVuY29kZVdlYlNvY2tldEZyYW1lIH0gZnJvbSBcIi4vd3MtZnJhbWVcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0UHJlc2VuY2VTdG9yZSB9IGZyb20gXCIuL3dzLXByZXNlbmNlLXN0b3JlXCI7XG5pbXBvcnQge1xuICB0eXBlIE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uLFxuICBXZWJTb2NrZXRSZWdpc3RyeSxcbiAgdHlwZSBXZWJTb2NrZXRSZWdpc3RyeU9wdGlvbnMsXG4gIHR5cGUgV2ViU29ja2V0Um9vbUlkLFxuICB0eXBlIFdlYlNvY2tldFVzZXJJZCxcbn0gZnJvbSBcIi4vd3MtcmVnaXN0cnlcIjtcbmltcG9ydCB7IGNyZWF0ZVdlYlNvY2tldE5vZGVJZCwgY3JlYXRlV2ViU29ja2V0U2Vzc2lvbklkIH0gZnJvbSBcIi4vd3Mtc2Vzc2lvbi1pZFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvblNuYXBzaG90LFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0LFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5T3B0aW9ucyxcbiAgdHlwZSBUZWxlbWV0cnlJbnNwZWN0YWJsZUNvbm5lY3Rpb24sXG4gIGNyZWF0ZVdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIsXG4gIGlzUHJvbWlzZUxpa2UsXG59IGZyb20gXCIuL3dzLXRlbGVtZXRyeVwiO1xuaW1wb3J0IHsgcGFyc2VUcmFjZVBhcmVudCwgZ2VuZXJhdGVTcGFuSWQgfSBmcm9tIFwiLi93cy10ZWxlbWV0cnktdHJhY2VcIjtcblxuLy8gdHJhbnNwb3J0LWxldmVsIOyDgeyImOyZgCBxdWV1ZSB0aHJlc2hvbGTrpbwg7ZWcIO2MjOydvOyXkCDrqqjslYQgbGlmZWN5Y2xlL2JhY2twcmVzc3VyZSDsoJXssYXsnYQg7KSR7JWZ7ZmU7ZWoXG5jb25zdCBXU19DT05ORUNUSU5HID0gMDtcbmNvbnN0IFdTX09QRU4gPSAxO1xuY29uc3QgV1NfQ0xPU0VEID0gMztcbi8vIFJGQyA2NDU1IGNsb3NlIGNvZGVzIHVzZWQgYnkgU29uYW11J3MgV2ViU29ja2V0IHJ1bnRpbWUuXG5jb25zdCBXU19DTE9TRV9DT0RFX0dPSU5HX0FXQVkgPSAxMDAxO1xuY29uc3QgV1NfQ0xPU0VfQ09ERV9JTlZBTElEX0ZSQU1FX1BBWUxPQURfREFUQSA9IDEwMDc7XG5jb25zdCBXU19DTE9TRV9DT0RFX1BPTElDWV9WSU9MQVRJT04gPSAxMDA4O1xuY29uc3QgV1NfQ0xPU0VfQ09ERV9JTlRFUk5BTF9FUlJPUiA9IDEwMTE7XG5jb25zdCBXU19DTE9TRV9DT0RFX1RSWV9BR0FJTl9MQVRFUiA9IDEwMTM7XG5jb25zdCBNQVhfUEVORElOR19NRVNTQUdFUyA9IDEwMDtcbmNvbnN0IE1BWF9QRU5ESU5HX09VVEJPVU5EX01FU1NBR0VTID0gMV8wMDA7XG5jb25zdCBNQVhfU09DS0VUX0JVRkZFUkVEX0FNT1VOVCA9IDFfMDQ4XzU3NjtcbmNvbnN0IE9VVEJPVU5EX0JBVENIX1NJWkUgPSA1MDtcbmNvbnN0IE9VVEJPVU5EX1JFVFJZX0RFTEFZX01TID0gNTtcblxuLy8gZW52ZWxvcGXsnYQgYHtldmVudCwgZGF0YX1gIO2Yle2DnOuhnCDqs6DsoJXtlbQgc2VydmVyIGhhbmRsZXLsmYAgZ2VuZXJhdGVkIGNsaWVudOqwgCDqsJnsnYAgZnJhbWluZyBjb250cmFjdOulvCDsk7Dqsowg7ZWoXG4vLyBtZXRh64qUIG9wdGlvbmFs7J2066+A66GcIOq4sOyhtCBge2V2ZW50LCBkYXRhfWAg66mU7Iuc7KeA64+EIOq3uOuMgOuhnCDtjIzsi7HrkKggKGJhY2t3YXJkLWNvbXBhdGlibGUpXG5jb25zdCBXZWJTb2NrZXRFbnZlbG9wZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZXZlbnQ6IHouc3RyaW5nKCksXG4gIGRhdGE6IHouanNvbigpLFxuICBtZXRhOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICB0cmFjZXBhcmVudDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgdHJhY2VzdGF0ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxudHlwZSBNZXNzYWdlSGFuZGxlcjxUPiA9IChcbiAgZGF0YTogVCxcbiAgdGVsZW1ldHJ5Q29udGV4dD86IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0LFxuKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbnR5cGUgQ2xvc2VIYW5kbGVyID0gKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldEV2ZW50TWFwPEV2ZW50UGF5bG9hZCA9IG5ldmVyPiA9IFJlY29yZDxzdHJpbmcsIEV2ZW50UGF5bG9hZD47XG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUcmFuc3BvcnQgPSBQaWNrPFxuICBXZWJTb2NrZXQsXG4gIFwiYnVmZmVyZWRBbW91bnRcIiB8IFwiY2xvc2VcIiB8IFwicGluZ1wiIHwgXCJyZWFkeVN0YXRlXCIgfCBcInNlbmRcIiB8IFwidGVybWluYXRlXCJcbj4gJiB7XG4gIG9mZjogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8RXZlbnRFbWl0dGVyW1wib2ZmXCJdPikgPT4gdm9pZDtcbiAgb246ICguLi5hcmdzOiBQYXJhbWV0ZXJzPEV2ZW50RW1pdHRlcltcIm9uXCJdPikgPT4gdm9pZDtcbn07XG5cbnR5cGUgV2ViU29ja2V0RXZlbnRGaWVsZHMgPSBSZWNvcmQ8c3RyaW5nLCB6LlpvZFR5cGU+O1xudHlwZSBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRTY2hlbWEgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcz4gPSB6LmluZmVyPHouWm9kT2JqZWN0PFRTY2hlbWE+PjtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0T3V0RXZlbnRzPFRPdXQgZXh0ZW5kcyBvYmplY3QgPSBXZWJTb2NrZXRFdmVudE1hcD4gPSBUT3V0O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRJbkV2ZW50czxUSW4gZXh0ZW5kcyBvYmplY3QgPSBXZWJTb2NrZXRFdmVudE1hcD4gPSBUSW47XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0Q29ubmVjdGlvbjxcbiAgVE91dCBleHRlbmRzIG9iamVjdCA9IFdlYlNvY2tldEV2ZW50TWFwLFxuICBUSW4gZXh0ZW5kcyBvYmplY3QgPSBXZWJTb2NrZXRFdmVudE1hcCxcbj4gZXh0ZW5kcyBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiB7XG4gIHRyYW5zcG9ydDogXCJ3c1wiO1xuICBvbkNsb3NlKGNhbGxiYWNrOiBDbG9zZUhhbmRsZXIpOiB2b2lkO1xuICBvbk1lc3NhZ2U8SyBleHRlbmRzIGtleW9mIFdlYlNvY2tldEluRXZlbnRzPFRJbj4+KFxuICAgIGV2ZW50OiBLLFxuICAgIGhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyPFdlYlNvY2tldEluRXZlbnRzPFRJbj5bS10+LFxuICApOiB2b2lkO1xuICBwdWJsaXNoPEsgZXh0ZW5kcyBrZXlvZiBXZWJTb2NrZXRPdXRFdmVudHM8VE91dD4+KFxuICAgIGV2ZW50OiBLLFxuICAgIGRhdGE6IFdlYlNvY2tldE91dEV2ZW50czxUT3V0PltLXSxcbiAgKTogdm9pZDtcbiAgd2FpdEZvckNsb3NlKCk6IFByb21pc2U8dm9pZD47XG4gIC8vIOyVhOuemCBtdXRhdGlvbuydgCDrqZTrqqjrpqzrpbwg7KaJ7IucIOqwseyLoO2VmOqzoCwgc3RvcmUg67CY7JiB7J20IOuBneuCmOuptCByZXNvbHZl7ZWc64ukLiByZWplY3TtlZjsp4Ag7JWK64qU64ukXG4gIGpvaW4ocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiBQcm9taXNlPHZvaWQ+O1xuICBsZWF2ZShyb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IFByb21pc2U8dm9pZD47XG4gIHNldFVzZXJJZCh1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCk6IFByb21pc2U8dm9pZD47XG4gIGNsZWFyVXNlcklkKCk6IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCB0eXBlIEFueVdlYlNvY2tldENvbm5lY3Rpb24gPSBXZWJTb2NrZXRDb25uZWN0aW9uPG9iamVjdCwgb2JqZWN0PjtcblxudHlwZSBQYXJzZWRFbnZlbG9wZSA9IHouaW5mZXI8dHlwZW9mIFdlYlNvY2tldEVudmVsb3BlU2NoZW1hPjtcblxudHlwZSBXZWJTb2NrZXRDb25uZWN0aW9uT3B0aW9uczxcbiAgVE91dCBleHRlbmRzIFdlYlNvY2tldEV2ZW50RmllbGRzLFxuICBUSW4gZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcyxcbj4gPSB7XG4gIC8vIHJvdXRlIHRhYmxlIO2CpCjrs7TthrUgQVBJIHBhdGgpLiDsm5Dqsqkg64W465Oc6rCAIOuztOuCuCBlbnZlbG9wZeyXkOyEnCDsnbQg7Jew6rKw7J20IOuwm+ydhCBmcmFtZeydhCDqs6Drpbwg65WMIOyTtOuLpFxuICByb3V0ZUtleT86IHN0cmluZztcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBoZWFydGJlYXQ/OiBudW1iZXI7XG4gIGFjdGl2ZT86IGJvb2xlYW47XG4gIG91dEV2ZW50czogei5ab2RPYmplY3Q8VE91dD47XG4gIGluRXZlbnRzOiB6LlpvZE9iamVjdDxUSW4+O1xuICByZWdpc3RyeTogV2ViU29ja2V0UmVnaXN0cnk7XG4gIHRlbGVtZXRyeUNvbnRyb2xsZXI6IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFJ1bnRpbWVPcHRpb25zID0ge1xuICBub2RlSWQ/OiBzdHJpbmc7XG4gIHByZXNlbmNlU3RvcmU/OiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICBjbHVzdGVyQnVzPzogV2ViU29ja2V0Q2x1c3RlckJ1cztcbiAgdGVsZW1ldHJ5PzogYm9vbGVhbiB8IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnM7XG4gIC8vIHNodXRkb3duIOyLnCDsp4Ttlokg7KSR7J24IHN0b3JlIG11dGF0aW9u6rO8IHB1Ymxpc2jrpbwg6riw64uk66as64qUIOyDge2VnC4g6riw67O46rCSIDUwMDBtc1xuICBkcmFpblRpbWVvdXRNcz86IG51bWJlcjtcbn07XG5cbi8vIHJlZ2lzdHJ566W8IOyGjOycoO2VmOqzoCBjb25uZWN0aW9uIOyDneyEsS9zaHV0ZG93buydhCDri7Tri7ntlaguIFNvbmFtdSDslaDtlIzrpqzsvIDsnbTshZgg7IiY66qF7KO86riw7JmAIOqwmeydtCDsm4Dsp4HsnbTrj4TroZ0g7ISk6rOE7ZWoXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0UnVudGltZSB7XG4gIHJlYWRvbmx5IHJlZ2lzdHJ5OiBXZWJTb2NrZXRSZWdpc3RyeTtcbiAgcmVhZG9ubHkgdGVsZW1ldHJ5Q29udHJvbGxlcjogV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBXZWJTb2NrZXRSdW50aW1lT3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gbm9kZUlk66W8IOyjvOyngCDslYrsnLzrqbQgc3RvcmUvYnVz6rCAIOqwgOynhCBub2RlSWTrpbwg65Sw66W06rOgLCDrkZgg64ukIOyXhuycvOuptCBob3N0bmFtZS1waWQt656c642k7Jy866GcIOunjOuToOuLpC5cbiAgICAvLyBzdG9yZeuCmCBidXPsnZggbm9kZUlk6rCAIOydtCDqsJLqs7wg64uk66W066m0IHJlZ2lzdHJ5IOyDneyEsSDsi5wg7KaJ7IucIOyLpO2MqO2VnOuLpFxuICAgIGNvbnN0IHJlc29sdmVkTm9kZUlkID1cbiAgICAgIG9wdGlvbnMubm9kZUlkID8/XG4gICAgICBvcHRpb25zLnByZXNlbmNlU3RvcmU/Lm5vZGVJZCA/P1xuICAgICAgb3B0aW9ucy5jbHVzdGVyQnVzPy5ub2RlSWQgPz9cbiAgICAgIGNyZWF0ZVdlYlNvY2tldE5vZGVJZCgpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlciA9IGNyZWF0ZVdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIob3B0aW9ucy50ZWxlbWV0cnksIHtcbiAgICAgIHJ1bnRpbWVJZDogcmFuZG9tVVVJRCgpLFxuICAgICAgbm9kZUlkOiByZXNvbHZlZE5vZGVJZCxcbiAgICB9KTtcbiAgICBjb25zdCByZWdpc3RyeU9wdGlvbnM6IFdlYlNvY2tldFJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgICAgIG5vZGVJZDogcmVzb2x2ZWROb2RlSWQsXG4gICAgICBwcmVzZW5jZVN0b3JlOiBvcHRpb25zLnByZXNlbmNlU3RvcmUsXG4gICAgICBjbHVzdGVyQnVzOiBvcHRpb25zLmNsdXN0ZXJCdXMsXG4gICAgICB0ZWxlbWV0cnlDb250cm9sbGVyOiB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIsXG4gICAgICBkcmFpblRpbWVvdXRNczogb3B0aW9ucy5kcmFpblRpbWVvdXRNcyxcbiAgICB9O1xuICAgIHRoaXMucmVnaXN0cnkgPSBuZXcgV2ViU29ja2V0UmVnaXN0cnkocmVnaXN0cnlPcHRpb25zKTtcbiAgfVxuXG4gIC8vIHJvdXRlS2V567OEIG91dEV2ZW50c+ulvCDrk7HroZ3tlZzri6QuIOqwmeydgCDtgqTroZwg64uk7IucIO2YuOy2nO2VmOuptCDsiqTtgqTrp4jrpbwg6rWQ7LK07ZWc64ukXG4gIHJlZ2lzdGVyUm91dGUocm91dGVLZXk6IHN0cmluZywgcm91dGU6IHsgb3V0RXZlbnRzOiB6LlpvZE9iamVjdCB9KTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RyeS5yZWdpc3RlclJvdXRlKHJvdXRlS2V5LCByb3V0ZS5vdXRFdmVudHMpO1xuICB9XG5cbiAgLy8gcm91dGUgdGFibGUg7KCE7LK066W8IOq1kOyytO2VnOuLpC4g66qp66Gd7JeQIOyXhuuKlCByb3V0ZUtleeuKlCDsoJzqsbDrkJzri6RcbiAgcmVwbGFjZVJvdXRlcyhyb3V0ZXM6IFdlYlNvY2tldFJvdXRlRGVmaW5pdGlvbltdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RyeS5yZXBsYWNlUm91dGVzKHJvdXRlcyk7XG4gIH1cblxuICAvKipcbiAgICog7IaM7LyTIOumrOyKpOuEiOulvCDrj5nquLDroZwg67aZ7J206rOgIHJlZ2lzdHJ57JeQIOuTseuhne2VnOuLpC4gc3RvcmUucmVnaXN0ZXLqsIAg64Gd64KY66m0KOyLpO2MqO2VtOuPhCkgcmVzb2x2Ze2VnOuLpC5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyQ29ubmVjdGlvbjxcbiAgICBUT3V0U2NoZW1hIGV4dGVuZHMgV2ViU29ja2V0RXZlbnRGaWVsZHMsXG4gICAgVEluU2NoZW1hIGV4dGVuZHMgV2ViU29ja2V0RXZlbnRGaWVsZHMsXG4gID4oXG4gICAgc29ja2V0OiBXZWJTb2NrZXRUcmFuc3BvcnQsXG4gICAgb3B0aW9uczogT21pdDxcbiAgICAgIFdlYlNvY2tldENvbm5lY3Rpb25PcHRpb25zPFRPdXRTY2hlbWEsIFRJblNjaGVtYT4sXG4gICAgICBcInJlZ2lzdHJ5XCIgfCBcInRlbGVtZXRyeUNvbnRyb2xsZXJcIlxuICAgID4sXG4gICk6IFByb21pc2U8XG4gICAgV2ViU29ja2V0Q29ubmVjdGlvbjxJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRPdXRTY2hlbWE+LCBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRJblNjaGVtYT4+XG4gID4ge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBuZXcgV2ViU29ja2V0Q29ubmVjdGlvbkltcGwoc29ja2V0LCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgcmVnaXN0cnk6IHRoaXMucmVnaXN0cnksXG4gICAgICB0ZWxlbWV0cnlDb250cm9sbGVyOiB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIsXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5yZWdpc3RyeS5yZWdpc3Rlcihjb25uZWN0aW9uLCBvcHRpb25zLmFjdGl2ZSA/PyB0cnVlKTtcbiAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgfVxuXG4gIGFjdGl2YXRlQ29ubmVjdGlvbihjb25uZWN0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmFjdGl2YXRlKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBicm9hZGNhc3Q8RGF0YT4oZXZlbnQ6IHN0cmluZywgZGF0YTogRGF0YSwgbmFtZXNwYWNlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuYnJvYWRjYXN0KGV2ZW50LCBkYXRhLCBuYW1lc3BhY2UpO1xuICB9XG5cbiAgcHVibGlzaFRvUm9vbTxEYXRhPihcbiAgICByb29tSWQ6IFdlYlNvY2tldFJvb21JZCxcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRhdGE6IERhdGEsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5wdWJsaXNoVG9Sb29tKHJvb21JZCwgZXZlbnQsIGRhdGEsIG5hbWVzcGFjZSk7XG4gIH1cblxuICBwdWJsaXNoVG9Vc2VyPERhdGE+KFxuICAgIHVzZXJJZDogV2ViU29ja2V0VXNlcklkLFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgZGF0YTogRGF0YSxcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnB1Ymxpc2hUb1VzZXIodXNlcklkLCBldmVudCwgZGF0YSwgbmFtZXNwYWNlKTtcbiAgfVxuXG4gIHB1Ymxpc2hUb0F1ZGllbmNlPERhdGE+KGF1ZGllbmNlOiBXZWJTb2NrZXRBdWRpZW5jZSwgZXZlbnQ6IHN0cmluZywgZGF0YTogRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnB1Ymxpc2hUb0F1ZGllbmNlKGF1ZGllbmNlLCBldmVudCwgZGF0YSk7XG4gIH1cblxuICAvLyDtlITroZzshLjsiqQg7KKF66OMIOyLnCDsgrTslYTsnojripQg7Jew6rKw7J20IOuCqOyngCDslYrrj4TroZ0gcmVnaXN0cnnrpbwg7Iic7ZqM7ZW0IOydvOq0hCDsooXro4ztlahcbiAgYXN5bmMgc2h1dGRvd24oXG4gICAgY29kZTogbnVtYmVyID0gV1NfQ0xPU0VfQ09ERV9HT0lOR19BV0FZLFxuICAgIHJlYXNvbiA9IFwiU2VydmVyIHNodXR0aW5nIGRvd25cIixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWdpc3RyeS5zaHV0ZG93bihjb2RlLCByZWFzb24pO1xuICAgIGF3YWl0IHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5zaHV0ZG93bigpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTb2NrZXRSdW50aW1lKG9wdGlvbnM6IFdlYlNvY2tldFJ1bnRpbWVPcHRpb25zID0ge30pOiBXZWJTb2NrZXRSdW50aW1lIHtcbiAgcmV0dXJuIG5ldyBXZWJTb2NrZXRSdW50aW1lKG9wdGlvbnMpO1xufVxuXG5jbGFzcyBXZWJTb2NrZXRDb25uZWN0aW9uSW1wbDxcbiAgVE91dFNjaGVtYSBleHRlbmRzIFdlYlNvY2tldEV2ZW50RmllbGRzLFxuICBUSW5TY2hlbWEgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcyxcbj5cbiAgaW1wbGVtZW50c1xuICAgIFdlYlNvY2tldENvbm5lY3Rpb248SW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUT3V0U2NoZW1hPiwgSW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUSW5TY2hlbWE+PixcbiAgICBXZWJTb2NrZXRGcmFtZUNvbm5lY3Rpb24sXG4gICAgVGVsZW1ldHJ5SW5zcGVjdGFibGVDb25uZWN0aW9uLFxuICAgIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlclxue1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSB0cmFuc3BvcnQgPSBcIndzXCI7XG4gIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuICByZWFkb25seSByb3V0ZUtleT86IHN0cmluZztcbiAgcmVhZG9ubHkgb3V0RXZlbnRzOiB6LlpvZE9iamVjdDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNsb3NlQ2FsbGJhY2tzOiBDbG9zZUhhbmRsZXJbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxNZXNzYWdlSGFuZGxlcjx1bmtub3duPj4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ01lc3NhZ2VzOiBQYXJzZWRFbnZlbG9wZVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ091dGJvdW5kTWVzc2FnZXM6IEFycmF5PHsgcGF5bG9hZDogc3RyaW5nOyBldmVudDogc3RyaW5nIH0+ID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xvc2VQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVDbG9zZVByb21pc2U6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGVhcnRiZWF0TXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudFNjaGVtYXNJbjogUmVjb3JkPHN0cmluZywgei5ab2RUeXBlQW55PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25UcmFjZUlkPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25TcGFuSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aW9uU2FtcGxlZD86IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gIC8vIGNvbm5lY3Rpb24g7IiY66qFIOuPmeyViCDsnKDsp4DrkJjripQg7Iud67OE7J6QLiBzZXRVc2VySWQvY2xlYXJVc2VySWTroZwg7JeF642w7J207Yq465CY66mwIGVtaXQgaG90IHBhdGjsl5DshJwg66ek67KIIHJlZ2lzdHJ5IGxvb2t1cO2VmOyngCDslYrrj4TroZ0g7LqQ7Iuc7ZWoXG4gIHByaXZhdGUgY3VycmVudFVzZXJJZD86IHN0cmluZztcblxuICBnZXQgdXNlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXJJZDtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VkSW50ZXJuYWwgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbG9zZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhd2FpdGluZ1BvbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBoZWFydGJlYXRUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzc2FnZVF1ZXVlOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHByaXZhdGUgb3V0Ym91bmRGbHVzaFNjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc29ja2V0OiBXZWJTb2NrZXRUcmFuc3BvcnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBXZWJTb2NrZXRDb25uZWN0aW9uT3B0aW9uczxUT3V0U2NoZW1hLCBUSW5TY2hlbWE+LFxuICApIHtcbiAgICB0aGlzLmlkID0gY3JlYXRlV2ViU29ja2V0U2Vzc2lvbklkKG9wdGlvbnMucmVnaXN0cnkubm9kZUlkKTtcbiAgICB0aGlzLnJvdXRlS2V5ID0gb3B0aW9ucy5yb3V0ZUtleTtcbiAgICB0aGlzLm91dEV2ZW50cyA9IG9wdGlvbnMub3V0RXZlbnRzO1xuICAgIHRoaXMubmFtZXNwYWNlID0gb3B0aW9ucy5uYW1lc3BhY2UgPz8gXCJkZWZhdWx0XCI7XG4gICAgdGhpcy5oZWFydGJlYXRNcyA9IG9wdGlvbnMuaGVhcnRiZWF0ID8/IDMwMDAwO1xuICAgIHRoaXMuY29ubmVjdGlvblRyYWNlSWQgPSBvcHRpb25zLnRyYWNlSWQ7XG4gICAgdGhpcy5jb25uZWN0aW9uU3BhbklkID0gb3B0aW9ucy5zcGFuSWQ7XG4gICAgdGhpcy5jb25uZWN0aW9uUGFyZW50U3BhbklkID0gb3B0aW9ucy5wYXJlbnRTcGFuSWQ7XG4gICAgdGhpcy5jb25uZWN0aW9uU2FtcGxlZCA9IG9wdGlvbnMuc2FtcGxlZDtcbiAgICB0aGlzLmV2ZW50U2NoZW1hc0luID0gb3B0aW9ucy5pbkV2ZW50c1tcInNoYXBlXCJdO1xuXG4gICAgbGV0IHJlc29sdmVDbG9zZVByb21pc2UhOiAoKSA9PiB2b2lkO1xuICAgIHRoaXMuY2xvc2VQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHJlc29sdmVDbG9zZVByb21pc2UgPSByZXNvbHZlO1xuICAgIH0pO1xuICAgIHRoaXMucmVzb2x2ZUNsb3NlUHJvbWlzZSA9IHJlc29sdmVDbG9zZVByb21pc2U7XG5cbiAgICAvLyDrpqzsiqTrhIjrpbwg64+Z6riw66GcIOu2meyXrCByZWdpc3RyeSDrk7HroZ3snbQg64Gd64KY6riwIOyghOyXkCDri6vtmIDrj4QgY2xvc2Xrpbwg64aT7LmY7KeAIOyViuuKlOuLpC4g65Ox66Gd7J2AIHJ1bnRpbWXsnbQg7J207Ja07IScIOyImO2Wie2VnOuLpFxuICAgIHRoaXMuc29ja2V0Lm9uKFwibWVzc2FnZVwiLCB0aGlzLmhhbmRsZU1lc3NhZ2UpO1xuICAgIHRoaXMuc29ja2V0Lm9uKFwiY2xvc2VcIiwgdGhpcy5oYW5kbGVDbG9zZSk7XG4gICAgdGhpcy5zb2NrZXQub24oXCJlcnJvclwiLCB0aGlzLmhhbmRsZUVycm9yKTtcbiAgICB0aGlzLnNvY2tldC5vbihcInBvbmdcIiwgdGhpcy5oYW5kbGVQb25nKTtcbiAgICB0aGlzLnN0YXJ0SGVhcnRiZWF0KCk7XG4gIH1cblxuICBnZXQgY2xvc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNsb3NlZEludGVybmFsO1xuICB9XG5cbiAgb25DbG9zZShjYWxsYmFjazogQ2xvc2VIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIG9uTWVzc2FnZTxLIGV4dGVuZHMga2V5b2YgSW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUSW5TY2hlbWE+PihcbiAgICBldmVudDogSyxcbiAgICBoYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRJblNjaGVtYT5bS10+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBldmVudEtleSA9IFN0cmluZyhldmVudCk7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVycy5nZXQoZXZlbnRLZXkpID8/IFtdO1xuICAgIGhhbmRsZXJzLnB1c2goXG4gICAgICAvKiBTQUZFVFk6IOuTseuhneuQnCBXZWJTb2NrZXQg7J2067Kk7Yq4IOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIGhhbmRsZXIgYXMgTWVzc2FnZUhhbmRsZXI8dW5rbm93bj4sXG4gICAgKTtcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycy5zZXQoZXZlbnRLZXksIGhhbmRsZXJzKTtcbiAgICB0aGlzLmZsdXNoUGVuZGluZ01lc3NhZ2VzKGV2ZW50S2V5KTtcbiAgfVxuXG4gIHB1Ymxpc2g8SyBleHRlbmRzIGtleW9mIEluZmVyV2ViU29ja2V0RXZlbnRNYXA8VE91dFNjaGVtYT4+KFxuICAgIGV2ZW50OiBLLFxuICAgIGRhdGE6IEluZmVyV2ViU29ja2V0RXZlbnRNYXA8VE91dFNjaGVtYT5bS10sXG4gICk6IHZvaWQge1xuICAgIHRoaXMucHVibGlzaFZhbGlkYXRlZChTdHJpbmcoZXZlbnQpLCBkYXRhKTtcbiAgfVxuXG4gIHB1Ymxpc2hVbnR5cGVkPERhdGE+KGV2ZW50OiBzdHJpbmcsIGRhdGE6IERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnB1Ymxpc2hWYWxpZGF0ZWQoZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgd2FpdEZvckNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsb3NlUHJvbWlzZTtcbiAgfVxuXG4gIGpvaW4ocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LmpvaW4odGhpcy5pZCwgcm9vbUlkKTtcbiAgfVxuXG4gIGxlYXZlKHJvb21JZDogV2ViU29ja2V0Um9vbUlkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yZWdpc3RyeS5sZWF2ZSh0aGlzLmlkLCByb29tSWQpO1xuICB9XG5cbiAgc2V0VXNlcklkKHVzZXJJZDogV2ViU29ja2V0VXNlcklkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jdXJyZW50VXNlcklkID0gU3RyaW5nKHVzZXJJZCk7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yZWdpc3RyeS5zZXRVc2VySWQodGhpcy5pZCwgdXNlcklkKTtcbiAgfVxuXG4gIGNsZWFyVXNlcklkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY3VycmVudFVzZXJJZCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LmNsZWFyVXNlcklkKHRoaXMuaWQpO1xuICB9XG5cbiAgLy8gcmVnaXN0cnkgZmFuLW91dOydtCDsnbTrr7gg6rKA7KadwrfsnbjsvZTrlKntlZwgZnJhbWXsnYQg6re464yA66GcIOuztOuCuOuLpFxuICBzZW5kRnJhbWUoZXZlbnQ6IHN0cmluZywgZnJhbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdTX09QRU4pIHtcbiAgICAgIHRoaXMuZW1pdFB1Ymxpc2hEcm9wcGVkKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVucXVldWVPdXRib3VuZE1lc3NhZ2UoZnJhbWUsIGV2ZW50KTtcbiAgfVxuXG4gIGdldFRlbGVtZXRyeVNuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlbmRpbmdJbmJvdW5kTWVzc2FnZXM6IHRoaXMucGVuZGluZ01lc3NhZ2VzLmxlbmd0aCxcbiAgICAgIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiB0aGlzLnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzLmxlbmd0aCxcbiAgICAgIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IFdTX09QRU4gPyB0aGlzLnNvY2tldC5idWZmZXJlZEFtb3VudCA6IDAsXG4gICAgfTtcbiAgfVxuXG4gIGdldFRlbGVtZXRyeUNvbnRleHQoKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICB0cmFjZUlkOiB0aGlzLmNvbm5lY3Rpb25UcmFjZUlkLFxuICAgICAgc3BhbklkOiB0aGlzLmNvbm5lY3Rpb25TcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IHRoaXMuY29ubmVjdGlvblBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IHRoaXMuY29ubmVjdGlvblNhbXBsZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIOuqqOuToCB0ZWxlbWV0cnkgZW1pdCBzaXRl6rCAIOqzteycoO2VmOuKlCBjb25uZWN0aW9uLWxldmVsIGZpZWxkIOustuydjC5cbiAgLy8g7Zal7ZuEIGNvbm5lY3Rpb24tc2NvcGVkIOyLneuzhOyekChlLmcuIHRlbmFudElkKeqwgCDstpTqsIDrkKAg65WMIO2VnCDqs7Prp4wg7IaQ64yA66m0IOuQqFxuICBwcml2YXRlIHRlbGVtZXRyeUZpZWxkcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29ubmVjdGlvbklkOiB0aGlzLmlkLFxuICAgICAgbmFtZXNwYWNlOiB0aGlzLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogdGhpcy5jdXJyZW50VXNlcklkLFxuICAgICAgdHJhY2VJZDogdGhpcy5jb25uZWN0aW9uVHJhY2VJZCxcbiAgICAgIHNwYW5JZDogdGhpcy5jb25uZWN0aW9uU3BhbklkLFxuICAgICAgcGFyZW50U3BhbklkOiB0aGlzLmNvbm5lY3Rpb25QYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiB0aGlzLmNvbm5lY3Rpb25TYW1wbGVkLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVtaXRJbmJvdW5kUmVqZWN0ZWQocmVhc29uOiBzdHJpbmcsIGV2ZW50Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy50ZWxlbWV0cnlGaWVsZHMoKTtcbiAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MubWVzc2FnZS5yZWplY3RlZFwiLFxuICAgICAgbGV2ZWw6IFwid2FyblwiLFxuICAgICAgLi4uZmllbGRzLFxuICAgICAgZGV0YWlsOiBldmVudCAhPT0gdW5kZWZpbmVkID8geyByZWFzb24sIGV2ZW50IH0gOiB7IHJlYXNvbiB9LFxuICAgIH0pO1xuICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZE1ldHJpYyh7XG4gICAgICBuYW1lOiBcInNvbmFtdS53cy5tZXNzYWdlc1wiLFxuICAgICAga2luZDogXCJjb3VudGVyXCIsXG4gICAgICB2YWx1ZTogMSxcbiAgICAgIHVuaXQ6IFwiMVwiLFxuICAgICAgdGFnczogeyBkaXJlY3Rpb246IFwiaW5ib3VuZFwiLCBvdXRjb21lOiBcInJlamVjdGVkXCIgfSxcbiAgICAgIC4uLmZpZWxkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHRyYW5zcG9ydCDsooXro4wg64+E7KSRIOyYiOyZuOqwgCDrgpjrj4QgbWFya0Nsb3NlZOqwgCDrsJjrk5zsi5wg7Iuk7ZaJ65CY64+E66GdIHRyeS9maW5hbGx566GcIOqwkOyMiFxuICBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWRJbnRlcm5hbCB8fCB0aGlzLmNsb3NlU3RhcnRlZCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19DTE9TRUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlU3RhcnRlZCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2xvc2VUcmFuc3BvcnQoY29kZSwgcmVhc29uKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrQ2xvc2VkKGNvZGUsIHJlYXNvbik7XG4gICAgfVxuICB9XG5cbiAgLy8g7J2467CU7Jq065OcIOuplOyLnOyngOulvCDsiJzssKgg7LKY66asIO2BkOyXkCDsmKzrprwuIFNvbmFtdSBlbnZlbG9wZSDqsoDspp0g7IiY7ZaJXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlTWVzc2FnZSA9IChyYXc6IFJhd0RhdGEpID0+IHtcbiAgICB0aGlzLmVucXVldWVNZXNzYWdlVGFzayhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gbm9ybWFsaXplTWVzc2FnZShyYXcpO1xuICAgICAgY29uc3QgcGFyc2VkRW52ZWxvcGUgPSBzYWZlUGFyc2VFbnZlbG9wZSh0ZXh0KTtcbiAgICAgIGlmICghcGFyc2VkRW52ZWxvcGUpIHtcbiAgICAgICAgdGhpcy5lbWl0SW5ib3VuZFJlamVjdGVkKFwiaW52YWxpZFBheWxvYWRcIik7XG4gICAgICAgIHRoaXMuY2xvc2UoV1NfQ0xPU0VfQ09ERV9JTlZBTElEX0ZSQU1FX1BBWUxPQURfREFUQSwgXCJJbnZhbGlkIG1lc3NhZ2UgcGF5bG9hZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLnJlY2VpdmVkXCIsXG4gICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudDogcGFyc2VkRW52ZWxvcGUuZXZlbnQgfSxcbiAgICAgICAgcGF5bG9hZDogcGFyc2VkRW52ZWxvcGUuZGF0YSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LnRvdWNoKHRoaXMuaWQpO1xuICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaEVudmVsb3BlKHBhcnNlZEVudmVsb3BlKTtcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUNsb3NlID0gKGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IEJ1ZmZlciB8IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlYXNvblRleHQgPSBpc1N0cmluZ1ZhbHVlKHJlYXNvbikgPyByZWFzb24gOiByZWFzb24/LnRvU3RyaW5nKCk7XG4gICAgdGhpcy5tYXJrQ2xvc2VkKGNvZGUsIHJlYXNvblRleHQpO1xuICB9O1xuXG4gIC8vIOyGjOy8k+ydtCB0cmFuc3BvcnQgZXJyb3LrpbwgZW1pdO2VmOuptCDsponsi5wgMTAxMSBjbG9zZeuhnCDsiJjroLTsi5zsvJwg7IOB7YOcIOuIhOudveydhCDrp4nsnYxcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVFcnJvciA9ICgpID0+IHtcbiAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfSU5URVJOQUxfRVJST1IsIFwiV2ViU29ja2V0IHRyYW5zcG9ydCBlcnJvclwiKTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZVBvbmcgPSAoKSA9PiB7XG4gICAgdGhpcy5hd2FpdGluZ1BvbmcgPSBmYWxzZTtcbiAgICB0aGlzLm9wdGlvbnMucmVnaXN0cnkudG91Y2godGhpcy5pZCk7XG4gIH07XG5cbiAgLy8gZW52ZWxvcGXsnZggbWV0YS50cmFjZXBhcmVudOuhnOu2gO2EsCB0cmFjZSBjb250ZXh066W8IOy2lOy2nO2VqFxuICAvLyBpbnZhbGlkIHRyYWNlcGFyZW5064qUIOyXsOqysOydhCDqsbDrtoDtlZjsp4Ag7JWK6rOgIGRlYnVnIOugiOuyqCDqsr3qs6Drp4wgZW1pdO2VqFxuICBwcml2YXRlIHJlc29sdmVNZXNzYWdlVHJhY2VDb250ZXh0KFxuICAgIGVudmVsb3BlOiBQYXJzZWRFbnZlbG9wZSxcbiAgKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICAgIGNvbnN0IG1lc3NhZ2VTcGFuSWQgPSBnZW5lcmF0ZVNwYW5JZCgpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZ2V0VHJhY2VPcHRpb25zKCkucHJvcGFnYXRlTWVzc2FnZVRyYWNlICYmXG4gICAgICBlbnZlbG9wZS5tZXRhPy50cmFjZXBhcmVudFxuICAgICkge1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VUcmFjZVBhcmVudChlbnZlbG9wZS5tZXRhLnRyYWNlcGFyZW50KTtcbiAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0cmFjZUlkOiBwYXJzZWQudHJhY2VJZCxcbiAgICAgICAgICBzcGFuSWQ6IG1lc3NhZ2VTcGFuSWQsXG4gICAgICAgICAgcGFyZW50U3BhbklkOiBwYXJzZWQucGFyZW50SWQsXG4gICAgICAgICAgc2FtcGxlZDogcGFyc2VkLnNhbXBsZWQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBpbnZhbGlkIHRyYWNlcGFyZW50OiB3YXJuIGJ1dCBkbyBub3QgcmVqZWN0XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy50cmFjZS5pbnZhbGlkXCIsXG4gICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBzb3VyY2U6IFwibWVzc2FnZVwiLCB0cmFjZXBhcmVudDogZW52ZWxvcGUubWV0YS50cmFjZXBhcmVudCB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNlSWQ6IHRoaXMuY29ubmVjdGlvblRyYWNlSWQsXG4gICAgICBzcGFuSWQ6IG1lc3NhZ2VTcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IHRoaXMuY29ubmVjdGlvblNwYW5JZCA/PyB0aGlzLmNvbm5lY3Rpb25QYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiB0aGlzLmNvbm5lY3Rpb25TYW1wbGVkLFxuICAgIH07XG4gIH1cblxuICAvLyBldmVudCDsobTsnqwg7Jes67aAIOKGkiBzY2hlbWEg6rKA7KadIOKGkiBoYW5kbGVyIOyLpO2WiSDsiJzsnLzroZwg67aE6riw7ZWoXG4gIC8vIGhhbmRsZXLqsIAg7JWE7KeBIOuTseuhneuQmOyngCDslYrsnYAg7LSI6riwIOuplOyLnOyngOuKlCDrsoTtjbzsl5Ag67O06rSA7ZaI64uk6rCAIG9uTWVzc2FnZSDrk7HroZ0g7IucIGZsdXNo7ZWoXG4gIC8vIGhhbmRsZXLripQgYGF3YWl0YOycvOuhnCDsiJzssKgg7Iuk7ZaJ7ZW0IO2VnCBjb25uZWN0aW9uIOyViOydmCDrqZTsi5zsp4Ag7Iic7ISc66W8IOuztOyepe2VqFxuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoRW52ZWxvcGUoZW52ZWxvcGU6IFBhcnNlZEVudmVsb3BlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VIYW5kbGVycy5nZXQoZW52ZWxvcGUuZXZlbnQpO1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZXZlbnRTY2hlbWFzSW5bZW52ZWxvcGUuZXZlbnRdO1xuXG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRoaXMuZW1pdEluYm91bmRSZWplY3RlZChcInVua25vd25FdmVudFwiLCBlbnZlbG9wZS5ldmVudCk7XG4gICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfUE9MSUNZX1ZJT0xBVElPTiwgXCJVbmtub3duIGV2ZW50XCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5zYWZlUGFyc2UoZW52ZWxvcGUuZGF0YSk7XG4gICAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgdGhpcy5lbWl0SW5ib3VuZFJlamVjdGVkKFwiaW52YWxpZERhdGFcIiwgZW52ZWxvcGUuZXZlbnQpO1xuICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0lOVkFMSURfRlJBTUVfUEFZTE9BRF9EQVRBLCBcIkludmFsaWQgZXZlbnQgZGF0YVwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWhhbmRsZXJzIHx8IGhhbmRsZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMucGVuZGluZ01lc3NhZ2VzLmxlbmd0aCA+PSBNQVhfUEVORElOR19NRVNTQUdFUykge1xuICAgICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgICBuYW1lOiBcIndzLm1lc3NhZ2UuYnVmZmVyLmRyb3BwZWRcIixcbiAgICAgICAgICBsZXZlbDogXCJ3YXJuXCIsXG4gICAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGVudmVsb3BlLmV2ZW50IH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBlbmRpbmdNZXNzYWdlcy5zaGlmdCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5wZW5kaW5nTWVzc2FnZXMucHVzaChlbnZlbG9wZSk7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLmJ1ZmZlcmVkXCIsXG4gICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudDogZW52ZWxvcGUuZXZlbnQgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNlQ3R4ID0gdGhpcy5yZXNvbHZlTWVzc2FnZVRyYWNlQ29udGV4dChlbnZlbG9wZSk7XG4gICAgLy8gbWVzc2FnZS1sZXZlbCB0cmFjZeuKlCBjb25uZWN0aW9uLWxldmVsIHRyYWNl66W8IG92ZXJyaWRl7ZWoLiB1c2VySWQgLyBjb25uZWN0aW9uSWQgLyBuYW1lc3BhY2XripQg6re464yA66GcIOycoOyngFxuICAgIGNvbnN0IG1lc3NhZ2VUcmFjZUZpZWxkcyA9IHtcbiAgICAgIGNvbm5lY3Rpb25JZDogdGhpcy5pZCxcbiAgICAgIG5hbWVzcGFjZTogdGhpcy5uYW1lc3BhY2UsXG4gICAgICB1c2VySWQ6IHRoaXMuY3VycmVudFVzZXJJZCxcbiAgICAgIHRyYWNlSWQ6IHRyYWNlQ3R4LnRyYWNlSWQsXG4gICAgICBzcGFuSWQ6IHRyYWNlQ3R4LnNwYW5JZCxcbiAgICAgIHBhcmVudFNwYW5JZDogdHJhY2VDdHgucGFyZW50U3BhbklkLFxuICAgICAgc2FtcGxlZDogdHJhY2VDdHguc2FtcGxlZCxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgYXdhaXQgaGFuZGxlcihwYXJzZWQuZGF0YSwgdHJhY2VDdHgpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgIG5hbWU6IFwid3MubWVzc2FnZS5kaXNwYXRjaGVkXCIsXG4gICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgIC4uLm1lc3NhZ2VUcmFjZUZpZWxkcyxcbiAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBlbnZlbG9wZS5ldmVudCB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5yZWNvcmRNZXRyaWMoe1xuICAgICAgICBuYW1lOiBcInNvbmFtdS53cy5tZXNzYWdlc1wiLFxuICAgICAgICBraW5kOiBcImNvdW50ZXJcIixcbiAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgIHVuaXQ6IFwiMVwiLFxuICAgICAgICB0YWdzOiB7IGRpcmVjdGlvbjogXCJpbmJvdW5kXCIsIGV2ZW50OiBlbnZlbG9wZS5ldmVudCwgb3V0Y29tZTogXCJhY2NlcHRlZFwiIH0sXG4gICAgICAgIC4uLm1lc3NhZ2VUcmFjZUZpZWxkcyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLmZhaWxlZFwiLFxuICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAuLi5tZXNzYWdlVHJhY2VGaWVsZHMsXG4gICAgICAgIGRldGFpbDogeyBldmVudDogZW52ZWxvcGUuZXZlbnQgfSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaFBlbmRpbmdNZXNzYWdlcyhldmVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcmVtYWluaW5nOiBQYXJzZWRFbnZlbG9wZVtdID0gW107XG4gICAgY29uc3QgdG9GbHVzaDogUGFyc2VkRW52ZWxvcGVbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHRoaXMucGVuZGluZ01lc3NhZ2VzKSB7XG4gICAgICBpZiAobWVzc2FnZS5ldmVudCAhPT0gZXZlbnQpIHtcbiAgICAgICAgcmVtYWluaW5nLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0b0ZsdXNoLnB1c2gobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nTWVzc2FnZXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnBlbmRpbmdNZXNzYWdlcy5wdXNoKC4uLnJlbWFpbmluZyk7XG5cbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgdG9GbHVzaCkge1xuICAgICAgdGhpcy5lbnF1ZXVlTWVzc2FnZVRhc2soYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoRW52ZWxvcGUobWVzc2FnZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHB1Ymxpc2hWYWxpZGF0ZWQ8RGF0YT4oZXZlbnQ6IHN0cmluZywgZGF0YTogRGF0YSk6IHZvaWQge1xuICAgIGNvbnN0IGVuY29kaW5nID0gZW5jb2RlV2ViU29ja2V0RnJhbWUodGhpcy5vdXRFdmVudHMsIGV2ZW50LCBkYXRhKTtcbiAgICBpZiAoZW5jb2Rpbmcuc3RhdHVzID09PSBcInVua25vd25FdmVudFwiKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5wdWJsaXNoLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudCwgcmVhc29uOiBcInVua25vd25FdmVudFwiIH0sXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB3ZWJzb2NrZXQgZXZlbnQ6ICR7ZXZlbnR9YCk7XG4gICAgfVxuXG4gICAgaWYgKGVuY29kaW5nLnN0YXR1cyA9PT0gXCJpbnZhbGlkUGF5bG9hZFwiKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5wdWJsaXNoLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudCwgcmVhc29uOiBcImludmFsaWRQYXlsb2FkXCIgfSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdlYnNvY2tldCBldmVudCBwYXlsb2FkOiAke2V2ZW50fWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdTX09QRU4pIHtcbiAgICAgIHRoaXMuZW1pdFB1Ymxpc2hEcm9wcGVkKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVucXVldWVPdXRib3VuZE1lc3NhZ2UoZW5jb2RpbmcuZnJhbWUsIGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFB1Ymxpc2hEcm9wcGVkKGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MucHVibGlzaC5kcm9wcGVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIGRldGFpbDogeyBldmVudCwgcmVhc29uOiBcImNvbm5lY3Rpb25DbG9zZWRcIiB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gbGlzdGVuZXIg7ZW07KCcIC8gaGVhcnRiZWF0IOykkeuLqCAvIHBlbmRpbmcgcXVldWUg67mE7JuAIC8gcmVnaXN0cnkgdW5yZWdpc3RlciAvIG9uQ2xvc2Ug7Iuk7ZaJIC8gd2FpdEZvckNsb3NlIHJlc29sdmUg7J2EIO2VnCDqs7Psl5Ag66qo7JWEIOybkOyekOyggeycvOuhnCDsspjrpqztlahcbiAgLy8gYXN5bmMgb25DbG9zZeqwgCByZWplY3TtlbTrj4QgdW5oYW5kbGVkIHJlamVjdGlvbuycvOuhnCDsg4jsp4Ag7JWK64+E66GdIGNhdGNo66GcIOqyqeumrO2VqFxuICBwcml2YXRlIG1hcmtDbG9zZWQoY29kZT86IG51bWJlciwgX3JlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZWRJbnRlcm5hbCA9IHRydWU7XG4gICAgdGhpcy5jbG9zZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN0b3BIZWFydGJlYXQoKTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnRlbGVtZXRyeUZpZWxkcygpO1xuICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLmNsb3NlZFwiLFxuICAgICAgbGV2ZWw6IFwiaW5mb1wiLFxuICAgICAgLi4uZmllbGRzLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5nZXRUcmFjZU9wdGlvbnMoKS5yZWNvcmRDb25uZWN0aW9uTGlmZXRpbWVTcGFuKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5yZWNvcmRTcGFuKHtcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5jb25uZWN0aW9uLmxpZmV0aW1lXCIsXG4gICAgICAgIGtpbmQ6IFwic2VydmVyXCIsXG4gICAgICAgIGR1cmF0aW9uTXM6IHBlcmZvcm1hbmNlLm5vdygpIC0gdGhpcy5jb25uZWN0aW9uU3RhcnRlZEF0LFxuICAgICAgICBzdGF0dXM6IGRlcml2ZUxpZmV0aW1lU3RhdHVzKGNvZGUpLFxuICAgICAgICAuLi5maWVsZHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zb2NrZXQub2ZmKFwibWVzc2FnZVwiLCB0aGlzLmhhbmRsZU1lc3NhZ2UpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcImNsb3NlXCIsIHRoaXMuaGFuZGxlQ2xvc2UpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcImVycm9yXCIsIHRoaXMuaGFuZGxlRXJyb3IpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcInBvbmdcIiwgdGhpcy5oYW5kbGVQb25nKTtcbiAgICB0aGlzLmF3YWl0aW5nUG9uZyA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ01lc3NhZ2VzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPSAwO1xuICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyeS51bnJlZ2lzdGVyKHRoaXMuaWQpO1xuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jbG9zZUNhbGxiYWNrcy5zcGxpY2UoMCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKCk7XG4gICAgICAgIGlmIChpc1Byb21pc2VMaWtlKHJlc3VsdCkpIHtcbiAgICAgICAgICB2b2lkIHJlc3VsdC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBhc3luYyBjbG9zZSBjYWxsYmFja3MgbXVzdCBub3QgZXNjYXBlIGFzIHVuaGFuZGxlZCByZWplY3Rpb25zXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBjbG9zZSBjYWxsYmFja3MgbXVzdCBub3QgYmxvY2sgdHJhbnNwb3J0IGNsZWFudXBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZXNvbHZlQ2xvc2VQcm9taXNlKCk7XG4gIH1cblxuICAvLyBwb25n7J20IOyYpOyngCDslYrsnYAg7IOB7YOc7JeQ7IScIOuLpOydjCB0aWNr7J20IOyYpOuptCB0aW1lb3V0IGNsb3Nl66GcIOyymOumrO2VtCB6b21iaWUgY29ubmVjdGlvbuydhCDsoJXrpqztlahcbiAgcHJpdmF0ZSBzdGFydEhlYXJ0YmVhdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oZWFydGJlYXRNcyA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdTX09QRU4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hd2FpdGluZ1BvbmcpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgICAgbmFtZTogXCJ3cy5oZWFydGJlYXQudGltZW91dFwiLFxuICAgICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0dPSU5HX0FXQVksIFwiSGVhcnRiZWF0IHRpbWVvdXRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hd2FpdGluZ1BvbmcgPSB0cnVlO1xuICAgICAgdGhpcy5zb2NrZXQucGluZygpO1xuICAgIH0sIHRoaXMuaGVhcnRiZWF0TXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wSGVhcnRiZWF0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oZWFydGJlYXRUaW1lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydGJlYXRUaW1lcik7XG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IG51bGw7XG4gIH1cblxuICAvLyBjbG9zZeqwgCDsi6TtjKjtlbTrj4QgdGVybWluYXRlIO2PtOuwseq5jOyngCDsi5zrj4TtlZjqs6AsIOuBneuCtCDsi6TtjKjtlZjrqbQgbWFya0Nsb3NlZOyXkCDsg4Htg5wg7KCV66as66W8IOychOyehO2VqFxuICBwcml2YXRlIGNsb3NlVHJhbnNwb3J0KGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gV1NfT1BFTiB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19DT05ORUNUSU5HKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKGNvZGUsIHRydW5jYXRlQ2xvc2VSZWFzb24ocmVhc29uKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQudGVybWluYXRlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyB0cmFuc3BvcnQgaXMgYWxyZWFkeSBicm9rZW47IHN0YXRlIGNsZWFudXAgaXMgaGFuZGxlZCBieSBtYXJrQ2xvc2VkKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDsnbjrsJTsmrTrk5wgaGFuZGxlcuulvCBwcm9taXNlIGNoYWlu7Jy866GcIHNlcmlhbGl6ZSDtlZjqs6AsIGhhbmRsZXIg7JiI7Jm464qUIGNvbm5lY3Rpb24tbG9jYWwgMTAxMSBjbG9zZeuhnCDstpXshoztlahcbiAgcHJpdmF0ZSBlbnF1ZXVlTWVzc2FnZVRhc2sodGFzazogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gdGhpcy5tZXNzYWdlUXVldWVcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkSW50ZXJuYWwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0lOVEVSTkFMX0VSUk9SLCBcIk1lc3NhZ2UgaGFuZGxpbmcgZmFpbGVkXCIpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBxdWV1ZeqwgCDtlZzqs4Tsl5Ag64+E64us7ZWY66m0IDEwMTPsnLzroZwg64ur7JWEIOuKkOumsCDshozruYTsnpDqsIAg66mU66qo66as66W8IOuBneyXhuydtCDsnqHslYTrqLnsp4Ag66q77ZWY6rKMIO2VqFxuICAvLyB0ZWxlbWV0cnkgcHJldmlld+uKlCDsp4HroKztmZTrkJwgcGF5bG9hZOyXkOyEnCDrs7Xsm5DtlbQg7KCE7IahIOuNsOydtO2EsOyZgCDqsJnsnYAgSlNPTiDqs4Tslb3snYQg7Jyg7KeA7ZWoXG4gIHByaXZhdGUgZW5xdWV1ZU91dGJvdW5kTWVzc2FnZShwYXlsb2FkOiBzdHJpbmcsIGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPj0gTUFYX1BFTkRJTkdfT1VUQk9VTkRfTUVTU0FHRVMpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLmJhY2twcmVzc3VyZS5vdmVyZmxvd1wiLFxuICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfVFJZX0FHQUlOX0xBVEVSLCBcIldlYlNvY2tldCBiYWNrcHJlc3N1cmUgb3ZlcmZsb3dcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5wdXNoKHsgcGF5bG9hZCwgZXZlbnQgfSk7XG4gICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICBuYW1lOiBcIndzLnB1Ymxpc2gucXVldWVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIGRldGFpbDogeyBldmVudCB9LFxuICAgICAgcGF5bG9hZDogc2FmZVBhcnNlRW52ZWxvcGUocGF5bG9hZCk/LmRhdGEsXG4gICAgfSk7XG4gICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVPdXRib3VuZEZsdXNoKGRlbGF5TXM6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vdXRib3VuZEZsdXNoU2NoZWR1bGVkIHx8IHRoaXMuY2xvc2VkSW50ZXJuYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm91dGJvdW5kRmx1c2hTY2hlZHVsZWQgPSB0cnVlO1xuICAgIGNvbnN0IGZsdXNoID0gKCkgPT4ge1xuICAgICAgdGhpcy5vdXRib3VuZEZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmZsdXNoT3V0Ym91bmRNZXNzYWdlcygpO1xuICAgIH07XG5cbiAgICBpZiAoZGVsYXlNcyA+IDApIHtcbiAgICAgIHNldFRpbWVvdXQoZmx1c2gsIGRlbGF5TXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldEltbWVkaWF0ZShmbHVzaCk7XG4gIH1cblxuICAvLyBidWZmZXJlZEFtb3VudOqwgCDsnoTqs4TsuZjrpbwg64SY7Jy866m0IGZsdXNo66W8IOuvuOukhCBzb2NrZXQg64K067aAIO2BkOqwgCDthLDsp4Dsp4Ag7JWK64+E66GdIGJhY2twcmVzc3VyZeulvCDsobTspJHtlahcbiAgLy8g7ZWcIOuyiOyXkCDrsLDsuZgg64uo7JyE66Gc66eMIHNlbmTtlbQg64+Z6riwIOujqO2UhOqwgCDsnbTrsqTtirgg66Oo7ZSE66W8IOyepeyLnOqwhCDsoJDsnKDtlZjsp4Ag7JWK6rKMIO2VqFxuICBwcml2YXRlIGZsdXNoT3V0Ym91bmRNZXNzYWdlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWRJbnRlcm5hbCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSBXU19PUEVOKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLmJhY2twcmVzc3VyZS5kZWxheWVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goT1VUQk9VTkRfUkVUUllfREVMQVlfTVMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzZW50ID0gMDtcbiAgICB3aGlsZSAoXG4gICAgICBzZW50IDwgT1VUQk9VTkRfQkFUQ0hfU0laRSAmJlxuICAgICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19PUEVOXG4gICAgKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5zaGlmdCgpO1xuICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBwYXlsb2FkLCBldmVudCB9ID0gbmV4dDtcblxuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnRlbGVtZXRyeUZpZWxkcygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChwYXlsb2FkKTtcbiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgICBuYW1lOiBcIndzLnB1Ymxpc2guc2VudFwiLFxuICAgICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgIGRldGFpbDogeyBldmVudCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkU3Bhbih7XG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5wdWJsaXNoLnNlbmRcIixcbiAgICAgICAgICBraW5kOiBcInByb2R1Y2VyXCIsXG4gICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICBzdGF0dXM6IFwidW5zZXRcIixcbiAgICAgICAgICAuLi5maWVsZHMsXG4gICAgICAgICAgYXR0cmlidXRlczogeyBldmVudCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkTWV0cmljKHtcbiAgICAgICAgICBuYW1lOiBcInNvbmFtdS53cy5wdWJsaXNoZXNcIixcbiAgICAgICAgICBraW5kOiBcImNvdW50ZXJcIixcbiAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICB1bml0OiBcIjFcIixcbiAgICAgICAgICB0YWdzOiB7IG91dGNvbWU6IFwic2VudFwiLCBldmVudCB9LFxuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICAgIG5hbWU6IFwid3MucHVibGlzaC5mYWlsZWRcIixcbiAgICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZFNwYW4oe1xuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MucHVibGlzaC5zZW5kXCIsXG4gICAgICAgICAga2luZDogXCJwcm9kdWNlclwiLFxuICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZXZlbnQgfSxcbiAgICAgICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogcnVudGltZVR5cGVPZihlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfSU5URVJOQUxfRVJST1IsIFwiT3V0Ym91bmQgcHVibGlzaCBmYWlsZWRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VudCArPSAxO1xuICAgICAgaWYgKHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVuZGluZ091dGJvdW5kTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goXG4gICAgICAgIHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQgPyBPVVRCT1VORF9SRVRSWV9ERUxBWV9NUyA6IDAsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVNZXNzYWdlKHJhdzogUmF3RGF0YSk6IHN0cmluZyB7XG4gIGlmIChpc1N0cmluZ1ZhbHVlKHJhdykpIHtcbiAgICByZXR1cm4gcmF3O1xuICB9XG5cbiAgaWYgKHJhdyBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgIHJldHVybiByYXcudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgfVxuXG4gIGlmIChyYXcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShyYXcpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQocmF3LmZpbHRlcigoY2h1bmspOiBjaHVuayBpcyBCdWZmZXIgPT4gY2h1bmsgaW5zdGFuY2VvZiBCdWZmZXIpKS50b1N0cmluZyhcbiAgICAgIFwidXRmLThcIixcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJhdyk7XG59XG5cbmZ1bmN0aW9uIHNhZmVQYXJzZUVudmVsb3BlKHJhdzogc3RyaW5nKTogUGFyc2VkRW52ZWxvcGUgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPVxuICAgICAgLyogU0FGRVRZOiDrk7HroZ3rkJwgV2ViU29ja2V0IOydtOuypO2KuCDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBKU09OLnBhcnNlKFxuICAgICAgICByYXcsXG4gICAgICApIGFzIHVua25vd247XG4gICAgY29uc3QgdmFsaWRhdGVkID0gV2ViU29ja2V0RW52ZWxvcGVTY2hlbWEuc2FmZVBhcnNlKHBhcnNlZCk7XG4gICAgcmV0dXJuIHZhbGlkYXRlZC5zdWNjZXNzID8gdmFsaWRhdGVkLmRhdGEgOiBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBSRkMgNjQ1NeqwgCBjbG9zZSBmcmFtZSByZWFzb27snYQgMTIzIGJ5dGXroZwg7KCc7ZWc7ZWY66+A66GcIOy0iOqzvOu2hOydgCDsnpjrnbwg7KCE7IahIOyLpO2MqOulvCDrsKnsp4DtlahcbmZ1bmN0aW9uIHRydW5jYXRlQ2xvc2VSZWFzb24ocmVhc29uPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyZWFzb24pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKHJlYXNvbiwgXCJ1dGYtOFwiKSA8PSAxMjNcbiAgICA/IHJlYXNvblxuICAgIDogQnVmZmVyLmZyb20ocmVhc29uKS5zdWJhcnJheSgwLCAxMjMpLnRvU3RyaW5nKFwidXRmLThcIik7XG59XG5cbi8vIGNvbm5lY3Rpb24gbGlmZXRpbWUgc3BhbuydmCBzdGF0dXPrpbwgY2xvc2UgY29kZSDquLDspIDsnLzroZwg67aE6riw7ZWoICgxMDAwLzEwMDEg7KCV7IOBIOyiheujjCwg6re4IOyZuCBrbm93biBjb2RlIGVycm9yLCBjb2RlIOuvuOyDgeydgCB1bnNldClcbmZ1bmN0aW9uIGRlcml2ZUxpZmV0aW1lU3RhdHVzKGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCk6IFwib2tcIiB8IFwiZXJyb3JcIiB8IFwidW5zZXRcIiB7XG4gIGlmIChjb2RlID09PSB1bmRlZmluZWQpIHJldHVybiBcInVuc2V0XCI7XG4gIGlmIChjb2RlID09PSAxMDAwIHx8IGNvZGUgPT09IDEwMDEpIHJldHVybiBcIm9rXCI7XG4gIHJldHVybiBcImVycm9yXCI7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBZ1BBLFNBQWdCLHVCQUF1QixVQUFtQyxDQUFDLEdBQXFCO0NBQzlGLE9BQU8sSUFBSSxpQkFBaUIsT0FBTztBQUNyQztBQThwQkEsU0FBUyxpQkFBaUIsS0FBc0I7Q0FDOUMsSUFBSSxjQUFjLEdBQUcsR0FDbkIsT0FBTztDQUdULElBQUksZUFBZSxRQUNqQixPQUFPLElBQUksU0FBUyxPQUFPO0NBRzdCLElBQUksZUFBZSxhQUNqQixPQUFPLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU87Q0FHMUMsSUFBSSxNQUFNLFFBQVEsR0FBRyxHQUNuQixPQUFPLE9BQU8sT0FBTyxJQUFJLFFBQVEsVUFBMkIsaUJBQWlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FDcEYsT0FDRjtDQUdGLE9BQU8sS0FBSyxVQUFVLEdBQUc7QUFDM0I7QUFFQSxTQUFTLGtCQUFrQixLQUFvQztDQUM3RCxJQUFJO0VBQ0YsTUFBTSxTQUNnRCxLQUFLLE1BQ3ZELEdBQ0Y7RUFDRixNQUFNLFlBQVksd0JBQXdCLFVBQVUsTUFBTTtFQUMxRCxPQUFPLFVBQVUsVUFBVSxVQUFVLE9BQU87Q0FDOUMsUUFBUTtFQUNOLE9BQU87Q0FDVDtBQUNGO0FBR0EsU0FBUyxvQkFBb0IsUUFBcUM7Q0FDaEUsSUFBSSxDQUFDLFFBQ0g7Q0FHRixPQUFPLE9BQU8sV0FBVyxRQUFRLE9BQU8sS0FB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
@@ -5,7 +5,7 @@ import inflection from "inflection";
5
5
  import assert from "assert";
6
6
  import { readFile } from "fs/promises";
7
7
  import ts from "@typescript/typescript6";
8
- //#region src/syncer/api-parser.ts
8
+ // src/syncer/api-parser.ts
9
9
  /**
10
10
  * TypeScript 파일을 파싱하여 API 메소드 정보를 추출합니다.
11
11
  * @api 데코레이터가 붙은 메소드들의 타입 정보를 분석합니다.
@@ -232,8 +232,7 @@ var init_api_parser = __esmMin((() => {
232
232
  init_decorators();
233
233
  init_validator();
234
234
  }));
235
- //#endregion
236
235
  init_api_parser();
237
236
  export { init_api_parser, readApisFromFile };
238
237
 
239
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXBhcnNlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2VyL2FwaS1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuXG5pbXBvcnQgdHMgZnJvbSBcIkB0eXBlc2NyaXB0L3R5cGVzY3JpcHQ2XCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuXG5pbXBvcnQgeyByZWdpc3RlcmVkQXBpcyB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZEFwaSB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgdHlwZSBSZXNvbHZlZFdlYlNvY2tldERlY29yYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IHZhbGlkYXRlTWV0aG9kTmFtZSB9IGZyb20gXCIuLi9hcGkvdmFsaWRhdG9yXCI7XG5pbXBvcnQgeyB0eXBlIEFwaVBhcmFtLCB0eXBlIEFwaVBhcmFtVHlwZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuXG50eXBlIFdlYlNvY2tldFR5cGVSZWZzID0gUGljazxcbiAgUmVzb2x2ZWRXZWJTb2NrZXREZWNvcmF0b3JPcHRpb25zLFxuICBcIm91dEV2ZW50c1R5cGVSZWZcIiB8IFwiaW5FdmVudHNUeXBlUmVmXCJcbj47XG50eXBlIFBhcnNlZE1ldGhvZCA9IHtcbiAgbW9kZWxOYW1lOiBzdHJpbmc7XG4gIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgdHlwZVBhcmFtZXRlcnM6IEFwaVBhcmFtVHlwZS5UeXBlUGFyYW1bXTtcbiAgcGFyYW1ldGVyczogQXBpUGFyYW1bXTtcbiAgcmV0dXJuVHlwZTogQXBpUGFyYW1UeXBlO1xuICB3ZWJzb2NrZXRUeXBlUmVmczogV2ViU29ja2V0VHlwZVJlZnM7XG59O1xuXG4vKipcbiAqIFR5cGVTY3JpcHQg7YyM7J287J2EIO2MjOyLse2VmOyXrCBBUEkg66mU7IaM65OcIOygleuztOulvCDstpTstpztlanri4jri6QuXG4gKiBAYXBpIOuNsOy9lOugiOydtO2EsOqwgCDrtpnsnYAg66mU7IaM65Oc65Ok7J2YIO2DgOyehSDsoJXrs7Trpbwg67aE7ISd7ZWp64uI64ukLlxuICogQHBhcmFtIGZpbGVQYXRoIC0g7YyM7Iux7ZWgIFR5cGVTY3JpcHQg7YyM7J287J2YIOygiOuMgCDqsr3roZxcbiAqIEByZXR1cm5zIEFQSSDrqZTshozrk5wg7KCV67O0IOuwsOyXtCAo7YOA7J6FIO2MjOudvOuvuO2EsCwg7YyM652866+47YSwLCDrpqzthLQg7YOA7J6FIOuTsSlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBcGlzRnJvbUZpbGUoZmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IFByb21pc2U8RXh0ZW5kZWRBcGlbXT4ge1xuICBpZiAoIWZpbGVQYXRoLmVuZHNXaXRoKFwiLnRzXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7ZmlsZVBhdGh9IGRvZXMgbm90IHNlZW0gdG8gYmUgYSBUeXBlU2NyaXB0IGZpbGUuIFBsZWFzZSBjaGVjayB0aGUgZmlsZSBwYXRoLiBXZSBvbmx5IHN1cHBvcnQgcGFyc2luZyBUeXBlU2NyaXB0IGZpbGVzLmAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIGZpbGVQYXRoLFxuICAgIChhd2FpdCByZWFkRmlsZShmaWxlUGF0aCkpLnRvU3RyaW5nKCksXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgKTtcblxuICBjb25zdCBtZXRob2RzOiBQYXJzZWRNZXRob2RbXSA9IFtdO1xuICBsZXQgbW9kZWxOYW1lOiBzdHJpbmcgPSBcIlVua25vd25Nb2RlbFwiO1xuICBsZXQgbWV0aG9kTmFtZTogc3RyaW5nID0gXCJ1bmtub3duTWV0aG9kXCI7XG4gIGNvbnN0IHZpc2l0b3IgPSAobm9kZTogdHMuTm9kZSkgPT4ge1xuICAgIGlmICh0cy5pc0NsYXNzRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGlmIChub2RlLm5hbWUgJiYgdHMuaXNJZGVudGlmaWVyKG5vZGUubmFtZSkpIHtcbiAgICAgICAgbW9kZWxOYW1lID0gbm9kZS5uYW1lLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCkucmVwbGFjZSgvQ2xhc3MkLywgXCJcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0cy5pc01ldGhvZERlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBpZiAodHMuaXNJZGVudGlmaWVyKG5vZGUubmFtZSkpIHtcbiAgICAgICAgbWV0aG9kTmFtZSA9IG5vZGUubmFtZS5lc2NhcGVkVGV4dC50b1N0cmluZygpO1xuICAgICAgICB2YWxpZGF0ZU1ldGhvZE5hbWUobWV0aG9kTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzOiBBcGlQYXJhbVR5cGUuVHlwZVBhcmFtW10gPSAobm9kZS50eXBlUGFyYW1ldGVycyA/PyBbXSkubWFwKFxuICAgICAgICAodHlwZVBhcmFtKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHAgPSB0eXBlUGFyYW07XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdDogXCJ0eXBlLXBhcmFtXCIsXG4gICAgICAgICAgICBpZDogdHAubmFtZS5lc2NhcGVkVGV4dC50b1N0cmluZygpLFxuICAgICAgICAgICAgY29uc3RyYWludDogdHAuY29uc3RyYWludCA/IHJlc29sdmVUeXBlTm9kZSh0cC5jb25zdHJhaW50KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IEFwaVBhcmFtW10gPSBub2RlLnBhcmFtZXRlcnMubWFwKChwYXJhbURlYywgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZGVmYXVsdERlZiA9IHByaW50Tm9kZShwYXJhbURlYy5pbml0aWFsaXplciwgc291cmNlRmlsZSk7XG5cbiAgICAgICAgLy8g6riw67O46rCS7J20IOyeiOuKlCDqsr3smrAgcGFyYW1EZWMudHlwZeqwgCB1bmRlZmluZWTroZwg64KY7Ji0XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmVQYXJhbURlYyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBwYXJhbURlYy5uYW1lLFxuICAgICAgICAgICAgdHlwZTogLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBwYXJhbURlYy50eXBlIGFzIHRzLlR5cGVOb2RlLFxuICAgICAgICAgICAgb3B0aW9uYWw6IHBhcmFtRGVjLnF1ZXN0aW9uVG9rZW4gIT09IHVuZGVmaW5lZCB8fCBwYXJhbURlYy5pbml0aWFsaXplciAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVmYXVsdERlZixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICBpZiAobm9kZS50eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDrpqzthLQg7YOA7J6F7J20IOq4sOyerOuQmOyngCDslYrsnYAg66mU7IaM65OcICR7bW9kZWxOYW1lfS4ke21ldGhvZE5hbWV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXR1cm5UeXBlID0gcmVzb2x2ZVR5cGVOb2RlKG5vZGUudHlwZSk7XG4gICAgICBjb25zdCB3ZWJzb2NrZXRUeXBlUmVmcyA9IHJlYWRXZWJTb2NrZXRUeXBlUmVmcyhub2RlKTtcblxuICAgICAgbWV0aG9kcy5wdXNoKHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICB0eXBlUGFyYW1ldGVycyxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgcmV0dXJuVHlwZSxcbiAgICAgICAgd2Vic29ja2V0VHlwZVJlZnMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0b3IpO1xuICB9O1xuICB2aXNpdG9yKHNvdXJjZUZpbGUpO1xuXG4gIGlmIChtZXRob2RzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIO2YhOyerCDtjIzsnbzsnZgg65Ox66Gd65CcIEFQSSDtlYTthLBcbiAgY29uc3QgY3VycmVudE1vZGVsQXBpcyA9IHJlZ2lzdGVyZWRBcGlzLmZpbHRlcigoYXBpKSA9PiB7XG4gICAgcmV0dXJuIG1ldGhvZHMuZmluZChcbiAgICAgIChtZXRob2QpID0+IG1ldGhvZC5tb2RlbE5hbWUgPT09IGFwaS5tb2RlbE5hbWUgJiYgbWV0aG9kLm1ldGhvZE5hbWUgPT09IGFwaS5tZXRob2ROYW1lLFxuICAgICk7XG4gIH0pO1xuICBpZiAoY3VycmVudE1vZGVsQXBpcy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBjb25zdCBwID0gcGF0aC5qb2luKHRtcGRpcigpLCBcInNvbmFtdS1zeW5jZXItZXJyb3IuanNvblwiKTtcbiAgICAvLyB3cml0ZUZpbGVTeW5jKHAsIEpTT04uc3RyaW5naWZ5KHJlZ2lzdGVyZWRBcGlzLCBudWxsLCAyKSk7XG4gICAgLy8gZXhlY1N5bmMoYG9wZW4gJHtwfWApO1xuICAgIC8vIHRocm93IG5ldyBFcnJvcihg7ZiE7J6sIO2MjOydvOyXkCDsgqzsoIQg65Ox66Gd65CcIEFQSeqwgCDsl4bsirXri4jri6QuICR7ZmlsZVBhdGh9YCk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8g65Ox66Gd65CcIEFQSeyXkCDtmITsnqwg66mU7IaM65OcIO2DgOyehSDsoJXrs7Qg7ZmV7J6lXG4gIGNvbnN0IGV4dGVuZGVkQXBpcyA9IGN1cnJlbnRNb2RlbEFwaXMubWFwKChhcGkpID0+IHtcbiAgICBjb25zdCBmb3VuZE1ldGhvZCA9IG1ldGhvZHMuZmluZChcbiAgICAgIChtZXRob2QpID0+IG1ldGhvZC5tb2RlbE5hbWUgPT09IGFwaS5tb2RlbE5hbWUgJiYgbWV0aG9kLm1ldGhvZE5hbWUgPT09IGFwaS5tZXRob2ROYW1lLFxuICAgICk7XG4gICAgaWYgKCFmb3VuZE1ldGhvZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBUEkgJHthcGkubW9kZWxOYW1lfS4ke2FwaS5tZXRob2ROYW1lfSBub3QgZm91bmQgaW4gJHtmaWxlUGF0aH1gKTtcbiAgICB9XG4gICAgY29uc3Qgd2Vic29ja2V0T3B0aW9ucyA9IGFwaS53ZWJzb2NrZXRPcHRpb25zXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5hcGkud2Vic29ja2V0T3B0aW9ucyxcbiAgICAgICAgICAuLi5mb3VuZE1ldGhvZC53ZWJzb2NrZXRUeXBlUmVmcyxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYXBpLFxuICAgICAgd2Vic29ja2V0T3B0aW9ucyxcbiAgICAgIHR5cGVQYXJhbWV0ZXJzOiBmb3VuZE1ldGhvZD8udHlwZVBhcmFtZXRlcnMsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3VuZE1ldGhvZD8ucGFyYW1ldGVycyxcbiAgICAgIHJldHVyblR5cGU6IGZvdW5kTWV0aG9kPy5yZXR1cm5UeXBlLFxuICAgIH07XG4gIH0pO1xuICByZXR1cm4gZXh0ZW5kZWRBcGlzO1xufVxuXG5mdW5jdGlvbiByZWFkV2ViU29ja2V0VHlwZVJlZnMobm9kZTogdHMuTWV0aG9kRGVjbGFyYXRpb24pOiBXZWJTb2NrZXRUeXBlUmVmcyB7XG4gIGNvbnN0IG9wdGlvbnNMaXRlcmFsID0gZ2V0RGVjb3JhdG9yT3B0aW9uc09iamVjdExpdGVyYWwobm9kZSwgXCJ3ZWJzb2NrZXRcIik7XG4gIGlmICghb3B0aW9uc0xpdGVyYWwpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCByZWZzOiBXZWJTb2NrZXRUeXBlUmVmcyA9IHt9O1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIG9wdGlvbnNMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlOYW1lVGV4dChwcm9wZXJ0eS5uYW1lKTtcbiAgICBpZiAocHJvcGVydHlOYW1lICE9PSBcIm91dEV2ZW50c1wiICYmIHByb3BlcnR5TmFtZSAhPT0gXCJpbkV2ZW50c1wiKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlUmVmID0gcmVzb2x2ZURlY29yYXRvclR5cGVSZWYocHJvcGVydHkuaW5pdGlhbGl6ZXIpO1xuICAgIGlmICghdHlwZVJlZikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BlcnR5TmFtZSA9PT0gXCJvdXRFdmVudHNcIikge1xuICAgICAgcmVmcy5vdXRFdmVudHNUeXBlUmVmID0gdHlwZVJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVmcy5pbkV2ZW50c1R5cGVSZWYgPSB0eXBlUmVmO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWZzO1xufVxuXG5mdW5jdGlvbiBnZXREZWNvcmF0b3JPcHRpb25zT2JqZWN0TGl0ZXJhbChcbiAgbm9kZTogdHMuTWV0aG9kRGVjbGFyYXRpb24sXG4gIGRlY29yYXRvck5hbWU6IHN0cmluZyxcbik6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBtb2RpZmllciBvZiBub2RlLm1vZGlmaWVycyA/PyBbXSkge1xuICAgIGlmICghdHMuaXNEZWNvcmF0b3IobW9kaWZpZXIpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBleHByZXNzaW9uID0gbW9kaWZpZXIuZXhwcmVzc2lvbjtcbiAgICBpZiAoIXRzLmlzQ2FsbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghdHMuaXNJZGVudGlmaWVyKGV4cHJlc3Npb24uZXhwcmVzc2lvbikgfHwgZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgIT09IGRlY29yYXRvck5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IFtmaXJzdEFyZ10gPSBleHByZXNzaW9uLmFyZ3VtZW50cztcbiAgICBpZiAoZmlyc3RBcmcgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZykpIHtcbiAgICAgIHJldHVybiBmaXJzdEFyZztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eU5hbWVUZXh0KG5hbWU6IHRzLlByb3BlcnR5TmFtZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cy5pc0lkZW50aWZpZXIobmFtZSkgfHwgdHMuaXNTdHJpbmdMaXRlcmFsKG5hbWUpIHx8IHRzLmlzTnVtZXJpY0xpdGVyYWwobmFtZSkpIHtcbiAgICByZXR1cm4gbmFtZS50ZXh0O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlY29yYXRvclR5cGVSZWYoZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbik6IEFwaVBhcmFtVHlwZS5SZWYgfCB1bmRlZmluZWQge1xuICBpZiAodHMuaXNJZGVudGlmaWVyKGV4cHJlc3Npb24pKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHQ6IFwicmVmXCIsXG4gICAgICBpZDogZXhwcmVzc2lvbi50ZXh0LFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgdHMuaXNBc0V4cHJlc3Npb24oZXhwcmVzc2lvbikgfHxcbiAgICB0cy5pc1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGV4cHJlc3Npb24pIHx8XG4gICAgdHMuaXNOb25OdWxsRXhwcmVzc2lvbihleHByZXNzaW9uKSB8fFxuICAgIHRzLmlzVHlwZUFzc2VydGlvbkV4cHJlc3Npb24oZXhwcmVzc2lvbilcbiAgKSB7XG4gICAgcmV0dXJuIHJlc29sdmVEZWNvcmF0b3JUeXBlUmVmKGV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVHlwZU5vZGUodHlwZU5vZGU6IHRzLlR5cGVOb2RlKTogQXBpUGFyYW1UeXBlIHtcbiAgc3dpdGNoICh0eXBlTm9kZT8ua2luZCkge1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5BbnlLZXl3b3JkOlxuICAgICAgcmV0dXJuIFwiYW55XCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVua25vd25LZXl3b3JkOlxuICAgICAgcmV0dXJuIFwidW5rbm93blwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLk51bWJlcktleXdvcmQ6XG4gICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQ6XG4gICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuTnVsbEtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlZvaWRLZXl3b3JkOlxuICAgICAgcmV0dXJuIFwidm9pZFwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5MaXRlcmFsVHlwZToge1xuICAgICAgY29uc3QgbGl0ZXJhbCA9XG4gICAgICAgIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHR5cGVOb2RlIGFzIHRzLkxpdGVyYWxUeXBlTm9kZVxuICAgICAgICApLmxpdGVyYWw7XG4gICAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKGxpdGVyYWwpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdDogXCJzdHJpbmctbGl0ZXJhbFwiLFxuICAgICAgICAgIHZhbHVlOiBsaXRlcmFsLnRleHQsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHRzLmlzTnVtZXJpY0xpdGVyYWwobGl0ZXJhbCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0OiBcIm51bWVyaWMtbGl0ZXJhbFwiLFxuICAgICAgICAgIHZhbHVlOiBOdW1iZXIobGl0ZXJhbC50ZXh0KSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuTnVsbEtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobGl0ZXJhbC5raW5kID09PSB0cy5TeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuVHJ1ZUtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobGl0ZXJhbC5raW5kID09PSB0cy5TeW50YXhLaW5kLkZhbHNlS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcImZhbHNlXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi7JWMIOyImCDsl4bripQg66as7YSw65+0XCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQXJyYXlUeXBlOiB7XG4gICAgICBjb25zdCBhcnJOb2RlID1cbiAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyB0eXBlTm9kZSBhcyB0cy5BcnJheVR5cGVOb2RlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJhcnJheVwiLFxuICAgICAgICBlbGVtZW50c1R5cGU6IHJlc29sdmVUeXBlTm9kZShhcnJOb2RlLmVsZW1lbnRUeXBlKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UeXBlTGl0ZXJhbDoge1xuICAgICAgY29uc3QgbGl0ZXJhbE5vZGUgPVxuICAgICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHR5cGVOb2RlIGFzIHRzLlR5cGVMaXRlcmFsTm9kZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwib2JqZWN0XCIsXG4gICAgICAgIHByb3BzOiBsaXRlcmFsTm9kZS5tZW1iZXJzLm1hcCgobWVtYmVyKSA9PiB7XG4gICAgICAgICAgaWYgKHRzLmlzSW5kZXhTaWduYXR1cmVEZWNsYXJhdGlvbihtZW1iZXIpKSB7XG4gICAgICAgICAgICBhc3NlcnQobWVtYmVyLnBhcmFtZXRlcnNbMF0pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gcmVzb2x2ZVBhcmFtRGVjKHtcbiAgICAgICAgICAgICAgbmFtZTogLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBtZW1iZXJcbiAgICAgICAgICAgICAgICAucGFyYW1ldGVyc1swXS5uYW1lIGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gbWVtYmVyXG4gICAgICAgICAgICAgICAgLnBhcmFtZXRlcnNbMF0udHlwZSBhcyB0cy5UeXBlTm9kZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVBhcmFtRGVjKHtcbiAgICAgICAgICAgICAgbmFtZTogLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyB7XG4gICAgICAgICAgICAgICAgZXNjYXBlZFRleHQ6IGBbJHtyZXMubmFtZX0ke3Jlcy5vcHRpb25hbCA/IFwiP1wiIDogXCJcIn06ICR7cmVzLnR5cGV9XWAsXG4gICAgICAgICAgICAgIH0gYXMgdHMuSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgdHlwZTogbWVtYmVyLnR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQYXJhbURlYyh7XG4gICAgICAgICAgICAgIG5hbWU6IC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgICAgICAgbWVtYmVyIGFzIHRzLlByb3BlcnR5U2lnbmF0dXJlXG4gICAgICAgICAgICAgICkubmFtZSBhcyB0cy5JZGVudGlmaWVyLFxuICAgICAgICAgICAgICB0eXBlOiAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgICAgIG1lbWJlciBhcyB0cy5Qcm9wZXJ0eVNpZ25hdHVyZVxuICAgICAgICAgICAgICApLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICAgIG9wdGlvbmFsOlxuICAgICAgICAgICAgICAgIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgICAgICAgbWVtYmVyIGFzIHRzLlByb3BlcnR5U2lnbmF0dXJlXG4gICAgICAgICAgICAgICAgKS5xdWVzdGlvblRva2VuICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlR5cGVSZWZlcmVuY2U6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcInJlZlwiLFxuICAgICAgICBpZDogLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICAodHlwZU5vZGUgYXMgdHMuVHlwZVJlZmVyZW5jZU5vZGUpLnR5cGVOYW1lIGFzIHRzLklkZW50aWZpZXJcbiAgICAgICAgKS5lc2NhcGVkVGV4dC50b1N0cmluZygpLFxuICAgICAgICBhcmdzOiAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB0eXBlTm9kZSBhcyB0cy5UeXBlUmVmZXJlbmNlTm9kZVxuICAgICAgICApLnR5cGVBcmd1bWVudHM/Lm1hcCgodHlwZUFyZykgPT4gcmVzb2x2ZVR5cGVOb2RlKHR5cGVBcmcpKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVuaW9uVHlwZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwidW5pb25cIixcbiAgICAgICAgdHlwZXM6IC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHR5cGVOb2RlIGFzIHRzLlVuaW9uVHlwZU5vZGVcbiAgICAgICAgKS50eXBlcy5tYXAoKHR5cGUpID0+IHJlc29sdmVUeXBlTm9kZSh0eXBlKSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5JbnRlcnNlY3Rpb25UeXBlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJpbnRlcnNlY3Rpb25cIixcbiAgICAgICAgdHlwZXM6IC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHR5cGVOb2RlIGFzIHRzLkludGVyc2VjdGlvblR5cGVOb2RlXG4gICAgICAgICkudHlwZXMubWFwKCh0eXBlKSA9PiByZXNvbHZlVHlwZU5vZGUodHlwZSkpLFxuICAgICAgfTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuSW5kZXhlZEFjY2Vzc1R5cGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcImluZGV4ZWQtYWNjZXNzXCIsXG4gICAgICAgIG9iamVjdDogcmVzb2x2ZVR5cGVOb2RlKFxuICAgICAgICAgIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgdHlwZU5vZGUgYXMgdHMuSW5kZXhlZEFjY2Vzc1R5cGVOb2RlXG4gICAgICAgICAgKS5vYmplY3RUeXBlLFxuICAgICAgICApLFxuICAgICAgICBpbmRleDogcmVzb2x2ZVR5cGVOb2RlKFxuICAgICAgICAgIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgdHlwZU5vZGUgYXMgdHMuSW5kZXhlZEFjY2Vzc1R5cGVOb2RlXG4gICAgICAgICAgKS5pbmRleFR5cGUsXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UdXBsZVR5cGU6XG4gICAgICBpZiAodHMuaXNUdXBsZVR5cGVOb2RlKHR5cGVOb2RlKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHQ6IFwidHVwbGUtdHlwZVwiLFxuICAgICAgICAgIGVsZW1lbnRzOiB0eXBlTm9kZS5lbGVtZW50cy5tYXAoKGVsZW0pID0+IHJlc29sdmVUeXBlTm9kZShlbGVtKSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuUGFyZW50aGVzaXplZFR5cGU6XG4gICAgICAvLyDqtITtmLjroZwg66y27J24IO2DgOyehSAo7JiIOiAoQSAmIEIpW10g7JeQ7IScIChBICYgQikpXG4gICAgICAvLyDrgrTrtoAg7YOA7J6F7J2EIOyerOq3gOyggeycvOuhnCByZXNvbHZlXG4gICAgICByZXR1cm4gcmVzb2x2ZVR5cGVOb2RlKFxuICAgICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB0eXBlTm9kZSBhcyB0cy5QYXJlbnRoZXNpemVkVHlwZU5vZGVcbiAgICAgICAgKS50eXBlLFxuICAgICAgKTtcblxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5GdW5jdGlvblR5cGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcImZ1bmN0aW9uXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6XG4gICAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgICB0eXBlTm9kZSBhcyB0cy5GdW5jdGlvblR5cGVOb2RlXG4gICAgICAgICAgKS5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBwYXJhbS5uYW1lLmdldFRleHQoKSxcbiAgICAgICAgICAgIHR5cGU6IHBhcmFtLnR5cGUgPyByZXNvbHZlVHlwZU5vZGUocGFyYW0udHlwZSkgOiBcInVua25vd25cIixcbiAgICAgICAgICAgIG9wdGlvbmFsOiBwYXJhbS5xdWVzdGlvblRva2VuICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZWZhdWx0RGVmOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSkpLFxuICAgICAgICByZXR1cm5UeXBlOiByZXNvbHZlVHlwZU5vZGUoXG4gICAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgICB0eXBlTm9kZSBhcyB0cy5GdW5jdGlvblR5cGVOb2RlXG4gICAgICAgICAgKS50eXBlLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHlwZU5vZGUgdW5kZWZpbmVkYCk7XG4gIH1cblxuICBjb25zb2xlLmRlYnVnKHR5cGVOb2RlKTtcbiAgdGhyb3cgbmV3IEVycm9yKGDslYwg7IiYIOyXhuuKlCBTeW50YXhLaW5kICR7dHlwZU5vZGUua2luZH1gKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhcmFtRGVjKFxuICBwYXJhbURlYzoge1xuICAgIG5hbWU6IHRzLkJpbmRpbmdOYW1lO1xuICAgIHR5cGU6IHRzLlR5cGVOb2RlO1xuICAgIG9wdGlvbmFsPzogYm9vbGVhbjtcbiAgICBkZWZhdWx0RGVmPzogc3RyaW5nO1xuICB9LFxuICBpbmRleDogbnVtYmVyID0gMCxcbik6IEFwaVBhcmFtIHtcbiAgY29uc3QgbmFtZSA9XG4gICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBwYXJhbURlYy5uYW1lIGFzIHRzLklkZW50aWZpZXI7XG4gIGNvbnN0IHR5cGUgPSByZXNvbHZlVHlwZU5vZGUocGFyYW1EZWMudHlwZSk7XG5cbiAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnNvbGUuZGVidWcoeyBuYW1lLCB0eXBlLCBwYXJhbURlYyB9KTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogQXBpUGFyYW0gPSB7XG4gICAgbmFtZTogbmFtZS5lc2NhcGVkVGV4dCA/IG5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKSA6IGBub25hbWVBdCR7aW5kZXh9YCxcbiAgICB0eXBlLFxuICAgIG9wdGlvbmFsOiBwYXJhbURlYy5vcHRpb25hbCA9PT0gdHJ1ZSxcbiAgICBkZWZhdWx0RGVmOiBwYXJhbURlYz8uZGVmYXVsdERlZixcbiAgfTtcblxuICAvLyDqtazsobDrtoTtlbTtlaDri7nsnZgg6rK97JqwIO2DgOyeheydtOumhCDsgqzsmqlcbiAgaWYgKFxuICAgIHRzLmlzT2JqZWN0QmluZGluZ1BhdHRlcm4obmFtZSkgJiZcbiAgICB0cy5pc1R5cGVSZWZlcmVuY2VOb2RlKHBhcmFtRGVjLnR5cGUpICYmXG4gICAgdHMuaXNJZGVudGlmaWVyKHBhcmFtRGVjLnR5cGUudHlwZU5hbWUpXG4gICkge1xuICAgIHJlc3VsdC5uYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShwYXJhbURlYy50eXBlLnR5cGVOYW1lLnRleHQsIHRydWUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcHJpbnROb2RlKG5vZGU6IHRzLk5vZGUgfCB1bmRlZmluZWQsIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHByaW50ZXIgPSB0cy5jcmVhdGVQcmludGVyKHsgbmV3TGluZTogdHMuTmV3TGluZUtpbmQuTGluZUZlZWQgfSk7XG4gIHJldHVybiBwcmludGVyLnByaW50Tm9kZSh0cy5FbWl0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
238
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXBhcnNlci5qcyIsIm5hbWVzIjpbImFyck5vZGUiLCJsaXRlcmFsTm9kZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvYXBpLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5cbmltcG9ydCB0cyBmcm9tIFwiQHR5cGVzY3JpcHQvdHlwZXNjcmlwdDZcIjtcbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5cbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIFJlc29sdmVkV2ViU29ja2V0RGVjb3JhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVNZXRob2ROYW1lIH0gZnJvbSBcIi4uL2FwaS92YWxpZGF0b3JcIjtcbmltcG9ydCB7IHR5cGUgQXBpUGFyYW0sIHR5cGUgQXBpUGFyYW1UeXBlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5cbnR5cGUgV2ViU29ja2V0VHlwZVJlZnMgPSBQaWNrPFxuICBSZXNvbHZlZFdlYlNvY2tldERlY29yYXRvck9wdGlvbnMsXG4gIFwib3V0RXZlbnRzVHlwZVJlZlwiIHwgXCJpbkV2ZW50c1R5cGVSZWZcIlxuPjtcbnR5cGUgUGFyc2VkTWV0aG9kID0ge1xuICBtb2RlbE5hbWU6IHN0cmluZztcbiAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICB0eXBlUGFyYW1ldGVyczogQXBpUGFyYW1UeXBlLlR5cGVQYXJhbVtdO1xuICBwYXJhbWV0ZXJzOiBBcGlQYXJhbVtdO1xuICByZXR1cm5UeXBlOiBBcGlQYXJhbVR5cGU7XG4gIHdlYnNvY2tldFR5cGVSZWZzOiBXZWJTb2NrZXRUeXBlUmVmcztcbn07XG5cbi8qKlxuICogVHlwZVNjcmlwdCDtjIzsnbzsnYQg7YyM7Iux7ZWY7JesIEFQSSDrqZTshozrk5wg7KCV67O066W8IOy2lOy2nO2VqeuLiOuLpC5cbiAqIEBhcGkg642w7L2U66CI7J207YSw6rCAIOu2meydgCDrqZTshozrk5zrk6TsnZgg7YOA7J6FIOygleuztOulvCDrtoTshJ3tlanri4jri6QuXG4gKiBAcGFyYW0gZmlsZVBhdGggLSDtjIzsi7HtlaAgVHlwZVNjcmlwdCDtjIzsnbzsnZgg7KCI64yAIOqyveuhnFxuICogQHJldHVybnMgQVBJIOuplOyGjOuTnCDsoJXrs7Qg67Cw7Je0ICjtg4DsnoUg7YyM652866+47YSwLCDtjIzrnbzrr7jthLAsIOumrO2EtCDtg4DsnoUg65OxKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFwaXNGcm9tRmlsZShmaWxlUGF0aDogQWJzb2x1dGVQYXRoKTogUHJvbWlzZTxFeHRlbmRlZEFwaVtdPiB7XG4gIGlmICghZmlsZVBhdGguZW5kc1dpdGgoXCIudHNcIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtmaWxlUGF0aH0gZG9lcyBub3Qgc2VlbSB0byBiZSBhIFR5cGVTY3JpcHQgZmlsZS4gUGxlYXNlIGNoZWNrIHRoZSBmaWxlIHBhdGguIFdlIG9ubHkgc3VwcG9ydCBwYXJzaW5nIFR5cGVTY3JpcHQgZmlsZXMuYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgZmlsZVBhdGgsXG4gICAgKGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoKSkudG9TdHJpbmcoKSxcbiAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICApO1xuXG4gIGNvbnN0IG1ldGhvZHM6IFBhcnNlZE1ldGhvZFtdID0gW107XG4gIGxldCBtb2RlbE5hbWU6IHN0cmluZyA9IFwiVW5rbm93bk1vZGVsXCI7XG4gIGxldCBtZXRob2ROYW1lOiBzdHJpbmcgPSBcInVua25vd25NZXRob2RcIjtcbiAgY29uc3QgdmlzaXRvciA9IChub2RlOiB0cy5Ob2RlKSA9PiB7XG4gICAgaWYgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgaWYgKG5vZGUubmFtZSAmJiB0cy5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICBtb2RlbE5hbWUgPSBub2RlLm5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKS5yZXBsYWNlKC9DbGFzcyQvLCBcIlwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICBtZXRob2ROYW1lID0gbm9kZS5uYW1lLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCk7XG4gICAgICAgIHZhbGlkYXRlTWV0aG9kTmFtZShtZXRob2ROYW1lKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnM6IEFwaVBhcmFtVHlwZS5UeXBlUGFyYW1bXSA9IChub2RlLnR5cGVQYXJhbWV0ZXJzID8/IFtdKS5tYXAoXG4gICAgICAgICh0eXBlUGFyYW0pID0+IHtcbiAgICAgICAgICBjb25zdCB0cCA9IHR5cGVQYXJhbTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0OiBcInR5cGUtcGFyYW1cIixcbiAgICAgICAgICAgIGlkOiB0cC5uYW1lLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBjb25zdHJhaW50OiB0cC5jb25zdHJhaW50ID8gcmVzb2x2ZVR5cGVOb2RlKHRwLmNvbnN0cmFpbnQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgY29uc3QgcGFyYW1ldGVyczogQXBpUGFyYW1bXSA9IG5vZGUucGFyYW1ldGVycy5tYXAoKHBhcmFtRGVjLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBkZWZhdWx0RGVmID0gcHJpbnROb2RlKHBhcmFtRGVjLmluaXRpYWxpemVyLCBzb3VyY2VGaWxlKTtcblxuICAgICAgICAvLyDquLDrs7jqsJLsnbQg7J6I64qUIOqyveyasCBwYXJhbURlYy50eXBl6rCAIHVuZGVmaW5lZOuhnCDrgpjsmLRcblxuICAgICAgICByZXR1cm4gcmVzb2x2ZVBhcmFtRGVjKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IHBhcmFtRGVjLm5hbWUsXG4gICAgICAgICAgICB0eXBlOiAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHBhcmFtRGVjLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICBvcHRpb25hbDogcGFyYW1EZWMucXVlc3Rpb25Ub2tlbiAhPT0gdW5kZWZpbmVkIHx8IHBhcmFtRGVjLmluaXRpYWxpemVyICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZWZhdWx0RGVmLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOumrO2EtCDtg4DsnoXsnbQg6riw7J6s65CY7KeAIOyViuydgCDrqZTshozrk5wgJHttb2RlbE5hbWV9LiR7bWV0aG9kTmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJldHVyblR5cGUgPSByZXNvbHZlVHlwZU5vZGUobm9kZS50eXBlKTtcbiAgICAgIGNvbnN0IHdlYnNvY2tldFR5cGVSZWZzID0gcmVhZFdlYlNvY2tldFR5cGVSZWZzKG5vZGUpO1xuXG4gICAgICBtZXRob2RzLnB1c2goe1xuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHR5cGVQYXJhbWV0ZXJzLFxuICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICByZXR1cm5UeXBlLFxuICAgICAgICB3ZWJzb2NrZXRUeXBlUmVmcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXRvcik7XG4gIH07XG4gIHZpc2l0b3Ioc291cmNlRmlsZSk7XG5cbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8g7ZiE7J6sIO2MjOydvOydmCDrk7HroZ3rkJwgQVBJIO2VhO2EsFxuICBjb25zdCBjdXJyZW50TW9kZWxBcGlzID0gcmVnaXN0ZXJlZEFwaXMuZmlsdGVyKChhcGkpID0+IHtcbiAgICByZXR1cm4gbWV0aG9kcy5maW5kKFxuICAgICAgKG1ldGhvZCkgPT4gbWV0aG9kLm1vZGVsTmFtZSA9PT0gYXBpLm1vZGVsTmFtZSAmJiBtZXRob2QubWV0aG9kTmFtZSA9PT0gYXBpLm1ldGhvZE5hbWUsXG4gICAgKTtcbiAgfSk7XG4gIGlmIChjdXJyZW50TW9kZWxBcGlzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIGNvbnN0IHAgPSBwYXRoLmpvaW4odG1wZGlyKCksIFwic29uYW11LXN5bmNlci1lcnJvci5qc29uXCIpO1xuICAgIC8vIHdyaXRlRmlsZVN5bmMocCwgSlNPTi5zdHJpbmdpZnkocmVnaXN0ZXJlZEFwaXMsIG51bGwsIDIpKTtcbiAgICAvLyBleGVjU3luYyhgb3BlbiAke3B9YCk7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKGDtmITsnqwg7YyM7J287JeQIOyCrOyghCDrk7HroZ3rkJwgQVBJ6rCAIOyXhuyKteuLiOuLpC4gJHtmaWxlUGF0aH1gKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvLyDrk7HroZ3rkJwgQVBJ7JeQIO2YhOyerCDrqZTshozrk5wg7YOA7J6FIOygleuztCDtmZXsnqVcbiAgY29uc3QgZXh0ZW5kZWRBcGlzID0gY3VycmVudE1vZGVsQXBpcy5tYXAoKGFwaSkgPT4ge1xuICAgIGNvbnN0IGZvdW5kTWV0aG9kID0gbWV0aG9kcy5maW5kKFxuICAgICAgKG1ldGhvZCkgPT4gbWV0aG9kLm1vZGVsTmFtZSA9PT0gYXBpLm1vZGVsTmFtZSAmJiBtZXRob2QubWV0aG9kTmFtZSA9PT0gYXBpLm1ldGhvZE5hbWUsXG4gICAgKTtcbiAgICBpZiAoIWZvdW5kTWV0aG9kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFQSSAke2FwaS5tb2RlbE5hbWV9LiR7YXBpLm1ldGhvZE5hbWV9IG5vdCBmb3VuZCBpbiAke2ZpbGVQYXRofWApO1xuICAgIH1cbiAgICBjb25zdCB3ZWJzb2NrZXRPcHRpb25zID0gYXBpLndlYnNvY2tldE9wdGlvbnNcbiAgICAgID8ge1xuICAgICAgICAgIC4uLmFwaS53ZWJzb2NrZXRPcHRpb25zLFxuICAgICAgICAgIC4uLmZvdW5kTWV0aG9kLndlYnNvY2tldFR5cGVSZWZzLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5hcGksXG4gICAgICB3ZWJzb2NrZXRPcHRpb25zLFxuICAgICAgdHlwZVBhcmFtZXRlcnM6IGZvdW5kTWV0aG9kPy50eXBlUGFyYW1ldGVycyxcbiAgICAgIHBhcmFtZXRlcnM6IGZvdW5kTWV0aG9kPy5wYXJhbWV0ZXJzLFxuICAgICAgcmV0dXJuVHlwZTogZm91bmRNZXRob2Q/LnJldHVyblR5cGUsXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiBleHRlbmRlZEFwaXM7XG59XG5cbmZ1bmN0aW9uIHJlYWRXZWJTb2NrZXRUeXBlUmVmcyhub2RlOiB0cy5NZXRob2REZWNsYXJhdGlvbik6IFdlYlNvY2tldFR5cGVSZWZzIHtcbiAgY29uc3Qgb3B0aW9uc0xpdGVyYWwgPSBnZXREZWNvcmF0b3JPcHRpb25zT2JqZWN0TGl0ZXJhbChub2RlLCBcIndlYnNvY2tldFwiKTtcbiAgaWYgKCFvcHRpb25zTGl0ZXJhbCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHJlZnM6IFdlYlNvY2tldFR5cGVSZWZzID0ge307XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb3B0aW9uc0xpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBnZXRQcm9wZXJ0eU5hbWVUZXh0KHByb3BlcnR5Lm5hbWUpO1xuICAgIGlmIChwcm9wZXJ0eU5hbWUgIT09IFwib3V0RXZlbnRzXCIgJiYgcHJvcGVydHlOYW1lICE9PSBcImluRXZlbnRzXCIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGVSZWYgPSByZXNvbHZlRGVjb3JhdG9yVHlwZVJlZihwcm9wZXJ0eS5pbml0aWFsaXplcik7XG4gICAgaWYgKCF0eXBlUmVmKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcGVydHlOYW1lID09PSBcIm91dEV2ZW50c1wiKSB7XG4gICAgICByZWZzLm91dEV2ZW50c1R5cGVSZWYgPSB0eXBlUmVmO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWZzLmluRXZlbnRzVHlwZVJlZiA9IHR5cGVSZWY7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlZnM7XG59XG5cbmZ1bmN0aW9uIGdldERlY29yYXRvck9wdGlvbnNPYmplY3RMaXRlcmFsKFxuICBub2RlOiB0cy5NZXRob2REZWNsYXJhdGlvbixcbiAgZGVjb3JhdG9yTmFtZTogc3RyaW5nLFxuKTogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IG1vZGlmaWVyIG9mIG5vZGUubW9kaWZpZXJzID8/IFtdKSB7XG4gICAgaWYgKCF0cy5pc0RlY29yYXRvcihtb2RpZmllcikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBtb2RpZmllci5leHByZXNzaW9uO1xuICAgIGlmICghdHMuaXNDYWxsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCF0cy5pc0lkZW50aWZpZXIoZXhwcmVzc2lvbi5leHByZXNzaW9uKSB8fCBleHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCAhPT0gZGVjb3JhdG9yTmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0QXJnXSA9IGV4cHJlc3Npb24uYXJndW1lbnRzO1xuICAgIGlmIChmaXJzdEFyZyAmJiB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJnKSkge1xuICAgICAgcmV0dXJuIGZpcnN0QXJnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5TmFtZVRleHQobmFtZTogdHMuUHJvcGVydHlOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzLmlzSWRlbnRpZmllcihuYW1lKSB8fCB0cy5pc1N0cmluZ0xpdGVyYWwobmFtZSkgfHwgdHMuaXNOdW1lcmljTGl0ZXJhbChuYW1lKSkge1xuICAgIHJldHVybiBuYW1lLnRleHQ7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVjb3JhdG9yVHlwZVJlZihleHByZXNzaW9uOiB0cy5FeHByZXNzaW9uKTogQXBpUGFyYW1UeXBlLlJlZiB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cy5pc0lkZW50aWZpZXIoZXhwcmVzc2lvbikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdDogXCJyZWZcIixcbiAgICAgIGlkOiBleHByZXNzaW9uLnRleHQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChcbiAgICB0cy5pc0FzRXhwcmVzc2lvbihleHByZXNzaW9uKSB8fFxuICAgIHRzLmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oZXhwcmVzc2lvbikgfHxcbiAgICB0cy5pc05vbk51bGxFeHByZXNzaW9uKGV4cHJlc3Npb24pIHx8XG4gICAgdHMuaXNUeXBlQXNzZXJ0aW9uRXhwcmVzc2lvbihleHByZXNzaW9uKVxuICApIHtcbiAgICByZXR1cm4gcmVzb2x2ZURlY29yYXRvclR5cGVSZWYoZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUeXBlTm9kZSh0eXBlTm9kZTogdHMuVHlwZU5vZGUpOiBBcGlQYXJhbVR5cGUge1xuICBzd2l0Y2ggKHR5cGVOb2RlPy5raW5kKSB7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkFueUtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJhbnlcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5rbm93bktleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlN0cmluZ0tleXdvcmQ6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuTnVtYmVyS2V5d29yZDpcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZDpcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZDpcbiAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5OdWxsS2V5d29yZDpcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVm9pZEtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ2b2lkXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkxpdGVyYWxUeXBlOiB7XG4gICAgICBjb25zdCBsaXRlcmFsID1cbiAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgdHlwZU5vZGUgYXMgdHMuTGl0ZXJhbFR5cGVOb2RlXG4gICAgICAgICkubGl0ZXJhbDtcbiAgICAgIGlmICh0cy5pc1N0cmluZ0xpdGVyYWwobGl0ZXJhbCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0OiBcInN0cmluZy1saXRlcmFsXCIsXG4gICAgICAgICAgdmFsdWU6IGxpdGVyYWwudGV4dCxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHMuaXNOdW1lcmljTGl0ZXJhbChsaXRlcmFsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHQ6IFwibnVtZXJpYy1saXRlcmFsXCIsXG4gICAgICAgICAgdmFsdWU6IE51bWJlcihsaXRlcmFsLnRleHQpLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGxpdGVyYWwua2luZCA9PT0gdHMuU3ludGF4S2luZC5OdWxsS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgICAgICB9IGVsc2UgaWYgKGxpdGVyYWwua2luZCA9PT0gdHMuU3ludGF4S2luZC5UcnVlS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcInRydWVcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuRmFsc2VLZXl3b3JkKSB7XG4gICAgICAgICAgcmV0dXJuIFwiZmFsc2VcIjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLslYwg7IiYIOyXhuuKlCDrpqzthLDrn7RcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5BcnJheVR5cGU6IHtcbiAgICAgIGNvbnN0IGFyck5vZGUgPVxuICAgICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHR5cGVOb2RlIGFzIHRzLkFycmF5VHlwZU5vZGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcImFycmF5XCIsXG4gICAgICAgIGVsZW1lbnRzVHlwZTogcmVzb2x2ZVR5cGVOb2RlKGFyck5vZGUuZWxlbWVudFR5cGUpLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlR5cGVMaXRlcmFsOiB7XG4gICAgICBjb25zdCBsaXRlcmFsTm9kZSA9XG4gICAgICAgIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gdHlwZU5vZGUgYXMgdHMuVHlwZUxpdGVyYWxOb2RlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcHM6IGxpdGVyYWxOb2RlLm1lbWJlcnMubWFwKChtZW1iZXIpID0+IHtcbiAgICAgICAgICBpZiAodHMuaXNJbmRleFNpZ25hdHVyZURlY2xhcmF0aW9uKG1lbWJlcikpIHtcbiAgICAgICAgICAgIGFzc2VydChtZW1iZXIucGFyYW1ldGVyc1swXSk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSByZXNvbHZlUGFyYW1EZWMoe1xuICAgICAgICAgICAgICBuYW1lOiAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIG1lbWJlclxuICAgICAgICAgICAgICAgIC5wYXJhbWV0ZXJzWzBdLm5hbWUgYXMgdHMuSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgdHlwZTogLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBtZW1iZXJcbiAgICAgICAgICAgICAgICAucGFyYW1ldGVyc1swXS50eXBlIGFzIHRzLlR5cGVOb2RlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlUGFyYW1EZWMoe1xuICAgICAgICAgICAgICBuYW1lOiAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHtcbiAgICAgICAgICAgICAgICBlc2NhcGVkVGV4dDogYFske3Jlcy5uYW1lfSR7cmVzLm9wdGlvbmFsID8gXCI/XCIgOiBcIlwifTogJHtyZXMudHlwZX1dYCxcbiAgICAgICAgICAgICAgfSBhcyB0cy5JZGVudGlmaWVyLFxuICAgICAgICAgICAgICB0eXBlOiBtZW1iZXIudHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVBhcmFtRGVjKHtcbiAgICAgICAgICAgICAgbmFtZTogLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICAgICAgICBtZW1iZXIgYXMgdHMuUHJvcGVydHlTaWduYXR1cmVcbiAgICAgICAgICAgICAgKS5uYW1lIGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgICAgICAgbWVtYmVyIGFzIHRzLlByb3BlcnR5U2lnbmF0dXJlXG4gICAgICAgICAgICAgICkudHlwZSBhcyB0cy5UeXBlTm9kZSxcbiAgICAgICAgICAgICAgb3B0aW9uYWw6XG4gICAgICAgICAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgICAgICAgICBtZW1iZXIgYXMgdHMuUHJvcGVydHlTaWduYXR1cmVcbiAgICAgICAgICAgICAgICApLnF1ZXN0aW9uVG9rZW4gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVHlwZVJlZmVyZW5jZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwicmVmXCIsXG4gICAgICAgIGlkOiAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICh0eXBlTm9kZSBhcyB0cy5UeXBlUmVmZXJlbmNlTm9kZSkudHlwZU5hbWUgYXMgdHMuSWRlbnRpZmllclxuICAgICAgICApLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCksXG4gICAgICAgIGFyZ3M6IC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHR5cGVOb2RlIGFzIHRzLlR5cGVSZWZlcmVuY2VOb2RlXG4gICAgICAgICkudHlwZUFyZ3VtZW50cz8ubWFwKCh0eXBlQXJnKSA9PiByZXNvbHZlVHlwZU5vZGUodHlwZUFyZykpLFxuICAgICAgfTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5pb25UeXBlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJ1bmlvblwiLFxuICAgICAgICB0eXBlczogLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgdHlwZU5vZGUgYXMgdHMuVW5pb25UeXBlTm9kZVxuICAgICAgICApLnR5cGVzLm1hcCgodHlwZSkgPT4gcmVzb2x2ZVR5cGVOb2RlKHR5cGUpKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkludGVyc2VjdGlvblR5cGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcImludGVyc2VjdGlvblwiLFxuICAgICAgICB0eXBlczogLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgdHlwZU5vZGUgYXMgdHMuSW50ZXJzZWN0aW9uVHlwZU5vZGVcbiAgICAgICAgKS50eXBlcy5tYXAoKHR5cGUpID0+IHJlc29sdmVUeXBlTm9kZSh0eXBlKSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5JbmRleGVkQWNjZXNzVHlwZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwiaW5kZXhlZC1hY2Nlc3NcIixcbiAgICAgICAgb2JqZWN0OiByZXNvbHZlVHlwZU5vZGUoXG4gICAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgICB0eXBlTm9kZSBhcyB0cy5JbmRleGVkQWNjZXNzVHlwZU5vZGVcbiAgICAgICAgICApLm9iamVjdFR5cGUsXG4gICAgICAgICksXG4gICAgICAgIGluZGV4OiByZXNvbHZlVHlwZU5vZGUoXG4gICAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgICB0eXBlTm9kZSBhcyB0cy5JbmRleGVkQWNjZXNzVHlwZU5vZGVcbiAgICAgICAgICApLmluZGV4VHlwZSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlR1cGxlVHlwZTpcbiAgICAgIGlmICh0cy5pc1R1cGxlVHlwZU5vZGUodHlwZU5vZGUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdDogXCJ0dXBsZS10eXBlXCIsXG4gICAgICAgICAgZWxlbWVudHM6IHR5cGVOb2RlLmVsZW1lbnRzLm1hcCgoZWxlbSkgPT4gcmVzb2x2ZVR5cGVOb2RlKGVsZW0pKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5QYXJlbnRoZXNpemVkVHlwZTpcbiAgICAgIC8vIOq0hO2YuOuhnCDrrLbsnbgg7YOA7J6FICjsmIg6IChBICYgQilbXSDsl5DshJwgKEEgJiBCKSlcbiAgICAgIC8vIOuCtOu2gCDtg4DsnoXsnYQg7J6s6reA7KCB7Jy866GcIHJlc29sdmVcbiAgICAgIHJldHVybiByZXNvbHZlVHlwZU5vZGUoXG4gICAgICAgIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHR5cGVOb2RlIGFzIHRzLlBhcmVudGhlc2l6ZWRUeXBlTm9kZVxuICAgICAgICApLnR5cGUsXG4gICAgICApO1xuXG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkZ1bmN0aW9uVHlwZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgcGFyYW1ldGVyczpcbiAgICAgICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICAgIHR5cGVOb2RlIGFzIHRzLkZ1bmN0aW9uVHlwZU5vZGVcbiAgICAgICAgICApLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IHBhcmFtLm5hbWUuZ2V0VGV4dCgpLFxuICAgICAgICAgICAgdHlwZTogcGFyYW0udHlwZSA/IHJlc29sdmVUeXBlTm9kZShwYXJhbS50eXBlKSA6IFwidW5rbm93blwiLFxuICAgICAgICAgICAgb3B0aW9uYWw6IHBhcmFtLnF1ZXN0aW9uVG9rZW4gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlZmF1bHREZWY6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KSksXG4gICAgICAgIHJldHVyblR5cGU6IHJlc29sdmVUeXBlTm9kZShcbiAgICAgICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICAgIHR5cGVOb2RlIGFzIHRzLkZ1bmN0aW9uVHlwZU5vZGVcbiAgICAgICAgICApLnR5cGUsXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0eXBlTm9kZSB1bmRlZmluZWRgKTtcbiAgfVxuXG4gIGNvbnNvbGUuZGVidWcodHlwZU5vZGUpO1xuICB0aHJvdyBuZXcgRXJyb3IoYOyVjCDsiJgg7JeG64qUIFN5bnRheEtpbmQgJHt0eXBlTm9kZS5raW5kfWApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFyYW1EZWMoXG4gIHBhcmFtRGVjOiB7XG4gICAgbmFtZTogdHMuQmluZGluZ05hbWU7XG4gICAgdHlwZTogdHMuVHlwZU5vZGU7XG4gICAgb3B0aW9uYWw/OiBib29sZWFuO1xuICAgIGRlZmF1bHREZWY/OiBzdHJpbmc7XG4gIH0sXG4gIGluZGV4OiBudW1iZXIgPSAwLFxuKTogQXBpUGFyYW0ge1xuICBjb25zdCBuYW1lID1cbiAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHBhcmFtRGVjLm5hbWUgYXMgdHMuSWRlbnRpZmllcjtcbiAgY29uc3QgdHlwZSA9IHJlc29sdmVUeXBlTm9kZShwYXJhbURlYy50eXBlKTtcblxuICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5kZWJ1Zyh7IG5hbWUsIHR5cGUsIHBhcmFtRGVjIH0pO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBBcGlQYXJhbSA9IHtcbiAgICBuYW1lOiBuYW1lLmVzY2FwZWRUZXh0ID8gbmFtZS5lc2NhcGVkVGV4dC50b1N0cmluZygpIDogYG5vbmFtZUF0JHtpbmRleH1gLFxuICAgIHR5cGUsXG4gICAgb3B0aW9uYWw6IHBhcmFtRGVjLm9wdGlvbmFsID09PSB0cnVlLFxuICAgIGRlZmF1bHREZWY6IHBhcmFtRGVjPy5kZWZhdWx0RGVmLFxuICB9O1xuXG4gIC8vIOq1rOyhsOu2hO2VtO2VoOuLueydmCDqsr3smrAg7YOA7J6F7J2066aEIOyCrOyaqVxuICBpZiAoXG4gICAgdHMuaXNPYmplY3RCaW5kaW5nUGF0dGVybihuYW1lKSAmJlxuICAgIHRzLmlzVHlwZVJlZmVyZW5jZU5vZGUocGFyYW1EZWMudHlwZSkgJiZcbiAgICB0cy5pc0lkZW50aWZpZXIocGFyYW1EZWMudHlwZS50eXBlTmFtZSlcbiAgKSB7XG4gICAgcmVzdWx0Lm5hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKHBhcmFtRGVjLnR5cGUudHlwZU5hbWUudGV4dCwgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwcmludE5vZGUobm9kZTogdHMuTm9kZSB8IHVuZGVmaW5lZCwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgcHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIoeyBuZXdMaW5lOiB0cy5OZXdMaW5lS2luZC5MaW5lRmVlZCB9KTtcbiAgcmV0dXJuIHByaW50ZXIucHJpbnROb2RlKHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLCBub2RlLCBzb3VyY2VGaWxlKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFnQ0EsZUFBc0IsaUJBQWlCLFVBQWdEO0NBQ3JGLElBQUksQ0FBQyxTQUFTLFNBQVMsS0FBSyxHQUMxQixNQUFNLElBQUksTUFDUixHQUFHLFNBQVMsOEdBQ2Q7Q0FHRixNQUFNLGFBQWEsR0FBRyxpQkFDcEIsV0FDQyxNQUFNLFNBQVMsUUFBUSxFQUFBLENBQUcsU0FBUyxHQUNwQyxHQUFHLGFBQWEsTUFDbEI7Q0FFQSxNQUFNLFVBQTBCLENBQUM7Q0FDakMsSUFBSSxZQUFvQjtDQUN4QixJQUFJLGFBQXFCO0NBQ3pCLE1BQU0sV0FBVyxTQUFrQjtFQUNqQyxJQUFJLEdBQUcsbUJBQW1CLElBQUksR0FDNUI7T0FBSSxLQUFLLFFBQVEsR0FBRyxhQUFhLEtBQUssSUFBSSxHQUN4QyxZQUFZLEtBQUssS0FBSyxZQUFZLFNBQVMsQ0FBQyxDQUFDLFFBQVEsVUFBVSxFQUFFO0VBQ25FO0VBRUYsSUFBSSxHQUFHLG9CQUFvQixJQUFJLEdBQUc7R0FDaEMsSUFBSSxHQUFHLGFBQWEsS0FBSyxJQUFJLEdBQUc7SUFDOUIsYUFBYSxLQUFLLEtBQUssWUFBWSxTQUFTO0lBQzVDLG1CQUFtQixVQUFVO0dBQy9CO0dBRUEsTUFBTSxrQkFBNEMsS0FBSyxrQkFBa0IsQ0FBQyxFQUFBLENBQUcsS0FDMUUsY0FBYztJQUNiLE1BQU0sS0FBSztJQUVYLE9BQU87S0FDTCxHQUFHO0tBQ0gsSUFBSSxHQUFHLEtBQUssWUFBWSxTQUFTO0tBQ2pDLFlBQVksR0FBRyxhQUFhLGdCQUFnQixHQUFHLFVBQVUsSUFBSTtJQUMvRDtHQUNGLENBQ0Y7R0FDQSxNQUFNLGFBQXlCLEtBQUssV0FBVyxLQUFLLFVBQVUsVUFBVTtJQUN0RSxNQUFNLGFBQWEsVUFBVSxTQUFTLGFBQWEsVUFBVTtJQUk3RCxPQUFPLGdCQUNMO0tBQ0UsTUFBTSxTQUFTO0tBQ2YsTUFBaUUs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
@@ -9,7 +9,7 @@ import { createReadStream } from "fs";
9
9
  import path from "path";
10
10
  import crypto from "crypto";
11
11
  import equal from "fast-deep-equal";
12
- //#region src/syncer/checksum.ts
12
+ // src/syncer/checksum.ts
13
13
  /**
14
14
  * 체크섬 파일에 저장된 내용과 현재 실제 파일의 체크섬을 비교하여 변경된 파일을 찾습니다.
15
15
  * @returns 변경된 파일 경로 배열. 프로젝트 루트부터 슬래시로 시작합니다. 예시: "/src/application/user/user.model.ts"
@@ -26,7 +26,8 @@ async function findChangedFilesUsingChecksums() {
26
26
  */
27
27
  async function renewChecksums() {
28
28
  const calculatedChecksums = await getCurrentChecksums();
29
- if (equal(calculatedChecksums, await getPreviousChecksums())) return;
29
+ const savedChecksums = await getPreviousChecksums();
30
+ if (equal(calculatedChecksums, savedChecksums)) return;
30
31
  await saveChecksums(calculatedChecksums);
31
32
  }
32
33
  async function getCurrentChecksums() {
@@ -78,8 +79,7 @@ var init_checksum = __esmMin((() => {
78
79
  init_file_patterns();
79
80
  init_filesystem_dependencies();
80
81
  }));
81
- //#endregion
82
82
  init_checksum();
83
83
  export { findChangedFilesUsingChecksums, init_checksum, renewChecksums };
84
84
 
85
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzdW0uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9jaGVja3N1bS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0sIHR5cGUgUGF0aExpa2UgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgdHlwZSBBYnNvbHV0ZVBhdGgsIHR5cGUgQXBwUmVsYXRpdmVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoLCBHTE9CX0VYQ0xVREUgfSBmcm9tIFwiLi9maWxlLXBhdHRlcm5zXCI7XG5pbXBvcnQgeyBzeW5jZXJGaWxlRXhpc3RzLCBzeW5jZXJGaWxlc3lzdGVtIH0gZnJvbSBcIi4vZmlsZXN5c3RlbS1kZXBlbmRlbmNpZXNcIjtcblxudHlwZSBQYXRoQW5kQ2hlY2tzdW0gPSB7XG4gIHBhdGg6IEFic29sdXRlUGF0aDtcbiAgY2hlY2tzdW06IHN0cmluZztcbn07XG5cbi8qKlxuICog7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXrkJwg64K07Jqp6rO8IO2YhOyerCDsi6TsoJwg7YyM7J287J2YIOyytO2BrOyErOydhCDruYTqtZDtlZjsl6wg67OA6rK965CcIO2MjOydvOydhCDssL7sirXri4jri6QuXG4gKiBAcmV0dXJucyDrs4Dqsr3rkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuIO2UhOuhnOygne2KuCDro6jtirjrtoDthLAg7Iqs656Y7Iuc66GcIOyLnOyeke2VqeuLiOuLpC4g7JiI7IucOiBcIi9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gIGNvbnN0IGNhbGN1bGF0ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRDdXJyZW50Q2hlY2tzdW1zKCk7XG4gIGNvbnN0IHNhdmVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0UHJldmlvdXNDaGVja3N1bXMoKTtcblxuICBjb25zdCBpc1NhbWUgPSBlcXVhbChjYWxjdWxhdGVkQ2hlY2tzdW1zLCBzYXZlZENoZWNrc3Vtcyk7XG4gIGlmIChpc1NhbWUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gZGlmZmVyZW5jZVdpdGgoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMsIGlzRXF1YWwpLm1hcCgocikgPT4gci5wYXRoKTtcbn1cblxuLyoqXG4gKiDssrTtgazshKzsnYQg6rCx7Iug7ZWp64uI64ukLlxuICog7ZiE7J6sIO2MjOydvOuTpOydmCDssrTtgazshKzsnYQg6rOE7IKw7ZW07IScIOq1rO2VnCDri6TsnYwsIOyytO2BrOyErCDtjIzsnbzsl5Ag7KCA7J6l65CcIOuCtOyaqeqzvCDri6TrpbTrqbQg7LK07YGs7ISsIO2MjOydvOydhCDqsLHsi6Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FsY3VsYXRlZENoZWNrc3VtcyA9IGF3YWl0IGdldEN1cnJlbnRDaGVja3N1bXMoKTtcbiAgY29uc3Qgc2F2ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRQcmV2aW91c0NoZWNrc3VtcygpO1xuXG4gIGNvbnN0IGlzU2FtZSA9IGVxdWFsKGNhbGN1bGF0ZWRDaGVja3N1bXMsIHNhdmVkQ2hlY2tzdW1zKTtcbiAgaWYgKGlzU2FtZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHNhdmVDaGVja3N1bXMoY2FsY3VsYXRlZENoZWNrc3Vtcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRDaGVja3N1bXMoKTogUHJvbWlzZTxQYXRoQW5kQ2hlY2tzdW1bXT4ge1xuICBjb25zdCBhbGxQYXRocyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkubWFwKChbX2ZpbGVUeXBlLCBwYXR0ZXJuXSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2xvYkFzeW5jKHBhdHRlcm4sIHsgZXhjbHVkZTogR0xPQl9FWENMVURFIH0pO1xuICAgICAgfSksXG4gICAgKVxuICApLmZsYXQoKTtcblxuICAvLyDrj5nsnbwg7YyM7J287J20IOyXrOufrCDtjKjthLTsl5Ag66ek7LmY65CgIOyImCDsnojsnLzrr4DroZwo7JiIOiBzZC5nZW5lcmF0ZWQudHPripQgZ2VuZXJhdGVk7JmAIHNkR2VuZXJhdGVk7JeQIOuqqOuRkCDrp6TsuZgpXG4gIC8vIOykkeuztSDsoJzqsbAg7ZuEIOyViOyglSDsoJXroKwuXG4gIGNvbnN0IGZpbGVQYXRocyA9XG4gICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBBcnJheS5mcm9tKFxuICAgICAgbmV3IFNldChhbGxQYXRocyksXG4gICAgKS50b1NvcnRlZCgpIGFzIEFic29sdXRlUGF0aFtdO1xuXG4gIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBmaWxlUGF0aHMubWFwKGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgIGNoZWNrc3VtOiBhd2FpdCBnZXRDaGVja3N1bU9mRmlsZShmaWxlUGF0aCksXG4gICAgICB9O1xuICAgIH0pLFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQcmV2aW91c0NoZWNrc3VtcygpOiBQcm9taXNlPFBhdGhBbmRDaGVja3N1bVtdPiB7XG4gIGNvbnN0IGNoZWNrc3VtRmlsZVBhdGggPSBnZXRDaGVja3N1bUZpbGVQYXRoKCk7XG4gIGlmICghKGF3YWl0IHN5bmNlckZpbGVFeGlzdHMoY2hlY2tzdW1GaWxlUGF0aCkpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcmV2aW91c0NoZWNrc3VtcyA9XG4gICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIEpTT04ucGFyc2UoXG4gICAgICAgIGF3YWl0IHN5bmNlckZpbGVzeXN0ZW0ucmVhZEZpbGUoY2hlY2tzdW1GaWxlUGF0aCwgXCJ1dGYtOFwiKSxcbiAgICAgICkubWFwKChyOiB7IHBhdGg6IEFwcFJlbGF0aXZlUGF0aDsgY2hlY2tzdW06IHN0cmluZyB9KSA9PiAoe1xuICAgICAgICBwYXRoOiBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCByLnBhdGgpLCAvLyDssrTtgazshKwg7YyM7J287JeQ7IScIOydveydhCDrlYw6IGFwcFJvb3Qg7IOB64yAIOqyveuhnCDihpIg7KCI64yAIOqyveuhnFxuICAgICAgICBjaGVja3N1bTogci5jaGVja3N1bSxcbiAgICAgIH0pKSBhcyBQYXRoQW5kQ2hlY2tzdW1bXTtcbiAgICByZXR1cm4gcHJldmlvdXNDaGVja3N1bXM7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyDssrTtgazshKwg7YyM7J287J20IOyGkOyDgeuQnCDqsr3smrAg67mIIOuwsOyXtCDrsJjtmZggKOyghOyytCDsnqzrj5nquLDtmZQg7Jyg64+EKVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGDssrTtgazshKwg7YyM7J28KCR7Y2hlY2tzdW1GaWxlUGF0aH0p7J2EIO2MjOyLse2VmOuKlCDrjbAg7Iuk7Yyo7ZaI7Iq164uI64ukLiDsoITssrQg7J6s64+Z6riw7ZmU66W8IOynhO2Wie2VqeuLiOuLpC5gLFxuICAgICAgZSxcbiAgICApO1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDaGVja3N1bUZpbGVQYXRoKCk6IEFic29sdXRlUGF0aCB7XG4gIHJldHVybiAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHBhdGguam9pbihcbiAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgXCJzb25hbXUubG9ja1wiLFxuICApIGFzIEFic29sdXRlUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUNoZWNrc3VtcyhjaGVja3N1bXM6IFBhdGhBbmRDaGVja3N1bVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNoZWNrc3VtRmlsZVBhdGggPSBnZXRDaGVja3N1bUZpbGVQYXRoKCk7XG4gIC8vIGFwcFJvb3Qg7IOB64yAIOqyveuhnOuhnCDsp4HroKztmZQgKyDslYztjIzrsrMg7JWI7KCVIOygleugrCAoUFIgZGlmZiDquajrgZftlZjqsowg7Jyg7KeAKVxuICBjb25zdCBzZXJpYWxpemVkID0gY2hlY2tzdW1zXG4gICAgLm1hcCgocikgPT4gKHtcbiAgICAgIHBhdGg6IHBhdGgucmVsYXRpdmUoU29uYW11LmFwcFJvb3RQYXRoLCByLnBhdGgpLCAvLyDssrTtgazshKwg7YyM7J287JeQIOyggOyepe2VoCDrlYw6IOygiOuMgCDqsr3roZwg4oaSIGFwcFJvb3Qg7IOB64yAIOqyveuhnFxuICAgICAgY2hlY2tzdW06IHIuY2hlY2tzdW0sXG4gICAgfSkpXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKTtcbiAgYXdhaXQgc3luY2VyRmlsZXN5c3RlbS53cml0ZUZpbGUoY2hlY2tzdW1GaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCwgbnVsbCwgMiksIFwidXRmLThcIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENoZWNrc3VtT2ZGaWxlKGZpbGVQYXRoOiBQYXRoTGlrZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTFcIik7XG4gIGNvbnN0IGlucHV0ID0gY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCk7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaW5wdXQpIHtcbiAgICBoYXNoLnVwZGF0ZShjaHVuayk7XG4gIH1cbiAgcmV0dXJuIGhhc2guZGlnZXN0KFwiaGV4XCIpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBLGVBQXNCLGlDQUEwRDtDQUM5RSxNQUFNLHNCQUFzQixNQUFNLG9CQUFvQjtDQUN0RCxNQUFNLGlCQUFpQixNQUFNLHFCQUFxQjtDQUdsRCxJQURlLE1BQU0scUJBQXFCLGNBQ3RDLEdBQ0YsT0FBTyxDQUFDO0NBR1YsT0FBTyxlQUFlLHFCQUFxQixnQkFBZ0IsT0FBTyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsSUFBSTtBQUN2Rjs7Ozs7QUFNQSxlQUFzQixpQkFBZ0M7Q0FDcEQsTUFBTSxzQkFBc0IsTUFBTSxvQkFBb0I7Q0FJdEQsSUFEZSxNQUFNLHFCQUFxQixNQUZiLHFCQUFxQixDQUc5QyxHQUNGO0NBR0YsTUFBTSxjQUFjLG1CQUFtQjtBQUN6QztBQUVBLGVBQWUsc0JBQWtEO0NBQy9ELE1BQU0sWUFDSixNQUFNLFFBQVEsSUFDWixPQUFPLFFBQVEsc0NBQXNDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLGFBQWE7RUFDcEYsT0FBTyxVQUFVLFNBQVMsRUFBRSxTQUFTLGFBQWEsQ0FBQztDQUNyRCxDQUFDLENBQ0gsRUFBQSxDQUNBLEtBQUs7Q0FJUCxNQUFNLFlBQ3VELE1BQU0sS0FDL0QsSUFBSSxJQUFJLFFBQVEsQ0FDbEIsQ0FBQyxDQUFDLFNBQVM7Q0FFYixPQUFPLE1BQU0sUUFBUSxJQUNuQixVQUFVLElBQUksT0FBTyxhQUFhO0VBQ2hDLE9BQU87R0FDTCxNQUFNO0dBQ04sVUFBVSxNQUFNLGtCQUFrQixRQUFRO0VBQzVDO0NBQ0YsQ0FBQyxDQUNIO0FBQ0Y7QUFFQSxlQUFlLHVCQUFtRDtDQUNoRSxNQUFNLG1CQUFtQixvQkFBb0I7Q0FDN0MsSUFBSSxDQUFFLE1BQU0saUJBQWlCLGdCQUFnQixHQUMzQyxPQUFPLENBQUM7Q0FHVixJQUFJO0VBUUYsT0FONkQsS0FBSyxNQUM5RCxNQUFNLGlCQUFpQixTQUFTLGtCQUFrQixPQUFPLENBQzNELENBQUMsQ0FBQyxLQUFLLE9BQW9EO0dBQ3pELE1BQU0sS0FBSyxLQUFLLE9BQU8sYUFBYSxFQUFFLElBQUk7R0FDMUMsVUFBVSxFQUFFO0VBQ2QsRUFDSztDQUNULFNBQVMsR0FBRztFQUVWLFFBQVEsS0FDTixVQUFVLGlCQUFpQixvQ0FDM0IsQ0FDRjtFQUNBLE9BQU8sQ0FBQztDQUNWO0FBQ0Y7QUFFQSxTQUFTLHNCQUFvQztDQUMzQyxPQUFrRSxLQUFLLEtBQ3JFLE9BQU8sYUFDUCxhQUNGO0FBQ0Y7QUFFQSxlQUFlLGNBQWMsV0FBNkM7Q0FDeEUsTUFBTSxtQkFBbUIsb0JBQW9CO0NBRTdDLE1BQU0sYUFBYSxVQUNoQixLQUFLLE9BQU87RUFDWCxNQUFNLEtBQUssU0FBUyxPQUFPLGFBQWEsRUFBRSxJQUFJO0VBQzlDLFVBQVUsRUFBRTtDQUNkLEVBQUUsQ0FBQyxDQUNGLFVBQVUsR0FBRyxNQUFNLEVBQUUsS0FBSyxjQUFjLEVBQUUsSUFBSSxDQUFDO0NBQ2xELE1BQU0saUJBQWlCLFVBQVUsa0JBQWtCLEtBQUssVUFBVSxZQUFZLE1BQU0sQ0FBQyxHQUFHLE9BQU87QUFDakc7QUFFQSxlQUFlLGtCQUFrQixVQUFxQztDQUNwRSxNQUFNLE9BQU8sT0FBTyxXQUFXLE1BQU07Q0FDckMsTUFBTSxRQUFRLGlCQUFpQixRQUFRO0NBQ3ZDLFdBQVcsTUFBTSxTQUFTLE9BQ3hCLEtBQUssT0FBTyxLQUFLO0NBRW5CLE9BQU8sS0FBSyxPQUFPLEtBQUs7QUFDMUI7O2FBekhzQztrQkFDVTtZQUVEO29CQUNzQzs4QkFDUCJ9
85
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzdW0uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9jaGVja3N1bS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0sIHR5cGUgUGF0aExpa2UgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgdHlwZSBBYnNvbHV0ZVBhdGgsIHR5cGUgQXBwUmVsYXRpdmVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoLCBHTE9CX0VYQ0xVREUgfSBmcm9tIFwiLi9maWxlLXBhdHRlcm5zXCI7XG5pbXBvcnQgeyBzeW5jZXJGaWxlRXhpc3RzLCBzeW5jZXJGaWxlc3lzdGVtIH0gZnJvbSBcIi4vZmlsZXN5c3RlbS1kZXBlbmRlbmNpZXNcIjtcblxudHlwZSBQYXRoQW5kQ2hlY2tzdW0gPSB7XG4gIHBhdGg6IEFic29sdXRlUGF0aDtcbiAgY2hlY2tzdW06IHN0cmluZztcbn07XG5cbi8qKlxuICog7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXrkJwg64K07Jqp6rO8IO2YhOyerCDsi6TsoJwg7YyM7J287J2YIOyytO2BrOyErOydhCDruYTqtZDtlZjsl6wg67OA6rK965CcIO2MjOydvOydhCDssL7sirXri4jri6QuXG4gKiBAcmV0dXJucyDrs4Dqsr3rkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuIO2UhOuhnOygne2KuCDro6jtirjrtoDthLAg7Iqs656Y7Iuc66GcIOyLnOyeke2VqeuLiOuLpC4g7JiI7IucOiBcIi9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gIGNvbnN0IGNhbGN1bGF0ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRDdXJyZW50Q2hlY2tzdW1zKCk7XG4gIGNvbnN0IHNhdmVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0UHJldmlvdXNDaGVja3N1bXMoKTtcblxuICBjb25zdCBpc1NhbWUgPSBlcXVhbChjYWxjdWxhdGVkQ2hlY2tzdW1zLCBzYXZlZENoZWNrc3Vtcyk7XG4gIGlmIChpc1NhbWUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gZGlmZmVyZW5jZVdpdGgoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMsIGlzRXF1YWwpLm1hcCgocikgPT4gci5wYXRoKTtcbn1cblxuLyoqXG4gKiDssrTtgazshKzsnYQg6rCx7Iug7ZWp64uI64ukLlxuICog7ZiE7J6sIO2MjOydvOuTpOydmCDssrTtgazshKzsnYQg6rOE7IKw7ZW07IScIOq1rO2VnCDri6TsnYwsIOyytO2BrOyErCDtjIzsnbzsl5Ag7KCA7J6l65CcIOuCtOyaqeqzvCDri6TrpbTrqbQg7LK07YGs7ISsIO2MjOydvOydhCDqsLHsi6Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FsY3VsYXRlZENoZWNrc3VtcyA9IGF3YWl0IGdldEN1cnJlbnRDaGVja3N1bXMoKTtcbiAgY29uc3Qgc2F2ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRQcmV2aW91c0NoZWNrc3VtcygpO1xuXG4gIGNvbnN0IGlzU2FtZSA9IGVxdWFsKGNhbGN1bGF0ZWRDaGVja3N1bXMsIHNhdmVkQ2hlY2tzdW1zKTtcbiAgaWYgKGlzU2FtZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHNhdmVDaGVja3N1bXMoY2FsY3VsYXRlZENoZWNrc3Vtcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRDaGVja3N1bXMoKTogUHJvbWlzZTxQYXRoQW5kQ2hlY2tzdW1bXT4ge1xuICBjb25zdCBhbGxQYXRocyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkubWFwKChbX2ZpbGVUeXBlLCBwYXR0ZXJuXSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2xvYkFzeW5jKHBhdHRlcm4sIHsgZXhjbHVkZTogR0xPQl9FWENMVURFIH0pO1xuICAgICAgfSksXG4gICAgKVxuICApLmZsYXQoKTtcblxuICAvLyDrj5nsnbwg7YyM7J287J20IOyXrOufrCDtjKjthLTsl5Ag66ek7LmY65CgIOyImCDsnojsnLzrr4DroZwo7JiIOiBzZC5nZW5lcmF0ZWQudHPripQgZ2VuZXJhdGVk7JmAIHNkR2VuZXJhdGVk7JeQIOuqqOuRkCDrp6TsuZgpXG4gIC8vIOykkeuztSDsoJzqsbAg7ZuEIOyViOyglSDsoJXroKwuXG4gIGNvbnN0IGZpbGVQYXRocyA9XG4gICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBBcnJheS5mcm9tKFxuICAgICAgbmV3IFNldChhbGxQYXRocyksXG4gICAgKS50b1NvcnRlZCgpIGFzIEFic29sdXRlUGF0aFtdO1xuXG4gIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBmaWxlUGF0aHMubWFwKGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgIGNoZWNrc3VtOiBhd2FpdCBnZXRDaGVja3N1bU9mRmlsZShmaWxlUGF0aCksXG4gICAgICB9O1xuICAgIH0pLFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQcmV2aW91c0NoZWNrc3VtcygpOiBQcm9taXNlPFBhdGhBbmRDaGVja3N1bVtdPiB7XG4gIGNvbnN0IGNoZWNrc3VtRmlsZVBhdGggPSBnZXRDaGVja3N1bUZpbGVQYXRoKCk7XG4gIGlmICghKGF3YWl0IHN5bmNlckZpbGVFeGlzdHMoY2hlY2tzdW1GaWxlUGF0aCkpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcmV2aW91c0NoZWNrc3VtcyA9XG4gICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIEpTT04ucGFyc2UoXG4gICAgICAgIGF3YWl0IHN5bmNlckZpbGVzeXN0ZW0ucmVhZEZpbGUoY2hlY2tzdW1GaWxlUGF0aCwgXCJ1dGYtOFwiKSxcbiAgICAgICkubWFwKChyOiB7IHBhdGg6IEFwcFJlbGF0aXZlUGF0aDsgY2hlY2tzdW06IHN0cmluZyB9KSA9PiAoe1xuICAgICAgICBwYXRoOiBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCByLnBhdGgpLCAvLyDssrTtgazshKwg7YyM7J287JeQ7IScIOydveydhCDrlYw6IGFwcFJvb3Qg7IOB64yAIOqyveuhnCDihpIg7KCI64yAIOqyveuhnFxuICAgICAgICBjaGVja3N1bTogci5jaGVja3N1bSxcbiAgICAgIH0pKSBhcyBQYXRoQW5kQ2hlY2tzdW1bXTtcbiAgICByZXR1cm4gcHJldmlvdXNDaGVja3N1bXM7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyDssrTtgazshKwg7YyM7J287J20IOyGkOyDgeuQnCDqsr3smrAg67mIIOuwsOyXtCDrsJjtmZggKOyghOyytCDsnqzrj5nquLDtmZQg7Jyg64+EKVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGDssrTtgazshKwg7YyM7J28KCR7Y2hlY2tzdW1GaWxlUGF0aH0p7J2EIO2MjOyLse2VmOuKlCDrjbAg7Iuk7Yyo7ZaI7Iq164uI64ukLiDsoITssrQg7J6s64+Z6riw7ZmU66W8IOynhO2Wie2VqeuLiOuLpC5gLFxuICAgICAgZSxcbiAgICApO1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDaGVja3N1bUZpbGVQYXRoKCk6IEFic29sdXRlUGF0aCB7XG4gIHJldHVybiAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHBhdGguam9pbihcbiAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgXCJzb25hbXUubG9ja1wiLFxuICApIGFzIEFic29sdXRlUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUNoZWNrc3VtcyhjaGVja3N1bXM6IFBhdGhBbmRDaGVja3N1bVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNoZWNrc3VtRmlsZVBhdGggPSBnZXRDaGVja3N1bUZpbGVQYXRoKCk7XG4gIC8vIGFwcFJvb3Qg7IOB64yAIOqyveuhnOuhnCDsp4HroKztmZQgKyDslYztjIzrsrMg7JWI7KCVIOygleugrCAoUFIgZGlmZiDquajrgZftlZjqsowg7Jyg7KeAKVxuICBjb25zdCBzZXJpYWxpemVkID0gY2hlY2tzdW1zXG4gICAgLm1hcCgocikgPT4gKHtcbiAgICAgIHBhdGg6IHBhdGgucmVsYXRpdmUoU29uYW11LmFwcFJvb3RQYXRoLCByLnBhdGgpLCAvLyDssrTtgazshKwg7YyM7J287JeQIOyggOyepe2VoCDrlYw6IOygiOuMgCDqsr3roZwg4oaSIGFwcFJvb3Qg7IOB64yAIOqyveuhnFxuICAgICAgY2hlY2tzdW06IHIuY2hlY2tzdW0sXG4gICAgfSkpXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKTtcbiAgYXdhaXQgc3luY2VyRmlsZXN5c3RlbS53cml0ZUZpbGUoY2hlY2tzdW1GaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCwgbnVsbCwgMiksIFwidXRmLThcIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENoZWNrc3VtT2ZGaWxlKGZpbGVQYXRoOiBQYXRoTGlrZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTFcIik7XG4gIGNvbnN0IGlucHV0ID0gY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCk7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaW5wdXQpIHtcbiAgICBoYXNoLnVwZGF0ZShjaHVuayk7XG4gIH1cbiAgcmV0dXJuIGhhc2guZGlnZXN0KFwiaGV4XCIpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBLGVBQXNCLGlDQUEwRDtDQUM5RSxNQUFNLHNCQUFzQixNQUFNLG9CQUFvQjtDQUN0RCxNQUFNLGlCQUFpQixNQUFNLHFCQUFxQjtDQUdsRCxJQURlLE1BQU0scUJBQXFCLGNBQ3RDLEdBQ0YsT0FBTyxDQUFDO0NBR1YsT0FBTyxlQUFlLHFCQUFxQixnQkFBZ0IsT0FBTyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsSUFBSTtBQUN2Rjs7Ozs7QUFNQSxlQUFzQixpQkFBZ0M7Q0FDcEQsTUFBTSxzQkFBc0IsTUFBTSxvQkFBb0I7Q0FDdEQsTUFBTSxpQkFBaUIsTUFBTSxxQkFBcUI7Q0FHbEQsSUFEZSxNQUFNLHFCQUFxQixjQUN0QyxHQUNGO0NBR0YsTUFBTSxjQUFjLG1CQUFtQjtBQUN6QztBQUVBLGVBQWUsc0JBQWtEO0NBQy9ELE1BQU0sWUFDSixNQUFNLFFBQVEsSUFDWixPQUFPLFFBQVEsc0NBQXNDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLGFBQWE7RUFDcEYsT0FBTyxVQUFVLFNBQVMsRUFBRSxTQUFTLGFBQWEsQ0FBQztDQUNyRCxDQUFDLENBQ0gsRUFBQSxDQUNBLEtBQUs7Q0FJUCxNQUFNLFlBQ3VELE1BQU0sS0FDL0QsSUFBSSxJQUFJLFFBQVEsQ0FDbEIsQ0FBQyxDQUFDLFNBQVM7Q0FFYixPQUFPLE1BQU0sUUFBUSxJQUNuQixVQUFVLElBQUksT0FBTyxhQUFhO0VBQ2hDLE9BQU87R0FDTCxNQUFNO0dBQ04sVUFBVSxNQUFNLGtCQUFrQixRQUFRO0VBQzVDO0NBQ0YsQ0FBQyxDQUNIO0FBQ0Y7QUFFQSxlQUFlLHVCQUFtRDtDQUNoRSxNQUFNLG1CQUFtQixvQkFBb0I7Q0FDN0MsSUFBSSxDQUFFLE1BQU0saUJBQWlCLGdCQUFnQixHQUMzQyxPQUFPLENBQUM7Q0FHVixJQUFJO0VBUUYsT0FONkQsS0FBSyxNQUM5RCxNQUFNLGlCQUFpQixTQUFTLGtCQUFrQixPQUFPLENBQzNELENBQUMsQ0FBQyxLQUFLLE9BQW9EO0dBQ3pELE1BQU0sS0FBSyxLQUFLLE9BQU8sYUFBYSxFQUFFLElBQUk7R0FDMUMsVUFBVSxFQUFFO0VBQ2QsRUFDSztDQUNULFNBQVMsR0FBRztFQUVWLFFBQVEsS0FDTixVQUFVLGlCQUFpQixvQ0FDM0IsQ0FDRjtFQUNBLE9BQU8sQ0FBQztDQUNWO0FBQ0Y7QUFFQSxTQUFTLHNCQUFvQztDQUMzQyxPQUFrRSxLQUFLLEtBQ3JFLE9BQU8sYUFDUCxhQUNGO0FBQ0Y7QUFFQSxlQUFlLGNBQWMsV0FBNkM7Q0FDeEUsTUFBTSxtQkFBbUIsb0JBQW9CO0NBRTdDLE1BQU0sYUFBYSxVQUNoQixLQUFLLE9BQU87RUFDWCxNQUFNLEtBQUssU0FBUyxPQUFPLGFBQWEsRUFBRSxJQUFJO0VBQzlDLFVBQVUsRUFBRTtDQUNkLEVBQUUsQ0FBQyxDQUNGLFVBQVUsR0FBRyxNQUFNLEVBQUUsS0FBSyxjQUFjLEVBQUUsSUFBSSxDQUFDO0NBQ2xELE1BQU0saUJBQWlCLFVBQVUsa0JBQWtCLEtBQUssVUFBVSxZQUFZLE1BQU0sQ0FBQyxHQUFHLE9BQU87QUFDakc7QUFFQSxlQUFlLGtCQUFrQixVQUFxQztDQUNwRSxNQUFNLE9BQU8sT0FBTyxXQUFXLE1BQU07Q0FDckMsTUFBTSxRQUFRLGlCQUFpQixRQUFRO0NBQ3ZDLFdBQVcsTUFBTSxTQUFTLE9BQ3hCLEtBQUssT0FBTyxLQUFLO0NBRW5CLE9BQU8sS0FBSyxPQUFPLEtBQUs7QUFDMUI7O0NBekhzQyxZQUFBO0NBQ1UsaUJBQUE7Q0FFRCxXQUFBO0NBQ3NDLG1CQUFBO0NBQ1AsNkJBQUEifQ==