sonamu 0.7.11 → 0.7.13

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 (153) hide show
  1. package/dist/api/config.d.ts +10 -6
  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 +49 -5
  7. package/dist/bin/cli.js +118 -170
  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 +82 -3
  22. package/dist/database/puri.d.ts.map +1 -1
  23. package/dist/database/puri.js +180 -14
  24. package/dist/database/puri.types.d.ts +33 -6
  25. package/dist/database/puri.types.d.ts.map +1 -1
  26. package/dist/database/puri.types.js +1 -1
  27. package/dist/database/puri.types.test-d.js +1 -1
  28. package/dist/entity/entity-manager.d.ts +5 -4
  29. package/dist/entity/entity-manager.d.ts.map +1 -1
  30. package/dist/entity/entity-manager.js +8 -1
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +3 -3
  34. package/dist/migration/code-generation.d.ts.map +1 -1
  35. package/dist/migration/code-generation.js +33 -2
  36. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  37. package/dist/migration/postgresql-schema-reader.js +53 -22
  38. package/dist/naite/messaging-types.d.ts.map +1 -1
  39. package/dist/naite/messaging-types.js +1 -1
  40. package/dist/naite/naite.js +2 -2
  41. package/dist/stream/sse.d.ts +2 -6
  42. package/dist/stream/sse.d.ts.map +1 -1
  43. package/dist/stream/sse.js +9 -3
  44. package/dist/syncer/api-parser.d.ts.map +1 -1
  45. package/dist/syncer/api-parser.js +7 -2
  46. package/dist/syncer/file-patterns.d.ts +1 -1
  47. package/dist/syncer/file-patterns.d.ts.map +1 -1
  48. package/dist/syncer/file-patterns.js +6 -5
  49. package/dist/syncer/module-loader.d.ts +5 -0
  50. package/dist/syncer/module-loader.d.ts.map +1 -1
  51. package/dist/syncer/module-loader.js +17 -1
  52. package/dist/syncer/syncer.d.ts +5 -1
  53. package/dist/syncer/syncer.d.ts.map +1 -1
  54. package/dist/syncer/syncer.js +28 -19
  55. package/dist/tasks/decorator.d.ts +26 -0
  56. package/dist/tasks/decorator.d.ts.map +1 -0
  57. package/dist/tasks/decorator.js +28 -0
  58. package/dist/tasks/step-wrapper.d.ts +18 -0
  59. package/dist/tasks/step-wrapper.d.ts.map +1 -0
  60. package/dist/tasks/step-wrapper.js +38 -0
  61. package/dist/tasks/workflow-manager.d.ts +40 -0
  62. package/dist/tasks/workflow-manager.d.ts.map +1 -0
  63. package/dist/tasks/workflow-manager.js +193 -0
  64. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  65. package/dist/template/implementations/generated.template.js +7 -3
  66. package/dist/types/types.d.ts +26 -10
  67. package/dist/types/types.d.ts.map +1 -1
  68. package/dist/types/types.js +15 -2
  69. package/dist/ui/ai-api.d.ts +1 -0
  70. package/dist/ui/ai-api.d.ts.map +1 -0
  71. package/dist/ui/ai-api.js +50 -0
  72. package/dist/ui/ai-client.d.ts +1 -0
  73. package/dist/ui/ai-client.d.ts.map +1 -0
  74. package/dist/ui/ai-client.js +438 -0
  75. package/dist/ui/api.d.ts +3 -0
  76. package/dist/ui/api.d.ts.map +1 -0
  77. package/dist/ui/api.js +680 -0
  78. package/dist/ui-web/assets/brand-icons-Cu_C0hZ4.svg +1008 -0
  79. package/dist/ui-web/assets/brand-icons-F3SPCeH1.woff +0 -0
  80. package/dist/ui-web/assets/brand-icons-XL9sxUpA.woff2 +0 -0
  81. package/dist/ui-web/assets/brand-icons-sqJ2Pg7a.eot +0 -0
  82. package/dist/ui-web/assets/brand-icons-ubhWoxly.ttf +0 -0
  83. package/dist/ui-web/assets/flags-DOLqOU7Y.png +0 -0
  84. package/dist/ui-web/assets/icons-BOCtAERH.woff +0 -0
  85. package/dist/ui-web/assets/icons-CHzK1VD9.eot +0 -0
  86. package/dist/ui-web/assets/icons-D29ZQHHw.ttf +0 -0
  87. package/dist/ui-web/assets/icons-Du6TOHnR.woff2 +0 -0
  88. package/dist/ui-web/assets/icons-RwhydX30.svg +1518 -0
  89. package/dist/ui-web/assets/index-CpaB9P6g.css +1 -0
  90. package/dist/ui-web/assets/index-J9MCfjCd.js +95 -0
  91. package/dist/ui-web/assets/outline-icons-BfdLr8tr.svg +366 -0
  92. package/dist/ui-web/assets/outline-icons-DD8jm0uy.ttf +0 -0
  93. package/dist/ui-web/assets/outline-icons-DInHoiqI.woff2 +0 -0
  94. package/dist/ui-web/assets/outline-icons-LX8adJ4n.eot +0 -0
  95. package/dist/ui-web/assets/outline-icons-aQ88nltS.woff +0 -0
  96. package/dist/ui-web/assets/provider-utils_false-BKJD46kk.js +1 -0
  97. package/dist/ui-web/assets/provider-utils_false-Bu5lmX18.js +1 -0
  98. package/dist/ui-web/index.html +13 -0
  99. package/dist/ui-web/vite.svg +1 -0
  100. package/dist/utils/formatter.d.ts.map +1 -1
  101. package/dist/utils/formatter.js +10 -2
  102. package/dist/utils/model.d.ts +9 -2
  103. package/dist/utils/model.d.ts.map +1 -1
  104. package/dist/utils/model.js +16 -1
  105. package/dist/utils/type-utils.d.ts.map +1 -1
  106. package/dist/utils/type-utils.js +3 -1
  107. package/dist/vector/embedding.d.ts +2 -5
  108. package/dist/vector/embedding.d.ts.map +1 -1
  109. package/dist/vector/embedding.js +9 -13
  110. package/dist/vector/types.d.ts.map +1 -1
  111. package/dist/vector/types.js +1 -1
  112. package/package.json +9 -5
  113. package/src/api/config.ts +15 -11
  114. package/src/api/sonamu.ts +60 -6
  115. package/src/bin/cli.ts +57 -119
  116. package/src/database/base-model.ts +21 -128
  117. package/src/database/base-model.types.ts +3 -4
  118. package/src/database/db.ts +28 -18
  119. package/src/database/puri-subset.test-d.ts +1 -0
  120. package/src/database/puri-subset.types.ts +2 -0
  121. package/src/database/puri.ts +238 -27
  122. package/src/database/puri.types.test-d.ts +1 -1
  123. package/src/database/puri.types.ts +49 -6
  124. package/src/entity/entity-manager.ts +9 -0
  125. package/src/index.ts +1 -1
  126. package/src/migration/code-generation.ts +40 -1
  127. package/src/migration/postgresql-schema-reader.ts +53 -22
  128. package/src/naite/messaging-types.ts +43 -44
  129. package/src/naite/naite.ts +1 -1
  130. package/src/shared/app.shared.ts.txt +13 -0
  131. package/src/shared/web.shared.ts.txt +13 -0
  132. package/src/stream/sse.ts +15 -3
  133. package/src/syncer/api-parser.ts +6 -1
  134. package/src/syncer/file-patterns.ts +11 -9
  135. package/src/syncer/module-loader.ts +35 -0
  136. package/src/syncer/syncer.ts +34 -21
  137. package/src/tasks/decorator.ts +71 -0
  138. package/src/tasks/step-wrapper.ts +84 -0
  139. package/src/tasks/workflow-manager.ts +330 -0
  140. package/src/template/implementations/generated.template.ts +19 -6
  141. package/src/types/types.ts +20 -4
  142. package/src/ui/ai-api.ts +60 -0
  143. package/src/ui/ai-client.ts +499 -0
  144. package/src/ui/api.ts +786 -0
  145. package/src/utils/formatter.ts +8 -1
  146. package/src/utils/model.ts +26 -2
  147. package/src/utils/type-utils.ts +2 -0
  148. package/src/vector/embedding.ts +10 -14
  149. package/src/vector/types.ts +1 -2
  150. package/dist/vector/vector-search.d.ts +0 -47
  151. package/dist/vector/vector-search.d.ts.map +0 -1
  152. package/dist/vector/vector-search.js +0 -176
  153. package/src/vector/vector-search.ts +0 -261
@@ -1,6 +1,6 @@
1
1
  import equal from "fast-deep-equal";
2
2
  import { alphabetical, diff } from "radashi";
3
- import { Naite } from "../index.js";
3
+ import { EntityManager, Naite } from "../index.js";
4
4
  import { formatCode } from "../utils/formatter.js";
5
5
  import { differenceWith, intersectionBy } from "../utils/utils.js";
6
6
  /**
@@ -166,6 +166,9 @@ function getPgArrayType(column, elementType) {
166
166
  if (index.type === "hnsw" || index.type === "ivfflat") {
167
167
  return genVectorIndexDefinition(index, table);
168
168
  }
169
+ if (index.using === "pgroonga") {
170
+ return genPgroongaIndexDefinition(index, table);
171
+ }
169
172
  const methodMap = {
170
173
  index: "INDEX",
171
174
  unique: "UNIQUE INDEX"
@@ -184,6 +187,34 @@ function getPgArrayType(column, elementType) {
184
187
  }).join(", ")})${nullsNotDistinctClause};\`
185
188
  );`;
186
189
  }
190
+ function genPgroongaIndexDefinition(index, table) {
191
+ const entity = EntityManager.getByTable(table);
192
+ // 복합 인덱스인 경우 ARRAY 사용
193
+ const columnClause = (()=>{
194
+ if (index.columns.length === 1) {
195
+ const column = entity.propsDict[index.columns[0].name];
196
+ const option = getPgroongaColumnOption(column);
197
+ return `${index.columns[0].name}${option ? ` ${option}` : ""}`;
198
+ }
199
+ return `(ARRAY[${index.columns.map((col)=>`${col.name}::text`).join(",")}])`;
200
+ })();
201
+ return `await knex.raw(
202
+ \`CREATE INDEX ${index.name} ON ${table} USING pgroonga (${columnClause}) WITH (tokenizer='TokenMecab');\`
203
+ )`;
204
+ }
205
+ /**
206
+ * PGroonga 컬럼 옵션 추출
207
+ *
208
+ * FullText 오퍼레이터를 지원하는 경우 우선 설정, 나머지는 디폴트 이용
209
+ * @link https://pgroonga.github.io/reference
210
+ */ function getPgroongaColumnOption(column) {
211
+ if (column.type === "string" && column.length !== undefined) {
212
+ return "pgroonga_varchar_full_text_search_ops_v2";
213
+ } else if (column.type === "json") {
214
+ return "pgroonga_jsonb_full_text_search_ops_v2";
215
+ }
216
+ return null;
217
+ }
187
218
  /**
188
219
  * @description
189
220
  * - HNSW (Hierarchical Navigable Small World): 느린 빌드, 빠른 검색 속도, 높은 메모리 및 정확도
@@ -807,4 +838,4 @@ function getPgArrayType(column, elementType) {
807
838
  return alterCodes.filter((alterCode)=>alterCode !== null).flat();
808
839
  }
809
840
 
810
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vY29kZS1nZW5lcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBhbHBoYWJldGljYWwsIGRpZmYgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB0eXBlIHtcbiAgR2VuTWlncmF0aW9uQ29kZSxcbiAgTWlncmF0aW9uQ29sdW1uLFxuICBNaWdyYXRpb25Gb3JlaWduLFxuICBNaWdyYXRpb25JbmRleCxcbiAgTWlncmF0aW9uU2V0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBkaWZmZXJlbmNlV2l0aCwgaW50ZXJzZWN0aW9uQnkgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxuLyoqXG4gKiDsu6zrn7wg7KCV7J2YIOqysOqzvCDtg4DsnoVcbiAqIC0gYnVpbGRlcjogS25leCB0YWJsZSBidWlsZGVyIOuplOyEnOuTnOuhnCDsi6TtlontlaAg6rWs66y4ICh0YWJsZS54eHgoKSlcbiAqIC0gcmF3OiBrbmV4LnJhdygp66GcIOyLpO2Wie2VoCDqtazrrLhcbiAqL1xudHlwZSBDb2x1bW5EZWZpbml0aW9uUmVzdWx0ID0ge1xuICBidWlsZGVyOiBzdHJpbmdbXTtcbiAgcmF3OiBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICog7YWM7J2067iUIOyDneyEse2VmOuKlCDsvIDsnbTsiqQgLSDsu6zrn7wv7J24642x7IqkIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNyZWF0ZUNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgdGFibGU6IHN0cmluZyxcbiAgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGU+IHtcbiAgY29uc3QgY29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zKTtcblxuICAvLyDsu6zrn7wsIOyduOuNseyKpCDsspjrpqxcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGBhd2FpdCBrbmV4LnNjaGVtYS5jcmVhdGVUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgLi4uY29sdW1uRGVmcy5idWlsZGVyLFxuICAgIFwifSk7XCIsXG4gICAgLy8gcmF3IOq1rOusuCAoR2VuZXJhdGVkIENvbHVtbiDrk7EpXG4gICAgLi4uY29sdW1uRGVmcy5yYXcsXG4gICAgLy8gaW5kZXjripQga25leC5yYXfroZwg7LKY66as7ZWY66+A66GcIGNyZWF0ZVRhYmxlIOuwluyXkOyEnCDsi6TtlolcbiAgICAuLi5pbmRleGVzLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgICBcIn1cIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGAgcmV0dXJuIGtuZXguc2NoZW1hLmRyb3BUYWJsZShcIiR7dGFibGV9XCIpO2AsXG4gICAgXCJ9XCIsXG4gIF07XG4gIHJldHVybiB7XG4gICAgdGFibGUsXG4gICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB0aXRsZTogYGNyZWF0ZV9fJHt0YWJsZX1gLFxuICAgIGZvcm1hdHRlZDogZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBcInR5cGVzY3JpcHRcIiwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBNaWdyYXRpb25Db2x1bW5bXSDsnb3slrTshJwg7Lus65+8IOygleydmO2VmOuKlCDqtazrrLgg7IOd7ISxXG4gKiBAcmV0dXJucyBidWlsZGVyOiB0YWJsZSBidWlsZGVyIOuplOyEnOuTnCwgcmF3OiBrbmV4LnJhdygpIOq1rOusuFxuICovXG5mdW5jdGlvbiBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZTogc3RyaW5nLCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSk6IENvbHVtbkRlZmluaXRpb25SZXN1bHQge1xuICBjb25zdCByZXN1bHQ6IENvbHVtbkRlZmluaXRpb25SZXN1bHQgPSB7XG4gICAgYnVpbGRlcjogW10sXG4gICAgcmF3OiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgLy8gR2VuZXJhdGVkIENvbHVtbuydgCByYXfroZwg7LKY66asXG4gICAgaWYgKGNvbHVtbi5nZW5lcmF0ZWQpIHtcbiAgICAgIHJlc3VsdC5yYXcucHVzaChnZW5HZW5lcmF0ZWRDb2x1bW5EZWZpbml0aW9uKHRhYmxlLCBjb2x1bW4pKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIOydvOuwmCDsu6zrn7zsnYAgYnVpbGRlcuuhnCDsspjrpqxcbiAgICByZXN1bHQuYnVpbGRlci5wdXNoKGdlbk5vcm1hbENvbHVtbkRlZmluaXRpb24oY29sdW1uKSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlZCBDb2x1bW4g7KCV7J2YIOyDneyEsSAoQUxURVIgVEFCTEUgQUREIENPTFVNTiDsgqzsmqkpXG4gKi9cbmZ1bmN0aW9uIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGU6IHN0cmluZywgY29sdW1uOiBNaWdyYXRpb25Db2x1bW4pOiBzdHJpbmcge1xuICBpZiAoIWNvbHVtbi5nZW5lcmF0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0ZWQgY29sdW1uIGRlZmluaXRpb24gcmVxdWlyZWRcIik7XG4gIH1cbiAgY29uc3QgcGdUeXBlID0gZ2V0UGdUeXBlRm9yQ29sdW1uKGNvbHVtbik7XG4gIGNvbnN0IHN0b3JhZ2VUeXBlID0gY29sdW1uLmdlbmVyYXRlZC50eXBlID09PSBcIlZJUlRVQUxcIiA/IFwiIFZJUlRVQUxcIiA6IFwiIFNUT1JFRFwiO1xuICBjb25zdCBudWxsYWJsZUNsYXVzZSA9IGNvbHVtbi5udWxsYWJsZSA/IFwiXCIgOiBcIiBOT1QgTlVMTFwiO1xuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYEFMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBBREQgQ09MVU1OIFwiJHtjb2x1bW4ubmFtZX1cIiAke3BnVHlwZX0gR0VORVJBVEVEIEFMV0FZUyBBUyAoJHtjb2x1bW4uZ2VuZXJhdGVkLmV4cHJlc3Npb259KSR7c3RvcmFnZVR5cGV9JHtudWxsYWJsZUNsYXVzZX1cXGApO2A7XG59XG5cbi8qKlxuICog7J2867CYIOy7rOufvCDsoJXsnZgg7IOd7ISxICh0YWJsZS54eHgoKSDssrTsnbgpXG4gKi9cbmZ1bmN0aW9uIGdlbk5vcm1hbENvbHVtbkRlZmluaXRpb24oY29sdW1uOiBNaWdyYXRpb25Db2x1bW4pOiBzdHJpbmcge1xuICBjb25zdCBjaGFpbnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKGNvbHVtbi5uYW1lID09PSBcImlkXCIpIHtcbiAgICByZXR1cm4gYHRhYmxlLmluY3JlbWVudHMoKS5wcmltYXJ5KCk7YDtcbiAgfVxuXG4gIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gIGlmIChjb2x1bW4udHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb2x1bW4udHlwZS5zbGljZSgwLCAtMik7IC8vIFwiaW50ZWdlcltdXCIgLT4gXCJpbnRlZ2VyXCJcbiAgICBjb25zdCBwZ1R5cGUgPSBnZXRQZ0FycmF5VHlwZShjb2x1bW4sIGVsZW1lbnRUeXBlKTtcbiAgICBjaGFpbnMucHVzaChgc3BlY2lmaWNUeXBlKCcke2NvbHVtbi5uYW1lfScsICcke3BnVHlwZX0nKWApO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcInZlY3RvclwiKSB7XG4gICAgLy8gS25leOuKlCB2ZWN0b3Ig7YOA7J6F7J2EIOyngeygkSDsp4Dsm5DtlZjsp4Ag7JWK7Jy866+A66GcIHNwZWNpZmljVHlwZSDsgqzsmqlcbiAgICBjaGFpbnMucHVzaChgc3BlY2lmaWNUeXBlKCcke2NvbHVtbi5uYW1lfScsICd2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pJylgKTtcbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJudW1iZXJPck51bWVyaWNcIikge1xuICAgIC8vIG51bWJlclxuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJyZWFsXCIpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBmbG9hdCgnJHtjb2x1bW4ubmFtZX0nKWApO1xuICAgIH0gZWxzZSBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwiZG91YmxlIHByZWNpc2lvblwiKSB7XG4gICAgICBjaGFpbnMucHVzaChgZG91YmxlKCcke2NvbHVtbi5uYW1lfScpYCk7XG4gICAgfSBlbHNlIGlmICgoY29sdW1uLm51bWJlclR5cGUgPz8gXCJudW1lcmljXCIpID09PSBcIm51bWVyaWNcIikge1xuICAgICAgY2hhaW5zLnB1c2goYGRlY2ltYWwoJyR7Y29sdW1uLm5hbWV9JywgJHtjb2x1bW4ucHJlY2lzaW9ufSwgJHtjb2x1bW4uc2NhbGV9KWApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIC8vIHN0cmluZ1xuICAgIGlmIChjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBzdHJpbmcoJyR7Y29sdW1uLm5hbWV9JywgJHtjb2x1bW4ubGVuZ3RofSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhaW5zLnB1c2goYHRleHQoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwiZGF0ZVwiKSB7XG4gICAgLy8gZGF0ZVxuICAgIGNoYWlucy5wdXNoKGB0aW1lc3RhbXAoJyR7Y29sdW1uLm5hbWV9JywgeyB1c2VUejogdHJ1ZSB9KWApO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcImpzb25cIikge1xuICAgIC8vIGpzb25cbiAgICBjaGFpbnMucHVzaChganNvbmIoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0eXBlLCBsZW5ndGhcbiAgICBsZXQgZXh0cmFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY2hhaW5zLnB1c2goXG4gICAgICBgJHtjb2x1bW4udHlwZX0oJyR7Y29sdW1uLm5hbWV9JyR7XG4gICAgICAgIGNvbHVtbi5sZW5ndGggPyBgLCAke2NvbHVtbi5sZW5ndGh9YCA6IFwiXCJcbiAgICAgIH0ke2V4dHJhVHlwZSA/IGAsICcke2V4dHJhVHlwZX0nYCA6IFwiXCJ9KWAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIG51bGxhYmxlXG4gIGNoYWlucy5wdXNoKGNvbHVtbi5udWxsYWJsZSA/IFwibnVsbGFibGUoKVwiIDogXCJub3ROdWxsYWJsZSgpXCIpO1xuXG4gIC8vIGRlZmF1bHRUb1xuICBpZiAoY29sdW1uLmRlZmF1bHRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW4uZGVmYXVsdFRvID09PSBcInN0cmluZ1wiICYmIGNvbHVtbi5kZWZhdWx0VG8uc3RhcnRzV2l0aChgXCJgKSkge1xuICAgICAgY2hhaW5zLnB1c2goYGRlZmF1bHRUbygke2NvbHVtbi5kZWZhdWx0VG99KWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFpbnMucHVzaChgZGVmYXVsdFRvKGtuZXgucmF3KCcke2NvbHVtbi5kZWZhdWx0VG99JykpYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGB0YWJsZS4ke2NoYWlucy5qb2luKFwiLlwiKX07YDtcbn1cblxuLyoqXG4gKiBNaWdyYXRpb25Db2x1bW7snZgg7YOA7J6F7J2EIFBvc3RncmVTUUwg7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZhcbiAqL1xuZnVuY3Rpb24gZ2V0UGdUeXBlRm9yQ29sdW1uKGNvbHVtbjogTWlncmF0aW9uQ29sdW1uKTogc3RyaW5nIHtcbiAgaWYgKGNvbHVtbi50eXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICBjb25zdCBlbGVtZW50VHlwZSA9IGNvbHVtbi50eXBlLnNsaWNlKDAsIC0yKTtcbiAgICByZXR1cm4gZ2V0UGdBcnJheVR5cGUoY29sdW1uLCBlbGVtZW50VHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIGNvbHVtbi5sZW5ndGggIT09IHVuZGVmaW5lZCA/IGB2YXJjaGFyKCR7Y29sdW1uLmxlbmd0aH0pYCA6IFwidGV4dFwiO1xuICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gXCJiaWdpbnRcIjtcbiAgICBjYXNlIFwibnVtYmVyT3JOdW1lcmljXCI6XG4gICAgICBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwicmVhbFwiKSByZXR1cm4gXCJyZWFsXCI7XG4gICAgICBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwiZG91YmxlIHByZWNpc2lvblwiKSByZXR1cm4gXCJkb3VibGUgcHJlY2lzaW9uXCI7XG4gICAgICByZXR1cm4gYG51bWVyaWMoJHtjb2x1bW4ucHJlY2lzaW9ufSwgJHtjb2x1bW4uc2NhbGV9KWA7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcInRpbWVzdGFtcHR6XCI7XG4gICAgY2FzZSBcImpzb25cIjpcbiAgICAgIHJldHVybiBcImpzb25iXCI7XG4gICAgY2FzZSBcInZlY3RvclwiOlxuICAgICAgcmV0dXJuIGB2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pYDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNvbHVtbi50eXBlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBnQXJyYXlUeXBlKGNvbHVtbjogTWlncmF0aW9uQ29sdW1uLCBlbGVtZW50VHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcIm51bWJlck9yTnVtZXJpY1wiKSB7XG4gICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcInJlYWxcIikgcmV0dXJuIFwicmVhbFtdXCI7XG4gICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcImRvdWJsZSBwcmVjaXNpb25cIikgcmV0dXJuIFwiZG91YmxlIHByZWNpc2lvbltdXCI7XG4gICAgcmV0dXJuIGBudW1lcmljKCR7Y29sdW1uLnByZWNpc2lvbn0sICR7Y29sdW1uLnNjYWxlfSlbXWA7XG4gIH1cbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGNvbHVtbi5sZW5ndGggPyBgdmFyY2hhcigke2NvbHVtbi5sZW5ndGh9KVtdYCA6IFwidGV4dFtdXCI7XG4gIH1cbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImRhdGVcIikgcmV0dXJuIFwidGltZXN0YW1wdHpbXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJpbnRlZ2VyW11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImJpZ0ludGVnZXJcIikgcmV0dXJuIFwiYmlnaW50W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFwiYm9vbGVhbltdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJ1dWlkXCIpIHJldHVybiBcInV1aWRbXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwiZW51bVwiKSByZXR1cm4gXCJ0ZXh0W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcInZlY3RvclwiKSByZXR1cm4gYHZlY3Rvcigke2NvbHVtbi5kaW1lbnNpb25zfSlbXWA7XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFycmF5IGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gKTtcbn1cblxuLyoqXG4gKiDqsJzrs4Qg7J24642x7IqkIOygleydmCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4OiBNaWdyYXRpb25JbmRleCwgdGFibGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpbmRleC50eXBlID09PSBcImhuc3dcIiB8fCBpbmRleC50eXBlID09PSBcIml2ZmZsYXRcIikge1xuICAgIHJldHVybiBnZW5WZWN0b3JJbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKTtcbiAgfVxuXG4gIGNvbnN0IG1ldGhvZE1hcCA9IHtcbiAgICBpbmRleDogXCJJTkRFWFwiLFxuICAgIHVuaXF1ZTogXCJVTklRVUUgSU5ERVhcIixcbiAgfTtcblxuICBjb25zdCBudWxsc05vdERpc3RpbmN0Q2xhdXNlID1cbiAgICBpbmRleC50eXBlID09PSBcInVuaXF1ZVwiICYmIGluZGV4Lm51bGxzTm90RGlzdGluY3QgIT09IHVuZGVmaW5lZFxuICAgICAgPyBgIE5VTExTICR7aW5kZXgubnVsbHNOb3REaXN0aW5jdCA/IFwiTk9UIERJU1RJTkNUXCIgOiBcIkRJU1RJTkNUXCJ9YFxuICAgICAgOiBcIlwiO1xuXG4gIGNvbnN0IHVzaW5nQ2xhdXNlID0gaW5kZXgudXNpbmcgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBgVVNJTkcgJHtpbmRleC51c2luZ31gO1xuXG4gIHJldHVybiBgYXdhaXQga25leC5yYXcoXG4gIFxcYENSRUFURSAke21ldGhvZE1hcFtpbmRleC50eXBlXX0gJHtpbmRleC5uYW1lfSBPTiAke3RhYmxlfSAke3VzaW5nQ2xhdXNlfSgke2luZGV4LmNvbHVtbnNcbiAgICAubWFwKChjb2wpID0+IHtcbiAgICAgIC8vIOygleugrCDsmLXshZjsnYAgYnRyZWXrp4wg7IKs7JqpIOqwgOuKpVxuICAgICAgaWYgKGluZGV4LnVzaW5nICE9PSBcImJ0cmVlXCIgJiYgaW5kZXgudXNpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYCR7Y29sLm5hbWV9YDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc29ydE9yZGVyQ2xhdXNlID0gY29sLnNvcnRPcmRlciA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGAgJHtjb2wuc29ydE9yZGVyfWA7XG4gICAgICBjb25zdCBudWxsc0ZpcnN0Q2xhdXNlID1cbiAgICAgICAgY29sLm51bGxzRmlyc3QgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBgIE5VTExTICR7Y29sLm51bGxzRmlyc3QgPyBcIkZJUlNUXCIgOiBcIkxBU1RcIn1gO1xuICAgICAgcmV0dXJuIGAke2NvbC5uYW1lfSR7c29ydE9yZGVyQ2xhdXNlfSR7bnVsbHNGaXJzdENsYXVzZX1gO1xuICAgIH0pXG4gICAgLmpvaW4oXCIsIFwiKX0pJHtudWxsc05vdERpc3RpbmN0Q2xhdXNlfTtcXGBcbiAgKTtgO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogLSBITlNXIChIaWVyYXJjaGljYWwgTmF2aWdhYmxlIFNtYWxsIFdvcmxkKTog64qQ66awIOu5jOuTnCwg67mg66W4IOqygOyDiSDsho3rj4QsIOuGkuydgCDrqZTrqqjrpqwg67CPIOygle2ZleuPhFxuICogLSBJVkZGbGF0IChJbnZlcnRlZCBGaWxlIHdpdGggRmxhdCBDb21wcmVzc2lvbik6IOu5oOuluCDruYzrk5wsIOykkeqwhCDqsoDsg4kg7IaN64+ELCDrgq7snYAg66mU66qo66asXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhOU1cg7J24642x7IqkICjqtozsnqUgLSDruaDrpbgg6rKA7IOJLCDrhpLsnYAg7KCV7ZmV64+EKVxuICogQ1JFQVRFIElOREVYIGlkeF9lbWJlZGRpbmcgT04gaXRlbXMgVVNJTkcgaG5zdyAoZW1iZWRkaW5nIHZlY3Rvcl9jb3NpbmVfb3BzKSBXSVRIIChtID0gMTYsIGVmX2NvbnN0cnVjdGlvbiA9IDY0KTtcbiAqXG4gKiAvLyBJVkZGbGF0IOyduOuNseyKpCAo64yA7Jqp65+JIOuNsOydtO2EsCwg67mE7JqpIOykkeyalCDsi5wpXG4gKiBDUkVBVEUgSU5ERVggaWR4X2VtYmVkZGluZyBPTiBpdGVtcyBVU0lORyBpdmZmbGF0IChlbWJlZGRpbmcgdmVjdG9yX2Nvc2luZV9vcHMpIFdJVEggKGxpc3RzID0gMTAwKTtcbiAqL1xuZnVuY3Rpb24gZ2VuVmVjdG9ySW5kZXhEZWZpbml0aW9uKGluZGV4OiBNaWdyYXRpb25JbmRleCwgdGFibGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbHVtbiA9IGluZGV4LmNvbHVtbnNbMF07XG4gIGNvbnN0IHZlY3Rvck9wcyA9IGNvbHVtbi52ZWN0b3JPcHMgPz8gXCJ2ZWN0b3JfY29zaW5lX29wc1wiO1xuXG4gIC8vIEhOU1cgKEhpZXJhcmNoaWNhbCBOYXZpZ2FibGUgU21hbGwgV29ybGQpIC0g6raM7J6lOiDruaDrpbgg6rKA7IOJLCDrhpLsnYAg7KCV7ZmV64+EXG4gIGlmIChpbmRleC50eXBlID09PSBcImhuc3dcIikge1xuICAgIGNvbnN0IG0gPSBpbmRleC5tID8/IDE2O1xuICAgIGNvbnN0IGVmQ29uc3RydWN0aW9uID0gaW5kZXguZWZDb25zdHJ1Y3Rpb24gPz8gNjQ7XG4gICAgcmV0dXJuIGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgSU5ERVggJHtpbmRleC5uYW1lfSBPTiAke3RhYmxlfSBVU0lORyBobnN3ICgke2NvbHVtbi5uYW1lfSAke3ZlY3Rvck9wc30pIFdJVEggKG0gPSAke219LCBlZl9jb25zdHJ1Y3Rpb24gPSAke2VmQ29uc3RydWN0aW9ufSlcXGApO2A7XG4gIH1cblxuICAvLyBJVkZGbGF0IChJbnZlcnRlZCBGaWxlIHdpdGggRmxhdCBDb21wcmVzc2lvbikgLSDrjIDsmqnrn4ksIOu5hOyaqSDspJHsmpQg7IucXG4gIGlmIChpbmRleC50eXBlID09PSBcIml2ZmZsYXRcIikge1xuICAgIGNvbnN0IGxpc3RzID0gaW5kZXgubGlzdHMgPz8gMTAwO1xuICAgIHJldHVybiBgYXdhaXQga25leC5yYXcoXFxgQ1JFQVRFIElOREVYICR7aW5kZXgubmFtZX0gT04gJHt0YWJsZX0gVVNJTkcgaXZmZmxhdCAoJHtjb2x1bW4ubmFtZX0gJHt2ZWN0b3JPcHN9KSBXSVRIIChsaXN0cyA9ICR7bGlzdHN9KVxcYCk7YDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByYXcgU1FMIGluZGV4IHR5cGU6ICR7aW5kZXgudHlwZX1gKTtcbn1cblxuLyoqXG4gKiDthYzsnbTruJQg7IOd7ISx7ZWY64qUIOy8gOydtOyKpCAtIEZLIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNyZWF0ZUNvZGVfRm9yZWlnbihcbiAgdGFibGU6IHN0cmluZyxcbiAgZm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIGlmIChmb3JlaWducy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCB7IHVwLCBkb3duIH0gPSBnZW5Gb3JlaWduRGVmaW5pdGlvbnModGFibGUsIGZvcmVpZ25zKTtcbiAgaWYgKHVwLmxlbmd0aCA9PT0gMCAmJiBkb3duLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUubG9nKFwiZmsg6rCAIOutlOqwgCDri6TrpoXri4jri6RcIik7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGByZXR1cm4ga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgXCIvLyBjcmVhdGUgZmtcIixcbiAgICAuLi51cCxcbiAgICBcIn0pO1wiLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICBcIi8vIGRyb3AgZmtcIixcbiAgICAuLi5kb3duLFxuICAgIFwifSk7XCIsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9yZWlnbktleXNTdHJpbmcgPSBmb3JlaWducy5tYXAoKGZvcmVpZ24pID0+IGZvcmVpZ24uY29sdW1ucy5qb2luKFwiX1wiKSkuam9pbihcIl9cIik7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdGFibGUsXG4gICAgICB0eXBlOiBcImZvcmVpZ25cIixcbiAgICAgIHRpdGxlOiBgZm9yZWlnbl9fJHt0YWJsZX1fXyR7Zm9yZWlnbktleXNTdHJpbmd9YCxcbiAgICAgIGZvcm1hdHRlZDogZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBcInR5cGVzY3JpcHRcIiwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKSxcbiAgICB9LFxuICBdO1xufVxuXG4vKipcbiAqIE1pZ3JhdGlvbkZvcmVpZ25bXSDsnb3slrTshJwg7Jm467aA7YKkIGNvbnN0cmFpbnQg7KCV7J2Y7ZWY64qUIOq1rOusuCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuRm9yZWlnbkRlZmluaXRpb25zKFxuICB0YWJsZTogc3RyaW5nLFxuICBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuKTogeyB1cDogc3RyaW5nW107IGRvd246IHN0cmluZ1tdIH0ge1xuICByZXR1cm4gZm9yZWlnbnMucmVkdWNlKFxuICAgIChyLCBmb3JlaWduKSA9PiB7XG4gICAgICBjb25zdCBjb2x1bW5zU3RyaW5nUXVvdGUgPSBmb3JlaWduLmNvbHVtbnNcbiAgICAgICAgLm1hcCgoY29sKSA9PiBgJyR7Y29sLnJlcGxhY2UoYCR7dGFibGV9LmAsIFwiXCIpfSdgKVxuICAgICAgICAuam9pbihcIixcIik7XG4gICAgICByLnVwLnB1c2goXG4gICAgICAgIGB0YWJsZS5mb3JlaWduKCcke2ZvcmVpZ24uY29sdW1ucy5qb2luKFwiLFwiKX0nKVxuICAgICAgICAgICAgLnJlZmVyZW5jZXMoJyR7Zm9yZWlnbi50b30nKVxuICAgICAgICAgICAgLm9uVXBkYXRlKCcke2ZvcmVpZ24ub25VcGRhdGV9JylcbiAgICAgICAgICAgIC5vbkRlbGV0ZSgnJHtmb3JlaWduLm9uRGVsZXRlfScpYCxcbiAgICAgICk7XG4gICAgICByLmRvd24ucHVzaChgdGFibGUuZHJvcEZvcmVpZ24oWyR7Y29sdW1uc1N0cmluZ1F1b3RlfV0pYCk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgIHtcbiAgICAgIHVwOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgIGRvd246IFtdIGFzIHN0cmluZ1tdLFxuICAgIH0sXG4gICk7XG59XG5cbi8qKlxuICog7YWM7J2067iUIOuzgOqyvSDsvIDsnbTsiqQgLSDsu6zrn7wv7J24642x7IqkIOuzgOqyvVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgZW50aXR5SW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSxcbiAgZGJDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSxcbiAgZGJJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBkYkZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICAvKlxuICAgIOyEuOu2gCDruYTqtZAg7ZuEIOuLpOuluOygkCDssL7slYTshJwg7L2U65OcIOyDneyEsVxuXG4gICAgMS4g7Lus65+86rCv7IiYIOuLpOumhDogTUTsl5Ag7J6I7Jy864KYLCBEQuyXkCDsl4bri6TrqbQg7LaU6rCAXG4gICAgMi4g7Lus65+86rCv7IiYIOuLpOumhDogTUTsl5Ag7JeG7Jy864KYLCBEQuyXkCDsnojri6TrqbQg7IKt7KCcXG4gICAgMy4g6re47Jm4IOy7rOufvCjsu6zrn7wg6rCv7IiY6rCAIOuPmeydvO2VmOqxsOuCmCwg64uk66W4IOqyveyasCDrj5nsnbztlZwg7Lus65+864G866asKSA9PiBhbHRlclxuICAgIDQuIOuLpOuluOqxsCDri6Qg64+Z7J287ZWY6rOgIGluZGV466eMIOuzgOqyveuQmOuKlCDqsr3smrBcblxuICAgICoqIOy7rOufvOuqheydhCDrs4Dqsr3tlZjripQg6rK97Jqw64qUIOuUsOuhnCDtlbjrk6Trp4HtlZjsp4Ag7JWK7J2MXG4gICAgPT4gZHJvcC9hZGQg7ZiV7YOc7J2YIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5zqsIAg7IOd7ISx65CY64qU642wLCDsiJjrj5nsnLzroZwgcmVuYW1lIOy9lOuTnOuhnCDsiJjsoJXtlZjsl6wg7LKY66asXG4gICovXG5cbiAgLy8g6rCBIOy7rOufvCDsnbTrpoQg6riw7KSA7Jy866GcIGFkZCwgZHJvcCwgYWx0ZXIg7Jes67aAIO2ZleyduFxuICBjb25zdCBhbHRlckNvbHVtbnNUbyA9IGdldEFsdGVyQ29sdW1uc1RvKGVudGl0eUNvbHVtbnMsIGRiQ29sdW1ucyk7XG5cbiAgLy8g7LaU7Lac65CcIOy7rOufvOuTpOydhCDquLDspIDsnLzroZwg6rCB6rCBIOudvOyduCDsg53shLFcbiAgY29uc3QgYWx0ZXJDb2x1bW5MaW5lc1RvID0gZ2V0QWx0ZXJDb2x1bW5MaW5lc1RvKFxuICAgIGFsdGVyQ29sdW1uc1RvLFxuICAgIGVudGl0eUNvbHVtbnMsXG4gICAgdGFibGUsXG4gICAgZGJGb3JlaWducyxcbiAgKTtcblxuICAvLyDsnbjrjbHsiqTsnZggYWRkLCBkcm9wIOyXrOu2gCDtmZXsnbhcbiAgY29uc3QgYWx0ZXJJbmRleGVzVG8gPSBnZXRBbHRlckluZGV4ZXNUbyhlbnRpdHlJbmRleGVzLCBkYkluZGV4ZXMpO1xuXG4gIC8vIOyduOuNseyKpOqwgCDsgq3soJzrkJjripQg6rK97JqwLCDsu6zrn7zqs7wg6rCZ7J20IOyCreygnOuQnCDsvIDsnbTsiqTsl5DripQgZHJvcOyXkOyEnCDsoJzsmbjtlbTslbztlaghXG4gIGNvbnN0IGluZGV4TmVlZHNUb0Ryb3AgPSBhbHRlckluZGV4ZXNUby5kcm9wLmZpbHRlcihcbiAgICAoaW5kZXgpID0+XG4gICAgICBpbmRleC5jb2x1bW5zLmV2ZXJ5KCh7IG5hbWUgfSkgPT5cbiAgICAgICAgYWx0ZXJDb2x1bW5zVG8uZHJvcC5tYXAoKGNvbCkgPT4gY29sLm5hbWUpLmluY2x1ZGVzKG5hbWUpLFxuICAgICAgKSA9PT0gZmFsc2UsXG4gICk7XG5cbiAgLy8g67mIIOy9lOuTnCDsg53shLEg67Cp7KeAXG4gIGNvbnN0IGhhc1VwQ2hhbmdlcyA9XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5idWlsZGVyLmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLnJhdy5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AudXAuYnVpbGRlci5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVySW5kZXhlc1RvLmFkZC5sZW5ndGggPiAwIHx8XG4gICAgaW5kZXhOZWVkc1RvRHJvcC5sZW5ndGggPiAwO1xuICBpZiAoIWhhc1VwQ2hhbmdlcykge1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzOmVtcHR5Q29kZUdlbmVyYXRpb25FcnJvclwiLCB7XG4gICAgICBlbnRpdHlDb2x1bW5zLFxuICAgICAgZGJDb2x1bW5zLFxuICAgICAgZW50aXR5SW5kZXhlcyxcbiAgICAgIGRiSW5kZXhlcyxcbiAgICB9KTtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoXCLsu6zrn7wv7J24642x7IqkIOuzgOqyvSDsvZTrk5wg7IOd7ISxIOyYpOulmFwiKTtcbiAgfVxuICBOYWl0ZS50KFwibWlncmF0b3I6Z2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlczpkZWJ1Z1wiLCB7XG4gICAgXCJhbHRlckNvbHVtbnNUby5hZGQubGVuZ3RoXCI6IGFsdGVyQ29sdW1uc1RvLmFkZC5sZW5ndGgsXG4gICAgXCJhbHRlckNvbHVtbnNUby5kcm9wLmxlbmd0aFwiOiBhbHRlckNvbHVtbnNUby5kcm9wLmxlbmd0aCxcbiAgICBcImFsdGVyQ29sdW1uc1RvLmFsdGVyLmxlbmd0aFwiOiBhbHRlckNvbHVtbnNUby5hbHRlci5sZW5ndGgsXG4gICAgXCJhbHRlckluZGV4ZXNUby5hZGQubGVuZ3RoXCI6IGFsdGVySW5kZXhlc1RvLmFkZC5sZW5ndGgsXG4gICAgXCJhbHRlckluZGV4ZXNUby5kcm9wLmxlbmd0aFwiOiBhbHRlckluZGV4ZXNUby5kcm9wLmxlbmd0aCxcbiAgICBcImluZGV4TmVlZHNUb0Ryb3AubGVuZ3RoXCI6IGluZGV4TmVlZHNUb0Ryb3AubGVuZ3RoLFxuICB9KTtcbiAgLy8gTmFpdGUudChcIm1pZ3JhdG9yOmdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXM6YWx0ZXJDb2x1bW5zVG9cIiwgYWx0ZXJDb2x1bW5zVG8pO1xuXG4gIC8vIFRPRE86IOyduOuNseyKpOuqhSDrs4Dqsr3rkJwg6rK97JqwIOyymOumrFxuXG4gIC8vIHRhYmxlIGJ1aWxkZXIg66mU7ISc65Oc66GcIOyLpO2Wie2VoCDsvZTrk5wgKGRyb3Ag4oaSIGFkZCDihpIgYWx0ZXIg7Iic7IScKVxuICBjb25zdCB1cEJ1aWxkZXJMaW5lcyA9IFtcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AudXAuYnVpbGRlci5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AudXAuYnVpbGRlciA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLmJ1aWxkZXIgOiBbXSksXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci51cC5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIudXAuYnVpbGRlciA6IFtdKSxcbiAgICAuLi5pbmRleE5lZWRzVG9Ecm9wLm1hcChnZW5JbmRleERyb3BEZWZpbml0aW9uKSxcbiAgXTtcblxuICAvLyBrbmV4LnJhdygp66GcIOyLpO2Wie2VoCDsvZTrk5xcbiAgY29uc3QgdXBSYXdMaW5lcyA9IFtcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5yYXcubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAucmF3IDogW10pLFxuICAgIC4uLmFsdGVySW5kZXhlc1RvLmFkZC5tYXAoKGluZGV4KSA9PiBnZW5JbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKSksXG4gIF07XG5cbiAgLy8gZG93buydgCB1cOydmCDsl63siJwgKGFkZC5kb3duID0gZHJvcCByb2xsYmFjaywgZHJvcC5kb3duID0gYWRkIHJvbGxiYWNrKVxuICBjb25zdCBkb3duQnVpbGRlckxpbmVzID0gW1xuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWRkLmRvd24uYnVpbGRlci5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC5kb3duLmJ1aWxkZXIgOiBbXSksXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci5kb3duLmJ1aWxkZXIubGVuZ3RoID4gMFxuICAgICAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIuZG93bi5idWlsZGVyXG4gICAgICA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5idWlsZGVyLmxlbmd0aCA+IDBcbiAgICAgID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5idWlsZGVyXG4gICAgICA6IFtdKSxcbiAgICAuLi5hbHRlckluZGV4ZXNUby5hZGRcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChpbmRleCkgPT5cbiAgICAgICAgICBpbmRleC5jb2x1bW5zLmV2ZXJ5KChpbmRleENvbCkgPT5cbiAgICAgICAgICAgIGFsdGVyQ29sdW1uc1RvLmFkZC5tYXAoKGNvbCkgPT4gY29sLm5hbWUpLmluY2x1ZGVzKGluZGV4Q29sLm5hbWUpLFxuICAgICAgICAgICkgPT09IGZhbHNlLFxuICAgICAgKVxuICAgICAgLm1hcChnZW5JbmRleERyb3BEZWZpbml0aW9uKSxcbiAgXTtcblxuICBjb25zdCBkb3duUmF3TGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLmRvd24ucmF3Lmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC5kb3duLnJhdyA6IFtdKSxcbiAgICAuLi5pbmRleE5lZWRzVG9Ecm9wLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgXTtcblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgJ2ltcG9ydCB7IEtuZXggfSBmcm9tIFwia25leFwiOycsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgLi4uKHVwQnVpbGRlckxpbmVzLmxlbmd0aCA+IDBcbiAgICAgID8gW2Bhd2FpdCBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCwgLi4udXBCdWlsZGVyTGluZXMsIFwifSk7XCJdXG4gICAgICA6IFtdKSxcbiAgICAuLi51cFJhd0xpbmVzLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgLi4uKGRvd25CdWlsZGVyTGluZXMubGVuZ3RoID4gMFxuICAgICAgPyBbYGF3YWl0IGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLCAuLi5kb3duQnVpbGRlckxpbmVzLCBcIn0pO1wiXVxuICAgICAgOiBbXSksXG4gICAgLi4uZG93blJhd0xpbmVzLFxuICAgIFwifVwiLFxuICBdO1xuXG4gIGNvbnN0IGZvcm1hdHRlZCA9IGZvcm1hdENvZGUobGluZXMuam9pbihcIlxcblwiKSwgXCJ0eXBlc2NyaXB0XCIsIGBzcmMvbWlncmF0aW9uLyR7dGFibGV9LnRzYCk7XG4gIGNvbnN0IHRpdGxlID0gW1xuICAgIFwiYWx0ZXJcIixcbiAgICB0YWJsZSxcbiAgICAuLi4oW1wiYWRkXCIsIFwiZHJvcFwiLCBcImFsdGVyXCJdIGFzIGNvbnN0KVxuICAgICAgLm1hcCgoYWN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGxlbiA9IGFsdGVyQ29sdW1uc1RvW2FjdGlvbl0ubGVuZ3RoO1xuICAgICAgICBpZiAobGVuID4gMCkge1xuICAgICAgICAgIHJldHVybiBhY3Rpb24gKyBsZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gbnVsbCksXG4gIF0uam9pbihcIl9cIik7XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB0YWJsZSxcbiAgICAgIHRpdGxlLFxuICAgICAgZm9ybWF0dGVkLFxuICAgICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB9LFxuICBdO1xufVxuXG4vKipcbiAqIOy7rOufvCDruYTqtZDrpbwg7JyE7ZW0IEdlbmVyYXRlZCBDb2x1bW7snZggZXhwcmVzc2lvbuydhCDsoJzsmbjtlZwg6rCd7LK066W8IOyDneyEsVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVDb2x1bW5Gb3JDb21wYXJpc29uKGNvbDogTWlncmF0aW9uQ29sdW1uKTogTWlncmF0aW9uQ29sdW1uIHtcbiAgaWYgKGNvbC5nZW5lcmF0ZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29sLFxuICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgIHR5cGU6IGNvbC5nZW5lcmF0ZWQudHlwZSxcbiAgICAgICAgZXhwcmVzc2lvbjogXCJcIixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gY29sO1xufVxuXG4vKipcbiAqIOqwgSDsu6zrn7wg7J2066aEIOq4sOykgOycvOuhnCBhZGQsIGRyb3AsIGFsdGVyIOyXrOu2gCDtmZXsnbhcbiAqL1xuZnVuY3Rpb24gZ2V0QWx0ZXJDb2x1bW5zVG8oZW50aXR5Q29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sIGRiQ29sdW1uczogTWlncmF0aW9uQ29sdW1uW10pIHtcbiAgY29uc3QgY29sdW1uc1RvID0ge1xuICAgIGFkZDogW10gYXMgTWlncmF0aW9uQ29sdW1uW10sXG4gICAgZHJvcDogW10gYXMgTWlncmF0aW9uQ29sdW1uW10sXG4gICAgYWx0ZXI6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICB9O1xuXG4gIC8vIOy7rOufvOuqhSDquLDspIAg67mE6rWQXG4gIGNvbnN0IGV4dHJhQ29sdW1ucyA9IHtcbiAgICBkYjogZGlmZihkYkNvbHVtbnMsIGVudGl0eUNvbHVtbnMsIChjb2wpID0+IFtjb2wubmFtZSwgY29sLmdlbmVyYXRlZD8udHlwZV0uam9pbihcIi8vL1wiKSksXG4gICAgZW50aXR5OiBkaWZmKGVudGl0eUNvbHVtbnMsIGRiQ29sdW1ucywgKGNvbCkgPT4gW2NvbC5uYW1lLCBjb2wuZ2VuZXJhdGVkPy50eXBlXS5qb2luKFwiLy8vXCIpKSxcbiAgfTtcbiAgaWYgKGV4dHJhQ29sdW1ucy5lbnRpdHkubGVuZ3RoID4gMCkge1xuICAgIGNvbHVtbnNUby5hZGQgPSBjb2x1bW5zVG8uYWRkLmNvbmNhdChleHRyYUNvbHVtbnMuZW50aXR5KTtcbiAgfVxuICBpZiAoZXh0cmFDb2x1bW5zLmRiLmxlbmd0aCA+IDApIHtcbiAgICBjb2x1bW5zVG8uZHJvcCA9IGNvbHVtbnNUby5kcm9wLmNvbmNhdChleHRyYUNvbHVtbnMuZGIpO1xuICB9XG5cbiAgLy8g64+Z7J28IOy7rOufvOuqheydmCDshLjrtoAg7ZWE65OcIOu5hOq1kCAoR2VuZXJhdGVkIENvbHVtbiBleHByZXNzaW9uIOygnOyZuClcbiAgY29uc3Qgc2FtZURiQ29sdW1ucyA9IGludGVyc2VjdGlvbkJ5KGRiQ29sdW1ucywgZW50aXR5Q29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpO1xuICBjb25zdCBzYW1lTWRDb2x1bW5zID0gaW50ZXJzZWN0aW9uQnkoZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG4gIGNvbHVtbnNUby5hbHRlciA9IGRpZmZlcmVuY2VXaXRoKFxuICAgIHNhbWVEYkNvbHVtbnMsXG4gICAgc2FtZU1kQ29sdW1ucyxcbiAgICAoYSwgYikgPT4gZXF1YWwoeyAuLi5hLCBnZW5lcmF0ZWQ6IHVuZGVmaW5lZCB9LCB7IC4uLmIsIGdlbmVyYXRlZDogdW5kZWZpbmVkIH0pLCAvLyBnZW5lcmF0ZWQg7Lus65+87J2AIGFsdGVy66GcIOyymOumrO2VmOyngCDslYrsnYxcbiAgKTtcblxuICByZXR1cm4gY29sdW1uc1RvO1xufVxuXG4vKipcbiAqIOy2lOy2nOuQnCDsu6zrn7zrk6TsnYQg6riw7KSA7Jy866GcIOqwgeqwgSDrnbzsnbgg7IOd7ISxXG4gKi9cbmZ1bmN0aW9uIGdldEFsdGVyQ29sdW1uTGluZXNUbyhcbiAgY29sdW1uc1RvOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRBbHRlckNvbHVtbnNUbz4sXG4gIGVudGl0eUNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICB0YWJsZTogc3RyaW5nLFxuICBkYkZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4pIHtcbiAgY29uc3QgbGluZXNUbyA9IHtcbiAgICBhZGQ6IHtcbiAgICAgIHVwOiB7IGJ1aWxkZXI6IFtdIGFzIHN0cmluZ1tdLCByYXc6IFtdIGFzIHN0cmluZ1tdIH0sXG4gICAgICBkb3duOiB7IGJ1aWxkZXI6IFtdIGFzIHN0cmluZ1tdLCByYXc6IFtdIGFzIHN0cmluZ1tdIH0sXG4gICAgfSxcbiAgICBkcm9wOiB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gICAgYWx0ZXI6IHtcbiAgICAgIHVwOiB7IGJ1aWxkZXI6IFtdIGFzIHN0cmluZ1tdLCByYXc6IFtdIGFzIHN0cmluZ1tdIH0sXG4gICAgICBkb3duOiB7IGJ1aWxkZXI6IFtdIGFzIHN0cmluZ1tdLCByYXc6IFtdIGFzIHN0cmluZ1tdIH0sXG4gICAgfSxcbiAgfTtcblxuICAvLyBhZGQgY29sdW1uc1xuICBjb25zdCBhZGRDb2x1bW5EZWZzID0gZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIGNvbHVtbnNUby5hZGQpO1xuICBsaW5lc1RvLmFkZC51cCA9IHtcbiAgICBidWlsZGVyOiBhZGRDb2x1bW5EZWZzLmJ1aWxkZXIubGVuZ3RoID4gMCA/IFtcIi8vIGFkZFwiLCAuLi5hZGRDb2x1bW5EZWZzLmJ1aWxkZXJdIDogW10sXG4gICAgcmF3OiBhZGRDb2x1bW5EZWZzLnJhdy5sZW5ndGggPiAwID8gW1wiLy8gYWRkIChnZW5lcmF0ZWQpXCIsIC4uLmFkZENvbHVtbkRlZnMucmF3XSA6IFtdLFxuICB9O1xuICBsaW5lc1RvLmFkZC5kb3duID0ge1xuICAgIGJ1aWxkZXI6XG4gICAgICBjb2x1bW5zVG8uYWRkLmxlbmd0aCA+IDBcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBcIi8vIHJvbGxiYWNrIC0gYWRkXCIsXG4gICAgICAgICAgICBgdGFibGUuZHJvcENvbHVtbnMoJHtjb2x1bW5zVG8uYWRkLm1hcCgoY29sKSA9PiBgJyR7Y29sLm5hbWV9J2ApLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgICAgICBdXG4gICAgICAgIDogW10sXG4gICAgcmF3OiBbXSxcbiAgfTtcblxuICAvLyBkcm9w7ZWgIOy7rOufvOyXkCDqsbjrprAgRksg7LC+6riwXG4gIGNvbnN0IGRyb3BDb2x1bW5OYW1lcyA9IGNvbHVtbnNUby5kcm9wLm1hcCgoY29sKSA9PiBjb2wubmFtZSk7XG4gIGNvbnN0IGZrVG9Ecm9wQmVmb3JlQ29sdW1uID0gZGJGb3JlaWducy5maWx0ZXIoKGZrKSA9PlxuICAgIGZrLmNvbHVtbnMuc29tZSgoY29sKSA9PiBkcm9wQ29sdW1uTmFtZXMuaW5jbHVkZXMoY29sKSksXG4gICk7XG5cbiAgY29uc3QgZHJvcEZrTGluZXMgPSBma1RvRHJvcEJlZm9yZUNvbHVtbi5tYXAoKGZrKSA9PiB7XG4gICAgY29uc3QgY29sdW1uc1N0cmluZ1F1b3RlID0gZmsuY29sdW1ucy5tYXAoKGNvbCkgPT4gYCcke2NvbH0nYCkuam9pbihcIixcIik7XG4gICAgcmV0dXJuIGB0YWJsZS5kcm9wRm9yZWlnbihbJHtjb2x1bW5zU3RyaW5nUXVvdGV9XSlgO1xuICB9KTtcblxuICBjb25zdCByZXN0b3JlRmtMaW5lcyA9IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUb0Ryb3BCZWZvcmVDb2x1bW4pLnVwO1xuXG4gIC8vIGRyb3DsnZggcm9sbGJhY2vsi5zsl5DripQgZ2VuZXJhdGVkIGNvbHVtbuuPhCDrs7Xsm5DtlbTslbwg7ZWoXG4gIGNvbnN0IGRyb3BDb2x1bW5EZWZzID0gZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIGNvbHVtbnNUby5kcm9wKTtcbiAgbGluZXNUby5kcm9wID0ge1xuICAgIHVwOiB7XG4gICAgICBidWlsZGVyOiBbXG4gICAgICAgIC4uLihkcm9wRmtMaW5lcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBbXCIvLyBkcm9wIGZvcmVpZ24ga2V5cyBvbiBjb2x1bW5zIHRvIGJlIGRyb3BwZWRcIiwgLi4uZHJvcEZrTGluZXNdXG4gICAgICAgICAgOiBbXSksXG4gICAgICAgIC4uLihjb2x1bW5zVG8uZHJvcC5sZW5ndGggPiAwXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIFwiLy8gZHJvcCBjb2x1bW5zXCIsXG4gICAgICAgICAgICAgIGB0YWJsZS5kcm9wQ29sdW1ucygke2NvbHVtbnNUby5kcm9wLm1hcCgoY29sKSA9PiBgJyR7Y29sLm5hbWV9J2ApLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgIF0sXG4gICAgICByYXc6IFtdLFxuICAgIH0sXG4gICAgZG93bjoge1xuICAgICAgYnVpbGRlcjogW1xuICAgICAgICAuLi4oZHJvcENvbHVtbkRlZnMuYnVpbGRlci5sZW5ndGggPiAwXG4gICAgICAgICAgPyBbXCIvLyByb2xsYmFjayAtIGRyb3AgY29sdW1uc1wiLCAuLi5kcm9wQ29sdW1uRGVmcy5idWlsZGVyXVxuICAgICAgICAgIDogW10pLFxuICAgICAgICAuLi4ocmVzdG9yZUZrTGluZXMubGVuZ3RoID4gMCA/IFtcIi8vIHJlc3RvcmUgZm9yZWlnbiBrZXlzXCIsIC4uLnJlc3RvcmVGa0xpbmVzXSA6IFtdKSxcbiAgICAgIF0sXG4gICAgICByYXc6XG4gICAgICAgIGRyb3BDb2x1bW5EZWZzLnJhdy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBbXCIvLyByb2xsYmFjayAtIGRyb3AgY29sdW1ucyAoZ2VuZXJhdGVkKVwiLCAuLi5kcm9wQ29sdW1uRGVmcy5yYXddXG4gICAgICAgICAgOiBbXSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIGFsdGVyIGNvbHVtbnMgKEdlbmVyYXRlZCBDb2x1bW7snYAgQUxURVIg67aI6rCA7ZWY66+A66GcIGRyb3Ag7ZuEIOyerOyDneyEsSlcbiAgbGluZXNUby5hbHRlciA9IGNvbHVtbnNUby5hbHRlci5yZWR1Y2UoXG4gICAgKHIsIGRiQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHlDb2x1bW4gPSBlbnRpdHlDb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IGRiQ29sdW1uLm5hbWUpO1xuICAgICAgaWYgKGVudGl0eUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuXG4gICAgICAvLyDsu6zrn7wg67OA6rK97IKs7ZWtXG4gICAgICBjb25zdCBjb2x1bW5EaWZmVXAgPSBkaWZmKFxuICAgICAgICBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgW2VudGl0eUNvbHVtbl0pLmJ1aWxkZXIsXG4gICAgICAgIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBbZGJDb2x1bW5dKS5idWlsZGVyLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNvbHVtbkRpZmZEb3duID0gZGlmZihcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtkYkNvbHVtbl0pLmJ1aWxkZXIsXG4gICAgICAgIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBbZW50aXR5Q29sdW1uXSkuYnVpbGRlcixcbiAgICAgICk7XG4gICAgICBpZiAoY29sdW1uRGlmZlVwLmxlbmd0aCA+IDApIHtcbiAgICAgICAgci51cC5idWlsZGVyID0gW1xuICAgICAgICAgIC4uLnIudXAuYnVpbGRlcixcbiAgICAgICAgICBcIi8vIGFsdGVyIGNvbHVtblwiLFxuICAgICAgICAgIC4uLmNvbHVtbkRpZmZVcC5tYXAoKGwpID0+IGAke2wucmVwbGFjZShcIjtcIiwgXCJcIil9LmFsdGVyKCk7YCksXG4gICAgICAgIF07XG4gICAgICAgIHIuZG93bi5idWlsZGVyID0gW1xuICAgICAgICAgIC4uLnIuZG93bi5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gcm9sbGJhY2sgLSBhbHRlciBjb2x1bW5cIixcbiAgICAgICAgICAuLi5jb2x1bW5EaWZmRG93bi5tYXAoKGwpID0+IGAke2wucmVwbGFjZShcIjtcIiwgXCJcIil9LmFsdGVyKCk7YCksXG4gICAgICAgIF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAge1xuICAgICAgdXA6IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICAgIGRvd246IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiBsaW5lc1RvO1xufVxuXG4vKipcbiAqIOyduOuNseyKpOydmCBhZGQsIGRyb3Ag7Jes67aAIO2ZleyduFxuICovXG5mdW5jdGlvbiBnZXRBbHRlckluZGV4ZXNUbyhlbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLCBkYkluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10pIHtcbiAgLy8g7J24642x7IqkIOu5hOq1kFxuICBjb25zdCBpbmRleGVzVG8gPSB7XG4gICAgYWRkOiBbXSBhcyBNaWdyYXRpb25JbmRleFtdLFxuICAgIGRyb3A6IFtdIGFzIE1pZ3JhdGlvbkluZGV4W10sXG4gIH07XG5cbiAgLy8g7J24642x7IqkIOqzoOycoCDsi53rs4TsnpAg7IOd7ISxIChuYW1l7J2EIOygnOyZuO2VnCDrqqjrk6Ag7ZWE65Oc66W8IOusuOyekOyXtOuhnCDrs4DtmZjtlZjsl6wg7KGw7ZWpKVxuICBjb25zdCBpZGVudGl0eSA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGluZGV4OiBUKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5kZXgpXG4gICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJuYW1lXCIpXG4gICAgICAuc29ydCgpO1xuXG4gICAgcmV0dXJuIGtleXNcbiAgICAgIC5tYXAoKGtleSkgPT4ge1xuICAgICAgICBpZiAoa2V5ID09PSBcIm5hbWVcIikge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gXCJjb2x1bW5zXCIpIHtcbiAgICAgICAgICByZXR1cm4gKGluZGV4W2tleV0gYXMgTWlncmF0aW9uSW5kZXhbXCJjb2x1bW5zXCJdKS5mbGF0TWFwKGlkZW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7a2V5fT0ke2luZGV4W2tleSBhcyBrZXlvZiBNaWdyYXRpb25JbmRleF19YDtcbiAgICAgIH0pXG4gICAgICAuam9pbihcIi8vXCIpO1xuICB9O1xuXG4gIGNvbnN0IGV4dHJhSW5kZXhlcyA9IHtcbiAgICBkYjogZGlmZihkYkluZGV4ZXMsIGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpLCBpZGVudGl0eSksXG4gICAgZW50aXR5OiBkaWZmKGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpLCBkYkluZGV4ZXMsIGlkZW50aXR5KSxcbiAgfTtcbiAgaWYgKGV4dHJhSW5kZXhlcy5lbnRpdHkubGVuZ3RoID4gMCkge1xuICAgIGluZGV4ZXNUby5hZGQgPSBpbmRleGVzVG8uYWRkLmNvbmNhdChleHRyYUluZGV4ZXMuZW50aXR5KTtcbiAgfVxuICBpZiAoZXh0cmFJbmRleGVzLmRiLmxlbmd0aCA+IDApIHtcbiAgICBpbmRleGVzVG8uZHJvcCA9IGluZGV4ZXNUby5kcm9wLmNvbmNhdChleHRyYUluZGV4ZXMuZGIpO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXNUbztcbn1cblxuLyoqXG4gKiDsnbjrjbHsiqQg7IKt7KCcIOygleydmCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgpIHtcbiAgcmV0dXJuIGB0YWJsZS5kcm9wSW5kZXgoWyR7aW5kZXguY29sdW1uc1xuICAgIC5tYXAoKGNvbHVtbikgPT4gYCcke2NvbHVtbi5uYW1lfSdgKVxuICAgIC5qb2luKFwiLFwiKX1dLCAnJHtpbmRleC5uYW1lfScpYDtcbn1cblxuLyoqXG4gKiBEQiDsobDtmowg6rKw6rO87JmAIOu5hOq1kO2VmOq4sCDsnITtlZwg7J24642x7IqkIOq4sOuzuOqwkiDshKTsoJVcbiAqL1xuZnVuY3Rpb24gc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyhpbmRleDogTWlncmF0aW9uSW5kZXgpOiBNaWdyYXRpb25JbmRleCB7XG4gIHJldHVybiB7XG4gICAgLi4uaW5kZXgsXG4gICAgY29sdW1uczogaW5kZXguY29sdW1ucy5tYXAoKGNvbCkgPT4gKHtcbiAgICAgIC4uLmNvbCxcbiAgICAgIHNvcnRPcmRlcjogY29sLnNvcnRPcmRlciA/PyBcIkFTQ1wiLFxuICAgICAgLy8gc29ydE9yZGVy7JeQIOuUsOudvCBudWxsc0ZpcnN07J2YIGRlZmF1bHQg6rCSIOyEpOyglVxuICAgICAgbnVsbHNGaXJzdDogY29sLm51bGxzRmlyc3QgPz8gY29sLnNvcnRPcmRlciA9PT0gXCJERVNDXCIsXG4gICAgfSkpLFxuICAgIG51bGxzTm90RGlzdGluY3Q6IGluZGV4Lm51bGxzTm90RGlzdGluY3QgPz8gZmFsc2UsXG4gICAgdXNpbmc6IGluZGV4LnVzaW5nID8/IFwiYnRyZWVcIixcbiAgfTtcbn1cblxuLyoqXG4gKiDthYzsnbTruJQg67OA6rK9IOy8gOydtOyKpCAtIEZvcmVpZ24gS2V5IOuzgOqyvVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWducyhcbiAgdGFibGU6IHN0cmluZyxcbiAgZW50aXR5Rm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgZGJGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuICBkcm9wcGluZ0NvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdID0gW10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICAvLyBjb25zb2xlLmxvZyh7IGVudGl0eUZvcmVpZ25zLCBkYkZvcmVpZ25zIH0pO1xuXG4gIGNvbnN0IGdldEtleSA9IChtZjogTWlncmF0aW9uRm9yZWlnbik6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIFttZi5jb2x1bW5zLmpvaW4oXCItXCIpLCBtZi50b10uam9pbihcIi8vL1wiKTtcbiAgfTtcblxuICAvLyDsgq3soJzrkKAg7Lus65+866qFIOuqqeuhnVxuICBjb25zdCBkcm9wcGluZ0NvbHVtbk5hbWVzID0gZHJvcHBpbmdDb2x1bW5zLm1hcCgoY29sKSA9PiBjb2wubmFtZSk7XG5cbiAgY29uc3QgZmtUbyA9IGVudGl0eUZvcmVpZ25zLnJlZHVjZShcbiAgICAocmVzdWx0LCBlbnRpdHlGKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGluZ0RiRiA9IGRiRm9yZWlnbnMuZmluZCgoZGJGKSA9PiBnZXRLZXkoZW50aXR5RikgPT09IGdldEtleShkYkYpKTtcbiAgICAgIGlmICghbWF0Y2hpbmdEYkYpIHtcbiAgICAgICAgcmVzdWx0LmFkZC5wdXNoKGVudGl0eUYpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAoZXF1YWwoZW50aXR5RiwgbWF0Y2hpbmdEYkYpID09PSBmYWxzZSkge1xuICAgICAgICByZXN1bHQuYWx0ZXJTcmMucHVzaChtYXRjaGluZ0RiRik7XG4gICAgICAgIHJlc3VsdC5hbHRlckRzdC5wdXNoKGVudGl0eUYpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIHtcbiAgICAgIGFkZDogW10gYXMgTWlncmF0aW9uRm9yZWlnbltdLFxuICAgICAgZHJvcDogW10gYXMgTWlncmF0aW9uRm9yZWlnbltdLFxuICAgICAgYWx0ZXJTcmM6IFtdIGFzIE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgICAgIGFsdGVyRHN0OiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgfSxcbiAgKTtcblxuICAvLyBkYkZvcmVpZ25z7JeQ64qUIOyeiOyngOunjCBlbnRpdHlGb3JlaWduc+yXkOuKlCDsl4bripQg6rK97JqwICjsgq3soJzrkJwgRkspXG4gIC8vIOuLqCwg7IKt7KCc65CgIOy7rOufvOydmCBGS+uKlCDsoJzsmbggKGdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXPsl5DshJwg7LKY66asKVxuICBkYkZvcmVpZ25zLmZvckVhY2goKGRiRikgPT4ge1xuICAgIGNvbnN0IG1hdGNoaW5nRW50aXR5RiA9IGVudGl0eUZvcmVpZ25zLmZpbmQoKGVudGl0eUYpID0+IGdldEtleShlbnRpdHlGKSA9PT0gZ2V0S2V5KGRiRikpO1xuICAgIGlmICghbWF0Y2hpbmdFbnRpdHlGKSB7XG4gICAgICAvLyDsnbQgRkvsnZgg7Lus65+87J20IOyCreygnOuQoCDsu6zrn7wg66qp66Gd7JeQIOyeiOuKlOyngCDtmZXsnbhcbiAgICAgIGNvbnN0IGlzQ29sdW1uRHJvcHBpbmcgPSBkYkYuY29sdW1ucy5zb21lKChjb2wpID0+IGRyb3BwaW5nQ29sdW1uTmFtZXMuaW5jbHVkZXMoY29sKSk7XG4gICAgICAvLyDsu6zrn7zsnbQg7IKt7KCc65CY7KeAIOyViuuKlCDqsr3smrDsl5Drp4wgRksgZHJvcCDrqqnroZ3sl5Ag7LaU6rCAXG4gICAgICBpZiAoIWlzQ29sdW1uRHJvcHBpbmcpIHtcbiAgICAgICAgZmtUby5kcm9wLnB1c2goZGJGKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGxpbmVzVG8gPSB7XG4gICAgYWRkOiBnZW5Gb3JlaWduRGVmaW5pdGlvbnModGFibGUsIGZrVG8uYWRkKSxcbiAgICBkcm9wOiBnZW5Gb3JlaWduRGVmaW5pdGlvbnModGFibGUsIGZrVG8uZHJvcCksXG4gICAgYWx0ZXJTcmM6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5hbHRlclNyYyksXG4gICAgYWx0ZXJEc3Q6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5hbHRlckRzdCksXG4gIH07XG5cbiAgLy8gZHJvcCBmayBjb2x1bW5z7J24IOqyveyasCjsg53shLHrkKAg7L2U65OcIOyXhuuKlCDqsr3smrApIO2MqOyKpFxuICBjb25zdCBoYXNMaW5lcyA9IE9iamVjdC52YWx1ZXMobGluZXNUbykuc29tZSgobCkgPT4gbC51cC5sZW5ndGggPiAwIHx8IGwuZG93bi5sZW5ndGggPiAwKTtcbiAgaWYgKCFoYXNMaW5lcykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGlmIChcbiAgICBsaW5lc1RvLmFkZC51cC5sZW5ndGggPT09IDAgJiZcbiAgICBsaW5lc1RvLmRyb3AudXAubGVuZ3RoID09PSAwICYmXG4gICAgbGluZXNUby5hbHRlclNyYy51cC5sZW5ndGggPT09IDAgJiZcbiAgICBsaW5lc1RvLmFsdGVyRHN0LnVwLmxlbmd0aCA9PT0gMFxuICApIHtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2VuZXJhdGVBbHRlckNvZGVfRm9yZWlnbnM6ZmtDaGFuZ2VDb2RlR2VuZXJhdGlvbkVycm9yXCIsIHtcbiAgICAgIHRhYmxlLFxuICAgICAgZW50aXR5Rm9yZWlnbnMsXG4gICAgICBkYkZvcmVpZ25zLFxuICAgIH0pO1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZLIOuzgOqyvSDsvZTrk5wg7IOd7ISxIOyYpOulmFwiKTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHsgS25leCB9IGZyb20gXCJrbmV4XCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICBgcmV0dXJuIGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLFxuICAgIC4uLmxpbmVzVG8uZHJvcC5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWRkLnVwLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJTcmMuZG93bixcbiAgICAuLi5saW5lc1RvLmFsdGVyRHN0LnVwLFxuICAgIFwifSlcIixcbiAgICBcIn1cIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGByZXR1cm4ga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgLi4ubGluZXNUby5hZGQuZG93bixcbiAgICAuLi5saW5lc1RvLmFsdGVyRHN0LmRvd24sXG4gICAgLi4ubGluZXNUby5hbHRlclNyYy51cCxcbiAgICAuLi5saW5lc1RvLmRyb3AudXAsXG4gICAgXCJ9KVwiLFxuICAgIFwifVwiLFxuICBdO1xuXG4gIGNvbnN0IGZvcm1hdHRlZCA9IGZvcm1hdENvZGUobGluZXMuam9pbihcIlxcblwiKSwgXCJ0eXBlc2NyaXB0XCIsIGBzcmMvbWlncmF0aW9uLyR7dGFibGV9LnRzYCk7XG4gIGNvbnN0IHRpdGxlID0gW1xuICAgIFwiYWx0ZXJcIixcbiAgICB0YWJsZSxcbiAgICBcImZvcmVpZ25zXCIsXG4gICAgLy8gVE9ETyDrsJTrgIzripQg67aA67aEXG4gIF0uam9pbihcIl9cIik7XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB0YWJsZSxcbiAgICAgIHRpdGxlLFxuICAgICAgZm9ybWF0dGVkLFxuICAgICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB9LFxuICBdO1xufVxuXG4vKipcbiAqIOyjvOyWtOynhCBFbnRpdHlTZXTsnYQg6riw67CY7Jy866GcIO2FjOydtOu4lCBDUkVBVEUg66eI7J206re466CI7J207IWYIOy9lOuTnOulvCDsg53shLHtlanri4jri6QuXG4gKiBAcGFyYW0gZW50aXR5U2V0XG4gKiBAcmV0dXJucyBDUkVBVEUg66eI7J206re466CI7J207IWYIOy9lOuTnFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDcmVhdGVDb2RlKGVudGl0eVNldDogTWlncmF0aW9uU2V0KTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgcmV0dXJuIFtcbiAgICBhd2FpdCBnZW5lcmF0ZUNyZWF0ZUNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgICAgIGVudGl0eVNldC50YWJsZSxcbiAgICAgIGVudGl0eVNldC5jb2x1bW5zLFxuICAgICAgZW50aXR5U2V0LmluZGV4ZXMsXG4gICAgKSxcbiAgICAuLi4oYXdhaXQgZ2VuZXJhdGVDcmVhdGVDb2RlX0ZvcmVpZ24oZW50aXR5U2V0LnRhYmxlLCBlbnRpdHlTZXQuZm9yZWlnbnMpKSxcbiAgXTtcbn1cblxuLyoqXG4gKiDso7zslrTsp4QgZW50aXR5U2V07J2EIOuqqe2RnOuhnCwgZGJTZXTsnYQg7ZiEIOyDge2ZqeycvOuhnCDtlZjsl6wg7YWM7J2067iUIEFMVEVSIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICogQHBhcmFtIGVudGl0eVNldCDtmIQg7IOB7Zmp7J2YIE1pZ3JhdGlvblNldFxuICogQHBhcmFtIGRiU2V0IOuqqe2RnCDsg4HtmansnZggTWlncmF0aW9uU2V0XG4gKiBAcmV0dXJucyBBTFRFUiDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFsdGVyQ29kZShcbiAgZW50aXR5U2V0OiBNaWdyYXRpb25TZXQsXG4gIGRiU2V0OiBNaWdyYXRpb25TZXQsXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICBjb25zdCByZXBsYWNlQ29sdW1uRGVmYXVsdFRvID0gKGNvbDogTWlncmF0aW9uQ29sdW1uKSA9PiB7XG4gICAgLy8gZmxvYXTsnbgg6rK97JqwIOq4sOuzuOqwkuydhCAw7Jy866GcIOyngOygle2VmOuKlCDqsr3smrAgXCIwLjAwXCLsnLzroZwg67OA7ZmY65CY64qUIOy8gOydtOyKpCDrjIDsnZFcbiAgICAvLyBpZiAoY29sLnR5cGUgPT09IFwiZmxvYXRcIiAmJiBjb2wuZGVmYXVsdFRvICYmIFN0cmluZyhjb2wuZGVmYXVsdFRvKS5pbmNsdWRlcygnXCInKSA9PT0gZmFsc2UpIHtcbiAgICAvLyAgIGNvbC5kZWZhdWx0VG8gPSBgXCIke051bWJlcihjb2wuZGVmYXVsdFRvKS50b0ZpeGVkKGNvbC5zY2FsZSA/PyAyKX1cImA7XG4gICAgLy8gfVxuICAgIC8vIC8vIHN0cmluZ+yduCDqsr3smrAg6riw67O46rCS7J20IOu5iCDsiqTtirjrp4Hsnbgg6rK97JqwIOuMgOydkVxuICAgIC8vIGlmIChjb2wudHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBjb2wuZGVmYXVsdFRvID09PSBcIlwiKSB7XG4gICAgLy8gICBjb2wuZGVmYXVsdFRvID0gJ1wiXCInO1xuICAgIC8vIH1cbiAgICAvLyAvLyBib29sZWFu7J24IOqyveyasCDquLDrs7jqsJIg7KCV6rec7ZmUIChNeVNRTOyXkOyEnOuKlCBUSU5ZSU5UKDEp66GcIOyggOyepeuQmOuvgOuhnCAwIOuYkOuKlCAx66GcIOygleq3nO2ZlClcbiAgICAvLyAvLyBUT0RPOiBkYi50c+yXkCB0eXBlQ2FzZSDshKTsoJUg7ZmV7J247ZWY7JesIOyymOumrO2VmOuPhOuhnSDsiJjsoJUg7ZWE7JqUXG4gICAgLy8gaWYgKGNvbC50eXBlID09PSBcImJvb2xlYW5cIiAmJiBjb2wuZGVmYXVsdFRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyAgIGlmIChjb2wuZGVmYXVsdFRvID09PSBcIjBcIiB8fCBjb2wuZGVmYXVsdFRvLnRvTG93ZXJDYXNlKCkgPT09IFwiZmFsc2VcIikge1xuICAgIC8vICAgICBjb2wuZGVmYXVsdFRvID0gXCIwXCI7XG4gICAgLy8gICB9IGVsc2UgaWYgKGNvbC5kZWZhdWx0VG8gPT09IFwiMVwiIHx8IGNvbC5kZWZhdWx0VG8udG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAvLyAgICAgY29sLmRlZmF1bHRUbyA9IFwiMVwiO1xuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIC8vIEZJWE1FOiDsnbzri6ggTXlTUUwg7IOB7Zmp7JeQ7IScIOuwnOyDne2WiOuNmCDsnbTsiojsnZggd29ya2Fyb3VuZCDsnbTrr4DroZwgUGfsl5DshJwg7J6s7ZmV7J24IO2bhCDrjIDsnZEg7LaU6rCAXG4gICAgcmV0dXJuIGNvbDtcbiAgfTtcbiAgY29uc3QgZW50aXR5Q29sdW1ucyA9IGFscGhhYmV0aWNhbChlbnRpdHlTZXQuY29sdW1ucywgKGEpID0+IGEubmFtZSkubWFwKHJlcGxhY2VDb2x1bW5EZWZhdWx0VG8pO1xuICBjb25zdCBkYkNvbHVtbnMgPSBhbHBoYWJldGljYWwoZGJTZXQuY29sdW1ucywgKGEpID0+IGEubmFtZSkubWFwKHJlcGxhY2VDb2x1bW5EZWZhdWx0VG8pO1xuXG4gIC8qIOuUlOuyhOq5heyaqSDsvZTrk5wsIO2KueyglSDsu6zrn7zsl5DshJwg67aI7J287LmYIOuwnOyDne2VoCDrlYwg7ZmV7J24XG4gICAgICAgIGNvbnN0IGVudGl0eUNvbHVtbiA9IGVudGl0eVNldC5jb2x1bW5zLmZpbmQoXG4gICAgICAgICAgKGNvbCkgPT4gY29sLm5hbWUgPT09IFwicHJpY2Vfa3J3XCJcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGJDb2x1bW4gPSBkYlNldC5jb2x1bW5zLmZpbmQoXG4gICAgICAgICAgKGNvbCkgPT4gY29sLm5hbWUgPT09IFwicHJpY2Vfa3J3XCJcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh7IGVudGl0eUNvbHVtbiwgZGJDb2x1bW4gfSk7XG4gICAgICAgICAqL1xuXG4gIC8vID9cbiAgY29uc3QgZW50aXR5SW5kZXhlcyA9IGFscGhhYmV0aWNhbChlbnRpdHlTZXQuaW5kZXhlcywgKGEpID0+IFthLnR5cGUsIC4uLmEuY29sdW1uc10uam9pbihcIi1cIikpO1xuICBjb25zdCBkYkluZGV4ZXMgPSBhbHBoYWJldGljYWwoZGJTZXQuaW5kZXhlcywgKGEpID0+IFthLnR5cGUsIC4uLmEuY29sdW1uc10uam9pbihcIi1cIikpO1xuXG4gIGNvbnN0IHJlcGxhY2VOb0FjdGlvbk9uTXlTUUwgPSAoZjogTWlncmF0aW9uRm9yZWlnbikgPT4ge1xuICAgIC8vIE15U1FM7JeQ7IScIFJFU1RSSUNU7JmAIE5PIEFDVElPTuydgCDrj5nsnbztlahcbiAgICBjb25zdCB7IG9uRGVsZXRlLCBvblVwZGF0ZSB9ID0gZjtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZixcbiAgICAgIG9uVXBkYXRlOiBvblVwZGF0ZSA9PT0gXCJSRVNUUklDVFwiID8gXCJOTyBBQ1RJT05cIiA6IG9uVXBkYXRlLFxuICAgICAgb25EZWxldGU6IG9uRGVsZXRlID09PSBcIlJFU1RSSUNUXCIgPyBcIk5PIEFDVElPTlwiIDogb25EZWxldGUsXG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBlbnRpdHlGb3JlaWducyA9IGFscGhhYmV0aWNhbChlbnRpdHlTZXQuZm9yZWlnbnMsIChhKSA9PlxuICAgIFthLnRvLCAuLi5hLmNvbHVtbnNdLmpvaW4oXCItXCIpLFxuICApLm1hcCgoZikgPT4gcmVwbGFjZU5vQWN0aW9uT25NeVNRTChmKSk7XG4gIGNvbnN0IGRiRm9yZWlnbnMgPSBhbHBoYWJldGljYWwoZGJTZXQuZm9yZWlnbnMsIChhKSA9PiBbYS50bywgLi4uYS5jb2x1bW5zXS5qb2luKFwiLVwiKSkubWFwKChmKSA9PlxuICAgIHJlcGxhY2VOb0FjdGlvbk9uTXlTUUwoZiksXG4gICk7XG5cbiAgLy8g7IKt7KCc65CgIOy7rOufvCDrqqnroZ0g6rOE7IKwXG4gIGNvbnN0IGRyb3BwaW5nQ29sdW1ucyA9IGRpZmYoZGJDb2x1bW5zLCBlbnRpdHlDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG5cbiAgY29uc3QgYWx0ZXJDb2RlczogKEdlbk1pZ3JhdGlvbkNvZGUgfCBHZW5NaWdyYXRpb25Db2RlW10gfCBudWxsKVtdID0gW107XG5cbiAgLy8gMS4gY29sdW1uc0FuZEluZGV4ZXMg7LKY66asXG4gIGNvbnN0IGlzRXF1YWxDb2x1bW5zID0gZXF1YWwoXG4gICAgZW50aXR5Q29sdW1ucy5tYXAobm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbiksXG4gICAgZGJDb2x1bW5zLm1hcChub3JtYWxpemVDb2x1bW5Gb3JDb21wYXJpc29uKSxcbiAgKTtcbiAgY29uc3QgaXNFcXVhbEluZGV4ZXMgPSBlcXVhbChcbiAgICBlbnRpdHlJbmRleGVzLm1hcChzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzKSxcbiAgICBkYkluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpLFxuICApO1xuICBpZiAoIWlzRXF1YWxDb2x1bW5zIHx8ICFpc0VxdWFsSW5kZXhlcykge1xuICAgIGFsdGVyQ29kZXMucHVzaChcbiAgICAgIGF3YWl0IGdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXMoXG4gICAgICAgIGVudGl0eVNldC50YWJsZSxcbiAgICAgICAgZW50aXR5Q29sdW1ucyxcbiAgICAgICAgZW50aXR5SW5kZXhlcyxcbiAgICAgICAgZGJDb2x1bW5zLFxuICAgICAgICBkYkluZGV4ZXMsXG4gICAgICAgIGRiU2V0LmZvcmVpZ25zLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLy8gMi4gZm9yZWlnbnMg7LKY66asICjsgq3soJzrkKAg7Lus65+8IOygleuztCDsoITri6wpXG4gIGlmIChlcXVhbChlbnRpdHlGb3JlaWducywgZGJGb3JlaWducykgPT09IGZhbHNlKSB7XG4gICAgYWx0ZXJDb2Rlcy5wdXNoKFxuICAgICAgYXdhaXQgZ2VuZXJhdGVBbHRlckNvZGVfRm9yZWlnbnMoXG4gICAgICAgIGVudGl0eVNldC50YWJsZSxcbiAgICAgICAgZW50aXR5Rm9yZWlnbnMsXG4gICAgICAgIGRiRm9yZWlnbnMsXG4gICAgICAgIGRyb3BwaW5nQ29sdW1ucyxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIGlmIChhbHRlckNvZGVzLmV2ZXJ5KChhbHRlckNvZGUpID0+IGFsdGVyQ29kZSA9PT0gbnVsbCkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gYWx0ZXJDb2Rlcy5maWx0ZXIoKGFsdGVyQ29kZSkgPT4gYWx0ZXJDb2RlICE9PSBudWxsKS5mbGF0KCk7XG59XG4iXSwibmFtZXMiOlsiZXF1YWwiLCJhbHBoYWJldGljYWwiLCJkaWZmIiwiTmFpdGUiLCJmb3JtYXRDb2RlIiwiZGlmZmVyZW5jZVdpdGgiLCJpbnRlcnNlY3Rpb25CeSIsImdlbmVyYXRlQ3JlYXRlQ29kZV9Db2x1bW5BbmRJbmRleGVzIiwidGFibGUiLCJjb2x1bW5zIiwiaW5kZXhlcyIsImNvbHVtbkRlZnMiLCJnZW5Db2x1bW5EZWZpbml0aW9ucyIsImxpbmVzIiwiYnVpbGRlciIsInJhdyIsIm1hcCIsImluZGV4IiwiZ2VuSW5kZXhEZWZpbml0aW9uIiwidHlwZSIsInRpdGxlIiwiZm9ybWF0dGVkIiwiam9pbiIsInJlc3VsdCIsImNvbHVtbiIsImdlbmVyYXRlZCIsInB1c2giLCJnZW5HZW5lcmF0ZWRDb2x1bW5EZWZpbml0aW9uIiwiZ2VuTm9ybWFsQ29sdW1uRGVmaW5pdGlvbiIsIkVycm9yIiwicGdUeXBlIiwiZ2V0UGdUeXBlRm9yQ29sdW1uIiwic3RvcmFnZVR5cGUiLCJudWxsYWJsZUNsYXVzZSIsIm51bGxhYmxlIiwibmFtZSIsImV4cHJlc3Npb24iLCJjaGFpbnMiLCJlbmRzV2l0aCIsImVsZW1lbnRUeXBlIiwic2xpY2UiLCJnZXRQZ0FycmF5VHlwZSIsImRpbWVuc2lvbnMiLCJudW1iZXJUeXBlIiwicHJlY2lzaW9uIiwic2NhbGUiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJleHRyYVR5cGUiLCJkZWZhdWx0VG8iLCJzdGFydHNXaXRoIiwiZ2VuVmVjdG9ySW5kZXhEZWZpbml0aW9uIiwibWV0aG9kTWFwIiwidW5pcXVlIiwibnVsbHNOb3REaXN0aW5jdENsYXVzZSIsIm51bGxzTm90RGlzdGluY3QiLCJ1c2luZ0NsYXVzZSIsInVzaW5nIiwiY29sIiwic29ydE9yZGVyQ2xhdXNlIiwic29ydE9yZGVyIiwibnVsbHNGaXJzdENsYXVzZSIsIm51bGxzRmlyc3QiLCJ2ZWN0b3JPcHMiLCJtIiwiZWZDb25zdHJ1Y3Rpb24iLCJsaXN0cyIsImdlbmVyYXRlQ3JlYXRlQ29kZV9Gb3JlaWduIiwiZm9yZWlnbnMiLCJ1cCIsImRvd24iLCJnZW5Gb3JlaWduRGVmaW5pdGlvbnMiLCJjb25zb2xlIiwibG9nIiwiZm9yZWlnbktleXNTdHJpbmciLCJmb3JlaWduIiwicmVkdWNlIiwiciIsImNvbHVtbnNTdHJpbmdRdW90ZSIsInJlcGxhY2UiLCJ0byIsIm9uVXBkYXRlIiwib25EZWxldGUiLCJnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzIiwiZW50aXR5Q29sdW1ucyIsImVudGl0eUluZGV4ZXMiLCJkYkNvbHVtbnMiLCJkYkluZGV4ZXMiLCJkYkZvcmVpZ25zIiwiYWx0ZXJDb2x1bW5zVG8iLCJnZXRBbHRlckNvbHVtbnNUbyIsImFsdGVyQ29sdW1uTGluZXNUbyIsImdldEFsdGVyQ29sdW1uTGluZXNUbyIsImFsdGVySW5kZXhlc1RvIiwiZ2V0QWx0ZXJJbmRleGVzVG8iLCJpbmRleE5lZWRzVG9Ecm9wIiwiZHJvcCIsImZpbHRlciIsImV2ZXJ5IiwiaW5jbHVkZXMiLCJoYXNVcENoYW5nZXMiLCJhZGQiLCJhbHRlciIsInQiLCJ1cEJ1aWxkZXJMaW5lcyIsImdlbkluZGV4RHJvcERlZmluaXRpb24iLCJ1cFJhd0xpbmVzIiwiZG93bkJ1aWxkZXJMaW5lcyIsImluZGV4Q29sIiwiZG93blJhd0xpbmVzIiwiYWN0aW9uIiwibGVuIiwicGFydCIsIm5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24iLCJjb2x1bW5zVG8iLCJleHRyYUNvbHVtbnMiLCJkYiIsImVudGl0eSIsImNvbmNhdCIsInNhbWVEYkNvbHVtbnMiLCJzYW1lTWRDb2x1bW5zIiwiYSIsImIiLCJsaW5lc1RvIiwiYWRkQ29sdW1uRGVmcyIsImRyb3BDb2x1bW5OYW1lcyIsImZrVG9Ecm9wQmVmb3JlQ29sdW1uIiwiZmsiLCJzb21lIiwiZHJvcEZrTGluZXMiLCJyZXN0b3JlRmtMaW5lcyIsImRyb3BDb2x1bW5EZWZzIiwiZGJDb2x1bW4iLCJlbnRpdHlDb2x1bW4iLCJmaW5kIiwiY29sdW1uRGlmZlVwIiwiY29sdW1uRGlmZkRvd24iLCJsIiwiaW5kZXhlc1RvIiwiaWRlbnRpdHkiLCJrZXlzIiwiT2JqZWN0Iiwia2V5Iiwic29ydCIsImZsYXRNYXAiLCJleHRyYUluZGV4ZXMiLCJzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzIiwiZ2VuZXJhdGVBbHRlckNvZGVfRm9yZWlnbnMiLCJlbnRpdHlGb3JlaWducyIsImRyb3BwaW5nQ29sdW1ucyIsImdldEtleSIsIm1mIiwiZHJvcHBpbmdDb2x1bW5OYW1lcyIsImZrVG8iLCJlbnRpdHlGIiwibWF0Y2hpbmdEYkYiLCJkYkYiLCJhbHRlclNyYyIsImFsdGVyRHN0IiwiZm9yRWFjaCIsIm1hdGNoaW5nRW50aXR5RiIsImlzQ29sdW1uRHJvcHBpbmciLCJoYXNMaW5lcyIsInZhbHVlcyIsImdlbmVyYXRlQ3JlYXRlQ29kZSIsImVudGl0eVNldCIsImdlbmVyYXRlQWx0ZXJDb2RlIiwiZGJTZXQiLCJyZXBsYWNlQ29sdW1uRGVmYXVsdFRvIiwicmVwbGFjZU5vQWN0aW9uT25NeVNRTCIsImYiLCJhbHRlckNvZGVzIiwiaXNFcXVhbENvbHVtbnMiLCJpc0VxdWFsSW5kZXhlcyIsImFsdGVyQ29kZSIsImZsYXQiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVcsa0JBQWtCO0FBQ3BDLFNBQVNDLFlBQVksRUFBRUMsSUFBSSxRQUFRLFVBQVU7QUFDN0MsU0FBU0MsS0FBSyxRQUFRLGNBQUs7QUFRM0IsU0FBU0MsVUFBVSxRQUFRLHdCQUFxQjtBQUNoRCxTQUFTQyxjQUFjLEVBQUVDLGNBQWMsUUFBUSxvQkFBaUI7QUFZaEU7O0NBRUMsR0FDRCxlQUFlQyxvQ0FDYkMsS0FBYSxFQUNiQyxPQUEwQixFQUMxQkMsT0FBeUI7SUFFekIsTUFBTUMsYUFBYUMscUJBQXFCSixPQUFPQztJQUUvQyxhQUFhO0lBQ2IsTUFBTUksUUFBa0I7UUFDdEI7UUFDQTtRQUNBO1FBQ0EsQ0FBQywrQkFBK0IsRUFBRUwsTUFBTSxlQUFlLENBQUM7V0FDckRHLFdBQVdHLE9BQU87UUFDckI7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
841
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vY29kZS1nZW5lcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBhbHBoYWJldGljYWwsIGRpZmYgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgTmFpdGUgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB0eXBlIHtcbiAgRW50aXR5UHJvcCxcbiAgR2VuTWlncmF0aW9uQ29kZSxcbiAgTWlncmF0aW9uQ29sdW1uLFxuICBNaWdyYXRpb25Gb3JlaWduLFxuICBNaWdyYXRpb25JbmRleCxcbiAgTWlncmF0aW9uU2V0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBkaWZmZXJlbmNlV2l0aCwgaW50ZXJzZWN0aW9uQnkgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxuLyoqXG4gKiDsu6zrn7wg7KCV7J2YIOqysOqzvCDtg4DsnoVcbiAqIC0gYnVpbGRlcjogS25leCB0YWJsZSBidWlsZGVyIOuplOyEnOuTnOuhnCDsi6TtlontlaAg6rWs66y4ICh0YWJsZS54eHgoKSlcbiAqIC0gcmF3OiBrbmV4LnJhdygp66GcIOyLpO2Wie2VoCDqtazrrLhcbiAqL1xudHlwZSBDb2x1bW5EZWZpbml0aW9uUmVzdWx0ID0ge1xuICBidWlsZGVyOiBzdHJpbmdbXTtcbiAgcmF3OiBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICog7YWM7J2067iUIOyDneyEse2VmOuKlCDsvIDsnbTsiqQgLSDsu6zrn7wv7J24642x7IqkIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNyZWF0ZUNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgdGFibGU6IHN0cmluZyxcbiAgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGU+IHtcbiAgY29uc3QgY29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zKTtcblxuICAvLyDsu6zrn7wsIOyduOuNseyKpCDsspjrpqxcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGBhd2FpdCBrbmV4LnNjaGVtYS5jcmVhdGVUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgLi4uY29sdW1uRGVmcy5idWlsZGVyLFxuICAgIFwifSk7XCIsXG4gICAgLy8gcmF3IOq1rOusuCAoR2VuZXJhdGVkIENvbHVtbiDrk7EpXG4gICAgLi4uY29sdW1uRGVmcy5yYXcsXG4gICAgLy8gaW5kZXjripQga25leC5yYXfroZwg7LKY66as7ZWY66+A66GcIGNyZWF0ZVRhYmxlIOuwluyXkOyEnCDsi6TtlolcbiAgICAuLi5pbmRleGVzLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgICBcIn1cIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGAgcmV0dXJuIGtuZXguc2NoZW1hLmRyb3BUYWJsZShcIiR7dGFibGV9XCIpO2AsXG4gICAgXCJ9XCIsXG4gIF07XG4gIHJldHVybiB7XG4gICAgdGFibGUsXG4gICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB0aXRsZTogYGNyZWF0ZV9fJHt0YWJsZX1gLFxuICAgIGZvcm1hdHRlZDogZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBcInR5cGVzY3JpcHRcIiwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBNaWdyYXRpb25Db2x1bW5bXSDsnb3slrTshJwg7Lus65+8IOygleydmO2VmOuKlCDqtazrrLgg7IOd7ISxXG4gKiBAcmV0dXJucyBidWlsZGVyOiB0YWJsZSBidWlsZGVyIOuplOyEnOuTnCwgcmF3OiBrbmV4LnJhdygpIOq1rOusuFxuICovXG5mdW5jdGlvbiBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZTogc3RyaW5nLCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSk6IENvbHVtbkRlZmluaXRpb25SZXN1bHQge1xuICBjb25zdCByZXN1bHQ6IENvbHVtbkRlZmluaXRpb25SZXN1bHQgPSB7XG4gICAgYnVpbGRlcjogW10sXG4gICAgcmF3OiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgLy8gR2VuZXJhdGVkIENvbHVtbuydgCByYXfroZwg7LKY66asXG4gICAgaWYgKGNvbHVtbi5nZW5lcmF0ZWQpIHtcbiAgICAgIHJlc3VsdC5yYXcucHVzaChnZW5HZW5lcmF0ZWRDb2x1bW5EZWZpbml0aW9uKHRhYmxlLCBjb2x1bW4pKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIOydvOuwmCDsu6zrn7zsnYAgYnVpbGRlcuuhnCDsspjrpqxcbiAgICByZXN1bHQuYnVpbGRlci5wdXNoKGdlbk5vcm1hbENvbHVtbkRlZmluaXRpb24oY29sdW1uKSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlZCBDb2x1bW4g7KCV7J2YIOyDneyEsSAoQUxURVIgVEFCTEUgQUREIENPTFVNTiDsgqzsmqkpXG4gKi9cbmZ1bmN0aW9uIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGU6IHN0cmluZywgY29sdW1uOiBNaWdyYXRpb25Db2x1bW4pOiBzdHJpbmcge1xuICBpZiAoIWNvbHVtbi5nZW5lcmF0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0ZWQgY29sdW1uIGRlZmluaXRpb24gcmVxdWlyZWRcIik7XG4gIH1cbiAgY29uc3QgcGdUeXBlID0gZ2V0UGdUeXBlRm9yQ29sdW1uKGNvbHVtbik7XG4gIGNvbnN0IHN0b3JhZ2VUeXBlID0gY29sdW1uLmdlbmVyYXRlZC50eXBlID09PSBcIlZJUlRVQUxcIiA/IFwiIFZJUlRVQUxcIiA6IFwiIFNUT1JFRFwiO1xuICBjb25zdCBudWxsYWJsZUNsYXVzZSA9IGNvbHVtbi5udWxsYWJsZSA/IFwiXCIgOiBcIiBOT1QgTlVMTFwiO1xuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYEFMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBBREQgQ09MVU1OIFwiJHtjb2x1bW4ubmFtZX1cIiAke3BnVHlwZX0gR0VORVJBVEVEIEFMV0FZUyBBUyAoJHtjb2x1bW4uZ2VuZXJhdGVkLmV4cHJlc3Npb259KSR7c3RvcmFnZVR5cGV9JHtudWxsYWJsZUNsYXVzZX1cXGApO2A7XG59XG5cbi8qKlxuICog7J2867CYIOy7rOufvCDsoJXsnZgg7IOd7ISxICh0YWJsZS54eHgoKSDssrTsnbgpXG4gKi9cbmZ1bmN0aW9uIGdlbk5vcm1hbENvbHVtbkRlZmluaXRpb24oY29sdW1uOiBNaWdyYXRpb25Db2x1bW4pOiBzdHJpbmcge1xuICBjb25zdCBjaGFpbnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKGNvbHVtbi5uYW1lID09PSBcImlkXCIpIHtcbiAgICByZXR1cm4gYHRhYmxlLmluY3JlbWVudHMoKS5wcmltYXJ5KCk7YDtcbiAgfVxuXG4gIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gIGlmIChjb2x1bW4udHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb2x1bW4udHlwZS5zbGljZSgwLCAtMik7IC8vIFwiaW50ZWdlcltdXCIgLT4gXCJpbnRlZ2VyXCJcbiAgICBjb25zdCBwZ1R5cGUgPSBnZXRQZ0FycmF5VHlwZShjb2x1bW4sIGVsZW1lbnRUeXBlKTtcbiAgICBjaGFpbnMucHVzaChgc3BlY2lmaWNUeXBlKCcke2NvbHVtbi5uYW1lfScsICcke3BnVHlwZX0nKWApO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcInZlY3RvclwiKSB7XG4gICAgLy8gS25leOuKlCB2ZWN0b3Ig7YOA7J6F7J2EIOyngeygkSDsp4Dsm5DtlZjsp4Ag7JWK7Jy866+A66GcIHNwZWNpZmljVHlwZSDsgqzsmqlcbiAgICBjaGFpbnMucHVzaChgc3BlY2lmaWNUeXBlKCcke2NvbHVtbi5uYW1lfScsICd2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pJylgKTtcbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJudW1iZXJPck51bWVyaWNcIikge1xuICAgIC8vIG51bWJlclxuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJyZWFsXCIpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBmbG9hdCgnJHtjb2x1bW4ubmFtZX0nKWApO1xuICAgIH0gZWxzZSBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwiZG91YmxlIHByZWNpc2lvblwiKSB7XG4gICAgICBjaGFpbnMucHVzaChgZG91YmxlKCcke2NvbHVtbi5uYW1lfScpYCk7XG4gICAgfSBlbHNlIGlmICgoY29sdW1uLm51bWJlclR5cGUgPz8gXCJudW1lcmljXCIpID09PSBcIm51bWVyaWNcIikge1xuICAgICAgY2hhaW5zLnB1c2goYGRlY2ltYWwoJyR7Y29sdW1uLm5hbWV9JywgJHtjb2x1bW4ucHJlY2lzaW9ufSwgJHtjb2x1bW4uc2NhbGV9KWApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIC8vIHN0cmluZ1xuICAgIGlmIChjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBzdHJpbmcoJyR7Y29sdW1uLm5hbWV9JywgJHtjb2x1bW4ubGVuZ3RofSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhaW5zLnB1c2goYHRleHQoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwiZGF0ZVwiKSB7XG4gICAgLy8gZGF0ZVxuICAgIGNoYWlucy5wdXNoKGB0aW1lc3RhbXAoJyR7Y29sdW1uLm5hbWV9JywgeyB1c2VUejogdHJ1ZSB9KWApO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcImpzb25cIikge1xuICAgIC8vIGpzb25cbiAgICBjaGFpbnMucHVzaChganNvbmIoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0eXBlLCBsZW5ndGhcbiAgICBsZXQgZXh0cmFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY2hhaW5zLnB1c2goXG4gICAgICBgJHtjb2x1bW4udHlwZX0oJyR7Y29sdW1uLm5hbWV9JyR7XG4gICAgICAgIGNvbHVtbi5sZW5ndGggPyBgLCAke2NvbHVtbi5sZW5ndGh9YCA6IFwiXCJcbiAgICAgIH0ke2V4dHJhVHlwZSA/IGAsICcke2V4dHJhVHlwZX0nYCA6IFwiXCJ9KWAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIG51bGxhYmxlXG4gIGNoYWlucy5wdXNoKGNvbHVtbi5udWxsYWJsZSA/IFwibnVsbGFibGUoKVwiIDogXCJub3ROdWxsYWJsZSgpXCIpO1xuXG4gIC8vIGRlZmF1bHRUb1xuICBpZiAoY29sdW1uLmRlZmF1bHRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW4uZGVmYXVsdFRvID09PSBcInN0cmluZ1wiICYmIGNvbHVtbi5kZWZhdWx0VG8uc3RhcnRzV2l0aChgXCJgKSkge1xuICAgICAgY2hhaW5zLnB1c2goYGRlZmF1bHRUbygke2NvbHVtbi5kZWZhdWx0VG99KWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFpbnMucHVzaChgZGVmYXVsdFRvKGtuZXgucmF3KCcke2NvbHVtbi5kZWZhdWx0VG99JykpYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGB0YWJsZS4ke2NoYWlucy5qb2luKFwiLlwiKX07YDtcbn1cblxuLyoqXG4gKiBNaWdyYXRpb25Db2x1bW7snZgg7YOA7J6F7J2EIFBvc3RncmVTUUwg7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZhcbiAqL1xuZnVuY3Rpb24gZ2V0UGdUeXBlRm9yQ29sdW1uKGNvbHVtbjogTWlncmF0aW9uQ29sdW1uKTogc3RyaW5nIHtcbiAgaWYgKGNvbHVtbi50eXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICBjb25zdCBlbGVtZW50VHlwZSA9IGNvbHVtbi50eXBlLnNsaWNlKDAsIC0yKTtcbiAgICByZXR1cm4gZ2V0UGdBcnJheVR5cGUoY29sdW1uLCBlbGVtZW50VHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIGNvbHVtbi5sZW5ndGggIT09IHVuZGVmaW5lZCA/IGB2YXJjaGFyKCR7Y29sdW1uLmxlbmd0aH0pYCA6IFwidGV4dFwiO1xuICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gXCJiaWdpbnRcIjtcbiAgICBjYXNlIFwibnVtYmVyT3JOdW1lcmljXCI6XG4gICAgICBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwicmVhbFwiKSByZXR1cm4gXCJyZWFsXCI7XG4gICAgICBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwiZG91YmxlIHByZWNpc2lvblwiKSByZXR1cm4gXCJkb3VibGUgcHJlY2lzaW9uXCI7XG4gICAgICByZXR1cm4gYG51bWVyaWMoJHtjb2x1bW4ucHJlY2lzaW9ufSwgJHtjb2x1bW4uc2NhbGV9KWA7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcInRpbWVzdGFtcHR6XCI7XG4gICAgY2FzZSBcImpzb25cIjpcbiAgICAgIHJldHVybiBcImpzb25iXCI7XG4gICAgY2FzZSBcInZlY3RvclwiOlxuICAgICAgcmV0dXJuIGB2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pYDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNvbHVtbi50eXBlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBnQXJyYXlUeXBlKGNvbHVtbjogTWlncmF0aW9uQ29sdW1uLCBlbGVtZW50VHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcIm51bWJlck9yTnVtZXJpY1wiKSB7XG4gICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcInJlYWxcIikgcmV0dXJuIFwicmVhbFtdXCI7XG4gICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcImRvdWJsZSBwcmVjaXNpb25cIikgcmV0dXJuIFwiZG91YmxlIHByZWNpc2lvbltdXCI7XG4gICAgcmV0dXJuIGBudW1lcmljKCR7Y29sdW1uLnByZWNpc2lvbn0sICR7Y29sdW1uLnNjYWxlfSlbXWA7XG4gIH1cbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGNvbHVtbi5sZW5ndGggPyBgdmFyY2hhcigke2NvbHVtbi5sZW5ndGh9KVtdYCA6IFwidGV4dFtdXCI7XG4gIH1cbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImRhdGVcIikgcmV0dXJuIFwidGltZXN0YW1wdHpbXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJpbnRlZ2VyW11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImJpZ0ludGVnZXJcIikgcmV0dXJuIFwiYmlnaW50W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFwiYm9vbGVhbltdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJ1dWlkXCIpIHJldHVybiBcInV1aWRbXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwiZW51bVwiKSByZXR1cm4gXCJ0ZXh0W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcInZlY3RvclwiKSByZXR1cm4gYHZlY3Rvcigke2NvbHVtbi5kaW1lbnNpb25zfSlbXWA7XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFycmF5IGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gKTtcbn1cblxuLyoqXG4gKiDqsJzrs4Qg7J24642x7IqkIOygleydmCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4OiBNaWdyYXRpb25JbmRleCwgdGFibGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpbmRleC50eXBlID09PSBcImhuc3dcIiB8fCBpbmRleC50eXBlID09PSBcIml2ZmZsYXRcIikge1xuICAgIHJldHVybiBnZW5WZWN0b3JJbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKTtcbiAgfVxuXG4gIGlmIChpbmRleC51c2luZyA9PT0gXCJwZ3Jvb25nYVwiKSB7XG4gICAgcmV0dXJuIGdlblBncm9vbmdhSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSk7XG4gIH1cblxuICBjb25zdCBtZXRob2RNYXAgPSB7XG4gICAgaW5kZXg6IFwiSU5ERVhcIixcbiAgICB1bmlxdWU6IFwiVU5JUVVFIElOREVYXCIsXG4gIH07XG5cbiAgY29uc3QgbnVsbHNOb3REaXN0aW5jdENsYXVzZSA9XG4gICAgaW5kZXgudHlwZSA9PT0gXCJ1bmlxdWVcIiAmJiBpbmRleC5udWxsc05vdERpc3RpbmN0ICE9PSB1bmRlZmluZWRcbiAgICAgID8gYCBOVUxMUyAke2luZGV4Lm51bGxzTm90RGlzdGluY3QgPyBcIk5PVCBESVNUSU5DVFwiIDogXCJESVNUSU5DVFwifWBcbiAgICAgIDogXCJcIjtcblxuICBjb25zdCB1c2luZ0NsYXVzZSA9IGluZGV4LnVzaW5nID09PSB1bmRlZmluZWQgPyBcIlwiIDogYFVTSU5HICR7aW5kZXgudXNpbmd9YDtcblxuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxuICBcXGBDUkVBVEUgJHttZXRob2RNYXBbaW5kZXgudHlwZV19ICR7aW5kZXgubmFtZX0gT04gJHt0YWJsZX0gJHt1c2luZ0NsYXVzZX0oJHtpbmRleC5jb2x1bW5zXG4gICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICAvLyDsoJXroKwg7Ji17IWY7J2AIGJ0cmVl66eMIOyCrOyaqSDqsIDriqVcbiAgICAgIGlmIChpbmRleC51c2luZyAhPT0gXCJidHJlZVwiICYmIGluZGV4LnVzaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGAke2NvbC5uYW1lfWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvcnRPcmRlckNsYXVzZSA9IGNvbC5zb3J0T3JkZXIgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBgICR7Y29sLnNvcnRPcmRlcn1gO1xuICAgICAgY29uc3QgbnVsbHNGaXJzdENsYXVzZSA9XG4gICAgICAgIGNvbC5udWxsc0ZpcnN0ID09PSB1bmRlZmluZWQgPyBcIlwiIDogYCBOVUxMUyAke2NvbC5udWxsc0ZpcnN0ID8gXCJGSVJTVFwiIDogXCJMQVNUXCJ9YDtcbiAgICAgIHJldHVybiBgJHtjb2wubmFtZX0ke3NvcnRPcmRlckNsYXVzZX0ke251bGxzRmlyc3RDbGF1c2V9YDtcbiAgICB9KVxuICAgIC5qb2luKFwiLCBcIil9KSR7bnVsbHNOb3REaXN0aW5jdENsYXVzZX07XFxgXG4gICk7YDtcbn1cblxuZnVuY3Rpb24gZ2VuUGdyb29uZ2FJbmRleERlZmluaXRpb24oaW5kZXg6IE1pZ3JhdGlvbkluZGV4LCB0YWJsZTogc3RyaW5nKSB7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZSh0YWJsZSk7XG5cbiAgLy8g67O17ZWpIOyduOuNseyKpOyduCDqsr3smrAgQVJSQVkg7IKs7JqpXG4gIGNvbnN0IGNvbHVtbkNsYXVzZSA9ICgoKSA9PiB7XG4gICAgaWYgKGluZGV4LmNvbHVtbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSBlbnRpdHkucHJvcHNEaWN0W2luZGV4LmNvbHVtbnNbMF0ubmFtZV07XG4gICAgICBjb25zdCBvcHRpb24gPSBnZXRQZ3Jvb25nYUNvbHVtbk9wdGlvbihjb2x1bW4pO1xuICAgICAgcmV0dXJuIGAke2luZGV4LmNvbHVtbnNbMF0ubmFtZX0ke29wdGlvbiA/IGAgJHtvcHRpb259YCA6IFwiXCJ9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYChBUlJBWVske2luZGV4LmNvbHVtbnMubWFwKChjb2wpID0+IGAke2NvbC5uYW1lfTo6dGV4dGApLmpvaW4oXCIsXCIpfV0pYDtcbiAgfSkoKTtcblxuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxuICBcXGBDUkVBVEUgSU5ERVggJHtpbmRleC5uYW1lfSBPTiAke3RhYmxlfSBVU0lORyBwZ3Jvb25nYSAoJHtjb2x1bW5DbGF1c2V9KSBXSVRIICh0b2tlbml6ZXI9J1Rva2VuTWVjYWInKTtcXGBcbiAgKWA7XG59XG5cbi8qKlxuICogUEdyb29uZ2Eg7Lus65+8IOyYteyFmCDstpTstpxcbiAqXG4gKiBGdWxsVGV4dCDsmKTtjbzroIjsnbTthLDrpbwg7KeA7JuQ7ZWY64qUIOqyveyasCDsmrDshKAg7ISk7KCVLCDrgpjrqLjsp4DripQg65SU7Y+07Yq4IOydtOyaqVxuICogQGxpbmsgaHR0cHM6Ly9wZ3Jvb25nYS5naXRodWIuaW8vcmVmZXJlbmNlXG4gKi9cbmZ1bmN0aW9uIGdldFBncm9vbmdhQ29sdW1uT3B0aW9uKGNvbHVtbjogRW50aXR5UHJvcCkge1xuICBpZiAoY29sdW1uLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgY29sdW1uLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFwicGdyb29uZ2FfdmFyY2hhcl9mdWxsX3RleHRfc2VhcmNoX29wc192MlwiO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcImpzb25cIikge1xuICAgIHJldHVybiBcInBncm9vbmdhX2pzb25iX2Z1bGxfdGV4dF9zZWFyY2hfb3BzX3YyXCI7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiAtIEhOU1cgKEhpZXJhcmNoaWNhbCBOYXZpZ2FibGUgU21hbGwgV29ybGQpOiDripDrprAg67mM65OcLCDruaDrpbgg6rKA7IOJIOyGjeuPhCwg64aS7J2AIOuplOuqqOumrCDrsI8g7KCV7ZmV64+EXG4gKiAtIElWRkZsYXQgKEludmVydGVkIEZpbGUgd2l0aCBGbGF0IENvbXByZXNzaW9uKTog67mg66W4IOu5jOuTnCwg7KSR6rCEIOqygOyDiSDsho3rj4QsIOuCruydgCDrqZTrqqjrpqxcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSE5TVyDsnbjrjbHsiqQgKOq2jOyepSAtIOu5oOuluCDqsoDsg4ksIOuGkuydgCDsoJXtmZXrj4QpXG4gKiBDUkVBVEUgSU5ERVggaWR4X2VtYmVkZGluZyBPTiBpdGVtcyBVU0lORyBobnN3IChlbWJlZGRpbmcgdmVjdG9yX2Nvc2luZV9vcHMpIFdJVEggKG0gPSAxNiwgZWZfY29uc3RydWN0aW9uID0gNjQpO1xuICpcbiAqIC8vIElWRkZsYXQg7J24642x7IqkICjrjIDsmqnrn4kg642w7J207YSwLCDruYTsmqkg7KSR7JqUIOyLnClcbiAqIENSRUFURSBJTkRFWCBpZHhfZW1iZWRkaW5nIE9OIGl0ZW1zIFVTSU5HIGl2ZmZsYXQgKGVtYmVkZGluZyB2ZWN0b3JfY29zaW5lX29wcykgV0lUSCAobGlzdHMgPSAxMDApO1xuICovXG5mdW5jdGlvbiBnZW5WZWN0b3JJbmRleERlZmluaXRpb24oaW5kZXg6IE1pZ3JhdGlvbkluZGV4LCB0YWJsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29sdW1uID0gaW5kZXguY29sdW1uc1swXTtcbiAgY29uc3QgdmVjdG9yT3BzID0gY29sdW1uLnZlY3Rvck9wcyA/PyBcInZlY3Rvcl9jb3NpbmVfb3BzXCI7XG5cbiAgLy8gSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCkgLSDqtozsnqU6IOu5oOuluCDqsoDsg4ksIOuGkuydgCDsoJXtmZXrj4RcbiAgaWYgKGluZGV4LnR5cGUgPT09IFwiaG5zd1wiKSB7XG4gICAgY29uc3QgbSA9IGluZGV4Lm0gPz8gMTY7XG4gICAgY29uc3QgZWZDb25zdHJ1Y3Rpb24gPSBpbmRleC5lZkNvbnN0cnVjdGlvbiA/PyA2NDtcbiAgICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYENSRUFURSBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9IFVTSU5HIGhuc3cgKCR7Y29sdW1uLm5hbWV9ICR7dmVjdG9yT3BzfSkgV0lUSCAobSA9ICR7bX0sIGVmX2NvbnN0cnVjdGlvbiA9ICR7ZWZDb25zdHJ1Y3Rpb259KVxcYCk7YDtcbiAgfVxuXG4gIC8vIElWRkZsYXQgKEludmVydGVkIEZpbGUgd2l0aCBGbGF0IENvbXByZXNzaW9uKSAtIOuMgOyaqeufiSwg67mE7JqpIOykkeyalCDsi5xcbiAgaWYgKGluZGV4LnR5cGUgPT09IFwiaXZmZmxhdFwiKSB7XG4gICAgY29uc3QgbGlzdHMgPSBpbmRleC5saXN0cyA/PyAxMDA7XG4gICAgcmV0dXJuIGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgSU5ERVggJHtpbmRleC5uYW1lfSBPTiAke3RhYmxlfSBVU0lORyBpdmZmbGF0ICgke2NvbHVtbi5uYW1lfSAke3ZlY3Rvck9wc30pIFdJVEggKGxpc3RzID0gJHtsaXN0c30pXFxgKTtgO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJhdyBTUUwgaW5kZXggdHlwZTogJHtpbmRleC50eXBlfWApO1xufVxuXG4vKipcbiAqIO2FjOydtOu4lCDsg53shLHtlZjripQg7LyA7J207IqkIC0gRksg7IOd7ISxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ3JlYXRlQ29kZV9Gb3JlaWduKFxuICB0YWJsZTogc3RyaW5nLFxuICBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuKTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgaWYgKGZvcmVpZ25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHsgdXAsIGRvd24gfSA9IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZm9yZWlnbnMpO1xuICBpZiAodXAubGVuZ3RoID09PSAwICYmIGRvd24ubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5sb2coXCJmayDqsIAg662U6rCAIOuLpOumheuLiOuLpFwiKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgJ2ltcG9ydCB7IEtuZXggfSBmcm9tIFwia25leFwiOycsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICBcIi8vIGNyZWF0ZSBma1wiLFxuICAgIC4uLnVwLFxuICAgIFwifSk7XCIsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICBgcmV0dXJuIGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLFxuICAgIFwiLy8gZHJvcCBma1wiLFxuICAgIC4uLmRvd24sXG4gICAgXCJ9KTtcIixcbiAgICBcIn1cIixcbiAgXTtcblxuICBjb25zdCBmb3JlaWduS2V5c1N0cmluZyA9IGZvcmVpZ25zLm1hcCgoZm9yZWlnbikgPT4gZm9yZWlnbi5jb2x1bW5zLmpvaW4oXCJfXCIpKS5qb2luKFwiX1wiKTtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB0YWJsZSxcbiAgICAgIHR5cGU6IFwiZm9yZWlnblwiLFxuICAgICAgdGl0bGU6IGBmb3JlaWduX18ke3RhYmxlfV9fJHtmb3JlaWduS2V5c1N0cmluZ31gLFxuICAgICAgZm9ybWF0dGVkOiBmb3JtYXRDb2RlKGxpbmVzLmpvaW4oXCJcXG5cIiksIFwidHlwZXNjcmlwdFwiLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICogTWlncmF0aW9uRm9yZWlnbltdIOydveyWtOyEnCDsmbjrtoDtgqQgY29uc3RyYWludCDsoJXsnZjtlZjripQg6rWs66y4IOyDneyEsVxuICovXG5mdW5jdGlvbiBnZW5Gb3JlaWduRGVmaW5pdGlvbnMoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4pOiB7IHVwOiBzdHJpbmdbXTsgZG93bjogc3RyaW5nW10gfSB7XG4gIHJldHVybiBmb3JlaWducy5yZWR1Y2UoXG4gICAgKHIsIGZvcmVpZ24pID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbnNTdHJpbmdRdW90ZSA9IGZvcmVpZ24uY29sdW1uc1xuICAgICAgICAubWFwKChjb2wpID0+IGAnJHtjb2wucmVwbGFjZShgJHt0YWJsZX0uYCwgXCJcIil9J2ApXG4gICAgICAgIC5qb2luKFwiLFwiKTtcbiAgICAgIHIudXAucHVzaChcbiAgICAgICAgYHRhYmxlLmZvcmVpZ24oJyR7Zm9yZWlnbi5jb2x1bW5zLmpvaW4oXCIsXCIpfScpXG4gICAgICAgICAgICAucmVmZXJlbmNlcygnJHtmb3JlaWduLnRvfScpXG4gICAgICAgICAgICAub25VcGRhdGUoJyR7Zm9yZWlnbi5vblVwZGF0ZX0nKVxuICAgICAgICAgICAgLm9uRGVsZXRlKCcke2ZvcmVpZ24ub25EZWxldGV9JylgLFxuICAgICAgKTtcbiAgICAgIHIuZG93bi5wdXNoKGB0YWJsZS5kcm9wRm9yZWlnbihbJHtjb2x1bW5zU3RyaW5nUXVvdGV9XSlgKTtcbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAge1xuICAgICAgdXA6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgZG93bjogW10gYXMgc3RyaW5nW10sXG4gICAgfSxcbiAgKTtcbn1cblxuLyoqXG4gKiDthYzsnbTruJQg67OA6rK9IOy8gOydtOyKpCAtIOy7rOufvC/snbjrjbHsiqQg67OA6rK9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXMoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGVudGl0eUNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBlbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBkYkNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBkYkluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4gIGRiRm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIC8qXG4gICAg7IS467aAIOu5hOq1kCDtm4Qg64uk66W47KCQIOywvuyVhOyEnCDsvZTrk5wg7IOd7ISxXG5cbiAgICAxLiDsu6zrn7zqsK/siJgg64uk66aEOiBNROyXkCDsnojsnLzrgpgsIERC7JeQIOyXhuuLpOuptCDstpTqsIBcbiAgICAyLiDsu6zrn7zqsK/siJgg64uk66aEOiBNROyXkCDsl4bsnLzrgpgsIERC7JeQIOyeiOuLpOuptCDsgq3soJxcbiAgICAzLiDqt7jsmbgg7Lus65+8KOy7rOufvCDqsK/siJjqsIAg64+Z7J287ZWY6rGw64KYLCDri6Trpbgg6rK97JqwIOuPmeydvO2VnCDsu6zrn7zrgbzrpqwpID0+IGFsdGVyXG4gICAgNC4g64uk66W46rGwIOuLpCDrj5nsnbztlZjqs6AgaW5kZXjrp4wg67OA6rK965CY64qUIOqyveyasFxuXG4gICAgKiog7Lus65+866qF7J2EIOuzgOqyve2VmOuKlCDqsr3smrDripQg65Sw66GcIO2VuOuTpOunge2VmOyngCDslYrsnYxcbiAgICA9PiBkcm9wL2FkZCDtmJXtg5zsnZgg66eI7J206re466CI7J207IWYIOy9lOuTnOqwgCDsg53shLHrkJjripTrjbAsIOyImOuPmeycvOuhnCByZW5hbWUg7L2U65Oc66GcIOyImOygle2VmOyXrCDsspjrpqxcbiAgKi9cblxuICAvLyDqsIEg7Lus65+8IOydtOumhCDquLDspIDsnLzroZwgYWRkLCBkcm9wLCBhbHRlciDsl6zrtoAg7ZmV7J24XG4gIGNvbnN0IGFsdGVyQ29sdW1uc1RvID0gZ2V0QWx0ZXJDb2x1bW5zVG8oZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zKTtcblxuICAvLyDstpTstpzrkJwg7Lus65+865Ok7J2EIOq4sOykgOycvOuhnCDqsIHqsIEg65287J24IOyDneyEsVxuICBjb25zdCBhbHRlckNvbHVtbkxpbmVzVG8gPSBnZXRBbHRlckNvbHVtbkxpbmVzVG8oXG4gICAgYWx0ZXJDb2x1bW5zVG8sXG4gICAgZW50aXR5Q29sdW1ucyxcbiAgICB0YWJsZSxcbiAgICBkYkZvcmVpZ25zLFxuICApO1xuXG4gIC8vIOyduOuNseyKpOydmCBhZGQsIGRyb3Ag7Jes67aAIO2ZleyduFxuICBjb25zdCBhbHRlckluZGV4ZXNUbyA9IGdldEFsdGVySW5kZXhlc1RvKGVudGl0eUluZGV4ZXMsIGRiSW5kZXhlcyk7XG5cbiAgLy8g7J24642x7Iqk6rCAIOyCreygnOuQmOuKlCDqsr3smrAsIOy7rOufvOqzvCDqsJnsnbQg7IKt7KCc65CcIOy8gOydtOyKpOyXkOuKlCBkcm9w7JeQ7IScIOygnOyZuO2VtOyVvO2VqCFcbiAgY29uc3QgaW5kZXhOZWVkc1RvRHJvcCA9IGFsdGVySW5kZXhlc1RvLmRyb3AuZmlsdGVyKFxuICAgIChpbmRleCkgPT5cbiAgICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKHsgbmFtZSB9KSA9PlxuICAgICAgICBhbHRlckNvbHVtbnNUby5kcm9wLm1hcCgoY29sKSA9PiBjb2wubmFtZSkuaW5jbHVkZXMobmFtZSksXG4gICAgICApID09PSBmYWxzZSxcbiAgKTtcblxuICAvLyDruYgg7L2U65OcIOyDneyEsSDrsKnsp4BcbiAgY29uc3QgaGFzVXBDaGFuZ2VzID1cbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAucmF3Lmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC51cC5idWlsZGVyLmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIudXAuYnVpbGRlci5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJJbmRleGVzVG8uYWRkLmxlbmd0aCA+IDAgfHxcbiAgICBpbmRleE5lZWRzVG9Ecm9wLmxlbmd0aCA+IDA7XG4gIGlmICghaGFzVXBDaGFuZ2VzKSB7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXM6ZW1wdHlDb2RlR2VuZXJhdGlvbkVycm9yXCIsIHtcbiAgICAgIGVudGl0eUNvbHVtbnMsXG4gICAgICBkYkNvbHVtbnMsXG4gICAgICBlbnRpdHlJbmRleGVzLFxuICAgICAgZGJJbmRleGVzLFxuICAgIH0pO1xuICAgIC8vIHRocm93IG5ldyBFcnJvcihcIuy7rOufvC/snbjrjbHsiqQg67OA6rK9IOy9lOuTnCDsg53shLEg7Jik66WYXCIpO1xuICB9XG4gIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzOmRlYnVnXCIsIHtcbiAgICBcImFsdGVyQ29sdW1uc1RvLmFkZC5sZW5ndGhcIjogYWx0ZXJDb2x1bW5zVG8uYWRkLmxlbmd0aCxcbiAgICBcImFsdGVyQ29sdW1uc1RvLmRyb3AubGVuZ3RoXCI6IGFsdGVyQ29sdW1uc1RvLmRyb3AubGVuZ3RoLFxuICAgIFwiYWx0ZXJDb2x1bW5zVG8uYWx0ZXIubGVuZ3RoXCI6IGFsdGVyQ29sdW1uc1RvLmFsdGVyLmxlbmd0aCxcbiAgICBcImFsdGVySW5kZXhlc1RvLmFkZC5sZW5ndGhcIjogYWx0ZXJJbmRleGVzVG8uYWRkLmxlbmd0aCxcbiAgICBcImFsdGVySW5kZXhlc1RvLmRyb3AubGVuZ3RoXCI6IGFsdGVySW5kZXhlc1RvLmRyb3AubGVuZ3RoLFxuICAgIFwiaW5kZXhOZWVkc1RvRHJvcC5sZW5ndGhcIjogaW5kZXhOZWVkc1RvRHJvcC5sZW5ndGgsXG4gIH0pO1xuICAvLyBOYWl0ZS50KFwibWlncmF0b3I6Z2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlczphbHRlckNvbHVtbnNUb1wiLCBhbHRlckNvbHVtbnNUbyk7XG5cbiAgLy8gVE9ETzog7J24642x7Iqk66qFIOuzgOqyveuQnCDqsr3smrAg7LKY66asXG5cbiAgLy8gdGFibGUgYnVpbGRlciDrqZTshJzrk5zroZwg7Iuk7ZaJ7ZWgIOy9lOuTnCAoZHJvcCDihpIgYWRkIOKGkiBhbHRlciDsiJzshJwpXG4gIGNvbnN0IHVwQnVpbGRlckxpbmVzID0gW1xuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC51cC5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC51cC5idWlsZGVyIDogW10pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAuYnVpbGRlciA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci51cC5idWlsZGVyIDogW10pLFxuICAgIC4uLmluZGV4TmVlZHNUb0Ryb3AubWFwKGdlbkluZGV4RHJvcERlZmluaXRpb24pLFxuICBdO1xuXG4gIC8vIGtuZXgucmF3KCnroZwg7Iuk7ZaJ7ZWgIOy9lOuTnFxuICBjb25zdCB1cFJhd0xpbmVzID0gW1xuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLnJhdy5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5yYXcgOiBbXSksXG4gICAgLi4uYWx0ZXJJbmRleGVzVG8uYWRkLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgXTtcblxuICAvLyBkb3du7J2AIHVw7J2YIOyXreyInCAoYWRkLmRvd24gPSBkcm9wIHJvbGxiYWNrLCBkcm9wLmRvd24gPSBhZGQgcm9sbGJhY2spXG4gIGNvbnN0IGRvd25CdWlsZGVyTGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQuZG93bi5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLmRvd24uYnVpbGRlciA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLmRvd24uYnVpbGRlci5sZW5ndGggPiAwXG4gICAgICA/IGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci5kb3duLmJ1aWxkZXJcbiAgICAgIDogW10pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC5kb3duLmJ1aWxkZXIubGVuZ3RoID4gMFxuICAgICAgPyBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC5kb3duLmJ1aWxkZXJcbiAgICAgIDogW10pLFxuICAgIC4uLmFsdGVySW5kZXhlc1RvLmFkZFxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGluZGV4KSA9PlxuICAgICAgICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKGluZGV4Q29sKSA9PlxuICAgICAgICAgICAgYWx0ZXJDb2x1bW5zVG8uYWRkLm1hcCgoY29sKSA9PiBjb2wubmFtZSkuaW5jbHVkZXMoaW5kZXhDb2wubmFtZSksXG4gICAgICAgICAgKSA9PT0gZmFsc2UsXG4gICAgICApXG4gICAgICAubWFwKGdlbkluZGV4RHJvcERlZmluaXRpb24pLFxuICBdO1xuXG4gIGNvbnN0IGRvd25SYXdMaW5lcyA9IFtcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5yYXcubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLmRvd24ucmF3IDogW10pLFxuICAgIC4uLmluZGV4TmVlZHNUb0Ryb3AubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICBdO1xuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHsgS25leCB9IGZyb20gXCJrbmV4XCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi4odXBCdWlsZGVyTGluZXMubGVuZ3RoID4gMFxuICAgICAgPyBbYGF3YWl0IGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLCAuLi51cEJ1aWxkZXJMaW5lcywgXCJ9KTtcIl1cbiAgICAgIDogW10pLFxuICAgIC4uLnVwUmF3TGluZXMsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi4oZG93bkJ1aWxkZXJMaW5lcy5sZW5ndGggPiAwXG4gICAgICA/IFtgYXdhaXQga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsIC4uLmRvd25CdWlsZGVyTGluZXMsIFwifSk7XCJdXG4gICAgICA6IFtdKSxcbiAgICAuLi5kb3duUmF3TGluZXMsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBcInR5cGVzY3JpcHRcIiwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKTtcbiAgY29uc3QgdGl0bGUgPSBbXG4gICAgXCJhbHRlclwiLFxuICAgIHRhYmxlLFxuICAgIC4uLihbXCJhZGRcIiwgXCJkcm9wXCIsIFwiYWx0ZXJcIl0gYXMgY29uc3QpXG4gICAgICAubWFwKChhY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3QgbGVuID0gYWx0ZXJDb2x1bW5zVG9bYWN0aW9uXS5sZW5ndGg7XG4gICAgICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGFjdGlvbiArIGxlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBudWxsKSxcbiAgXS5qb2luKFwiX1wiKTtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRhYmxlLFxuICAgICAgdGl0bGUsXG4gICAgICBmb3JtYXR0ZWQsXG4gICAgICB0eXBlOiBcIm5vcm1hbFwiLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICog7Lus65+8IOu5hOq1kOulvCDsnITtlbQgR2VuZXJhdGVkIENvbHVtbuydmCBleHByZXNzaW9u7J2EIOygnOyZuO2VnCDqsJ3ssrTrpbwg7IOd7ISxXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24oY29sOiBNaWdyYXRpb25Db2x1bW4pOiBNaWdyYXRpb25Db2x1bW4ge1xuICBpZiAoY29sLmdlbmVyYXRlZCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jb2wsXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgdHlwZTogY29sLmdlbmVyYXRlZC50eXBlLFxuICAgICAgICBleHByZXNzaW9uOiBcIlwiLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJldHVybiBjb2w7XG59XG5cbi8qKlxuICog6rCBIOy7rOufvCDsnbTrpoQg6riw7KSA7Jy866GcIGFkZCwgZHJvcCwgYWx0ZXIg7Jes67aAIO2ZleyduFxuICovXG5mdW5jdGlvbiBnZXRBbHRlckNvbHVtbnNUbyhlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSwgZGJDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSkge1xuICBjb25zdCBjb2x1bW5zVG8gPSB7XG4gICAgYWRkOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgICBkcm9wOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgICBhbHRlcjogW10gYXMgTWlncmF0aW9uQ29sdW1uW10sXG4gIH07XG5cbiAgLy8g7Lus65+866qFIOq4sOykgCDruYTqtZBcbiAgY29uc3QgZXh0cmFDb2x1bW5zID0ge1xuICAgIGRiOiBkaWZmKGRiQ29sdW1ucywgZW50aXR5Q29sdW1ucywgKGNvbCkgPT4gW2NvbC5uYW1lLCBjb2wuZ2VuZXJhdGVkPy50eXBlXS5qb2luKFwiLy8vXCIpKSxcbiAgICBlbnRpdHk6IGRpZmYoZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zLCAoY29sKSA9PiBbY29sLm5hbWUsIGNvbC5nZW5lcmF0ZWQ/LnR5cGVdLmpvaW4oXCIvLy9cIikpLFxuICB9O1xuICBpZiAoZXh0cmFDb2x1bW5zLmVudGl0eS5sZW5ndGggPiAwKSB7XG4gICAgY29sdW1uc1RvLmFkZCA9IGNvbHVtbnNUby5hZGQuY29uY2F0KGV4dHJhQ29sdW1ucy5lbnRpdHkpO1xuICB9XG4gIGlmIChleHRyYUNvbHVtbnMuZGIubGVuZ3RoID4gMCkge1xuICAgIGNvbHVtbnNUby5kcm9wID0gY29sdW1uc1RvLmRyb3AuY29uY2F0KGV4dHJhQ29sdW1ucy5kYik7XG4gIH1cblxuICAvLyDrj5nsnbwg7Lus65+866qF7J2YIOyEuOu2gCDtlYTrk5wg67mE6rWQIChHZW5lcmF0ZWQgQ29sdW1uIGV4cHJlc3Npb24g7KCc7Jm4KVxuICBjb25zdCBzYW1lRGJDb2x1bW5zID0gaW50ZXJzZWN0aW9uQnkoZGJDb2x1bW5zLCBlbnRpdHlDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG4gIGNvbnN0IHNhbWVNZENvbHVtbnMgPSBpbnRlcnNlY3Rpb25CeShlbnRpdHlDb2x1bW5zLCBkYkNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKTtcbiAgY29sdW1uc1RvLmFsdGVyID0gZGlmZmVyZW5jZVdpdGgoXG4gICAgc2FtZURiQ29sdW1ucyxcbiAgICBzYW1lTWRDb2x1bW5zLFxuICAgIChhLCBiKSA9PiBlcXVhbCh7IC4uLmEsIGdlbmVyYXRlZDogdW5kZWZpbmVkIH0sIHsgLi4uYiwgZ2VuZXJhdGVkOiB1bmRlZmluZWQgfSksIC8vIGdlbmVyYXRlZCDsu6zrn7zsnYAgYWx0ZXLroZwg7LKY66as7ZWY7KeAIOyViuydjFxuICApO1xuXG4gIHJldHVybiBjb2x1bW5zVG87XG59XG5cbi8qKlxuICog7LaU7Lac65CcIOy7rOufvOuTpOydhCDquLDspIDsnLzroZwg6rCB6rCBIOudvOyduCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2V0QWx0ZXJDb2x1bW5MaW5lc1RvKFxuICBjb2x1bW5zVG86IFJldHVyblR5cGU8dHlwZW9mIGdldEFsdGVyQ29sdW1uc1RvPixcbiAgZW50aXR5Q29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGRiRm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbikge1xuICBjb25zdCBsaW5lc1RvID0ge1xuICAgIGFkZDoge1xuICAgICAgdXA6IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICAgIGRvd246IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICB9LFxuICAgIGRyb3A6IHtcbiAgICAgIHVwOiB7IGJ1aWxkZXI6IFtdIGFzIHN0cmluZ1tdLCByYXc6IFtdIGFzIHN0cmluZ1tdIH0sXG4gICAgICBkb3duOiB7IGJ1aWxkZXI6IFtdIGFzIHN0cmluZ1tdLCByYXc6IFtdIGFzIHN0cmluZ1tdIH0sXG4gICAgfSxcbiAgICBhbHRlcjoge1xuICAgICAgdXA6IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICAgIGRvd246IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIGFkZCBjb2x1bW5zXG4gIGNvbnN0IGFkZENvbHVtbkRlZnMgPSBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgY29sdW1uc1RvLmFkZCk7XG4gIGxpbmVzVG8uYWRkLnVwID0ge1xuICAgIGJ1aWxkZXI6IGFkZENvbHVtbkRlZnMuYnVpbGRlci5sZW5ndGggPiAwID8gW1wiLy8gYWRkXCIsIC4uLmFkZENvbHVtbkRlZnMuYnVpbGRlcl0gOiBbXSxcbiAgICByYXc6IGFkZENvbHVtbkRlZnMucmF3Lmxlbmd0aCA+IDAgPyBbXCIvLyBhZGQgKGdlbmVyYXRlZClcIiwgLi4uYWRkQ29sdW1uRGVmcy5yYXddIDogW10sXG4gIH07XG4gIGxpbmVzVG8uYWRkLmRvd24gPSB7XG4gICAgYnVpbGRlcjpcbiAgICAgIGNvbHVtbnNUby5hZGQubGVuZ3RoID4gMFxuICAgICAgICA/IFtcbiAgICAgICAgICAgIFwiLy8gcm9sbGJhY2sgLSBhZGRcIixcbiAgICAgICAgICAgIGB0YWJsZS5kcm9wQ29sdW1ucygke2NvbHVtbnNUby5hZGQubWFwKChjb2wpID0+IGAnJHtjb2wubmFtZX0nYCkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSxcbiAgICByYXc6IFtdLFxuICB9O1xuXG4gIC8vIGRyb3DtlaAg7Lus65+87JeQIOqxuOumsCBGSyDssL7quLBcbiAgY29uc3QgZHJvcENvbHVtbk5hbWVzID0gY29sdW1uc1RvLmRyb3AubWFwKChjb2wpID0+IGNvbC5uYW1lKTtcbiAgY29uc3QgZmtUb0Ryb3BCZWZvcmVDb2x1bW4gPSBkYkZvcmVpZ25zLmZpbHRlcigoZmspID0+XG4gICAgZmsuY29sdW1ucy5zb21lKChjb2wpID0+IGRyb3BDb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2wpKSxcbiAgKTtcblxuICBjb25zdCBkcm9wRmtMaW5lcyA9IGZrVG9Ecm9wQmVmb3JlQ29sdW1uLm1hcCgoZmspID0+IHtcbiAgICBjb25zdCBjb2x1bW5zU3RyaW5nUXVvdGUgPSBmay5jb2x1bW5zLm1hcCgoY29sKSA9PiBgJyR7Y29sfSdgKS5qb2luKFwiLFwiKTtcbiAgICByZXR1cm4gYHRhYmxlLmRyb3BGb3JlaWduKFske2NvbHVtbnNTdHJpbmdRdW90ZX1dKWA7XG4gIH0pO1xuXG4gIGNvbnN0IHJlc3RvcmVGa0xpbmVzID0gZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvRHJvcEJlZm9yZUNvbHVtbikudXA7XG5cbiAgLy8gZHJvcOydmCByb2xsYmFja+yLnOyXkOuKlCBnZW5lcmF0ZWQgY29sdW1u64+EIOuzteybkO2VtOyVvCDtlahcbiAgY29uc3QgZHJvcENvbHVtbkRlZnMgPSBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgY29sdW1uc1RvLmRyb3ApO1xuICBsaW5lc1RvLmRyb3AgPSB7XG4gICAgdXA6IHtcbiAgICAgIGJ1aWxkZXI6IFtcbiAgICAgICAgLi4uKGRyb3BGa0xpbmVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcIi8vIGRyb3AgZm9yZWlnbiBrZXlzIG9uIGNvbHVtbnMgdG8gYmUgZHJvcHBlZFwiLCAuLi5kcm9wRmtMaW5lc11cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKGNvbHVtbnNUby5kcm9wLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgXCIvLyBkcm9wIGNvbHVtbnNcIixcbiAgICAgICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCR7Y29sdW1uc1RvLmRyb3AubWFwKChjb2wpID0+IGAnJHtjb2wubmFtZX0nYCkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgICAgXVxuICAgICAgICAgIDogW10pLFxuICAgICAgXSxcbiAgICAgIHJhdzogW10sXG4gICAgfSxcbiAgICBkb3duOiB7XG4gICAgICBidWlsZGVyOiBbXG4gICAgICAgIC4uLihkcm9wQ29sdW1uRGVmcy5idWlsZGVyLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcIi8vIHJvbGxiYWNrIC0gZHJvcCBjb2x1bW5zXCIsIC4uLmRyb3BDb2x1bW5EZWZzLmJ1aWxkZXJdXG4gICAgICAgICAgOiBbXSksXG4gICAgICAgIC4uLihyZXN0b3JlRmtMaW5lcy5sZW5ndGggPiAwID8gW1wiLy8gcmVzdG9yZSBmb3JlaWduIGtleXNcIiwgLi4ucmVzdG9yZUZrTGluZXNdIDogW10pLFxuICAgICAgXSxcbiAgICAgIHJhdzpcbiAgICAgICAgZHJvcENvbHVtbkRlZnMucmF3Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcIi8vIHJvbGxiYWNrIC0gZHJvcCBjb2x1bW5zIChnZW5lcmF0ZWQpXCIsIC4uLmRyb3BDb2x1bW5EZWZzLnJhd11cbiAgICAgICAgICA6IFtdLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gYWx0ZXIgY29sdW1ucyAoR2VuZXJhdGVkIENvbHVtbuydgCBBTFRFUiDrtojqsIDtlZjrr4DroZwgZHJvcCDtm4Qg7J6s7IOd7ISxKVxuICBsaW5lc1RvLmFsdGVyID0gY29sdW1uc1RvLmFsdGVyLnJlZHVjZShcbiAgICAociwgZGJDb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IGVudGl0eUNvbHVtbiA9IGVudGl0eUNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gZGJDb2x1bW4ubmFtZSk7XG4gICAgICBpZiAoZW50aXR5Q29sdW1uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG5cbiAgICAgIC8vIOy7rOufvCDrs4Dqsr3sgqztla1cbiAgICAgIGNvbnN0IGNvbHVtbkRpZmZVcCA9IGRpZmYoXG4gICAgICAgIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBbZW50aXR5Q29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtkYkNvbHVtbl0pLmJ1aWxkZXIsXG4gICAgICApO1xuICAgICAgY29uc3QgY29sdW1uRGlmZkRvd24gPSBkaWZmKFxuICAgICAgICBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgW2RiQ29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtlbnRpdHlDb2x1bW5dKS5idWlsZGVyLFxuICAgICAgKTtcbiAgICAgIGlmIChjb2x1bW5EaWZmVXAubGVuZ3RoID4gMCkge1xuICAgICAgICByLnVwLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci51cC5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gYWx0ZXIgY29sdW1uXCIsXG4gICAgICAgICAgLi4uY29sdW1uRGlmZlVwLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgICAgci5kb3duLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci5kb3duLmJ1aWxkZXIsXG4gICAgICAgICAgXCIvLyByb2xsYmFjayAtIGFsdGVyIGNvbHVtblwiLFxuICAgICAgICAgIC4uLmNvbHVtbkRpZmZEb3duLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIGxpbmVzVG87XG59XG5cbi8qKlxuICog7J24642x7Iqk7J2YIGFkZCwgZHJvcCDsl6zrtoAg7ZmV7J24XG4gKi9cbmZ1bmN0aW9uIGdldEFsdGVySW5kZXhlc1RvKGVudGl0eUluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sIGRiSW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSkge1xuICAvLyDsnbjrjbHsiqQg67mE6rWQXG4gIGNvbnN0IGluZGV4ZXNUbyA9IHtcbiAgICBhZGQ6IFtdIGFzIE1pZ3JhdGlvbkluZGV4W10sXG4gICAgZHJvcDogW10gYXMgTWlncmF0aW9uSW5kZXhbXSxcbiAgfTtcblxuICAvLyDsnbjrjbHsiqQg6rOg7JygIOyLneuzhOyekCDsg53shLEgKG5hbWXsnYQg7KCc7Jm47ZWcIOuqqOuToCDtlYTrk5zrpbwg66y47J6Q7Je066GcIOuzgO2ZmO2VmOyXrCDsobDtlakpXG4gIGNvbnN0IGlkZW50aXR5ID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oaW5kZXg6IFQpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRleClcbiAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcIm5hbWVcIilcbiAgICAgIC5zb3J0KCk7XG5cbiAgICByZXR1cm4ga2V5c1xuICAgICAgLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IFwibmFtZVwiKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSBcImNvbHVtbnNcIikge1xuICAgICAgICAgIHJldHVybiAoaW5kZXhba2V5XSBhcyBNaWdyYXRpb25JbmRleFtcImNvbHVtbnNcIl0pLmZsYXRNYXAoaWRlbnRpdHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtrZXl9PSR7aW5kZXhba2V5IGFzIGtleW9mIE1pZ3JhdGlvbkluZGV4XX1gO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiLy9cIik7XG4gIH07XG5cbiAgY29uc3QgZXh0cmFJbmRleGVzID0ge1xuICAgIGRiOiBkaWZmKGRiSW5kZXhlcywgZW50aXR5SW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyksIGlkZW50aXR5KSxcbiAgICBlbnRpdHk6IGRpZmYoZW50aXR5SW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyksIGRiSW5kZXhlcywgaWRlbnRpdHkpLFxuICB9O1xuICBpZiAoZXh0cmFJbmRleGVzLmVudGl0eS5sZW5ndGggPiAwKSB7XG4gICAgaW5kZXhlc1RvLmFkZCA9IGluZGV4ZXNUby5hZGQuY29uY2F0KGV4dHJhSW5kZXhlcy5lbnRpdHkpO1xuICB9XG4gIGlmIChleHRyYUluZGV4ZXMuZGIubGVuZ3RoID4gMCkge1xuICAgIGluZGV4ZXNUby5kcm9wID0gaW5kZXhlc1RvLmRyb3AuY29uY2F0KGV4dHJhSW5kZXhlcy5kYik7XG4gIH1cblxuICByZXR1cm4gaW5kZXhlc1RvO1xufVxuXG4vKipcbiAqIOyduOuNseyKpCDsgq3soJwg7KCV7J2YIOyDneyEsVxuICovXG5mdW5jdGlvbiBnZW5JbmRleERyb3BEZWZpbml0aW9uKGluZGV4OiBNaWdyYXRpb25JbmRleCkge1xuICByZXR1cm4gYHRhYmxlLmRyb3BJbmRleChbJHtpbmRleC5jb2x1bW5zXG4gICAgLm1hcCgoY29sdW1uKSA9PiBgJyR7Y29sdW1uLm5hbWV9J2ApXG4gICAgLmpvaW4oXCIsXCIpfV0sICcke2luZGV4Lm5hbWV9JylgO1xufVxuXG4vKipcbiAqIERCIOyhsO2ajCDqsrDqs7zsmYAg67mE6rWQ7ZWY6riwIOychO2VnCDsnbjrjbHsiqQg6riw67O46rCSIOyEpOyglVxuICovXG5mdW5jdGlvbiBzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzKGluZGV4OiBNaWdyYXRpb25JbmRleCk6IE1pZ3JhdGlvbkluZGV4IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5pbmRleCxcbiAgICBjb2x1bW5zOiBpbmRleC5jb2x1bW5zLm1hcCgoY29sKSA9PiAoe1xuICAgICAgLi4uY29sLFxuICAgICAgc29ydE9yZGVyOiBjb2wuc29ydE9yZGVyID8/IFwiQVNDXCIsXG4gICAgICAvLyBzb3J0T3JkZXLsl5Ag65Sw6528IG51bGxzRmlyc3TsnZggZGVmYXVsdCDqsJIg7ISk7KCVXG4gICAgICBudWxsc0ZpcnN0OiBjb2wubnVsbHNGaXJzdCA/PyBjb2wuc29ydE9yZGVyID09PSBcIkRFU0NcIixcbiAgICB9KSksXG4gICAgbnVsbHNOb3REaXN0aW5jdDogaW5kZXgubnVsbHNOb3REaXN0aW5jdCA/PyBmYWxzZSxcbiAgICB1c2luZzogaW5kZXgudXNpbmcgPz8gXCJidHJlZVwiLFxuICB9O1xufVxuXG4vKipcbiAqIO2FjOydtOu4lCDrs4Dqsr0g7LyA7J207IqkIC0gRm9yZWlnbiBLZXkg67OA6rK9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlX0ZvcmVpZ25zKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuICBkYkZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4gIGRyb3BwaW5nQ29sdW1uczogTWlncmF0aW9uQ29sdW1uW10gPSBbXSxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIC8vIGNvbnNvbGUubG9nKHsgZW50aXR5Rm9yZWlnbnMsIGRiRm9yZWlnbnMgfSk7XG5cbiAgY29uc3QgZ2V0S2V5ID0gKG1mOiBNaWdyYXRpb25Gb3JlaWduKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gW21mLmNvbHVtbnMuam9pbihcIi1cIiksIG1mLnRvXS5qb2luKFwiLy8vXCIpO1xuICB9O1xuXG4gIC8vIOyCreygnOuQoCDsu6zrn7zrqoUg66qp66GdXG4gIGNvbnN0IGRyb3BwaW5nQ29sdW1uTmFtZXMgPSBkcm9wcGluZ0NvbHVtbnMubWFwKChjb2wpID0+IGNvbC5uYW1lKTtcblxuICBjb25zdCBma1RvID0gZW50aXR5Rm9yZWlnbnMucmVkdWNlKFxuICAgIChyZXN1bHQsIGVudGl0eUYpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRGJGID0gZGJGb3JlaWducy5maW5kKChkYkYpID0+IGdldEtleShlbnRpdHlGKSA9PT0gZ2V0S2V5KGRiRikpO1xuICAgICAgaWYgKCFtYXRjaGluZ0RiRikge1xuICAgICAgICByZXN1bHQuYWRkLnB1c2goZW50aXR5Rik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcXVhbChlbnRpdHlGLCBtYXRjaGluZ0RiRikgPT09IGZhbHNlKSB7XG4gICAgICAgIHJlc3VsdC5hbHRlclNyYy5wdXNoKG1hdGNoaW5nRGJGKTtcbiAgICAgICAgcmVzdWx0LmFsdGVyRHN0LnB1c2goZW50aXR5Rik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAge1xuICAgICAgYWRkOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBkcm9wOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBhbHRlclNyYzogW10gYXMgTWlncmF0aW9uRm9yZWlnbltdLFxuICAgICAgYWx0ZXJEc3Q6IFtdIGFzIE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgICB9LFxuICApO1xuXG4gIC8vIGRiRm9yZWlnbnPsl5DripQg7J6I7KeA66eMIGVudGl0eUZvcmVpZ25z7JeQ64qUIOyXhuuKlCDqsr3smrAgKOyCreygnOuQnCBGSylcbiAgLy8g64uoLCDsgq3soJzrkKAg7Lus65+87J2YIEZL64qUIOygnOyZuCAoZ2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlc+yXkOyEnCDsspjrpqwpXG4gIGRiRm9yZWlnbnMuZm9yRWFjaCgoZGJGKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hpbmdFbnRpdHlGID0gZW50aXR5Rm9yZWlnbnMuZmluZCgoZW50aXR5RikgPT4gZ2V0S2V5KGVudGl0eUYpID09PSBnZXRLZXkoZGJGKSk7XG4gICAgaWYgKCFtYXRjaGluZ0VudGl0eUYpIHtcbiAgICAgIC8vIOydtCBGS+ydmCDsu6zrn7zsnbQg7IKt7KCc65CgIOy7rOufvCDrqqnroZ3sl5Ag7J6I64qU7KeAIO2ZleyduFxuICAgICAgY29uc3QgaXNDb2x1bW5Ecm9wcGluZyA9IGRiRi5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gZHJvcHBpbmdDb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2wpKTtcbiAgICAgIC8vIOy7rOufvOydtCDsgq3soJzrkJjsp4Ag7JWK64qUIOqyveyasOyXkOunjCBGSyBkcm9wIOuqqeuhneyXkCDstpTqsIBcbiAgICAgIGlmICghaXNDb2x1bW5Ecm9wcGluZykge1xuICAgICAgICBma1RvLmRyb3AucHVzaChkYkYpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgbGluZXNUbyA9IHtcbiAgICBhZGQ6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5hZGQpLFxuICAgIGRyb3A6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5kcm9wKSxcbiAgICBhbHRlclNyYzogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFsdGVyU3JjKSxcbiAgICBhbHRlckRzdDogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFsdGVyRHN0KSxcbiAgfTtcblxuICAvLyBkcm9wIGZrIGNvbHVtbnPsnbgg6rK97JqwKOyDneyEseuQoCDsvZTrk5wg7JeG64qUIOqyveyasCkg7Yyo7IqkXG4gIGNvbnN0IGhhc0xpbmVzID0gT2JqZWN0LnZhbHVlcyhsaW5lc1RvKS5zb21lKChsKSA9PiBsLnVwLmxlbmd0aCA+IDAgfHwgbC5kb3duLmxlbmd0aCA+IDApO1xuICBpZiAoIWhhc0xpbmVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKFxuICAgIGxpbmVzVG8uYWRkLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uZHJvcC51cC5sZW5ndGggPT09IDAgJiZcbiAgICBsaW5lc1RvLmFsdGVyU3JjLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uYWx0ZXJEc3QudXAubGVuZ3RoID09PSAwXG4gICkge1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWduczpma0NoYW5nZUNvZGVHZW5lcmF0aW9uRXJyb3JcIiwge1xuICAgICAgdGFibGUsXG4gICAgICBlbnRpdHlGb3JlaWducyxcbiAgICAgIGRiRm9yZWlnbnMsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRksg67OA6rK9IOy9lOuTnCDsg53shLEg7Jik66WYXCIpO1xuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGByZXR1cm4ga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgLi4ubGluZXNUby5kcm9wLmRvd24sXG4gICAgLi4ubGluZXNUby5hZGQudXAsXG4gICAgLi4ubGluZXNUby5hbHRlclNyYy5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJEc3QudXAsXG4gICAgXCJ9KVwiLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICAuLi5saW5lc1RvLmFkZC5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJEc3QuZG93bixcbiAgICAuLi5saW5lc1RvLmFsdGVyU3JjLnVwLFxuICAgIC4uLmxpbmVzVG8uZHJvcC51cCxcbiAgICBcIn0pXCIsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBcInR5cGVzY3JpcHRcIiwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKTtcbiAgY29uc3QgdGl0bGUgPSBbXG4gICAgXCJhbHRlclwiLFxuICAgIHRhYmxlLFxuICAgIFwiZm9yZWlnbnNcIixcbiAgICAvLyBUT0RPIOuwlOuAjOuKlCDrtoDrtoRcbiAgXS5qb2luKFwiX1wiKTtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRhYmxlLFxuICAgICAgdGl0bGUsXG4gICAgICBmb3JtYXR0ZWQsXG4gICAgICB0eXBlOiBcIm5vcm1hbFwiLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICog7KO87Ja07KeEIEVudGl0eVNldOydhCDquLDrsJjsnLzroZwg7YWM7J2067iUIENSRUFURSDrp4jsnbTqt7jroIjsnbTshZgg7L2U65Oc66W8IOyDneyEse2VqeuLiOuLpC5cbiAqIEBwYXJhbSBlbnRpdHlTZXRcbiAqIEByZXR1cm5zIENSRUFURSDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNyZWF0ZUNvZGUoZW50aXR5U2V0OiBNaWdyYXRpb25TZXQpOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICByZXR1cm4gW1xuICAgIGF3YWl0IGdlbmVyYXRlQ3JlYXRlQ29kZV9Db2x1bW5BbmRJbmRleGVzKFxuICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgZW50aXR5U2V0LmNvbHVtbnMsXG4gICAgICBlbnRpdHlTZXQuaW5kZXhlcyxcbiAgICApLFxuICAgIC4uLihhd2FpdCBnZW5lcmF0ZUNyZWF0ZUNvZGVfRm9yZWlnbihlbnRpdHlTZXQudGFibGUsIGVudGl0eVNldC5mb3JlaWducykpLFxuICBdO1xufVxuXG4vKipcbiAqIOyjvOyWtOynhCBlbnRpdHlTZXTsnYQg66qp7ZGc66GcLCBkYlNldOydhCDtmIQg7IOB7Zmp7Jy866GcIO2VmOyXrCDthYzsnbTruJQgQUxURVIg66eI7J206re466CI7J207IWYIOy9lOuTnOulvCDsg53shLHtlanri4jri6QuXG4gKiBAcGFyYW0gZW50aXR5U2V0IO2YhCDsg4HtmansnZggTWlncmF0aW9uU2V0XG4gKiBAcGFyYW0gZGJTZXQg66qp7ZGcIOyDge2ZqeydmCBNaWdyYXRpb25TZXRcbiAqIEByZXR1cm5zIEFMVEVSIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5xcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlKFxuICBlbnRpdHlTZXQ6IE1pZ3JhdGlvblNldCxcbiAgZGJTZXQ6IE1pZ3JhdGlvblNldCxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIGNvbnN0IHJlcGxhY2VDb2x1bW5EZWZhdWx0VG8gPSAoY29sOiBNaWdyYXRpb25Db2x1bW4pID0+IHtcbiAgICAvLyBmbG9hdOyduCDqsr3smrAg6riw67O46rCS7J2EIDDsnLzroZwg7KeA7KCV7ZWY64qUIOqyveyasCBcIjAuMDBcIuycvOuhnCDrs4DtmZjrkJjripQg7LyA7J207IqkIOuMgOydkVxuICAgIC8vIGlmIChjb2wudHlwZSA9PT0gXCJmbG9hdFwiICYmIGNvbC5kZWZhdWx0VG8gJiYgU3RyaW5nKGNvbC5kZWZhdWx0VG8pLmluY2x1ZGVzKCdcIicpID09PSBmYWxzZSkge1xuICAgIC8vICAgY29sLmRlZmF1bHRUbyA9IGBcIiR7TnVtYmVyKGNvbC5kZWZhdWx0VG8pLnRvRml4ZWQoY29sLnNjYWxlID8/IDIpfVwiYDtcbiAgICAvLyB9XG4gICAgLy8gLy8gc3RyaW5n7J24IOqyveyasCDquLDrs7jqsJLsnbQg67mIIOyKpO2KuOungeyduCDqsr3smrAg64yA7J2RXG4gICAgLy8gaWYgKGNvbC50eXBlID09PSBcInN0cmluZ1wiICYmIGNvbC5kZWZhdWx0VG8gPT09IFwiXCIpIHtcbiAgICAvLyAgIGNvbC5kZWZhdWx0VG8gPSAnXCJcIic7XG4gICAgLy8gfVxuICAgIC8vIC8vIGJvb2xlYW7snbgg6rK97JqwIOq4sOuzuOqwkiDsoJXqt5ztmZQgKE15U1FM7JeQ7ISc64qUIFRJTllJTlQoMSnroZwg7KCA7J6l65CY66+A66GcIDAg65iQ64qUIDHroZwg7KCV6rec7ZmUKVxuICAgIC8vIC8vIFRPRE86IGRiLnRz7JeQIHR5cGVDYXNlIOyEpOyglSDtmZXsnbjtlZjsl6wg7LKY66as7ZWY64+E66GdIOyImOyglSDtlYTsmpRcbiAgICAvLyBpZiAoY29sLnR5cGUgPT09IFwiYm9vbGVhblwiICYmIGNvbC5kZWZhdWx0VG8gIT09IHVuZGVmaW5lZCkge1xuICAgIC8vICAgaWYgKGNvbC5kZWZhdWx0VG8gPT09IFwiMFwiIHx8IGNvbC5kZWZhdWx0VG8udG9Mb3dlckNhc2UoKSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgLy8gICAgIGNvbC5kZWZhdWx0VG8gPSBcIjBcIjtcbiAgICAvLyAgIH0gZWxzZSBpZiAoY29sLmRlZmF1bHRUbyA9PT0gXCIxXCIgfHwgY29sLmRlZmF1bHRUby50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIikge1xuICAgIC8vICAgICBjb2wuZGVmYXVsdFRvID0gXCIxXCI7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgLy8gRklYTUU6IOydvOuLqCBNeVNRTCDsg4Htmansl5DshJwg67Cc7IOd7ZaI642YIOydtOyKiOydmCB3b3JrYXJvdW5kIOydtOuvgOuhnCBQZ+yXkOyEnCDsnqztmZXsnbgg7ZuEIOuMgOydkSDstpTqsIBcbiAgICByZXR1cm4gY29sO1xuICB9O1xuICBjb25zdCBlbnRpdHlDb2x1bW5zID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5jb2x1bW5zLCAoYSkgPT4gYS5uYW1lKS5tYXAocmVwbGFjZUNvbHVtbkRlZmF1bHRUbyk7XG4gIGNvbnN0IGRiQ29sdW1ucyA9IGFscGhhYmV0aWNhbChkYlNldC5jb2x1bW5zLCAoYSkgPT4gYS5uYW1lKS5tYXAocmVwbGFjZUNvbHVtbkRlZmF1bHRUbyk7XG5cbiAgLyog65SU67KE6rmF7JqpIOy9lOuTnCwg7Yq57KCVIOy7rOufvOyXkOyEnCDrtojsnbzsuZgg67Cc7IOd7ZWgIOuVjCDtmZXsnbhcbiAgICAgICAgY29uc3QgZW50aXR5Q29sdW1uID0gZW50aXR5U2V0LmNvbHVtbnMuZmluZChcbiAgICAgICAgICAoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJwcmljZV9rcndcIlxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkYkNvbHVtbiA9IGRiU2V0LmNvbHVtbnMuZmluZChcbiAgICAgICAgICAoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJwcmljZV9rcndcIlxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmRlYnVnKHsgZW50aXR5Q29sdW1uLCBkYkNvbHVtbiB9KTtcbiAgICAgICAgICovXG5cbiAgLy8gP1xuICBjb25zdCBlbnRpdHlJbmRleGVzID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5pbmRleGVzLCAoYSkgPT4gW2EudHlwZSwgLi4uYS5jb2x1bW5zXS5qb2luKFwiLVwiKSk7XG4gIGNvbnN0IGRiSW5kZXhlcyA9IGFscGhhYmV0aWNhbChkYlNldC5pbmRleGVzLCAoYSkgPT4gW2EudHlwZSwgLi4uYS5jb2x1bW5zXS5qb2luKFwiLVwiKSk7XG5cbiAgY29uc3QgcmVwbGFjZU5vQWN0aW9uT25NeVNRTCA9IChmOiBNaWdyYXRpb25Gb3JlaWduKSA9PiB7XG4gICAgLy8gTXlTUUzsl5DshJwgUkVTVFJJQ1TsmYAgTk8gQUNUSU9O7J2AIOuPmeydvO2VqFxuICAgIGNvbnN0IHsgb25EZWxldGUsIG9uVXBkYXRlIH0gPSBmO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5mLFxuICAgICAgb25VcGRhdGU6IG9uVXBkYXRlID09PSBcIlJFU1RSSUNUXCIgPyBcIk5PIEFDVElPTlwiIDogb25VcGRhdGUsXG4gICAgICBvbkRlbGV0ZTogb25EZWxldGUgPT09IFwiUkVTVFJJQ1RcIiA/IFwiTk8gQUNUSU9OXCIgOiBvbkRlbGV0ZSxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGVudGl0eUZvcmVpZ25zID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5mb3JlaWducywgKGEpID0+XG4gICAgW2EudG8sIC4uLmEuY29sdW1uc10uam9pbihcIi1cIiksXG4gICkubWFwKChmKSA9PiByZXBsYWNlTm9BY3Rpb25Pbk15U1FMKGYpKTtcbiAgY29uc3QgZGJGb3JlaWducyA9IGFscGhhYmV0aWNhbChkYlNldC5mb3JlaWducywgKGEpID0+IFthLnRvLCAuLi5hLmNvbHVtbnNdLmpvaW4oXCItXCIpKS5tYXAoKGYpID0+XG4gICAgcmVwbGFjZU5vQWN0aW9uT25NeVNRTChmKSxcbiAgKTtcblxuICAvLyDsgq3soJzrkKAg7Lus65+8IOuqqeuhnSDqs4TsgrBcbiAgY29uc3QgZHJvcHBpbmdDb2x1bW5zID0gZGlmZihkYkNvbHVtbnMsIGVudGl0eUNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKTtcblxuICBjb25zdCBhbHRlckNvZGVzOiAoR2VuTWlncmF0aW9uQ29kZSB8IEdlbk1pZ3JhdGlvbkNvZGVbXSB8IG51bGwpW10gPSBbXTtcblxuICAvLyAxLiBjb2x1bW5zQW5kSW5kZXhlcyDsspjrpqxcbiAgY29uc3QgaXNFcXVhbENvbHVtbnMgPSBlcXVhbChcbiAgICBlbnRpdHlDb2x1bW5zLm1hcChub3JtYWxpemVDb2x1bW5Gb3JDb21wYXJpc29uKSxcbiAgICBkYkNvbHVtbnMubWFwKG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24pLFxuICApO1xuICBjb25zdCBpc0VxdWFsSW5kZXhlcyA9IGVxdWFsKFxuICAgIGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpLFxuICAgIGRiSW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyksXG4gICk7XG4gIGlmICghaXNFcXVhbENvbHVtbnMgfHwgIWlzRXF1YWxJbmRleGVzKSB7XG4gICAgYWx0ZXJDb2Rlcy5wdXNoKFxuICAgICAgYXdhaXQgZ2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICBlbnRpdHlDb2x1bW5zLFxuICAgICAgICBlbnRpdHlJbmRleGVzLFxuICAgICAgICBkYkNvbHVtbnMsXG4gICAgICAgIGRiSW5kZXhlcyxcbiAgICAgICAgZGJTZXQuZm9yZWlnbnMsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiBmb3JlaWducyDsspjrpqwgKOyCreygnOuQoCDsu6zrn7wg7KCV67O0IOyghOuLrClcbiAgaWYgKGVxdWFsKGVudGl0eUZvcmVpZ25zLCBkYkZvcmVpZ25zKSA9PT0gZmFsc2UpIHtcbiAgICBhbHRlckNvZGVzLnB1c2goXG4gICAgICBhd2FpdCBnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWducyhcbiAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICBlbnRpdHlGb3JlaWducyxcbiAgICAgICAgZGJGb3JlaWducyxcbiAgICAgICAgZHJvcHBpbmdDb2x1bW5zLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgaWYgKGFsdGVyQ29kZXMuZXZlcnkoKGFsdGVyQ29kZSkgPT4gYWx0ZXJDb2RlID09PSBudWxsKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBhbHRlckNvZGVzLmZpbHRlcigoYWx0ZXJDb2RlKSA9PiBhbHRlckNvZGUgIT09IG51bGwpLmZsYXQoKTtcbn1cbiJdLCJuYW1lcyI6WyJlcXVhbCIsImFscGhhYmV0aWNhbCIsImRpZmYiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJmb3JtYXRDb2RlIiwiZGlmZmVyZW5jZVdpdGgiLCJpbnRlcnNlY3Rpb25CeSIsImdlbmVyYXRlQ3JlYXRlQ29kZV9Db2x1bW5BbmRJbmRleGVzIiwidGFibGUiLCJjb2x1bW5zIiwiaW5kZXhlcyIsImNvbHVtbkRlZnMiLCJnZW5Db2x1bW5EZWZpbml0aW9ucyIsImxpbmVzIiwiYnVpbGRlciIsInJhdyIsIm1hcCIsImluZGV4IiwiZ2VuSW5kZXhEZWZpbml0aW9uIiwidHlwZSIsInRpdGxlIiwiZm9ybWF0dGVkIiwiam9pbiIsInJlc3VsdCIsImNvbHVtbiIsImdlbmVyYXRlZCIsInB1c2giLCJnZW5HZW5lcmF0ZWRDb2x1bW5EZWZpbml0aW9uIiwiZ2VuTm9ybWFsQ29sdW1uRGVmaW5pdGlvbiIsIkVycm9yIiwicGdUeXBlIiwiZ2V0UGdUeXBlRm9yQ29sdW1uIiwic3RvcmFnZVR5cGUiLCJudWxsYWJsZUNsYXVzZSIsIm51bGxhYmxlIiwibmFtZSIsImV4cHJlc3Npb24iLCJjaGFpbnMiLCJlbmRzV2l0aCIsImVsZW1lbnRUeXBlIiwic2xpY2UiLCJnZXRQZ0FycmF5VHlwZSIsImRpbWVuc2lvbnMiLCJudW1iZXJUeXBlIiwicHJlY2lzaW9uIiwic2NhbGUiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJleHRyYVR5cGUiLCJkZWZhdWx0VG8iLCJzdGFydHNXaXRoIiwiZ2VuVmVjdG9ySW5kZXhEZWZpbml0aW9uIiwidXNpbmciLCJnZW5QZ3Jvb25nYUluZGV4RGVmaW5pdGlvbiIsIm1ldGhvZE1hcCIsInVuaXF1ZSIsIm51bGxzTm90RGlzdGluY3RDbGF1c2UiLCJudWxsc05vdERpc3RpbmN0IiwidXNpbmdDbGF1c2UiLCJjb2wiLCJzb3J0T3JkZXJDbGF1c2UiLCJzb3J0T3JkZXIiLCJudWxsc0ZpcnN0Q2xhdXNlIiwibnVsbHNGaXJzdCIsImVudGl0eSIsImdldEJ5VGFibGUiLCJjb2x1bW5DbGF1c2UiLCJwcm9wc0RpY3QiLCJvcHRpb24iLCJnZXRQZ3Jvb25nYUNvbHVtbk9wdGlvbiIsInZlY3Rvck9wcyIsIm0iLCJlZkNvbnN0cnVjdGlvbiIsImxpc3RzIiwiZ2VuZXJhdGVDcmVhdGVDb2RlX0ZvcmVpZ24iLCJmb3JlaWducyIsInVwIiwiZG93biIsImdlbkZvcmVpZ25EZWZpbml0aW9ucyIsImNvbnNvbGUiLCJsb2ciLCJmb3JlaWduS2V5c1N0cmluZyIsImZvcmVpZ24iLCJyZWR1Y2UiLCJyIiwiY29sdW1uc1N0cmluZ1F1b3RlIiwicmVwbGFjZSIsInRvIiwib25VcGRhdGUiLCJvbkRlbGV0ZSIsImdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXMiLCJlbnRpdHlDb2x1bW5zIiwiZW50aXR5SW5kZXhlcyIsImRiQ29sdW1ucyIsImRiSW5kZXhlcyIsImRiRm9yZWlnbnMiLCJhbHRlckNvbHVtbnNUbyIsImdldEFsdGVyQ29sdW1uc1RvIiwiYWx0ZXJDb2x1bW5MaW5lc1RvIiwiZ2V0QWx0ZXJDb2x1bW5MaW5lc1RvIiwiYWx0ZXJJbmRleGVzVG8iLCJnZXRBbHRlckluZGV4ZXNUbyIsImluZGV4TmVlZHNUb0Ryb3AiLCJkcm9wIiwiZmlsdGVyIiwiZXZlcnkiLCJpbmNsdWRlcyIsImhhc1VwQ2hhbmdlcyIsImFkZCIsImFsdGVyIiwidCIsInVwQnVpbGRlckxpbmVzIiwiZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbiIsInVwUmF3TGluZXMiLCJkb3duQnVpbGRlckxpbmVzIiwiaW5kZXhDb2wiLCJkb3duUmF3TGluZXMiLCJhY3Rpb24iLCJsZW4iLCJwYXJ0Iiwibm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbiIsImNvbHVtbnNUbyIsImV4dHJhQ29sdW1ucyIsImRiIiwiY29uY2F0Iiwic2FtZURiQ29sdW1ucyIsInNhbWVNZENvbHVtbnMiLCJhIiwiYiIsImxpbmVzVG8iLCJhZGRDb2x1bW5EZWZzIiwiZHJvcENvbHVtbk5hbWVzIiwiZmtUb0Ryb3BCZWZvcmVDb2x1bW4iLCJmayIsInNvbWUiLCJkcm9wRmtMaW5lcyIsInJlc3RvcmVGa0xpbmVzIiwiZHJvcENvbHVtbkRlZnMiLCJkYkNvbHVtbiIsImVudGl0eUNvbHVtbiIsImZpbmQiLCJjb2x1bW5EaWZmVXAiLCJjb2x1bW5EaWZmRG93biIsImwiLCJpbmRleGVzVG8iLCJpZGVudGl0eSIsImtleXMiLCJPYmplY3QiLCJrZXkiLCJzb3J0IiwiZmxhdE1hcCIsImV4dHJhSW5kZXhlcyIsInNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMiLCJnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWducyIsImVudGl0eUZvcmVpZ25zIiwiZHJvcHBpbmdDb2x1bW5zIiwiZ2V0S2V5IiwibWYiLCJkcm9wcGluZ0NvbHVtbk5hbWVzIiwiZmtUbyIsImVudGl0eUYiLCJtYXRjaGluZ0RiRiIsImRiRiIsImFsdGVyU3JjIiwiYWx0ZXJEc3QiLCJmb3JFYWNoIiwibWF0Y2hpbmdFbnRpdHlGIiwiaXNDb2x1bW5Ecm9wcGluZyIsImhhc0xpbmVzIiwidmFsdWVzIiwiZ2VuZXJhdGVDcmVhdGVDb2RlIiwiZW50aXR5U2V0IiwiZ2VuZXJhdGVBbHRlckNvZGUiLCJkYlNldCIsInJlcGxhY2VDb2x1bW5EZWZhdWx0VG8iLCJyZXBsYWNlTm9BY3Rpb25Pbk15U1FMIiwiZiIsImFsdGVyQ29kZXMiLCJpc0VxdWFsQ29sdW1ucyIsImlzRXF1YWxJbmRleGVzIiwiYWx0ZXJDb2RlIiwiZmxhdCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBVyxrQkFBa0I7QUFDcEMsU0FBU0MsWUFBWSxFQUFFQyxJQUFJLFFBQVEsVUFBVTtBQUM3QyxTQUFTQyxhQUFhLEVBQUVDLEtBQUssUUFBUSxjQUFLO0FBUzFDLFNBQVNDLFVBQVUsUUFBUSx3QkFBcUI7QUFDaEQsU0FBU0MsY0FBYyxFQUFFQyxjQUFjLFFBQVEsb0JBQWlCO0FBWWhFOztDQUVDLEdBQ0QsZUFBZUMsb0NBQ2JDLEtBQWEsRUFDYkMsT0FBMEIsRUFDMUJDLE9BQXlCO0lBRXpCLE1BQU1DLGFBQWFDLHFCQUFxQkosT0FBT0M7SUFFL0MsYUFBYTtJQUNiLE1BQU1JLFFBQWtCO1FBQ3RCO1FBQ0E7UUFDQTtRQUNBLENBQUMsK0JBQStCLEVBQUVMLE1BQU0sZUFBZSxDQUFDO1dBQ3JERyxXQUFXRyxPQUFPO1FBQ3JCO1FBQ0EsOEJBQThCO1dBQzNCSCxXQUFXSSxHQUFHO1FBQ2pCLDRDQUE0QztXQUN6Q0wsUUFBUU0sR0FBRyxDQUFDLENBQUNDLFFBQVVDLG1CQUFtQkQsT0FBT1Q7UUFDcEQ7UUFDQTtRQUNBO1FBQ0EsQ0FBQywrQkFBK0IsRUFBRUEsTUFBTSxHQUFHLENBQUM7UUFDNUM7S0FDRDtJQUNELE9BQU87UUFDTEE7UUFDQVcsTUFBTTtRQUNOQyxPQUFPLENBQUMsUUFBUSxFQUFFWixPQUFPO1FBQ3pCYSxXQUFXakIsV0FBV1MsTUFBTVMsSUFBSSxDQUFDLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRWQsTUFBTSxHQUFHLENBQUM7SUFDbkY7QUFDRjtBQUVBOzs7Q0FHQyxHQUNELFNBQVNJLHFCQUFxQkosS0FBYSxFQUFF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
@@ -1 +1 @@
1
- {"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,EACV,eAAe,EAGf,YAAY,EAEb,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,cAAM,2BAA2B;IAC/B;;;;;OAKG;IACG,qBAAqB,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAyHzF;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACG,SAAS,CACb,SAAS,EAAE,IAAI,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAsFhD;;;OAGG;YACW,mBAAmB;IAwBjC;;OAEG;IACH,gBAAgB,CACd,QAAQ,EAAE,QAAQ,GACjB,IAAI,CACL,eAAe,EACf,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,CACxE;CA+FF;AAED,eAAO,MAAM,sBAAsB,6BAAoC,CAAC"}
1
+ {"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,EACV,eAAe,EAGf,YAAY,EAEb,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,cAAM,2BAA2B;IAC/B;;;;;OAKG;IACG,qBAAqB,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAyHzF;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACG,SAAS,CACb,SAAS,EAAE,IAAI,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAqHhD;;;OAGG;YACW,mBAAmB;IAwBjC;;OAEG;IACH,gBAAgB,CACd,QAAQ,EAAE,QAAQ,GACjB,IAAI,CACL,eAAe,EACf,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,CACxE;CA+FF;AAED,eAAO,MAAM,sBAAsB,6BAAoC,CAAC"}