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
@@ -3,7 +3,7 @@ import { init_runtime_value, isFunctionValue, isObjectValue } from "../utils/run
3
3
  import { init_runtime_type, runtimeTypeOf } from "../runtime-type.js";
4
4
  import { InMemoryEventStore, InMemoryMetricStore, InMemorySpanStore, init_ws_telemetry_memory } from "./ws-telemetry-memory.js";
5
5
  import { generateSpanId, generateTraceId, init_ws_telemetry_trace, parseTraceParent } from "./ws-telemetry-trace.js";
6
- //#region src/stream/ws-telemetry.ts
6
+ // src/stream/ws-telemetry.ts
7
7
  function isSensitiveKey(key) {
8
8
  const normalized = key.replace(/[^a-zA-Z0-9]/g, "").toLowerCase();
9
9
  return SENSITIVE_KEY_PATTERNS.some((pattern) => normalized.includes(pattern));
@@ -875,8 +875,7 @@ var init_ws_telemetry = __esmMin((() => {
875
875
  }
876
876
  };
877
877
  }));
878
- //#endregion
879
878
  init_ws_telemetry();
880
879
  export { DEFAULT_TRACE_OPTIONS, EMPTY_METRICS_SNAPSHOT, NoopWebSocketTelemetryController, WebSocketTelemetryControllerImpl, createWebSocketTelemetryController, init_ws_telemetry, isPromiseLike };
881
880
 
882
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGVsZW1ldHJ5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vd3MtdGVsZW1ldHJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJ1bnRpbWVUeXBlT2YgfSBmcm9tIFwiLi4vcnVudGltZS10eXBlXCI7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uVmFsdWUsIGlzT2JqZWN0VmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgSW5NZW1vcnlFdmVudFN0b3JlLCBJbk1lbW9yeU1ldHJpY1N0b3JlLCBJbk1lbW9yeVNwYW5TdG9yZSB9IGZyb20gXCIuL3dzLXRlbGVtZXRyeS1tZW1vcnlcIjtcbmltcG9ydCB7IGdlbmVyYXRlU3BhbklkLCBnZW5lcmF0ZVRyYWNlSWQsIHBhcnNlVHJhY2VQYXJlbnQgfSBmcm9tIFwiLi93cy10ZWxlbWV0cnktdHJhY2VcIjtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5VmFsdWUgPVxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCBiaWdpbnRcbiAgfCBib29sZWFuXG4gIHwgbnVtYmVyXG4gIHwgc3RyaW5nXG4gIHwgRGF0ZVxuICB8IFdlYlNvY2tldFRlbGVtZXRyeVZhbHVlW11cbiAgfCBXZWJTb2NrZXRUZWxlbWV0cnlBdHRyaWJ1dGVzO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeUF0dHJpYnV0ZXMge1xuICBba2V5OiBzdHJpbmddOiBXZWJTb2NrZXRUZWxlbWV0cnlWYWx1ZTtcbn1cblxuLy8gLS0gUmVjb3JkIHR5cGVzICh1bmNoYW5nZWQpIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZEJhc2UgPSB7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICBtb25vdG9uaWNUaW1lPzogbnVtYmVyO1xuICBydW50aW1lSWQ6IHN0cmluZztcbiAgbm9kZUlkOiBzdHJpbmc7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICAvLyB1c2VySWTripQgY29ubmVjdGlvbiDshozsnKDsnpDrpbwg7Iud67OE7ZWY6riwIOychO2VnCBvcGFxdWUgaWRlbnRpZmllciAo67O07Ya1IERCIFBLKVxuICAvLyBwc2V1ZG9ueW1vdXMgaWRlbnRpZmllcuuhnOunjCDsgqzsmqntlZjrqbAsIOydtOuplOydvC/soITtmZTrsojtmLgg65OxIFBJSeuKlCDrk6TslrTqsIDsp4Ag7JWK64qU64uk6rOgIOqwgOygle2VqFxuICB1c2VySWQ/OiBzdHJpbmc7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkID0gV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkQmFzZSAmIHtcbiAgdHlwZTogXCJldmVudFwiO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxldmVsOiBcImRlYnVnXCIgfCBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwiO1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG4gIGRldGFpbD86IFdlYlNvY2tldFRlbGVtZXRyeUF0dHJpYnV0ZXM7XG4gIHBheWxvYWRQcmV2aWV3Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkID0gV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkQmFzZSAmIHtcbiAgdHlwZTogXCJtZXRyaWNcIjtcbiAgbmFtZTogc3RyaW5nO1xuICBraW5kOiBcImNvdW50ZXJcIiB8IFwiaGlzdG9ncmFtXCIgfCBcImdhdWdlXCI7XG4gIHZhbHVlOiBudW1iZXI7XG4gIHVuaXQ/OiBcIjFcIiB8IFwibXNcIiB8IFwiQnlcIjtcbiAgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHNuYXBzaG90PzogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90O1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCA9IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZEJhc2UgJiB7XG4gIHR5cGU6IFwic3BhblwiO1xuICBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG4gIGtpbmQ6IFwiaW50ZXJuYWxcIiB8IFwicHJvZHVjZXJcIiB8IFwiY29uc3VtZXJcIiB8IFwic2VydmVyXCIgfCBcImNsaWVudFwiO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIHN0YXR1czogXCJ1bnNldFwiIHwgXCJva1wiIHwgXCJlcnJvclwiO1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG4gIGVycm9yVHlwZT86IHN0cmluZztcbiAgZXZlbnRzPzogQXJyYXk8e1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICBhdHRyaWJ1dGVzPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcztcbiAgfT47XG4gIGxpbmtzPzogQXJyYXk8e1xuICAgIHRyYWNlSWQ6IHN0cmluZztcbiAgICBzcGFuSWQ6IHN0cmluZztcbiAgICBhdHRyaWJ1dGVzPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcztcbiAgfT47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQgPVxuICB8IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkXG4gIHwgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkXG4gIHwgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZDtcblxuLy8gLS0gSW5wdXQgdHlwZXMgKHVuY2hhbmdlZCkgLS1cblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBsZXZlbDogXCJkZWJ1Z1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIjtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICBkZXRhaWw/OiBXZWJTb2NrZXRUZWxlbWV0cnlBdHRyaWJ1dGVzO1xuICBwYXlsb2FkPzogV2ViU29ja2V0VGVsZW1ldHJ5VmFsdWU7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldE1ldHJpY0lucHV0ID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGtpbmQ6IFwiY291bnRlclwiIHwgXCJoaXN0b2dyYW1cIiB8IFwiZ2F1Z2VcIjtcbiAgdmFsdWU6IG51bWJlcjtcbiAgdW5pdD86IFwiMVwiIHwgXCJtc1wiIHwgXCJCeVwiO1xuICB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc3BhbklkPzogc3RyaW5nO1xuICBwYXJlbnRTcGFuSWQ/OiBzdHJpbmc7XG4gIHNhbXBsZWQ/OiBib29sZWFuO1xuICBzbmFwc2hvdD86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdDtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFNwYW5JbnB1dCA9IHtcbiAgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICBraW5kOiBcImludGVybmFsXCIgfCBcInByb2R1Y2VyXCIgfCBcImNvbnN1bWVyXCIgfCBcInNlcnZlclwiIHwgXCJjbGllbnRcIjtcbiAgZHVyYXRpb25NczogbnVtYmVyO1xuICBzdGF0dXM6IFwidW5zZXRcIiB8IFwib2tcIiB8IFwiZXJyb3JcIjtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICBlcnJvclR5cGU/OiBzdHJpbmc7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbiAgZXZlbnRzPzogQXJyYXk8e1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICBhdHRyaWJ1dGVzPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcztcbiAgfT47XG4gIGxpbmtzPzogQXJyYXk8e1xuICAgIHRyYWNlSWQ6IHN0cmluZztcbiAgICBzcGFuSWQ6IHN0cmluZztcbiAgICBhdHRyaWJ1dGVzPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcztcbiAgfT47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlJbnB1dCA9XG4gIHwgKHsgdHlwZTogXCJldmVudFwiIH0gJiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KVxuICB8ICh7IHR5cGU6IFwibWV0cmljXCIgfSAmIFdlYlNvY2tldE1ldHJpY0lucHV0KVxuICB8ICh7IHR5cGU6IFwic3BhblwiIH0gJiBXZWJTb2NrZXRTcGFuSW5wdXQpO1xuXG4vLyAtLSBNZXRyaWNzIHNuYXBzaG90IC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdCA9IHtcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIGFjdGl2ZUNvbm5lY3Rpb25zOiBudW1iZXI7XG4gIGFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2U6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gIHJvb21Db3VudDogbnVtYmVyO1xuICBwZW5kaW5nSW5ib3VuZE1lc3NhZ2VzOiBudW1iZXI7XG4gIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiBudW1iZXI7XG4gIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IG51bWJlcjtcbiAgcGVuZGluZ0Zhbk91dEpvYnM6IG51bWJlcjtcbiAgcGVuZGluZ0Zhbk91dFRhcmdldHM6IG51bWJlcjtcbiAgdGVsZW1ldHJ5RHJvcHBlZFJlY29yZHM6IG51bWJlcjtcbiAgdGVsZW1ldHJ5U2lua0ZhaWx1cmVzOiBudW1iZXI7XG59O1xuXG4vLyAtLSBDb25uZWN0aW9uIHNuYXBzaG90IChUZWxlbWV0cnlJbnNwZWN0YWJsZUNvbm5lY3Rpb24pIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdCA9IHtcbiAgcGVuZGluZ0luYm91bmRNZXNzYWdlczogbnVtYmVyO1xuICBwZW5kaW5nT3V0Ym91bmRNZXNzYWdlczogbnVtYmVyO1xuICBzb2NrZXRCdWZmZXJlZEJ5dGVzOiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlbGVtZXRyeUluc3BlY3RhYmxlQ29ubmVjdGlvbiB7XG4gIGdldFRlbGVtZXRyeVNuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdDtcbn1cblxuLy8gLS0gU2lnbmFsLW5hcnJvd2VkIHNpbmtzIC0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rIHtcbiAgZW1pdChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHNodXRkb3duPyhvcHRpb25zPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1Npbmsge1xuICBlbWl0KHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHNodXRkb3duPyhvcHRpb25zPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rIHtcbiAgZW1pdChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgc2h1dGRvd24/KG9wdGlvbnM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG5cbi8vIC0tIFNpZ25hbC1uYXJyb3dlZCBxdWVyeSBmaWx0ZXJzIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UXVlcnlGaWx0ZXIgPSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGxldmVsPzogXCJkZWJ1Z1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIjtcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc2luY2U/OiBudW1iZXI7XG4gIHVudGlsPzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1F1ZXJ5RmlsdGVyID0ge1xuICBuYW1lPzogc3RyaW5nO1xuICBraW5kPzogXCJjb3VudGVyXCIgfCBcImhpc3RvZ3JhbVwiIHwgXCJnYXVnZVwiO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICB0cmFjZUlkPzogc3RyaW5nO1xuICBzaW5jZT86IG51bWJlcjtcbiAgdW50aWw/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblF1ZXJ5RmlsdGVyID0ge1xuICBvcGVyYXRpb25OYW1lPzogc3RyaW5nO1xuICBraW5kPzogXCJpbnRlcm5hbFwiIHwgXCJwcm9kdWNlclwiIHwgXCJjb25zdW1lclwiIHwgXCJzZXJ2ZXJcIiB8IFwiY2xpZW50XCI7XG4gIHN0YXR1cz86IFwidW5zZXRcIiB8IFwib2tcIiB8IFwiZXJyb3JcIjtcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc2luY2U/OiBudW1iZXI7XG4gIHVudGlsPzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbn07XG5cbi8vIC0tIFNpZ25hbC1uYXJyb3dlZCBzdG9yZXMgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHtcbiAgcmVhZG9ubHkgc2luazogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rO1xuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UXVlcnlGaWx0ZXIpOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtdO1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHtcbiAgcmVhZG9ubHkgc2luazogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2luaztcbiAgcXVlcnkoZmlsdGVyOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNRdWVyeUZpbHRlcik6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZFtdO1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB7XG4gIHJlYWRvbmx5IHNpbms6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rO1xuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5RdWVyeUZpbHRlcik6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmRbXTtcbiAgY2xlYXIoKTogdm9pZDtcbn1cblxuLy8gLS0gTWV0cmljIHNvdXJjZSBpbnRlcmZhY2UgKHVuY2hhbmdlZCkgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTb3VyY2Uge1xuICBjb2xsZWN0KG5vdzogbnVtYmVyKTogUGFydGlhbDxXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Q+O1xufVxuXG4vLyAtLSBSZWRhY3RvciAvIGJlZm9yZVJlY29yZCB0eXBlcyAoc2lnbmFsLW5hcnJvd2VkICsgc2hhcmVkKSAtLVxuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkLFxuKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCxcbikgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQgfCBudWxsO1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50QmVmb3JlUmVjb3JkID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkLFxuKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY0JlZm9yZVJlY29yZCA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5CZWZvcmVSZWNvcmQgPSAoXG4gIHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCxcbikgPT4gV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGw7XG5cbi8vIC0tIFRyYWNlIG9wdGlvbnMgLyBjb25uZWN0aW9uIGNvbnRleHQgLS1cblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zID0ge1xuICBleHRyYWN0VHJhY2VQYXJlbnQ6IGJvb2xlYW47XG4gIGdlbmVyYXRlQ29ubmVjdGlvblRyYWNlOiBib29sZWFuO1xuICBwcm9wYWdhdGVNZXNzYWdlVHJhY2U6IGJvb2xlYW47XG4gIHJlY29yZENvbm5lY3Rpb25MaWZldGltZVNwYW46IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCA9IHtcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc3BhbklkPzogc3RyaW5nO1xuICBwYXJlbnRTcGFuSWQ/OiBzdHJpbmc7XG4gIHNhbXBsZWQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIge1xuICBnZXRUZWxlbWV0cnlDb250ZXh0KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0O1xufVxuXG4vLyAtLSBPcHRpb25zIHNjaGVtYSAtLVxuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNhbXBsaW5nT3B0aW9ucyA9IHtcbiAgZGVmYXVsdFJhdGU/OiBudW1iZXI7XG4gIHJhdGVCeUV2ZW50PzogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgbWF4UmVjb3Jkc1BlclNlY29uZD86IG51bWJlcjtcbiAgYWx3YXlzUmVjb3JkTGV2ZWxzPzogQXJyYXk8XCJ3YXJuXCIgfCBcImVycm9yXCI+O1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2FtcGxpbmdPcHRpb25zID0ge1xuICBtYXhSZWNvcmRzUGVyU2Vjb25kPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNhbXBsaW5nT3B0aW9ucyA9IHtcbiAgZGVmYXVsdFJhdGU/OiBudW1iZXI7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlEZWZhdWx0c09wdGlvbnMgPSB7XG4gIHJlZGFjdG9yPzogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3I7XG4gIGJlZm9yZVJlY29yZD86IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZDtcbiAgbWF4UmVjb3Jkcz86IG51bWJlcjtcbiAgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudHNPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2lua1tdO1xuICBzdG9yZT86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmU7XG4gIG1heFJlY29yZHM/OiBudW1iZXI7XG4gIG1heEJ5dGVzPzogbnVtYmVyO1xuICBtYXhJbkZsaWdodEVtaXRzPzogbnVtYmVyO1xuICByZWRhY3Rvcj86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudEJlZm9yZVJlY29yZCB8IG51bGw7XG4gIHNhbXBsaW5nPzogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTYW1wbGluZ09wdGlvbnM7XG4gIGNhcHR1cmVQYXlsb2FkPzogZmFsc2UgfCBcInByZXZpZXdcIjtcbiAgbWF4UGF5bG9hZFByZXZpZXdCeXRlcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NpbmtbXTtcbiAgc3RvcmU/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTdG9yZTtcbiAgbWF4UmVjb3Jkcz86IG51bWJlcjtcbiAgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIG1heEluRmxpZ2h0RW1pdHM/OiBudW1iZXI7XG4gIHJlZGFjdG9yPzogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNCZWZvcmVSZWNvcmQgfCBudWxsO1xuICBzYW1wbGluZz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NhbXBsaW5nT3B0aW9ucztcbiAgY29sbGVjdGlvbkVuYWJsZWQ/OiBib29sZWFuO1xuICBzYW1wbGVJbnRlcnZhbE1zPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhbnNPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rW107XG4gIHN0b3JlPzogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlO1xuICBtYXhSZWNvcmRzPzogbnVtYmVyO1xuICBtYXhCeXRlcz86IG51bWJlcjtcbiAgbWF4SW5GbGlnaHRFbWl0cz86IG51bWJlcjtcbiAgcmVkYWN0b3I/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuQmVmb3JlUmVjb3JkIHwgbnVsbDtcbiAgc2FtcGxpbmc/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2FtcGxpbmdPcHRpb25zO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5T3B0aW9ucyA9IHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGNvbnRyb2xsZXI/OiBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyO1xuICBkZWZhdWx0cz86IFdlYlNvY2tldFRlbGVtZXRyeURlZmF1bHRzT3B0aW9ucztcbiAgZXZlbnRzPzogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRzT3B0aW9ucztcbiAgbWV0cmljcz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NPcHRpb25zO1xuICBzcGFucz86IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5zT3B0aW9ucztcbiAgdHJhY2U/OiBQYXJ0aWFsPFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucz47XG4gIHNodXRkb3duVGltZW91dE1zPzogbnVtYmVyO1xufTtcblxuLy8gLS0gQ29udHJvbGxlciBpbnRlcmZhY2UgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgZW1pdChpbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IHZvaWQ7XG4gIHJlY29yZE1ldHJpYyhpbnB1dDogV2ViU29ja2V0TWV0cmljSW5wdXQpOiB2b2lkO1xuICByZWNvcmRTcGFuKGlucHV0OiBXZWJTb2NrZXRTcGFuSW5wdXQpOiB2b2lkO1xuICBnZXRNZXRyaWNzU25hcHNob3QoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90O1xuICBnZXRFdmVudFN0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWQ7XG4gIGdldE1ldHJpY1N0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkO1xuICBnZXRTcGFuU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkO1xuICByZWdpc3Rlck1ldHJpY1NvdXJjZShzb3VyY2U6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZSk6ICgpID0+IHZvaWQ7XG4gIGNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KHJlcXVlc3Q/OiB7XG4gICAgaGVhZGVycz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPj47XG4gIH0pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dDtcbiAgZ2V0VHJhY2VPcHRpb25zKCk6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucztcbiAgc2h1dGRvd24ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vLyAtLSBDb25zdGFudHMgYW5kIHNoYXJlZCBoZWxwZXJzIChwcmVzZXJ2ZWQtYmVoYXZpb3IpIC0tXG5cbmV4cG9ydCBjb25zdCBFTVBUWV9NRVRSSUNTX1NOQVBTSE9UOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QgPSB7XG4gIHRpbWVzdGFtcDogMCxcbiAgYWN0aXZlQ29ubmVjdGlvbnM6IDAsXG4gIGFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2U6IHt9LFxuICByb29tQ291bnQ6IDAsXG4gIHBlbmRpbmdJbmJvdW5kTWVzc2FnZXM6IDAsXG4gIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiAwLFxuICBzb2NrZXRCdWZmZXJlZEJ5dGVzOiAwLFxuICBwZW5kaW5nRmFuT3V0Sm9iczogMCxcbiAgcGVuZGluZ0Zhbk91dFRhcmdldHM6IDAsXG4gIHRlbGVtZXRyeURyb3BwZWRSZWNvcmRzOiAwLFxuICB0ZWxlbWV0cnlTaW5rRmFpbHVyZXM6IDAsXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9UUkFDRV9PUFRJT05TOiBXZWJTb2NrZXRUZWxlbWV0cnlUcmFjZU9wdGlvbnMgPSB7XG4gIGV4dHJhY3RUcmFjZVBhcmVudDogdHJ1ZSxcbiAgZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2U6IHRydWUsXG4gIHByb3BhZ2F0ZU1lc3NhZ2VUcmFjZTogdHJ1ZSxcbiAgcmVjb3JkQ29ubmVjdGlvbkxpZmV0aW1lU3BhbjogZmFsc2UsXG59O1xuXG5jb25zdCBERUZBVUxUX01BWF9SRUNPUkRTX1BFUl9TRUNPTkQgPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX1NIVVRET1dOX1RJTUVPVVRfTVMgPSAyXzAwMDtcbmNvbnN0IERFRkFVTFRfRVZFTlRfU0FNUExJTkdfREVGQVVMVF9SQVRFID0gMS4wO1xuY29uc3QgREVGQVVMVF9FVkVOVF9BTFdBWVNfUkVDT1JEX0xFVkVMUzogUmVhZG9ubHlBcnJheTxcIndhcm5cIiB8IFwiZXJyb3JcIj4gPSBbXCJ3YXJuXCIsIFwiZXJyb3JcIl07XG5jb25zdCBERUZBVUxUX0VWRU5UX0NBUFRVUkVfUEFZTE9BRDogZmFsc2UgfCBcInByZXZpZXdcIiA9IGZhbHNlO1xuY29uc3QgREVGQVVMVF9FVkVOVF9NQVhfUEFZTE9BRF9QUkVWSUVXX0JZVEVTID0gMTAyNDtcbmNvbnN0IERFRkFVTFRfTUVUUklDX0NPTExFQ1RJT05fRU5BQkxFRCA9IHRydWU7XG5jb25zdCBERUZBVUxUX01FVFJJQ19TQU1QTEVfSU5URVJWQUxfTVMgPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX1NQQU5fU0FNUExJTkdfREVGQVVMVF9SQVRFID0gMS4wO1xuY29uc3QgREVGQVVMVF9NQVhfSU5fRkxJR0hUX0VNSVRTX1BFUl9TSU5LID0gMTAwO1xuXG5jb25zdCBTRU5TSVRJVkVfS0VZX1BBVFRFUk5TID0gW1xuICBcImF1dGhvcml6YXRpb25cIixcbiAgXCJjb29raWVcIixcbiAgXCJ0b2tlblwiLFxuICBcInBhc3N3b3JkXCIsXG4gIFwic2VjcmV0XCIsXG4gIFwiYXBpa2V5XCIsXG4gIFwic2Vzc2lvblwiLFxuICBcImVtYWlsXCIsXG5dIGFzIGNvbnN0O1xuY29uc3QgUkVEQUNURURfVkFMVUUgPSBcIltyZWRhY3RlZF1cIjtcblxuZnVuY3Rpb24gaXNTZW5zaXRpdmVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGtleS5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIFNFTlNJVElWRV9LRVlfUEFUVEVSTlMuc29tZSgocGF0dGVybikgPT4gbm9ybWFsaXplZC5pbmNsdWRlcyhwYXR0ZXJuKSk7XG59XG5cbmZ1bmN0aW9uIHJlZGFjdFZhbHVlKHZhbHVlOiBXZWJTb2NrZXRUZWxlbWV0cnlWYWx1ZSwga2V5Pzogc3RyaW5nKTogV2ViU29ja2V0VGVsZW1ldHJ5VmFsdWUge1xuICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgaXNTZW5zaXRpdmVLZXkoa2V5KSkge1xuICAgIHJldHVybiBSRURBQ1RFRF9WQUxVRTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHJlZGFjdFZhbHVlKGl0ZW0pKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpZiAodmFsdWUgJiYgaXNPYmplY3RWYWx1ZSh2YWx1ZSkpIHtcbiAgICBjb25zdCByZWRhY3RlZDogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcyA9IHt9O1xuICAgIGZvciAoY29uc3QgW2NoaWxkS2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIHJlZGFjdGVkW2NoaWxkS2V5XSA9IHJlZGFjdFZhbHVlKGNoaWxkVmFsdWUsIGNoaWxkS2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZGFjdGVkO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3Qg4oCUIHNlbnNpdGl2ZSBrZXkg7Yyo7YS0IOq4sOuwmCBidWlsdC1pbiByZWRhY3Rvci5cbiAqIHBpcGVsaW5lIGVtaXQgZmxvd+ydmCDssqsg64uo6rOE7JeQ7IScIO2VreyDgSDsoIHsmqnrkJzri6QuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3QocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQpOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQge1xuICBpZiAocmVjb3JkLnR5cGUgPT09IFwiZXZlbnRcIikge1xuICAgIC8vIFNBRkVUWTogcmVkYWN0b3LripQg7J2067Kk7Yq4IOugiOy9lOuTnOydmCDtgqQg6rWs7KGw66W8IOycoOyngO2VmOqzoCDqsJLrp4wg66eI7Iqk7YK57ZWc64ukLlxuICAgIHJldHVybiB7XG4gICAgICAuLi5yZWNvcmQsXG4gICAgICBhdHRyaWJ1dGVzOiByZWNvcmQuYXR0cmlidXRlc1xuICAgICAgICA/IChyZWRhY3RWYWx1ZShyZWNvcmQuYXR0cmlidXRlcykgYXMgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmRbXCJhdHRyaWJ1dGVzXCJdKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGRldGFpbDogcmVjb3JkLmRldGFpbFxuICAgICAgICA/IChyZWRhY3RWYWx1ZShyZWNvcmQuZGV0YWlsKSBhcyBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtcImRldGFpbFwiXSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBwYXlsb2FkUHJldmlldzogcmVjb3JkLnBheWxvYWRQcmV2aWV3LFxuICAgIH07XG4gIH1cblxuICBpZiAocmVjb3JkLnR5cGUgPT09IFwibWV0cmljXCIpIHtcbiAgICAvLyBTQUZFVFk6IHJlZGFjdG9y64qUIOuplO2KuOumrSDroIjsvZTrk5zsnZgg7YKkIOq1rOyhsOulvCDsnKDsp4DtlZjqs6Ag6rCS66eMIOuniOyKpO2Cue2VnOuLpC5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVjb3JkLFxuICAgICAgdGFnczogcmVjb3JkLnRhZ3NcbiAgICAgICAgPyAocmVkYWN0VmFsdWUocmVjb3JkLnRhZ3MpIGFzIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZFtcInRhZ3NcIl0pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgc25hcHNob3Q6IHJlY29yZC5zbmFwc2hvdCA/IHsgLi4ucmVjb3JkLnNuYXBzaG90IH0gOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFNBRkVUWTogcmVkYWN0b3LripQgc3BhbuqzvCDtlZjsnIQg7J2067Kk7Yq4wrfrp4HtgazsnZgg7YKkIOq1rOyhsOulvCDsnKDsp4DtlZjqs6Ag6rCS66eMIOuniOyKpO2Cue2VnOuLpC5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZWNvcmQsXG4gICAgYXR0cmlidXRlczogcmVjb3JkLmF0dHJpYnV0ZXNcbiAgICAgID8gKHJlZGFjdFZhbHVlKHJlY29yZC5hdHRyaWJ1dGVzKSBhcyBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkW1wiYXR0cmlidXRlc1wiXSlcbiAgICAgIDogdW5kZWZpbmVkLFxuICAgIGV2ZW50czogcmVjb3JkLmV2ZW50cz8ubWFwKChldmVudCkgPT4gKHtcbiAgICAgIC4uLmV2ZW50LFxuICAgICAgYXR0cmlidXRlczogZXZlbnQuYXR0cmlidXRlc1xuICAgICAgICA/IChyZWRhY3RWYWx1ZShldmVudC5hdHRyaWJ1dGVzKSBhcyBXZWJTb2NrZXRUZWxlbWV0cnlBdHRyaWJ1dGVzKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KSksXG4gICAgbGlua3M6IHJlY29yZC5saW5rcz8ubWFwKChsaW5rKSA9PiAoe1xuICAgICAgLi4ubGluayxcbiAgICAgIGF0dHJpYnV0ZXM6IGxpbmsuYXR0cmlidXRlc1xuICAgICAgICA/IChyZWRhY3RWYWx1ZShsaW5rLmF0dHJpYnV0ZXMpIGFzIFdlYlNvY2tldFRlbGVtZXRyeUF0dHJpYnV0ZXMpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJ1bmNhdGVQYXlsb2FkUHJldmlldyhwYXlsb2FkOiBXZWJTb2NrZXRUZWxlbWV0cnlWYWx1ZSwgbWF4Qnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHJlZGFjdFZhbHVlKHBheWxvYWQpKTtcbiAgICBpZiAoQnVmZmVyLmJ5dGVMZW5ndGgoc2VyaWFsaXplZCwgXCJ1dGYtOFwiKSA8PSBtYXhCeXRlcykge1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxuICAgIHJldHVybiB0cnVuY2F0ZVV0ZjhTdHJpbmcoc2VyaWFsaXplZCwgbWF4Qnl0ZXMpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCJbdW5zZXJpYWxpemFibGVdXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ1bmNhdGVVdGY4U3RyaW5nKHZhbHVlOiBzdHJpbmcsIG1heEJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobWF4Qnl0ZXMgPD0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgY29uc3Qgc3VmZml4ID0gbWF4Qnl0ZXMgPj0gMyA/IFwiLi4uXCIgOiBcIlwiO1xuICBjb25zdCBjb250ZW50QnVkZ2V0ID0gbWF4Qnl0ZXMgLSBCdWZmZXIuYnl0ZUxlbmd0aChzdWZmaXgsIFwidXRmLThcIik7XG4gIGxldCByZXN1bHQgPSBcIlwiO1xuICBsZXQgdXNlZEJ5dGVzID0gMDtcblxuICBmb3IgKGNvbnN0IGNoYXIgb2YgdmFsdWUpIHtcbiAgICBjb25zdCBjaGFyQnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChjaGFyLCBcInV0Zi04XCIpO1xuICAgIGlmICh1c2VkQnl0ZXMgKyBjaGFyQnl0ZXMgPiBjb250ZW50QnVkZ2V0KSBicmVhaztcbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgICB1c2VkQnl0ZXMgKz0gY2hhckJ5dGVzO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCArIHN1ZmZpeDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvbWlzZUxpa2U8VmFsdWU+KHZhbHVlOiBWYWx1ZSk6IHZhbHVlIGlzIFZhbHVlICYgUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBpc09iamVjdFZhbHVlKHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBcInRoZW5cIiBpbiB2YWx1ZSAmJiBcImNhdGNoXCIgaW4gdmFsdWU7XG59XG5cbi8vIC0tIFRva2VuQnVja2V0ICh1bmNoYW5nZWQpIC0tXG5cbmNsYXNzIFRva2VuQnVja2V0IHtcbiAgcHJpdmF0ZSB0b2tlbnM6IG51bWJlcjtcbiAgcHJpdmF0ZSBsYXN0UmVmaWxsOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXhUb2tlbnM6IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZmlsbFJhdGU6IG51bWJlcixcbiAgKSB7XG4gICAgdGhpcy50b2tlbnMgPSBtYXhUb2tlbnM7XG4gICAgdGhpcy5sYXN0UmVmaWxsID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHRyeUNvbnN1bWUoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5yZWZpbGwoKTtcbiAgICBpZiAodGhpcy50b2tlbnMgPCAxKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy50b2tlbnMgLT0gMTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmaWxsKCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZWxhcHNlZCA9IChub3cgLSB0aGlzLmxhc3RSZWZpbGwpIC8gMTAwMDtcbiAgICB0aGlzLnRva2VucyA9IE1hdGgubWluKHRoaXMubWF4VG9rZW5zLCB0aGlzLnRva2VucyArIGVsYXBzZWQgKiB0aGlzLnJlZmlsbFJhdGUpO1xuICAgIHRoaXMubGFzdFJlZmlsbCA9IG5vdztcbiAgfVxufVxuXG4vLyAtLSBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciAocHJlc2VydmVkLWJlaGF2aW9yKSAtLVxuXG5jb25zdCBub29wVW5zdWJzY3JpYmUgPSAoKTogdm9pZCA9PiB7fTtcblxuZXhwb3J0IGNsYXNzIE5vb3BXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIGltcGxlbWVudHMgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciB7XG4gIGVtaXQoX2lucHV0OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KTogdm9pZCB7XG4gICAgLy8gbm9vcFxuICB9XG5cbiAgcmVjb3JkTWV0cmljKF9pbnB1dDogV2ViU29ja2V0TWV0cmljSW5wdXQpOiB2b2lkIHtcbiAgICAvLyBub29wXG4gIH1cblxuICByZWNvcmRTcGFuKF9pbnB1dDogV2ViU29ja2V0U3BhbklucHV0KTogdm9pZCB7XG4gICAgLy8gbm9vcFxuICB9XG5cbiAgZ2V0TWV0cmljc1NuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHsgLi4uRU1QVFlfTUVUUklDU19TTkFQU0hPVCwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH07XG4gIH1cblxuICBnZXRFdmVudFN0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRNZXRyaWNTdG9yZSgpOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFNwYW5TdG9yZSgpOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU3RvcmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZWdpc3Rlck1ldHJpY1NvdXJjZShfc291cmNlOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTb3VyY2UpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gbm9vcFVuc3Vic2NyaWJlO1xuICB9XG5cbiAgY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQoX3JlcXVlc3Q/OiB7XG4gICAgaGVhZGVycz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPj47XG4gIH0pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgZ2V0VHJhY2VPcHRpb25zKCk6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucyB7XG4gICAgcmV0dXJuIHsgLi4uREVGQVVMVF9UUkFDRV9PUFRJT05TIH07XG4gIH1cblxuICBzaHV0ZG93bihfb3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbn1cblxuLy8gLS0gUmVzb2x2ZWQgcGVyLXBpcGVsaW5lIG9wdGlvbiB0eXBlcyAoaW50ZXJuYWwpIC0tXG5cbnR5cGUgUnVudGltZU1ldGFkYXRhID0ge1xuICBydW50aW1lSWQ6IHN0cmluZztcbiAgbm9kZUlkOiBzdHJpbmc7XG59O1xuXG50eXBlIFJlc29sdmVkRXZlbnRQaXBlbGluZU9wdGlvbnMgPSB7XG4gIHNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNpbmtbXTtcbiAgc3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWQ7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ6IG51bWJlcjtcbiAgbWF4SW5GbGlnaHRFbWl0czogbnVtYmVyO1xuICBzaGFyZWRSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHNpZ25hbFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBzaGFyZWRCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgc2lnbmFsQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudEJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgc2FtcGxpbmc6IHtcbiAgICBkZWZhdWx0UmF0ZTogbnVtYmVyO1xuICAgIHJhdGVCeUV2ZW50OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICAgIGFsd2F5c1JlY29yZExldmVsczogQXJyYXk8XCJ3YXJuXCIgfCBcImVycm9yXCI+O1xuICB9O1xuICBjYXB0dXJlUGF5bG9hZDogZmFsc2UgfCBcInByZXZpZXdcIjtcbiAgbWF4UGF5bG9hZFByZXZpZXdCeXRlczogbnVtYmVyO1xufTtcblxudHlwZSBSZXNvbHZlZE1ldHJpY1BpcGVsaW5lT3B0aW9ucyA9IHtcbiAgc2lua3M6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NpbmtbXTtcbiAgc3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkO1xuICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBudW1iZXI7XG4gIG1heEluRmxpZ2h0RW1pdHM6IG51bWJlcjtcbiAgc2hhcmVkUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeVJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBzaWduYWxSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHNoYXJlZEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5QmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBzaWduYWxCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY0JlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgY29sbGVjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG4gIHNhbXBsZUludGVydmFsTXM6IG51bWJlcjtcbn07XG5cbnR5cGUgUmVzb2x2ZWRTcGFuUGlwZWxpbmVPcHRpb25zID0ge1xuICBzaW5rczogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNpbmtbXTtcbiAgc3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB8IHVuZGVmaW5lZDtcbiAgbWF4UmVjb3Jkc1BlclNlY29uZDogbnVtYmVyO1xuICBtYXhJbkZsaWdodEVtaXRzOiBudW1iZXI7XG4gIHNoYXJlZFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgc2lnbmFsUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgc2hhcmVkQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlCZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQ7XG4gIHNpZ25hbEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhbkJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgc2FtcGxpbmc6IHtcbiAgICBkZWZhdWx0UmF0ZTogbnVtYmVyO1xuICB9O1xufTtcblxuLy8gLS0gSW50ZXJuYWwgZXZlbnQgcmVwb3J0ZXIgdHlwZSAtLVxuLy8gRXZlbnRQaXBlbGluZSDsnpDsi6Dqs7wgY29udHJvbGxlcuqwgCDrgrTrtoAg7KeE64uoIOydtOuypO2KuOulvCDrsJztlontlaAg65WMIOyCrOyaqe2VnOuLpC5cbi8vIHR5cGUtbWlzbWF0Y2ggLyBzaHV0ZG93bi50aW1lb3V0IC8gc2luay5mYWlsZWQg65Ox7J2EIGV2ZW50cyBwaXBlbGluZSDqsr3roZzroZwg67O064K464ukLlxudHlwZSBJbnRlcm5hbEV2ZW50UmVwb3J0ZXIgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgbGV2ZWw6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkW1wibGV2ZWxcIl0sXG4gIGRldGFpbD86IFdlYlNvY2tldFRlbGVtZXRyeUF0dHJpYnV0ZXMsXG4pID0+IHZvaWQ7XG5cbi8vIC0tIFRlbGVtZXRyeVBpcGVsaW5lIChhYnN0cmFjdCkgLS1cblxuYWJzdHJhY3QgY2xhc3MgVGVsZW1ldHJ5UGlwZWxpbmU8XG4gIFRSZWNvcmQgZXh0ZW5kcyBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4gIFRJbnB1dCxcbiAgVFNpbmsgZXh0ZW5kcyB7XG4gICAgZW1pdChyZWNvcmQ6IFRSZWNvcmQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICBzaHV0ZG93bj8ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgfSxcbiAgVFN0b3JlIGV4dGVuZHMgeyByZWFkb25seSBzaW5rOiBUU2luazsgY2xlYXIoKTogdm9pZCB9IHwgdW5kZWZpbmVkLFxuPiB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IHNpZ25hbDogXCJldmVudFwiIHwgXCJtZXRyaWNcIiB8IFwic3BhblwiO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lua3M6IFRTaW5rW107XG4gIHByb3RlY3RlZCByZWFkb25seSB0ZWxlbWV0cnlTdG9yZTogVFN0b3JlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9rZW5CdWNrZXQ6IFRva2VuQnVja2V0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4SW5GbGlnaHRFbWl0czogbnVtYmVyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGE7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaGFyZWRSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaGFyZWRCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGludGVybmFsRXZlbnRSZXBvcnRlcjogSW50ZXJuYWxFdmVudFJlcG9ydGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGluRmxpZ2h0RW1pdHMgPSBuZXcgV2Vha01hcDxUU2luaywgbnVtYmVyPigpO1xuICBkcm9wcGVkQ291bnQgPSAwO1xuICBzaW5rRmFpbHVyZUNvdW50ID0gMDtcbiAgc2h1dGRvd25DYWxsZWQgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgc2lua3M6IFRTaW5rW10sXG4gICAgc3RvcmU6IFRTdG9yZSxcbiAgICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBudW1iZXIsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogbnVtYmVyLFxuICAgIHNoYXJlZFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciB8IHVuZGVmaW5lZCxcbiAgICBzaGFyZWRCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZCxcbiAgICBydW50aW1lTWV0YWRhdGE6IFJ1bnRpbWVNZXRhZGF0YSxcbiAgKSB7XG4gICAgdGhpcy5zaW5rcyA9IHNpbmtzO1xuICAgIHRoaXMudGVsZW1ldHJ5U3RvcmUgPSBzdG9yZTtcbiAgICB0aGlzLnRva2VuQnVja2V0ID0gbmV3IFRva2VuQnVja2V0KG1heFJlY29yZHNQZXJTZWNvbmQsIG1heFJlY29yZHNQZXJTZWNvbmQpO1xuICAgIHRoaXMubWF4SW5GbGlnaHRFbWl0cyA9IG1heEluRmxpZ2h0RW1pdHM7XG4gICAgdGhpcy5zaGFyZWRSZWRhY3RvciA9IHNoYXJlZFJlZGFjdG9yO1xuICAgIHRoaXMuc2hhcmVkQmVmb3JlUmVjb3JkID0gc2hhcmVkQmVmb3JlUmVjb3JkO1xuICAgIHRoaXMucnVudGltZU1ldGFkYXRhID0gcnVudGltZU1ldGFkYXRhO1xuICB9XG5cbiAgZ2V0IHN0b3JlKCk6IFRTdG9yZSB7XG4gICAgcmV0dXJuIHRoaXMudGVsZW1ldHJ5U3RvcmU7XG4gIH1cblxuICBzZXRJbnRlcm5hbEV2ZW50UmVwb3J0ZXIocmVwb3J0ZXI6IEludGVybmFsRXZlbnRSZXBvcnRlcik6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJuYWxFdmVudFJlcG9ydGVyID0gcmVwb3J0ZXI7XG4gIH1cblxuICBhYnN0cmFjdCBlbWl0KGlucHV0OiBUSW5wdXQpOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBidWlsZFJlY29yZChpbnB1dDogVElucHV0KTogVFJlY29yZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZDogVFJlY29yZCk6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGlzQ3JpdGljYWxSZWNvcmQocmVjb3JkOiBUUmVjb3JkKTogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U2lnbmFsUmVkYWN0b3IoKTogKChyZWNvcmQ6IFRSZWNvcmQpID0+IFRSZWNvcmQgfCBudWxsKSB8IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6ICgocmVjb3JkOiBUUmVjb3JkKSA9PiBUUmVjb3JkIHwgbnVsbCkgfCB1bmRlZmluZWQ7XG5cbiAgLy8g6rO17Ya1IGVtaXQg7Z2Q66aELiDrqqjrk6Ag7Iug7Zi467OEIHBpcGVsaW5l7J2YIGVtaXTsnbQg7J20IOuplOyEnOuTnOuhnCDsnITsnoTtlZzri6QuXG4gIHByb3RlY3RlZCBlbWl0SW50ZXJuYWwoaW5wdXQ6IFRJbnB1dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG5cbiAgICBsZXQgcmVjb3JkOiBUUmVjb3JkO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSB0aGlzLmJ1aWxkUmVjb3JkKGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2tpcFJhdGVMaW1pdCA9IHRoaXMuc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZCk7XG4gICAgaWYgKCFza2lwUmF0ZUxpbWl0ICYmICF0aGlzLnRva2VuQnVja2V0LnRyeUNvbnN1bWUoKSkge1xuICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzdGVwIDE6IGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3Qg7ZWt7IOBIOyggeyaqVxuICAgIGxldCBwcmVwYXJlZDogVFJlY29yZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWZ0ZXJEZWZhdWx0ID0gZGVmYXVsdFNlbnNpdGl2ZUtleVJlZGFjdChyZWNvcmQpO1xuICAgICAgaWYgKGFmdGVyRGVmYXVsdC50eXBlICE9PSByZWNvcmQudHlwZSkge1xuICAgICAgICAvLyDrsKnslrQg66Gc7KeBIOKAlCDrs7gg6rWs7ZiE7JeQ7ISc64qUIOuwnOyDne2VmOyngCDslYrsp4Drp4wgdHlwZS1uYXJyb3frpbwg7JyE7ZW0IOqygOymnVxuICAgICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwcmVwYXJlZCA9XG4gICAgICAgIC8qIFNBRkVUWTog65Ox66Gd65CcIFdlYlNvY2tldCDsnbTrsqTtirgg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gYWZ0ZXJEZWZhdWx0IGFzIFRSZWNvcmQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHN0ZXAgMjogc2hhcmVkUmVkYWN0b3IgKOydtOuvuCBidWlsZENvbnRyb2xsZXLsl5DshJwgc2lnbmFsUmVkYWN0b3I9PT1udWxs7J2066m0IHNoYXJlZFJlZGFjdG9yPXVuZGVmaW5lZOuhnCDrja7slrTsk7Qg7IOB7YOcKVxuICAgIGlmICh0aGlzLnNoYXJlZFJlZGFjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHNoYXJlZFJlZGFjdG9yID0gdGhpcy5zaGFyZWRSZWRhY3RvcjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0ocHJlcGFyZWQsIChyKSA9PiBzaGFyZWRSZWRhY3RvcihyKSwgXCJzaGFyZWRcIiwgXCJyZWRhY3RvclwiKTtcbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybjtcbiAgICAgIHByZXBhcmVkID0gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIHN0ZXAgMzogc2lnbmFsUmVkYWN0b3JcbiAgICBjb25zdCBzaWduYWxSZWRhY3RvciA9IHRoaXMuZ2V0U2lnbmFsUmVkYWN0b3IoKTtcbiAgICBpZiAoc2lnbmFsUmVkYWN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hcHBseVRyYW5zZm9ybShwcmVwYXJlZCwgKHIpID0+IHNpZ25hbFJlZGFjdG9yKHIpLCBcInNpZ25hbFwiLCBcInJlZGFjdG9yXCIpO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgcHJlcGFyZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gc3RlcCA0OiBzaGFyZWRCZWZvcmVSZWNvcmRcbiAgICBpZiAodGhpcy5zaGFyZWRCZWZvcmVSZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc2hhcmVkQmVmb3JlUmVjb3JkID0gdGhpcy5zaGFyZWRCZWZvcmVSZWNvcmQ7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFxuICAgICAgICBwcmVwYXJlZCxcbiAgICAgICAgKHIpID0+IHNoYXJlZEJlZm9yZVJlY29yZChyKSxcbiAgICAgICAgXCJzaGFyZWRcIixcbiAgICAgICAgXCJiZWZvcmVSZWNvcmRcIixcbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm47XG4gICAgICBwcmVwYXJlZCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBzdGVwIDU6IHNpZ25hbEJlZm9yZVJlY29yZFxuICAgIGNvbnN0IHNpZ25hbEJlZm9yZVJlY29yZCA9IHRoaXMuZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk7XG4gICAgaWYgKHNpZ25hbEJlZm9yZVJlY29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFxuICAgICAgICBwcmVwYXJlZCxcbiAgICAgICAgKHIpID0+IHNpZ25hbEJlZm9yZVJlY29yZChyKSxcbiAgICAgICAgXCJzaWduYWxcIixcbiAgICAgICAgXCJiZWZvcmVSZWNvcmRcIixcbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm47XG4gICAgICBwcmVwYXJlZCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoVG9TaW5rcyhwcmVwYXJlZCk7XG4gIH1cblxuICAvLyByZWRhY3RvciDrmJDripQgYmVmb3JlUmVjb3JkIDHtmowg7KCB7JqpLiDrsJjtmZjqsJLsnbQgbnVsbOydtOuptCBkcm9wLCB0eXBlIOu2iOydvOy5mOuptCBkcm9wICsgaW50ZXJuYWwgZXZlbnQuXG4gIC8vIHNoYXJlZCDrs4DtmZjsnYAgd2lkZXIgcmVjb3Jk66W8IOuwm+yVhCB3aWRlciByZWNvcmTrpbwg67CY7ZmY7ZWY7KeA66eMLCBzaWduYWwg67OA7ZmY7J2AIG5hcnJvd2VkIFRSZWNvcmTrgbzrpqwg67OA7ZmY7ZWc64ukLlxuICAvLyDslpHsqr0g66qo65GQIOuPmeydvO2VnCB0eXBlLW1pc21hdGNoIGRlZmVuc2l2ZSDqsoDsgqzrpbwg6rGw7Lmc64ukLlxuICBwcml2YXRlIGFwcGx5VHJhbnNmb3JtKFxuICAgIHJlY29yZDogVFJlY29yZCxcbiAgICBydW5uZXI6IChyZWNvcmQ6IFRSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGwsXG4gICAgc291cmNlOiBcInNoYXJlZFwiIHwgXCJzaWduYWxcIixcbiAgICBraW5kOiBcInJlZGFjdG9yXCIgfCBcImJlZm9yZVJlY29yZFwiLFxuICApOiBUUmVjb3JkIHwgbnVsbCB7XG4gICAgbGV0IHJlc3VsdDogV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkIHwgbnVsbDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gcnVubmVyKHJlY29yZCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQudHlwZSAhPT0gcmVjb3JkLnR5cGUpIHtcbiAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICBjb25zdCBldmVudE5hbWUgPVxuICAgICAgICBraW5kID09PSBcInJlZGFjdG9yXCJcbiAgICAgICAgICA/IFwid3MudGVsZW1ldHJ5LnJlZGFjdG9yLnR5cGVfbWlzbWF0Y2hcIlxuICAgICAgICAgIDogXCJ3cy50ZWxlbWV0cnkuYmVmb3JlUmVjb3JkLnR5cGVfbWlzbWF0Y2hcIjtcbiAgICAgIHRoaXMuZGlzcGF0Y2hJbnRlcm5hbEV2ZW50KGV2ZW50TmFtZSwgXCJ3YXJuXCIsIHtcbiAgICAgICAgZXhwZWN0ZWQ6IHJlY29yZC50eXBlLFxuICAgICAgICBhY3R1YWw6IHJlc3VsdC50eXBlLFxuICAgICAgICBzb3VyY2UsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHJlc3VsdC50eXBlID09PSByZWNvcmQudHlwZSA9PT0gVFJlY29yZFtcInR5cGVcIl3snbTrr4DroZwgbmFycm93ZWQgVFJlY29yZOuhnCDslYjsoITtlZjqsowg7KKB7Z6QIOyImCDsnojri6QuXG4gICAgcmV0dXJuIC8qIFNBRkVUWTog65Ox66Gd65CcIFdlYlNvY2tldCDsnbTrsqTtirgg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcmVzdWx0IGFzIFRSZWNvcmQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGlzcGF0Y2hUb1NpbmtzKHJlY29yZDogVFJlY29yZCwgc2VsZk9ic2VydmVGYWlsdXJlcyA9IHRydWUpOiB2b2lkIHtcbiAgICBjb25zdCBjcml0aWNhbCA9IHRoaXMuaXNDcml0aWNhbFJlY29yZChyZWNvcmQpO1xuICAgIGxldCBkcm9wcGVkRm9yUmVjb3JkID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IHNpbmsgb2YgdGhpcy5zaW5rcykge1xuICAgICAgY29uc3QgaW5GbGlnaHQgPSB0aGlzLmluRmxpZ2h0RW1pdHMuZ2V0KHNpbmspID8/IDA7XG4gICAgICBpZiAoIWNyaXRpY2FsICYmIGluRmxpZ2h0ID49IHRoaXMubWF4SW5GbGlnaHRFbWl0cykge1xuICAgICAgICBpZiAoIWRyb3BwZWRGb3JSZWNvcmQpIHtcbiAgICAgICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgICAgIGRyb3BwZWRGb3JSZWNvcmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzaW5rLmVtaXQocmVjb3JkKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZUxpa2UocmVzdWx0KSkge1xuICAgICAgICAgIHRoaXMuaW5GbGlnaHRFbWl0cy5zZXQoc2luaywgaW5GbGlnaHQgKyAxKTtcbiAgICAgICAgICByZXN1bHQudGhlbihcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRJbkZsaWdodEVtaXQoc2luayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGNhdXNlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50SW5GbGlnaHRFbWl0KHNpbmspO1xuICAgICAgICAgICAgICB0aGlzLm9ic2VydmVTaW5rRmFpbHVyZShcImVtaXRcIiwgY2F1c2UsIHNlbGZPYnNlcnZlRmFpbHVyZXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLm9ic2VydmVTaW5rRmFpbHVyZShcImVtaXRcIiwgZXJyb3IsIHNlbGZPYnNlcnZlRmFpbHVyZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVjcmVtZW50SW5GbGlnaHRFbWl0KHNpbms6IFRTaW5rKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuaW5GbGlnaHRFbWl0cy5nZXQoc2luaykgPz8gMDtcbiAgICBpZiAoY3VycmVudCA8PSAxKSB7XG4gICAgICB0aGlzLmluRmxpZ2h0RW1pdHMuZGVsZXRlKHNpbmspO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluRmxpZ2h0RW1pdHMuc2V0KHNpbmssIGN1cnJlbnQgLSAxKTtcbiAgfVxuXG4gIHByaXZhdGUgb2JzZXJ2ZVNpbmtGYWlsdXJlPFZhbHVlPihcbiAgICBwaGFzZTogXCJlbWl0XCIgfCBcInNodXRkb3duXCIsXG4gICAgZXJyb3I6IFZhbHVlLFxuICAgIHNlbGZPYnNlcnZlRmFpbHVyZTogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zaW5rRmFpbHVyZUNvdW50ICs9IDE7XG4gICAgaWYgKCFzZWxmT2JzZXJ2ZUZhaWx1cmUpIHJldHVybjtcbiAgICB0aGlzLmRpc3BhdGNoSW50ZXJuYWxFdmVudChcIndzLnRlbGVtZXRyeS5zaW5rLmZhaWxlZFwiLCBcIndhcm5cIiwge1xuICAgICAgcGhhc2UsXG4gICAgICBzaWduYWw6IHRoaXMuc2lnbmFsLFxuICAgICAgZXJyb3JUeXBlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubmFtZSA6IHJ1bnRpbWVUeXBlT2YoZXJyb3IpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRpc3BhdGNoSW50ZXJuYWxFdmVudChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbGV2ZWw6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkW1wibGV2ZWxcIl0sXG4gICAgZGV0YWlsPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW50ZXJuYWxFdmVudFJlcG9ydGVyID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pbnRlcm5hbEV2ZW50UmVwb3J0ZXIobmFtZSwgbGV2ZWwsIGRldGFpbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyDsp4Tri6gg7J2067Kk7Yq4IOyekOyytOqwgCDsi6TtjKjtlZjrqbQgc3dhbGxvd1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duKHRpbWVvdXRNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcbiAgICB0aGlzLnNodXRkb3duQ2FsbGVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IHNpbmtTaHV0ZG93bnMgPSB0aGlzLnNpbmtzLm1hcCgoc2luaykgPT4gdGhpcy5zaHV0ZG93blNpbmsoc2luaywgdGltZW91dE1zKSk7XG4gICAgaWYgKHNpbmtTaHV0ZG93bnMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHNpbmtTaHV0ZG93bnMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2h1dGRvd25TaW5rKHNpbms6IFRTaW5rLCB0aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc2luay5zaHV0ZG93bikgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNpbmsuc2h1dGRvd24oeyB0aW1lb3V0TXMgfSk7XG4gICAgICBpZiAoIWlzUHJvbWlzZUxpa2UocmVzdWx0KSkgcmV0dXJuO1xuXG4gICAgICBsZXQgdGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0IHNodXRkb3duUHJvbWlzZSA9IHJlc3VsdC50aGVuKFxuICAgICAgICAoKSA9PiBcImNvbXBsZXRlZFwiIGFzIGNvbnN0LFxuICAgICAgICAoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICB0aHJvdyBjYXVzZTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPFwidGltZW91dFwiPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShcInRpbWVvdXRcIik7XG4gICAgICAgIH0sIHRpbWVvdXRNcyk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3V0Y29tZSA9IGF3YWl0IFByb21pc2UucmFjZShbc2h1dGRvd25Qcm9taXNlLCB0aW1lb3V0UHJvbWlzZV0pO1xuICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3V0Y29tZSA9PT0gXCJ0aW1lb3V0XCIpIHtcbiAgICAgICAgc2h1dGRvd25Qcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgdGhpcy5zaW5rRmFpbHVyZUNvdW50ICs9IDE7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hJbnRlcm5hbEV2ZW50KFwid3MudGVsZW1ldHJ5LnNodXRkb3duLnRpbWVvdXRcIiwgXCJ3YXJuXCIsIHtcbiAgICAgICAgICB0aW1lb3V0TXMsXG4gICAgICAgICAgc2lnbmFsOiB0aGlzLnNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZVNpbmtGYWlsdXJlKFwic2h1dGRvd25cIiwgZXJyb3IsIHRydWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyAtLSBFdmVudFBpcGVsaW5lIC0tXG5cbmNsYXNzIEV2ZW50UGlwZWxpbmUgZXh0ZW5kcyBUZWxlbWV0cnlQaXBlbGluZTxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQsXG4gIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50SW5wdXQsXG4gIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2luayxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTdG9yZSB8IHVuZGVmaW5lZFxuPiB7XG4gIHJlYWRvbmx5IHNpZ25hbCA9IFwiZXZlbnRcIiBhcyBjb25zdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lnbmFsQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudEJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNhbXBsaW5nOiB7XG4gICAgZGVmYXVsdFJhdGU6IG51bWJlcjtcbiAgICByYXRlQnlFdmVudDogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICBhbHdheXNSZWNvcmRMZXZlbHM6IEFycmF5PFwid2FyblwiIHwgXCJlcnJvclwiPjtcbiAgfTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhcHR1cmVQYXlsb2FkOiBmYWxzZSB8IFwicHJldmlld1wiO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4UGF5bG9hZFByZXZpZXdCeXRlczogbnVtYmVyO1xuICAvLyBhbHdheXNSZWNvcmQgbGV2ZWwg6rK966Gc7JeQ7IScIHByZXBhcmVSZWNvcmQoc2tpcFJhdGVMaW1pdD10cnVlKSDsnZjrr7jrpbwg67O07KG07ZWY6riwIOychO2VnCDtlIzrnpjqt7guXG4gIHByaXZhdGUgY3VycmVudEVtaXRBbHdheXNSZWNvcmQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXNvbHZlZEV2ZW50UGlwZWxpbmVPcHRpb25zLCBydW50aW1lTWV0YWRhdGE6IFJ1bnRpbWVNZXRhZGF0YSkge1xuICAgIHN1cGVyKFxuICAgICAgb3B0aW9ucy5zaW5rcyxcbiAgICAgIG9wdGlvbnMuc3RvcmUsXG4gICAgICBvcHRpb25zLm1heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgICBvcHRpb25zLm1heEluRmxpZ2h0RW1pdHMsXG4gICAgICBvcHRpb25zLnNoYXJlZFJlZGFjdG9yLFxuICAgICAgb3B0aW9ucy5zaGFyZWRCZWZvcmVSZWNvcmQsXG4gICAgICBydW50aW1lTWV0YWRhdGEsXG4gICAgKTtcbiAgICB0aGlzLnNpZ25hbFJlZGFjdG9yID0gb3B0aW9ucy5zaWduYWxSZWRhY3RvcjtcbiAgICB0aGlzLnNpZ25hbEJlZm9yZVJlY29yZCA9IG9wdGlvbnMuc2lnbmFsQmVmb3JlUmVjb3JkO1xuICAgIHRoaXMuc2FtcGxpbmcgPSBvcHRpb25zLnNhbXBsaW5nO1xuICAgIHRoaXMuY2FwdHVyZVBheWxvYWQgPSBvcHRpb25zLmNhcHR1cmVQYXlsb2FkO1xuICAgIHRoaXMubWF4UGF5bG9hZFByZXZpZXdCeXRlcyA9IG9wdGlvbnMubWF4UGF5bG9hZFByZXZpZXdCeXRlcztcbiAgfVxuXG4gIGVtaXQoaW5wdXQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50SW5wdXQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcblxuICAgICAgLy8gc2FtcGxpbmc6IGFsd2F5c1JlY29yZExldmVscyDsmrDshKBcbiAgICAgIGNvbnN0IGxldmVsczogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0gdGhpcy5zYW1wbGluZy5hbHdheXNSZWNvcmRMZXZlbHM7XG4gICAgICBjb25zdCBhbHdheXNSZWNvcmQgPSBsZXZlbHMuaW5jbHVkZXMoaW5wdXQubGV2ZWwpO1xuXG4gICAgICBpZiAoIWFsd2F5c1JlY29yZCkge1xuICAgICAgICBjb25zdCByYXRlID0gdGhpcy5zYW1wbGluZy5yYXRlQnlFdmVudFtpbnB1dC5uYW1lXSA/PyB0aGlzLnNhbXBsaW5nLmRlZmF1bHRSYXRlO1xuICAgICAgICBpZiAocmF0ZSA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhdGUgPCAxICYmIE1hdGgucmFuZG9tKCkgPj0gcmF0ZSkge1xuICAgICAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VycmVudEVtaXRBbHdheXNSZWNvcmQgPSBhbHdheXNSZWNvcmQ7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmVtaXRJbnRlcm5hbChpbnB1dCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmN1cnJlbnRFbWl0QWx3YXlzUmVjb3JkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBwaXBlbGluZSBlbWl0IOuYkO2VnCB0aHJvdy1mcmVlIOygleyxhVxuICAgIH1cbiAgfVxuXG4gIC8vIOuCtOu2gCDsp4Tri6gg7J2067Kk7Yq4IOKAlCBzYW1wbGluZy9yYXRlLWxpbWl0IOyasO2ajC4gc2h1dGRvd24g7KSR7JeQ64+EIOuwnO2Wie2VtCB0aW1lb3V0L+yLpO2MqCDsp4Tri6jsnbQg7Jyg7Iuk65CY7KeAIOyViuuPhOuhnSDtlZzri6QuXG4gIC8vIOyCrOyaqeyekCByZWRhY3RvcuydmCB0eXBlLW1pc21hdGNoIOychO2XmOydhCDtlLztlZjquLAg7JyE7ZW0IGRlZmF1bHQgcmVkYWN0b3Lrp4wg7KCB7Jqp7ZWc64ukLlxuICBkaXNwYXRjaEludGVybmFsRGlhZ25vc3RpY0V2ZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBsZXZlbDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmRbXCJsZXZlbFwiXSxcbiAgICBkZXRhaWw/OiBXZWJTb2NrZXRUZWxlbWV0cnlBdHRyaWJ1dGVzLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkID0ge1xuICAgICAgdHlwZTogXCJldmVudFwiLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbW9ub3RvbmljVGltZTogcGVyZm9ybWFuY2Uubm93KCksXG4gICAgICBydW50aW1lSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLnJ1bnRpbWVJZCxcbiAgICAgIG5vZGVJZDogdGhpcy5ydW50aW1lTWV0YWRhdGEubm9kZUlkLFxuICAgICAgbmFtZSxcbiAgICAgIGxldmVsLFxuICAgICAgZGV0YWlsLFxuICAgIH07XG5cbiAgICAvLyDsp4Tri6gg7J2067Kk7Yq464qUIO2VreyDgSBkZWZhdWx0IHJlZGFjdG9y66eMIOyggeyaqe2VtCBzaW5r7JeQIOyngeygkSDsoITri6ztlZzri6QuXG4gICAgLy8gKOyCrOyaqeyekCByZWRhY3RvcuqwgCDsp4Tri6gg7J2067Kk7Yq47J2YIHR5cGXsnYQg7J6Y66q7IOuwlOq/lCDrrLTtlZwg66Oo7ZSE66W8IOydvOycvO2CpOuKlCDsnbzsnYQg66eJ64qU64ukLilcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gZGVmYXVsdFNlbnNpdGl2ZUtleVJlZGFjdChyZWNvcmQpO1xuICAgICAgaWYgKHNhbml0aXplZC50eXBlICE9PSBcImV2ZW50XCIpIHJldHVybjtcbiAgICAgIHRoaXMuZGlzcGF0Y2hUb1NpbmtzKHNhbml0aXplZCwgZmFsc2UpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gc3dhbGxvd1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFJlY29yZChpbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHtcbiAgICBsZXQgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCA9IHtcbiAgICAgIHR5cGU6IFwiZXZlbnRcIixcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1vbm90b25pY1RpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgcnVudGltZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQsXG4gICAgICBub2RlSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLm5vZGVJZCxcbiAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICBsZXZlbDogaW5wdXQubGV2ZWwsXG4gICAgICBuYW1lc3BhY2U6IGlucHV0Lm5hbWVzcGFjZSxcbiAgICAgIGNvbm5lY3Rpb25JZDogaW5wdXQuY29ubmVjdGlvbklkLFxuICAgICAgdXNlcklkOiBpbnB1dC51c2VySWQsXG4gICAgICBhdHRyaWJ1dGVzOiBpbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgZGV0YWlsOiBpbnB1dC5kZXRhaWwsXG4gICAgICB0cmFjZUlkOiBpbnB1dC50cmFjZUlkLFxuICAgICAgc3BhbklkOiBpbnB1dC5zcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IGlucHV0LnBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IGlucHV0LnNhbXBsZWQsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmNhcHR1cmVQYXlsb2FkID09PSBcInByZXZpZXdcIiAmJiBpbnB1dC5wYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlY29yZCA9IHtcbiAgICAgICAgLi4ucmVjb3JkLFxuICAgICAgICBwYXlsb2FkUHJldmlldzogdHJ1bmNhdGVQYXlsb2FkUHJldmlldyhpbnB1dC5wYXlsb2FkLCB0aGlzLm1heFBheWxvYWRQcmV2aWV3Qnl0ZXMpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3VsZEJ5cGFzc1JhdGVMaW1pdChfcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCk6IGJvb2xlYW4ge1xuICAgIC8vIGFsd2F5c1JlY29yZExldmVsc+yXkCDtlbTri7ntlZjripQgcmVjb3Jk64qUIHNhbXBsaW5n7J2EIOqxsOy5mOyngCDslYrqs6Ag65Ok7Ja07JmU7Jy866mwLFxuICAgIC8vIOq4sOyhtCBjb250cm9sbGVyIOuPmeyekeydhCDrs7TsobTtlZjquLAg7JyE7ZW0IHRva2VuIGJ1Y2tldOuPhCBza2lw7ZWc64ukLlxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRFbWl0QWx3YXlzUmVjb3JkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzQ3JpdGljYWxSZWNvcmQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWNvcmQubGV2ZWwgPT09IFwid2FyblwiIHx8IHJlY29yZC5sZXZlbCA9PT0gXCJlcnJvclwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNpZ25hbFJlZGFjdG9yKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUmVkYWN0b3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsQmVmb3JlUmVjb3JkO1xuICB9XG59XG5cbi8vIC0tIE1ldHJpY1BpcGVsaW5lIC0tXG5cbmNsYXNzIE1ldHJpY1BpcGVsaW5lIGV4dGVuZHMgVGVsZW1ldHJ5UGlwZWxpbmU8XG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCxcbiAgV2ViU29ja2V0TWV0cmljSW5wdXQsXG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NpbmssXG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmVhZG9ubHkgc2lnbmFsID0gXCJtZXRyaWNcIiBhcyBjb25zdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljQmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWV0cmljU291cmNlczogU2V0PFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZT4gPSBuZXcgU2V0KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb2xsZWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNhbXBsZUludGVydmFsTXM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGNvbGxlY3Rpb25JbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBzbmFwc2hvdFByb3ZpZGVyOiAoKCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90KSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXNvbHZlZE1ldHJpY1BpcGVsaW5lT3B0aW9ucywgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEpIHtcbiAgICBzdXBlcihcbiAgICAgIG9wdGlvbnMuc2lua3MsXG4gICAgICBvcHRpb25zLnN0b3JlLFxuICAgICAgb3B0aW9ucy5tYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgICAgb3B0aW9ucy5tYXhJbkZsaWdodEVtaXRzLFxuICAgICAgb3B0aW9ucy5zaGFyZWRSZWRhY3RvcixcbiAgICAgIG9wdGlvbnMuc2hhcmVkQmVmb3JlUmVjb3JkLFxuICAgICAgcnVudGltZU1ldGFkYXRhLFxuICAgICk7XG4gICAgdGhpcy5zaWduYWxSZWRhY3RvciA9IG9wdGlvbnMuc2lnbmFsUmVkYWN0b3I7XG4gICAgdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQgPSBvcHRpb25zLnNpZ25hbEJlZm9yZVJlY29yZDtcbiAgICB0aGlzLmNvbGxlY3Rpb25FbmFibGVkID0gb3B0aW9ucy5jb2xsZWN0aW9uRW5hYmxlZDtcbiAgICB0aGlzLnNhbXBsZUludGVydmFsTXMgPSBvcHRpb25zLnNhbXBsZUludGVydmFsTXM7XG5cbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uRW5hYmxlZCAmJiB0aGlzLnNhbXBsZUludGVydmFsTXMgPiAwKSB7XG4gICAgICB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb2xsZWN0QW5kRW1pdCgpO1xuICAgICAgfSwgdGhpcy5zYW1wbGVJbnRlcnZhbE1zKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbCAmJlxuICAgICAgICBpc09iamVjdFZhbHVlKHRoaXMuY29sbGVjdGlvbkludGVydmFsKSAmJlxuICAgICAgICBcInVucmVmXCIgaW4gdGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWxcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbC51bnJlZigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVtaXQoaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZW1pdEludGVybmFsKGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHBpcGVsaW5lIGVtaXQgdGhyb3ctZnJlZSDsoJXssYVcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRSZWNvcmQoaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0KTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJtZXRyaWNcIixcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1vbm90b25pY1RpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgcnVudGltZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQsXG4gICAgICBub2RlSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLm5vZGVJZCxcbiAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICBraW5kOiBpbnB1dC5raW5kLFxuICAgICAgdmFsdWU6IGlucHV0LnZhbHVlLFxuICAgICAgdW5pdDogaW5wdXQudW5pdCxcbiAgICAgIHRhZ3M6IGlucHV0LnRhZ3MsXG4gICAgICBuYW1lc3BhY2U6IGlucHV0Lm5hbWVzcGFjZSxcbiAgICAgIGNvbm5lY3Rpb25JZDogaW5wdXQuY29ubmVjdGlvbklkLFxuICAgICAgdXNlcklkOiBpbnB1dC51c2VySWQsXG4gICAgICB0cmFjZUlkOiBpbnB1dC50cmFjZUlkLFxuICAgICAgc3BhbklkOiBpbnB1dC5zcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IGlucHV0LnBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IGlucHV0LnNhbXBsZWQsXG4gICAgICBzbmFwc2hvdDogaW5wdXQuc25hcHNob3QsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG91bGRCeXBhc3NSYXRlTGltaXQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQpOiBib29sZWFuIHtcbiAgICBjb25zdCBvdXRjb21lID0gcmVjb3JkLnRhZ3M/Lm91dGNvbWU7XG4gICAgaWYgKG91dGNvbWUgPT09IFwiZmFpbGVkXCIgfHwgb3V0Y29tZSA9PT0gXCJyZWplY3RlZFwiIHx8IG91dGNvbWUgPT09IFwiZHJvcHBlZFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgcmVjb3JkLm5hbWUuZW5kc1dpdGgoXCIuZmFpbHVyZXNcIikgfHxcbiAgICAgIHJlY29yZC5uYW1lLmVuZHNXaXRoKFwiLmZhaWx1cmVcIikgfHxcbiAgICAgIHJlY29yZC5uYW1lLmVuZHNXaXRoKFwiLmRyb3BwZWRcIikgfHxcbiAgICAgIHJlY29yZC5uYW1lLmluY2x1ZGVzKFwiLmZhaWx1cmVzLlwiKSB8fFxuICAgICAgcmVjb3JkLm5hbWUuaW5jbHVkZXMoXCIuZHJvcHBlZC5cIilcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzQ3JpdGljYWxSZWNvcmQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG91bGRCeXBhc3NSYXRlTGltaXQocmVjb3JkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTaWduYWxSZWRhY3RvcigpOlxuICAgIHwgKChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUmVkYWN0b3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQgfCBudWxsKVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQ7XG4gIH1cblxuICByZWdpc3Rlck1ldHJpY1NvdXJjZShzb3VyY2U6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZSk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubWV0cmljU291cmNlcy5hZGQoc291cmNlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5tZXRyaWNTb3VyY2VzLmRlbGV0ZShzb3VyY2UpO1xuICAgIH07XG4gIH1cblxuICBzZXRTbmFwc2hvdFByb3ZpZGVyKHByb3ZpZGVyOiAoKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QpOiB2b2lkIHtcbiAgICB0aGlzLnNuYXBzaG90UHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgfVxuXG4gIGdldFNuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBiYXNlOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QgPSB7XG4gICAgICAuLi5FTVBUWV9NRVRSSUNTX1NOQVBTSE9ULFxuICAgICAgdGltZXN0YW1wOiBub3csXG4gICAgICBhY3RpdmVDb25uZWN0aW9uc0J5TmFtZXNwYWNlOiB7fSxcbiAgICAgIHRlbGVtZXRyeURyb3BwZWRSZWNvcmRzOiB0aGlzLmRyb3BwZWRDb3VudCxcbiAgICAgIHRlbGVtZXRyeVNpbmtGYWlsdXJlczogdGhpcy5zaW5rRmFpbHVyZUNvdW50LFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiB0aGlzLm1ldHJpY1NvdXJjZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnRpYWwgPSBzb3VyY2UuY29sbGVjdChub3cpO1xuICAgICAgICBiYXNlLmFjdGl2ZUNvbm5lY3Rpb25zICs9IHBhcnRpYWwuYWN0aXZlQ29ubmVjdGlvbnMgPz8gMDtcbiAgICAgICAgYmFzZS5yb29tQ291bnQgKz0gcGFydGlhbC5yb29tQ291bnQgPz8gMDtcbiAgICAgICAgYmFzZS5wZW5kaW5nSW5ib3VuZE1lc3NhZ2VzICs9IHBhcnRpYWwucGVuZGluZ0luYm91bmRNZXNzYWdlcyA/PyAwO1xuICAgICAgICBiYXNlLnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzICs9IHBhcnRpYWwucGVuZGluZ091dGJvdW5kTWVzc2FnZXMgPz8gMDtcbiAgICAgICAgYmFzZS5zb2NrZXRCdWZmZXJlZEJ5dGVzICs9IHBhcnRpYWwuc29ja2V0QnVmZmVyZWRCeXRlcyA/PyAwO1xuICAgICAgICBiYXNlLnBlbmRpbmdGYW5PdXRKb2JzICs9IHBhcnRpYWwucGVuZGluZ0Zhbk91dEpvYnMgPz8gMDtcbiAgICAgICAgYmFzZS5wZW5kaW5nRmFuT3V0VGFyZ2V0cyArPSBwYXJ0aWFsLnBlbmRpbmdGYW5PdXRUYXJnZXRzID8/IDA7XG4gICAgICAgIGlmIChwYXJ0aWFsLmFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2UpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtucywgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnRpYWwuYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgIGJhc2UuYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZVtuc10gPVxuICAgICAgICAgICAgICAoYmFzZS5hY3RpdmVDb25uZWN0aW9uc0J5TmFtZXNwYWNlW25zXSA/PyAwKSArIGNvdW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIG1ldHJpYyBzb3VyY2Ug7Iuk7Yyo64qUIOyZuOu2gOuhnCDsoITtjIzrkJjslrTshKAg7JWIIOuQqFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgY29sbGVjdEFuZEVtaXQoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuc25hcHNob3RQcm92aWRlcj8uKCkgPz8gdGhpcy5nZXRTbmFwc2hvdCgpO1xuICAgICAgY29uc3QgaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0ID0ge1xuICAgICAgICBuYW1lOiBcIndzLmNvbm5lY3Rpb25zLmFjdGl2ZVwiLFxuICAgICAgICBraW5kOiBcImdhdWdlXCIsXG4gICAgICAgIHZhbHVlOiBzbmFwc2hvdC5hY3RpdmVDb25uZWN0aW9ucyxcbiAgICAgICAgdW5pdDogXCIxXCIsXG4gICAgICAgIHNuYXBzaG90LFxuICAgICAgfTtcbiAgICAgIHRoaXMuZW1pdChpbnB1dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBtZXRyaWNzIOyImOynkSDsi6TtjKjripQg7Jm467aA66GcIOyghO2MjOuQmOyWtOyEoCDslYgg65CoXG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc2h1dGRvd24odGltZW91dE1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwgIT09IG51bGwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCBzdXBlci5zaHV0ZG93bih0aW1lb3V0TXMpO1xuICB9XG59XG5cbi8vIC0tIFNwYW5QaXBlbGluZSAtLVxuXG5jbGFzcyBTcGFuUGlwZWxpbmUgZXh0ZW5kcyBUZWxlbWV0cnlQaXBlbGluZTxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCxcbiAgV2ViU29ja2V0U3BhbklucHV0LFxuICBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2luayxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmVhZG9ubHkgc2lnbmFsID0gXCJzcGFuXCIgYXMgY29uc3Q7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaWduYWxSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lnbmFsQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuQmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2FtcGxpbmc6IHtcbiAgICBkZWZhdWx0UmF0ZTogbnVtYmVyO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFJlc29sdmVkU3BhblBpcGVsaW5lT3B0aW9ucywgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEpIHtcbiAgICBzdXBlcihcbiAgICAgIG9wdGlvbnMuc2lua3MsXG4gICAgICBvcHRpb25zLnN0b3JlLFxuICAgICAgb3B0aW9ucy5tYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgICAgb3B0aW9ucy5tYXhJbkZsaWdodEVtaXRzLFxuICAgICAgb3B0aW9ucy5zaGFyZWRSZWRhY3RvcixcbiAgICAgIG9wdGlvbnMuc2hhcmVkQmVmb3JlUmVjb3JkLFxuICAgICAgcnVudGltZU1ldGFkYXRhLFxuICAgICk7XG4gICAgdGhpcy5zaWduYWxSZWRhY3RvciA9IG9wdGlvbnMuc2lnbmFsUmVkYWN0b3I7XG4gICAgdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQgPSBvcHRpb25zLnNpZ25hbEJlZm9yZVJlY29yZDtcbiAgICB0aGlzLnNhbXBsaW5nID0geyBkZWZhdWx0UmF0ZTogb3B0aW9ucy5zYW1wbGluZy5kZWZhdWx0UmF0ZSB9O1xuICB9XG5cbiAgZW1pdChpbnB1dDogV2ViU29ja2V0U3BhbklucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG5cbiAgICAgIC8vIHN0YXR1cyA9PT0gXCJlcnJvclwi64qUIHNhbXBsaW5nIOyasO2ajFxuICAgICAgaWYgKGlucHV0LnN0YXR1cyAhPT0gXCJlcnJvclwiKSB7XG4gICAgICAgIGNvbnN0IHJhdGUgPSB0aGlzLnNhbXBsaW5nLmRlZmF1bHRSYXRlO1xuICAgICAgICBpZiAocmF0ZSA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhdGUgPCAxICYmIE1hdGgucmFuZG9tKCkgPj0gcmF0ZSkge1xuICAgICAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW1pdEludGVybmFsKGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHBpcGVsaW5lIGVtaXQgdGhyb3ctZnJlZSDsoJXssYVcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRSZWNvcmQoaW5wdXQ6IFdlYlNvY2tldFNwYW5JbnB1dCk6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInNwYW5cIixcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1vbm90b25pY1RpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgcnVudGltZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQsXG4gICAgICBub2RlSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLm5vZGVJZCxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IGlucHV0Lm9wZXJhdGlvbk5hbWUsXG4gICAgICBraW5kOiBpbnB1dC5raW5kLFxuICAgICAgZHVyYXRpb25NczogaW5wdXQuZHVyYXRpb25NcyxcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzLFxuICAgICAgbmFtZXNwYWNlOiBpbnB1dC5uYW1lc3BhY2UsXG4gICAgICBjb25uZWN0aW9uSWQ6IGlucHV0LmNvbm5lY3Rpb25JZCxcbiAgICAgIHVzZXJJZDogaW5wdXQudXNlcklkLFxuICAgICAgYXR0cmlidXRlczogaW5wdXQuYXR0cmlidXRlcyxcbiAgICAgIGVycm9yVHlwZTogaW5wdXQuZXJyb3JUeXBlLFxuICAgICAgdHJhY2VJZDogaW5wdXQudHJhY2VJZCxcbiAgICAgIHNwYW5JZDogaW5wdXQuc3BhbklkLFxuICAgICAgcGFyZW50U3BhbklkOiBpbnB1dC5wYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiBpbnB1dC5zYW1wbGVkLFxuICAgICAgZXZlbnRzOiBpbnB1dC5ldmVudHMsXG4gICAgICBsaW5rczogaW5wdXQubGlua3MsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG91bGRCeXBhc3NSYXRlTGltaXQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlY29yZC5zdGF0dXMgPT09IFwiZXJyb3JcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0NyaXRpY2FsUmVjb3JkKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWNvcmQuc3RhdHVzID09PSBcImVycm9yXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsUmVkYWN0b3IoKTpcbiAgICB8ICgocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUmVkYWN0b3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCB8IG51bGwpXG4gICAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbEJlZm9yZVJlY29yZDtcbiAgfVxufVxuXG4vLyAtLSBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVySW1wbCAtLVxuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlckltcGwgaW1wbGVtZW50cyBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV2ZW50czogRXZlbnRQaXBlbGluZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1ldHJpY3M6IE1ldHJpY1BpcGVsaW5lO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3BhbnM6IFNwYW5QaXBlbGluZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJ1bnRpbWVJZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbm9kZUlkOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFjZU9wdGlvbnM6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNodXRkb3duVGltZW91dE1zOiBudW1iZXI7XG4gIHByb3RlY3RlZCBzaHV0ZG93bkNhbGxlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGV2ZW50czogRXZlbnRQaXBlbGluZSxcbiAgICBtZXRyaWNzOiBNZXRyaWNQaXBlbGluZSxcbiAgICBzcGFuczogU3BhblBpcGVsaW5lLFxuICAgIHRyYWNlT3B0aW9uczogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zLFxuICAgIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhLFxuICAgIHNodXRkb3duVGltZW91dE1zOiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMuZXZlbnRzID0gZXZlbnRzO1xuICAgIHRoaXMubWV0cmljcyA9IG1ldHJpY3M7XG4gICAgdGhpcy5zcGFucyA9IHNwYW5zO1xuICAgIHRoaXMudHJhY2VPcHRpb25zID0gdHJhY2VPcHRpb25zO1xuICAgIHRoaXMucnVudGltZUlkID0gcnVudGltZU1ldGFkYXRhLnJ1bnRpbWVJZDtcbiAgICB0aGlzLm5vZGVJZCA9IHJ1bnRpbWVNZXRhZGF0YS5ub2RlSWQ7XG4gICAgdGhpcy5zaHV0ZG93blRpbWVvdXRNcyA9IHNodXRkb3duVGltZW91dE1zO1xuXG4gICAgLy8g66qo65OgIHBpcGVsaW5lIOynhOuLqCDsnbTrsqTtirjripQgZXZlbnRzIHBpcGVsaW5lIOqyveuhnOuhnCDrnbzsmrDtjIXtlZzri6QuXG4gICAgY29uc3QgcmVwb3J0ZXI6IEludGVybmFsRXZlbnRSZXBvcnRlciA9IChuYW1lLCBsZXZlbCwgZGV0YWlsKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50cy5kaXNwYXRjaEludGVybmFsRGlhZ25vc3RpY0V2ZW50KG5hbWUsIGxldmVsLCBkZXRhaWwpO1xuICAgIH07XG4gICAgdGhpcy5ldmVudHMuc2V0SW50ZXJuYWxFdmVudFJlcG9ydGVyKHJlcG9ydGVyKTtcbiAgICB0aGlzLm1ldHJpY3Muc2V0SW50ZXJuYWxFdmVudFJlcG9ydGVyKHJlcG9ydGVyKTtcbiAgICB0aGlzLnNwYW5zLnNldEludGVybmFsRXZlbnRSZXBvcnRlcihyZXBvcnRlcik7XG4gICAgdGhpcy5tZXRyaWNzLnNldFNuYXBzaG90UHJvdmlkZXIoKCkgPT4gdGhpcy5nZXRNZXRyaWNzU25hcHNob3QoKSk7XG4gIH1cblxuICBlbWl0KGlucHV0OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxuXG4gIHJlY29yZE1ldHJpYyhpbnB1dDogV2ViU29ja2V0TWV0cmljSW5wdXQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcbiAgICAgIHRoaXMubWV0cmljcy5lbWl0KGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxuXG4gIHJlY29yZFNwYW4oaW5wdXQ6IFdlYlNvY2tldFNwYW5JbnB1dCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5zcGFucy5lbWl0KGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxuXG4gIGdldE1ldHJpY3NTbmFwc2hvdCgpOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Qge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5tZXRyaWNzLmdldFNuYXBzaG90KCk7XG4gICAgICBiYXNlLnRlbGVtZXRyeURyb3BwZWRSZWNvcmRzID1cbiAgICAgICAgdGhpcy5ldmVudHMuZHJvcHBlZENvdW50ICsgdGhpcy5tZXRyaWNzLmRyb3BwZWRDb3VudCArIHRoaXMuc3BhbnMuZHJvcHBlZENvdW50O1xuICAgICAgYmFzZS50ZWxlbWV0cnlTaW5rRmFpbHVyZXMgPVxuICAgICAgICB0aGlzLmV2ZW50cy5zaW5rRmFpbHVyZUNvdW50ICsgdGhpcy5tZXRyaWNzLnNpbmtGYWlsdXJlQ291bnQgKyB0aGlzLnNwYW5zLnNpbmtGYWlsdXJlQ291bnQ7XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IC4uLkVNUFRZX01FVFJJQ1NfU05BUFNIT1QsIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9O1xuICAgIH1cbiAgfVxuXG4gIGdldEV2ZW50U3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5zdG9yZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0TWV0cmljU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU3RvcmUgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRyaWNzLnN0b3JlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBnZXRTcGFuU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuc3BhbnMuc3RvcmU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyTWV0cmljU291cmNlKHNvdXJjZTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU291cmNlKTogKCkgPT4gdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLm1ldHJpY3MucmVnaXN0ZXJNZXRyaWNTb3VyY2Uoc291cmNlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBub29wVW5zdWJzY3JpYmU7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQocmVxdWVzdD86IHtcbiAgICBoZWFkZXJzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+PjtcbiAgfSk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMudHJhY2VPcHRpb25zLmV4dHJhY3RUcmFjZVBhcmVudCAmJiByZXF1ZXN0Py5oZWFkZXJzKSB7XG4gICAgICAgIGNvbnN0IHRyYWNlcGFyZW50SGVhZGVyID0gcmVxdWVzdC5oZWFkZXJzW1widHJhY2VwYXJlbnRcIl07XG4gICAgICAgIGNvbnN0IHRyYWNlcGFyZW50VmFsdWUgPSBBcnJheS5pc0FycmF5KHRyYWNlcGFyZW50SGVhZGVyKVxuICAgICAgICAgID8gdHJhY2VwYXJlbnRIZWFkZXJbMF1cbiAgICAgICAgICA6IHRyYWNlcGFyZW50SGVhZGVyO1xuICAgICAgICBpZiAodHJhY2VwYXJlbnRWYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlVHJhY2VQYXJlbnQodHJhY2VwYXJlbnRWYWx1ZSk7XG4gICAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dDogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQgPSB7XG4gICAgICAgICAgICAgIHRyYWNlSWQ6IHBhcnNlZC50cmFjZUlkLFxuICAgICAgICAgICAgICBwYXJlbnRTcGFuSWQ6IHBhcnNlZC5wYXJlbnRJZCxcbiAgICAgICAgICAgICAgc2FtcGxlZDogcGFyc2VkLnNhbXBsZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhY2VPcHRpb25zLmdlbmVyYXRlQ29ubmVjdGlvblRyYWNlKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQuc3BhbklkID0gZ2VuZXJhdGVTcGFuSWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IC4uLmNvbnRleHQgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnRyYWNlT3B0aW9ucy5nZW5lcmF0ZUNvbm5lY3Rpb25UcmFjZSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IHRyYWNlSWQ6IGdlbmVyYXRlVHJhY2VJZCgpLCBzcGFuSWQ6IGdlbmVyYXRlU3BhbklkKCkgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1cblxuICBnZXRUcmFjZU9wdGlvbnMoKTogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zIHtcbiAgICByZXR1cm4geyAuLi50aGlzLnRyYWNlT3B0aW9ucyB9O1xuICB9XG5cbiAgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuICAgIHRoaXMuc2h1dGRvd25DYWxsZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucz8udGltZW91dE1zID8/IHRoaXMuc2h1dGRvd25UaW1lb3V0TXM7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIHRoaXMuZXZlbnRzLnNodXRkb3duKHRpbWVvdXRNcyksXG4gICAgICAgIHRoaXMubWV0cmljcy5zaHV0ZG93bih0aW1lb3V0TXMpLFxuICAgICAgICB0aGlzLnNwYW5zLnNodXRkb3duKHRpbWVvdXRNcyksXG4gICAgICBdKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgc2h1dGRvd27snYAgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxufVxuXG4vLyAtLSBGYWN0b3J5IC0tXG5cbmZ1bmN0aW9uIGJ1aWxkQ29udHJvbGxlcihcbiAgb3B0aW9uczogV2ViU29ja2V0VGVsZW1ldHJ5T3B0aW9ucyxcbiAgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEsXG4pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgY29uc3QgZGVmYXVsdHMgPSBvcHRpb25zLmRlZmF1bHRzID8/IHt9O1xuICBjb25zdCBldmVudHNPcHQgPSBvcHRpb25zLmV2ZW50cyA/PyB7fTtcbiAgY29uc3QgbWV0cmljc09wdCA9IG9wdGlvbnMubWV0cmljcyA/PyB7fTtcbiAgY29uc3Qgc3BhbnNPcHQgPSBvcHRpb25zLnNwYW5zID8/IHt9O1xuXG4gIGNvbnN0IGRlZmF1bHRzTWF4UmVjb3Jkc1BlclNlY29uZCA9XG4gICAgZGVmYXVsdHMubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBERUZBVUxUX01BWF9SRUNPUkRTX1BFUl9TRUNPTkQ7XG5cbiAgLy8g7Iug7Zi467OEIHJlZGFjdG9yIC8gYmVmb3JlUmVjb3JkIO2VtOyEnS5cbiAgLy8gbnVsbOydtOuptCBzaGFyZWRSZWRhY3RvcuulvCB1bmRlZmluZWTroZwg642u7Ja07I2oIHN0ZXAgMiDsnpDssrTrpbwgc2tpcO2VnOuLpC5cbiAgY29uc3QgZXZlbnRzU2hhcmVkUmVkYWN0b3IgPSBldmVudHNPcHQucmVkYWN0b3IgPT09IG51bGwgPyB1bmRlZmluZWQgOiBkZWZhdWx0cy5yZWRhY3RvcjtcbiAgY29uc3QgZXZlbnRzU2lnbmFsUmVkYWN0b3IgPSBpc0Z1bmN0aW9uVmFsdWUoZXZlbnRzT3B0LnJlZGFjdG9yKSA/IGV2ZW50c09wdC5yZWRhY3RvciA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZXZlbnRzU2hhcmVkQmVmb3JlUmVjb3JkID1cbiAgICBldmVudHNPcHQuYmVmb3JlUmVjb3JkID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMuYmVmb3JlUmVjb3JkO1xuICBjb25zdCBldmVudHNTaWduYWxCZWZvcmVSZWNvcmQgPSBpc0Z1bmN0aW9uVmFsdWUoZXZlbnRzT3B0LmJlZm9yZVJlY29yZClcbiAgICA/IGV2ZW50c09wdC5iZWZvcmVSZWNvcmRcbiAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtZXRyaWNzU2hhcmVkUmVkYWN0b3IgPSBtZXRyaWNzT3B0LnJlZGFjdG9yID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMucmVkYWN0b3I7XG4gIGNvbnN0IG1ldHJpY3NTaWduYWxSZWRhY3RvciA9IGlzRnVuY3Rpb25WYWx1ZShtZXRyaWNzT3B0LnJlZGFjdG9yKVxuICAgID8gbWV0cmljc09wdC5yZWRhY3RvclxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBtZXRyaWNzU2hhcmVkQmVmb3JlUmVjb3JkID1cbiAgICBtZXRyaWNzT3B0LmJlZm9yZVJlY29yZCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGRlZmF1bHRzLmJlZm9yZVJlY29yZDtcbiAgY29uc3QgbWV0cmljc1NpZ25hbEJlZm9yZVJlY29yZCA9IGlzRnVuY3Rpb25WYWx1ZShtZXRyaWNzT3B0LmJlZm9yZVJlY29yZClcbiAgICA/IG1ldHJpY3NPcHQuYmVmb3JlUmVjb3JkXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3BhbnNTaGFyZWRSZWRhY3RvciA9IHNwYW5zT3B0LnJlZGFjdG9yID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMucmVkYWN0b3I7XG4gIGNvbnN0IHNwYW5zU2lnbmFsUmVkYWN0b3IgPSBpc0Z1bmN0aW9uVmFsdWUoc3BhbnNPcHQucmVkYWN0b3IpID8gc3BhbnNPcHQucmVkYWN0b3IgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNwYW5zU2hhcmVkQmVmb3JlUmVjb3JkID1cbiAgICBzcGFuc09wdC5iZWZvcmVSZWNvcmQgPT09IG51bGwgPyB1bmRlZmluZWQgOiBkZWZhdWx0cy5iZWZvcmVSZWNvcmQ7XG4gIGNvbnN0IHNwYW5zU2lnbmFsQmVmb3JlUmVjb3JkID0gaXNGdW5jdGlvblZhbHVlKHNwYW5zT3B0LmJlZm9yZVJlY29yZClcbiAgICA/IHNwYW5zT3B0LmJlZm9yZVJlY29yZFxuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIGV2ZW50c1xuICBjb25zdCBldmVudFNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNpbmtbXSA9IGV2ZW50c09wdC5zaW5rcyA/IFsuLi5ldmVudHNPcHQuc2lua3NdIDogW107XG4gIGxldCBldmVudFN0b3JlOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHwgdW5kZWZpbmVkID0gZXZlbnRzT3B0LnN0b3JlO1xuICBpZiAoZXZlbnRTaW5rcy5sZW5ndGggPT09IDAgJiYgZXZlbnRTdG9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRTdG9yZSA9IG5ldyBJbk1lbW9yeUV2ZW50U3RvcmUoe1xuICAgICAgbWF4UmVjb3JkczogZXZlbnRzT3B0Lm1heFJlY29yZHMgPz8gZGVmYXVsdHMubWF4UmVjb3JkcyxcbiAgICAgIG1heEJ5dGVzOiBldmVudHNPcHQubWF4Qnl0ZXMgPz8gZGVmYXVsdHMubWF4Qnl0ZXMsXG4gICAgfSk7XG4gICAgZXZlbnRTaW5rcy5wdXNoKGV2ZW50U3RvcmUuc2luayk7XG4gIH0gZWxzZSBpZiAoZXZlbnRTdG9yZSAhPT0gdW5kZWZpbmVkICYmICFldmVudFNpbmtzLmluY2x1ZGVzKGV2ZW50U3RvcmUuc2luaykpIHtcbiAgICBldmVudFNpbmtzLnB1c2goZXZlbnRTdG9yZS5zaW5rKTtcbiAgfVxuXG4gIGNvbnN0IGV2ZW50c1Jlc29sdmVkOiBSZXNvbHZlZEV2ZW50UGlwZWxpbmVPcHRpb25zID0ge1xuICAgIHNpbmtzOiBldmVudFNpbmtzLFxuICAgIHN0b3JlOiBldmVudFN0b3JlLFxuICAgIG1heFJlY29yZHNQZXJTZWNvbmQ6IGV2ZW50c09wdC5zYW1wbGluZz8ubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBkZWZhdWx0c01heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogZXZlbnRzT3B0Lm1heEluRmxpZ2h0RW1pdHMgPz8gREVGQVVMVF9NQVhfSU5fRkxJR0hUX0VNSVRTX1BFUl9TSU5LLFxuICAgIHNoYXJlZFJlZGFjdG9yOiBldmVudHNTaGFyZWRSZWRhY3RvcixcbiAgICBzaWduYWxSZWRhY3RvcjogZXZlbnRzU2lnbmFsUmVkYWN0b3IsXG4gICAgc2hhcmVkQmVmb3JlUmVjb3JkOiBldmVudHNTaGFyZWRCZWZvcmVSZWNvcmQsXG4gICAgc2lnbmFsQmVmb3JlUmVjb3JkOiBldmVudHNTaWduYWxCZWZvcmVSZWNvcmQsXG4gICAgc2FtcGxpbmc6IHtcbiAgICAgIGRlZmF1bHRSYXRlOiBldmVudHNPcHQuc2FtcGxpbmc/LmRlZmF1bHRSYXRlID8/IERFRkFVTFRfRVZFTlRfU0FNUExJTkdfREVGQVVMVF9SQVRFLFxuICAgICAgcmF0ZUJ5RXZlbnQ6IGV2ZW50c09wdC5zYW1wbGluZz8ucmF0ZUJ5RXZlbnQgPz8ge30sXG4gICAgICBhbHdheXNSZWNvcmRMZXZlbHM6IGV2ZW50c09wdC5zYW1wbGluZz8uYWx3YXlzUmVjb3JkTGV2ZWxzID8/IFtcbiAgICAgICAgLi4uREVGQVVMVF9FVkVOVF9BTFdBWVNfUkVDT1JEX0xFVkVMUyxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBjYXB0dXJlUGF5bG9hZDogZXZlbnRzT3B0LmNhcHR1cmVQYXlsb2FkID8/IERFRkFVTFRfRVZFTlRfQ0FQVFVSRV9QQVlMT0FELFxuICAgIG1heFBheWxvYWRQcmV2aWV3Qnl0ZXM6XG4gICAgICBldmVudHNPcHQubWF4UGF5bG9hZFByZXZpZXdCeXRlcyA/PyBERUZBVUxUX0VWRU5UX01BWF9QQVlMT0FEX1BSRVZJRVdfQllURVMsXG4gIH07XG5cbiAgLy8gbWV0cmljc1xuICBjb25zdCBtZXRyaWNTaW5rczogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2lua1tdID0gbWV0cmljc09wdC5zaW5rcyA/IFsuLi5tZXRyaWNzT3B0LnNpbmtzXSA6IFtdO1xuICBsZXQgbWV0cmljU3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkID0gbWV0cmljc09wdC5zdG9yZTtcbiAgaWYgKG1ldHJpY1NpbmtzLmxlbmd0aCA9PT0gMCAmJiBtZXRyaWNTdG9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbWV0cmljU3RvcmUgPSBuZXcgSW5NZW1vcnlNZXRyaWNTdG9yZSh7XG4gICAgICBtYXhSZWNvcmRzOiBtZXRyaWNzT3B0Lm1heFJlY29yZHMgPz8gZGVmYXVsdHMubWF4UmVjb3JkcyxcbiAgICAgIG1heEJ5dGVzOiBtZXRyaWNzT3B0Lm1heEJ5dGVzID8/IGRlZmF1bHRzLm1heEJ5dGVzLFxuICAgIH0pO1xuICAgIG1ldHJpY1NpbmtzLnB1c2gobWV0cmljU3RvcmUuc2luayk7XG4gIH0gZWxzZSBpZiAobWV0cmljU3RvcmUgIT09IHVuZGVmaW5lZCAmJiAhbWV0cmljU2lua3MuaW5jbHVkZXMobWV0cmljU3RvcmUuc2luaykpIHtcbiAgICBtZXRyaWNTaW5rcy5wdXNoKG1ldHJpY1N0b3JlLnNpbmspO1xuICB9XG5cbiAgY29uc3QgbWV0cmljc1Jlc29sdmVkOiBSZXNvbHZlZE1ldHJpY1BpcGVsaW5lT3B0aW9ucyA9IHtcbiAgICBzaW5rczogbWV0cmljU2lua3MsXG4gICAgc3RvcmU6IG1ldHJpY1N0b3JlLFxuICAgIG1heFJlY29yZHNQZXJTZWNvbmQ6IG1ldHJpY3NPcHQuc2FtcGxpbmc/Lm1heFJlY29yZHNQZXJTZWNvbmQgPz8gZGVmYXVsdHNNYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgIG1heEluRmxpZ2h0RW1pdHM6IG1ldHJpY3NPcHQubWF4SW5GbGlnaHRFbWl0cyA/PyBERUZBVUxUX01BWF9JTl9GTElHSFRfRU1JVFNfUEVSX1NJTkssXG4gICAgc2hhcmVkUmVkYWN0b3I6IG1ldHJpY3NTaGFyZWRSZWRhY3RvcixcbiAgICBzaWduYWxSZWRhY3RvcjogbWV0cmljc1NpZ25hbFJlZGFjdG9yLFxuICAgIHNoYXJlZEJlZm9yZVJlY29yZDogbWV0cmljc1NoYXJlZEJlZm9yZVJlY29yZCxcbiAgICBzaWduYWxCZWZvcmVSZWNvcmQ6IG1ldHJpY3NTaWduYWxCZWZvcmVSZWNvcmQsXG4gICAgY29sbGVjdGlvbkVuYWJsZWQ6IG1ldHJpY3NPcHQuY29sbGVjdGlvbkVuYWJsZWQgPz8gREVGQVVMVF9NRVRSSUNfQ09MTEVDVElPTl9FTkFCTEVELFxuICAgIHNhbXBsZUludGVydmFsTXM6IG1ldHJpY3NPcHQuc2FtcGxlSW50ZXJ2YWxNcyA/PyBERUZBVUxUX01FVFJJQ19TQU1QTEVfSU5URVJWQUxfTVMsXG4gIH07XG5cbiAgLy8gc3BhbnNcbiAgY29uc3Qgc3BhblNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2lua1tdID0gc3BhbnNPcHQuc2lua3MgPyBbLi4uc3BhbnNPcHQuc2lua3NdIDogW107XG4gIGxldCBzcGFuU3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB8IHVuZGVmaW5lZCA9IHNwYW5zT3B0LnN0b3JlO1xuICBpZiAoc3BhblNpbmtzLmxlbmd0aCA9PT0gMCAmJiBzcGFuU3RvcmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHNwYW5TdG9yZSA9IG5ldyBJbk1lbW9yeVNwYW5TdG9yZSh7XG4gICAgICBtYXhSZWNvcmRzOiBzcGFuc09wdC5tYXhSZWNvcmRzID8/IGRlZmF1bHRzLm1heFJlY29yZHMsXG4gICAgICBtYXhCeXRlczogc3BhbnNPcHQubWF4Qnl0ZXMgPz8gZGVmYXVsdHMubWF4Qnl0ZXMsXG4gICAgfSk7XG4gICAgc3BhblNpbmtzLnB1c2goc3BhblN0b3JlLnNpbmspO1xuICB9IGVsc2UgaWYgKHNwYW5TdG9yZSAhPT0gdW5kZWZpbmVkICYmICFzcGFuU2lua3MuaW5jbHVkZXMoc3BhblN0b3JlLnNpbmspKSB7XG4gICAgc3BhblNpbmtzLnB1c2goc3BhblN0b3JlLnNpbmspO1xuICB9XG5cbiAgY29uc3Qgc3BhbnNSZXNvbHZlZDogUmVzb2x2ZWRTcGFuUGlwZWxpbmVPcHRpb25zID0ge1xuICAgIHNpbmtzOiBzcGFuU2lua3MsXG4gICAgc3RvcmU6IHNwYW5TdG9yZSxcbiAgICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBzcGFuc09wdC5zYW1wbGluZz8ubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBkZWZhdWx0c01heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogc3BhbnNPcHQubWF4SW5GbGlnaHRFbWl0cyA/PyBERUZBVUxUX01BWF9JTl9GTElHSFRfRU1JVFNfUEVSX1NJTkssXG4gICAgc2hhcmVkUmVkYWN0b3I6IHNwYW5zU2hhcmVkUmVkYWN0b3IsXG4gICAgc2lnbmFsUmVkYWN0b3I6IHNwYW5zU2lnbmFsUmVkYWN0b3IsXG4gICAgc2hhcmVkQmVmb3JlUmVjb3JkOiBzcGFuc1NoYXJlZEJlZm9yZVJlY29yZCxcbiAgICBzaWduYWxCZWZvcmVSZWNvcmQ6IHNwYW5zU2lnbmFsQmVmb3JlUmVjb3JkLFxuICAgIHNhbXBsaW5nOiB7XG4gICAgICBkZWZhdWx0UmF0ZTogc3BhbnNPcHQuc2FtcGxpbmc/LmRlZmF1bHRSYXRlID8/IERFRkFVTFRfU1BBTl9TQU1QTElOR19ERUZBVUxUX1JBVEUsXG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBldmVudFBpcGVsaW5lID0gbmV3IEV2ZW50UGlwZWxpbmUoZXZlbnRzUmVzb2x2ZWQsIHJ1bnRpbWVNZXRhZGF0YSk7XG4gIGNvbnN0IG1ldHJpY1BpcGVsaW5lID0gbmV3IE1ldHJpY1BpcGVsaW5lKG1ldHJpY3NSZXNvbHZlZCwgcnVudGltZU1ldGFkYXRhKTtcbiAgY29uc3Qgc3BhblBpcGVsaW5lID0gbmV3IFNwYW5QaXBlbGluZShzcGFuc1Jlc29sdmVkLCBydW50aW1lTWV0YWRhdGEpO1xuXG4gIGNvbnN0IHRyYWNlT3B0aW9uczogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zID0ge1xuICAgIGV4dHJhY3RUcmFjZVBhcmVudDpcbiAgICAgIG9wdGlvbnMudHJhY2U/LmV4dHJhY3RUcmFjZVBhcmVudCA/PyBERUZBVUxUX1RSQUNFX09QVElPTlMuZXh0cmFjdFRyYWNlUGFyZW50LFxuICAgIGdlbmVyYXRlQ29ubmVjdGlvblRyYWNlOlxuICAgICAgb3B0aW9ucy50cmFjZT8uZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2UgPz8gREVGQVVMVF9UUkFDRV9PUFRJT05TLmdlbmVyYXRlQ29ubmVjdGlvblRyYWNlLFxuICAgIHByb3BhZ2F0ZU1lc3NhZ2VUcmFjZTpcbiAgICAgIG9wdGlvbnMudHJhY2U/LnByb3BhZ2F0ZU1lc3NhZ2VUcmFjZSA/PyBERUZBVUxUX1RSQUNFX09QVElPTlMucHJvcGFnYXRlTWVzc2FnZVRyYWNlLFxuICAgIHJlY29yZENvbm5lY3Rpb25MaWZldGltZVNwYW46XG4gICAgICBvcHRpb25zLnRyYWNlPy5yZWNvcmRDb25uZWN0aW9uTGlmZXRpbWVTcGFuID8/XG4gICAgICBERUZBVUxUX1RSQUNFX09QVElPTlMucmVjb3JkQ29ubmVjdGlvbkxpZmV0aW1lU3BhbixcbiAgfTtcblxuICBjb25zdCBzaHV0ZG93blRpbWVvdXRNcyA9IG9wdGlvbnMuc2h1dGRvd25UaW1lb3V0TXMgPz8gREVGQVVMVF9TSFVURE9XTl9USU1FT1VUX01TO1xuXG4gIHJldHVybiBuZXcgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlckltcGwoXG4gICAgZXZlbnRQaXBlbGluZSxcbiAgICBtZXRyaWNQaXBlbGluZSxcbiAgICBzcGFuUGlwZWxpbmUsXG4gICAgdHJhY2VPcHRpb25zLFxuICAgIHJ1bnRpbWVNZXRhZGF0YSxcbiAgICBzaHV0ZG93blRpbWVvdXRNcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0Q29udHJvbGxlck9wdGlvbklzRXhjbHVzaXZlKG9wdGlvbnM6IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnMpOiB2b2lkIHtcbiAgY29uc3QgaWdub3JlZEtleXMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKVxuICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4ga2V5ICE9PSBcImVuYWJsZWRcIiAmJiBrZXkgIT09IFwiY29udHJvbGxlclwiICYmIHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG5cbiAgaWYgKGlnbm9yZWRLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgV2ViU29ja2V0IHRlbGVtZXRyeSBjb250cm9sbGVyIG9wdGlvbiBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciB0ZWxlbWV0cnkgb3B0aW9uczogJHtpZ25vcmVkS2V5cy5qb2luKFxuICAgICAgXCIsIFwiLFxuICAgICl9YCxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIoXG4gIHRlbGVtZXRyeU9wdGlvbjogYm9vbGVhbiB8IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhLFxuKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciB7XG4gIGlmICh0ZWxlbWV0cnlPcHRpb24gPT09IHVuZGVmaW5lZCB8fCB0ZWxlbWV0cnlPcHRpb24gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICB9XG5cbiAgaWYgKHRlbGVtZXRyeU9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBidWlsZENvbnRyb2xsZXIoe30sIHJ1bnRpbWVNZXRhZGF0YSk7XG4gIH1cblxuICBpZiAodGVsZW1ldHJ5T3B0aW9uLmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICB9XG5cbiAgaWYgKHRlbGVtZXRyeU9wdGlvbi5jb250cm9sbGVyKSB7XG4gICAgYXNzZXJ0Q29udHJvbGxlck9wdGlvbklzRXhjbHVzaXZlKHRlbGVtZXRyeU9wdGlvbik7XG4gICAgcmV0dXJuIHRlbGVtZXRyeU9wdGlvbi5jb250cm9sbGVyO1xuICB9XG5cbiAgcmV0dXJuIGJ1aWxkQ29udHJvbGxlcih0ZWxlbWV0cnlPcHRpb24sIHJ1bnRpbWVNZXRhZGF0YSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQWdjQSxTQUFTLGVBQWUsS0FBc0I7Q0FDNUMsTUFBTSxhQUFhLElBQUksUUFBUSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsWUFBWTtDQUNoRSxPQUFPLHVCQUF1QixNQUFNLFlBQVksV0FBVyxTQUFTLE9BQU8sQ0FBQztBQUM5RTtBQUVB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
881
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGVsZW1ldHJ5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vd3MtdGVsZW1ldHJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJ1bnRpbWVUeXBlT2YgfSBmcm9tIFwiLi4vcnVudGltZS10eXBlXCI7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uVmFsdWUsIGlzT2JqZWN0VmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgSW5NZW1vcnlFdmVudFN0b3JlLCBJbk1lbW9yeU1ldHJpY1N0b3JlLCBJbk1lbW9yeVNwYW5TdG9yZSB9IGZyb20gXCIuL3dzLXRlbGVtZXRyeS1tZW1vcnlcIjtcbmltcG9ydCB7IGdlbmVyYXRlU3BhbklkLCBnZW5lcmF0ZVRyYWNlSWQsIHBhcnNlVHJhY2VQYXJlbnQgfSBmcm9tIFwiLi93cy10ZWxlbWV0cnktdHJhY2VcIjtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5VmFsdWUgPVxuICB8IG51bGxcbiAgfCB1bmRlZmluZWRcbiAgfCBiaWdpbnRcbiAgfCBib29sZWFuXG4gIHwgbnVtYmVyXG4gIHwgc3RyaW5nXG4gIHwgRGF0ZVxuICB8IFdlYlNvY2tldFRlbGVtZXRyeVZhbHVlW11cbiAgfCBXZWJTb2NrZXRUZWxlbWV0cnlBdHRyaWJ1dGVzO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeUF0dHJpYnV0ZXMge1xuICBba2V5OiBzdHJpbmddOiBXZWJTb2NrZXRUZWxlbWV0cnlWYWx1ZTtcbn1cblxuLy8gLS0gUmVjb3JkIHR5cGVzICh1bmNoYW5nZWQpIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZEJhc2UgPSB7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICBtb25vdG9uaWNUaW1lPzogbnVtYmVyO1xuICBydW50aW1lSWQ6IHN0cmluZztcbiAgbm9kZUlkOiBzdHJpbmc7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICAvLyB1c2VySWTripQgY29ubmVjdGlvbiDshozsnKDsnpDrpbwg7Iud67OE7ZWY6riwIOychO2VnCBvcGFxdWUgaWRlbnRpZmllciAo67O07Ya1IERCIFBLKVxuICAvLyBwc2V1ZG9ueW1vdXMgaWRlbnRpZmllcuuhnOunjCDsgqzsmqntlZjrqbAsIOydtOuplOydvC/soITtmZTrsojtmLgg65OxIFBJSeuKlCDrk6TslrTqsIDsp4Ag7JWK64qU64uk6rOgIOqwgOygle2VqFxuICB1c2VySWQ/OiBzdHJpbmc7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkID0gV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkQmFzZSAmIHtcbiAgdHlwZTogXCJldmVudFwiO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxldmVsOiBcImRlYnVnXCIgfCBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwiO1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG4gIGRldGFpbD86IFdlYlNvY2tldFRlbGVtZXRyeUF0dHJpYnV0ZXM7XG4gIHBheWxvYWRQcmV2aWV3Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkID0gV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkQmFzZSAmIHtcbiAgdHlwZTogXCJtZXRyaWNcIjtcbiAgbmFtZTogc3RyaW5nO1xuICBraW5kOiBcImNvdW50ZXJcIiB8IFwiaGlzdG9ncmFtXCIgfCBcImdhdWdlXCI7XG4gIHZhbHVlOiBudW1iZXI7XG4gIHVuaXQ/OiBcIjFcIiB8IFwibXNcIiB8IFwiQnlcIjtcbiAgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHNuYXBzaG90PzogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90O1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCA9IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZEJhc2UgJiB7XG4gIHR5cGU6IFwic3BhblwiO1xuICBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG4gIGtpbmQ6IFwiaW50ZXJuYWxcIiB8IFwicHJvZHVjZXJcIiB8IFwiY29uc3VtZXJcIiB8IFwic2VydmVyXCIgfCBcImNsaWVudFwiO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIHN0YXR1czogXCJ1bnNldFwiIHwgXCJva1wiIHwgXCJlcnJvclwiO1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG4gIGVycm9yVHlwZT86IHN0cmluZztcbiAgZXZlbnRzPzogQXJyYXk8e1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICBhdHRyaWJ1dGVzPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcztcbiAgfT47XG4gIGxpbmtzPzogQXJyYXk8e1xuICAgIHRyYWNlSWQ6IHN0cmluZztcbiAgICBzcGFuSWQ6IHN0cmluZztcbiAgICBhdHRyaWJ1dGVzPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcztcbiAgfT47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQgPVxuICB8IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkXG4gIHwgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkXG4gIHwgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZDtcblxuLy8gLS0gSW5wdXQgdHlwZXMgKHVuY2hhbmdlZCkgLS1cblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBsZXZlbDogXCJkZWJ1Z1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIjtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICBkZXRhaWw/OiBXZWJTb2NrZXRUZWxlbWV0cnlBdHRyaWJ1dGVzO1xuICBwYXlsb2FkPzogV2ViU29ja2V0VGVsZW1ldHJ5VmFsdWU7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldE1ldHJpY0lucHV0ID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGtpbmQ6IFwiY291bnRlclwiIHwgXCJoaXN0b2dyYW1cIiB8IFwiZ2F1Z2VcIjtcbiAgdmFsdWU6IG51bWJlcjtcbiAgdW5pdD86IFwiMVwiIHwgXCJtc1wiIHwgXCJCeVwiO1xuICB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc3BhbklkPzogc3RyaW5nO1xuICBwYXJlbnRTcGFuSWQ/OiBzdHJpbmc7XG4gIHNhbXBsZWQ/OiBib29sZWFuO1xuICBzbmFwc2hvdD86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdDtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFNwYW5JbnB1dCA9IHtcbiAgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICBraW5kOiBcImludGVybmFsXCIgfCBcInByb2R1Y2VyXCIgfCBcImNvbnN1bWVyXCIgfCBcInNlcnZlclwiIHwgXCJjbGllbnRcIjtcbiAgZHVyYXRpb25NczogbnVtYmVyO1xuICBzdGF0dXM6IFwidW5zZXRcIiB8IFwib2tcIiB8IFwiZXJyb3JcIjtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICBlcnJvclR5cGU/OiBzdHJpbmc7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbiAgZXZlbnRzPzogQXJyYXk8e1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICBhdHRyaWJ1dGVzPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcztcbiAgfT47XG4gIGxpbmtzPzogQXJyYXk8e1xuICAgIHRyYWNlSWQ6IHN0cmluZztcbiAgICBzcGFuSWQ6IHN0cmluZztcbiAgICBhdHRyaWJ1dGVzPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcztcbiAgfT47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlJbnB1dCA9XG4gIHwgKHsgdHlwZTogXCJldmVudFwiIH0gJiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KVxuICB8ICh7IHR5cGU6IFwibWV0cmljXCIgfSAmIFdlYlNvY2tldE1ldHJpY0lucHV0KVxuICB8ICh7IHR5cGU6IFwic3BhblwiIH0gJiBXZWJTb2NrZXRTcGFuSW5wdXQpO1xuXG4vLyAtLSBNZXRyaWNzIHNuYXBzaG90IC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdCA9IHtcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIGFjdGl2ZUNvbm5lY3Rpb25zOiBudW1iZXI7XG4gIGFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2U6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gIHJvb21Db3VudDogbnVtYmVyO1xuICBwZW5kaW5nSW5ib3VuZE1lc3NhZ2VzOiBudW1iZXI7XG4gIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiBudW1iZXI7XG4gIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IG51bWJlcjtcbiAgcGVuZGluZ0Zhbk91dEpvYnM6IG51bWJlcjtcbiAgcGVuZGluZ0Zhbk91dFRhcmdldHM6IG51bWJlcjtcbiAgdGVsZW1ldHJ5RHJvcHBlZFJlY29yZHM6IG51bWJlcjtcbiAgdGVsZW1ldHJ5U2lua0ZhaWx1cmVzOiBudW1iZXI7XG59O1xuXG4vLyAtLSBDb25uZWN0aW9uIHNuYXBzaG90IChUZWxlbWV0cnlJbnNwZWN0YWJsZUNvbm5lY3Rpb24pIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdCA9IHtcbiAgcGVuZGluZ0luYm91bmRNZXNzYWdlczogbnVtYmVyO1xuICBwZW5kaW5nT3V0Ym91bmRNZXNzYWdlczogbnVtYmVyO1xuICBzb2NrZXRCdWZmZXJlZEJ5dGVzOiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlbGVtZXRyeUluc3BlY3RhYmxlQ29ubmVjdGlvbiB7XG4gIGdldFRlbGVtZXRyeVNuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdDtcbn1cblxuLy8gLS0gU2lnbmFsLW5hcnJvd2VkIHNpbmtzIC0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rIHtcbiAgZW1pdChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHNodXRkb3duPyhvcHRpb25zPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1Npbmsge1xuICBlbWl0KHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHNodXRkb3duPyhvcHRpb25zPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rIHtcbiAgZW1pdChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgc2h1dGRvd24/KG9wdGlvbnM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG5cbi8vIC0tIFNpZ25hbC1uYXJyb3dlZCBxdWVyeSBmaWx0ZXJzIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UXVlcnlGaWx0ZXIgPSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGxldmVsPzogXCJkZWJ1Z1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIjtcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc2luY2U/OiBudW1iZXI7XG4gIHVudGlsPzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1F1ZXJ5RmlsdGVyID0ge1xuICBuYW1lPzogc3RyaW5nO1xuICBraW5kPzogXCJjb3VudGVyXCIgfCBcImhpc3RvZ3JhbVwiIHwgXCJnYXVnZVwiO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICB0cmFjZUlkPzogc3RyaW5nO1xuICBzaW5jZT86IG51bWJlcjtcbiAgdW50aWw/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblF1ZXJ5RmlsdGVyID0ge1xuICBvcGVyYXRpb25OYW1lPzogc3RyaW5nO1xuICBraW5kPzogXCJpbnRlcm5hbFwiIHwgXCJwcm9kdWNlclwiIHwgXCJjb25zdW1lclwiIHwgXCJzZXJ2ZXJcIiB8IFwiY2xpZW50XCI7XG4gIHN0YXR1cz86IFwidW5zZXRcIiB8IFwib2tcIiB8IFwiZXJyb3JcIjtcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc2luY2U/OiBudW1iZXI7XG4gIHVudGlsPzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbn07XG5cbi8vIC0tIFNpZ25hbC1uYXJyb3dlZCBzdG9yZXMgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHtcbiAgcmVhZG9ubHkgc2luazogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rO1xuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UXVlcnlGaWx0ZXIpOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtdO1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHtcbiAgcmVhZG9ubHkgc2luazogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2luaztcbiAgcXVlcnkoZmlsdGVyOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNRdWVyeUZpbHRlcik6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZFtdO1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB7XG4gIHJlYWRvbmx5IHNpbms6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rO1xuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5RdWVyeUZpbHRlcik6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmRbXTtcbiAgY2xlYXIoKTogdm9pZDtcbn1cblxuLy8gLS0gTWV0cmljIHNvdXJjZSBpbnRlcmZhY2UgKHVuY2hhbmdlZCkgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTb3VyY2Uge1xuICBjb2xsZWN0KG5vdzogbnVtYmVyKTogUGFydGlhbDxXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Q+O1xufVxuXG4vLyAtLSBSZWRhY3RvciAvIGJlZm9yZVJlY29yZCB0eXBlcyAoc2lnbmFsLW5hcnJvd2VkICsgc2hhcmVkKSAtLVxuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkLFxuKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCxcbikgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQgfCBudWxsO1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50QmVmb3JlUmVjb3JkID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkLFxuKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY0JlZm9yZVJlY29yZCA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5CZWZvcmVSZWNvcmQgPSAoXG4gIHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCxcbikgPT4gV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGw7XG5cbi8vIC0tIFRyYWNlIG9wdGlvbnMgLyBjb25uZWN0aW9uIGNvbnRleHQgLS1cblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zID0ge1xuICBleHRyYWN0VHJhY2VQYXJlbnQ6IGJvb2xlYW47XG4gIGdlbmVyYXRlQ29ubmVjdGlvblRyYWNlOiBib29sZWFuO1xuICBwcm9wYWdhdGVNZXNzYWdlVHJhY2U6IGJvb2xlYW47XG4gIHJlY29yZENvbm5lY3Rpb25MaWZldGltZVNwYW46IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCA9IHtcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc3BhbklkPzogc3RyaW5nO1xuICBwYXJlbnRTcGFuSWQ/OiBzdHJpbmc7XG4gIHNhbXBsZWQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIge1xuICBnZXRUZWxlbWV0cnlDb250ZXh0KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0O1xufVxuXG4vLyAtLSBPcHRpb25zIHNjaGVtYSAtLVxuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNhbXBsaW5nT3B0aW9ucyA9IHtcbiAgZGVmYXVsdFJhdGU/OiBudW1iZXI7XG4gIHJhdGVCeUV2ZW50PzogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgbWF4UmVjb3Jkc1BlclNlY29uZD86IG51bWJlcjtcbiAgYWx3YXlzUmVjb3JkTGV2ZWxzPzogQXJyYXk8XCJ3YXJuXCIgfCBcImVycm9yXCI+O1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2FtcGxpbmdPcHRpb25zID0ge1xuICBtYXhSZWNvcmRzUGVyU2Vjb25kPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNhbXBsaW5nT3B0aW9ucyA9IHtcbiAgZGVmYXVsdFJhdGU/OiBudW1iZXI7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlEZWZhdWx0c09wdGlvbnMgPSB7XG4gIHJlZGFjdG9yPzogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3I7XG4gIGJlZm9yZVJlY29yZD86IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZDtcbiAgbWF4UmVjb3Jkcz86IG51bWJlcjtcbiAgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudHNPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2lua1tdO1xuICBzdG9yZT86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmU7XG4gIG1heFJlY29yZHM/OiBudW1iZXI7XG4gIG1heEJ5dGVzPzogbnVtYmVyO1xuICBtYXhJbkZsaWdodEVtaXRzPzogbnVtYmVyO1xuICByZWRhY3Rvcj86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudEJlZm9yZVJlY29yZCB8IG51bGw7XG4gIHNhbXBsaW5nPzogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTYW1wbGluZ09wdGlvbnM7XG4gIGNhcHR1cmVQYXlsb2FkPzogZmFsc2UgfCBcInByZXZpZXdcIjtcbiAgbWF4UGF5bG9hZFByZXZpZXdCeXRlcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NpbmtbXTtcbiAgc3RvcmU/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTdG9yZTtcbiAgbWF4UmVjb3Jkcz86IG51bWJlcjtcbiAgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIG1heEluRmxpZ2h0RW1pdHM/OiBudW1iZXI7XG4gIHJlZGFjdG9yPzogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNCZWZvcmVSZWNvcmQgfCBudWxsO1xuICBzYW1wbGluZz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NhbXBsaW5nT3B0aW9ucztcbiAgY29sbGVjdGlvbkVuYWJsZWQ/OiBib29sZWFuO1xuICBzYW1wbGVJbnRlcnZhbE1zPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhbnNPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rW107XG4gIHN0b3JlPzogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlO1xuICBtYXhSZWNvcmRzPzogbnVtYmVyO1xuICBtYXhCeXRlcz86IG51bWJlcjtcbiAgbWF4SW5GbGlnaHRFbWl0cz86IG51bWJlcjtcbiAgcmVkYWN0b3I/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuQmVmb3JlUmVjb3JkIHwgbnVsbDtcbiAgc2FtcGxpbmc/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2FtcGxpbmdPcHRpb25zO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5T3B0aW9ucyA9IHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGNvbnRyb2xsZXI/OiBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyO1xuICBkZWZhdWx0cz86IFdlYlNvY2tldFRlbGVtZXRyeURlZmF1bHRzT3B0aW9ucztcbiAgZXZlbnRzPzogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRzT3B0aW9ucztcbiAgbWV0cmljcz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NPcHRpb25zO1xuICBzcGFucz86IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5zT3B0aW9ucztcbiAgdHJhY2U/OiBQYXJ0aWFsPFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucz47XG4gIHNodXRkb3duVGltZW91dE1zPzogbnVtYmVyO1xufTtcblxuLy8gLS0gQ29udHJvbGxlciBpbnRlcmZhY2UgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgZW1pdChpbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IHZvaWQ7XG4gIHJlY29yZE1ldHJpYyhpbnB1dDogV2ViU29ja2V0TWV0cmljSW5wdXQpOiB2b2lkO1xuICByZWNvcmRTcGFuKGlucHV0OiBXZWJTb2NrZXRTcGFuSW5wdXQpOiB2b2lkO1xuICBnZXRNZXRyaWNzU25hcHNob3QoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90O1xuICBnZXRFdmVudFN0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWQ7XG4gIGdldE1ldHJpY1N0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkO1xuICBnZXRTcGFuU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkO1xuICByZWdpc3Rlck1ldHJpY1NvdXJjZShzb3VyY2U6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZSk6ICgpID0+IHZvaWQ7XG4gIGNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KHJlcXVlc3Q/OiB7XG4gICAgaGVhZGVycz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPj47XG4gIH0pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dDtcbiAgZ2V0VHJhY2VPcHRpb25zKCk6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucztcbiAgc2h1dGRvd24ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vLyAtLSBDb25zdGFudHMgYW5kIHNoYXJlZCBoZWxwZXJzIChwcmVzZXJ2ZWQtYmVoYXZpb3IpIC0tXG5cbmV4cG9ydCBjb25zdCBFTVBUWV9NRVRSSUNTX1NOQVBTSE9UOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QgPSB7XG4gIHRpbWVzdGFtcDogMCxcbiAgYWN0aXZlQ29ubmVjdGlvbnM6IDAsXG4gIGFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2U6IHt9LFxuICByb29tQ291bnQ6IDAsXG4gIHBlbmRpbmdJbmJvdW5kTWVzc2FnZXM6IDAsXG4gIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiAwLFxuICBzb2NrZXRCdWZmZXJlZEJ5dGVzOiAwLFxuICBwZW5kaW5nRmFuT3V0Sm9iczogMCxcbiAgcGVuZGluZ0Zhbk91dFRhcmdldHM6IDAsXG4gIHRlbGVtZXRyeURyb3BwZWRSZWNvcmRzOiAwLFxuICB0ZWxlbWV0cnlTaW5rRmFpbHVyZXM6IDAsXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9UUkFDRV9PUFRJT05TOiBXZWJTb2NrZXRUZWxlbWV0cnlUcmFjZU9wdGlvbnMgPSB7XG4gIGV4dHJhY3RUcmFjZVBhcmVudDogdHJ1ZSxcbiAgZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2U6IHRydWUsXG4gIHByb3BhZ2F0ZU1lc3NhZ2VUcmFjZTogdHJ1ZSxcbiAgcmVjb3JkQ29ubmVjdGlvbkxpZmV0aW1lU3BhbjogZmFsc2UsXG59O1xuXG5jb25zdCBERUZBVUxUX01BWF9SRUNPUkRTX1BFUl9TRUNPTkQgPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX1NIVVRET1dOX1RJTUVPVVRfTVMgPSAyXzAwMDtcbmNvbnN0IERFRkFVTFRfRVZFTlRfU0FNUExJTkdfREVGQVVMVF9SQVRFID0gMS4wO1xuY29uc3QgREVGQVVMVF9FVkVOVF9BTFdBWVNfUkVDT1JEX0xFVkVMUzogUmVhZG9ubHlBcnJheTxcIndhcm5cIiB8IFwiZXJyb3JcIj4gPSBbXCJ3YXJuXCIsIFwiZXJyb3JcIl07XG5jb25zdCBERUZBVUxUX0VWRU5UX0NBUFRVUkVfUEFZTE9BRDogZmFsc2UgfCBcInByZXZpZXdcIiA9IGZhbHNlO1xuY29uc3QgREVGQVVMVF9FVkVOVF9NQVhfUEFZTE9BRF9QUkVWSUVXX0JZVEVTID0gMTAyNDtcbmNvbnN0IERFRkFVTFRfTUVUUklDX0NPTExFQ1RJT05fRU5BQkxFRCA9IHRydWU7XG5jb25zdCBERUZBVUxUX01FVFJJQ19TQU1QTEVfSU5URVJWQUxfTVMgPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX1NQQU5fU0FNUExJTkdfREVGQVVMVF9SQVRFID0gMS4wO1xuY29uc3QgREVGQVVMVF9NQVhfSU5fRkxJR0hUX0VNSVRTX1BFUl9TSU5LID0gMTAwO1xuXG5jb25zdCBTRU5TSVRJVkVfS0VZX1BBVFRFUk5TID0gW1xuICBcImF1dGhvcml6YXRpb25cIixcbiAgXCJjb29raWVcIixcbiAgXCJ0b2tlblwiLFxuICBcInBhc3N3b3JkXCIsXG4gIFwic2VjcmV0XCIsXG4gIFwiYXBpa2V5XCIsXG4gIFwic2Vzc2lvblwiLFxuICBcImVtYWlsXCIsXG5dIGFzIGNvbnN0O1xuY29uc3QgUkVEQUNURURfVkFMVUUgPSBcIltyZWRhY3RlZF1cIjtcblxuZnVuY3Rpb24gaXNTZW5zaXRpdmVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGtleS5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIFNFTlNJVElWRV9LRVlfUEFUVEVSTlMuc29tZSgocGF0dGVybikgPT4gbm9ybWFsaXplZC5pbmNsdWRlcyhwYXR0ZXJuKSk7XG59XG5cbmZ1bmN0aW9uIHJlZGFjdFZhbHVlKHZhbHVlOiBXZWJTb2NrZXRUZWxlbWV0cnlWYWx1ZSwga2V5Pzogc3RyaW5nKTogV2ViU29ja2V0VGVsZW1ldHJ5VmFsdWUge1xuICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgaXNTZW5zaXRpdmVLZXkoa2V5KSkge1xuICAgIHJldHVybiBSRURBQ1RFRF9WQUxVRTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHJlZGFjdFZhbHVlKGl0ZW0pKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpZiAodmFsdWUgJiYgaXNPYmplY3RWYWx1ZSh2YWx1ZSkpIHtcbiAgICBjb25zdCByZWRhY3RlZDogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcyA9IHt9O1xuICAgIGZvciAoY29uc3QgW2NoaWxkS2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIHJlZGFjdGVkW2NoaWxkS2V5XSA9IHJlZGFjdFZhbHVlKGNoaWxkVmFsdWUsIGNoaWxkS2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZGFjdGVkO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3Qg4oCUIHNlbnNpdGl2ZSBrZXkg7Yyo7YS0IOq4sOuwmCBidWlsdC1pbiByZWRhY3Rvci5cbiAqIHBpcGVsaW5lIGVtaXQgZmxvd+ydmCDssqsg64uo6rOE7JeQ7IScIO2VreyDgSDsoIHsmqnrkJzri6QuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3QocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQpOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQge1xuICBpZiAocmVjb3JkLnR5cGUgPT09IFwiZXZlbnRcIikge1xuICAgIC8vIFNBRkVUWTogcmVkYWN0b3LripQg7J2067Kk7Yq4IOugiOy9lOuTnOydmCDtgqQg6rWs7KGw66W8IOycoOyngO2VmOqzoCDqsJLrp4wg66eI7Iqk7YK57ZWc64ukLlxuICAgIHJldHVybiB7XG4gICAgICAuLi5yZWNvcmQsXG4gICAgICBhdHRyaWJ1dGVzOiByZWNvcmQuYXR0cmlidXRlc1xuICAgICAgICA/IChyZWRhY3RWYWx1ZShyZWNvcmQuYXR0cmlidXRlcykgYXMgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmRbXCJhdHRyaWJ1dGVzXCJdKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGRldGFpbDogcmVjb3JkLmRldGFpbFxuICAgICAgICA/IChyZWRhY3RWYWx1ZShyZWNvcmQuZGV0YWlsKSBhcyBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtcImRldGFpbFwiXSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBwYXlsb2FkUHJldmlldzogcmVjb3JkLnBheWxvYWRQcmV2aWV3LFxuICAgIH07XG4gIH1cblxuICBpZiAocmVjb3JkLnR5cGUgPT09IFwibWV0cmljXCIpIHtcbiAgICAvLyBTQUZFVFk6IHJlZGFjdG9y64qUIOuplO2KuOumrSDroIjsvZTrk5zsnZgg7YKkIOq1rOyhsOulvCDsnKDsp4DtlZjqs6Ag6rCS66eMIOuniOyKpO2Cue2VnOuLpC5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVjb3JkLFxuICAgICAgdGFnczogcmVjb3JkLnRhZ3NcbiAgICAgICAgPyAocmVkYWN0VmFsdWUocmVjb3JkLnRhZ3MpIGFzIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZFtcInRhZ3NcIl0pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgc25hcHNob3Q6IHJlY29yZC5zbmFwc2hvdCA/IHsgLi4ucmVjb3JkLnNuYXBzaG90IH0gOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFNBRkVUWTogcmVkYWN0b3LripQgc3BhbuqzvCDtlZjsnIQg7J2067Kk7Yq4wrfrp4HtgazsnZgg7YKkIOq1rOyhsOulvCDsnKDsp4DtlZjqs6Ag6rCS66eMIOuniOyKpO2Cue2VnOuLpC5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZWNvcmQsXG4gICAgYXR0cmlidXRlczogcmVjb3JkLmF0dHJpYnV0ZXNcbiAgICAgID8gKHJlZGFjdFZhbHVlKHJlY29yZC5hdHRyaWJ1dGVzKSBhcyBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkW1wiYXR0cmlidXRlc1wiXSlcbiAgICAgIDogdW5kZWZpbmVkLFxuICAgIGV2ZW50czogcmVjb3JkLmV2ZW50cz8ubWFwKChldmVudCkgPT4gKHtcbiAgICAgIC4uLmV2ZW50LFxuICAgICAgYXR0cmlidXRlczogZXZlbnQuYXR0cmlidXRlc1xuICAgICAgICA/IChyZWRhY3RWYWx1ZShldmVudC5hdHRyaWJ1dGVzKSBhcyBXZWJTb2NrZXRUZWxlbWV0cnlBdHRyaWJ1dGVzKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KSksXG4gICAgbGlua3M6IHJlY29yZC5saW5rcz8ubWFwKChsaW5rKSA9PiAoe1xuICAgICAgLi4ubGluayxcbiAgICAgIGF0dHJpYnV0ZXM6IGxpbmsuYXR0cmlidXRlc1xuICAgICAgICA/IChyZWRhY3RWYWx1ZShsaW5rLmF0dHJpYnV0ZXMpIGFzIFdlYlNvY2tldFRlbGVtZXRyeUF0dHJpYnV0ZXMpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJ1bmNhdGVQYXlsb2FkUHJldmlldyhwYXlsb2FkOiBXZWJTb2NrZXRUZWxlbWV0cnlWYWx1ZSwgbWF4Qnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHJlZGFjdFZhbHVlKHBheWxvYWQpKTtcbiAgICBpZiAoQnVmZmVyLmJ5dGVMZW5ndGgoc2VyaWFsaXplZCwgXCJ1dGYtOFwiKSA8PSBtYXhCeXRlcykge1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxuICAgIHJldHVybiB0cnVuY2F0ZVV0ZjhTdHJpbmcoc2VyaWFsaXplZCwgbWF4Qnl0ZXMpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCJbdW5zZXJpYWxpemFibGVdXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ1bmNhdGVVdGY4U3RyaW5nKHZhbHVlOiBzdHJpbmcsIG1heEJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobWF4Qnl0ZXMgPD0gMCkgcmV0dXJuIFwiXCI7XG5cbiAgY29uc3Qgc3VmZml4ID0gbWF4Qnl0ZXMgPj0gMyA/IFwiLi4uXCIgOiBcIlwiO1xuICBjb25zdCBjb250ZW50QnVkZ2V0ID0gbWF4Qnl0ZXMgLSBCdWZmZXIuYnl0ZUxlbmd0aChzdWZmaXgsIFwidXRmLThcIik7XG4gIGxldCByZXN1bHQgPSBcIlwiO1xuICBsZXQgdXNlZEJ5dGVzID0gMDtcblxuICBmb3IgKGNvbnN0IGNoYXIgb2YgdmFsdWUpIHtcbiAgICBjb25zdCBjaGFyQnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChjaGFyLCBcInV0Zi04XCIpO1xuICAgIGlmICh1c2VkQnl0ZXMgKyBjaGFyQnl0ZXMgPiBjb250ZW50QnVkZ2V0KSBicmVhaztcbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgICB1c2VkQnl0ZXMgKz0gY2hhckJ5dGVzO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCArIHN1ZmZpeDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvbWlzZUxpa2U8VmFsdWU+KHZhbHVlOiBWYWx1ZSk6IHZhbHVlIGlzIFZhbHVlICYgUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBpc09iamVjdFZhbHVlKHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBcInRoZW5cIiBpbiB2YWx1ZSAmJiBcImNhdGNoXCIgaW4gdmFsdWU7XG59XG5cbi8vIC0tIFRva2VuQnVja2V0ICh1bmNoYW5nZWQpIC0tXG5cbmNsYXNzIFRva2VuQnVja2V0IHtcbiAgcHJpdmF0ZSB0b2tlbnM6IG51bWJlcjtcbiAgcHJpdmF0ZSBsYXN0UmVmaWxsOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXhUb2tlbnM6IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZmlsbFJhdGU6IG51bWJlcixcbiAgKSB7XG4gICAgdGhpcy50b2tlbnMgPSBtYXhUb2tlbnM7XG4gICAgdGhpcy5sYXN0UmVmaWxsID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHRyeUNvbnN1bWUoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5yZWZpbGwoKTtcbiAgICBpZiAodGhpcy50b2tlbnMgPCAxKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy50b2tlbnMgLT0gMTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmaWxsKCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZWxhcHNlZCA9IChub3cgLSB0aGlzLmxhc3RSZWZpbGwpIC8gMTAwMDtcbiAgICB0aGlzLnRva2VucyA9IE1hdGgubWluKHRoaXMubWF4VG9rZW5zLCB0aGlzLnRva2VucyArIGVsYXBzZWQgKiB0aGlzLnJlZmlsbFJhdGUpO1xuICAgIHRoaXMubGFzdFJlZmlsbCA9IG5vdztcbiAgfVxufVxuXG4vLyAtLSBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciAocHJlc2VydmVkLWJlaGF2aW9yKSAtLVxuXG5jb25zdCBub29wVW5zdWJzY3JpYmUgPSAoKTogdm9pZCA9PiB7fTtcblxuZXhwb3J0IGNsYXNzIE5vb3BXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIGltcGxlbWVudHMgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciB7XG4gIGVtaXQoX2lucHV0OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KTogdm9pZCB7XG4gICAgLy8gbm9vcFxuICB9XG5cbiAgcmVjb3JkTWV0cmljKF9pbnB1dDogV2ViU29ja2V0TWV0cmljSW5wdXQpOiB2b2lkIHtcbiAgICAvLyBub29wXG4gIH1cblxuICByZWNvcmRTcGFuKF9pbnB1dDogV2ViU29ja2V0U3BhbklucHV0KTogdm9pZCB7XG4gICAgLy8gbm9vcFxuICB9XG5cbiAgZ2V0TWV0cmljc1NuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHsgLi4uRU1QVFlfTUVUUklDU19TTkFQU0hPVCwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH07XG4gIH1cblxuICBnZXRFdmVudFN0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRNZXRyaWNTdG9yZSgpOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFNwYW5TdG9yZSgpOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU3RvcmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZWdpc3Rlck1ldHJpY1NvdXJjZShfc291cmNlOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTb3VyY2UpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gbm9vcFVuc3Vic2NyaWJlO1xuICB9XG5cbiAgY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQoX3JlcXVlc3Q/OiB7XG4gICAgaGVhZGVycz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPj47XG4gIH0pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgZ2V0VHJhY2VPcHRpb25zKCk6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucyB7XG4gICAgcmV0dXJuIHsgLi4uREVGQVVMVF9UUkFDRV9PUFRJT05TIH07XG4gIH1cblxuICBzaHV0ZG93bihfb3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbn1cblxuLy8gLS0gUmVzb2x2ZWQgcGVyLXBpcGVsaW5lIG9wdGlvbiB0eXBlcyAoaW50ZXJuYWwpIC0tXG5cbnR5cGUgUnVudGltZU1ldGFkYXRhID0ge1xuICBydW50aW1lSWQ6IHN0cmluZztcbiAgbm9kZUlkOiBzdHJpbmc7XG59O1xuXG50eXBlIFJlc29sdmVkRXZlbnRQaXBlbGluZU9wdGlvbnMgPSB7XG4gIHNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNpbmtbXTtcbiAgc3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWQ7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ6IG51bWJlcjtcbiAgbWF4SW5GbGlnaHRFbWl0czogbnVtYmVyO1xuICBzaGFyZWRSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHNpZ25hbFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBzaGFyZWRCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgc2lnbmFsQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudEJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgc2FtcGxpbmc6IHtcbiAgICBkZWZhdWx0UmF0ZTogbnVtYmVyO1xuICAgIHJhdGVCeUV2ZW50OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICAgIGFsd2F5c1JlY29yZExldmVsczogQXJyYXk8XCJ3YXJuXCIgfCBcImVycm9yXCI+O1xuICB9O1xuICBjYXB0dXJlUGF5bG9hZDogZmFsc2UgfCBcInByZXZpZXdcIjtcbiAgbWF4UGF5bG9hZFByZXZpZXdCeXRlczogbnVtYmVyO1xufTtcblxudHlwZSBSZXNvbHZlZE1ldHJpY1BpcGVsaW5lT3B0aW9ucyA9IHtcbiAgc2lua3M6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NpbmtbXTtcbiAgc3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkO1xuICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBudW1iZXI7XG4gIG1heEluRmxpZ2h0RW1pdHM6IG51bWJlcjtcbiAgc2hhcmVkUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeVJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBzaWduYWxSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHNoYXJlZEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5QmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBzaWduYWxCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY0JlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgY29sbGVjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG4gIHNhbXBsZUludGVydmFsTXM6IG51bWJlcjtcbn07XG5cbnR5cGUgUmVzb2x2ZWRTcGFuUGlwZWxpbmVPcHRpb25zID0ge1xuICBzaW5rczogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNpbmtbXTtcbiAgc3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB8IHVuZGVmaW5lZDtcbiAgbWF4UmVjb3Jkc1BlclNlY29uZDogbnVtYmVyO1xuICBtYXhJbkZsaWdodEVtaXRzOiBudW1iZXI7XG4gIHNoYXJlZFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgc2lnbmFsUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgc2hhcmVkQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlCZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQ7XG4gIHNpZ25hbEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhbkJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgc2FtcGxpbmc6IHtcbiAgICBkZWZhdWx0UmF0ZTogbnVtYmVyO1xuICB9O1xufTtcblxuLy8gLS0gSW50ZXJuYWwgZXZlbnQgcmVwb3J0ZXIgdHlwZSAtLVxuLy8gRXZlbnRQaXBlbGluZSDsnpDsi6Dqs7wgY29udHJvbGxlcuqwgCDrgrTrtoAg7KeE64uoIOydtOuypO2KuOulvCDrsJztlontlaAg65WMIOyCrOyaqe2VnOuLpC5cbi8vIHR5cGUtbWlzbWF0Y2ggLyBzaHV0ZG93bi50aW1lb3V0IC8gc2luay5mYWlsZWQg65Ox7J2EIGV2ZW50cyBwaXBlbGluZSDqsr3roZzroZwg67O064K464ukLlxudHlwZSBJbnRlcm5hbEV2ZW50UmVwb3J0ZXIgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgbGV2ZWw6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkW1wibGV2ZWxcIl0sXG4gIGRldGFpbD86IFdlYlNvY2tldFRlbGVtZXRyeUF0dHJpYnV0ZXMsXG4pID0+IHZvaWQ7XG5cbi8vIC0tIFRlbGVtZXRyeVBpcGVsaW5lIChhYnN0cmFjdCkgLS1cblxuYWJzdHJhY3QgY2xhc3MgVGVsZW1ldHJ5UGlwZWxpbmU8XG4gIFRSZWNvcmQgZXh0ZW5kcyBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4gIFRJbnB1dCxcbiAgVFNpbmsgZXh0ZW5kcyB7XG4gICAgZW1pdChyZWNvcmQ6IFRSZWNvcmQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICBzaHV0ZG93bj8ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgfSxcbiAgVFN0b3JlIGV4dGVuZHMgeyByZWFkb25seSBzaW5rOiBUU2luazsgY2xlYXIoKTogdm9pZCB9IHwgdW5kZWZpbmVkLFxuPiB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IHNpZ25hbDogXCJldmVudFwiIHwgXCJtZXRyaWNcIiB8IFwic3BhblwiO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lua3M6IFRTaW5rW107XG4gIHByb3RlY3RlZCByZWFkb25seSB0ZWxlbWV0cnlTdG9yZTogVFN0b3JlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9rZW5CdWNrZXQ6IFRva2VuQnVja2V0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4SW5GbGlnaHRFbWl0czogbnVtYmVyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGE7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaGFyZWRSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaGFyZWRCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGludGVybmFsRXZlbnRSZXBvcnRlcjogSW50ZXJuYWxFdmVudFJlcG9ydGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGluRmxpZ2h0RW1pdHMgPSBuZXcgV2Vha01hcDxUU2luaywgbnVtYmVyPigpO1xuICBkcm9wcGVkQ291bnQgPSAwO1xuICBzaW5rRmFpbHVyZUNvdW50ID0gMDtcbiAgc2h1dGRvd25DYWxsZWQgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgc2lua3M6IFRTaW5rW10sXG4gICAgc3RvcmU6IFRTdG9yZSxcbiAgICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBudW1iZXIsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogbnVtYmVyLFxuICAgIHNoYXJlZFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciB8IHVuZGVmaW5lZCxcbiAgICBzaGFyZWRCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZCxcbiAgICBydW50aW1lTWV0YWRhdGE6IFJ1bnRpbWVNZXRhZGF0YSxcbiAgKSB7XG4gICAgdGhpcy5zaW5rcyA9IHNpbmtzO1xuICAgIHRoaXMudGVsZW1ldHJ5U3RvcmUgPSBzdG9yZTtcbiAgICB0aGlzLnRva2VuQnVja2V0ID0gbmV3IFRva2VuQnVja2V0KG1heFJlY29yZHNQZXJTZWNvbmQsIG1heFJlY29yZHNQZXJTZWNvbmQpO1xuICAgIHRoaXMubWF4SW5GbGlnaHRFbWl0cyA9IG1heEluRmxpZ2h0RW1pdHM7XG4gICAgdGhpcy5zaGFyZWRSZWRhY3RvciA9IHNoYXJlZFJlZGFjdG9yO1xuICAgIHRoaXMuc2hhcmVkQmVmb3JlUmVjb3JkID0gc2hhcmVkQmVmb3JlUmVjb3JkO1xuICAgIHRoaXMucnVudGltZU1ldGFkYXRhID0gcnVudGltZU1ldGFkYXRhO1xuICB9XG5cbiAgZ2V0IHN0b3JlKCk6IFRTdG9yZSB7XG4gICAgcmV0dXJuIHRoaXMudGVsZW1ldHJ5U3RvcmU7XG4gIH1cblxuICBzZXRJbnRlcm5hbEV2ZW50UmVwb3J0ZXIocmVwb3J0ZXI6IEludGVybmFsRXZlbnRSZXBvcnRlcik6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJuYWxFdmVudFJlcG9ydGVyID0gcmVwb3J0ZXI7XG4gIH1cblxuICBhYnN0cmFjdCBlbWl0KGlucHV0OiBUSW5wdXQpOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBidWlsZFJlY29yZChpbnB1dDogVElucHV0KTogVFJlY29yZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZDogVFJlY29yZCk6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGlzQ3JpdGljYWxSZWNvcmQocmVjb3JkOiBUUmVjb3JkKTogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U2lnbmFsUmVkYWN0b3IoKTogKChyZWNvcmQ6IFRSZWNvcmQpID0+IFRSZWNvcmQgfCBudWxsKSB8IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6ICgocmVjb3JkOiBUUmVjb3JkKSA9PiBUUmVjb3JkIHwgbnVsbCkgfCB1bmRlZmluZWQ7XG5cbiAgLy8g6rO17Ya1IGVtaXQg7Z2Q66aELiDrqqjrk6Ag7Iug7Zi467OEIHBpcGVsaW5l7J2YIGVtaXTsnbQg7J20IOuplOyEnOuTnOuhnCDsnITsnoTtlZzri6QuXG4gIHByb3RlY3RlZCBlbWl0SW50ZXJuYWwoaW5wdXQ6IFRJbnB1dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG5cbiAgICBsZXQgcmVjb3JkOiBUUmVjb3JkO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSB0aGlzLmJ1aWxkUmVjb3JkKGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2tpcFJhdGVMaW1pdCA9IHRoaXMuc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZCk7XG4gICAgaWYgKCFza2lwUmF0ZUxpbWl0ICYmICF0aGlzLnRva2VuQnVja2V0LnRyeUNvbnN1bWUoKSkge1xuICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzdGVwIDE6IGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3Qg7ZWt7IOBIOyggeyaqVxuICAgIGxldCBwcmVwYXJlZDogVFJlY29yZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWZ0ZXJEZWZhdWx0ID0gZGVmYXVsdFNlbnNpdGl2ZUtleVJlZGFjdChyZWNvcmQpO1xuICAgICAgaWYgKGFmdGVyRGVmYXVsdC50eXBlICE9PSByZWNvcmQudHlwZSkge1xuICAgICAgICAvLyDrsKnslrQg66Gc7KeBIOKAlCDrs7gg6rWs7ZiE7JeQ7ISc64qUIOuwnOyDne2VmOyngCDslYrsp4Drp4wgdHlwZS1uYXJyb3frpbwg7JyE7ZW0IOqygOymnVxuICAgICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwcmVwYXJlZCA9XG4gICAgICAgIC8qIFNBRkVUWTog65Ox66Gd65CcIFdlYlNvY2tldCDsnbTrsqTtirgg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gYWZ0ZXJEZWZhdWx0IGFzIFRSZWNvcmQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHN0ZXAgMjogc2hhcmVkUmVkYWN0b3IgKOydtOuvuCBidWlsZENvbnRyb2xsZXLsl5DshJwgc2lnbmFsUmVkYWN0b3I9PT1udWxs7J2066m0IHNoYXJlZFJlZGFjdG9yPXVuZGVmaW5lZOuhnCDrja7slrTsk7Qg7IOB7YOcKVxuICAgIGlmICh0aGlzLnNoYXJlZFJlZGFjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHNoYXJlZFJlZGFjdG9yID0gdGhpcy5zaGFyZWRSZWRhY3RvcjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0ocHJlcGFyZWQsIChyKSA9PiBzaGFyZWRSZWRhY3RvcihyKSwgXCJzaGFyZWRcIiwgXCJyZWRhY3RvclwiKTtcbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybjtcbiAgICAgIHByZXBhcmVkID0gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIHN0ZXAgMzogc2lnbmFsUmVkYWN0b3JcbiAgICBjb25zdCBzaWduYWxSZWRhY3RvciA9IHRoaXMuZ2V0U2lnbmFsUmVkYWN0b3IoKTtcbiAgICBpZiAoc2lnbmFsUmVkYWN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hcHBseVRyYW5zZm9ybShwcmVwYXJlZCwgKHIpID0+IHNpZ25hbFJlZGFjdG9yKHIpLCBcInNpZ25hbFwiLCBcInJlZGFjdG9yXCIpO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgcHJlcGFyZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gc3RlcCA0OiBzaGFyZWRCZWZvcmVSZWNvcmRcbiAgICBpZiAodGhpcy5zaGFyZWRCZWZvcmVSZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc2hhcmVkQmVmb3JlUmVjb3JkID0gdGhpcy5zaGFyZWRCZWZvcmVSZWNvcmQ7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFxuICAgICAgICBwcmVwYXJlZCxcbiAgICAgICAgKHIpID0+IHNoYXJlZEJlZm9yZVJlY29yZChyKSxcbiAgICAgICAgXCJzaGFyZWRcIixcbiAgICAgICAgXCJiZWZvcmVSZWNvcmRcIixcbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm47XG4gICAgICBwcmVwYXJlZCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBzdGVwIDU6IHNpZ25hbEJlZm9yZVJlY29yZFxuICAgIGNvbnN0IHNpZ25hbEJlZm9yZVJlY29yZCA9IHRoaXMuZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk7XG4gICAgaWYgKHNpZ25hbEJlZm9yZVJlY29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFxuICAgICAgICBwcmVwYXJlZCxcbiAgICAgICAgKHIpID0+IHNpZ25hbEJlZm9yZVJlY29yZChyKSxcbiAgICAgICAgXCJzaWduYWxcIixcbiAgICAgICAgXCJiZWZvcmVSZWNvcmRcIixcbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm47XG4gICAgICBwcmVwYXJlZCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoVG9TaW5rcyhwcmVwYXJlZCk7XG4gIH1cblxuICAvLyByZWRhY3RvciDrmJDripQgYmVmb3JlUmVjb3JkIDHtmowg7KCB7JqpLiDrsJjtmZjqsJLsnbQgbnVsbOydtOuptCBkcm9wLCB0eXBlIOu2iOydvOy5mOuptCBkcm9wICsgaW50ZXJuYWwgZXZlbnQuXG4gIC8vIHNoYXJlZCDrs4DtmZjsnYAgd2lkZXIgcmVjb3Jk66W8IOuwm+yVhCB3aWRlciByZWNvcmTrpbwg67CY7ZmY7ZWY7KeA66eMLCBzaWduYWwg67OA7ZmY7J2AIG5hcnJvd2VkIFRSZWNvcmTrgbzrpqwg67OA7ZmY7ZWc64ukLlxuICAvLyDslpHsqr0g66qo65GQIOuPmeydvO2VnCB0eXBlLW1pc21hdGNoIGRlZmVuc2l2ZSDqsoDsgqzrpbwg6rGw7Lmc64ukLlxuICBwcml2YXRlIGFwcGx5VHJhbnNmb3JtKFxuICAgIHJlY29yZDogVFJlY29yZCxcbiAgICBydW5uZXI6IChyZWNvcmQ6IFRSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGwsXG4gICAgc291cmNlOiBcInNoYXJlZFwiIHwgXCJzaWduYWxcIixcbiAgICBraW5kOiBcInJlZGFjdG9yXCIgfCBcImJlZm9yZVJlY29yZFwiLFxuICApOiBUUmVjb3JkIHwgbnVsbCB7XG4gICAgbGV0IHJlc3VsdDogV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkIHwgbnVsbDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gcnVubmVyKHJlY29yZCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQudHlwZSAhPT0gcmVjb3JkLnR5cGUpIHtcbiAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICBjb25zdCBldmVudE5hbWUgPVxuICAgICAgICBraW5kID09PSBcInJlZGFjdG9yXCJcbiAgICAgICAgICA/IFwid3MudGVsZW1ldHJ5LnJlZGFjdG9yLnR5cGVfbWlzbWF0Y2hcIlxuICAgICAgICAgIDogXCJ3cy50ZWxlbWV0cnkuYmVmb3JlUmVjb3JkLnR5cGVfbWlzbWF0Y2hcIjtcbiAgICAgIHRoaXMuZGlzcGF0Y2hJbnRlcm5hbEV2ZW50KGV2ZW50TmFtZSwgXCJ3YXJuXCIsIHtcbiAgICAgICAgZXhwZWN0ZWQ6IHJlY29yZC50eXBlLFxuICAgICAgICBhY3R1YWw6IHJlc3VsdC50eXBlLFxuICAgICAgICBzb3VyY2UsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHJlc3VsdC50eXBlID09PSByZWNvcmQudHlwZSA9PT0gVFJlY29yZFtcInR5cGVcIl3snbTrr4DroZwgbmFycm93ZWQgVFJlY29yZOuhnCDslYjsoITtlZjqsowg7KKB7Z6QIOyImCDsnojri6QuXG4gICAgcmV0dXJuIC8qIFNBRkVUWTog65Ox66Gd65CcIFdlYlNvY2tldCDsnbTrsqTtirgg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcmVzdWx0IGFzIFRSZWNvcmQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGlzcGF0Y2hUb1NpbmtzKHJlY29yZDogVFJlY29yZCwgc2VsZk9ic2VydmVGYWlsdXJlcyA9IHRydWUpOiB2b2lkIHtcbiAgICBjb25zdCBjcml0aWNhbCA9IHRoaXMuaXNDcml0aWNhbFJlY29yZChyZWNvcmQpO1xuICAgIGxldCBkcm9wcGVkRm9yUmVjb3JkID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IHNpbmsgb2YgdGhpcy5zaW5rcykge1xuICAgICAgY29uc3QgaW5GbGlnaHQgPSB0aGlzLmluRmxpZ2h0RW1pdHMuZ2V0KHNpbmspID8/IDA7XG4gICAgICBpZiAoIWNyaXRpY2FsICYmIGluRmxpZ2h0ID49IHRoaXMubWF4SW5GbGlnaHRFbWl0cykge1xuICAgICAgICBpZiAoIWRyb3BwZWRGb3JSZWNvcmQpIHtcbiAgICAgICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgICAgIGRyb3BwZWRGb3JSZWNvcmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzaW5rLmVtaXQocmVjb3JkKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZUxpa2UocmVzdWx0KSkge1xuICAgICAgICAgIHRoaXMuaW5GbGlnaHRFbWl0cy5zZXQoc2luaywgaW5GbGlnaHQgKyAxKTtcbiAgICAgICAgICByZXN1bHQudGhlbihcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRJbkZsaWdodEVtaXQoc2luayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGNhdXNlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50SW5GbGlnaHRFbWl0KHNpbmspO1xuICAgICAgICAgICAgICB0aGlzLm9ic2VydmVTaW5rRmFpbHVyZShcImVtaXRcIiwgY2F1c2UsIHNlbGZPYnNlcnZlRmFpbHVyZXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLm9ic2VydmVTaW5rRmFpbHVyZShcImVtaXRcIiwgZXJyb3IsIHNlbGZPYnNlcnZlRmFpbHVyZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVjcmVtZW50SW5GbGlnaHRFbWl0KHNpbms6IFRTaW5rKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuaW5GbGlnaHRFbWl0cy5nZXQoc2luaykgPz8gMDtcbiAgICBpZiAoY3VycmVudCA8PSAxKSB7XG4gICAgICB0aGlzLmluRmxpZ2h0RW1pdHMuZGVsZXRlKHNpbmspO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluRmxpZ2h0RW1pdHMuc2V0KHNpbmssIGN1cnJlbnQgLSAxKTtcbiAgfVxuXG4gIHByaXZhdGUgb2JzZXJ2ZVNpbmtGYWlsdXJlPFZhbHVlPihcbiAgICBwaGFzZTogXCJlbWl0XCIgfCBcInNodXRkb3duXCIsXG4gICAgZXJyb3I6IFZhbHVlLFxuICAgIHNlbGZPYnNlcnZlRmFpbHVyZTogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zaW5rRmFpbHVyZUNvdW50ICs9IDE7XG4gICAgaWYgKCFzZWxmT2JzZXJ2ZUZhaWx1cmUpIHJldHVybjtcbiAgICB0aGlzLmRpc3BhdGNoSW50ZXJuYWxFdmVudChcIndzLnRlbGVtZXRyeS5zaW5rLmZhaWxlZFwiLCBcIndhcm5cIiwge1xuICAgICAgcGhhc2UsXG4gICAgICBzaWduYWw6IHRoaXMuc2lnbmFsLFxuICAgICAgZXJyb3JUeXBlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubmFtZSA6IHJ1bnRpbWVUeXBlT2YoZXJyb3IpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRpc3BhdGNoSW50ZXJuYWxFdmVudChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbGV2ZWw6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkW1wibGV2ZWxcIl0sXG4gICAgZGV0YWlsPzogV2ViU29ja2V0VGVsZW1ldHJ5QXR0cmlidXRlcyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW50ZXJuYWxFdmVudFJlcG9ydGVyID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pbnRlcm5hbEV2ZW50UmVwb3J0ZXIobmFtZSwgbGV2ZWwsIGRldGFpbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyDsp4Tri6gg7J2067Kk7Yq4IOyekOyytOqwgCDsi6TtjKjtlZjrqbQgc3dhbGxvd1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duKHRpbWVvdXRNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcbiAgICB0aGlzLnNodXRkb3duQ2FsbGVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IHNpbmtTaHV0ZG93bnMgPSB0aGlzLnNpbmtzLm1hcCgoc2luaykgPT4gdGhpcy5zaHV0ZG93blNpbmsoc2luaywgdGltZW91dE1zKSk7XG4gICAgaWYgKHNpbmtTaHV0ZG93bnMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHNpbmtTaHV0ZG93bnMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2h1dGRvd25TaW5rKHNpbms6IFRTaW5rLCB0aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc2luay5zaHV0ZG93bikgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNpbmsuc2h1dGRvd24oeyB0aW1lb3V0TXMgfSk7XG4gICAgICBpZiAoIWlzUHJvbWlzZUxpa2UocmVzdWx0KSkgcmV0dXJuO1xuXG4gICAgICBsZXQgdGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0IHNodXRkb3duUHJvbWlzZSA9IHJlc3VsdC50aGVuKFxuICAgICAgICAoKSA9PiBcImNvbXBsZXRlZFwiIGFzIGNvbnN0LFxuICAgICAgICAoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICB0aHJvdyBjYXVzZTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPFwidGltZW91dFwiPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShcInRpbWVvdXRcIik7XG4gICAgICAgIH0sIHRpbWVvdXRNcyk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3V0Y29tZSA9IGF3YWl0IFByb21pc2UucmFjZShbc2h1dGRvd25Qcm9taXNlLCB0aW1lb3V0UHJvbWlzZV0pO1xuICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3V0Y29tZSA9PT0gXCJ0aW1lb3V0XCIpIHtcbiAgICAgICAgc2h1dGRvd25Qcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgdGhpcy5zaW5rRmFpbHVyZUNvdW50ICs9IDE7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hJbnRlcm5hbEV2ZW50KFwid3MudGVsZW1ldHJ5LnNodXRkb3duLnRpbWVvdXRcIiwgXCJ3YXJuXCIsIHtcbiAgICAgICAgICB0aW1lb3V0TXMsXG4gICAgICAgICAgc2lnbmFsOiB0aGlzLnNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZVNpbmtGYWlsdXJlKFwic2h1dGRvd25cIiwgZXJyb3IsIHRydWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyAtLSBFdmVudFBpcGVsaW5lIC0tXG5cbmNsYXNzIEV2ZW50UGlwZWxpbmUgZXh0ZW5kcyBUZWxlbWV0cnlQaXBlbGluZTxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQsXG4gIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50SW5wdXQsXG4gIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2luayxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTdG9yZSB8IHVuZGVmaW5lZFxuPiB7XG4gIHJlYWRvbmx5IHNpZ25hbCA9IFwiZXZlbnRcIiBhcyBjb25zdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lnbmFsQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudEJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNhbXBsaW5nOiB7XG4gICAgZGVmYXVsdFJhdGU6IG51bWJlcjtcbiAgICByYXRlQnlFdmVudDogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICBhbHdheXNSZWNvcmRMZXZlbHM6IEFycmF5PFwid2FyblwiIHwgXCJlcnJvclwiPjtcbiAgfTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhcHR1cmVQYXlsb2FkOiBmYWxzZSB8IFwicHJldmlld1wiO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4UGF5bG9hZFByZXZpZXdCeXRlczogbnVtYmVyO1xuICAvLyBhbHdheXNSZWNvcmQgbGV2ZWwg6rK966Gc7JeQ7IScIHByZXBhcmVSZWNvcmQoc2tpcFJhdGVMaW1pdD10cnVlKSDsnZjrr7jrpbwg67O07KG07ZWY6riwIOychO2VnCDtlIzrnpjqt7guXG4gIHByaXZhdGUgY3VycmVudEVtaXRBbHdheXNSZWNvcmQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXNvbHZlZEV2ZW50UGlwZWxpbmVPcHRpb25zLCBydW50aW1lTWV0YWRhdGE6IFJ1bnRpbWVNZXRhZGF0YSkge1xuICAgIHN1cGVyKFxuICAgICAgb3B0aW9ucy5zaW5rcyxcbiAgICAgIG9wdGlvbnMuc3RvcmUsXG4gICAgICBvcHRpb25zLm1heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgICBvcHRpb25zLm1heEluRmxpZ2h0RW1pdHMsXG4gICAgICBvcHRpb25zLnNoYXJlZFJlZGFjdG9yLFxuICAgICAgb3B0aW9ucy5zaGFyZWRCZWZvcmVSZWNvcmQsXG4gICAgICBydW50aW1lTWV0YWRhdGEsXG4gICAgKTtcbiAgICB0aGlzLnNpZ25hbFJlZGFjdG9yID0gb3B0aW9ucy5zaWduYWxSZWRhY3RvcjtcbiAgICB0aGlzLnNpZ25hbEJlZm9yZVJlY29yZCA9IG9wdGlvbnMuc2lnbmFsQmVmb3JlUmVjb3JkO1xuICAgIHRoaXMuc2FtcGxpbmcgPSBvcHRpb25zLnNhbXBsaW5nO1xuICAgIHRoaXMuY2FwdHVyZVBheWxvYWQgPSBvcHRpb25zLmNhcHR1cmVQYXlsb2FkO1xuICAgIHRoaXMubWF4UGF5bG9hZFByZXZpZXdCeXRlcyA9IG9wdGlvbnMubWF4UGF5bG9hZFByZXZpZXdCeXRlcztcbiAgfVxuXG4gIGVtaXQoaW5wdXQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50SW5wdXQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcblxuICAgICAgLy8gc2FtcGxpbmc6IGFsd2F5c1JlY29yZExldmVscyDsmrDshKBcbiAgICAgIGNvbnN0IGxldmVsczogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0gdGhpcy5zYW1wbGluZy5hbHdheXNSZWNvcmRMZXZlbHM7XG4gICAgICBjb25zdCBhbHdheXNSZWNvcmQgPSBsZXZlbHMuaW5jbHVkZXMoaW5wdXQubGV2ZWwpO1xuXG4gICAgICBpZiAoIWFsd2F5c1JlY29yZCkge1xuICAgICAgICBjb25zdCByYXRlID0gdGhpcy5zYW1wbGluZy5yYXRlQnlFdmVudFtpbnB1dC5uYW1lXSA/PyB0aGlzLnNhbXBsaW5nLmRlZmF1bHRSYXRlO1xuICAgICAgICBpZiAocmF0ZSA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhdGUgPCAxICYmIE1hdGgucmFuZG9tKCkgPj0gcmF0ZSkge1xuICAgICAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VycmVudEVtaXRBbHdheXNSZWNvcmQgPSBhbHdheXNSZWNvcmQ7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmVtaXRJbnRlcm5hbChpbnB1dCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmN1cnJlbnRFbWl0QWx3YXlzUmVjb3JkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBwaXBlbGluZSBlbWl0IOuYkO2VnCB0aHJvdy1mcmVlIOygleyxhVxuICAgIH1cbiAgfVxuXG4gIC8vIOuCtOu2gCDsp4Tri6gg7J2067Kk7Yq4IOKAlCBzYW1wbGluZy9yYXRlLWxpbWl0IOyasO2ajC4gc2h1dGRvd24g7KSR7JeQ64+EIOuwnO2Wie2VtCB0aW1lb3V0L+yLpO2MqCDsp4Tri6jsnbQg7Jyg7Iuk65CY7KeAIOyViuuPhOuhnSDtlZzri6QuXG4gIC8vIOyCrOyaqeyekCByZWRhY3RvcuydmCB0eXBlLW1pc21hdGNoIOychO2XmOydhCDtlLztlZjquLAg7JyE7ZW0IGRlZmF1bHQgcmVkYWN0b3Lrp4wg7KCB7Jqp7ZWc64ukLlxuICBkaXNwYXRjaEludGVybmFsRGlhZ25vc3RpY0V2ZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBsZXZlbDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmRbXCJsZXZlbFwiXSxcbiAgICBkZXRhaWw/OiBXZWJTb2NrZXRUZWxlbWV0cnlBdHRyaWJ1dGVzLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkID0ge1xuICAgICAgdHlwZTogXCJldmVudFwiLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbW9ub3RvbmljVGltZTogcGVyZm9ybWFuY2Uubm93KCksXG4gICAgICBydW50aW1lSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLnJ1bnRpbWVJZCxcbiAgICAgIG5vZGVJZDogdGhpcy5ydW50aW1lTWV0YWRhdGEubm9kZUlkLFxuICAgICAgbmFtZSxcbiAgICAgIGxldmVsLFxuICAgICAgZGV0YWlsLFxuICAgIH07XG5cbiAgICAvLyDsp4Tri6gg7J2067Kk7Yq464qUIO2VreyDgSBkZWZhdWx0IHJlZGFjdG9y66eMIOyggeyaqe2VtCBzaW5r7JeQIOyngeygkSDsoITri6ztlZzri6QuXG4gICAgLy8gKOyCrOyaqeyekCByZWRhY3RvcuqwgCDsp4Tri6gg7J2067Kk7Yq47J2YIHR5cGXsnYQg7J6Y66q7IOuwlOq/lCDrrLTtlZwg66Oo7ZSE66W8IOydvOycvO2CpOuKlCDsnbzsnYQg66eJ64qU64ukLilcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gZGVmYXVsdFNlbnNpdGl2ZUtleVJlZGFjdChyZWNvcmQpO1xuICAgICAgaWYgKHNhbml0aXplZC50eXBlICE9PSBcImV2ZW50XCIpIHJldHVybjtcbiAgICAgIHRoaXMuZGlzcGF0Y2hUb1NpbmtzKHNhbml0aXplZCwgZmFsc2UpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gc3dhbGxvd1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFJlY29yZChpbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHtcbiAgICBsZXQgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCA9IHtcbiAgICAgIHR5cGU6IFwiZXZlbnRcIixcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1vbm90b25pY1RpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgcnVudGltZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQsXG4gICAgICBub2RlSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLm5vZGVJZCxcbiAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICBsZXZlbDogaW5wdXQubGV2ZWwsXG4gICAgICBuYW1lc3BhY2U6IGlucHV0Lm5hbWVzcGFjZSxcbiAgICAgIGNvbm5lY3Rpb25JZDogaW5wdXQuY29ubmVjdGlvbklkLFxuICAgICAgdXNlcklkOiBpbnB1dC51c2VySWQsXG4gICAgICBhdHRyaWJ1dGVzOiBpbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgZGV0YWlsOiBpbnB1dC5kZXRhaWwsXG4gICAgICB0cmFjZUlkOiBpbnB1dC50cmFjZUlkLFxuICAgICAgc3BhbklkOiBpbnB1dC5zcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IGlucHV0LnBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IGlucHV0LnNhbXBsZWQsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmNhcHR1cmVQYXlsb2FkID09PSBcInByZXZpZXdcIiAmJiBpbnB1dC5wYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlY29yZCA9IHtcbiAgICAgICAgLi4ucmVjb3JkLFxuICAgICAgICBwYXlsb2FkUHJldmlldzogdHJ1bmNhdGVQYXlsb2FkUHJldmlldyhpbnB1dC5wYXlsb2FkLCB0aGlzLm1heFBheWxvYWRQcmV2aWV3Qnl0ZXMpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3VsZEJ5cGFzc1JhdGVMaW1pdChfcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCk6IGJvb2xlYW4ge1xuICAgIC8vIGFsd2F5c1JlY29yZExldmVsc+yXkCDtlbTri7ntlZjripQgcmVjb3Jk64qUIHNhbXBsaW5n7J2EIOqxsOy5mOyngCDslYrqs6Ag65Ok7Ja07JmU7Jy866mwLFxuICAgIC8vIOq4sOyhtCBjb250cm9sbGVyIOuPmeyekeydhCDrs7TsobTtlZjquLAg7JyE7ZW0IHRva2VuIGJ1Y2tldOuPhCBza2lw7ZWc64ukLlxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRFbWl0QWx3YXlzUmVjb3JkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzQ3JpdGljYWxSZWNvcmQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWNvcmQubGV2ZWwgPT09IFwid2FyblwiIHx8IHJlY29yZC5sZXZlbCA9PT0gXCJlcnJvclwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNpZ25hbFJlZGFjdG9yKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUmVkYWN0b3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsQmVmb3JlUmVjb3JkO1xuICB9XG59XG5cbi8vIC0tIE1ldHJpY1BpcGVsaW5lIC0tXG5cbmNsYXNzIE1ldHJpY1BpcGVsaW5lIGV4dGVuZHMgVGVsZW1ldHJ5UGlwZWxpbmU8XG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCxcbiAgV2ViU29ja2V0TWV0cmljSW5wdXQsXG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NpbmssXG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmVhZG9ubHkgc2lnbmFsID0gXCJtZXRyaWNcIiBhcyBjb25zdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljQmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWV0cmljU291cmNlczogU2V0PFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZT4gPSBuZXcgU2V0KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb2xsZWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNhbXBsZUludGVydmFsTXM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGNvbGxlY3Rpb25JbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBzbmFwc2hvdFByb3ZpZGVyOiAoKCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90KSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXNvbHZlZE1ldHJpY1BpcGVsaW5lT3B0aW9ucywgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEpIHtcbiAgICBzdXBlcihcbiAgICAgIG9wdGlvbnMuc2lua3MsXG4gICAgICBvcHRpb25zLnN0b3JlLFxuICAgICAgb3B0aW9ucy5tYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgICAgb3B0aW9ucy5tYXhJbkZsaWdodEVtaXRzLFxuICAgICAgb3B0aW9ucy5zaGFyZWRSZWRhY3RvcixcbiAgICAgIG9wdGlvbnMuc2hhcmVkQmVmb3JlUmVjb3JkLFxuICAgICAgcnVudGltZU1ldGFkYXRhLFxuICAgICk7XG4gICAgdGhpcy5zaWduYWxSZWRhY3RvciA9IG9wdGlvbnMuc2lnbmFsUmVkYWN0b3I7XG4gICAgdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQgPSBvcHRpb25zLnNpZ25hbEJlZm9yZVJlY29yZDtcbiAgICB0aGlzLmNvbGxlY3Rpb25FbmFibGVkID0gb3B0aW9ucy5jb2xsZWN0aW9uRW5hYmxlZDtcbiAgICB0aGlzLnNhbXBsZUludGVydmFsTXMgPSBvcHRpb25zLnNhbXBsZUludGVydmFsTXM7XG5cbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uRW5hYmxlZCAmJiB0aGlzLnNhbXBsZUludGVydmFsTXMgPiAwKSB7XG4gICAgICB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb2xsZWN0QW5kRW1pdCgpO1xuICAgICAgfSwgdGhpcy5zYW1wbGVJbnRlcnZhbE1zKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbCAmJlxuICAgICAgICBpc09iamVjdFZhbHVlKHRoaXMuY29sbGVjdGlvbkludGVydmFsKSAmJlxuICAgICAgICBcInVucmVmXCIgaW4gdGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWxcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbC51bnJlZigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVtaXQoaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZW1pdEludGVybmFsKGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHBpcGVsaW5lIGVtaXQgdGhyb3ctZnJlZSDsoJXssYVcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRSZWNvcmQoaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0KTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJtZXRyaWNcIixcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1vbm90b25pY1RpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgcnVudGltZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQsXG4gICAgICBub2RlSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLm5vZGVJZCxcbiAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICBraW5kOiBpbnB1dC5raW5kLFxuICAgICAgdmFsdWU6IGlucHV0LnZhbHVlLFxuICAgICAgdW5pdDogaW5wdXQudW5pdCxcbiAgICAgIHRhZ3M6IGlucHV0LnRhZ3MsXG4gICAgICBuYW1lc3BhY2U6IGlucHV0Lm5hbWVzcGFjZSxcbiAgICAgIGNvbm5lY3Rpb25JZDogaW5wdXQuY29ubmVjdGlvbklkLFxuICAgICAgdXNlcklkOiBpbnB1dC51c2VySWQsXG4gICAgICB0cmFjZUlkOiBpbnB1dC50cmFjZUlkLFxuICAgICAgc3BhbklkOiBpbnB1dC5zcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IGlucHV0LnBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IGlucHV0LnNhbXBsZWQsXG4gICAgICBzbmFwc2hvdDogaW5wdXQuc25hcHNob3QsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG91bGRCeXBhc3NSYXRlTGltaXQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQpOiBib29sZWFuIHtcbiAgICBjb25zdCBvdXRjb21lID0gcmVjb3JkLnRhZ3M/Lm91dGNvbWU7XG4gICAgaWYgKG91dGNvbWUgPT09IFwiZmFpbGVkXCIgfHwgb3V0Y29tZSA9PT0gXCJyZWplY3RlZFwiIHx8IG91dGNvbWUgPT09IFwiZHJvcHBlZFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgcmVjb3JkLm5hbWUuZW5kc1dpdGgoXCIuZmFpbHVyZXNcIikgfHxcbiAgICAgIHJlY29yZC5uYW1lLmVuZHNXaXRoKFwiLmZhaWx1cmVcIikgfHxcbiAgICAgIHJlY29yZC5uYW1lLmVuZHNXaXRoKFwiLmRyb3BwZWRcIikgfHxcbiAgICAgIHJlY29yZC5uYW1lLmluY2x1ZGVzKFwiLmZhaWx1cmVzLlwiKSB8fFxuICAgICAgcmVjb3JkLm5hbWUuaW5jbHVkZXMoXCIuZHJvcHBlZC5cIilcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzQ3JpdGljYWxSZWNvcmQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG91bGRCeXBhc3NSYXRlTGltaXQocmVjb3JkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTaWduYWxSZWRhY3RvcigpOlxuICAgIHwgKChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUmVkYWN0b3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQgfCBudWxsKVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQ7XG4gIH1cblxuICByZWdpc3Rlck1ldHJpY1NvdXJjZShzb3VyY2U6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZSk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubWV0cmljU291cmNlcy5hZGQoc291cmNlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5tZXRyaWNTb3VyY2VzLmRlbGV0ZShzb3VyY2UpO1xuICAgIH07XG4gIH1cblxuICBzZXRTbmFwc2hvdFByb3ZpZGVyKHByb3ZpZGVyOiAoKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QpOiB2b2lkIHtcbiAgICB0aGlzLnNuYXBzaG90UHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgfVxuXG4gIGdldFNuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBiYXNlOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QgPSB7XG4gICAgICAuLi5FTVBUWV9NRVRSSUNTX1NOQVBTSE9ULFxuICAgICAgdGltZXN0YW1wOiBub3csXG4gICAgICBhY3RpdmVDb25uZWN0aW9uc0J5TmFtZXNwYWNlOiB7fSxcbiAgICAgIHRlbGVtZXRyeURyb3BwZWRSZWNvcmRzOiB0aGlzLmRyb3BwZWRDb3VudCxcbiAgICAgIHRlbGVtZXRyeVNpbmtGYWlsdXJlczogdGhpcy5zaW5rRmFpbHVyZUNvdW50LFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiB0aGlzLm1ldHJpY1NvdXJjZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnRpYWwgPSBzb3VyY2UuY29sbGVjdChub3cpO1xuICAgICAgICBiYXNlLmFjdGl2ZUNvbm5lY3Rpb25zICs9IHBhcnRpYWwuYWN0aXZlQ29ubmVjdGlvbnMgPz8gMDtcbiAgICAgICAgYmFzZS5yb29tQ291bnQgKz0gcGFydGlhbC5yb29tQ291bnQgPz8gMDtcbiAgICAgICAgYmFzZS5wZW5kaW5nSW5ib3VuZE1lc3NhZ2VzICs9IHBhcnRpYWwucGVuZGluZ0luYm91bmRNZXNzYWdlcyA/PyAwO1xuICAgICAgICBiYXNlLnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzICs9IHBhcnRpYWwucGVuZGluZ091dGJvdW5kTWVzc2FnZXMgPz8gMDtcbiAgICAgICAgYmFzZS5zb2NrZXRCdWZmZXJlZEJ5dGVzICs9IHBhcnRpYWwuc29ja2V0QnVmZmVyZWRCeXRlcyA/PyAwO1xuICAgICAgICBiYXNlLnBlbmRpbmdGYW5PdXRKb2JzICs9IHBhcnRpYWwucGVuZGluZ0Zhbk91dEpvYnMgPz8gMDtcbiAgICAgICAgYmFzZS5wZW5kaW5nRmFuT3V0VGFyZ2V0cyArPSBwYXJ0aWFsLnBlbmRpbmdGYW5PdXRUYXJnZXRzID8/IDA7XG4gICAgICAgIGlmIChwYXJ0aWFsLmFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2UpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtucywgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnRpYWwuYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgIGJhc2UuYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZVtuc10gPVxuICAgICAgICAgICAgICAoYmFzZS5hY3RpdmVDb25uZWN0aW9uc0J5TmFtZXNwYWNlW25zXSA/PyAwKSArIGNvdW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIG1ldHJpYyBzb3VyY2Ug7Iuk7Yyo64qUIOyZuOu2gOuhnCDsoITtjIzrkJjslrTshKAg7JWIIOuQqFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgY29sbGVjdEFuZEVtaXQoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuc25hcHNob3RQcm92aWRlcj8uKCkgPz8gdGhpcy5nZXRTbmFwc2hvdCgpO1xuICAgICAgY29uc3QgaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0ID0ge1xuICAgICAgICBuYW1lOiBcIndzLmNvbm5lY3Rpb25zLmFjdGl2ZVwiLFxuICAgICAgICBraW5kOiBcImdhdWdlXCIsXG4gICAgICAgIHZhbHVlOiBzbmFwc2hvdC5hY3RpdmVDb25uZWN0aW9ucyxcbiAgICAgICAgdW5pdDogXCIxXCIsXG4gICAgICAgIHNuYXBzaG90LFxuICAgICAgfTtcbiAgICAgIHRoaXMuZW1pdChpbnB1dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBtZXRyaWNzIOyImOynkSDsi6TtjKjripQg7Jm467aA66GcIOyghO2MjOuQmOyWtOyEoCDslYgg65CoXG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc2h1dGRvd24odGltZW91dE1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwgIT09IG51bGwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCBzdXBlci5zaHV0ZG93bih0aW1lb3V0TXMpO1xuICB9XG59XG5cbi8vIC0tIFNwYW5QaXBlbGluZSAtLVxuXG5jbGFzcyBTcGFuUGlwZWxpbmUgZXh0ZW5kcyBUZWxlbWV0cnlQaXBlbGluZTxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCxcbiAgV2ViU29ja2V0U3BhbklucHV0LFxuICBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2luayxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmVhZG9ubHkgc2lnbmFsID0gXCJzcGFuXCIgYXMgY29uc3Q7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaWduYWxSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lnbmFsQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuQmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2FtcGxpbmc6IHtcbiAgICBkZWZhdWx0UmF0ZTogbnVtYmVyO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFJlc29sdmVkU3BhblBpcGVsaW5lT3B0aW9ucywgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEpIHtcbiAgICBzdXBlcihcbiAgICAgIG9wdGlvbnMuc2lua3MsXG4gICAgICBvcHRpb25zLnN0b3JlLFxuICAgICAgb3B0aW9ucy5tYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgICAgb3B0aW9ucy5tYXhJbkZsaWdodEVtaXRzLFxuICAgICAgb3B0aW9ucy5zaGFyZWRSZWRhY3RvcixcbiAgICAgIG9wdGlvbnMuc2hhcmVkQmVmb3JlUmVjb3JkLFxuICAgICAgcnVudGltZU1ldGFkYXRhLFxuICAgICk7XG4gICAgdGhpcy5zaWduYWxSZWRhY3RvciA9IG9wdGlvbnMuc2lnbmFsUmVkYWN0b3I7XG4gICAgdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQgPSBvcHRpb25zLnNpZ25hbEJlZm9yZVJlY29yZDtcbiAgICB0aGlzLnNhbXBsaW5nID0geyBkZWZhdWx0UmF0ZTogb3B0aW9ucy5zYW1wbGluZy5kZWZhdWx0UmF0ZSB9O1xuICB9XG5cbiAgZW1pdChpbnB1dDogV2ViU29ja2V0U3BhbklucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG5cbiAgICAgIC8vIHN0YXR1cyA9PT0gXCJlcnJvclwi64qUIHNhbXBsaW5nIOyasO2ajFxuICAgICAgaWYgKGlucHV0LnN0YXR1cyAhPT0gXCJlcnJvclwiKSB7XG4gICAgICAgIGNvbnN0IHJhdGUgPSB0aGlzLnNhbXBsaW5nLmRlZmF1bHRSYXRlO1xuICAgICAgICBpZiAocmF0ZSA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhdGUgPCAxICYmIE1hdGgucmFuZG9tKCkgPj0gcmF0ZSkge1xuICAgICAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW1pdEludGVybmFsKGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHBpcGVsaW5lIGVtaXQgdGhyb3ctZnJlZSDsoJXssYVcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRSZWNvcmQoaW5wdXQ6IFdlYlNvY2tldFNwYW5JbnB1dCk6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInNwYW5cIixcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1vbm90b25pY1RpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgcnVudGltZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQsXG4gICAgICBub2RlSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLm5vZGVJZCxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IGlucHV0Lm9wZXJhdGlvbk5hbWUsXG4gICAgICBraW5kOiBpbnB1dC5raW5kLFxuICAgICAgZHVyYXRpb25NczogaW5wdXQuZHVyYXRpb25NcyxcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzLFxuICAgICAgbmFtZXNwYWNlOiBpbnB1dC5uYW1lc3BhY2UsXG4gICAgICBjb25uZWN0aW9uSWQ6IGlucHV0LmNvbm5lY3Rpb25JZCxcbiAgICAgIHVzZXJJZDogaW5wdXQudXNlcklkLFxuICAgICAgYXR0cmlidXRlczogaW5wdXQuYXR0cmlidXRlcyxcbiAgICAgIGVycm9yVHlwZTogaW5wdXQuZXJyb3JUeXBlLFxuICAgICAgdHJhY2VJZDogaW5wdXQudHJhY2VJZCxcbiAgICAgIHNwYW5JZDogaW5wdXQuc3BhbklkLFxuICAgICAgcGFyZW50U3BhbklkOiBpbnB1dC5wYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiBpbnB1dC5zYW1wbGVkLFxuICAgICAgZXZlbnRzOiBpbnB1dC5ldmVudHMsXG4gICAgICBsaW5rczogaW5wdXQubGlua3MsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG91bGRCeXBhc3NSYXRlTGltaXQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlY29yZC5zdGF0dXMgPT09IFwiZXJyb3JcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0NyaXRpY2FsUmVjb3JkKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWNvcmQuc3RhdHVzID09PSBcImVycm9yXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsUmVkYWN0b3IoKTpcbiAgICB8ICgocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUmVkYWN0b3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCB8IG51bGwpXG4gICAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbEJlZm9yZVJlY29yZDtcbiAgfVxufVxuXG4vLyAtLSBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVySW1wbCAtLVxuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlckltcGwgaW1wbGVtZW50cyBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV2ZW50czogRXZlbnRQaXBlbGluZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1ldHJpY3M6IE1ldHJpY1BpcGVsaW5lO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3BhbnM6IFNwYW5QaXBlbGluZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJ1bnRpbWVJZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbm9kZUlkOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFjZU9wdGlvbnM6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNodXRkb3duVGltZW91dE1zOiBudW1iZXI7XG4gIHByb3RlY3RlZCBzaHV0ZG93bkNhbGxlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGV2ZW50czogRXZlbnRQaXBlbGluZSxcbiAgICBtZXRyaWNzOiBNZXRyaWNQaXBlbGluZSxcbiAgICBzcGFuczogU3BhblBpcGVsaW5lLFxuICAgIHRyYWNlT3B0aW9uczogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zLFxuICAgIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhLFxuICAgIHNodXRkb3duVGltZW91dE1zOiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMuZXZlbnRzID0gZXZlbnRzO1xuICAgIHRoaXMubWV0cmljcyA9IG1ldHJpY3M7XG4gICAgdGhpcy5zcGFucyA9IHNwYW5zO1xuICAgIHRoaXMudHJhY2VPcHRpb25zID0gdHJhY2VPcHRpb25zO1xuICAgIHRoaXMucnVudGltZUlkID0gcnVudGltZU1ldGFkYXRhLnJ1bnRpbWVJZDtcbiAgICB0aGlzLm5vZGVJZCA9IHJ1bnRpbWVNZXRhZGF0YS5ub2RlSWQ7XG4gICAgdGhpcy5zaHV0ZG93blRpbWVvdXRNcyA9IHNodXRkb3duVGltZW91dE1zO1xuXG4gICAgLy8g66qo65OgIHBpcGVsaW5lIOynhOuLqCDsnbTrsqTtirjripQgZXZlbnRzIHBpcGVsaW5lIOqyveuhnOuhnCDrnbzsmrDtjIXtlZzri6QuXG4gICAgY29uc3QgcmVwb3J0ZXI6IEludGVybmFsRXZlbnRSZXBvcnRlciA9IChuYW1lLCBsZXZlbCwgZGV0YWlsKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50cy5kaXNwYXRjaEludGVybmFsRGlhZ25vc3RpY0V2ZW50KG5hbWUsIGxldmVsLCBkZXRhaWwpO1xuICAgIH07XG4gICAgdGhpcy5ldmVudHMuc2V0SW50ZXJuYWxFdmVudFJlcG9ydGVyKHJlcG9ydGVyKTtcbiAgICB0aGlzLm1ldHJpY3Muc2V0SW50ZXJuYWxFdmVudFJlcG9ydGVyKHJlcG9ydGVyKTtcbiAgICB0aGlzLnNwYW5zLnNldEludGVybmFsRXZlbnRSZXBvcnRlcihyZXBvcnRlcik7XG4gICAgdGhpcy5tZXRyaWNzLnNldFNuYXBzaG90UHJvdmlkZXIoKCkgPT4gdGhpcy5nZXRNZXRyaWNzU25hcHNob3QoKSk7XG4gIH1cblxuICBlbWl0KGlucHV0OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxuXG4gIHJlY29yZE1ldHJpYyhpbnB1dDogV2ViU29ja2V0TWV0cmljSW5wdXQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcbiAgICAgIHRoaXMubWV0cmljcy5lbWl0KGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxuXG4gIHJlY29yZFNwYW4oaW5wdXQ6IFdlYlNvY2tldFNwYW5JbnB1dCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5zcGFucy5lbWl0KGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxuXG4gIGdldE1ldHJpY3NTbmFwc2hvdCgpOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Qge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5tZXRyaWNzLmdldFNuYXBzaG90KCk7XG4gICAgICBiYXNlLnRlbGVtZXRyeURyb3BwZWRSZWNvcmRzID1cbiAgICAgICAgdGhpcy5ldmVudHMuZHJvcHBlZENvdW50ICsgdGhpcy5tZXRyaWNzLmRyb3BwZWRDb3VudCArIHRoaXMuc3BhbnMuZHJvcHBlZENvdW50O1xuICAgICAgYmFzZS50ZWxlbWV0cnlTaW5rRmFpbHVyZXMgPVxuICAgICAgICB0aGlzLmV2ZW50cy5zaW5rRmFpbHVyZUNvdW50ICsgdGhpcy5tZXRyaWNzLnNpbmtGYWlsdXJlQ291bnQgKyB0aGlzLnNwYW5zLnNpbmtGYWlsdXJlQ291bnQ7XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IC4uLkVNUFRZX01FVFJJQ1NfU05BUFNIT1QsIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9O1xuICAgIH1cbiAgfVxuXG4gIGdldEV2ZW50U3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5zdG9yZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0TWV0cmljU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU3RvcmUgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRyaWNzLnN0b3JlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBnZXRTcGFuU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuc3BhbnMuc3RvcmU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyTWV0cmljU291cmNlKHNvdXJjZTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU291cmNlKTogKCkgPT4gdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLm1ldHJpY3MucmVnaXN0ZXJNZXRyaWNTb3VyY2Uoc291cmNlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBub29wVW5zdWJzY3JpYmU7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQocmVxdWVzdD86IHtcbiAgICBoZWFkZXJzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+PjtcbiAgfSk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMudHJhY2VPcHRpb25zLmV4dHJhY3RUcmFjZVBhcmVudCAmJiByZXF1ZXN0Py5oZWFkZXJzKSB7XG4gICAgICAgIGNvbnN0IHRyYWNlcGFyZW50SGVhZGVyID0gcmVxdWVzdC5oZWFkZXJzW1widHJhY2VwYXJlbnRcIl07XG4gICAgICAgIGNvbnN0IHRyYWNlcGFyZW50VmFsdWUgPSBBcnJheS5pc0FycmF5KHRyYWNlcGFyZW50SGVhZGVyKVxuICAgICAgICAgID8gdHJhY2VwYXJlbnRIZWFkZXJbMF1cbiAgICAgICAgICA6IHRyYWNlcGFyZW50SGVhZGVyO1xuICAgICAgICBpZiAodHJhY2VwYXJlbnRWYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlVHJhY2VQYXJlbnQodHJhY2VwYXJlbnRWYWx1ZSk7XG4gICAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dDogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQgPSB7XG4gICAgICAgICAgICAgIHRyYWNlSWQ6IHBhcnNlZC50cmFjZUlkLFxuICAgICAgICAgICAgICBwYXJlbnRTcGFuSWQ6IHBhcnNlZC5wYXJlbnRJZCxcbiAgICAgICAgICAgICAgc2FtcGxlZDogcGFyc2VkLnNhbXBsZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhY2VPcHRpb25zLmdlbmVyYXRlQ29ubmVjdGlvblRyYWNlKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQuc3BhbklkID0gZ2VuZXJhdGVTcGFuSWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IC4uLmNvbnRleHQgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnRyYWNlT3B0aW9ucy5nZW5lcmF0ZUNvbm5lY3Rpb25UcmFjZSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IHRyYWNlSWQ6IGdlbmVyYXRlVHJhY2VJZCgpLCBzcGFuSWQ6IGdlbmVyYXRlU3BhbklkKCkgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1cblxuICBnZXRUcmFjZU9wdGlvbnMoKTogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zIHtcbiAgICByZXR1cm4geyAuLi50aGlzLnRyYWNlT3B0aW9ucyB9O1xuICB9XG5cbiAgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuICAgIHRoaXMuc2h1dGRvd25DYWxsZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucz8udGltZW91dE1zID8/IHRoaXMuc2h1dGRvd25UaW1lb3V0TXM7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIHRoaXMuZXZlbnRzLnNodXRkb3duKHRpbWVvdXRNcyksXG4gICAgICAgIHRoaXMubWV0cmljcy5zaHV0ZG93bih0aW1lb3V0TXMpLFxuICAgICAgICB0aGlzLnNwYW5zLnNodXRkb3duKHRpbWVvdXRNcyksXG4gICAgICBdKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgc2h1dGRvd27snYAgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxufVxuXG4vLyAtLSBGYWN0b3J5IC0tXG5cbmZ1bmN0aW9uIGJ1aWxkQ29udHJvbGxlcihcbiAgb3B0aW9uczogV2ViU29ja2V0VGVsZW1ldHJ5T3B0aW9ucyxcbiAgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEsXG4pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgY29uc3QgZGVmYXVsdHMgPSBvcHRpb25zLmRlZmF1bHRzID8/IHt9O1xuICBjb25zdCBldmVudHNPcHQgPSBvcHRpb25zLmV2ZW50cyA/PyB7fTtcbiAgY29uc3QgbWV0cmljc09wdCA9IG9wdGlvbnMubWV0cmljcyA/PyB7fTtcbiAgY29uc3Qgc3BhbnNPcHQgPSBvcHRpb25zLnNwYW5zID8/IHt9O1xuXG4gIGNvbnN0IGRlZmF1bHRzTWF4UmVjb3Jkc1BlclNlY29uZCA9XG4gICAgZGVmYXVsdHMubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBERUZBVUxUX01BWF9SRUNPUkRTX1BFUl9TRUNPTkQ7XG5cbiAgLy8g7Iug7Zi467OEIHJlZGFjdG9yIC8gYmVmb3JlUmVjb3JkIO2VtOyEnS5cbiAgLy8gbnVsbOydtOuptCBzaGFyZWRSZWRhY3RvcuulvCB1bmRlZmluZWTroZwg642u7Ja07I2oIHN0ZXAgMiDsnpDssrTrpbwgc2tpcO2VnOuLpC5cbiAgY29uc3QgZXZlbnRzU2hhcmVkUmVkYWN0b3IgPSBldmVudHNPcHQucmVkYWN0b3IgPT09IG51bGwgPyB1bmRlZmluZWQgOiBkZWZhdWx0cy5yZWRhY3RvcjtcbiAgY29uc3QgZXZlbnRzU2lnbmFsUmVkYWN0b3IgPSBpc0Z1bmN0aW9uVmFsdWUoZXZlbnRzT3B0LnJlZGFjdG9yKSA/IGV2ZW50c09wdC5yZWRhY3RvciA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZXZlbnRzU2hhcmVkQmVmb3JlUmVjb3JkID1cbiAgICBldmVudHNPcHQuYmVmb3JlUmVjb3JkID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMuYmVmb3JlUmVjb3JkO1xuICBjb25zdCBldmVudHNTaWduYWxCZWZvcmVSZWNvcmQgPSBpc0Z1bmN0aW9uVmFsdWUoZXZlbnRzT3B0LmJlZm9yZVJlY29yZClcbiAgICA/IGV2ZW50c09wdC5iZWZvcmVSZWNvcmRcbiAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtZXRyaWNzU2hhcmVkUmVkYWN0b3IgPSBtZXRyaWNzT3B0LnJlZGFjdG9yID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMucmVkYWN0b3I7XG4gIGNvbnN0IG1ldHJpY3NTaWduYWxSZWRhY3RvciA9IGlzRnVuY3Rpb25WYWx1ZShtZXRyaWNzT3B0LnJlZGFjdG9yKVxuICAgID8gbWV0cmljc09wdC5yZWRhY3RvclxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBtZXRyaWNzU2hhcmVkQmVmb3JlUmVjb3JkID1cbiAgICBtZXRyaWNzT3B0LmJlZm9yZVJlY29yZCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGRlZmF1bHRzLmJlZm9yZVJlY29yZDtcbiAgY29uc3QgbWV0cmljc1NpZ25hbEJlZm9yZVJlY29yZCA9IGlzRnVuY3Rpb25WYWx1ZShtZXRyaWNzT3B0LmJlZm9yZVJlY29yZClcbiAgICA/IG1ldHJpY3NPcHQuYmVmb3JlUmVjb3JkXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3BhbnNTaGFyZWRSZWRhY3RvciA9IHNwYW5zT3B0LnJlZGFjdG9yID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMucmVkYWN0b3I7XG4gIGNvbnN0IHNwYW5zU2lnbmFsUmVkYWN0b3IgPSBpc0Z1bmN0aW9uVmFsdWUoc3BhbnNPcHQucmVkYWN0b3IpID8gc3BhbnNPcHQucmVkYWN0b3IgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNwYW5zU2hhcmVkQmVmb3JlUmVjb3JkID1cbiAgICBzcGFuc09wdC5iZWZvcmVSZWNvcmQgPT09IG51bGwgPyB1bmRlZmluZWQgOiBkZWZhdWx0cy5iZWZvcmVSZWNvcmQ7XG4gIGNvbnN0IHNwYW5zU2lnbmFsQmVmb3JlUmVjb3JkID0gaXNGdW5jdGlvblZhbHVlKHNwYW5zT3B0LmJlZm9yZVJlY29yZClcbiAgICA/IHNwYW5zT3B0LmJlZm9yZVJlY29yZFxuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIGV2ZW50c1xuICBjb25zdCBldmVudFNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNpbmtbXSA9IGV2ZW50c09wdC5zaW5rcyA/IFsuLi5ldmVudHNPcHQuc2lua3NdIDogW107XG4gIGxldCBldmVudFN0b3JlOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHwgdW5kZWZpbmVkID0gZXZlbnRzT3B0LnN0b3JlO1xuICBpZiAoZXZlbnRTaW5rcy5sZW5ndGggPT09IDAgJiYgZXZlbnRTdG9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRTdG9yZSA9IG5ldyBJbk1lbW9yeUV2ZW50U3RvcmUoe1xuICAgICAgbWF4UmVjb3JkczogZXZlbnRzT3B0Lm1heFJlY29yZHMgPz8gZGVmYXVsdHMubWF4UmVjb3JkcyxcbiAgICAgIG1heEJ5dGVzOiBldmVudHNPcHQubWF4Qnl0ZXMgPz8gZGVmYXVsdHMubWF4Qnl0ZXMsXG4gICAgfSk7XG4gICAgZXZlbnRTaW5rcy5wdXNoKGV2ZW50U3RvcmUuc2luayk7XG4gIH0gZWxzZSBpZiAoZXZlbnRTdG9yZSAhPT0gdW5kZWZpbmVkICYmICFldmVudFNpbmtzLmluY2x1ZGVzKGV2ZW50U3RvcmUuc2luaykpIHtcbiAgICBldmVudFNpbmtzLnB1c2goZXZlbnRTdG9yZS5zaW5rKTtcbiAgfVxuXG4gIGNvbnN0IGV2ZW50c1Jlc29sdmVkOiBSZXNvbHZlZEV2ZW50UGlwZWxpbmVPcHRpb25zID0ge1xuICAgIHNpbmtzOiBldmVudFNpbmtzLFxuICAgIHN0b3JlOiBldmVudFN0b3JlLFxuICAgIG1heFJlY29yZHNQZXJTZWNvbmQ6IGV2ZW50c09wdC5zYW1wbGluZz8ubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBkZWZhdWx0c01heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogZXZlbnRzT3B0Lm1heEluRmxpZ2h0RW1pdHMgPz8gREVGQVVMVF9NQVhfSU5fRkxJR0hUX0VNSVRTX1BFUl9TSU5LLFxuICAgIHNoYXJlZFJlZGFjdG9yOiBldmVudHNTaGFyZWRSZWRhY3RvcixcbiAgICBzaWduYWxSZWRhY3RvcjogZXZlbnRzU2lnbmFsUmVkYWN0b3IsXG4gICAgc2hhcmVkQmVmb3JlUmVjb3JkOiBldmVudHNTaGFyZWRCZWZvcmVSZWNvcmQsXG4gICAgc2lnbmFsQmVmb3JlUmVjb3JkOiBldmVudHNTaWduYWxCZWZvcmVSZWNvcmQsXG4gICAgc2FtcGxpbmc6IHtcbiAgICAgIGRlZmF1bHRSYXRlOiBldmVudHNPcHQuc2FtcGxpbmc/LmRlZmF1bHRSYXRlID8/IERFRkFVTFRfRVZFTlRfU0FNUExJTkdfREVGQVVMVF9SQVRFLFxuICAgICAgcmF0ZUJ5RXZlbnQ6IGV2ZW50c09wdC5zYW1wbGluZz8ucmF0ZUJ5RXZlbnQgPz8ge30sXG4gICAgICBhbHdheXNSZWNvcmRMZXZlbHM6IGV2ZW50c09wdC5zYW1wbGluZz8uYWx3YXlzUmVjb3JkTGV2ZWxzID8/IFtcbiAgICAgICAgLi4uREVGQVVMVF9FVkVOVF9BTFdBWVNfUkVDT1JEX0xFVkVMUyxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBjYXB0dXJlUGF5bG9hZDogZXZlbnRzT3B0LmNhcHR1cmVQYXlsb2FkID8/IERFRkFVTFRfRVZFTlRfQ0FQVFVSRV9QQVlMT0FELFxuICAgIG1heFBheWxvYWRQcmV2aWV3Qnl0ZXM6XG4gICAgICBldmVudHNPcHQubWF4UGF5bG9hZFByZXZpZXdCeXRlcyA/PyBERUZBVUxUX0VWRU5UX01BWF9QQVlMT0FEX1BSRVZJRVdfQllURVMsXG4gIH07XG5cbiAgLy8gbWV0cmljc1xuICBjb25zdCBtZXRyaWNTaW5rczogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2lua1tdID0gbWV0cmljc09wdC5zaW5rcyA/IFsuLi5tZXRyaWNzT3B0LnNpbmtzXSA6IFtdO1xuICBsZXQgbWV0cmljU3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkID0gbWV0cmljc09wdC5zdG9yZTtcbiAgaWYgKG1ldHJpY1NpbmtzLmxlbmd0aCA9PT0gMCAmJiBtZXRyaWNTdG9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbWV0cmljU3RvcmUgPSBuZXcgSW5NZW1vcnlNZXRyaWNTdG9yZSh7XG4gICAgICBtYXhSZWNvcmRzOiBtZXRyaWNzT3B0Lm1heFJlY29yZHMgPz8gZGVmYXVsdHMubWF4UmVjb3JkcyxcbiAgICAgIG1heEJ5dGVzOiBtZXRyaWNzT3B0Lm1heEJ5dGVzID8/IGRlZmF1bHRzLm1heEJ5dGVzLFxuICAgIH0pO1xuICAgIG1ldHJpY1NpbmtzLnB1c2gobWV0cmljU3RvcmUuc2luayk7XG4gIH0gZWxzZSBpZiAobWV0cmljU3RvcmUgIT09IHVuZGVmaW5lZCAmJiAhbWV0cmljU2lua3MuaW5jbHVkZXMobWV0cmljU3RvcmUuc2luaykpIHtcbiAgICBtZXRyaWNTaW5rcy5wdXNoKG1ldHJpY1N0b3JlLnNpbmspO1xuICB9XG5cbiAgY29uc3QgbWV0cmljc1Jlc29sdmVkOiBSZXNvbHZlZE1ldHJpY1BpcGVsaW5lT3B0aW9ucyA9IHtcbiAgICBzaW5rczogbWV0cmljU2lua3MsXG4gICAgc3RvcmU6IG1ldHJpY1N0b3JlLFxuICAgIG1heFJlY29yZHNQZXJTZWNvbmQ6IG1ldHJpY3NPcHQuc2FtcGxpbmc/Lm1heFJlY29yZHNQZXJTZWNvbmQgPz8gZGVmYXVsdHNNYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgIG1heEluRmxpZ2h0RW1pdHM6IG1ldHJpY3NPcHQubWF4SW5GbGlnaHRFbWl0cyA/PyBERUZBVUxUX01BWF9JTl9GTElHSFRfRU1JVFNfUEVSX1NJTkssXG4gICAgc2hhcmVkUmVkYWN0b3I6IG1ldHJpY3NTaGFyZWRSZWRhY3RvcixcbiAgICBzaWduYWxSZWRhY3RvcjogbWV0cmljc1NpZ25hbFJlZGFjdG9yLFxuICAgIHNoYXJlZEJlZm9yZVJlY29yZDogbWV0cmljc1NoYXJlZEJlZm9yZVJlY29yZCxcbiAgICBzaWduYWxCZWZvcmVSZWNvcmQ6IG1ldHJpY3NTaWduYWxCZWZvcmVSZWNvcmQsXG4gICAgY29sbGVjdGlvbkVuYWJsZWQ6IG1ldHJpY3NPcHQuY29sbGVjdGlvbkVuYWJsZWQgPz8gREVGQVVMVF9NRVRSSUNfQ09MTEVDVElPTl9FTkFCTEVELFxuICAgIHNhbXBsZUludGVydmFsTXM6IG1ldHJpY3NPcHQuc2FtcGxlSW50ZXJ2YWxNcyA/PyBERUZBVUxUX01FVFJJQ19TQU1QTEVfSU5URVJWQUxfTVMsXG4gIH07XG5cbiAgLy8gc3BhbnNcbiAgY29uc3Qgc3BhblNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2lua1tdID0gc3BhbnNPcHQuc2lua3MgPyBbLi4uc3BhbnNPcHQuc2lua3NdIDogW107XG4gIGxldCBzcGFuU3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB8IHVuZGVmaW5lZCA9IHNwYW5zT3B0LnN0b3JlO1xuICBpZiAoc3BhblNpbmtzLmxlbmd0aCA9PT0gMCAmJiBzcGFuU3RvcmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHNwYW5TdG9yZSA9IG5ldyBJbk1lbW9yeVNwYW5TdG9yZSh7XG4gICAgICBtYXhSZWNvcmRzOiBzcGFuc09wdC5tYXhSZWNvcmRzID8/IGRlZmF1bHRzLm1heFJlY29yZHMsXG4gICAgICBtYXhCeXRlczogc3BhbnNPcHQubWF4Qnl0ZXMgPz8gZGVmYXVsdHMubWF4Qnl0ZXMsXG4gICAgfSk7XG4gICAgc3BhblNpbmtzLnB1c2goc3BhblN0b3JlLnNpbmspO1xuICB9IGVsc2UgaWYgKHNwYW5TdG9yZSAhPT0gdW5kZWZpbmVkICYmICFzcGFuU2lua3MuaW5jbHVkZXMoc3BhblN0b3JlLnNpbmspKSB7XG4gICAgc3BhblNpbmtzLnB1c2goc3BhblN0b3JlLnNpbmspO1xuICB9XG5cbiAgY29uc3Qgc3BhbnNSZXNvbHZlZDogUmVzb2x2ZWRTcGFuUGlwZWxpbmVPcHRpb25zID0ge1xuICAgIHNpbmtzOiBzcGFuU2lua3MsXG4gICAgc3RvcmU6IHNwYW5TdG9yZSxcbiAgICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBzcGFuc09wdC5zYW1wbGluZz8ubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBkZWZhdWx0c01heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogc3BhbnNPcHQubWF4SW5GbGlnaHRFbWl0cyA/PyBERUZBVUxUX01BWF9JTl9GTElHSFRfRU1JVFNfUEVSX1NJTkssXG4gICAgc2hhcmVkUmVkYWN0b3I6IHNwYW5zU2hhcmVkUmVkYWN0b3IsXG4gICAgc2lnbmFsUmVkYWN0b3I6IHNwYW5zU2lnbmFsUmVkYWN0b3IsXG4gICAgc2hhcmVkQmVmb3JlUmVjb3JkOiBzcGFuc1NoYXJlZEJlZm9yZVJlY29yZCxcbiAgICBzaWduYWxCZWZvcmVSZWNvcmQ6IHNwYW5zU2lnbmFsQmVmb3JlUmVjb3JkLFxuICAgIHNhbXBsaW5nOiB7XG4gICAgICBkZWZhdWx0UmF0ZTogc3BhbnNPcHQuc2FtcGxpbmc/LmRlZmF1bHRSYXRlID8/IERFRkFVTFRfU1BBTl9TQU1QTElOR19ERUZBVUxUX1JBVEUsXG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBldmVudFBpcGVsaW5lID0gbmV3IEV2ZW50UGlwZWxpbmUoZXZlbnRzUmVzb2x2ZWQsIHJ1bnRpbWVNZXRhZGF0YSk7XG4gIGNvbnN0IG1ldHJpY1BpcGVsaW5lID0gbmV3IE1ldHJpY1BpcGVsaW5lKG1ldHJpY3NSZXNvbHZlZCwgcnVudGltZU1ldGFkYXRhKTtcbiAgY29uc3Qgc3BhblBpcGVsaW5lID0gbmV3IFNwYW5QaXBlbGluZShzcGFuc1Jlc29sdmVkLCBydW50aW1lTWV0YWRhdGEpO1xuXG4gIGNvbnN0IHRyYWNlT3B0aW9uczogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zID0ge1xuICAgIGV4dHJhY3RUcmFjZVBhcmVudDpcbiAgICAgIG9wdGlvbnMudHJhY2U/LmV4dHJhY3RUcmFjZVBhcmVudCA/PyBERUZBVUxUX1RSQUNFX09QVElPTlMuZXh0cmFjdFRyYWNlUGFyZW50LFxuICAgIGdlbmVyYXRlQ29ubmVjdGlvblRyYWNlOlxuICAgICAgb3B0aW9ucy50cmFjZT8uZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2UgPz8gREVGQVVMVF9UUkFDRV9PUFRJT05TLmdlbmVyYXRlQ29ubmVjdGlvblRyYWNlLFxuICAgIHByb3BhZ2F0ZU1lc3NhZ2VUcmFjZTpcbiAgICAgIG9wdGlvbnMudHJhY2U/LnByb3BhZ2F0ZU1lc3NhZ2VUcmFjZSA/PyBERUZBVUxUX1RSQUNFX09QVElPTlMucHJvcGFnYXRlTWVzc2FnZVRyYWNlLFxuICAgIHJlY29yZENvbm5lY3Rpb25MaWZldGltZVNwYW46XG4gICAgICBvcHRpb25zLnRyYWNlPy5yZWNvcmRDb25uZWN0aW9uTGlmZXRpbWVTcGFuID8/XG4gICAgICBERUZBVUxUX1RSQUNFX09QVElPTlMucmVjb3JkQ29ubmVjdGlvbkxpZmV0aW1lU3BhbixcbiAgfTtcblxuICBjb25zdCBzaHV0ZG93blRpbWVvdXRNcyA9IG9wdGlvbnMuc2h1dGRvd25UaW1lb3V0TXMgPz8gREVGQVVMVF9TSFVURE9XTl9USU1FT1VUX01TO1xuXG4gIHJldHVybiBuZXcgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlckltcGwoXG4gICAgZXZlbnRQaXBlbGluZSxcbiAgICBtZXRyaWNQaXBlbGluZSxcbiAgICBzcGFuUGlwZWxpbmUsXG4gICAgdHJhY2VPcHRpb25zLFxuICAgIHJ1bnRpbWVNZXRhZGF0YSxcbiAgICBzaHV0ZG93blRpbWVvdXRNcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0Q29udHJvbGxlck9wdGlvbklzRXhjbHVzaXZlKG9wdGlvbnM6IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnMpOiB2b2lkIHtcbiAgY29uc3QgaWdub3JlZEtleXMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKVxuICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4ga2V5ICE9PSBcImVuYWJsZWRcIiAmJiBrZXkgIT09IFwiY29udHJvbGxlclwiICYmIHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG5cbiAgaWYgKGlnbm9yZWRLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgV2ViU29ja2V0IHRlbGVtZXRyeSBjb250cm9sbGVyIG9wdGlvbiBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciB0ZWxlbWV0cnkgb3B0aW9uczogJHtpZ25vcmVkS2V5cy5qb2luKFxuICAgICAgXCIsIFwiLFxuICAgICl9YCxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIoXG4gIHRlbGVtZXRyeU9wdGlvbjogYm9vbGVhbiB8IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhLFxuKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciB7XG4gIGlmICh0ZWxlbWV0cnlPcHRpb24gPT09IHVuZGVmaW5lZCB8fCB0ZWxlbWV0cnlPcHRpb24gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICB9XG5cbiAgaWYgKHRlbGVtZXRyeU9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBidWlsZENvbnRyb2xsZXIoe30sIHJ1bnRpbWVNZXRhZGF0YSk7XG4gIH1cblxuICBpZiAodGVsZW1ldHJ5T3B0aW9uLmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICB9XG5cbiAgaWYgKHRlbGVtZXRyeU9wdGlvbi5jb250cm9sbGVyKSB7XG4gICAgYXNzZXJ0Q29udHJvbGxlck9wdGlvbklzRXhjbHVzaXZlKHRlbGVtZXRyeU9wdGlvbik7XG4gICAgcmV0dXJuIHRlbGVtZXRyeU9wdGlvbi5jb250cm9sbGVyO1xuICB9XG5cbiAgcmV0dXJuIGJ1aWxkQ29udHJvbGxlcih0ZWxlbWV0cnlPcHRpb24sIHJ1bnRpbWVNZXRhZGF0YSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQWdjQSxTQUFTLGVBQWUsS0FBc0I7Q0FDNUMsTUFBTSxhQUFhLElBQUksUUFBUSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsWUFBWTtDQUNoRSxPQUFPLHVCQUF1QixNQUFNLFlBQVksV0FBVyxTQUFTLE9BQU8sQ0FBQztBQUM5RTtBQUVBLFNBQVMsWUFBWSxPQUFnQyxLQUF1QztDQUMxRixJQUFJLFFBQVEsVUFBYSxlQUFlLEdBQUcsR0FDekMsT0FBTztDQUdULElBQUksTUFBTSxRQUFRLEtBQUssR0FDckIsT0FBTyxNQUFNLEtBQUssU0FBUyxZQUFZLElBQUksQ0FBQztDQUc5QyxJQUFJLGlCQUFpQixNQUNuQixPQUFPO0NBR1QsSUFBSSxTQUFTLGNBQWMsS0FBSyxHQUFHO0VBQ2pDLE1BQU0sV0FBeUMsQ0FBQztFQUNoRCxLQUFLLE1BQU0sQ0FBQyxVQUFVLGVBQWUsT0FBTyxRQUFRLEtBQUssR0FDdkQsU0FBUyxZQUFZLFlBQVksWUFBWSxRQUFRO0VBRXZELE9BQU87Q0FDVDtDQUVBLE9BQU87QUFDVDs7Ozs7QUFNQSxTQUFTLDBCQUEwQixRQUE0RDtDQUM3RixJQUFJLE9BQU8sU0FBUyxTQUVsQixPQUFPO0VBQ0wsR0FBRztFQUNILFlBQVksT0FBTyxhQUNkLFlBQVksT0FBTyxVQUFVLElBQzlCO0VBQ0osUUFBUSxPQUFPLFNBQ1YsWUFBWSxPQUFPLE1BQU0sSUFDMUI7RUFDSixnQkFBZ0IsT0FBTztDQUN6QjtDQUdGLElBQUksT0FBTyxTQUFTLFVBRWxCLE9BQU87RUFDTCxHQUFHO0VBQ0gsTUFBTSxPQUFPLE9BQ1IsWUFBWSxPQUFPLElBQUksSUFDeEI7RUFDSixVQUFVLE9BQU8sV0FBVyxFQUFFLEdBQUcsT0FBTyxTQUFTLElBQUk7Q0FDdkQ7Q0FJRixPQUFPO0VBQ0wsR0FBRztFQUNILFlBQVksT0FBTyxhQUNkLFlBQVksT0FBTyxVQUFVLElBQzlCO0VBQ0osUUFBUSxPQUFPLFFBQVEsS0FBSyxXQUFXO0dBQ3JDLEdBQUc7R0FDSCxZQUFZLE1BQU0sYUFDYixZQUFZLE1BQU0sVUFBVSxJQUM3QjtFQUNOLEVBQUU7RUFDRixPQUFPLE9BQU8sT0FBTyxLQUFLLFVBQVU7R0FDbEMsR0FBRztHQUNILFlBQVksS0FBSyxhQUNaLFlBQVksS0FBSyxVQUFVLElBQzVCO0VBQ04sRUFBRTtDQUNKO0FBQ0Y7QUFFQSxTQUFTLHVCQUF1QixTQUFrQyxVQUEwQjtDQUMxRixJQUFJO0VBQ0YsTUFBTSxhQUFhLEtBQUssVUFBVSxZQUFZLE9BQU8sQ0FBQztFQUN0RCxJQUFJLE9BQU8sV0FBVyxZQUFZLE9BQU8sS0FBSyxVQUM1QyxPQUFPO0VBRVQsT0FBTyxtQkFBbUIsWUFBWSxRQUFRO0NBQ2hELFFBQVE7RUFDTixPQUFPO0NBQ1Q7QUFDRjtBQUVBLFNBQVMsbUJBQW1CLE9BQWUsVUFBMEI7Q0FDbkUsSUFBSSxZQUFZLEdBQUcsT0FBTztDQUUxQixNQUFNLFNBQVMsWUFBWSxJQUFJLFFBQVE7Q0FDdkMsTUFBTSxnQkFBZ0IsV0FBVyxPQUFPLFdBQVcsUUFBUSxPQUFPO0NBQ2xFLElBQUksU0FBUztDQUNiLElBQUksWUFBWTtDQUVoQixLQUFLLE1BQU0sUUFBUSxPQUFPO0VBQ3hCLE1BQU0sWUFBWSxPQUFPLFdBQVcsTUFBTSxPQUFPO0VBQ2pELElBQUksWUFBWSxZQUFZLGVBQWU7RUFDM0MsVUFBVTtFQUNWLGFBQWE7Q0FDZjtDQUVBLE9BQU8sU0FBUztBQUNsQjtBQUVBLFNBQWdCLGNBQXFCLE9BQThDO0NBQ2pGLE9BQU8sY0FBYyxLQUFLLEtBQUssVUFBVSxRQUFRLFVBQVUsU0FBUyxXQUFXO0FBQ2pGO0FBbWhDQSxTQUFTLGdCQUNQLFNBQ0EsaUJBQzhCO0NBQzlCLE1BQU0sV0FBVyxRQUFRLFlBQVksQ0FBQztDQUN0QyxNQUFNLFlBQVksUUFBUSxVQUFVLENBQUM7Q0FDckMsTUFBTSxhQUFhLFFBQVEsV0FBVyxDQUFDO0NBQ3ZDLE1BQU0sV0FBVyxRQUFRLFNBQVMsQ0FBQztDQUVuQyxNQUFNLDhCQUNKLFNBQVMsdUJBQXVCO0NBSWxDLE1BQU0sdUJBQXVCLFVBQVUsYUFBYSxPQUFPLFNBQVksU0FBUztDQUNoRixNQUFNLHVCQUF1QixnQkFBZ0IsVUFBVSxRQUFRLElBQUksVUFBVSxXQUFXO0NBQ3hGLE1BQU0sMkJBQ0osVUFBVSxpQkFBaUIsT0FBTyxTQUFZLFNBQVM7Q0FDekQsTUFBTSwyQkFBMkIsZ0JBQWdCLFVBQVUsWUFBWSxJQUNuRSxVQUFVLGVBQ1Y7Q0FFSixNQUFNLHdCQUF3QixXQUFXLGFBQWEsT0FBTyxTQUFZLFNBQVM7Q0FDbEYsTUFBTSx3QkFBd0IsZ0JBQWdCLFdBQVcsUUFBUSxJQUM3RCxXQUFXLFdBQ1g7Q0FDSixNQUFNLDRCQUNKLFdBQVcsaUJBQWlCLE9BQU8sU0FBWSxTQUFTO0NBQzFELE1BQU0sNEJBQTRCLGdCQUFnQixXQUFXLFlBQVksSUFDckUsV0FBVyxlQUNYO0NBRUosTUFBTSxzQkFBc0IsU0FBUyxhQUFhLE9BQU8sU0FBWSxTQUFTO0NBQzlFLE1BQU0sc0JBQXNCLGdCQUFnQixTQUFTLFFBQVEsSUFBSSxTQUFTLFdBQVc7Q0FDckYsTUFBTSwwQkFDSixTQUFTLGlCQUFpQixPQUFPLFNBQVksU0FBUztDQUN4RCxNQUFNLDBCQUEwQixnQkFBZ0IsU0FBUyxZQUFZLElBQ2pFLFNBQVMsZUFDVDtDQUdKLE1BQU0sYUFBNEMsVUFBVSxRQUFRLENBQUMsR0FBRyxVQUFVLEtBQUssSUFBSSxDQUFDO0NBQzVGLElBQUksYUFBdUQsVUFBVTtDQUNyRSxJQUFJLFdBQVcsV0FBVyxLQUFLLGVBQWUsUUFBVztFQUN2RCxhQUFhLElBQUksbUJBQW1CO0dBQ2xDLFlBQVksVUFBVSxjQUFjLFNBQVM7R0FDN0MsVUFBVSxVQUFVLFlBQVksU0FBUztFQUMzQyxDQUFDO0VBQ0QsV0FBVyxLQUFLLFdBQVcsSUFBSTtDQUNqQyxPQUFPLElBQUksZUFBZSxVQUFhLENBQUMsV0FBVyxTQUFTLFdBQVcsSUFBSSxHQUN6RSxXQUFXLEtBQUssV0FBVyxJQUFJO0NBR2pDLE1BQU0saUJBQStDO0VBQ25ELE9BQU87RUFDUCxPQUFPO0VBQ1AscUJBQXFCLFVBQVUsVUFBVSx1QkFBdUI7RUFDaEUsa0JBQWtCLFVBQVUsb0JBQW9CO0VBQ2hELGdCQUFnQjtFQUNoQixnQkFBZ0I7RUFDaEIsb0JBQW9CO0VBQ3BCLG9CQUFvQjtFQUNwQixVQUFVO0dBQ1IsYUFBYSxVQUFVLFVBQVUsZUFBZTtHQUNoRCxhQUFhLFVBQVUsVUFBVSxlQUFlLENBQUM7R0FDakQsb0JBQW9CLFVBQVUsVUFBVSxzQkFBc0IsQ0FDNUQsR0FBRyxrQ0FDTDtFQUNGO0VBQ0EsZ0JBQWdCLFVBQVUsa0JBQWtCO0VBQzVDLHdCQUNFLFVBQVUsMEJBQTBCO0NBQ3hDO0NBR0EsTUFBTSxjQUE4QyxXQUFXLFFBQVEsQ0FBQyxHQUFHLFdBQVcsS0FBSyxJQUFJLENBQUM7Q0FDaEcsSUFBSSxjQUF5RCxXQUFXO0NBQ3hFLElBQUksWUFBWSxXQUFXLEtBQUssZ0JBQWdCLFFBQVc7RUFDekQsY0FBYyxJQUFJLG9CQUFvQjtHQUNwQyxZQUFZLFdBQVcsY0FBYyxTQUFTO0dBQzlDLFVBQVUsV0FBVyxZQUFZLFNBQVM7RUFDNUMsQ0FBQztFQUNELFlBQVksS0FBSyxZQUFZLElBQUk7Q0FDbkMsT0FBTyxJQUFJLGdCQUFnQixVQUFhLENBQUMsWUFBWSxTQUFTLFlBQVksSUFBSSxHQUM1RSxZQUFZLEtBQUssWUFBWSxJQUFJO0NBR25DLE1BQU0sa0JBQWlEO0VBQ3JELE9BQU87RUFDUCxPQUFPO0VBQ1AscUJBQXFCLFdBQVcsVUFBVSx1QkFBdUI7RUFDakUsa0JBQWtCLFdBQVcsb0JBQW9CO0VBQ2pELGdCQUFnQjtFQUNoQixnQkFBZ0I7RUFDaEIsb0JBQW9CO0VBQ3BCLG9CQUFvQjtFQUNwQixtQkFBbUIsV0FBVyxxQkFBcUI7RUFDbkQsa0JBQWtCLFdBQVcsb0JBQW9CO0NBQ25EO0NBR0EsTUFBTSxZQUEwQyxTQUFTLFFBQVEsQ0FBQyxHQUFHLFNBQVMsS0FBSyxJQUFJLENBQUM7Q0FDeEYsSUFBSSxZQUFxRCxTQUFTO0NBQ2xFLElBQUksVUFBVSxXQUFXLEtBQUssY0FBYyxRQUFXO0VBQ3JELFlBQVksSUFBSSxrQkFBa0I7R0FDaEMsWUFBWSxTQUFTLGNBQWMsU0FBUztHQUM1QyxVQUFVLFNBQVMsWUFBWSxTQUFTO0VBQzFDLENBQUM7RUFDRCxVQUFVLEtBQUssVUFBVSxJQUFJO0NBQy9CLE9BQU8sSUFBSSxjQUFjLFVBQWEsQ0FBQyxVQUFVLFNBQVMsVUFBVSxJQUFJLEdBQ3RFLFVBQVUsS0FBSyxVQUFVLElBQUk7Q0FHL0IsTUFBTSxnQkFBNkM7RUFDakQsT0FBTztFQUNQLE9BQU87RUFDUCxxQkFBcUIsU0FBUyxVQUFVLHVCQUF1QjtFQUMvRCxrQkFBa0IsU0FBUyxvQkFBb0I7RUFDL0MsZ0JBQWdCO0VBQ2hCLGdCQUFnQjtFQUNoQixvQkFBb0I7RUFDcEIsb0JBQW9CO0VBQ3BCLFVBQVUsRUFDUixhQUFhLFNBQVMsVUFBVSxlQUFlLG1DQUNqRDtDQUNGO0NBRUEsTUFBTSxnQkFBZ0IsSUFBSSxjQUFjLGdCQUFnQixlQUFlO0NBQ3ZFLE1BQU0saUJBQWlCLElBQUksZUFBZSxpQkFBaUIsZUFBZTtDQUMxRSxNQUFNLGVBQWUsSUFBSSxhQUFhLGVBQWUsZUFBZTtDQUVwRSxNQUFNLGVBQStDO0VBQ25ELG9CQUNFLFFBQVEsT0FBTyxzQkFBc0Isc0JBQXNCO0VBQzdELHlCQUNFLFFBQVEsT0FBTywyQkFBMkIsc0JBQXNCO0VBQ2xFLHVCQUNFLFFBQVEsT0FBTyx5QkFBeUIsc0JBQXNCO0VBQ2hFLDhCQUNFLFFBQVEsT0FBTyxnQ0FDZixzQkFBc0I7Q0FDMUI7Q0FFQSxNQUFNLG9CQUFvQixRQUFRLHFCQUFxQjtDQUV2RCxPQUFPLElBQUksaUNBQ1QsZUFDQSxnQkFDQSxjQUNBLGNBQ0EsaUJBQ0EsaUJBQ0Y7QUFDRjtBQUVBLFNBQVMsa0NBQWtDLFNBQTBDO0NBQ25GLE1BQU0sY0FBYyxPQUFPLFFBQVEsT0FBTyxDQUFDLENBQ3hDLFFBQVEsQ0FBQyxLQUFLLFdBQVcsUUFBUSxhQUFhLFFBQVEsZ0JBQWdCLFVBQVUsTUFBUyxDQUFDLENBQzFGLEtBQUssQ0FBQyxTQUFTLEdBQUc7Q0FFckIsSUFBSSxZQUFZLFdBQVcsR0FBRztDQUU5QixNQUFNLElBQUksTUFDUiwwRkFBMEYsWUFBWSxLQUNwRyxJQUNGLEdBQ0Y7QUFDRjtBQUVBLFNBQWdCLG1DQUNkLGlCQUNBLGlCQUM4QjtDQUM5QixJQUFJLG9CQUFvQixVQUFhLG9CQUFvQixPQUN2RCxPQUFPLElBQUksaUNBQWlDO0NBRzlDLElBQUksb0JBQW9CLE1BQ3RCLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxlQUFlO0NBRzVDLElBQUksZ0JBQWdCLFlBQVksT0FDOUIsT0FBTyxJQUFJLGlDQUFpQztDQUc5QyxJQUFJLGdCQUFnQixZQUFZO0VBQzlCLGtDQUFrQyxlQUFlO0VBQ2pELE9BQU8sZ0JBQWdCO0NBQ3pCO0NBRUEsT0FBTyxnQkFBZ0IsaUJBQWlCLGVBQWU7QUFDekQ7OztDQWx3RCtDLGtCQUFBO0NBQ3dCLG1CQUFBO0NBQzJCLHlCQUFBO0NBQ1Ysd0JBQUE7Q0FpWjNFLHlCQUE0RDtFQUN2RSxXQUFXO0VBQ1gsbUJBQW1CO0VBQ25CLDhCQUE4QixDQUFDO0VBQy9CLFdBQVc7RUFDWCx3QkFBd0I7RUFDeEIseUJBQXlCO0VBQ3pCLHFCQUFxQjtFQUNyQixtQkFBbUI7RUFDbkIsc0JBQXNCO0VBQ3RCLHlCQUF5QjtFQUN6Qix1QkFBdUI7Q0FDekI7Q0FFYSx3QkFBd0Q7RUFDbkUsb0JBQW9CO0VBQ3BCLHlCQUF5QjtFQUN6Qix1QkFBdUI7RUFDdkIsOEJBQThCO0NBQ2hDO0NBRU0saUNBQWlDO0NBQ2pDLDhCQUE4QjtDQUM5QixzQ0FBc0M7Q0FDdEMscUNBQXNFLENBQUMsUUFBUSxPQUFPO0NBQ3RGLGdDQUFtRDtDQUNuRCwwQ0FBMEM7Q0FDMUMsb0NBQW9DO0NBQ3BDLG9DQUFvQztDQUNwQyxxQ0FBcUM7Q0FDckMsdUNBQXVDO0NBRXZDLHlCQUF5QjtFQUM3QjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0NBQ0Y7Q0FDTSxpQkFBaUI7Q0FzSGpCLGNBQU4sTUFBa0I7RUFLRztFQUNBO0VBTG5CO0VBQ0E7RUFFQSxZQUNFLFdBQ0EsWUFDQTtHQUZpQixLQUFBLFlBQUE7R0FDQSxLQUFBLGFBQUE7R0FFakIsS0FBSyxTQUFTO0dBQ2QsS0FBSyxhQUFhLEtBQUssSUFBSTtFQUM3QjtFQUVBLGFBQXNCO0dBQ3BCLEtBQUssT0FBTztHQUNaLElBQUksS0FBSyxTQUFTLEdBQUcsT0FBTztHQUM1QixLQUFLLFVBQVU7R0FDZixPQUFPO0VBQ1Q7RUFFQSxTQUF1QjtHQUNyQixNQUFNLE1BQU0sS0FBSyxJQUFJO0dBQ3JCLE1BQU0sV0FBVyxNQUFNLEtBQUssY0FBYztHQUMxQyxLQUFLLFNBQVMsS0FBSyxJQUFJLEtBQUssV0FBVyxLQUFLLFNBQVMsVUFBVSxLQUFLLFVBQVU7R0FDOUUsS0FBSyxhQUFhO0VBQ3BCO0NBQ0Y7Q0FJTSx3QkFBOEIsQ0FBQztDQUV4QixtQ0FBYixNQUFzRjtFQUNwRixLQUFLLFFBQTRDLENBRWpEO0VBRUEsYUFBYSxRQUFvQyxDQUVqRDtFQUVBLFdBQVcsUUFBa0MsQ0FFN0M7RUFFQSxxQkFBd0Q7R0FDdEQsT0FBTztJQUFFLEdBQUc7SUFBd0IsV0FBVyxLQUFLLElBQUk7R0FBRTtFQUM1RDtFQUVBLGdCQUEwRCxDQUUxRDtFQUVBLGlCQUE0RCxDQUU1RDtFQUVBLGVBQXdELENBRXhEO0VBRUEscUJBQXFCLFNBQXFEO0dBQ3hFLE9BQU87RUFDVDtFQUVBLHdCQUF3QixVQUVnQjtHQUN0QyxPQUFPLENBQUM7RUFDVjtFQUVBLGtCQUFrRDtHQUNoRCxPQUFPLEVBQUUsR0FBRyxzQkFBc0I7RUFDcEM7RUFFQSxTQUFTLFVBQWtEO0dBQ3pELE9BQU8sUUFBUSxRQUFRO0VBQ3pCO0NBQ0Y7Q0FpRWUsb0JBQWYsTUFRRTtFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxnQ0FBaUMsSUFBSSxRQUF1QjtFQUM1RCxlQUFlO0VBQ2YsbUJBQW1CO0VBQ25CLGlCQUFpQjtFQUVqQixZQUNFLE9BQ0EsT0FDQSxxQkFDQSxrQkFDQSxnQkFDQSxvQkFDQSxpQkFDQTtHQUNBLEtBQUssUUFBUTtHQUNiLEtBQUssaUJBQWlCO0dBQ3RCLEtBQUssY0FBYyxJQUFJLFlBQVkscUJBQXFCLG1CQUFtQjtHQUMzRSxLQUFLLG1CQUFtQjtHQUN4QixLQUFLLGlCQUFpQjtHQUN0QixLQUFLLHFCQUFxQjtHQUMxQixLQUFLLGtCQUFrQjtFQUN6QjtFQUVBLElBQUksUUFBZ0I7R0FDbEIsT0FBTyxLQUFLO0VBQ2Q7RUFFQSx5QkFBeUIsVUFBdUM7R0FDOUQsS0FBSyx3QkFBd0I7RUFDL0I7RUFlQSxhQUF1QixPQUFxQjtHQUMxQyxJQUFJLEtBQUssZ0JBQWdCO0dBRXpCLElBQUk7R0FDSixJQUFJO0lBQ0YsU0FBUyxLQUFLLFlBQVksS0FBSztHQUNqQyxRQUFRO0lBQ04sS0FBSyxnQkFBZ0I7SUFDckI7R0FDRjtHQUdBLElBQUksQ0FEa0IsS0FBSyxzQkFBc0IsTUFDNUMsS0FBaUIsQ0FBQyxLQUFLLFlBQVksV0FBVyxHQUFHO0lBQ3BELEtBQUssZ0JBQWdCO0lBQ3JCO0dBQ0Y7R0FHQSxJQUFJO0dBQ0osSUFBSTtJQUNGLE1BQU0sZUFBZSwwQkFBMEIsTUFBTTtJQUNyRCxJQUFJLGFBQWEsU0FBUyxPQUFPLE1BQU07S0FFckMsS0FBSyxnQkFBZ0I7S0FDckI7SUFDRjtJQUNBLFdBQ3NEO0dBQ3hELFFBQVE7SUFDTixLQUFLLGdCQUFnQjtJQUNyQjtHQUNGO0dBR0EsSUFBSSxLQUFLLG1CQUFtQixRQUFXO0lBQ3JDLE1BQU0saUJBQWlCLEtBQUs7SUFDNUIsTUFBTSxTQUFTLEtBQUssZUFBZSxXQUFXLE1BQU0sZUFBZSxDQUFDLEdBQUcsVUFBVSxVQUFVO0lBQzNGLElBQUksV0FBVyxNQUFNO0lBQ3JCLFdBQVc7R0FDYjtHQUdBLE1BQU0saUJBQWlCLEtBQUssa0JBQWtCO0dBQzlDLElBQUksbUJBQW1CLFFBQVc7SUFDaEMsTUFBTSxTQUFTLEtBQUssZUFBZSxXQUFXLE1BQU0sZUFBZSxDQUFDLEdBQUcsVUFBVSxVQUFVO0lBQzNGLElBQUksV0FBVyxNQUFNO0lBQ3JCLFdBQVc7R0FDYjtHQUdBLElBQUksS0FBSyx1QkFBdUIsUUFBVztJQUN6QyxNQUFNLHFCQUFxQixLQUFLO0lBQ2hDLE1BQU0sU0FBUyxLQUFLLGVBQ2xCLFdBQ0MsTUFBTSxtQkFBbUIsQ0FBQyxHQUMzQixVQUNBLGNBQ0Y7SUFDQSxJQUFJLFdBQVcsTUFBTTtJQUNyQixXQUFXO0dBQ2I7R0FHQSxNQUFNLHFCQUFxQixLQUFLLHNCQUFzQjtHQUN0RCxJQUFJLHVCQUF1QixRQUFXO0lBQ3BDLE1BQU0sU0FBUyxLQUFLLGVBQ2xCLFdBQ0MsTUFBTSxtQkFBbUIsQ0FBQyxHQUMzQixVQUNBLGNBQ0Y7SUFDQSxJQUFJLFdBQVcsTUFBTTtJQUNyQixXQUFXO0dBQ2I7R0FFQSxLQUFLLGdCQUFnQixRQUFRO0VBQy9CO0VBS0EsZUFDRSxRQUNBLFFBQ0EsUUFDQSxNQUNnQjtHQUNoQixJQUFJO0dBQ0osSUFBSTtJQUNGLFNBQVMsT0FBTyxNQUFNO0dBQ3hCLFFBQVE7SUFDTixLQUFLLGdCQUFnQjtJQUNyQixPQUFPO0dBQ1Q7R0FFQSxJQUFJLFdBQVcsTUFBTTtJQUNuQixLQUFLLGdCQUFnQjtJQUNyQixPQUFPO0dBQ1Q7R0FFQSxJQUFJLE9BQU8sU0FBUyxPQUFPLE1BQU07SUFDL0IsS0FBSyxnQkFBZ0I7SUFDckIsTUFBTSxZQUNKLFNBQVMsYUFDTCx3Q0FDQTtJQUNOLEtBQUssc0JBQXNCLFdBQVcsUUFBUTtLQUM1QyxVQUFVLE9BQU87S0FDakIsUUFBUSxPQUFPO0tBQ2Y7SUFDRixDQUFDO0lBQ0QsT0FBTztHQUNUO0dBR0EsT0FBMkQ7RUFDN0Q7RUFFQSxnQkFBMEIsUUFBaUIsc0JBQXNCLE1BQVk7R0FDM0UsTUFBTSxXQUFXLEtBQUssaUJBQWlCLE1BQU07R0FDN0MsSUFBSSxtQkFBbUI7R0FFdkIsS0FBSyxNQUFNLFFBQVEsS0FBSyxPQUFPO0lBQzdCLE1BQU0sV0FBVyxLQUFLLGNBQWMsSUFBSSxJQUFJLEtBQUs7SUFDakQsSUFBSSxDQUFDLFlBQVksWUFBWSxLQUFLLGtCQUFrQjtLQUNsRCxJQUFJLENBQUMsa0JBQWtCO01BQ3JCLEtBQUssZ0JBQWdCO01BQ3JCLG1CQUFtQjtLQUNyQjtLQUNBO0lBQ0Y7SUFFQSxJQUFJO0tBQ0YsTUFBTSxTQUFTLEtBQUssS0FBSyxNQUFNO0tBQy9CLElBQUksY0FBYyxNQUFNLEdBQUc7TUFDekIsS0FBSyxjQUFjLElBQUksTUFBTSxXQUFXLENBQUM7TUFDekMsT0FBTyxXQUNDO09BQ0osS0FBSyxzQkFBc0IsSUFBSTtNQUNqQyxJQUNDLFVBQW1CO09BQ2xCLEtBQUssc0JBQXNCLElBQUk7T0FDL0IsS0FBSyxtQkFBbUIsUUFBUSxPQUFPLG1CQUFtQjtNQUM1RCxDQUNGO0tBQ0Y7SUFDRixTQUFTLE9BQU87S0FDZCxLQUFLLG1CQUFtQixRQUFRLE9BQU8sbUJBQW1CO0lBQzVEO0dBQ0Y7RUFDRjtFQUVBLHNCQUE4QixNQUFtQjtHQUMvQyxNQUFNLFVBQVUsS0FBSyxjQUFjLElBQUksSUFBSSxLQUFLO0dBQ2hELElBQUksV0FBVyxHQUFHO0lBQ2hCLEtBQUssY0FBYyxPQUFPLElBQUk7SUFDOUI7R0FDRjtHQUNBLEtBQUssY0FBYyxJQUFJLE1BQU0sVUFBVSxDQUFDO0VBQzFDO0VBRUEsbUJBQ0UsT0FDQSxPQUNBLG9CQUNNO0dBQ04sS0FBSyxvQkFBb0I7R0FDekIsSUFBSSxDQUFDLG9CQUFvQjtHQUN6QixLQUFLLHNCQUFzQiw0QkFBNEIsUUFBUTtJQUM3RDtJQUNBLFFBQVEsS0FBSztJQUNiLFdBQVcsaUJBQWlCLFFBQVEsTUFBTSxPQUFPLGNBQWMsS0FBSztHQUN0RSxDQUFDO0VBQ0g7RUFFQSxzQkFDRSxNQUNBLE9BQ0EsUUFDTTtHQUNOLElBQUksS0FBSywwQkFBMEIsUUFBVztHQUM5QyxJQUFJO0lBQ0YsS0FBSyxzQkFBc0IsTUFBTSxPQUFPLE1BQU07R0FDaEQsUUFBUSxDQUVSO0VBQ0Y7RUFFQSxNQUFNLFNBQVMsV0FBa0M7R0FDL0MsSUFBSSxLQUFLLGdCQUFnQjtHQUN6QixLQUFLLGlCQUFpQjtHQUV0QixNQUFNLGdCQUFnQixLQUFLLE1BQU0sS0FBSyxTQUFTLEtBQUssYUFBYSxNQUFNLFNBQVMsQ0FBQztHQUNqRixJQUFJLGNBQWMsU0FBUyxHQUN6QixNQUFNLFFBQVEsV0FBVyxhQUFhO0VBRTFDO0VBRUEsTUFBYyxhQUFhLE1BQWEsV0FBa0M7R0FDeEUsSUFBSSxDQUFDLEtBQUssVUFBVTtHQUVwQixJQUFJO0lBQ0YsTUFBTSxTQUFTLEtBQUssU0FBUyxFQUFFLFVBQVUsQ0FBQztJQUMxQyxJQUFJLENBQUMsY0FBYyxNQUFNLEdBQUc7SUFFNUIsSUFBSSxVQUFnRDtJQUNwRCxNQUFNLGtCQUFrQixPQUFPLFdBQ3ZCLGNBQ0wsVUFBbUI7S0FDbEIsTUFBTTtJQUNSLENBQ0Y7SUFDQSxNQUFNLGlCQUFpQixJQUFJLFNBQW9CLFlBQVk7S0FDekQsVUFBVSxpQkFBaUI7TUFDekIsUUFBUSxTQUFTO0tBQ25CLEdBQUcsU0FBUztJQUNkLENBQUM7SUFFRCxNQUFNLFVBQVUsTUFBTSxRQUFRLEtBQUssQ0FBQyxpQkFBaUIsY0FBYyxDQUFDO0lBQ3BFLElBQUksU0FDRixhQUFhLE9BQU87SUFHdEIsSUFBSSxZQUFZLFdBQVc7S0FDekIsZ0JBQWdCLFlBQVksQ0FBQyxDQUFDO0tBQzlCLEtBQUssb0JBQW9CO0tBQ3pCLEtBQUssc0JBQXNCLGlDQUFpQyxRQUFRO01BQ2xFO01BQ0EsUUFBUSxLQUFLO0tBQ2YsQ0FBQztJQUNIO0dBQ0YsU0FBUyxPQUFPO0lBQ2QsS0FBSyxtQkFBbUIsWUFBWSxPQUFPLElBQUk7R0FDakQ7RUFDRjtDQUNGO0NBSU0sZ0JBQU4sY0FBNEIsa0JBSzFCO0VBQ0EsU0FBa0I7RUFDbEI7RUFDQTtFQUNBO0VBS0E7RUFDQTtFQUVBLDBCQUFrQztFQUVsQyxZQUFZLFNBQXVDLGlCQUFrQztHQUNuRixNQUNFLFFBQVEsT0FDUixRQUFRLE9BQ1IsUUFBUSxxQkFDUixRQUFRLGtCQUNSLFFBQVEsZ0JBQ1IsUUFBUSxvQkFDUixlQUNGO0dBQ0EsS0FBSyxpQkFBaUIsUUFBUTtHQUM5QixLQUFLLHFCQUFxQixRQUFRO0dBQ2xDLEtBQUssV0FBVyxRQUFRO0dBQ3hCLEtBQUssaUJBQWlCLFFBQVE7R0FDOUIsS0FBSyx5QkFBeUIsUUFBUTtFQUN4QztFQUVBLEtBQUssT0FBMkM7R0FDOUMsSUFBSTtJQUNGLElBQUksS0FBSyxnQkFBZ0I7SUFJekIsTUFBTSxlQURnQyxLQUFLLFNBQVMsbUJBQ3hCLFNBQVMsTUFBTSxLQUFLO0lBRWhELElBQUksQ0FBQyxjQUFjO0tBQ2pCLE1BQU0sT0FBTyxLQUFLLFNBQVMsWUFBWSxNQUFNLFNBQVMsS0FBSyxTQUFTO0tBQ3BFLElBQUksUUFBUSxHQUFHO01BQ2IsS0FBSyxnQkFBZ0I7TUFDckI7S0FDRjtLQUNBLElBQUksT0FBTyxLQUFLLEtBQUssT0FBTyxLQUFLLE1BQU07TUFDckMsS0FBSyxnQkFBZ0I7TUFDckI7S0FDRjtJQUNGO0lBRUEsS0FBSywwQkFBMEI7SUFDL0IsSUFBSTtLQUNGLEtBQUssYUFBYSxLQUFLO0lBQ3pCLFVBQVU7S0FDUixLQUFLLDBCQUEwQjtJQUNqQztHQUNGLFFBQVEsQ0FFUjtFQUNGO0VBSUEsZ0NBQ0UsTUFDQSxPQUNBLFFBQ007R0FDTixNQUFNLFNBQXdDO0lBQzVDLE1BQU07SUFDTixXQUFXLEtBQUssSUFBSTtJQUNwQixlQUFlLFlBQVksSUFBSTtJQUMvQixXQUFXLEtBQUssZ0JBQWdCO0lBQ2hDLFFBQVEsS0FBSyxnQkFBZ0I7SUFDN0I7SUFDQTtJQUNBO0dBQ0Y7R0FJQSxJQUFJO0lBQ0YsTUFBTSxZQUFZLDBCQUEwQixNQUFNO0lBQ2xELElBQUksVUFBVSxTQUFTLFNBQVM7SUFDaEMsS0FBSyxnQkFBZ0IsV0FBVyxLQUFLO0dBQ3ZDLFFBQVEsQ0FFUjtFQUNGO0VBRUEsWUFBc0IsT0FBb0U7R0FDeEYsSUFBSSxTQUF3QztJQUMxQyxNQUFNO0lBQ04sV0FBVyxLQUFLLElBQUk7SUFDcEIsZUFBZSxZQUFZLElBQUk7SUFDL0IsV0FBVyxLQUFLLGdCQUFnQjtJQUNoQyxRQUFRLEtBQUssZ0JBQWdCO0lBQzdCLE1BQU0sTUFBTTtJQUNaLE9BQU8sTUFBTTtJQUNiLFdBQVcsTUFBTTtJQUNqQixjQUFjLE1BQU07SUFDcEIsUUFBUSxNQUFNO0lBQ2QsWUFBWSxNQUFNO0lBQ2xCLFFBQVEsTUFBTTtJQUNkLFNBQVMsTUFBTTtJQUNmLFFBQVEsTUFBTTtJQUNkLGNBQWMsTUFBTTtJQUNwQixTQUFTLE1BQU07R0FDakI7R0FFQSxJQUFJLEtBQUssbUJBQW1CLGFBQWEsTUFBTSxZQUFZLFFBQ3pELFNBQVM7SUFDUCxHQUFHO0lBQ0gsZ0JBQWdCLHVCQUF1QixNQUFNLFNBQVMsS0FBSyxzQkFBc0I7R0FDbkY7R0FHRixPQUFPO0VBQ1Q7RUFFQSxzQkFBZ0MsU0FBaUQ7R0FHL0UsT0FBTyxLQUFLO0VBQ2Q7RUFFQSxpQkFBMkIsUUFBZ0Q7R0FDekUsT0FBTyxPQUFPLFVBQVUsVUFBVSxPQUFPLFVBQVU7RUFDckQ7RUFFQSxvQkFFYztHQUNaLE9BQU8sS0FBSztFQUNkO0VBRUEsd0JBRWM7R0FDWixPQUFPLEtBQUs7RUFDZDtDQUNGO0NBSU0saUJBQU4sY0FBNkIsa0JBSzNCO0VBQ0EsU0FBa0I7RUFDbEI7RUFDQTtFQUNBLGdDQUF3RSxJQUFJLElBQUk7RUFDaEY7RUFDQTtFQUNBLHFCQUFzRTtFQUN0RTtFQUVBLFlBQVksU0FBd0MsaUJBQWtDO0dBQ3BGLE1BQ0UsUUFBUSxPQUNSLFFBQVEsT0FDUixRQUFRLHFCQUNSLFFBQVEsa0JBQ1IsUUFBUSxnQkFDUixRQUFRLG9CQUNSLGVBQ0Y7R0FDQSxLQUFLLGlCQUFpQixRQUFRO0dBQzlCLEtBQUsscUJBQXFCLFFBQVE7R0FDbEMsS0FBSyxvQkFBb0IsUUFBUTtHQUNqQyxLQUFLLG1CQUFtQixRQUFRO0dBRWhDLElBQUksS0FBSyxxQkFBcUIsS0FBSyxtQkFBbUIsR0FBRztJQUN2RCxLQUFLLHFCQUFxQixrQkFBa0I7S0FDMUMsS0FBSyxlQUFlO0lBQ3RCLEdBQUcsS0FBSyxnQkFBZ0I7SUFFeEIsSUFDRSxLQUFLLHNCQUNMLGNBQWMsS0FBSyxrQkFBa0IsS0FDckMsV0FBVyxLQUFLLG9CQUVoQixLQUFLLG1CQUFtQixNQUFNO0dBRWxDO0VBQ0Y7RUFFQSxLQUFLLE9BQW1DO0dBQ3RDLElBQUk7SUFDRixLQUFLLGFBQWEsS0FBSztHQUN6QixRQUFRLENBRVI7RUFDRjtFQUVBLFlBQXNCLE9BQTZEO0dBQ2pGLE9BQU87SUFDTCxNQUFNO0lBQ04sV0FBVyxLQUFLLElBQUk7SUFDcEIsZUFBZSxZQUFZLElBQUk7SUFDL0IsV0FBVyxLQUFLLGdCQUFnQjtJQUNoQyxRQUFRLEtBQUssZ0JBQWdCO0lBQzdCLE1BQU0sTUFBTTtJQUNaLE1BQU0sTUFBTTtJQUNaLE9BQU8sTUFBTTtJQUNiLE1BQU0sTUFBTTtJQUNaLE1BQU0sTUFBTTtJQUNaLFdBQVcsTUFBTTtJQUNqQixjQUFjLE1BQU07SUFDcEIsUUFBUSxNQUFNO0lBQ2QsU0FBUyxNQUFNO0lBQ2YsUUFBUSxNQUFNO0lBQ2QsY0FBYyxNQUFNO0lBQ3BCLFNBQVMsTUFBTTtJQUNmLFVBQVUsTUFBTTtHQUNsQjtFQUNGO0VBRUEsc0JBQWdDLFFBQWlEO0dBQy9FLE1BQU0sVUFBVSxPQUFPLE1BQU07R0FDN0IsSUFBSSxZQUFZLFlBQVksWUFBWSxjQUFjLFlBQVksV0FDaEUsT0FBTztHQUdULE9BQ0UsT0FBTyxLQUFLLFNBQVMsV0FBVyxLQUNoQyxPQUFPLEtBQUssU0FBUyxVQUFVLEtBQy9CLE9BQU8sS0FBSyxTQUFTLFVBQVUsS0FDL0IsT0FBTyxLQUFLLFNBQVMsWUFBWSxLQUNqQyxPQUFPLEtBQUssU0FBUyxXQUFXO0VBRXBDO0VBRUEsaUJBQTJCLFFBQWlEO0dBQzFFLE9BQU8sS0FBSyxzQkFBc0IsTUFBTTtFQUMxQztFQUVBLG9CQUVjO0dBQ1osT0FBTyxLQUFLO0VBQ2Q7RUFFQSx3QkFFYztHQUNaLE9BQU8sS0FBSztFQUNkO0VBRUEscUJBQXFCLFFBQW9EO0dBQ3ZFLEtBQUssY0FBYyxJQUFJLE1BQU07R0FDN0IsYUFBYTtJQUNYLEtBQUssY0FBYyxPQUFPLE1BQU07R0FDbEM7RUFDRjtFQUVBLG9CQUFvQixVQUF5RDtHQUMzRSxLQUFLLG1CQUFtQjtFQUMxQjtFQUVBLGNBQWlEO0dBQy9DLE1BQU0sTUFBTSxLQUFLLElBQUk7R0FDckIsTUFBTSxPQUEwQztJQUM5QyxHQUFHO0lBQ0gsV0FBVztJQUNYLDhCQUE4QixDQUFDO0lBQy9CLHlCQUF5QixLQUFLO0lBQzlCLHVCQUF1QixLQUFLO0dBQzlCO0dBRUEsS0FBSyxNQUFNLFVBQVUsS0FBSyxlQUN4QixJQUFJO0lBQ0YsTUFBTSxVQUFVLE9BQU8sUUFBUSxHQUFHO0lBQ2xDLEtBQUsscUJBQXFCLFFBQVEscUJBQXFCO0lBQ3ZELEtBQUssYUFBYSxRQUFRLGFBQWE7SUFDdkMsS0FBSywwQkFBMEIsUUFBUSwwQkFBMEI7SUFDakUsS0FBSywyQkFBMkIsUUFBUSwyQkFBMkI7SUFDbkUsS0FBSyx1QkFBdUIsUUFBUSx1QkFBdUI7SUFDM0QsS0FBSyxxQkFBcUIsUUFBUSxxQkFBcUI7SUFDdkQsS0FBSyx3QkFBd0IsUUFBUSx3QkFBd0I7SUFDN0QsSUFBSSxRQUFRLDhCQUNWLEtBQUssTUFBTSxDQUFDLElBQUksVUFBVSxPQUFPLFFBQVEsUUFBUSw0QkFBNEIsR0FDM0UsS0FBSyw2QkFBNkIsT0FDL0IsS0FBSyw2QkFBNkIsT0FBTyxLQUFLO0dBR3ZELFFBQVEsQ0FFUjtHQUdGLE9BQU87RUFDVDtFQUVBLGlCQUF1QjtHQUNyQixJQUFJO0lBQ0YsSUFBSSxLQUFLLGdCQUFnQjtJQUN6QixNQUFNLFdBQVcsS0FBSyxtQkFBbUIsS0FBSyxLQUFLLFlBQVk7SUFDL0QsTUFBTSxRQUE4QjtLQUNsQyxNQUFNO0tBQ04sTUFBTTtLQUNOLE9BQU8sU0FBUztLQUNoQixNQUFNO0tBQ047SUFDRjtJQUNBLEtBQUssS0FBSyxLQUFLO0dBQ2pCLFFBQVEsQ0FFUjtFQUNGO0VBRUEsTUFBZSxTQUFTLFdBQWtDO0dBQ3hELElBQUksS0FBSyx1QkFBdUIsTUFBTTtJQUNwQyxjQUFjLEtBQUssa0JBQWtCO0lBQ3JDLEtBQUsscUJBQXFCO0dBQzVCO0dBQ0EsTUFBTSxNQUFNLFNBQVMsU0FBUztFQUNoQztDQUNGO0NBSU0sZUFBTixjQUEyQixrQkFLekI7RUFDQSxTQUFrQjtFQUNsQjtFQUNBO0VBQ0E7RUFJQSxZQUFZLFNBQXNDLGlCQUFrQztHQUNsRixNQUNFLFFBQVEsT0FDUixRQUFRLE9BQ1IsUUFBUSxxQkFDUixRQUFRLGtCQUNSLFFBQVEsZ0JBQ1IsUUFBUSxvQkFDUixlQUNGO0dBQ0EsS0FBSyxpQkFBaUIsUUFBUTtHQUM5QixLQUFLLHFCQUFxQixRQUFRO0dBQ2xDLEtBQUssV0FBVyxFQUFFLGFBQWEsUUFBUSxTQUFTLFlBQVk7RUFDOUQ7RUFFQSxLQUFLLE9BQWlDO0dBQ3BDLElBQUk7SUFDRixJQUFJLEtBQUssZ0JBQWdCO0lBR3pCLElBQUksTUFBTSxXQUFXLFNBQVM7S0FDNUIsTUFBTSxPQUFPLEtBQUssU0FBUztLQUMzQixJQUFJLFFBQVEsR0FBRztNQUNiLEtBQUssZ0JBQWdCO01BQ3JCO0tBQ0Y7S0FDQSxJQUFJLE9BQU8sS0FBSyxLQUFLLE9BQU8sS0FBSyxNQUFNO01BQ3JDLEtBQUssZ0JBQWdCO01BQ3JCO0tBQ0Y7SUFDRjtJQUVBLEtBQUssYUFBYSxLQUFLO0dBQ3pCLFFBQVEsQ0FFUjtFQUNGO0VBRUEsWUFBc0IsT0FBeUQ7R0FDN0UsT0FBTztJQUNMLE1BQU07SUFDTixXQUFXLEtBQUssSUFBSTtJQUNwQixlQUFlLFlBQVksSUFBSTtJQUMvQixXQUFXLEtBQUssZ0JBQWdCO0lBQ2hDLFFBQVEsS0FBSyxnQkFBZ0I7SUFDN0IsZUFBZSxNQUFNO0lBQ3JCLE1BQU0sTUFBTTtJQUNaLFlBQVksTUFBTTtJQUNsQixRQUFRLE1BQU07SUFDZCxXQUFXLE1BQU07SUFDakIsY0FBYyxNQUFNO0lBQ3BCLFFBQVEsTUFBTTtJQUNkLFlBQVksTUFBTTtJQUNsQixXQUFXLE1BQU07SUFDakIsU0FBUyxNQUFNO0lBQ2YsUUFBUSxNQUFNO0lBQ2QsY0FBYyxNQUFNO0lBQ3BCLFNBQVMsTUFBTTtJQUNmLFFBQVEsTUFBTTtJQUNkLE9BQU8sTUFBTTtHQUNmO0VBQ0Y7RUFFQSxzQkFBZ0MsUUFBK0M7R0FDN0UsT0FBTyxPQUFPLFdBQVc7RUFDM0I7RUFFQSxpQkFBMkIsUUFBK0M7R0FDeEUsT0FBTyxPQUFPLFdBQVc7RUFDM0I7RUFFQSxvQkFFYztHQUNaLE9BQU8sS0FBSztFQUNkO0VBRUEsd0JBRWM7R0FDWixPQUFPLEtBQUs7RUFDZDtDQUNGO0NBSWEsbUNBQWIsTUFBc0Y7RUFDcEY7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxpQkFBMkI7RUFFM0IsWUFDRSxRQUNBLFNBQ0EsT0FDQSxjQUNBLGlCQUNBLG1CQUNBO0dBQ0EsS0FBSyxTQUFTO0dBQ2QsS0FBSyxVQUFVO0dBQ2YsS0FBSyxRQUFRO0dBQ2IsS0FBSyxlQUFlO0dBQ3BCLEtBQUssWUFBWSxnQkFBZ0I7R0FDakMsS0FBSyxTQUFTLGdCQUFnQjtHQUM5QixLQUFLLG9CQUFvQjtHQUd6QixNQUFNLFlBQW1DLE1BQU0sT0FBTyxXQUFXO0lBQy9ELEtBQUssT0FBTyxnQ0FBZ0MsTUFBTSxPQUFPLE1BQU07R0FDakU7R0FDQSxLQUFLLE9BQU8seUJBQXlCLFFBQVE7R0FDN0MsS0FBSyxRQUFRLHlCQUF5QixRQUFRO0dBQzlDLEtBQUssTUFBTSx5QkFBeUIsUUFBUTtHQUM1QyxLQUFLLFFBQVEsMEJBQTBCLEtBQUssbUJBQW1CLENBQUM7RUFDbEU7RUFFQSxLQUFLLE9BQTJDO0dBQzlDLElBQUk7SUFDRixJQUFJLEtBQUssZ0JBQWdCO0lBQ3pCLEtBQUssT0FBTyxLQUFLLEtBQUs7R0FDeEIsUUFBUSxDQUVSO0VBQ0Y7RUFFQSxhQUFhLE9BQW1DO0dBQzlDLElBQUk7SUFDRixJQUFJLEtBQUssZ0JBQWdCO0lBQ3pCLEtBQUssUUFBUSxLQUFLLEtBQUs7R0FDekIsUUFBUSxDQUVSO0VBQ0Y7RUFFQSxXQUFXLE9BQWlDO0dBQzFDLElBQUk7SUFDRixJQUFJLEtBQUssZ0JBQWdCO0lBQ3pCLEtBQUssTUFBTSxLQUFLLEtBQUs7R0FDdkIsUUFBUSxDQUVSO0VBQ0Y7RUFFQSxxQkFBd0Q7R0FDdEQsSUFBSTtJQUNGLE1BQU0sT0FBTyxLQUFLLFFBQVEsWUFBWTtJQUN0QyxLQUFLLDBCQUNILEtBQUssT0FBTyxlQUFlLEtBQUssUUFBUSxlQUFlLEtBQUssTUFBTTtJQUNwRSxLQUFLLHdCQUNILEtBQUssT0FBTyxtQkFBbUIsS0FBSyxRQUFRLG1CQUFtQixLQUFLLE1BQU07SUFDNUUsT0FBTztHQUNULFFBQVE7SUFDTixPQUFPO0tBQUUsR0FBRztLQUF3QixXQUFXLEtBQUssSUFBSTtJQUFFO0dBQzVEO0VBQ0Y7RUFFQSxnQkFBMEQ7R0FDeEQsSUFBSTtJQUNGLE9BQU8sS0FBSyxPQUFPO0dBQ3JCLFFBQVE7SUFDTjtHQUNGO0VBQ0Y7RUFFQSxpQkFBNEQ7R0FDMUQsSUFBSTtJQUNGLE9BQU8sS0FBSyxRQUFRO0dBQ3RCLFFBQVE7SUFDTjtHQUNGO0VBQ0Y7RUFFQSxlQUF3RDtHQUN0RCxJQUFJO0lBQ0YsT0FBTyxLQUFLLE1BQU07R0FDcEIsUUFBUTtJQUNOO0dBQ0Y7RUFDRjtFQUVBLHFCQUFxQixRQUFvRDtHQUN2RSxJQUFJO0lBQ0YsT0FBTyxLQUFLLFFBQVEscUJBQXFCLE1BQU07R0FDakQsUUFBUTtJQUNOLE9BQU87R0FDVDtFQUNGO0VBRUEsd0JBQXdCLFNBRWdCO0dBQ3RDLElBQUk7SUFDRixJQUFJLEtBQUssYUFBYSxzQkFBc0IsU0FBUyxTQUFTO0tBQzVELE1BQU0sb0JBQW9CLFFBQVEsUUFBUTtLQUMxQyxNQUFNLG1CQUFtQixNQUFNLFFBQVEsaUJBQWlCLElBQ3BELGtCQUFrQixLQUNsQjtLQUNKLElBQUksa0JBQWtCO01BQ3BCLE1BQU0sU0FBUyxpQkFBaUIsZ0JBQWdCO01BQ2hELElBQUksUUFBUTtPQUNWLE1BQU0sVUFBK0M7UUFDbkQsU0FBUyxPQUFPO1FBQ2hCLGNBQWMsT0FBTztRQUNyQixTQUFTLE9BQU87T0FDbEI7T0FDQSxJQUFJLEtBQUssYUFBYSx5QkFDcEIsUUFBUSxTQUFTLGVBQWU7T0FFbEMsT0FBTyxFQUFFLEdBQUcsUUFBUTtNQUN0QjtLQUNGO0lBQ0Y7SUFFQSxJQUFJLENBQUMsS0FBSyxhQUFhLHlCQUNyQixPQUFPLENBQUM7SUFHVixPQUFPO0tBQUUsU0FBUyxnQkFBZ0I7S0FBRyxRQUFRLGVBQWU7SUFBRTtHQUNoRSxRQUFRO0lBQ04sT0FBTyxDQUFDO0dBQ1Y7RUFDRjtFQUVBLGtCQUFrRDtHQUNoRCxPQUFPLEVBQUUsR0FBRyxLQUFLLGFBQWE7RUFDaEM7RUFFQSxNQUFNLFNBQVMsU0FBaUQ7R0FDOUQsSUFBSSxLQUFLLGdCQUFnQjtHQUN6QixLQUFLLGlCQUFpQjtHQUV0QixNQUFNLFlBQVksU0FBUyxhQUFhLEtBQUs7R0FDN0MsSUFBSTtJQUNGLE1BQU0sUUFBUSxXQUFXO0tBQ3ZCLEtBQUssT0FBTyxTQUFTLFNBQVM7S0FDOUIsS0FBSyxRQUFRLFNBQVMsU0FBUztLQUMvQixLQUFLLE1BQU0sU0FBUyxTQUFTO0lBQy9CLENBQUM7R0FDSCxRQUFRLENBRVI7RUFDRjtDQUNGIn0=