sonamu 0.7.10 → 0.7.12

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 (133) hide show
  1. package/dist/api/config.d.ts +10 -3
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +2 -1
  4. package/dist/api/sonamu.d.ts +4 -0
  5. package/dist/api/sonamu.d.ts.map +1 -1
  6. package/dist/api/sonamu.js +36 -2
  7. package/dist/bin/cli.js +121 -117
  8. package/dist/database/base-model.d.ts +10 -50
  9. package/dist/database/base-model.d.ts.map +1 -1
  10. package/dist/database/base-model.js +19 -84
  11. package/dist/database/base-model.types.d.ts +4 -4
  12. package/dist/database/base-model.types.d.ts.map +1 -1
  13. package/dist/database/base-model.types.js +1 -1
  14. package/dist/database/db.d.ts +1 -0
  15. package/dist/database/db.d.ts.map +1 -1
  16. package/dist/database/db.js +24 -13
  17. package/dist/database/puri-subset.test-d.js +1 -1
  18. package/dist/database/puri-subset.types.d.ts +1 -0
  19. package/dist/database/puri-subset.types.d.ts.map +1 -1
  20. package/dist/database/puri-subset.types.js +2 -2
  21. package/dist/database/puri.d.ts +96 -1
  22. package/dist/database/puri.d.ts.map +1 -1
  23. package/dist/database/puri.js +214 -2
  24. package/dist/database/puri.types.d.ts +60 -5
  25. package/dist/database/puri.types.d.ts.map +1 -1
  26. package/dist/database/puri.types.js +2 -3
  27. package/dist/database/puri.types.test-d.js +1 -1
  28. package/dist/database/upsert-builder.d.ts +3 -1
  29. package/dist/database/upsert-builder.d.ts.map +1 -1
  30. package/dist/database/upsert-builder.js +19 -4
  31. package/dist/entity/entity-manager.d.ts +5 -4
  32. package/dist/entity/entity-manager.d.ts.map +1 -1
  33. package/dist/entity/entity-manager.js +8 -1
  34. package/dist/index.d.ts +1 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +3 -3
  37. package/dist/migration/code-generation.d.ts.map +1 -1
  38. package/dist/migration/code-generation.js +33 -2
  39. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  40. package/dist/migration/postgresql-schema-reader.js +53 -22
  41. package/dist/naite/messaging-types.d.ts.map +1 -1
  42. package/dist/naite/messaging-types.js +1 -1
  43. package/dist/naite/naite-reporter.d.ts +7 -4
  44. package/dist/naite/naite-reporter.d.ts.map +1 -1
  45. package/dist/naite/naite-reporter.js +45 -21
  46. package/dist/naite/naite.js +2 -2
  47. package/dist/stream/sse.d.ts +2 -6
  48. package/dist/stream/sse.d.ts.map +1 -1
  49. package/dist/stream/sse.js +9 -3
  50. package/dist/syncer/api-parser.js +5 -1
  51. package/dist/syncer/file-patterns.d.ts +1 -1
  52. package/dist/syncer/file-patterns.d.ts.map +1 -1
  53. package/dist/syncer/file-patterns.js +6 -5
  54. package/dist/syncer/module-loader.d.ts +5 -0
  55. package/dist/syncer/module-loader.d.ts.map +1 -1
  56. package/dist/syncer/module-loader.js +17 -1
  57. package/dist/syncer/syncer.d.ts +3 -0
  58. package/dist/syncer/syncer.d.ts.map +1 -1
  59. package/dist/syncer/syncer.js +12 -2
  60. package/dist/tasks/decorator.d.ts +26 -0
  61. package/dist/tasks/decorator.d.ts.map +1 -0
  62. package/dist/tasks/decorator.js +28 -0
  63. package/dist/tasks/step-wrapper.d.ts +18 -0
  64. package/dist/tasks/step-wrapper.d.ts.map +1 -0
  65. package/dist/tasks/step-wrapper.js +38 -0
  66. package/dist/tasks/workflow-manager.d.ts +40 -0
  67. package/dist/tasks/workflow-manager.d.ts.map +1 -0
  68. package/dist/tasks/workflow-manager.js +193 -0
  69. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  70. package/dist/template/implementations/generated.template.js +7 -3
  71. package/dist/template/implementations/model.template.js +2 -2
  72. package/dist/template/zod-converter.d.ts.map +1 -1
  73. package/dist/template/zod-converter.js +4 -2
  74. package/dist/types/types.d.ts +28 -11
  75. package/dist/types/types.d.ts.map +1 -1
  76. package/dist/types/types.js +18 -2
  77. package/dist/utils/console-util.js +2 -2
  78. package/dist/utils/formatter.d.ts.map +1 -1
  79. package/dist/utils/formatter.js +10 -2
  80. package/dist/utils/model.d.ts +9 -2
  81. package/dist/utils/model.d.ts.map +1 -1
  82. package/dist/utils/model.js +16 -1
  83. package/dist/utils/type-utils.d.ts.map +1 -1
  84. package/dist/utils/type-utils.js +3 -1
  85. package/dist/vector/embedding.d.ts +2 -5
  86. package/dist/vector/embedding.d.ts.map +1 -1
  87. package/dist/vector/embedding.js +3 -7
  88. package/dist/vector/types.d.ts.map +1 -1
  89. package/dist/vector/types.js +1 -1
  90. package/package.json +4 -2
  91. package/src/api/config.ts +15 -8
  92. package/src/api/sonamu.ts +43 -2
  93. package/src/bin/cli.ts +58 -54
  94. package/src/database/base-model.ts +21 -128
  95. package/src/database/base-model.types.ts +3 -4
  96. package/src/database/db.ts +28 -18
  97. package/src/database/puri-subset.test-d.ts +1 -0
  98. package/src/database/puri-subset.types.ts +2 -0
  99. package/src/database/puri.ts +292 -1
  100. package/src/database/puri.types.test-d.ts +1 -1
  101. package/src/database/puri.types.ts +81 -7
  102. package/src/database/upsert-builder.ts +27 -9
  103. package/src/entity/entity-manager.ts +9 -0
  104. package/src/index.ts +1 -1
  105. package/src/migration/code-generation.ts +40 -1
  106. package/src/migration/postgresql-schema-reader.ts +53 -22
  107. package/src/naite/messaging-types.ts +43 -44
  108. package/src/naite/naite-reporter.ts +51 -20
  109. package/src/naite/naite.ts +1 -1
  110. package/src/shared/app.shared.ts.txt +13 -0
  111. package/src/shared/web.shared.ts.txt +13 -0
  112. package/src/stream/sse.ts +15 -3
  113. package/src/syncer/api-parser.ts +4 -0
  114. package/src/syncer/file-patterns.ts +11 -9
  115. package/src/syncer/module-loader.ts +35 -0
  116. package/src/syncer/syncer.ts +14 -0
  117. package/src/tasks/decorator.ts +71 -0
  118. package/src/tasks/step-wrapper.ts +84 -0
  119. package/src/tasks/workflow-manager.ts +330 -0
  120. package/src/template/implementations/generated.template.ts +19 -6
  121. package/src/template/implementations/model.template.ts +1 -1
  122. package/src/template/zod-converter.ts +3 -0
  123. package/src/types/types.ts +23 -4
  124. package/src/utils/console-util.ts +1 -1
  125. package/src/utils/formatter.ts +8 -1
  126. package/src/utils/model.ts +26 -2
  127. package/src/utils/type-utils.ts +2 -0
  128. package/src/vector/embedding.ts +2 -8
  129. package/src/vector/types.ts +1 -2
  130. package/dist/vector/vector-search.d.ts +0 -47
  131. package/dist/vector/vector-search.d.ts.map +0 -1
  132. package/dist/vector/vector-search.js +0 -176
  133. package/src/vector/vector-search.ts +0 -261
@@ -21,11 +21,12 @@ import { areFilesSame, findChangedFilesUsingChecksums, renewChecksums } from "./
21
21
  import { generateTemplate, renderTemplate } from "./code-generator.js";
22
22
  import { createEntity, delEntity } from "./entity-operations.js";
23
23
  import { getChecksumPatternGroupInAbsolutePath } from "./file-patterns.js";
24
- import { loadApis, loadModels, loadTypes } from "./module-loader.js";
24
+ import { loadApis, loadModels, loadTypes, loadWorkflows } from "./module-loader.js";
25
25
  export class Syncer {
26
26
  apis = [];
27
27
  types = {};
28
28
  models = {};
29
+ workflows = new Map();
29
30
  isSyncing = false;
30
31
  /**
31
32
  * 체크섬이 변경된 부분에 대해 싱크를 진행합니다.
@@ -95,6 +96,7 @@ export class Syncer {
95
96
  await this.autoloadTypes();
96
97
  await this.autoloadModels();
97
98
  await this.autoloadApis();
99
+ await this.autoloadWorkflows();
98
100
  this.syncUI();
99
101
  }
100
102
  removeInvalidatedRegisteredApis(invalidatedPath) {
@@ -145,6 +147,10 @@ export class Syncer {
145
147
  async autoloadApis() {
146
148
  this.apis = await loadApis();
147
149
  }
150
+ async autoloadWorkflows() {
151
+ this.workflows = await loadWorkflows();
152
+ await Sonamu.workflows.synchronize(this.workflows);
153
+ }
148
154
  /**
149
155
  * 실제 싱크를 수행하는 본체입니다.
150
156
  * 변경된 파일들을 타입별로 분류하고 각 타입에 맞는 액션을 실행합니다.
@@ -171,6 +177,10 @@ export class Syncer {
171
177
  if (diffTypes.includes("config")) {
172
178
  await this.actionSyncConfig();
173
179
  }
180
+ // 트리거: workflow
181
+ if (diffTypes.includes("workflow")) {
182
+ await this.autoloadWorkflows();
183
+ }
174
184
  return {
175
185
  diffTypes
176
186
  };
@@ -432,4 +442,4 @@ export class Syncer {
432
442
  }
433
443
  }
434
444
 
435
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCBwYXRoLCB7IGRpcm5hbWUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyByZWdpc3RlcmVkQXBpcyB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIsIHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVPcHRpb25zLCBQYXRoQW5kQ29kZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGVLZXksIHR5cGUgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBtYXBBc3luYywgcmVkdWNlQXN5bmMgfSBmcm9tIFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIjtcbmltcG9ydCB7IGNlbnRlclRleHQgfSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBpc1Rlc3QgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW5XaXRoR3JhY2VmdWxTaHV0ZG93biB9IGZyb20gXCIuLi91dGlscy9wcm9jZXNzLXV0aWxzXCI7XG5pbXBvcnQgeyBhcmVGaWxlc1NhbWUsIGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcywgcmVuZXdDaGVja3N1bXMgfSBmcm9tIFwiLi9jaGVja3N1bVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSwgcmVuZGVyVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlRW50aXR5LCBkZWxFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHktb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBGaWxlVHlwZSwgZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCB9IGZyb20gXCIuL2ZpbGUtcGF0dGVybnNcIjtcbmltcG9ydCB7XG4gIHR5cGUgTG9hZGVkQXBpcyxcbiAgdHlwZSBMb2FkZWRNb2RlbHMsXG4gIHR5cGUgTG9hZGVkVHlwZXMsXG4gIGxvYWRBcGlzLFxuICBsb2FkTW9kZWxzLFxuICBsb2FkVHlwZXMsXG59IGZyb20gXCIuL21vZHVsZS1sb2FkZXJcIjtcblxudHlwZSBEaWZmR3JvdXBzID0ge1xuICBba2V5IGluIEZpbGVUeXBlXTogQWJzb2x1dGVQYXRoW107XG59O1xuXG5leHBvcnQgY2xhc3MgU3luY2VyIHtcbiAgYXBpczogTG9hZGVkQXBpcyA9IFtdO1xuICB0eXBlczogTG9hZGVkVHlwZXMgPSB7fTtcbiAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcbiAgaXNTeW5jaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIOyytO2BrOyErOydtCDrs4Dqsr3rkJwg67aA67aE7JeQIOuMgO2VtCDsi7Htgazrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKiDri6Trp4wgc29uYW11LnNoYXJlZC50c+uKlCDssrTtgazshKwg67mE6rWQIOyXhuydtCDrrLTsobDqsbQg7Iux7YGsKOuzteyCrCntlanri4jri6QuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuXG4gICAgLy8gc29uYW11LnNoYXJlZC50c+uKlCDrrLTsobDqsbQg7Iux7YGsKOuzteyCrCntlanri4jri6QuXG4gICAgYXdhaXQgdGhpcy5jb3B5U2hhcmVkVG9UYXJnZXRzKHRhcmdldHMpO1xuXG4gICAgLy8g6re4IOuLpOydjOu2gO2EsOuKlCDrs4Dqsr3rkJwg7YyM7J287J2EIOywvuyVhOyEnCDrj5nquLDtmZQg7J6R7JeF7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICBjb25zdCBjaGFuZ2VkRmlsZXMgPSBhd2FpdCBmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMoKTtcbiAgICBpZiAoY2hhbmdlZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KFwiQWxsIGZpbGVzIGFyZSBzeW5jZWQhXCIpKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g66eM7JW9IOyLse2BrCDspJHsl5Ag7ZSE66Gc7IS47Iqk6rCAIOyjveycvOuptCDqvKzsl6zrsoTrpqzquLAg65WM66y47JeQLFxuICAgIC8vIOyLnOq3uOuEkOyXkOuPhCDsnqDsi5wg67KE7Yu4IOyImCDsnojripQg7ZmY6rK9IOyGjeyXkOyEnCDsi7Htgazrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGF3YWl0IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyDslpjqsIAg7Iux7YGsIOyekeyXhSDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoY2hhbmdlZEZpbGVzKTtcblxuICAgICAgICAvLyDsi7Htgawg7JWh7IWY7J20IOuBneuCmOuptCDtla3sg4Eg7LK07YGs7ISs7J2EIOuLpOyLnCDqsLHsi6Dtlanri4jri6QuXG4gICAgICAgIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gICAgICB9LFxuICAgICAgeyB3aGVuVGhpc0hhcHBlbnM6IFwiU0lHVVNSMlwiLCB3YWl0Rm9yVXBUbzogMjAwMDAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoZXLqsIAg6rCQ7KeA7ZWcIO2MjOydvCDrs4Dqsr0g7IKs7ZWt7JeQIOuMgO2VtCDsi7Htgazrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKiDso7zslrTsp4Qg67OA6rK9IO2MjOydvOuTpCDspJEg7LK07YGs7ISsIOq0gOumrCDrjIDsg4Hsnbgg6rKD65Ok66eMIOqwgOyguOuLpOqwgCDsi7Htgazrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKiDssrTtgazshKwg7YyM7J28IOyXheuNsOydtO2KuOuKlCDsl6zquLDsl5DshJwg7ZWY7KeAIOyViuyKteuLiOuLpC4g7Zi47Lac7J6Q6rCAIO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aCAtIOuzgOqyvSDtjIzsnbzrk6QuIO2UhOuhnOygne2KuCDro6jtirjrtoDthLAgXCJzcmMvXCIg65iQ64qUIFwiZGlzdC9cIuuhnCDsi5zsnpHtlZjripQg7IOB64yAIOqyveuhnOyeheuLiOuLpC4g7JiI7IucOiBcInNyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIlxuICAgKi9cbiAgYXN5bmMgc3luY0Zyb21XYXRjaGVyKGV2ZW50OiBzdHJpbmcsIGRpZmZGaWxlUGF0aDogQWJzb2x1dGVQYXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGV2ZW50ICE9PSBcImNoYW5nZVwiICYmIGV2ZW50ICE9PSBcImFkZFwiICYmIGV2ZW50ICE9PSBcInVubGlua1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7J2864uoIOuzgOqyveuQnCDtjIzsnbzqs7wgZGVwZW5kZW50IO2MjOydvOuTpOydhCBpbnZhbGlkYXRlIO2VqeuLiOuLpC5cbiAgICAvLyDtlZwg67KIIOydtOyDgSBpbXBvcnTrkJwg7Lmc6rWs65Ok7JeQIOuMgO2VtOyEnOunjCDsi6TsoJwg7J6R7JeF7J20IOydvOyWtOuCqeuLiOuLpC5cbiAgICAvLyDqt7jrn6zri4gg7JWI7Ius7ZWY6rOgIGludmFsaWRhdGUg7ZW064+EIOuQqeuLiOuLpC5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIGhvdC5pbnZhbGlkYXRlRmlsZeyLnCDstIjquLAg7JeQ65+s6rCAIOuwnOyDne2VmOq4sCDrlYzrrLjsl5AgaW52YWxpZGF0ZSDtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgIGNvbnN0IGludmFsaWRhdGVkUGF0aHMgPSAoYXdhaXQgaG90LmludmFsaWRhdGVGaWxlKGRpZmZGaWxlUGF0aCwgZXZlbnQpKSBhcyBBYnNvbHV0ZVBhdGhbXTtcblxuICAgICAgaWYgKGludmFsaWRhdGVkUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGDwn5SEIEludmFsaWRhdGVkOmApKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGludmFsaWRhdGVkUGF0aCBvZiBpbnZhbGlkYXRlZFBhdGhzKSB7XG4gICAgICAgICAgLy8g66eM7JW9IG1vZGVsLnRzIO2MjOydvOydtCDrs4Dqsr0oaW52YWxpZGF0ZSnrkJjsl4jri6Q/IOq3uOufrOuptCByZWdpc3RlcmVkQXBpcyDspJHsl5DshJwg7J20IOuqqOuNuOyXkCDtlbTri7ntlZjripQgYXBp65Ok7J2AIOyngOybjOykmOyalC5cbiAgICAgICAgICAvLyByZWdpc3RlcmVkQXBpc+uKlCDthrXsnLzroZwg64ukIOuCoOugpOuyhOumtCDsiJgg7JeG7Iq164uI64ukLiByZWdpc3RlcmVkQXBpc+yXkCDsmKzrnbzsmKTripQg7Lmc6rWs65Ok7J2AIOy0iOq4sCDroZzrk5zsi5wg65iQ64qUIEhNUuyLnOyXkOunjCDrk7HroZ3rkJjquLAg65WM66y47J6F64uI64ukLlxuICAgICAgICAgIC8vIOuUsOudvOyEnCBtb2RlbC50cyDtjIzsnbzsnZgg67OA6rK97Jy866GcIOuLpOydjOuyiCDsg4jroZzsmrQgZXZhbOydtCDsmIjsg4HrkJjripQg7J20IOyLnOygkOyXkOyEnOunjCwg7J20IOuqqOuNuOyXkOyEnCDrgpjsmKggcmVnaXN0ZXJlZEFwaXPrk6TsnYQg7KeA7JuM7KSEIOyImCDsnojsirXri4jri6QuXG4gICAgICAgICAgY29uc3QgcmVtb3ZlZEFwaXMgPSB0aGlzLnJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICAgICAgICBpZiAocmVtb3ZlZEFwaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSxcbiAgICAgICAgICAgICAgY2hhbGsuZ3JheShgKHdpdGggJHtyZW1vdmVkQXBpcy5sZW5ndGh9IEFQSXMpYCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGludmFsaWRhdGVkUGF0aCl9YCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzSW5DaGVja1BhdHRlcm5Hcm91cCA9IE9iamVjdC52YWx1ZXMoZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCgpKS5zb21lKFxuICAgICAgKHBhdHRlcm4pID0+IG1pbmltYXRjaChkaWZmRmlsZVBhdGgsIHBhdHRlcm4pLFxuICAgICk7XG5cbiAgICAvLyDtlaAg7J28KHN5bmMp7J20IOyeiOycvOuptCDtlanri4jri6QuXG4gICAgaWYgKGlzSW5DaGVja1BhdHRlcm5Hcm91cCkge1xuICAgICAgYXdhaXQgdGhpcy5kb1N5bmNBY3Rpb25zKFtkaWZmRmlsZVBhdGhdKTtcbiAgICB9XG5cbiAgICAvLyDsi7Htgawg7J6R7JeF7J20IOuBneuCmOuptCDrqqjrk6Ag66qo65OI7J2EIOuhnOuTnO2VqeuLiOuLpC5cbiAgICAvLyBobXItaG9va+yXkCDsnZjtlbQgaW52YWxpZGF0ZeuQnCDrtoDrtoTrk6TsnbQg7JWE64uI652866m0IOy6kOyLnCDqt7jrjIDroZwg7Jyg7KeA7ZWp64uI64ukLlxuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkQXBpcygpO1xuXG4gICAgdGhpcy5zeW5jVUkoKTtcbiAgfVxuXG4gIHJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoXG4gICAgaW52YWxpZGF0ZWRQYXRoOiBBYnNvbHV0ZVBhdGgsXG4gICk6ICh0eXBlb2YgcmVnaXN0ZXJlZEFwaXMpW251bWJlcl1bXSB7XG4gICAgaWYgKCFpbnZhbGlkYXRlZFBhdGguZW5kc1dpdGgoXCIubW9kZWwudHNcIiAvKuyGjOyKpCDsvZTrk5zrpbwg64uk66Oo64qUIOyDge2ZqeydtOuLiCAudHMg6rK966Gc66GcIOu0heuLiOuLpC4qLykpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChpbnZhbGlkYXRlZFBhdGgpO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gcmVnaXN0ZXJlZEFwaXMuZmlsdGVyKChhcGkpID0+IGFwaS5tb2RlbE5hbWUgPT09IGAke2VudGl0eUlkfU1vZGVsYCk7XG4gICAgZm9yIChjb25zdCBhcGkgb2YgdG9SZW1vdmUpIHtcbiAgICAgIHJlZ2lzdGVyZWRBcGlzLnNwbGljZShyZWdpc3RlcmVkQXBpcy5pbmRleE9mKGFwaSksIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB0b1JlbW92ZTtcbiAgfVxuXG4gIGFzeW5jIGNvcHlTaGFyZWRUb1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAvLyDsp4DquIgg6rCA7KC46rCA66Ck64qUIOydtCDtjIzsnbzsnYAgU29uYW11IOy9lOuTnOuyoOydtOyKpOydmCDsnbzrtoDsnoXri4jri6QuXG4gICAgICAvLyDqt7jrn7DrjbAgZGlzdCDsho0g67mM65Oc65CcIOyGjOyKpCDsvZTrk5wg7YyM7J287J20IO2VhOyalO2VnCDqsoPsnbQg7JWE64uI6rOgLCBzcmPsl5Drp4wg7J6I64qUIO2FjeyKpO2KuCDtjIzsnbzsnbQg7ZWE7JqU7ZWp64uI64ukLlxuICAgICAgLy8g65Sw65287IScIC9zcmMv7JeQ7IScIOywvuyKteuLiOuLpC5cbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIGltcG9ydC5tZXRhLmRpcm5hbWUucmVwbGFjZShcIi9kaXN0L1wiLCBcIi9zcmMvXCIpLFxuICAgICAgICBgLi4vc2hhcmVkLyR7dGFyZ2V0fS5zaGFyZWQudHMudHh0YCxcbiAgICAgICk7XG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMoc3JjUGF0aCkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCkpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRyaWVkIHRvIGNvcHkgc29uYW11LnNoYXJlZC50cyB0byB0YXJnZXQgJyR7dGFyZ2V0fScgYnV0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBQbGVhc2UgY2hlY2sgeW91ciBwcm9qZWN0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8g7J206rG0IO2UhOuhnOygne2KuOyXkCAudHMg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWY64qUIOqyg+ydtOuvgOuhnCBzcmPsnZggLnRzIOqyveuhnOuhnCDqsJHri4jri6QuXG4gICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCJzcmMvc2VydmljZXMvc29uYW11LnNoYXJlZC50c1wiKTtcblxuICAgICAgLy8g7KCV66eQIO2YueyLnOuCmOyngOunjCB0YXJnZXQg65SU66CJ7Yag66as64qUIOyeiOyWtOuPhCBzcmMvc2VydmljZXMg65SU66CJ7Yag66as64qUIOyXhuydhCDsiJgg7J6I7Jy866+A66GcIOuvuOumrCDsg53shLHtlbTspI3ri4jri6QuXG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSkpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKHBhdGguZGlybmFtZShkZXN0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLndhcm4oYENyZWF0ZWQgZGlyZWN0b3J5ICcke3BhdGguZGlybmFtZShkZXN0UGF0aCl9JyBiZWNhdXNlIGl0IGRpZCBub3QgZXhpc3QuYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBhcmVGaWxlc1NhbWUoc3JjUGF0aCwgZGVzdFBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZGVzdFBhdGgsIGF3YWl0IHJlYWRGaWxlKHNyY1BhdGgpKTtcblxuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmJsdWUocGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIGRlc3RQYXRoKSksXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRUeXBlcygpIHtcbiAgICB0aGlzLnR5cGVzID0gYXdhaXQgbG9hZFR5cGVzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZE1vZGVscygpIHtcbiAgICB0aGlzLm1vZGVscyA9IGF3YWl0IGxvYWRNb2RlbHMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkQXBpcygpIHtcbiAgICB0aGlzLmFwaXMgPSBhd2FpdCBsb2FkQXBpcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCDsi7Htgazrpbwg7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICog67OA6rK965CcIO2MjOydvOuTpOydhCDtg4DsnoXrs4TroZwg67aE66WY7ZWY6rOgIOqwgSDtg4DsnoXsl5Ag66ee64qUIOyVoeyFmOydhCDsi6Ttlontlanri4jri6QuXG4gICAqIEBwYXJhbSBkaWZmRmlsZVBhdGhzIC0g67OA6rK965CcIO2MjOydvOuTpOydmCDsoIjrjIAg6rK966GcIOuqqeuhnVxuICAgKiBAcmV0dXJucyBkaWZmVHlwZXMgLSDrs4Dqsr3rkJwg7YyM7J287J2YIO2DgOyehSDrqqnroZ0gKGVudGl0eSwgdHlwZXMsIG1vZGVsIOuTsSlcbiAgICovXG4gIGFzeW5jIGRvU3luY0FjdGlvbnMoZGlmZkZpbGVQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHsgZGlmZlR5cGVzOiBzdHJpbmdbXSB9PiB7XG4gICAgY29uc3QgZGlmZkdyb3VwcyA9IHRoaXMuY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZVBhdGhzKTtcbiAgICBjb25zdCBkaWZmVHlwZXMgPSBPYmplY3Qua2V5cyhkaWZmR3JvdXBzKTtcblxuICAgIC8vIO2KuOumrOqxsDogZW50aXR5LCB0eXBlc1xuICAgIC8vIOyVoeyFmDog7Iqk7YKk66eIIOyDneyEsVxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJlbnRpdHlcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRW50aXR5Q2hhbmdlKGRpZmZHcm91cHMsIGRpZmZUeXBlcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiB0eXBlcywgZW51bXMsIGdlbmVyYXRlZCDrs4Dqsr3si5xcbiAgICAvLyDslaHshZg6IO2MjOydvCDsi7HtgawgdHlwZXMsIGVudW1zLCBnZW5lcmF0ZWRcbiAgICBpZiAoXG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJ0eXBlc1wiKSB8fFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnVuY3Rpb25zXCIpIHx8XG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJnZW5lcmF0ZWRcIilcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogbW9kZWxcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwibW9kZWxcIikgfHwgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnJhbWVcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogY29uZmlnXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcImNvbmZpZ1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5hY3Rpb25TeW5jQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpZmZUeXBlcyxcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZXM6IEFic29sdXRlUGF0aFtdKTogRGlmZkdyb3VwcyB7XG4gICAgcmV0dXJuIGdyb3VwKGRpZmZGaWxlcywgKHIpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZWQgPSByLm1hdGNoKC9cXC4obW9kZWx8dHlwZXN8ZnVuY3Rpb25zfGVudGl0eXxnZW5lcmF0ZWR8ZnJhbWV8Y29uZmlnKVxcLlt0al1zLyk7XG4gICAgICByZXR1cm4gbWF0Y2hlZD8uWzFdID8/IFwidW5rbm93blwiO1xuICAgIH0pIGFzIHVua25vd24gYXMgRGlmZkdyb3VwcztcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUVudGl0eUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzLCBkaWZmVHlwZXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUVudGl0eUNoYW5nZVwiLCB7IGRpZmZHcm91cHMsIGRpZmZUeXBlcyB9KTtcblxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAvLyB0eXBlcyDsg53shLEoZW50aXR5IOyDiOuhnCDstpTqsIDrkJwg6rK97JqwKVxuICAgIC8vIHBhcmVudElk6rCAIOyXhuqzoCwgdHlwZXPqsIAg7JeG64qUIOqyveyasOyXkOunjCDsg53shLFcbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChkaWZmR3JvdXBzLmVudGl0eT8uWzBdKTtcblxuICAgIGlmIChlbnRpdHlJZCkge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgLy8g7ZSE66Gc7KCd7Yq47JeQIOyDneyEseuQmOyWtOyVvCDtlZjripQgLnRzIO2MjOydvOydmCDqsr3roZzsnoXri4jri6QuXG4gICAgICBjb25zdCB0eXBlRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke2VudGl0eS5uYW1lcy5mc30vJHtlbnRpdHkubmFtZXMuZnN9LnR5cGVzLnRzYCxcbiAgICAgICk7XG4gICAgICBpZiAoZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgIShhd2FpdCBleGlzdHModHlwZUZpbGVQYXRoKSkpIHtcbiAgICAgICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcImluaXRfdHlwZXNcIiwgeyBlbnRpdHlJZCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2NoZW1hcygpO1xuXG4gICAgZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPSB1bmlxdWUoW1xuICAgICAgLi4uKGRpZmZHcm91cHMuZ2VuZXJhdGVkID8/IFtdKSxcbiAgICAgIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjL2FwcGxpY2F0aW9uL3NvbmFtdS5nZW5lcmF0ZWQudHNcIikgYXMgQWJzb2x1dGVQYXRoLFxuICAgIF0pO1xuICAgIGRpZmZUeXBlcy5wdXNoKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPEZpbGVUeXBlW10+IHtcbiAgICBjb25zdCB0c1BhdGhzID0gdW5pcXVlKFtcbiAgICAgIC4uLihkaWZmR3JvdXBzLnR5cGVzID8/IFtdKSxcbiAgICAgIC4uLihkaWZmR3JvdXBzLmZ1bmN0aW9ucyA/PyBbXSksXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPz8gW10pLFxuICAgIF0pO1xuICAgIE5haXRlLnQoXCJoYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzIH0pO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIHR5cGVzL2Z1bmN0aW9ucy9nZW5lcmF0ZWQgY2hhbmdlczogJHt0c1BhdGhzLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHApKS5qb2luKFwiLCBcIil9YFxuICAgIC8vICAgKVxuICAgIC8vICk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzKTtcblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZVwiLCB7IGRpZmZHcm91cHMgfSk7XG4gICAgY29uc3QgbWVyZ2VkR3JvdXAgPSBbLi4uKGRpZmZHcm91cHMubW9kZWwgPz8gW10pLCAuLi4oZGlmZkdyb3Vwcy5mcmFtZSA/PyBbXSldO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIG1vZGVsL2ZyYW1lIGNoYW5nZXM6ICR7bWVyZ2VkR3JvdXAubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgcCkpLmpvaW4oXCIsIFwiKX1gXG4gICAgLy8gICApXG4gICAgLy8gKTtcblxuICAgIC8vIGdlbmVyYXRlZF9odHRwLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci50eXBlc+ulvCDslIHri4jri6QuXG4gICAgLy8gc2VydmljZS50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIuYXBpc+ulvCDslIHri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICBjb25zdCBwYXJhbXM6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10gPSBtZXJnZWRHcm91cC5tYXAoKG1vZGVsUGF0aCkgPT4ge1xuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiKSkge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChtb2RlbFBhdGgpO1xuICAgICAgICBhc3NlcnQoZW50aXR5SWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlbFBhdGguZW5kc1dpdGgoXCIuZnJhbWUudHNcIikpIHtcbiAgICAgICAgY29uc3QgWywgZnJhbWVOYW1lXSA9IG1vZGVsUGF0aC5tYXRjaCgvLitcXC8oLispXFwuZnJhbWVcXC50cyQvKSA/PyBbXTtcbiAgICAgICAgYXNzZXJ0KGZyYW1lTmFtZSk7XG4gICAgICAgIC8vIGZyYW1lTmFtZeydhCBQYXNjYWxDYXNl66GcIOuzgO2ZmCAoZGFzaGJvYXJkIC0+IERhc2hib2FyZClcbiAgICAgICAgY29uc3QgZnJhbWVJZCA9IGluZmxlY3Rpb24uY2FtZWxpemUoZnJhbWVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChmcmFtZUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCByZWFjaGFibGVcIik7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2VydmljZXMocGFyYW1zKTtcbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlSHR0cHMoKTtcbiAgfVxuXG4gIC8vIHdlYi8uc29uYW11LmVudiDsl5Ag7ZiE7J6sIOyEpOygleqwkiDsoIDsnqVcbiAgYXN5bmMgYWN0aW9uU3luY0NvbmZpZygpIHtcbiAgICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IFNvbmFtdS5jb25maWcuc2VydmVyLmxpc3RlbiA/PyB7fTtcbiAgICBjb25zdCBjb250ZW50ID0gYEFQSV9IT1NUPSR7aG9zdCA/PyBcImxvY2FsaG9zdFwifVxcbkFQSV9QT1JUPSR7cG9ydCA/PyAzMDAwfWA7XG5cbiAgICBOYWl0ZS50KFwiYWN0aW9uU3luY0NvbmZpZ1wiLCB7IGNvbnRlbnQgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBTb25hbXUuY29uZmlnLnN5bmMudGFyZ2V0cy5tYXAoYXN5bmMgKHRhcmdldCkgPT4ge1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcIi5zb25hbXUuZW52XCIpLCBjb250ZW50KTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogc29uYW11LmdlbmVyYXRlZC50c+yZgCBzb25hbXUuZ2VuZXJhdGVkLnNzby50c+ulvCDsg53shLHtlanri4jri6QuXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlU2NoZW1hcygpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgZ2VuZXJhdGVUZW1wbGF0ZShcImdlbmVyYXRlZF9zc29cIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KSxcbiAgICAgIF0pXG4gICAgKVxuICAgICAgLmZsYXQoKVxuICAgICAgLmZsYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAqLnNlcnZpY2UudHPrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gcGFyYW1zQXJyYXlcbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyhcbiAgICBwYXJhbXNBcnJheToge1xuICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICAgIH1bXSxcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIE5haXRlLnQoXCJhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzXCIsIHBhcmFtc0FycmF5KTtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHBhcmFtc0FycmF5Lm1hcChhc3luYyAocGFyYW1zKSA9PlxuICAgICAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJzZXJ2aWNlXCIsIHBhcmFtcyBhcyBUZW1wbGF0ZU9wdGlvbnNbXCJzZXJ2aWNlXCJdLCB7XG4gICAgICAgICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApXG4gICAgKVxuICAgICAgLmZsYXQoKVxuICAgICAgLmZsYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUuZ2VuZXJhdGVkLmh0dHDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlSHR0cHMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGg+IHtcbiAgICBjb25zdCBbcmVzXSA9IGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXG4gICAgICBcImdlbmVyYXRlZF9odHRwXCIsXG4gICAgICB7IGVudGl0eUlkOiBcImR1bW15XCIgfSxcbiAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH0sXG4gICAgKTtcbiAgICBhc3NlcnQocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqICoudHlwZXMudHMsICouZnVuY3Rpb25zLnRzLCAqLmdlbmVyYXRlZC50c+ulvCDtg4Dqsp8g65SU66CJ7Yag66as7JeQIOuzteyCrO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIHRzUGF0aHNcbiAgICogQHJldHVybnMg67O17IKs65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHM6IEFic29sdXRlUGF0aFtdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgIGNvbnN0IHsgZGlyOiBhcGlEaXIgfSA9IFNvbmFtdS5jb25maWcuYXBpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB0YXJnZXRzLm1hcChhc3luYyAodGFyZ2V0KSA9PlxuICAgICAgICAgIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgdHNQYXRocy5tYXAoYXN5bmMgKHJlYWxTcmMpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZHN0ID0gcmVhbFNyY1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGAvJHthcGlEaXJ9L2AsIGAvJHt0YXJnZXR9L2ApXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIvYXBwbGljYXRpb24vXCIsIFwiL3NlcnZpY2VzL1wiKTtcbiAgICAgICAgICAgICAgY29uc3QgZGlyID0gZGlybmFtZShkc3QpO1xuICAgICAgICAgICAgICBpZiAoIShhd2FpdCBleGlzdHMoZGlyKSkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShkc3QucmVwbGFjZShgJHtTb25hbXUuYXBwUm9vdFBhdGh9L2AsIFwiXCIpKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQocmVhbFNyYywgZHN0KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGRzdDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApXG4gICAgKS5mbGF0KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQoZnJvbVBhdGg6IHN0cmluZywgdG9QYXRoOiBzdHJpbmcpIHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMoZnJvbVBhdGgpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZEZpbGVDb250ZW50ID0gKGF3YWl0IHJlYWRGaWxlKGZyb21QYXRoKSkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IG5ld0ZpbGVDb250ZW50ID0gKCgpID0+IHtcbiAgICAgIC8vIHdlYuydtOuCmCBhcHAg65Ox7JeQ64qUIHNvbmFtdeqwgCDsl4bsirXri4jri6QuXG4gICAgICAvLyDrlLDrnbzshJwgc29uYW117JeQIOuMgO2VnCBpbXBvcnTripQg7ZWo6ruYIOuzteyCrOuQmOuKlCBzb25hbXUuc2hhcmVkLnRz7JeQIOuMgO2VnCBpbXBvcnTroZwg7LmY7ZmY7ZW07JW8IO2VqeuLiOuLpC5cbiAgICAgIC8vIOusuOygnOuKlCDrpqzshozsiqQg7KKF66WY7JeQIOuUsOudvCBzb25hbXUuc2hhcmVkLnRz66GcIOqwgOuKlCDqsr3roZzqsIAg64uk66W064uk64qUIOygkOyeheuLiOuLpC5cbiAgICAgIC8vIOyYiOulvCDrk6TslrQgc29uYW11LmdlbmVyYXRlZC50cyDsnoXsnqXsl5DshJwgc29uYW11LnNoYXJlZC50c+uKlCDqsJnsnYAg65SU66CJ7Yag66as7JeQIOyeiOycvOuLiCAuL3NvbmFtdS5zaGFyZWTroZwg7LmY7ZmY7ZWY66m0IOuQmOyngOunjCxcbiAgICAgIC8vIHVzZXIudHlwZXMudHMg7J6F7J6l7JeQ7IScIHNvbmFtdS5zaGFyZWQudHPripQg7IOB7JyEIOuUlOugie2GoOumrOyXkCDsnojsnLzri4ggLi4vc29uYW11LnNoYXJlZOuhnCDsuZjtmZjtlbTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g7J20IOusuOygnOulvCDtlbTqsrDtlZjquLAg7JyE7ZW0IOuzteyCrO2VmOqzoOyekCDtlZjripQg66as7IaM7Iqk7J2YIOqyveuhnCh0b1BhdGgp66W8IOq4sOykgOycvOuhnCBzb25hbXUuc2hhcmVkLnRz6rCAIOyeiOuKlCDrlJTroInthqDrpqzrpbwg7LC+7JWE7IScIOyDgeuMgCDqsr3roZzrpbwg6rOE7IKw7ZWY64+E66GdIO2VmOyYgOyKteuLiOuLpC5cbiAgICAgIGNvbnN0IHNlcnZpY2VzRGlyID0gdG9QYXRoLnJlcGxhY2UoL1xcL3NlcnZpY2VzXFwvLiokLywgXCIvc2VydmljZXNcIik7XG4gICAgICBjb25zdCBmaWxlRGlyID0gZGlybmFtZSh0b1BhdGgpO1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShmaWxlRGlyLCBzZXJ2aWNlc0Rpcik7XG4gICAgICBjb25zdCBzaGFyZWRQYXRoID0gcmVsYXRpdmVQYXRoID09PSBcIlwiID8gXCIuL3NvbmFtdS5zaGFyZWRcIiA6IGAke3JlbGF0aXZlUGF0aH0vc29uYW11LnNoYXJlZGA7XG5cbiAgICAgIGNvbnN0IG5mYyA9IG9sZEZpbGVDb250ZW50LnJlcGxhY2UoL2Zyb20gXCJzb25hbXVcIi9nLCBgZnJvbSBcIiR7c2hhcmVkUGF0aH1cImApO1xuICAgICAgcmV0dXJuIG5mYztcbiAgICB9KSgpO1xuICAgIHJldHVybiB3cml0ZUZpbGUodG9QYXRoLCBuZXdGaWxlQ29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDthZztlIzrpr8g7YKk7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZUtleSDthZztlIzrpr8g7YKkXG4gICAqIEBwYXJhbSBlbnVtSWQg7Je06rGw7ZiVIElEXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHNHZW5Db2RlKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVLZXk6IFRlbXBsYXRlS2V5LFxuICAgIGVudW1JZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IHN1YlBhdGg6IHN0cmluZzsgZnVsbFBhdGg6IHN0cmluZzsgaXNFeGlzdHM6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBnZW5QYXRoIH0gPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KHRlbXBsYXRlS2V5KS5nZXRUYXJnZXRBbmRQYXRoKFxuICAgICAgRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICBlbnVtSWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHN1YlBhdGggPSBwYXRoLmpvaW4odGFyZ2V0LCBnZW5QYXRoKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHN1YlBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWJQYXRoLFxuICAgICAgZnVsbFBhdGgsXG4gICAgICBpc0V4aXN0czogYXdhaXQgZXhpc3RzKGZ1bGxQYXRoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7Je06rGw7ZiV7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSBlbnVtcyDsl7TqsbDtmJUg66CI7J2067iUXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHMoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICBlbnVtczoge1xuICAgICAgW25hbWU6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+Pj47XG4gICAgfSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8YCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCwgYm9vbGVhbj4+IHtcbiAgICBjb25zdCBrZXlzOiBUZW1wbGF0ZUtleVtdID0gVGVtcGxhdGVLZXkub3B0aW9ucztcbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuICAgIGNvbnN0IGVudW1zS2V5cyA9IE9iamVjdC5rZXlzKGVudW1zKS5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09IG5hbWVzLmNvbnN0YW50KTtcblxuICAgIHJldHVybiBhd2FpdCByZWR1Y2VBc3luYyhcbiAgICAgIGtleXMsXG4gICAgICBhc3luYyAocmVzdWx0LCBrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdHBsID0gVGVtcGxhdGVNYW5hZ2VyLmdldChrZXkpO1xuICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJ2aWV3X2VudW1zXCIpKSB7XG4gICAgICAgICAgYXdhaXQgbWFwQXN5bmMoZW51bXNLZXlzLCBhc3luYyAoY29tcG9uZW50SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcywgY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmVzdWx0W2Ake2tleX1fXyR7Y29tcG9uZW50SWR9YF0gPSBhd2FpdCBleGlzdHMoXG4gICAgICAgICAgICAgIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMpO1xuICAgICAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgICAgICAgaWYgKHRhcmdldC5pbmNsdWRlcyhcIjp0YXJnZXRcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyh0YXJnZXRzLCBhc3luYyAodCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0W2Ake2tleX1fXyR7dH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LnJlcGxhY2UoXCI6dGFyZ2V0XCIsIHQpLCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBhd2FpdCBleGlzdHMocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHt9IGFzIFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPixcbiAgICApO1xuICB9XG5cbiAgc3luY1VJKCkge1xuICAgIGNvbnN0IHVpUG9ydCA9IFNvbmFtdS5jb25maWcudWk/LnBvcnQgPz8gNTcwMDA7XG5cbiAgICBpZiAoIWlzVGVzdCgpKSB7XG4gICAgICBmZXRjaChgaHR0cDovLzEyNy4wLjAuMToke3VpUG9ydH0vYXBpL3JlbG9hZGAsIHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgfSkuY2F0Y2goKGUpID0+IGNvbnNvbGUubG9nKGNoYWxrLmRpbShgRmFpbGVkIHRvIHJlbG9hZCBTb25hbXUgVUk6ICR7ZS5tZXNzYWdlfWApKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50aXR5KGZvcm06IFRlbXBsYXRlT3B0aW9uc1tcImVudGl0eVwiXSkge1xuICAgIHJldHVybiBhd2FpdCBjcmVhdGVFbnRpdHkoZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBkZWxFbnRpdHkoZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8eyBkZWxQYXRoczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiBhd2FpdCBkZWxFbnRpdHkoZW50aXR5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMsIF9nZW5lcmF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGU8VCBleHRlbmRzIGtleW9mIFRlbXBsYXRlT3B0aW9ucz4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICApOiBQcm9taXNlPFBhdGhBbmRDb2RlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZGVyVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZXdDaGVja3N1bXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJob3QiLCJhc3NlcnQiLCJjaGFsayIsIm1rZGlyIiwicmVhZEZpbGUiLCJ3cml0ZUZpbGUiLCJpbmZsZWN0aW9uIiwibWluaW1hdGNoIiwicGF0aCIsImRpcm5hbWUiLCJncm91cCIsInVuaXF1ZSIsInJlZ2lzdGVyZWRBcGlzIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiVGVtcGxhdGVNYW5hZ2VyIiwiVGVtcGxhdGVLZXkiLCJtYXBBc3luYyIsInJlZHVjZUFzeW5jIiwiY2VudGVyVGV4dCIsImlzVGVzdCIsImV4aXN0cyIsInJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIiwiYXJlRmlsZXNTYW1lIiwiZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zIiwicmVuZXdDaGVja3N1bXMiLCJnZW5lcmF0ZVRlbXBsYXRlIiwicmVuZGVyVGVtcGxhdGUiLCJjcmVhdGVFbnRpdHkiLCJkZWxFbnRpdHkiLCJnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIiwibG9hZEFwaXMiLCJsb2FkTW9kZWxzIiwibG9hZFR5cGVzIiwiU3luY2VyIiwiYXBpcyIsInR5cGVzIiwibW9kZWxzIiwiaXNTeW5jaW5nIiwic3luYyIsInRhcmdldHMiLCJjb25maWciLCJjb3B5U2hhcmVkVG9UYXJnZXRzIiwiY2hhbmdlZEZpbGVzIiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsImJsYWNrIiwiYmdHcmVlbiIsImRvU3luY0FjdGlvbnMiLCJ3aGVuVGhpc0hhcHBlbnMiLCJ3YWl0Rm9yVXBUbyIsInN5bmNGcm9tV2F0Y2hlciIsImV2ZW50IiwiZGlmZkZpbGVQYXRoIiwiaW52YWxpZGF0ZWRQYXRocyIsImludmFsaWRhdGVGaWxlIiwiYm9sZCIsImludmFsaWRhdGVkUGF0aCIsInJlbW92ZWRBcGlzIiwicmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyIsImJsdWUiLCJyZWxhdGl2ZSIsImFwaVJvb3RQYXRoIiwiZ3JheSIsImlzSW5DaGVja1BhdHRlcm5Hcm91cCIsIk9iamVjdCIsInZhbHVlcyIsInNvbWUiLCJwYXR0ZXJuIiwiYXV0b2xvYWRUeXBlcyIsImF1dG9sb2FkTW9kZWxzIiwiYXV0b2xvYWRBcGlzIiwic3luY1VJIiwiZW5kc1dpdGgiLCJlbnRpdHlJZCIsImdldEVudGl0eUlkRnJvbVBhdGgiLCJ0b1JlbW92ZSIsImZpbHRlciIsImFwaSIsIm1vZGVsTmFtZSIsInNwbGljZSIsImluZGV4T2YiLCJ0YXJnZXQiLCJzcmNQYXRoIiwiam9pbiIsInJlcGxhY2UiLCJhcHBSb290UGF0aCIsIkVycm9yIiwiZGVzdFBhdGgiLCJyZWN1cnNpdmUiLCJ3YXJuIiwiZGlmZkZpbGVQYXRocyIsImRpZmZHcm91cHMiLCJjYWxjdWxhdGVEaWZmR3JvdXBzIiwiZGlmZlR5cGVzIiwia2V5cyIsImluY2x1ZGVzIiwiaGFuZGxlRW50aXR5Q2hhbmdlIiwiaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlIiwiaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlIiwiYWN0aW9uU3luY0NvbmZpZyIsImRpZmZGaWxlcyIsInIiLCJtYXRjaGVkIiwibWF0Y2giLCJ0IiwicmVsb2FkIiwiZW50aXR5IiwiZ2V0IiwidHlwZUZpbGVQYXRoIiwibmFtZXMiLCJmcyIsInBhcmVudElkIiwidW5kZWZpbmVkIiwiYWN0aW9uR2VuZXJhdGVTY2hlbWFzIiwiZ2VuZXJhdGVkIiwicHVzaCIsInRzUGF0aHMiLCJmdW5jdGlvbnMiLCJhY3Rpb25TeW5jRmlsZXNUb1RhcmdldHMiLCJtZXJnZWRHcm91cCIsIm1vZGVsIiwiZnJhbWUiLCJwYXJhbXMiLCJtYXAiLCJtb2RlbFBhdGgiLCJuYW1lc1JlY29yZCIsImdldE5hbWVzRnJvbUlkIiwiZnJhbWVOYW1lIiwiZnJhbWVJZCIsImNhbWVsaXplIiwiYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyIsImFjdGlvbkdlbmVyYXRlSHR0cHMiLCJob3N0IiwicG9ydCIsInNlcnZlciIsImxpc3RlbiIsImNvbnRlbnQiLCJQcm9taXNlIiwiYWxsIiwib3ZlcndyaXRlIiwiZmxhdCIsInBhcmFtc0FycmF5IiwicmVzIiwiZGlyIiwiYXBpRGlyIiwicmVhbFNyYyIsImRzdCIsImNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQiLCJmcm9tUGF0aCIsInRvUGF0aCIsIm9sZEZpbGVDb250ZW50IiwidG9TdHJpbmciLCJuZXdGaWxlQ29udGVudCIsInNlcnZpY2VzRGlyIiwiZmlsZURpciIsInJlbGF0aXZlUGF0aCIsInNoYXJlZFBhdGgiLCJuZmMiLCJjaGVja0V4aXN0c0dlbkNvZGUiLCJ0ZW1wbGF0ZUtleSIsImVudW1JZCIsImdlblBhdGgiLCJnZXRUYXJnZXRBbmRQYXRoIiwic3ViUGF0aCIsImZ1bGxQYXRoIiwiaXNFeGlzdHMiLCJjaGVja0V4aXN0cyIsImVudW1zIiwib3B0aW9ucyIsImVudW1zS2V5cyIsIm5hbWUiLCJjb25zdGFudCIsInJlc3VsdCIsImtleSIsInRwbCIsInN0YXJ0c1dpdGgiLCJjb21wb25lbnRJZCIsInAiLCJ1aVBvcnQiLCJ1aSIsImZldGNoIiwibWV0aG9kIiwiY2F0Y2giLCJlIiwiZGltIiwibWVzc2FnZSIsImZvcm0iLCJ0ZW1wbGF0ZU9wdGlvbnMiLCJfZ2VuZXJhdGVPcHRpb25zIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxHQUFHLFFBQVEsdUJBQXVCO0FBQzNDLE9BQU9DLFlBQVksU0FBUztBQUM1QixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBU0MsS0FBSyxFQUFFQyxRQUFRLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUN6RCxPQUFPQyxnQkFBZ0IsYUFBYTtBQUNwQyxTQUFTQyxTQUFTLFFBQVEsWUFBWTtBQUN0QyxPQUFPQyxRQUFRQyxPQUFPLFFBQVEsT0FBTztBQUNyQyxTQUFTQyxLQUFLLEVBQUVDLE1BQU0sUUFBUSxVQUFVO0FBRXhDLFNBQVNDLGNBQWMsUUFBUSx1QkFBb0I7QUFDbkQsU0FBU0MsTUFBTSxRQUFRLG1CQUFnQjtBQUN2QyxTQUFTQyxhQUFhLFFBQWdDLDhCQUEyQjtBQUNqRixTQUFTQyxLQUFLLFFBQVEsb0JBQWlCO0FBQ3ZDLFNBQVNDLGVBQWUsUUFBUSxrQ0FBK0I7QUFFL0QsU0FBU0MsV0FBVyxRQUE4QixvQkFBaUI7QUFDbkUsU0FBU0MsUUFBUSxFQUFFQyxXQUFXLFFBQVEsMEJBQXVCO0FBQzdELFNBQVNDLFVBQVUsUUFBUSwyQkFBd0I7QUFDbkQsU0FBU0MsTUFBTSxRQUFRLHlCQUFzQjtBQUM3QyxTQUFTQyxNQUFNLFFBQVEsdUJBQW9CO0FBRTNDLFNBQVNDLHVCQUF1QixRQUFRLDRCQUF5QjtBQUNqRSxTQUFTQyxZQUFZLEVBQUVDLDhCQUE4QixFQUFFQyxjQUFjLFFBQVEsZ0JBQWE7QUFDMUYsU0FBU0MsZ0JBQWdCLEVBQUVDLGNBQWMsUUFBUSxzQkFBbUI7QUFDcEUsU0FBU0MsWUFBWSxFQUFFQyxTQUFTLFFBQVEseUJBQXNCO0FBQzlELFNBQXdCQyxxQ0FBcUMsUUFBUSxxQkFBa0I7QUFDdkYsU0FJRUMsUUFBUSxFQUNSQyxVQUFVLEVBQ1ZDLFNBQVMsUUFDSixx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
445
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCBwYXRoLCB7IGRpcm5hbWUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGFyZUZpbGVzU2FtZSwgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zLCByZW5ld0NoZWNrc3VtcyB9IGZyb20gXCIuL2NoZWNrc3VtXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRlbXBsYXRlLCByZW5kZXJUZW1wbGF0ZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHksIGRlbEVudGl0eSB9IGZyb20gXCIuL2VudGl0eS1vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlLCBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBMb2FkZWRBcGlzLFxuICB0eXBlIExvYWRlZE1vZGVscyxcbiAgdHlwZSBMb2FkZWRUeXBlcyxcbiAgbG9hZEFwaXMsXG4gIGxvYWRNb2RlbHMsXG4gIGxvYWRUeXBlcyxcbiAgbG9hZFdvcmtmbG93cyxcbn0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuXG50eXBlIERpZmZHcm91cHMgPSB7XG4gIFtrZXkgaW4gRmlsZVR5cGVdOiBBYnNvbHV0ZVBhdGhbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW5jZXIge1xuICBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuICB3b3JrZmxvd3M6IE1hcDxzdHJpbmcsIFdvcmtmbG93TWV0YWRhdGFbXT4gPSBuZXcgTWFwKCk7XG4gIGlzU3luY2luZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiDssrTtgazshKzsnbQg67OA6rK965CcIOu2gOu2hOyXkCDrjIDtlbQg7Iux7YGs66W8IOynhO2Wie2VqeuLiOuLpC5cbiAgICog64uk66eMIHNvbmFtdS5zaGFyZWQudHPripQg7LK07YGs7ISsIOu5hOq1kCDsl4bsnbQg66y07KGw6rG0IOyLse2BrCjrs7Xsgqwp7ZWp64uI64ukLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcblxuICAgIC8vIHNvbmFtdS5zaGFyZWQudHPripQg66y07KGw6rG0IOyLse2BrCjrs7Xsgqwp7ZWp64uI64ukLlxuICAgIGF3YWl0IHRoaXMuY29weVNoYXJlZFRvVGFyZ2V0cyh0YXJnZXRzKTtcblxuICAgIC8vIOq3uCDri6TsnYzrtoDthLDripQg67OA6rK965CcIO2MjOydvOydhCDssL7slYTshJwg64+Z6riw7ZmUIOyekeyXheydhCDsi6Ttlontlanri4jri6QuXG4gICAgY29uc3QgY2hhbmdlZEZpbGVzID0gYXdhaXQgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zKCk7XG4gICAgaWYgKGNoYW5nZWRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChcIkFsbCBmaWxlcyBhcmUgc3luY2VkIVwiKSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOunjOyVvSDsi7Htgawg7KSR7JeQIO2UhOuhnOyEuOyKpOqwgCDso73snLzrqbQg6rys7Jes67KE66as6riwIOuVjOusuOyXkCxcbiAgICAvLyDsi5zqt7jrhJDsl5Drj4Qg7J6g7IucIOuyhO2LuCDsiJgg7J6I64qUIO2ZmOqyvSDsho3sl5DshJwg7Iux7YGs66W8IOyLpO2Wie2VqeuLiOuLpC5cbiAgICBhd2FpdCBydW5XaXRoR3JhY2VmdWxTaHV0ZG93bihcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8g7JaY6rCAIOyLse2BrCDsnpHsl4Ug7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICAgICAgYXdhaXQgdGhpcy5kb1N5bmNBY3Rpb25zKGNoYW5nZWRGaWxlcyk7XG5cbiAgICAgICAgLy8g7Iux7YGsIOyVoeyFmOydtCDrgZ3rgpjrqbQg7ZWt7IOBIOyytO2BrOyErOydhCDri6Tsi5wg6rCx7Iug7ZWp64uI64ukLlxuICAgICAgICBhd2FpdCByZW5ld0NoZWNrc3VtcygpO1xuICAgICAgfSxcbiAgICAgIHsgd2hlblRoaXNIYXBwZW5zOiBcIlNJR1VTUjJcIiwgd2FpdEZvclVwVG86IDIwMDAwIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaGVy6rCAIOqwkOyngO2VnCDtjIzsnbwg67OA6rK9IOyCrO2VreyXkCDrjIDtlbQg7Iux7YGs66W8IOynhO2Wie2VqeuLiOuLpC5cbiAgICog7KO87Ja07KeEIOuzgOqyvSDtjIzsnbzrk6Qg7KSRIOyytO2BrOyErCDqtIDrpqwg64yA7IOB7J24IOqyg+uTpOunjCDqsIDsoLjri6TqsIAg7Iux7YGs66W8IOynhO2Wie2VqeuLiOuLpC5cbiAgICog7LK07YGs7ISsIO2MjOydvCDsl4XrjbDsnbTtirjripQg7Jes6riw7JeQ7IScIO2VmOyngCDslYrsirXri4jri6QuIO2YuOy2nOyekOqwgCDtlanri4jri6QuXG4gICAqIEBwYXJhbSBkaWZmRmlsZVBhdGggLSDrs4Dqsr0g7YyM7J2865OkLiDtlITroZzsoJ3tirgg66Oo7Yq467aA7YSwIFwic3JjL1wiIOuYkOuKlCBcImRpc3QvXCLroZwg7Iuc7J6R7ZWY64qUIOyDgeuMgCDqsr3roZzsnoXri4jri6QuIOyYiOyLnDogXCJzcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJcbiAgICovXG4gIGFzeW5jIHN5bmNGcm9tV2F0Y2hlcihldmVudDogc3RyaW5nLCBkaWZmRmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChldmVudCAhPT0gXCJjaGFuZ2VcIiAmJiBldmVudCAhPT0gXCJhZGRcIiAmJiBldmVudCAhPT0gXCJ1bmxpbmtcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOydvOuLqCDrs4Dqsr3rkJwg7YyM7J286rO8IGRlcGVuZGVudCDtjIzsnbzrk6TsnYQgaW52YWxpZGF0ZSDtlanri4jri6QuXG4gICAgLy8g7ZWcIOuyiCDsnbTsg4EgaW1wb3J065CcIOy5nOq1rOuTpOyXkCDrjIDtlbTshJzrp4wg7Iuk7KCcIOyekeyXheydtCDsnbzslrTrgqnri4jri6QuXG4gICAgLy8g6re465+s64uIIOyViOyLrO2VmOqzoCBpbnZhbGlkYXRlIO2VtOuPhCDrkKnri4jri6QuXG4gICAgLy8g7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnOuKlCBob3QuaW52YWxpZGF0ZUZpbGXsi5wg7LSI6riwIOyXkOufrOqwgCDrsJzsg53tlZjquLAg65WM66y47JeQIGludmFsaWRhdGUg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICBpZiAoIWlzVGVzdCgpKSB7XG4gICAgICBjb25zdCBpbnZhbGlkYXRlZFBhdGhzID0gKGF3YWl0IGhvdC5pbnZhbGlkYXRlRmlsZShkaWZmRmlsZVBhdGgsIGV2ZW50KSkgYXMgQWJzb2x1dGVQYXRoW107XG5cbiAgICAgIGlmIChpbnZhbGlkYXRlZFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChg8J+UhCBJbnZhbGlkYXRlZDpgKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBpbnZhbGlkYXRlZFBhdGggb2YgaW52YWxpZGF0ZWRQYXRocykge1xuICAgICAgICAgIC8vIOunjOyVvSBtb2RlbC50cyDtjIzsnbzsnbQg67OA6rK9KGludmFsaWRhdGUp65CY7JeI64ukPyDqt7jrn6zrqbQgcmVnaXN0ZXJlZEFwaXMg7KSR7JeQ7IScIOydtCDrqqjrjbjsl5Ag7ZW064u57ZWY64qUIGFwaeuTpOydgCDsp4Dsm4zspJjsmpQuXG4gICAgICAgICAgLy8gcmVnaXN0ZXJlZEFwaXPripQg7Ya17Jy866GcIOuLpCDrgqDroKTrsoTrprQg7IiYIOyXhuyKteuLiOuLpC4gcmVnaXN0ZXJlZEFwaXPsl5Ag7Jis65287Jik64qUIOy5nOq1rOuTpOydgCDstIjquLAg66Gc65Oc7IucIOuYkOuKlCBITVLsi5zsl5Drp4wg65Ox66Gd65CY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICAgICAgICAvLyDrlLDrnbzshJwgbW9kZWwudHMg7YyM7J287J2YIOuzgOqyveycvOuhnCDri6TsnYzrsogg7IOI66Gc7Jq0IGV2YWzsnbQg7JiI7IOB65CY64qUIOydtCDsi5zsoJDsl5DshJzrp4wsIOydtCDrqqjrjbjsl5DshJwg64KY7JioIHJlZ2lzdGVyZWRBcGlz65Ok7J2EIOyngOybjOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAgIGNvbnN0IHJlbW92ZWRBcGlzID0gdGhpcy5yZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzKGludmFsaWRhdGVkUGF0aCk7XG4gICAgICAgICAgaWYgKHJlbW92ZWRBcGlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay5ibHVlKGAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGludmFsaWRhdGVkUGF0aCl9YCksXG4gICAgICAgICAgICAgIGNoYWxrLmdyYXkoYCh3aXRoICR7cmVtb3ZlZEFwaXMubGVuZ3RofSBBUElzKWApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc0luQ2hlY2tQYXR0ZXJuR3JvdXAgPSBPYmplY3QudmFsdWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkuc29tZShcbiAgICAgIChwYXR0ZXJuKSA9PiBtaW5pbWF0Y2goZGlmZkZpbGVQYXRoLCBwYXR0ZXJuKSxcbiAgICApO1xuXG4gICAgLy8g7ZWgIOydvChzeW5jKeydtCDsnojsnLzrqbQg7ZWp64uI64ukLlxuICAgIGlmIChpc0luQ2hlY2tQYXR0ZXJuR3JvdXApIHtcbiAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhbZGlmZkZpbGVQYXRoXSk7XG4gICAgfVxuXG4gICAgLy8g7Iux7YGsIOyekeyXheydtCDrgZ3rgpjrqbQg66qo65OgIOuqqOuTiOydhCDroZzrk5ztlanri4jri6QuXG4gICAgLy8gaG1yLWhvb2vsl5Ag7J2Y7ZW0IGludmFsaWRhdGXrkJwg67aA67aE65Ok7J20IOyVhOuLiOudvOuptCDsupDsi5wg6re464yA66GcIOycoOyngO2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG5cbiAgICB0aGlzLnN5bmNVSSgpO1xuICB9XG5cbiAgcmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhcbiAgICBpbnZhbGlkYXRlZFBhdGg6IEFic29sdXRlUGF0aCxcbiAgKTogKHR5cGVvZiByZWdpc3RlcmVkQXBpcylbbnVtYmVyXVtdIHtcbiAgICBpZiAoIWludmFsaWRhdGVkUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiIC8q7IaM7IqkIOy9lOuTnOulvCDri6Tro6jripQg7IOB7Zmp7J2064uIIC50cyDqsr3roZzroZwg67SF64uI64ukLiovKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGludmFsaWRhdGVkUGF0aCk7XG4gICAgY29uc3QgdG9SZW1vdmUgPSByZWdpc3RlcmVkQXBpcy5maWx0ZXIoKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gYCR7ZW50aXR5SWR9TW9kZWxgKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiB0b1JlbW92ZSkge1xuICAgICAgcmVnaXN0ZXJlZEFwaXMuc3BsaWNlKHJlZ2lzdGVyZWRBcGlzLmluZGV4T2YoYXBpKSwgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvUmVtb3ZlO1xuICB9XG5cbiAgYXN5bmMgY29weVNoYXJlZFRvVGFyZ2V0cyh0YXJnZXRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIC8vIOyngOq4iCDqsIDsoLjqsIDroKTripQg7J20IO2MjOydvOydgCBTb25hbXUg7L2U65Oc67Kg7J207Iqk7J2YIOydvOu2gOyeheuLiOuLpC5cbiAgICAgIC8vIOq3uOufsOuNsCBkaXN0IOyGjSDruYzrk5zrkJwg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnbQg7ZWE7JqU7ZWcIOqyg+ydtCDslYTri4jqs6AsIHNyY+yXkOunjCDsnojripQg7YWN7Iqk7Yq4IO2MjOydvOydtCDtlYTsmpTtlanri4jri6QuXG4gICAgICAvLyDrlLDrnbzshJwgL3NyYy/sl5DshJwg7LC+7Iq164uI64ukLlxuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgICAgIGAuLi9zaGFyZWQvJHt0YXJnZXR9LnNoYXJlZC50cy50eHRgLFxuICAgICAgKTtcbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNQYXRoKSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0KSkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVHJpZWQgdG8gY29weSBzb25hbXUuc2hhcmVkLnRzIHRvIHRhcmdldCAnJHt0YXJnZXR9JyBidXQgdGhlIHRhcmdldCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIFBsZWFzZSBjaGVjayB5b3VyIHByb2plY3QgZGlyZWN0b3J5IHN0cnVjdHVyZS5gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyDsnbTqsbQg7ZSE66Gc7KCd7Yq47JeQIC50cyDshozsiqQg7L2U65OcIO2MjOydvOydhCDsg53shLHtlZjripQg6rKD7J2066+A66GcIHNyY+ydmCAudHMg6rK966Gc66GcIOqwkeuLiOuLpC5cbiAgICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcInNyYy9zZXJ2aWNlcy9zb25hbXUuc2hhcmVkLnRzXCIpO1xuXG4gICAgICAvLyDsoJXrp5Ag7Zi57Iuc64KY7KeA66eMIHRhcmdldCDrlJTroInthqDrpqzripQg7J6I7Ja064+EIHNyYy9zZXJ2aWNlcyDrlJTroInthqDrpqzripQg7JeG7J2EIOyImCDsnojsnLzrr4DroZwg66+466asIOyDneyEse2VtOykjeuLiOuLpC5cbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhwYXRoLmRpcm5hbWUoZGVzdFBhdGgpKSkpIHtcbiAgICAgICAgYXdhaXQgbWtkaXIocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUud2FybihgQ3JlYXRlZCBkaXJlY3RvcnkgJyR7cGF0aC5kaXJuYW1lKGRlc3RQYXRoKX0nIGJlY2F1c2UgaXQgZGlkIG5vdCBleGlzdC5gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IGFyZUZpbGVzU2FtZShzcmNQYXRoLCBkZXN0UGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHdyaXRlRmlsZShkZXN0UGF0aCwgYXdhaXQgcmVhZEZpbGUoc3JjUGF0aCkpO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgZGVzdFBhdGgpKSxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFR5cGVzKCkge1xuICAgIHRoaXMudHlwZXMgPSBhd2FpdCBsb2FkVHlwZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkTW9kZWxzKCkge1xuICAgIHRoaXMubW9kZWxzID0gYXdhaXQgbG9hZE1vZGVscygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRBcGlzKCkge1xuICAgIHRoaXMuYXBpcyA9IGF3YWl0IGxvYWRBcGlzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFdvcmtmbG93cygpIHtcbiAgICB0aGlzLndvcmtmbG93cyA9IGF3YWl0IGxvYWRXb3JrZmxvd3MoKTtcbiAgICBhd2FpdCBTb25hbXUud29ya2Zsb3dzLnN5bmNocm9uaXplKHRoaXMud29ya2Zsb3dzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsi6TsoJwg7Iux7YGs66W8IOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAqIOuzgOqyveuQnCDtjIzsnbzrk6TsnYQg7YOA7J6F67OE66GcIOu2hOulmO2VmOqzoCDqsIEg7YOA7J6F7JeQIOunnuuKlCDslaHshZjsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRocyAtIOuzgOqyveuQnCDtjIzsnbzrk6TsnZgg7KCI64yAIOqyveuhnCDrqqnroZ1cbiAgICogQHJldHVybnMgZGlmZlR5cGVzIC0g67OA6rK965CcIO2MjOydvOydmCDtg4DsnoUg66qp66GdIChlbnRpdHksIHR5cGVzLCBtb2RlbCDrk7EpXG4gICAqL1xuICBhc3luYyBkb1N5bmNBY3Rpb25zKGRpZmZGaWxlUGF0aHM6IEFic29sdXRlUGF0aFtdKTogUHJvbWlzZTx7IGRpZmZUeXBlczogc3RyaW5nW10gfT4ge1xuICAgIGNvbnN0IGRpZmZHcm91cHMgPSB0aGlzLmNhbGN1bGF0ZURpZmZHcm91cHMoZGlmZkZpbGVQYXRocyk7XG4gICAgY29uc3QgZGlmZlR5cGVzID0gT2JqZWN0LmtleXMoZGlmZkdyb3Vwcyk7XG5cbiAgICAvLyDtirjrpqzqsbA6IGVudGl0eSwgdHlwZXNcbiAgICAvLyDslaHshZg6IOyKpO2CpOuniCDsg53shLFcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwiZW50aXR5XCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUVudGl0eUNoYW5nZShkaWZmR3JvdXBzLCBkaWZmVHlwZXMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogdHlwZXMsIGVudW1zLCBnZW5lcmF0ZWQg67OA6rK97IucXG4gICAgLy8g7JWh7IWYOiDtjIzsnbwg7Iux7YGsIHR5cGVzLCBlbnVtcywgZ2VuZXJhdGVkXG4gICAgaWYgKFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwidHlwZXNcIikgfHxcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcImZ1bmN0aW9uc1wiKSB8fFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZ2VuZXJhdGVkXCIpXG4gICAgKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZShkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IG1vZGVsXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcIm1vZGVsXCIpIHx8IGRpZmZUeXBlcy5pbmNsdWRlcyhcImZyYW1lXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZShkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IGNvbmZpZ1xuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJjb25maWdcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWN0aW9uU3luY0NvbmZpZygpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogd29ya2Zsb3dcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwid29ya2Zsb3dcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRXb3JrZmxvd3MoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlmZlR5cGVzLFxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlczogQWJzb2x1dGVQYXRoW10pOiBEaWZmR3JvdXBzIHtcbiAgICByZXR1cm4gZ3JvdXAoZGlmZkZpbGVzLCAocikgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hlZCA9IHIubWF0Y2goL1xcLihtb2RlbHx0eXBlc3xmdW5jdGlvbnN8ZW50aXR5fGdlbmVyYXRlZHxmcmFtZXxjb25maWcpXFwuW3RqXXMvKTtcbiAgICAgIHJldHVybiBtYXRjaGVkPy5bMV0gPz8gXCJ1bmtub3duXCI7XG4gICAgfSkgYXMgdW5rbm93biBhcyBEaWZmR3JvdXBzO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlRW50aXR5Q2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMsIGRpZmZUeXBlczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlRW50aXR5Q2hhbmdlXCIsIHsgZGlmZkdyb3VwcywgZGlmZlR5cGVzIH0pO1xuXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWxvYWQoKTtcblxuICAgIC8vIHR5cGVzIOyDneyEsShlbnRpdHkg7IOI66GcIOy2lOqwgOuQnCDqsr3smrApXG4gICAgLy8gcGFyZW50SWTqsIAg7JeG6rOgLCB0eXBlc+qwgCDsl4bripQg6rK97Jqw7JeQ66eMIOyDneyEsVxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGRpZmZHcm91cHMuZW50aXR5Py5bMF0pO1xuXG4gICAgaWYgKGVudGl0eUlkKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAvLyDtlITroZzsoJ3tirjsl5Ag7IOd7ISx65CY7Ja07JW8IO2VmOuKlCAudHMg7YyM7J287J2YIOqyveuhnOyeheuLiOuLpC5cbiAgICAgIGNvbnN0IHR5cGVGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgICBgc3JjL2FwcGxpY2F0aW9uLyR7ZW50aXR5Lm5hbWVzLmZzfS8ke2VudGl0eS5uYW1lcy5mc30udHlwZXMudHNgLFxuICAgICAgKTtcbiAgICAgIGlmIChlbnRpdHkucGFyZW50SWQgPT09IHVuZGVmaW5lZCAmJiAhKGF3YWl0IGV4aXN0cyh0eXBlRmlsZVBhdGgpKSkge1xuICAgICAgICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwiaW5pdF90eXBlc1wiLCB7IGVudGl0eUlkIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk7XG5cbiAgICBkaWZmR3JvdXBzLmdlbmVyYXRlZCA9IHVuaXF1ZShbXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPz8gW10pLFxuICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmMvYXBwbGljYXRpb24vc29uYW11LmdlbmVyYXRlZC50c1wiKSBhcyBBYnNvbHV0ZVBhdGgsXG4gICAgXSk7XG4gICAgZGlmZlR5cGVzLnB1c2goXCJnZW5lcmF0ZWRcIik7XG4gIH1cblxuICBhc3luYyBoYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2UoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8RmlsZVR5cGVbXT4ge1xuICAgIGNvbnN0IHRzUGF0aHMgPSB1bmlxdWUoW1xuICAgICAgLi4uKGRpZmZHcm91cHMudHlwZXMgPz8gW10pLFxuICAgICAgLi4uKGRpZmZHcm91cHMuZnVuY3Rpb25zID8/IFtdKSxcbiAgICAgIC4uLihkaWZmR3JvdXBzLmdlbmVyYXRlZCA/PyBbXSksXG4gICAgXSk7XG4gICAgTmFpdGUudChcImhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZVwiLCB7IGRpZmZHcm91cHMgfSk7XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGNoYWxrLmdyYXkoXG4gICAgLy8gICAgIGBbUHJvY2Vzc2luZ10gSGFuZGxpbmcgdHlwZXMvZnVuY3Rpb25zL2dlbmVyYXRlZCBjaGFuZ2VzOiAke3RzUGF0aHMubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgcCkpLmpvaW4oXCIsIFwiKX1gXG4gICAgLy8gICApXG4gICAgLy8gKTtcblxuICAgIGF3YWl0IHRoaXMuYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHMpO1xuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlXCIsIHsgZGlmZkdyb3VwcyB9KTtcbiAgICBjb25zdCBtZXJnZWRHcm91cCA9IFsuLi4oZGlmZkdyb3Vwcy5tb2RlbCA/PyBbXSksIC4uLihkaWZmR3JvdXBzLmZyYW1lID8/IFtdKV07XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGNoYWxrLmdyYXkoXG4gICAgLy8gICAgIGBbUHJvY2Vzc2luZ10gSGFuZGxpbmcgbW9kZWwvZnJhbWUgY2hhbmdlczogJHttZXJnZWRHcm91cC5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBwKSkuam9pbihcIiwgXCIpfWBcbiAgICAvLyAgIClcbiAgICAvLyApO1xuXG4gICAgLy8gZ2VuZXJhdGVkX2h0dHAudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLnR5cGVz66W8IOyUgeuLiOuLpC5cbiAgICAvLyBzZXJ2aWNlLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci5hcGlz66W8IOyUgeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcblxuICAgIGNvbnN0IHBhcmFtczoge1xuICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICAgIH1bXSA9IG1lcmdlZEdyb3VwLm1hcCgobW9kZWxQYXRoKSA9PiB7XG4gICAgICBpZiAobW9kZWxQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIpKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKG1vZGVsUGF0aCk7XG4gICAgICAgIGFzc2VydChlbnRpdHlJZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcIi5mcmFtZS50c1wiKSkge1xuICAgICAgICBjb25zdCBbLCBmcmFtZU5hbWVdID0gbW9kZWxQYXRoLm1hdGNoKC8uK1xcLyguKylcXC5mcmFtZVxcLnRzJC8pID8/IFtdO1xuICAgICAgICBhc3NlcnQoZnJhbWVOYW1lKTtcbiAgICAgICAgLy8gZnJhbWVOYW1l7J2EIFBhc2NhbENhc2XroZwg67OA7ZmYIChkYXNoYm9hcmQgLT4gRGFzaGJvYXJkKVxuICAgICAgICBjb25zdCBmcmFtZUlkID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShmcmFtZU5hbWUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGZyYW1lSWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IHJlYWNoYWJsZVwiKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMuYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyhwYXJhbXMpO1xuICAgIGF3YWl0IHRoaXMuYWN0aW9uR2VuZXJhdGVIdHRwcygpO1xuICB9XG5cbiAgLy8gd2ViLy5zb25hbXUuZW52IOyXkCDtmITsnqwg7ISk7KCV6rCSIOyggOyepVxuICBhc3luYyBhY3Rpb25TeW5jQ29uZmlnKCkge1xuICAgIGNvbnN0IHsgaG9zdCwgcG9ydCB9ID0gU29uYW11LmNvbmZpZy5zZXJ2ZXIubGlzdGVuID8/IHt9O1xuICAgIGNvbnN0IGNvbnRlbnQgPSBgQVBJX0hPU1Q9JHtob3N0ID8/IFwibG9jYWxob3N0XCJ9XFxuQVBJX1BPUlQ9JHtwb3J0ID8/IDMwMDB9YDtcblxuICAgIE5haXRlLnQoXCJhY3Rpb25TeW5jQ29uZmlnXCIsIHsgY29udGVudCB9KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFNvbmFtdS5jb25maWcuc3luYy50YXJnZXRzLm1hcChhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIFwiLnNvbmFtdS5lbnZcIiksIGNvbnRlbnQpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUuZ2VuZXJhdGVkLnRz7JmAIHNvbmFtdS5nZW5lcmF0ZWQuc3NvLnRz66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkX3Nzb1wiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gICAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRcIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICAgICAgXSlcbiAgICApXG4gICAgICAuZmxhdCgpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqICouc2VydmljZS50c+ulvCDsg53shLHtlanri4jri6QuXG4gICAqIEBwYXJhbSBwYXJhbXNBcnJheVxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKFxuICAgIHBhcmFtc0FycmF5OiB7XG4gICAgICBuYW1lc1JlY29yZDogRW50aXR5TmFtZXNSZWNvcmQ7XG4gICAgfVtdLFxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgTmFpdGUudChcImFjdGlvbkdlbmVyYXRlU2VydmljZXNcIiwgcGFyYW1zQXJyYXkpO1xuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcGFyYW1zQXJyYXkubWFwKGFzeW5jIChwYXJhbXMpID0+XG4gICAgICAgICAgZ2VuZXJhdGVUZW1wbGF0ZShcInNlcnZpY2VcIiwgcGFyYW1zIGFzIFRlbXBsYXRlT3B0aW9uc1tcInNlcnZpY2VcIl0sIHtcbiAgICAgICAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICApXG4gICAgICAuZmxhdCgpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdS5nZW5lcmF0ZWQuaHR0cOulvCDsg53shLHtlanri4jri6QuXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcLlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVIdHRwcygpOiBQcm9taXNlPEFic29sdXRlUGF0aD4ge1xuICAgIGNvbnN0IFtyZXNdID0gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICAgIFwiZ2VuZXJhdGVkX2h0dHBcIixcbiAgICAgIHsgZW50aXR5SWQ6IFwiZHVtbXlcIiB9LFxuICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfSxcbiAgICApO1xuICAgIGFzc2VydChyZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogKi50eXBlcy50cywgKi5mdW5jdGlvbnMudHMsICouZ2VuZXJhdGVkLnRz66W8IO2DgOqynyDrlJTroInthqDrpqzsl5Ag67O17IKs7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gdHNQYXRoc1xuICAgKiBAcmV0dXJucyDrs7XsgqzrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHNQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgY29uc3QgeyBkaXI6IGFwaURpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHRhcmdldHMubWFwKGFzeW5jICh0YXJnZXQpID0+XG4gICAgICAgICAgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB0c1BhdGhzLm1hcChhc3luYyAocmVhbFNyYykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBkc3QgPSByZWFsU3JjXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoYC8ke2FwaURpcn0vYCwgYC8ke3RhcmdldH0vYClcbiAgICAgICAgICAgICAgICAucmVwbGFjZShcIi9hcHBsaWNhdGlvbi9cIiwgXCIvc2VydmljZXMvXCIpO1xuICAgICAgICAgICAgICBjb25zdCBkaXIgPSBkaXJuYW1lKGRzdCk7XG4gICAgICAgICAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhkaXIpKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5ibHVlKGRzdC5yZXBsYWNlKGAke1NvbmFtdS5hcHBSb290UGF0aH0vYCwgXCJcIikpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChyZWFsU3JjLCBkc3QpO1xuICAgICAgICAgICAgICByZXR1cm4gZHN0O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICApLmZsYXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChmcm9tUGF0aDogc3RyaW5nLCB0b1BhdGg6IHN0cmluZykge1xuICAgIGlmICghKGF3YWl0IGV4aXN0cyhmcm9tUGF0aCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkRmlsZUNvbnRlbnQgPSAoYXdhaXQgcmVhZEZpbGUoZnJvbVBhdGgpKS50b1N0cmluZygpO1xuXG4gICAgY29uc3QgbmV3RmlsZUNvbnRlbnQgPSAoKCkgPT4ge1xuICAgICAgLy8gd2Vi7J2064KYIGFwcCDrk7Hsl5DripQgc29uYW116rCAIOyXhuyKteuLiOuLpC5cbiAgICAgIC8vIOuUsOudvOyEnCBzb25hbXXsl5Ag64yA7ZWcIGltcG9ydOuKlCDtlajqu5gg67O17IKs65CY64qUIHNvbmFtdS5zaGFyZWQudHPsl5Ag64yA7ZWcIGltcG9ydOuhnCDsuZjtmZjtlbTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g66y47KCc64qUIOumrOyGjOyKpCDsooXrpZjsl5Ag65Sw6528IHNvbmFtdS5zaGFyZWQudHProZwg6rCA64qUIOqyveuhnOqwgCDri6TrpbTri6TripQg7KCQ7J6F64uI64ukLlxuICAgICAgLy8g7JiI66W8IOuTpOyWtCBzb25hbXUuZ2VuZXJhdGVkLnRzIOyeheyepeyXkOyEnCBzb25hbXUuc2hhcmVkLnRz64qUIOqwmeydgCDrlJTroInthqDrpqzsl5Ag7J6I7Jy864uIIC4vc29uYW11LnNoYXJlZOuhnCDsuZjtmZjtlZjrqbQg65CY7KeA66eMLFxuICAgICAgLy8gdXNlci50eXBlcy50cyDsnoXsnqXsl5DshJwgc29uYW11LnNoYXJlZC50c+uKlCDsg4HsnIQg65SU66CJ7Yag66as7JeQIOyeiOycvOuLiCAuLi9zb25hbXUuc2hhcmVk66GcIOy5mO2ZmO2VtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDsnbQg66y47KCc66W8IO2VtOqysO2VmOq4sCDsnITtlbQg67O17IKs7ZWY6rOg7J6QIO2VmOuKlCDrpqzshozsiqTsnZgg6rK966GcKHRvUGF0aCnrpbwg6riw7KSA7Jy866GcIHNvbmFtdS5zaGFyZWQudHPqsIAg7J6I64qUIOuUlOugie2GoOumrOulvCDssL7slYTshJwg7IOB64yAIOqyveuhnOulvCDqs4TsgrDtlZjrj4TroZ0g7ZWY7JiA7Iq164uI64ukLlxuICAgICAgY29uc3Qgc2VydmljZXNEaXIgPSB0b1BhdGgucmVwbGFjZSgvXFwvc2VydmljZXNcXC8uKiQvLCBcIi9zZXJ2aWNlc1wiKTtcbiAgICAgIGNvbnN0IGZpbGVEaXIgPSBkaXJuYW1lKHRvUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGZpbGVEaXIsIHNlcnZpY2VzRGlyKTtcbiAgICAgIGNvbnN0IHNoYXJlZFBhdGggPSByZWxhdGl2ZVBhdGggPT09IFwiXCIgPyBcIi4vc29uYW11LnNoYXJlZFwiIDogYCR7cmVsYXRpdmVQYXRofS9zb25hbXUuc2hhcmVkYDtcblxuICAgICAgY29uc3QgbmZjID0gb2xkRmlsZUNvbnRlbnQucmVwbGFjZSgvZnJvbSBcInNvbmFtdVwiL2csIGBmcm9tIFwiJHtzaGFyZWRQYXRofVwiYCk7XG4gICAgICByZXR1cm4gbmZjO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIHdyaXRlRmlsZSh0b1BhdGgsIG5ld0ZpbGVDb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7JeU7Yuw7Yuw7JmAIO2FnO2UjOumvyDtgqTsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIHRlbXBsYXRlS2V5IO2FnO2UjOumvyDtgqRcbiAgICogQHBhcmFtIGVudW1JZCDsl7TqsbDtmJUgSURcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0c0dlbkNvZGUoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICB0ZW1wbGF0ZUtleTogVGVtcGxhdGVLZXksXG4gICAgZW51bUlkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgc3ViUGF0aDogc3RyaW5nOyBmdWxsUGF0aDogc3RyaW5nOyBpc0V4aXN0czogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IGdlblBhdGggfSA9IFRlbXBsYXRlTWFuYWdlci5nZXQodGVtcGxhdGVLZXkpLmdldFRhcmdldEFuZFBhdGgoXG4gICAgICBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgIGVudW1JZCxcbiAgICApO1xuXG4gICAgY29uc3Qgc3ViUGF0aCA9IHBhdGguam9pbih0YXJnZXQsIGdlblBhdGgpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgc3ViUGF0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1YlBhdGgsXG4gICAgICBmdWxsUGF0aCxcbiAgICAgIGlzRXhpc3RzOiBhd2FpdCBleGlzdHMoZnVsbFBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDsl7TqsbDtmJXsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIGVudW1zIOyXtOqxsO2YlSDroIjsnbTruJRcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0cyhcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGVudW1zOiB7XG4gICAgICBbbmFtZTogc3RyaW5nXTogei5ab2RFbnVtPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4+PjtcbiAgICB9LFxuICApOiBQcm9taXNlPFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPj4ge1xuICAgIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBUZW1wbGF0ZUtleS5vcHRpb25zO1xuICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG4gICAgY29uc3QgZW51bXNLZXlzID0gT2JqZWN0LmtleXMoZW51bXMpLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gbmFtZXMuY29uc3RhbnQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHJlZHVjZUFzeW5jKFxuICAgICAga2V5cyxcbiAgICAgIGFzeW5jIChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCB0cGwgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KGtleSk7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChcInZpZXdfZW51bXNcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyhlbnVtc0tleXMsIGFzeW5jIChjb21wb25lbnRJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IHAgfSA9IHRwbC5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzLCBjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHtjb21wb25lbnRJZH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyk7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBpZiAodGFyZ2V0LmluY2x1ZGVzKFwiOnRhcmdldFwiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKHRhcmdldHMsIGFzeW5jICh0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHt0fWBdID0gYXdhaXQgZXhpc3RzKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQucmVwbGFjZShcIjp0YXJnZXRcIiwgdCksIHApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIHApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAge30gYXMgUmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+LFxuICAgICk7XG4gIH1cblxuICBzeW5jVUkoKSB7XG4gICAgY29uc3QgdWlQb3J0ID0gU29uYW11LmNvbmZpZy51aT8ucG9ydCA/PyA1NzAwMDtcblxuICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgIGZldGNoKGBodHRwOi8vMTI3LjAuMC4xOiR7dWlQb3J0fS9hcGkvcmVsb2FkYCwge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB9KS5jYXRjaCgoZSkgPT4gY29uc29sZS5sb2coY2hhbGsuZGltKGBGYWlsZWQgdG8gcmVsb2FkIFNvbmFtdSBVSTogJHtlLm1lc3NhZ2V9YCkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBjcmVhdGVFbnRpdHkoZm9ybTogVGVtcGxhdGVPcHRpb25zW1wiZW50aXR5XCJdKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUVudGl0eShmb3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGRlbEVudGl0eShlbnRpdHlJZDogc3RyaW5nKTogUHJvbWlzZTx7IGRlbFBhdGhzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGRlbEVudGl0eShlbnRpdHlJZCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVRlbXBsYXRlPFQgZXh0ZW5kcyBUZW1wbGF0ZUtleT4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICAgIF9nZW5lcmF0ZU9wdGlvbnM/OiBHZW5lcmF0ZU9wdGlvbnMsXG4gICk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucywgX2dlbmVyYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5kZXJUZW1wbGF0ZTxUIGV4dGVuZHMga2V5b2YgVGVtcGxhdGVPcHRpb25zPihcbiAgICBrZXk6IFQsXG4gICAgdGVtcGxhdGVPcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4gICk6IFByb21pc2U8UGF0aEFuZENvZGVbXT4ge1xuICAgIHJldHVybiBhd2FpdCByZW5kZXJUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImhvdCIsImFzc2VydCIsImNoYWxrIiwibWtkaXIiLCJyZWFkRmlsZSIsIndyaXRlRmlsZSIsImluZmxlY3Rpb24iLCJtaW5pbWF0Y2giLCJwYXRoIiwiZGlybmFtZSIsImdyb3VwIiwidW5pcXVlIiwicmVnaXN0ZXJlZEFwaXMiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJUZW1wbGF0ZU1hbmFnZXIiLCJUZW1wbGF0ZUtleSIsIm1hcEFzeW5jIiwicmVkdWNlQXN5bmMiLCJjZW50ZXJUZXh0IiwiaXNUZXN0IiwiZXhpc3RzIiwicnVuV2l0aEdyYWNlZnVsU2h1dGRvd24iLCJhcmVGaWxlc1NhbWUiLCJmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMiLCJyZW5ld0NoZWNrc3VtcyIsImdlbmVyYXRlVGVtcGxhdGUiLCJyZW5kZXJUZW1wbGF0ZSIsImNyZWF0ZUVudGl0eSIsImRlbEVudGl0eSIsImdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgiLCJsb2FkQXBpcyIsImxvYWRNb2RlbHMiLCJsb2FkVHlwZXMiLCJsb2FkV29ya2Zsb3dzIiwiU3luY2VyIiwiYXBpcyIsInR5cGVzIiwibW9kZWxzIiwid29ya2Zsb3dzIiwiTWFwIiwiaXNTeW5jaW5nIiwic3luYyIsInRhcmdldHMiLCJjb25maWciLCJjb3B5U2hhcmVkVG9UYXJnZXRzIiwiY2hhbmdlZEZpbGVzIiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsImJsYWNrIiwiYmdHcmVlbiIsImRvU3luY0FjdGlvbnMiLCJ3aGVuVGhpc0hhcHBlbnMiLCJ3YWl0Rm9yVXBUbyIsInN5bmNGcm9tV2F0Y2hlciIsImV2ZW50IiwiZGlmZkZpbGVQYXRoIiwiaW52YWxpZGF0ZWRQYXRocyIsImludmFsaWRhdGVGaWxlIiwiYm9sZCIsImludmFsaWRhdGVkUGF0aCIsInJlbW92ZWRBcGlzIiwicmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyIsImJsdWUiLCJyZWxhdGl2ZSIsImFwaVJvb3RQYXRoIiwiZ3JheSIsImlzSW5DaGVja1BhdHRlcm5Hcm91cCIsIk9iamVjdCIsInZhbHVlcyIsInNvbWUiLCJwYXR0ZXJuIiwiYXV0b2xvYWRUeXBlcyIsImF1dG9sb2FkTW9kZWxzIiwiYXV0b2xvYWRBcGlzIiwiYXV0b2xvYWRXb3JrZmxvd3MiLCJzeW5jVUkiLCJlbmRzV2l0aCIsImVudGl0eUlkIiwiZ2V0RW50aXR5SWRGcm9tUGF0aCIsInRvUmVtb3ZlIiwiZmlsdGVyIiwiYXBpIiwibW9kZWxOYW1lIiwic3BsaWNlIiwiaW5kZXhPZiIsInRhcmdldCIsInNyY1BhdGgiLCJqb2luIiwicmVwbGFjZSIsImFwcFJvb3RQYXRoIiwiRXJyb3IiLCJkZXN0UGF0aCIsInJlY3Vyc2l2ZSIsIndhcm4iLCJzeW5jaHJvbml6ZSIsImRpZmZGaWxlUGF0aHMiLCJkaWZmR3JvdXBzIiwiY2FsY3VsYXRlRGlmZkdyb3VwcyIsImRpZmZUeXBlcyIsImtleXMiLCJpbmNsdWRlcyIsImhhbmRsZUVudGl0eUNoYW5nZSIsImhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZSIsImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZSIsImFjdGlvblN5bmNDb25maWciLCJkaWZmRmlsZXMiLCJyIiwibWF0Y2hlZCIsIm1hdGNoIiwidCIsInJlbG9hZCIsImVudGl0eSIsImdldCIsInR5cGVGaWxlUGF0aCIsIm5hbWVzIiwiZnMiLCJwYXJlbnRJZCIsInVuZGVmaW5lZCIsImFjdGlvbkdlbmVyYXRlU2NoZW1hcyIsImdlbmVyYXRlZCIsInB1c2giLCJ0c1BhdGhzIiwiZnVuY3Rpb25zIiwiYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzIiwibWVyZ2VkR3JvdXAiLCJtb2RlbCIsImZyYW1lIiwicGFyYW1zIiwibWFwIiwibW9kZWxQYXRoIiwibmFtZXNSZWNvcmQiLCJnZXROYW1lc0Zyb21JZCIsImZyYW1lTmFtZSIsImZyYW1lSWQiLCJjYW1lbGl6ZSIsImFjdGlvbkdlbmVyYXRlU2VydmljZXMiLCJhY3Rpb25HZW5lcmF0ZUh0dHBzIiwiaG9zdCIsInBvcnQiLCJzZXJ2ZXIiLCJsaXN0ZW4iLCJjb250ZW50IiwiUHJvbWlzZSIsImFsbCIsIm92ZXJ3cml0ZSIsImZsYXQiLCJwYXJhbXNBcnJheSIsInJlcyIsImRpciIsImFwaURpciIsInJlYWxTcmMiLCJkc3QiLCJjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkIiwiZnJvbVBhdGgiLCJ0b1BhdGgiLCJvbGRGaWxlQ29udGVudCIsInRvU3RyaW5nIiwibmV3RmlsZUNvbnRlbnQiLCJzZXJ2aWNlc0RpciIsImZpbGVEaXIiLCJyZWxhdGl2ZVBhdGgiLCJzaGFyZWRQYXRoIiwibmZjIiwiY2hlY2tFeGlzdHNHZW5Db2RlIiwidGVtcGxhdGVLZXkiLCJlbnVtSWQiLCJnZW5QYXRoIiwiZ2V0VGFyZ2V0QW5kUGF0aCIsInN1YlBhdGgiLCJmdWxsUGF0aCIsImlzRXhpc3RzIiwiY2hlY2tFeGlzdHMiLCJlbnVtcyIsIm9wdGlvbnMiLCJlbnVtc0tleXMiLCJuYW1lIiwiY29uc3RhbnQiLCJyZXN1bHQiLCJrZXkiLCJ0cGwiLCJzdGFydHNXaXRoIiwiY29tcG9uZW50SWQiLCJwIiwidWlQb3J0IiwidWkiLCJmZXRjaCIsIm1ldGhvZCIsImNhdGNoIiwiZSIsImRpbSIsIm1lc3NhZ2UiLCJmb3JtIiwidGVtcGxhdGVPcHRpb25zIiwiX2dlbmVyYXRlT3B0aW9ucyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsR0FBRyxRQUFRLHVCQUF1QjtBQUMzQyxPQUFPQyxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVNDLEtBQUssRUFBRUMsUUFBUSxFQUFFQyxTQUFTLFFBQVEsbUJBQWM7QUFDekQsT0FBT0MsZ0JBQWdCLGFBQWE7QUFDcEMsU0FBU0MsU0FBUyxRQUFRLFlBQVk7QUFDdEMsT0FBT0MsUUFBUUMsT0FBTyxRQUFRLE9BQU87QUFDckMsU0FBU0MsS0FBSyxFQUFFQyxNQUFNLFFBQVEsVUFBVTtBQUd4QyxTQUFTQyxjQUFjLFFBQVEsdUJBQW9CO0FBQ25ELFNBQVNDLE1BQU0sUUFBUSxtQkFB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
@@ -0,0 +1,26 @@
1
+ import type { SchemaInput, SchemaOutput, StandardSchemaV1, WorkflowSpec } from "@sonamu-kit/tasks/internal";
2
+ import type { Executable } from "../types/types";
3
+ import type { WorkflowFunction } from "./workflow-manager";
4
+ export interface WorkflowMetadata {
5
+ type: "workflow";
6
+ id: string;
7
+ name: string;
8
+ version: string | null;
9
+ schema: StandardSchemaV1<unknown, unknown> | undefined;
10
+ schedules: {
11
+ name: string;
12
+ expression: string;
13
+ input: Executable<SchemaInput<unknown, unknown> | undefined>;
14
+ }[];
15
+ fn: WorkflowFunction<unknown, unknown>;
16
+ }
17
+ export type DefineWorkflowOptions<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined> = Omit<WorkflowSpec<SchemaOutput<TSchema, Input>, Output, SchemaInput<TSchema, Input>>, "name"> & {
18
+ name?: string;
19
+ schedules?: {
20
+ name?: string;
21
+ expression: string;
22
+ input?: Executable<SchemaInput<TSchema, Input> | undefined>;
23
+ }[];
24
+ };
25
+ export declare function workflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(options: DefineWorkflowOptions<Input, Output, TSchema>): (fn: WorkflowFunction<SchemaOutput<TSchema, Input>, Output>) => WorkflowMetadata;
26
+ //# sourceMappingURL=decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorator.d.ts","sourceRoot":"","sources":["../../src/tasks/decorator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACvD,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;KAC9D,EAAE,CAAC;IACJ,EAAE,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACxC;AAGD,MAAM,MAAM,qBAAqB,CAC/B,KAAK,EACL,MAAM,EACN,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,IACtD,IAAI,CACN,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAC/E,MAAM,CACP,GAAG;IACF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QACV,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;KAC7D,EAAE,CAAC;CACL,CAAC;AAIF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EAC9F,OAAO,EAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,IAE9C,IAAI,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,sBAsBnE"}
@@ -0,0 +1,28 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import inflection from "inflection";
3
+ // 워크플로우 정의를 위한 데코레이터,
4
+ // 이것들은 syncer에서 한번에 load한 다음, WorkflowManager에서 synchronize를 통해 등록됨.
5
+ export function workflow(options) {
6
+ return (fn)=>{
7
+ const id = randomUUID();
8
+ const workflowName = options.name ?? inflection.underscore(fn.name);
9
+ const decorated = {
10
+ type: "workflow",
11
+ id,
12
+ name: workflowName,
13
+ schema: options.schema,
14
+ version: options.version ?? null,
15
+ schedules: (options.schedules ?? []).map((schedule)=>{
16
+ return {
17
+ name: schedule.name ?? `${workflowName}[${schedule.expression}]`,
18
+ expression: schedule.expression,
19
+ input: schedule.input
20
+ };
21
+ }),
22
+ fn: fn
23
+ };
24
+ return decorated;
25
+ };
26
+ }
27
+
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy9kZWNvcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHR5cGUge1xuICBTY2hlbWFJbnB1dCxcbiAgU2NoZW1hT3V0cHV0LFxuICBTdGFuZGFyZFNjaGVtYVYxLFxuICBXb3JrZmxvd1NwZWMsXG59IGZyb20gXCJAc29uYW11LWtpdC90YXNrcy9pbnRlcm5hbFwiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgRXhlY3V0YWJsZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0Z1bmN0aW9uIH0gZnJvbSBcIi4vd29ya2Zsb3ctbWFuYWdlclwiO1xuXG4vLyDsm4ztgaztlIzroZzsmrDsnZgg66mU7YOA642w7J207YSwIOqwneyytFxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd01ldGFkYXRhIHtcbiAgdHlwZTogXCJ3b3JrZmxvd1wiO1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZyB8IG51bGw7XG4gIHNjaGVtYTogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgc2NoZWR1bGVzOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGV4cHJlc3Npb246IHN0cmluZztcbiAgICBpbnB1dDogRXhlY3V0YWJsZTxTY2hlbWFJbnB1dDx1bmtub3duLCB1bmtub3duPiB8IHVuZGVmaW5lZD47XG4gIH1bXTtcbiAgZm46IFdvcmtmbG93RnVuY3Rpb248dW5rbm93biwgdW5rbm93bj47XG59XG5cbi8vIOybjO2BrO2UjOuhnOyasCDsoJXsnZgg6rO87KCV7JeQ7ISc7J2YIOyYteyFmFxuZXhwb3J0IHR5cGUgRGVmaW5lV29ya2Zsb3dPcHRpb25zPFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBUU2NoZW1hIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWFWMSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbj4gPSBPbWl0PFxuICBXb3JrZmxvd1NwZWM8U2NoZW1hT3V0cHV0PFRTY2hlbWEsIElucHV0PiwgT3V0cHV0LCBTY2hlbWFJbnB1dDxUU2NoZW1hLCBJbnB1dD4+LFxuICBcIm5hbWVcIlxuPiAmIHtcbiAgbmFtZT86IHN0cmluZztcbiAgc2NoZWR1bGVzPzoge1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgZXhwcmVzc2lvbjogc3RyaW5nO1xuICAgIGlucHV0PzogRXhlY3V0YWJsZTxTY2hlbWFJbnB1dDxUU2NoZW1hLCBJbnB1dD4gfCB1bmRlZmluZWQ+O1xuICB9W107XG59O1xuXG4vLyDsm4ztgaztlIzroZzsmrAg7KCV7J2Y66W8IOychO2VnCDrjbDsvZTroIjsnbTthLAsXG4vLyDsnbTqsoPrk6TsnYAgc3luY2Vy7JeQ7IScIO2VnOuyiOyXkCBsb2Fk7ZWcIOuLpOydjCwgV29ya2Zsb3dNYW5hZ2Vy7JeQ7IScIHN5bmNocm9uaXpl66W8IO2Gte2VtCDrk7HroZ3rkKguXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3c8SW5wdXQsIE91dHB1dCwgVFNjaGVtYSBleHRlbmRzIFN0YW5kYXJkU2NoZW1hVjEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+KFxuICBvcHRpb25zOiBEZWZpbmVXb3JrZmxvd09wdGlvbnM8SW5wdXQsIE91dHB1dCwgVFNjaGVtYT4sXG4pIHtcbiAgcmV0dXJuIChmbjogV29ya2Zsb3dGdW5jdGlvbjxTY2hlbWFPdXRwdXQ8VFNjaGVtYSwgSW5wdXQ+LCBPdXRwdXQ+KSA9PiB7XG4gICAgY29uc3QgaWQgPSByYW5kb21VVUlEKCk7XG4gICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gb3B0aW9ucy5uYW1lID8/IGluZmxlY3Rpb24udW5kZXJzY29yZShmbi5uYW1lKTtcblxuICAgIGNvbnN0IGRlY29yYXRlZDogV29ya2Zsb3dNZXRhZGF0YSA9IHtcbiAgICAgIHR5cGU6IFwid29ya2Zsb3dcIiBhcyBjb25zdCxcbiAgICAgIGlkLFxuICAgICAgbmFtZTogd29ya2Zsb3dOYW1lLFxuICAgICAgc2NoZW1hOiBvcHRpb25zLnNjaGVtYSxcbiAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyBudWxsLFxuICAgICAgc2NoZWR1bGVzOiAob3B0aW9ucy5zY2hlZHVsZXMgPz8gW10pLm1hcCgoc2NoZWR1bGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBzY2hlZHVsZS5uYW1lID8/IGAke3dvcmtmbG93TmFtZX1bJHtzY2hlZHVsZS5leHByZXNzaW9ufV1gLFxuICAgICAgICAgIGV4cHJlc3Npb246IHNjaGVkdWxlLmV4cHJlc3Npb24sXG4gICAgICAgICAgaW5wdXQ6IHNjaGVkdWxlLmlucHV0LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICBmbjogZm4gYXMgV29ya2Zsb3dGdW5jdGlvbjx1bmtub3duLCB1bmtub3duPixcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlY29yYXRlZDtcbiAgfTtcbn1cbiJdLCJuYW1lcyI6WyJyYW5kb21VVUlEIiwiaW5mbGVjdGlvbiIsIndvcmtmbG93Iiwib3B0aW9ucyIsImZuIiwiaWQiLCJ3b3JrZmxvd05hbWUiLCJuYW1lIiwidW5kZXJzY29yZSIsImRlY29yYXRlZCIsInR5cGUiLCJzY2hlbWEiLCJ2ZXJzaW9uIiwic2NoZWR1bGVzIiwibWFwIiwic2NoZWR1bGUiLCJleHByZXNzaW9uIiwiaW5wdXQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVUsUUFBUSxjQUFjO0FBT3pDLE9BQU9DLGdCQUFnQixhQUFhO0FBb0NwQyxzQkFBc0I7QUFDdEIscUVBQXFFO0FBQ3JFLE9BQU8sU0FBU0MsU0FDZEMsT0FBc0Q7SUFFdEQsT0FBTyxDQUFDQztRQUNOLE1BQU1DLEtBQUtMO1FBQ1gsTUFBTU0sZUFBZUgsUUFBUUksSUFBSSxJQUFJTixXQUFXTyxVQUFVLENBQUNKLEdBQUdHLElBQUk7UUFFbEUsTUFBTUUsWUFBOEI7WUFDbENDLE1BQU07WUFDTkw7WUFDQUUsTUFBTUQ7WUFDTkssUUFBUVIsUUFBUVEsTUFBTTtZQUN0QkMsU0FBU1QsUUFBUVMsT0FBTyxJQUFJO1lBQzVCQyxXQUFXLEFBQUNWLENBQUFBLFFBQVFVLFNBQVMsSUFBSSxFQUFFLEFBQUQsRUFBR0MsR0FBRyxDQUFDLENBQUNDO2dCQUN4QyxPQUFPO29CQUNMUixNQUFNUSxTQUFTUixJQUFJLElBQUksR0FBR0QsYUFBYSxDQUFDLEVBQUVTLFNBQVNDLFVBQVUsQ0FBQyxDQUFDLENBQUM7b0JBQ2hFQSxZQUFZRCxTQUFTQyxVQUFVO29CQUMvQkMsT0FBT0YsU0FBU0UsS0FBSztnQkFDdkI7WUFDRjtZQUNBYixJQUFJQTtRQUNOO1FBRUEsT0FBT0s7SUFDVDtBQUNGIn0=
@@ -0,0 +1,18 @@
1
+ import type { DurationString, StepApi } from "@sonamu-kit/tasks/internal";
2
+ export type StepFunction<TArgs extends unknown[], TResult> = (...args: TArgs) => TResult;
3
+ export type RunnableStep<TArgs extends unknown[], TResult> = {
4
+ run: StepFunction<TArgs, Promise<TResult>>;
5
+ };
6
+ export type MethodNames<T, TKey extends keyof T> = T[TKey] extends (...args: infer _TArgs) => infer _TResult ? TKey : never;
7
+ export type MethodArguments<T, TKey extends keyof T> = T[TKey] extends (...args: infer TArgs) => unknown ? TArgs : never;
8
+ export type MethodReturnType<T, TKey extends keyof T> = T[TKey] extends (this: T, ...args: infer _TArgs) => infer TResult ? TResult : never;
9
+ export declare class StepWrapper {
10
+ #private;
11
+ constructor(stepApi: StepApi);
12
+ get<T, TKey extends keyof T, TArgs extends MethodArguments<T, TKey>, TResult extends MethodReturnType<T, TKey>>(config: {
13
+ name: string;
14
+ }, object: T, name: MethodNames<T, TKey>): RunnableStep<TArgs, TResult>;
15
+ get<T, TKey extends keyof T, TArgs extends MethodArguments<T, TKey>, TResult extends MethodReturnType<T, TKey>>(object: T, name: MethodNames<T, TKey>): RunnableStep<TArgs, TResult>;
16
+ sleep(name: string, duration: DurationString): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=step-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-wrapper.d.ts","sourceRoot":"","sources":["../../src/tasks/step-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAG1E,MAAM,MAAM,YAAY,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC;AACzF,MAAM,MAAM,YAAY,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,IAAI;IAC3D,GAAG,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,IAAI,SAAS,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CACjE,GAAG,IAAI,EAAE,MAAM,MAAM,KAClB,MAAM,QAAQ,GACf,IAAI,GACJ,KAAK,CAAC;AAEV,MAAM,MAAM,eAAe,CAAC,CAAC,EAAE,IAAI,SAAS,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CACrE,GAAG,IAAI,EAAE,MAAM,KAAK,KACjB,OAAO,GACR,KAAK,GACL,KAAK,CAAC;AAEV,MAAM,MAAM,gBAAgB,CAAC,CAAC,EAAE,IAAI,SAAS,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CACtE,IAAI,EAAE,CAAC,EACP,GAAG,IAAI,EAAE,MAAM,MAAM,KAClB,MAAM,OAAO,GACd,OAAO,GACP,KAAK,CAAC;AAEV,qBAAa,WAAW;;gBAGV,OAAO,EAAE,OAAO;IAI5B,GAAG,CACD,CAAC,EACD,IAAI,SAAS,MAAM,CAAC,EACpB,KAAK,SAAS,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EACtC,OAAO,SAAS,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,EACzC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;IAChG,GAAG,CACD,CAAC,EACD,IAAI,SAAS,MAAM,CAAC,EACpB,KAAK,SAAS,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,EACtC,OAAO,SAAS,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,EACzC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;IAmCtE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc;CAG7C"}
@@ -0,0 +1,38 @@
1
+ import inflection from "inflection";
2
+ export class StepWrapper {
3
+ #stepApi;
4
+ constructor(stepApi){
5
+ this.#stepApi = stepApi;
6
+ }
7
+ get(...args) {
8
+ let config;
9
+ let fn;
10
+ if (args.length === 2) {
11
+ const [rawObject, methodName] = args;
12
+ const method = rawObject[methodName];
13
+ config = {
14
+ name: inflection.underscore(methodName.toString())
15
+ };
16
+ fn = (...args)=>method.bind(rawObject)(...args);
17
+ } else {
18
+ const [rawConfig, rawObject, name] = args;
19
+ const method = rawObject[name];
20
+ config = {
21
+ name: rawConfig.name ?? inflection.underscore(name.toString())
22
+ };
23
+ fn = (...args)=>method.bind(rawObject)(...args);
24
+ }
25
+ return {
26
+ run: ((stepApi)=>{
27
+ return (...args)=>{
28
+ return stepApi.run(config, ()=>fn(...args));
29
+ };
30
+ })(this.#stepApi)
31
+ };
32
+ }
33
+ sleep(name, duration) {
34
+ return this.#stepApi.sleep(name, duration);
35
+ }
36
+ }
37
+
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy9zdGVwLXdyYXBwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEdXJhdGlvblN0cmluZywgU3RlcEFwaSB9IGZyb20gXCJAc29uYW11LWtpdC90YXNrcy9pbnRlcm5hbFwiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PiA9ICguLi5hcmdzOiBUQXJncykgPT4gVFJlc3VsdDtcbmV4cG9ydCB0eXBlIFJ1bm5hYmxlU3RlcDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4gPSB7XG4gIHJ1bjogU3RlcEZ1bmN0aW9uPFRBcmdzLCBQcm9taXNlPFRSZXN1bHQ+Pjtcbn07XG5cbmV4cG9ydCB0eXBlIE1ldGhvZE5hbWVzPFQsIFRLZXkgZXh0ZW5kcyBrZXlvZiBUPiA9IFRbVEtleV0gZXh0ZW5kcyAoXG4gIC4uLmFyZ3M6IGluZmVyIF9UQXJnc1xuKSA9PiBpbmZlciBfVFJlc3VsdFxuICA/IFRLZXlcbiAgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgTWV0aG9kQXJndW1lbnRzPFQsIFRLZXkgZXh0ZW5kcyBrZXlvZiBUPiA9IFRbVEtleV0gZXh0ZW5kcyAoXG4gIC4uLmFyZ3M6IGluZmVyIFRBcmdzXG4pID0+IHVua25vd25cbiAgPyBUQXJnc1xuICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBNZXRob2RSZXR1cm5UeXBlPFQsIFRLZXkgZXh0ZW5kcyBrZXlvZiBUPiA9IFRbVEtleV0gZXh0ZW5kcyAoXG4gIHRoaXM6IFQsXG4gIC4uLmFyZ3M6IGluZmVyIF9UQXJnc1xuKSA9PiBpbmZlciBUUmVzdWx0XG4gID8gVFJlc3VsdFxuICA6IG5ldmVyO1xuXG5leHBvcnQgY2xhc3MgU3RlcFdyYXBwZXIge1xuICByZWFkb25seSAjc3RlcEFwaTogU3RlcEFwaTtcblxuICBjb25zdHJ1Y3RvcihzdGVwQXBpOiBTdGVwQXBpKSB7XG4gICAgdGhpcy4jc3RlcEFwaSA9IHN0ZXBBcGk7XG4gIH1cblxuICBnZXQ8XG4gICAgVCxcbiAgICBUS2V5IGV4dGVuZHMga2V5b2YgVCxcbiAgICBUQXJncyBleHRlbmRzIE1ldGhvZEFyZ3VtZW50czxULCBUS2V5PixcbiAgICBUUmVzdWx0IGV4dGVuZHMgTWV0aG9kUmV0dXJuVHlwZTxULCBUS2V5PixcbiAgPihjb25maWc6IHsgbmFtZTogc3RyaW5nIH0sIG9iamVjdDogVCwgbmFtZTogTWV0aG9kTmFtZXM8VCwgVEtleT4pOiBSdW5uYWJsZVN0ZXA8VEFyZ3MsIFRSZXN1bHQ+O1xuICBnZXQ8XG4gICAgVCxcbiAgICBUS2V5IGV4dGVuZHMga2V5b2YgVCxcbiAgICBUQXJncyBleHRlbmRzIE1ldGhvZEFyZ3VtZW50czxULCBUS2V5PixcbiAgICBUUmVzdWx0IGV4dGVuZHMgTWV0aG9kUmV0dXJuVHlwZTxULCBUS2V5PixcbiAgPihvYmplY3Q6IFQsIG5hbWU6IE1ldGhvZE5hbWVzPFQsIFRLZXk+KTogUnVubmFibGVTdGVwPFRBcmdzLCBUUmVzdWx0PjtcbiAgZ2V0PFxuICAgIFQsXG4gICAgVEtleSBleHRlbmRzIGtleW9mIFQsXG4gICAgVEFyZ3MgZXh0ZW5kcyBNZXRob2RBcmd1bWVudHM8VCwgVEtleT4sXG4gICAgVFJlc3VsdCBleHRlbmRzIE1ldGhvZFJldHVyblR5cGU8VCwgVEtleT4sXG4gID4oXG4gICAgLi4uYXJnczogW3sgbmFtZTogc3RyaW5nIH0sIFQsIE1ldGhvZE5hbWVzPFQsIFRLZXk+XSB8IFtULCBNZXRob2ROYW1lczxULCBUS2V5Pl1cbiAgKTogUnVubmFibGVTdGVwPFRBcmdzLCBUUmVzdWx0PiB7XG4gICAgbGV0IGNvbmZpZzogeyBuYW1lOiBzdHJpbmcgfTtcbiAgICBsZXQgZm46IFN0ZXBGdW5jdGlvbjxUQXJncywgRXhjbHVkZTxUUmVzdWx0LCBuZXZlcj4+O1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCBbcmF3T2JqZWN0LCBtZXRob2ROYW1lXSA9IGFyZ3M7XG4gICAgICBjb25zdCBtZXRob2QgPSByYXdPYmplY3RbbWV0aG9kTmFtZV0gYXMgQ2FsbGFibGVGdW5jdGlvbjtcbiAgICAgIGNvbmZpZyA9IHsgbmFtZTogaW5mbGVjdGlvbi51bmRlcnNjb3JlKG1ldGhvZE5hbWUudG9TdHJpbmcoKSkgfTtcblxuICAgICAgZm4gPSAoLi4uYXJnczogVEFyZ3MpID0+IG1ldGhvZC5iaW5kKHJhd09iamVjdCkoLi4uYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtyYXdDb25maWcsIHJhd09iamVjdCwgbmFtZV0gPSBhcmdzO1xuICAgICAgY29uc3QgbWV0aG9kID0gcmF3T2JqZWN0W25hbWVdIGFzIENhbGxhYmxlRnVuY3Rpb247XG5cbiAgICAgIGNvbmZpZyA9IHsgbmFtZTogcmF3Q29uZmlnLm5hbWUgPz8gaW5mbGVjdGlvbi51bmRlcnNjb3JlKG5hbWUudG9TdHJpbmcoKSkgfTtcbiAgICAgIGZuID0gKC4uLmFyZ3M6IFRBcmdzKSA9PiBtZXRob2QuYmluZChyYXdPYmplY3QpKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBydW46ICgoc3RlcEFwaTogU3RlcEFwaSkgPT4ge1xuICAgICAgICByZXR1cm4gKC4uLmFyZ3M6IFRBcmdzKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHN0ZXBBcGkucnVuKGNvbmZpZywgKCkgPT4gZm4oLi4uYXJncykpO1xuICAgICAgICB9O1xuICAgICAgfSkodGhpcy4jc3RlcEFwaSksXG4gICAgfTtcbiAgfVxuXG4gIHNsZWVwKG5hbWU6IHN0cmluZywgZHVyYXRpb246IER1cmF0aW9uU3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0ZXBBcGkuc2xlZXAobmFtZSwgZHVyYXRpb24pO1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsIlN0ZXBXcmFwcGVyIiwic3RlcEFwaSIsImdldCIsImFyZ3MiLCJjb25maWciLCJmbiIsImxlbmd0aCIsInJhd09iamVjdCIsIm1ldGhvZE5hbWUiLCJtZXRob2QiLCJuYW1lIiwidW5kZXJzY29yZSIsInRvU3RyaW5nIiwiYmluZCIsInJhd0NvbmZpZyIsInJ1biIsInNsZWVwIiwiZHVyYXRpb24iXSwibWFwcGluZ3MiOiJBQUNBLE9BQU9BLGdCQUFnQixhQUFhO0FBMEJwQyxPQUFPLE1BQU1DO0lBQ0YsQ0FBQSxPQUFRLENBQVU7SUFFM0IsWUFBWUMsT0FBZ0IsQ0FBRTtRQUM1QixJQUFJLENBQUMsQ0FBQSxPQUFRLEdBQUdBO0lBQ2xCO0lBY0FDLElBTUUsR0FBR0MsSUFBNkUsRUFDbEQ7UUFDOUIsSUFBSUM7UUFDSixJQUFJQztRQUVKLElBQUlGLEtBQUtHLE1BQU0sS0FBSyxHQUFHO1lBQ3JCLE1BQU0sQ0FBQ0MsV0FBV0MsV0FBVyxHQUFHTDtZQUNoQyxNQUFNTSxTQUFTRixTQUFTLENBQUNDLFdBQVc7WUFDcENKLFNBQVM7Z0JBQUVNLE1BQU1YLFdBQVdZLFVBQVUsQ0FBQ0gsV0FBV0ksUUFBUTtZQUFJO1lBRTlEUCxLQUFLLENBQUMsR0FBR0YsT0FBZ0JNLE9BQU9JLElBQUksQ0FBQ04sY0FBY0o7UUFDckQsT0FBTztZQUNMLE1BQU0sQ0FBQ1csV0FBV1AsV0FBV0csS0FBSyxHQUFHUDtZQUNyQyxNQUFNTSxTQUFTRixTQUFTLENBQUNHLEtBQUs7WUFFOUJOLFNBQVM7Z0JBQUVNLE1BQU1JLFVBQVVKLElBQUksSUFBSVgsV0FBV1ksVUFBVSxDQUFDRCxLQUFLRSxRQUFRO1lBQUk7WUFDMUVQLEtBQUssQ0FBQyxHQUFHRixPQUFnQk0sT0FBT0ksSUFBSSxDQUFDTixjQUFjSjtRQUNyRDtRQUVBLE9BQU87WUFDTFksS0FBSyxBQUFDLENBQUEsQ0FBQ2Q7Z0JBQ0wsT0FBTyxDQUFDLEdBQUdFO29CQUNULE9BQU9GLFFBQVFjLEdBQUcsQ0FBQ1gsUUFBUSxJQUFNQyxNQUFNRjtnQkFDekM7WUFDRixDQUFBLEVBQUcsSUFBSSxDQUFDLENBQUEsT0FBUTtRQUNsQjtJQUNGO0lBRUFhLE1BQU1OLElBQVksRUFBRU8sUUFBd0IsRUFBRTtRQUM1QyxPQUFPLElBQUksQ0FBQyxDQUFBLE9BQVEsQ0FBQ0QsS0FBSyxDQUFDTixNQUFNTztJQUNuQztBQUNGIn0=
@@ -0,0 +1,40 @@
1
+ import type { RunnableWorkflow, SchemaInput, SchemaOutput, StandardSchemaV1, WorkflowRunHandle, WorkflowSpec } from "@sonamu-kit/tasks/internal";
2
+ import type { Knex } from "knex";
3
+ import type { WorkflowMetadata } from "./decorator";
4
+ import { StepWrapper } from "./step-wrapper";
5
+ export interface WorkflowOptions {
6
+ concurrency?: number;
7
+ usePubSub?: boolean;
8
+ listenDelay?: number;
9
+ }
10
+ export type WorkflowFunction<Input, Output> = (params: Readonly<{
11
+ input: Input;
12
+ step: StepWrapper;
13
+ version: string | null;
14
+ }>) => Promise<Output> | Output;
15
+ export type WorkflowCreateOptions<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined> = Omit<WorkflowSpec<SchemaOutput<TSchema, Input>, Output, SchemaInput<TSchema, Input>>, "version"> & {
16
+ id: string;
17
+ version: string | null;
18
+ function: WorkflowFunction<SchemaOutput<TSchema, Input>, Output>;
19
+ };
20
+ export declare class WorkflowManager {
21
+ #private;
22
+ private constructor();
23
+ /**
24
+ * 정의된 워크플로우 및 워크플로우에 대한 scheduled tasks를 동기화합니다.
25
+ */
26
+ synchronize(workflowMap: Map<string, WorkflowMetadata[]>): Promise<void>;
27
+ run<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(options: Omit<WorkflowCreateOptions<Input, Output, TSchema>, "function" | "schema" | "id">, input: SchemaInput<TSchema, Input>): Promise<WorkflowRunHandle<Output>>;
28
+ scheduleTask(workflow: Pick<WorkflowMetadata, "id" | "name" | "version">, schedule: WorkflowMetadata["schedules"][number]): Promise<void>;
29
+ unscheduleTask(name: string): Promise<void>;
30
+ registerWorkflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(options: WorkflowCreateOptions<Input, Output, TSchema>): RunnableWorkflow<SchemaOutput<TSchema, Input>, Output, SchemaInput<TSchema, Input>>;
31
+ unregisterWorkflow(workflow: Pick<WorkflowMetadata, "name" | "version" | "id">): Promise<void>;
32
+ setupWorker(options: WorkflowOptions): Promise<void>;
33
+ stopWorker(): Promise<void>;
34
+ stopSchedules(): Promise<void>;
35
+ destroySchedules(): Promise<void>;
36
+ destroy(): Promise<void>;
37
+ [Symbol.asyncDispose](): Promise<void>;
38
+ static create(dbConf: Knex.Config, runMigrations?: boolean): Promise<WorkflowManager>;
39
+ }
40
+ //# sourceMappingURL=workflow-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-manager.d.ts","sourceRoot":"","sources":["../../src/tasks/workflow-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,gBAAgB,EAEhB,iBAAiB,EACjB,YAAY,EACb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,eAAe;IAE9B,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,MAAM,gBAAgB,CAAC,KAAK,EAAE,MAAM,IAAI,CAC5C,MAAM,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC,KACC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAG9B,MAAM,MAAM,qBAAqB,CAC/B,KAAK,EACL,MAAM,EACN,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,IACtD,IAAI,CACN,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAC/E,SAAS,CACV,GAAG;IACF,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;CAClE,CAAC;AAEF,qBAAa,eAAe;;IAuB1B,OAAO;IAQP;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAqF9D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EACzE,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC,EAC1F,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,GACjC,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAW/B,YAAY,CAChB,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC,EAC3D,QAAQ,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;IA8B3C,cAAc,CAAC,IAAI,EAAE,MAAM;IAajC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EACtF,OAAO,EAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GACrD,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IA4ChF,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAK9E,WAAW,CAAC,OAAO,EAAE,eAAe;IAMpC,UAAU;IAKV,aAAa;IAOb,gBAAgB;IAOhB,OAAO;IAOb,CAAC,MAAM,CAAC,YAAY,CAAC;WAKR,MAAM,CACjB,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,aAAa,GAAE,OAAc,GAC5B,OAAO,CAAC,eAAe,CAAC;CAI5B"}