sonamu 0.8.13 → 0.8.14

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 (96) hide show
  1. package/dist/api/sonamu.d.ts.map +1 -1
  2. package/dist/api/sonamu.js +2 -3
  3. package/dist/auth/auth-generator.d.ts +8 -0
  4. package/dist/auth/auth-generator.d.ts.map +1 -1
  5. package/dist/auth/auth-generator.js +33 -1
  6. package/dist/auth/better-auth-entities.d.ts.map +1 -1
  7. package/dist/auth/better-auth-entities.js +12 -2
  8. package/dist/bin/cli.js +18 -3
  9. package/dist/cone/cone-generator.js +10 -4
  10. package/dist/database/knex.d.ts.map +1 -1
  11. package/dist/database/knex.js +64 -2
  12. package/dist/database/puri.d.ts +9 -1
  13. package/dist/database/puri.d.ts.map +1 -1
  14. package/dist/database/puri.js +42 -1
  15. package/dist/database/puri.types.d.ts +2 -0
  16. package/dist/database/puri.types.d.ts.map +1 -1
  17. package/dist/database/puri.types.js +6 -2
  18. package/dist/entity/entity-manager.d.ts +149 -1
  19. package/dist/entity/entity-manager.d.ts.map +1 -1
  20. package/dist/entity/entity-manager.js +68 -4
  21. package/dist/migration/__tests__/code-generation.search-text.test.js +435 -0
  22. package/dist/migration/code-generation.d.ts.map +1 -1
  23. package/dist/migration/code-generation.js +696 -32
  24. package/dist/migration/migration-set.js +3 -1
  25. package/dist/migration/postgresql-schema-reader.d.ts +16 -2
  26. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  27. package/dist/migration/postgresql-schema-reader.js +281 -7
  28. package/dist/stream/sse.js +5 -3
  29. package/dist/template/__tests__/generated.template.search-text.test.js +99 -0
  30. package/dist/template/generated.template.test-d.js +24 -0
  31. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  32. package/dist/template/implementations/generated.template.js +2 -2
  33. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  34. package/dist/template/implementations/init_types.template.js +11 -3
  35. package/dist/template/zod-converter.d.ts.map +1 -1
  36. package/dist/template/zod-converter.js +6 -2
  37. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  38. package/dist/testing/dev-test-routes.js +5 -3
  39. package/dist/testing/fixture-generator.d.ts +13 -0
  40. package/dist/testing/fixture-generator.d.ts.map +1 -1
  41. package/dist/testing/fixture-generator.js +105 -8
  42. package/dist/testing/fixture-manager.d.ts.map +1 -1
  43. package/dist/testing/fixture-manager.js +19 -2
  44. package/dist/types/__tests__/entity-json-schema-search-text.test.js +256 -0
  45. package/dist/types/types.d.ts +494 -1
  46. package/dist/types/types.d.ts.map +1 -1
  47. package/dist/types/types.js +117 -13
  48. package/dist/ui/api.d.ts.map +1 -1
  49. package/dist/ui/api.js +14 -2
  50. package/dist/ui/cdd-service.d.ts +16 -14
  51. package/dist/ui/cdd-service.d.ts.map +1 -1
  52. package/dist/ui/cdd-service.js +145 -37
  53. package/dist/ui/cdd-types.d.ts +60 -0
  54. package/dist/ui/cdd-types.d.ts.map +1 -0
  55. package/dist/ui/cdd-types.js +3 -0
  56. package/dist/ui-web/assets/index-D4XFBV-f.css +1 -0
  57. package/dist/ui-web/assets/{index-CQ_S40bD.js → index-D_19-Pi4.js} +87 -87
  58. package/dist/ui-web/index.html +2 -2
  59. package/package.json +7 -3
  60. package/src/api/sonamu.ts +1 -2
  61. package/src/auth/auth-generator.ts +38 -0
  62. package/src/auth/better-auth-entities.ts +18 -1
  63. package/src/bin/cli.ts +15 -1
  64. package/src/cone/cone-generator.ts +9 -3
  65. package/src/database/knex.ts +62 -4
  66. package/src/database/puri.ts +71 -0
  67. package/src/database/puri.types.ts +2 -0
  68. package/src/entity/entity-manager.ts +95 -3
  69. package/src/migration/__tests__/code-generation.search-text.test.ts +390 -0
  70. package/src/migration/code-generation.ts +848 -34
  71. package/src/migration/migration-set.ts +2 -0
  72. package/src/migration/postgresql-schema-reader.ts +366 -9
  73. package/src/skills/sonamu/auth-migration.md +80 -0
  74. package/src/skills/sonamu/cdd.md +148 -28
  75. package/src/skills/sonamu/cone.md +16 -0
  76. package/src/skills/sonamu/entity-relations.md +1 -1
  77. package/src/skills/sonamu/fixture-cli.md +4 -0
  78. package/src/skills/sonamu/frontend.md +65 -0
  79. package/src/skills/sonamu/migration.md +3 -1
  80. package/src/skills/sonamu/model.md +28 -0
  81. package/src/skills/sonamu/workflow.md +12 -5
  82. package/src/stream/sse.ts +4 -2
  83. package/src/template/__tests__/generated.template.search-text.test.ts +89 -0
  84. package/src/template/generated.template.test-d.ts +46 -0
  85. package/src/template/implementations/generated.template.ts +4 -1
  86. package/src/template/implementations/init_types.template.ts +20 -5
  87. package/src/template/zod-converter.ts +5 -0
  88. package/src/testing/dev-test-routes.ts +4 -2
  89. package/src/testing/fixture-generator.ts +157 -9
  90. package/src/testing/fixture-manager.ts +15 -1
  91. package/src/types/__tests__/entity-json-schema-search-text.test.ts +179 -0
  92. package/src/types/types.ts +168 -12
  93. package/src/ui/api.ts +24 -1
  94. package/src/ui/cdd-service.ts +195 -55
  95. package/src/ui/cdd-types.ts +73 -0
  96. package/dist/ui-web/assets/index-egkMxKos.css +0 -1
@@ -1,11 +1,10 @@
1
1
  import { spawn } from "child_process";
2
- import crypto from "crypto";
3
2
  import fs from "fs";
4
3
  import os from "os";
5
4
  import path from "path";
6
5
  import { Sonamu } from "../api/sonamu.js";
7
6
  /** contract/ 디렉터리 절대 경로 반환 (apiRootPath 기준) */ function getContractDir() {
8
- return path.join(Sonamu.apiRootPath, "contract");
7
+ return path.join(Sonamu.apiRootPath, "..", "..", "contract");
9
8
  }
10
9
  /** 경로가 contract/ 디렉터리 내부인지 검증 */ function assertInsideContractDir(filePath) {
11
10
  const contractDir = getContractDir();
@@ -63,12 +62,14 @@ import { Sonamu } from "../api/sonamu.js";
63
62
  tree
64
63
  };
65
64
  }
66
- /** content 필드를 string으로 변환 (string[] string 모두 지원) */ function contentToString(content) {
67
- if (Array.isArray(content)) return content.join("\n");
68
- if (typeof content === "string") return content;
69
- return "";
65
+ /** schema ID로 schema 파일을 찾아 반환 */ function resolveSchema(schemaId) {
66
+ const contractDir = getContractDir();
67
+ const schemaPath = path.join(contractDir, "schemas", `${schemaId}.schema.json`);
68
+ if (!fs.existsSync(schemaPath)) return null;
69
+ const raw = fs.readFileSync(schemaPath, "utf-8");
70
+ return JSON.parse(raw);
70
71
  }
71
- /** JSON 파일의 전체 내용을 읽어 반환 (content는 string으로 변환) */ export function readContent(filePath) {
72
+ /** JSON 파일의 전체 내용을 읽어 schema와 함께 envelope로 반환 */ export function readContent(filePath) {
72
73
  assertInsideContractDir(filePath);
73
74
  const contractDir = getContractDir();
74
75
  const absPath = path.resolve(contractDir, filePath);
@@ -76,13 +77,17 @@ import { Sonamu } from "../api/sonamu.js";
76
77
  throw new Error(`파일을 찾을 수 없습니다: ${filePath}`);
77
78
  }
78
79
  const raw = fs.readFileSync(absPath, "utf-8");
79
- const json = JSON.parse(raw);
80
+ const document = JSON.parse(raw);
81
+ const fileType = detectFileType(path.basename(filePath));
82
+ const schemaId = typeof document.schema === "string" ? document.schema : null;
83
+ const schema = schemaId ? resolveSchema(schemaId) : null;
80
84
  return {
81
- ...json,
82
- content: contentToString(json.content)
85
+ document,
86
+ schema,
87
+ fileType: fileType ?? "contract"
83
88
  };
84
89
  }
85
- /** JSON 파일의 content 필드를 외부 에디터로 편집 */ export async function editContent(filePath) {
90
+ /** JSON 파일을 외부 에디터로 직접 편집 */ export async function editContent(filePath) {
86
91
  assertInsideContractDir(filePath);
87
92
  const contractDir = getContractDir();
88
93
  const absPath = path.resolve(contractDir, filePath);
@@ -90,31 +95,11 @@ import { Sonamu } from "../api/sonamu.js";
90
95
  throw new Error(`파일을 찾을 수 없습니다: ${filePath}`);
91
96
  }
92
97
  const editor = resolveEditorCli();
93
- const raw = fs.readFileSync(absPath, "utf-8");
94
- const json = JSON.parse(raw);
95
- const content = contentToString(json.content);
96
- const tmpFileName = `cdd-edit-${crypto.randomUUID()}.md`;
97
- const tmpFilePath = path.join(os.tmpdir(), tmpFileName);
98
- fs.writeFileSync(tmpFilePath, content, "utf-8");
99
- try {
100
- await runEditor(editor, tmpFilePath);
101
- const edited = fs.readFileSync(tmpFilePath, "utf-8");
102
- json.content = edited.split("\n");
103
- const today = new Date();
104
- const yyyy = today.getFullYear();
105
- const mm = String(today.getMonth() + 1).padStart(2, "0");
106
- const dd = String(today.getDate()).padStart(2, "0");
107
- json.lastModified = `${yyyy}-${mm}-${dd}`;
108
- fs.writeFileSync(absPath, `${JSON.stringify(json, null, 2)}\n`, "utf-8");
109
- return {
110
- success: true,
111
- filePath
112
- };
113
- } finally{
114
- if (fs.existsSync(tmpFilePath)) {
115
- fs.unlinkSync(tmpFilePath);
116
- }
117
- }
98
+ await runEditor(editor, absPath);
99
+ return {
100
+ success: true,
101
+ filePath
102
+ };
118
103
  }
119
104
  /** 에디터별 앱 번들 내 CLI 경로 + --wait 플래그 매핑 */ const EDITOR_CLI_MAP = {
120
105
  "Visual Studio Code": {
@@ -176,6 +161,129 @@ import { Sonamu } from "../api/sonamu.js";
176
161
  });
177
162
  });
178
163
  }
164
+ /* ========================================================================
165
+ * Schema 관리 API
166
+ * ======================================================================== */ /** contract/schemas/ 디렉터리 내 .schema.json 파일 경로 목록 반환 */ function scanSchemaFiles() {
167
+ const schemasDir = path.join(getContractDir(), "schemas");
168
+ if (!fs.existsSync(schemasDir)) return [];
169
+ return fs.readdirSync(schemasDir, {
170
+ withFileTypes: true
171
+ }).filter((e)=>e.isFile() && e.name.endsWith(".schema.json")).map((e)=>({
172
+ absPath: path.join(schemasDir, e.name),
173
+ relPath: `schemas/${e.name}`,
174
+ fileName: e.name
175
+ }));
176
+ }
177
+ /** 특정 schemaId를 참조하는 contract/spec 문서들을 재귀 수집 */ function collectSchemaReferences(schemaId, dirPath, relativeTo) {
178
+ if (!fs.existsSync(dirPath)) return [];
179
+ const refs = [];
180
+ const entries = fs.readdirSync(dirPath, {
181
+ withFileTypes: true
182
+ });
183
+ for (const entry of entries){
184
+ const fullPath = path.join(dirPath, entry.name);
185
+ if (entry.isDirectory()) {
186
+ if (entry.name === "schemas") continue;
187
+ refs.push(...collectSchemaReferences(schemaId, fullPath, relativeTo));
188
+ } else if (entry.isFile()) {
189
+ const fileType = detectFileType(entry.name);
190
+ if (!fileType) continue;
191
+ try {
192
+ const raw = fs.readFileSync(fullPath, "utf-8");
193
+ const doc = JSON.parse(raw);
194
+ if (doc.schema === schemaId) {
195
+ refs.push({
196
+ path: path.relative(relativeTo, fullPath),
197
+ fileType,
198
+ name: entry.name
199
+ });
200
+ }
201
+ } catch {
202
+ // JSON 파싱 실패 시 무시
203
+ }
204
+ }
205
+ }
206
+ return refs;
207
+ }
208
+ /** schema 파일명에서 기대되는 id 추출 */ function expectedSchemaId(fileName) {
209
+ return fileName.replace(/\.schema\.json$/, "");
210
+ }
211
+ /** schemas/ 하위 경로가 contract/schemas/ 내부인지 검증 */ function assertInsideSchemaDir(schemaKey) {
212
+ const schemasDir = path.join(getContractDir(), "schemas");
213
+ const resolved = path.resolve(schemasDir, `${schemaKey}.schema.json`);
214
+ if (!resolved.startsWith(schemasDir + path.sep) && resolved !== schemasDir) {
215
+ throw new Error(`유효하지 않은 스키마 키입니다: ${schemaKey}`);
216
+ }
217
+ }
218
+ /** schema 목록 반환 */ export function listSchemas() {
219
+ const contractDir = getContractDir();
220
+ const files = scanSchemaFiles();
221
+ const schemas = [];
222
+ for (const file of files){
223
+ const key = expectedSchemaId(file.fileName);
224
+ try {
225
+ const raw = fs.readFileSync(file.absPath, "utf-8");
226
+ const schema = JSON.parse(raw);
227
+ const refs = collectSchemaReferences(schema.id, contractDir, contractDir);
228
+ schemas.push({
229
+ key,
230
+ id: schema.id,
231
+ path: file.relPath,
232
+ type: schema.type,
233
+ fieldCount: schema.fields.length,
234
+ referenceCount: refs.length,
235
+ hasIdMismatch: schema.id !== key
236
+ });
237
+ } catch (err) {
238
+ schemas.push({
239
+ key,
240
+ id: key,
241
+ path: file.relPath,
242
+ type: "contract",
243
+ fieldCount: 0,
244
+ referenceCount: 0,
245
+ hasIdMismatch: false,
246
+ parseError: err instanceof Error ? err.message : String(err)
247
+ });
248
+ }
249
+ }
250
+ return {
251
+ schemas
252
+ };
253
+ }
254
+ /** schema 상세 반환 (파일명 기반 key로 조회) */ export function readSchema(schemaKey) {
255
+ assertInsideSchemaDir(schemaKey);
256
+ const contractDir = getContractDir();
257
+ const absPath = path.join(contractDir, "schemas", `${schemaKey}.schema.json`);
258
+ if (!fs.existsSync(absPath)) {
259
+ throw new Error(`스키마를 찾을 수 없습니다: ${schemaKey}`);
260
+ }
261
+ const raw = fs.readFileSync(absPath, "utf-8");
262
+ const schema = JSON.parse(raw);
263
+ const relPath = path.relative(contractDir, absPath);
264
+ const references = collectSchemaReferences(schema.id, contractDir, contractDir);
265
+ return {
266
+ key: schemaKey,
267
+ path: relPath,
268
+ schema,
269
+ references,
270
+ hasIdMismatch: schema.id !== schemaKey
271
+ };
272
+ }
273
+ /** schema 파일을 외부 에디터로 편집 (파일명 기반 key로 조회) */ export async function editSchema(schemaKey) {
274
+ assertInsideSchemaDir(schemaKey);
275
+ const contractDir = getContractDir();
276
+ const absPath = path.join(contractDir, "schemas", `${schemaKey}.schema.json`);
277
+ if (!fs.existsSync(absPath)) {
278
+ throw new Error(`스키마를 찾을 수 없습니다: ${schemaKey}`);
279
+ }
280
+ const editor = resolveEditorCli();
281
+ await runEditor(editor, absPath);
282
+ return {
283
+ success: true,
284
+ schemaKey
285
+ };
286
+ }
179
287
  /** 소스 파일을 외부 에디터로 열기 (대기하지 않음) */ export function openSourceFile(filePath) {
180
288
  const absPath = path.isAbsolute(filePath) ? filePath : path.resolve(Sonamu.apiRootPath, filePath);
181
289
  if (!fs.existsSync(absPath)) {
@@ -194,4 +302,4 @@ import { Sonamu } from "../api/sonamu.js";
194
302
  child.unref();
195
303
  }
196
304
 
197
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9jZGQtc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuXG5leHBvcnQgdHlwZSBDZGRGaWxlVHlwZSA9IFwiY29udHJhY3RcIiB8IFwic3BlY1wiO1xuXG5leHBvcnQgdHlwZSBDZGRUcmVlTm9kZSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogY29udHJhY3QvIOq4sOykgCDsg4HrjIAg6rK966GcICovXG4gIHBhdGg6IHN0cmluZztcbiAgdHlwZTogXCJmaWxlXCIgfCBcImRpcmVjdG9yeVwiO1xuICAvKiogZmlsZeyduCDqsr3smrDrp4wg7KG07J6sICovXG4gIGZpbGVUeXBlPzogQ2RkRmlsZVR5cGU7XG4gIC8qKiBkaXJlY3Rvcnnsnbgg6rK97Jqw66eMIOyhtOyerCAqL1xuICBjaGlsZHJlbj86IENkZFRyZWVOb2RlW107XG59O1xuXG4vKiogY29udHJhY3QvIOuUlOugie2EsOumrCDsoIjrjIAg6rK966GcIOuwmO2ZmCAoYXBpUm9vdFBhdGgg6riw7KSAKSAqL1xuZnVuY3Rpb24gZ2V0Q29udHJhY3REaXIoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwiY29udHJhY3RcIik7XG59XG5cbi8qKiDqsr3roZzqsIAgY29udHJhY3QvIOuUlOugie2EsOumrCDrgrTrtoDsnbjsp4Ag6rKA7KadICovXG5mdW5jdGlvbiBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZXNvbHZlZC5zdGFydHNXaXRoKGNvbnRyYWN0RGlyICsgcGF0aC5zZXApICYmIHJlc29sdmVkICE9PSBjb250cmFjdERpcikge1xuICAgIHRocm93IG5ldyBFcnJvcihg6rK966Gc6rCAIGNvbnRyYWN0LyDrlJTroInthLDrpqwg67CW7J2EIOywuOyhsO2VqeuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxufVxuXG4vKiog7YyM7J2866qF7JeQ7IScIENkZEZpbGVUeXBlIO2MkOuzhCAqL1xuZnVuY3Rpb24gZGV0ZWN0RmlsZVR5cGUoZmlsZU5hbWU6IHN0cmluZyk6IENkZEZpbGVUeXBlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKFwiLmNvbnRyYWN0Lmpzb25cIikpIHJldHVybiBcImNvbnRyYWN0XCI7XG4gIGlmIChmaWxlTmFtZS5lbmRzV2l0aChcIi5zcGVjLmpzb25cIikpIHJldHVybiBcInNwZWNcIjtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIOuUlOugie2EsOumrOulvCDsnqzqt4Ag7YOQ7IOJ7ZWY7JesIENkZFRyZWVOb2RlIO2KuOumrOulvCDsg53shLEgKi9cbmZ1bmN0aW9uIHNjYW5EaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nLCByZWxhdGl2ZVRvOiBzdHJpbmcpOiBDZGRUcmVlTm9kZVtdIHtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgbm9kZXM6IENkZFRyZWVOb2RlW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZShyZWxhdGl2ZVRvLCBmdWxsUGF0aCk7XG5cbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzY2FuRGlyZWN0b3J5KGZ1bGxQYXRoLCByZWxhdGl2ZVRvKTtcbiAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICB0eXBlOiBcImRpcmVjdG9yeVwiLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnN0IGZpbGVUeXBlID0gZGV0ZWN0RmlsZVR5cGUoZW50cnkubmFtZSk7XG4gICAgICBpZiAoZmlsZVR5cGUpIHtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgIGZpbGVUeXBlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZXM7XG59XG5cbi8qKiBjb250cmFjdC8g65SU66CJ7YSw66as7J2YIO2KuOumrCDqtazsobDrpbwg67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2RkVHJlZSgpOiB7IGV4aXN0czogYm9vbGVhbjsgdHJlZTogQ2RkVHJlZU5vZGVbXSB9IHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29udHJhY3REaXIpKSB7XG4gICAgcmV0dXJuIHsgZXhpc3RzOiBmYWxzZSwgdHJlZTogW10gfTtcbiAgfVxuICBjb25zdCB0cmVlID0gc2NhbkRpcmVjdG9yeShjb250cmFjdERpciwgY29udHJhY3REaXIpO1xuICByZXR1cm4geyBleGlzdHM6IHRydWUsIHRyZWUgfTtcbn1cblxuLyoqIGNvbnRlbnQg7ZWE65Oc66W8IHN0cmluZ+ycvOuhnCDrs4DtmZggKHN0cmluZ1tdIOuwjyBzdHJpbmcg66qo65GQIOyngOybkCkgKi9cbmZ1bmN0aW9uIGNvbnRlbnRUb1N0cmluZyhjb250ZW50OiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29udGVudCkpIHJldHVybiBjb250ZW50LmpvaW4oXCJcXG5cIik7XG4gIGlmICh0eXBlb2YgY29udGVudCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGNvbnRlbnQ7XG4gIHJldHVybiBcIlwiO1xufVxuXG4vKiogSlNPTiDtjIzsnbzsnZgg7KCE7LK0IOuCtOyaqeydhCDsnb3slrQg67CY7ZmYIChjb250ZW5064qUIHN0cmluZ+ycvOuhnCDrs4DtmZgpICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgYXNzZXJ0SW5zaWRlQ29udHJhY3REaXIoZmlsZVBhdGgpO1xuXG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgYWJzUGF0aCA9IHBhdGgucmVzb2x2ZShjb250cmFjdERpciwgZmlsZVBhdGgpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKHJhdykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiB7IC4uLmpzb24sIGNvbnRlbnQ6IGNvbnRlbnRUb1N0cmluZyhqc29uLmNvbnRlbnQpIH07XG59XG5cbi8qKiBKU09OIO2MjOydvOydmCBjb250ZW50IO2VhOuTnOulvCDsmbjrtoAg7JeQ65SU7YSw66GcIO2OuOynkSAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRDb250ZW50KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGZpbGVQYXRoOiBzdHJpbmcgfT4ge1xuICBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aCk7XG5cbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBlZGl0b3IgPSByZXNvbHZlRWRpdG9yQ2xpKCk7XG5cbiAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IGpzb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gSlNPTi5wYXJzZShyYXcpO1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBjb250ZW50VG9TdHJpbmcoanNvbi5jb250ZW50KTtcblxuICBjb25zdCB0bXBGaWxlTmFtZSA9IGBjZGQtZWRpdC0ke2NyeXB0by5yYW5kb21VVUlEKCl9Lm1kYDtcbiAgY29uc3QgdG1wRmlsZVBhdGggPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksIHRtcEZpbGVOYW1lKTtcblxuICBmcy53cml0ZUZpbGVTeW5jKHRtcEZpbGVQYXRoLCBjb250ZW50LCBcInV0Zi04XCIpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgcnVuRWRpdG9yKGVkaXRvciwgdG1wRmlsZVBhdGgpO1xuXG4gICAgY29uc3QgZWRpdGVkID0gZnMucmVhZEZpbGVTeW5jKHRtcEZpbGVQYXRoLCBcInV0Zi04XCIpO1xuICAgIGpzb24uY29udGVudCA9IGVkaXRlZC5zcGxpdChcIlxcblwiKTtcblxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB5eXl5ID0gdG9kYXkuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBtbSA9IFN0cmluZyh0b2RheS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgXCIwXCIpO1xuICAgIGNvbnN0IGRkID0gU3RyaW5nKHRvZGF5LmdldERhdGUoKSkucGFkU3RhcnQoMiwgXCIwXCIpO1xuICAgIGpzb24ubGFzdE1vZGlmaWVkID0gYCR7eXl5eX0tJHttbX0tJHtkZH1gO1xuXG4gICAgZnMud3JpdGVGaWxlU3luYyhhYnNQYXRoLCBgJHtKU09OLnN0cmluZ2lmeShqc29uLCBudWxsLCAyKX1cXG5gLCBcInV0Zi04XCIpO1xuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZmlsZVBhdGggfTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh0bXBGaWxlUGF0aCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmModG1wRmlsZVBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vKiog7JeQ65SU7YSw67OEIOyVsSDrsojrk6Qg64K0IENMSSDqsr3roZwgKyAtLXdhaXQg7ZSM656Y6re4IOunpO2VkSAqL1xuY29uc3QgRURJVE9SX0NMSV9NQVA6IFJlY29yZDxzdHJpbmcsIHsgY2xpOiBzdHJpbmc7IHdhaXRGbGFnOiBzdHJpbmcgfT4gPSB7XG4gIFwiVmlzdWFsIFN0dWRpbyBDb2RlXCI6IHsgY2xpOiBcIkNvbnRlbnRzL1Jlc291cmNlcy9hcHAvYmluL2NvZGVcIiwgd2FpdEZsYWc6IFwiLS13YWl0XCIgfSxcbiAgWmVkOiB7IGNsaTogXCJDb250ZW50cy9NYWNPUy9jbGlcIiwgd2FpdEZsYWc6IFwiLS13YWl0XCIgfSxcbiAgQ3Vyc29yOiB7IGNsaTogXCJDb250ZW50cy9SZXNvdXJjZXMvYXBwL2Jpbi9jdXJzb3JcIiwgd2FpdEZsYWc6IFwiLS13YWl0XCIgfSxcbn07XG5cbi8qKiDslbEg67KI65OkIENMSSDqsr3roZzrpbwgcmVzb2x2ZS4gd2FpdD1mYWxzZeydtOuptCAtLXdhaXQg7ZSM656Y6re466W8IOyDneuetSAqL1xuZnVuY3Rpb24gcmVzb2x2ZUVkaXRvckNsaShvcHRpb25zPzogeyB3YWl0PzogYm9vbGVhbiB9KTogeyBiaW46IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IHdhaXQgPSBvcHRpb25zPy53YWl0ID8/IHRydWU7XG4gIGNvbnN0IGFwcE5hbWUgPSBTb25hbXUuY29uZmlnLmV4dGVybmFsRWRpdG9yID8/IFwiVmlzdWFsIFN0dWRpbyBDb2RlXCI7XG4gIGNvbnN0IG1hcHBpbmcgPSBFRElUT1JfQ0xJX01BUFthcHBOYW1lXTtcbiAgaWYgKCFtYXBwaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYOyngOybkOuQmOyngCDslYrripQg7JeQ65SU7YSw7J6F64uI64ukOiAke2FwcE5hbWV9ICjsp4Dsm5A6ICR7T2JqZWN0LmtleXMoRURJVE9SX0NMSV9NQVApLmpvaW4oXCIsIFwiKX0pYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgc2VhcmNoUGF0aHMgPSBbXG4gICAgYC9BcHBsaWNhdGlvbnMvJHthcHBOYW1lfS5hcHBgLFxuICAgIGAke29zLmhvbWVkaXIoKX0vQXBwbGljYXRpb25zLyR7YXBwTmFtZX0uYXBwYCxcbiAgXTtcbiAgY29uc3QgYnVuZGxlUGF0aCA9IHNlYXJjaFBhdGhzLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICBpZiAoIWJ1bmRsZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyVsSDrsojrk6TsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7YXBwTmFtZX0gKC9BcHBsaWNhdGlvbnMg7ZmV7J24KWApO1xuICB9XG5cbiAgY29uc3QgY2xpQmluID0gcGF0aC5qb2luKGJ1bmRsZVBhdGgsIG1hcHBpbmcuY2xpKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNsaUJpbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyXkOuUlO2EsCBDTEnrpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7Y2xpQmlufWApO1xuICB9XG5cbiAgcmV0dXJuIHsgYmluOiBjbGlCaW4sIGFyZ3M6IHdhaXQgPyBbbWFwcGluZy53YWl0RmxhZ10gOiBbXSB9O1xufVxuXG4vKiog7JeQ65SU7YSwIENMSeulvCDsi6TtlontlZjqs6Ag7YOt7J20IOuLq+2ekCDrlYzquYzsp4Ag64yA6riwICovXG5mdW5jdGlvbiBydW5FZGl0b3IoZWRpdG9yOiB7IGJpbjogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXSB9LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihlZGl0b3IuYmluLCBbLi4uZWRpdG9yLmFyZ3MsIGZpbGVQYXRoXSwge1xuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgIH0pO1xuXG4gICAgY2hpbGQub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICByZWplY3QobmV3IEVycm9yKGDsl5DrlJTthLAg7Iuk7ZaJIOyLpO2MqCAoJHtlZGl0b3IuYmlufSk6ICR7ZXJyLm1lc3NhZ2V9YCkpO1xuICAgIH0pO1xuXG4gICAgY2hpbGQub24oXCJjbG9zZVwiLCAoY29kZSkgPT4ge1xuICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihg7JeQ65SU7YSw6rCAIOu5hOygleyDgSDsooXro4zrkJjsl4jsirXri4jri6QgKGV4aXQgY29kZTogJHtjb2RlfSlgKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKiog7IaM7IqkIO2MjOydvOydhCDsmbjrtoAg7JeQ65SU7YSw66GcIOyXtOq4sCAo64yA6riw7ZWY7KeAIOyViuydjCkgKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVuU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpID8gZmlsZVBhdGggOiBwYXRoLnJlc29sdmUoU29uYW11LmFwaVJvb3RQYXRoLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBlZGl0b3IgPSByZXNvbHZlRWRpdG9yQ2xpKHsgd2FpdDogZmFsc2UgfSk7XG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oZWRpdG9yLmJpbiwgWy4uLmVkaXRvci5hcmdzLCBhYnNQYXRoXSwge1xuICAgIHN0ZGlvOiBcImlnbm9yZVwiLFxuICAgIGRldGFjaGVkOiB0cnVlLFxuICB9KTtcbiAgY2hpbGQudW5yZWYoKTtcbn1cbiJdLCJuYW1lcyI6WyJzcGF3biIsImNyeXB0byIsImZzIiwib3MiLCJwYXRoIiwiU29uYW11IiwiZ2V0Q29udHJhY3REaXIiLCJqb2luIiwiYXBpUm9vdFBhdGgiLCJhc3NlcnRJbnNpZGVDb250cmFjdERpciIsImZpbGVQYXRoIiwiY29udHJhY3REaXIiLCJyZXNvbHZlZCIsInJlc29sdmUiLCJzdGFydHNXaXRoIiwic2VwIiwiRXJyb3IiLCJkZXRlY3RGaWxlVHlwZSIsImZpbGVOYW1lIiwiZW5kc1dpdGgiLCJ1bmRlZmluZWQiLCJzY2FuRGlyZWN0b3J5IiwiZGlyUGF0aCIsInJlbGF0aXZlVG8iLCJlbnRyaWVzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwibm9kZXMiLCJlbnRyeSIsImZ1bGxQYXRoIiwibmFtZSIsInJlbFBhdGgiLCJyZWxhdGl2ZSIsImlzRGlyZWN0b3J5IiwiY2hpbGRyZW4iLCJwdXNoIiwidHlwZSIsImlzRmlsZSIsImZpbGVUeXBlIiwiZ2V0Q2RkVHJlZSIsImV4aXN0c1N5bmMiLCJleGlzdHMiLCJ0cmVlIiwiY29udGVudFRvU3RyaW5nIiwiY29udGVudCIsIkFycmF5IiwiaXNBcnJheSIsInJlYWRDb250ZW50IiwiYWJzUGF0aCIsInJhdyIsInJlYWRGaWxlU3luYyIsImpzb24iLCJKU09OIiwicGFyc2UiLCJlZGl0Q29udGVudCIsImVkaXRvciIsInJlc29sdmVFZGl0b3JDbGkiLCJ0bXBGaWxlTmFtZSIsInJhbmRvbVVVSUQiLCJ0bXBGaWxlUGF0aCIsInRtcGRpciIsIndyaXRlRmlsZVN5bmMiLCJydW5FZGl0b3IiLCJlZGl0ZWQiLCJzcGxpdCIsInRvZGF5IiwiRGF0ZSIsInl5eXkiLCJnZXRGdWxsWWVhciIsIm1tIiwiU3RyaW5nIiwiZ2V0TW9udGgiLCJwYWRTdGFydCIsImRkIiwiZ2V0RGF0ZSIsImxhc3RNb2RpZmllZCIsInN0cmluZ2lmeSIsInN1Y2Nlc3MiLCJ1bmxpbmtTeW5jIiwiRURJVE9SX0NMSV9NQVAiLCJjbGkiLCJ3YWl0RmxhZyIsIlplZCIsIkN1cnNvciIsIm9wdGlvbnMiLCJ3YWl0IiwiYXBwTmFtZSIsImNvbmZpZyIsImV4dGVybmFsRWRpdG9yIiwibWFwcGluZyIsIk9iamVjdCIsImtleXMiLCJzZWFyY2hQYXRocyIsImhvbWVkaXIiLCJidW5kbGVQYXRoIiwiZmluZCIsInAiLCJjbGlCaW4iLCJiaW4iLCJhcmdzIiwiUHJvbWlzZSIsInJlamVjdCIsImNoaWxkIiwic3RkaW8iLCJvbiIsImVyciIsIm1lc3NhZ2UiLCJjb2RlIiwib3BlblNvdXJjZUZpbGUiLCJpc0Fic29sdXRlIiwiZGV0YWNoZWQiLCJ1bnJlZiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsS0FBSyxRQUFRLGdCQUFnQjtBQUN0QyxPQUFPQyxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsUUFBUSxLQUFLO0FBQ3BCLE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxVQUFVLE9BQU87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
305
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9jZGQtc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ2RkQ29udGVudEVudmVsb3BlLFxuICBDZGRGaWxlVHlwZSxcbiAgQ2RkU2NoZW1hLFxuICBDZGRTY2hlbWFEZXRhaWxFbnZlbG9wZSxcbiAgQ2RkU2NoZW1hUmVmZXJlbmNlLFxuICBDZGRTY2hlbWFTdW1tYXJ5LFxuICBDZGRUcmVlTm9kZSxcbn0gZnJvbSBcIi4vY2RkLXR5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIHtcbiAgQ2RkQ29udGVudEVudmVsb3BlLFxuICBDZGRGaWxlVHlwZSxcbiAgQ2RkU2NoZW1hLFxuICBDZGRTY2hlbWFEZXRhaWxFbnZlbG9wZSxcbiAgQ2RkU2NoZW1hRmllbGQsXG4gIENkZFNjaGVtYUZpZWxkVHlwZSxcbiAgQ2RkU2NoZW1hUmVmZXJlbmNlLFxuICBDZGRTY2hlbWFTdW1tYXJ5LFxuICBDZGRUcmVlTm9kZSxcbn0gZnJvbSBcIi4vY2RkLXR5cGVzXCI7XG5cbi8qKiBjb250cmFjdC8g65SU66CJ7YSw66asIOygiOuMgCDqsr3roZwg67CY7ZmYIChhcGlSb290UGF0aCDquLDspIApICovXG5mdW5jdGlvbiBnZXRDb250cmFjdERpcigpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCIuLlwiLCBcIi4uXCIsIFwiY29udHJhY3RcIik7XG59XG5cbi8qKiDqsr3roZzqsIAgY29udHJhY3QvIOuUlOugie2EsOumrCDrgrTrtoDsnbjsp4Ag6rKA7KadICovXG5mdW5jdGlvbiBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZXNvbHZlZC5zdGFydHNXaXRoKGNvbnRyYWN0RGlyICsgcGF0aC5zZXApICYmIHJlc29sdmVkICE9PSBjb250cmFjdERpcikge1xuICAgIHRocm93IG5ldyBFcnJvcihg6rK966Gc6rCAIGNvbnRyYWN0LyDrlJTroInthLDrpqwg67CW7J2EIOywuOyhsO2VqeuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxufVxuXG4vKiog7YyM7J2866qF7JeQ7IScIENkZEZpbGVUeXBlIO2MkOuzhCAqL1xuZnVuY3Rpb24gZGV0ZWN0RmlsZVR5cGUoZmlsZU5hbWU6IHN0cmluZyk6IENkZEZpbGVUeXBlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKFwiLmNvbnRyYWN0Lmpzb25cIikpIHJldHVybiBcImNvbnRyYWN0XCI7XG4gIGlmIChmaWxlTmFtZS5lbmRzV2l0aChcIi5zcGVjLmpzb25cIikpIHJldHVybiBcInNwZWNcIjtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIOuUlOugie2EsOumrOulvCDsnqzqt4Ag7YOQ7IOJ7ZWY7JesIENkZFRyZWVOb2RlIO2KuOumrOulvCDsg53shLEgKi9cbmZ1bmN0aW9uIHNjYW5EaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nLCByZWxhdGl2ZVRvOiBzdHJpbmcpOiBDZGRUcmVlTm9kZVtdIHtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgbm9kZXM6IENkZFRyZWVOb2RlW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZShyZWxhdGl2ZVRvLCBmdWxsUGF0aCk7XG5cbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzY2FuRGlyZWN0b3J5KGZ1bGxQYXRoLCByZWxhdGl2ZVRvKTtcbiAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICB0eXBlOiBcImRpcmVjdG9yeVwiLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnN0IGZpbGVUeXBlID0gZGV0ZWN0RmlsZVR5cGUoZW50cnkubmFtZSk7XG4gICAgICBpZiAoZmlsZVR5cGUpIHtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgIGZpbGVUeXBlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZXM7XG59XG5cbi8qKiBjb250cmFjdC8g65SU66CJ7YSw66as7J2YIO2KuOumrCDqtazsobDrpbwg67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2RkVHJlZSgpOiB7IGV4aXN0czogYm9vbGVhbjsgdHJlZTogQ2RkVHJlZU5vZGVbXSB9IHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29udHJhY3REaXIpKSB7XG4gICAgcmV0dXJuIHsgZXhpc3RzOiBmYWxzZSwgdHJlZTogW10gfTtcbiAgfVxuICBjb25zdCB0cmVlID0gc2NhbkRpcmVjdG9yeShjb250cmFjdERpciwgY29udHJhY3REaXIpO1xuICByZXR1cm4geyBleGlzdHM6IHRydWUsIHRyZWUgfTtcbn1cblxuLyoqIHNjaGVtYSBJROuhnCBzY2hlbWEg7YyM7J287J2EIOywvuyVhCDrsJjtmZggKi9cbmZ1bmN0aW9uIHJlc29sdmVTY2hlbWEoc2NoZW1hSWQ6IHN0cmluZyk6IENkZFNjaGVtYSB8IG51bGwge1xuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IHNjaGVtYVBhdGggPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIFwic2NoZW1hc1wiLCBgJHtzY2hlbWFJZH0uc2NoZW1hLmpzb25gKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNjaGVtYVBhdGgpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKHNjaGVtYVBhdGgsIFwidXRmLThcIik7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgQ2RkU2NoZW1hO1xufVxuXG4vKiogSlNPTiDtjIzsnbzsnZgg7KCE7LK0IOuCtOyaqeydhCDsnb3slrQgc2NoZW1h7JmAIO2VqOq7mCBlbnZlbG9wZeuhnCDrsJjtmZggKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ29udGVudChmaWxlUGF0aDogc3RyaW5nKTogQ2RkQ29udGVudEVudmVsb3BlIHtcbiAgYXNzZXJ0SW5zaWRlQ29udHJhY3REaXIoZmlsZVBhdGgpO1xuXG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgYWJzUGF0aCA9IHBhdGgucmVzb2x2ZShjb250cmFjdERpciwgZmlsZVBhdGgpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IGRvY3VtZW50ID0gSlNPTi5wYXJzZShyYXcpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBmaWxlVHlwZSA9IGRldGVjdEZpbGVUeXBlKHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpKTtcbiAgY29uc3Qgc2NoZW1hSWQgPSB0eXBlb2YgZG9jdW1lbnQuc2NoZW1hID09PSBcInN0cmluZ1wiID8gZG9jdW1lbnQuc2NoZW1hIDogbnVsbDtcbiAgY29uc3Qgc2NoZW1hID0gc2NoZW1hSWQgPyByZXNvbHZlU2NoZW1hKHNjaGVtYUlkKSA6IG51bGw7XG5cbiAgcmV0dXJuIHtcbiAgICBkb2N1bWVudCxcbiAgICBzY2hlbWEsXG4gICAgZmlsZVR5cGU6IGZpbGVUeXBlID8/IFwiY29udHJhY3RcIixcbiAgfTtcbn1cblxuLyoqIEpTT04g7YyM7J287J2EIOyZuOu2gCDsl5DrlJTthLDroZwg7KeB7KCRIO2OuOynkSAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRDb250ZW50KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGZpbGVQYXRoOiBzdHJpbmcgfT4ge1xuICBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aCk7XG5cbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBlZGl0b3IgPSByZXNvbHZlRWRpdG9yQ2xpKCk7XG4gIGF3YWl0IHJ1bkVkaXRvcihlZGl0b3IsIGFic1BhdGgpO1xuXG4gIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGZpbGVQYXRoIH07XG59XG5cbi8qKiDsl5DrlJTthLDrs4Qg7JWxIOuyiOuTpCDrgrQgQ0xJIOqyveuhnCArIC0td2FpdCDtlIzrnpjqt7gg66ek7ZWRICovXG5jb25zdCBFRElUT1JfQ0xJX01BUDogUmVjb3JkPHN0cmluZywgeyBjbGk6IHN0cmluZzsgd2FpdEZsYWc6IHN0cmluZyB9PiA9IHtcbiAgXCJWaXN1YWwgU3R1ZGlvIENvZGVcIjogeyBjbGk6IFwiQ29udGVudHMvUmVzb3VyY2VzL2FwcC9iaW4vY29kZVwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxuICBaZWQ6IHsgY2xpOiBcIkNvbnRlbnRzL01hY09TL2NsaVwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxuICBDdXJzb3I6IHsgY2xpOiBcIkNvbnRlbnRzL1Jlc291cmNlcy9hcHAvYmluL2N1cnNvclwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxufTtcblxuLyoqIOyVsSDrsojrk6QgQ0xJIOqyveuhnOulvCByZXNvbHZlLiB3YWl0PWZhbHNl7J2066m0IC0td2FpdCDtlIzrnpjqt7jrpbwg7IOd6561ICovXG5mdW5jdGlvbiByZXNvbHZlRWRpdG9yQ2xpKG9wdGlvbnM/OiB7IHdhaXQ/OiBib29sZWFuIH0pOiB7IGJpbjogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXSB9IHtcbiAgY29uc3Qgd2FpdCA9IG9wdGlvbnM/LndhaXQgPz8gdHJ1ZTtcbiAgY29uc3QgYXBwTmFtZSA9IFNvbmFtdS5jb25maWcuZXh0ZXJuYWxFZGl0b3IgPz8gXCJWaXN1YWwgU3R1ZGlvIENvZGVcIjtcbiAgY29uc3QgbWFwcGluZyA9IEVESVRPUl9DTElfTUFQW2FwcE5hbWVdO1xuICBpZiAoIW1hcHBpbmcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBg7KeA7JuQ65CY7KeAIOyViuuKlCDsl5DrlJTthLDsnoXri4jri6Q6ICR7YXBwTmFtZX0gKOyngOybkDogJHtPYmplY3Qua2V5cyhFRElUT1JfQ0xJX01BUCkuam9pbihcIiwgXCIpfSlgLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzZWFyY2hQYXRocyA9IFtcbiAgICBgL0FwcGxpY2F0aW9ucy8ke2FwcE5hbWV9LmFwcGAsXG4gICAgYCR7b3MuaG9tZWRpcigpfS9BcHBsaWNhdGlvbnMvJHthcHBOYW1lfS5hcHBgLFxuICBdO1xuICBjb25zdCBidW5kbGVQYXRoID0gc2VhcmNoUGF0aHMuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gIGlmICghYnVuZGxlUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7JWxIOuyiOuTpOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHthcHBOYW1lfSAoL0FwcGxpY2F0aW9ucyDtmZXsnbgpYCk7XG4gIH1cblxuICBjb25zdCBjbGlCaW4gPSBwYXRoLmpvaW4oYnVuZGxlUGF0aCwgbWFwcGluZy5jbGkpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xpQmluKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7JeQ65SU7YSwIENMSeulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtjbGlCaW59YCk7XG4gIH1cblxuICByZXR1cm4geyBiaW46IGNsaUJpbiwgYXJnczogd2FpdCA/IFttYXBwaW5nLndhaXRGbGFnXSA6IFtdIH07XG59XG5cbi8qKiDsl5DrlJTthLAgQ0xJ66W8IOyLpO2Wie2VmOqzoCDtg63snbQg64ur7Z6QIOuVjOq5jOyngCDrjIDquLAgKi9cbmZ1bmN0aW9uIHJ1bkVkaXRvcihlZGl0b3I6IHsgYmluOiBzdHJpbmc7IGFyZ3M6IHN0cmluZ1tdIH0sIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGVkaXRvci5iaW4sIFsuLi5lZGl0b3IuYXJncywgZmlsZVBhdGhdLCB7XG4gICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoYOyXkOuUlO2EsCDsi6Ttlokg7Iuk7YyoICgke2VkaXRvci5iaW59KTogJHtlcnIubWVzc2FnZX1gKSk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImNsb3NlXCIsIChjb2RlKSA9PiB7XG4gICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGDsl5DrlJTthLDqsIAg67mE7KCV7IOBIOyiheujjOuQmOyXiOyKteuLiOuLpCAoZXhpdCBjb2RlOiAke2NvZGV9KWApKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2NoZW1hIOq0gOumrCBBUElcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiogY29udHJhY3Qvc2NoZW1hcy8g65SU66CJ7YSw66asIOuCtCAuc2NoZW1hLmpzb24g7YyM7J28IOqyveuhnCDrqqnroZ0g67CY7ZmYICovXG5mdW5jdGlvbiBzY2FuU2NoZW1hRmlsZXMoKTogeyBhYnNQYXRoOiBzdHJpbmc7IHJlbFBhdGg6IHN0cmluZzsgZmlsZU5hbWU6IHN0cmluZyB9W10ge1xuICBjb25zdCBzY2hlbWFzRGlyID0gcGF0aC5qb2luKGdldENvbnRyYWN0RGlyKCksIFwic2NoZW1hc1wiKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNjaGVtYXNEaXIpKSByZXR1cm4gW107XG5cbiAgcmV0dXJuIGZzXG4gICAgLnJlYWRkaXJTeW5jKHNjaGVtYXNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgIC5maWx0ZXIoKGUpID0+IGUuaXNGaWxlKCkgJiYgZS5uYW1lLmVuZHNXaXRoKFwiLnNjaGVtYS5qc29uXCIpKVxuICAgIC5tYXAoKGUpID0+ICh7XG4gICAgICBhYnNQYXRoOiBwYXRoLmpvaW4oc2NoZW1hc0RpciwgZS5uYW1lKSxcbiAgICAgIHJlbFBhdGg6IGBzY2hlbWFzLyR7ZS5uYW1lfWAsXG4gICAgICBmaWxlTmFtZTogZS5uYW1lLFxuICAgIH0pKTtcbn1cblxuLyoqIO2KueyglSBzY2hlbWFJZOulvCDssLjsobDtlZjripQgY29udHJhY3Qvc3BlYyDrrLjshJzrk6TsnYQg7J6s6reAIOyImOynkSAqL1xuZnVuY3Rpb24gY29sbGVjdFNjaGVtYVJlZmVyZW5jZXMoXG4gIHNjaGVtYUlkOiBzdHJpbmcsXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcmVsYXRpdmVUbzogc3RyaW5nLFxuKTogQ2RkU2NoZW1hUmVmZXJlbmNlW10ge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHJldHVybiBbXTtcbiAgY29uc3QgcmVmczogQ2RkU2NoZW1hUmVmZXJlbmNlW10gPSBbXTtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09IFwic2NoZW1hc1wiKSBjb250aW51ZTtcbiAgICAgIHJlZnMucHVzaCguLi5jb2xsZWN0U2NoZW1hUmVmZXJlbmNlcyhzY2hlbWFJZCwgZnVsbFBhdGgsIHJlbGF0aXZlVG8pKTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpKSB7XG4gICAgICBjb25zdCBmaWxlVHlwZSA9IGRldGVjdEZpbGVUeXBlKGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKCFmaWxlVHlwZSkgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsIFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IGRvYyA9IEpTT04ucGFyc2UocmF3KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgaWYgKGRvYy5zY2hlbWEgPT09IHNjaGVtYUlkKSB7XG4gICAgICAgICAgcmVmcy5wdXNoKHtcbiAgICAgICAgICAgIHBhdGg6IHBhdGgucmVsYXRpdmUocmVsYXRpdmVUbywgZnVsbFBhdGgpLFxuICAgICAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSlNPTiDtjIzsi7Eg7Iuk7YyoIOyLnCDrrLTsi5xcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlZnM7XG59XG5cbi8qKiBzY2hlbWEg7YyM7J2866qF7JeQ7IScIOq4sOuMgOuQmOuKlCBpZCDstpTstpwgKi9cbmZ1bmN0aW9uIGV4cGVjdGVkU2NoZW1hSWQoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBmaWxlTmFtZS5yZXBsYWNlKC9cXC5zY2hlbWFcXC5qc29uJC8sIFwiXCIpO1xufVxuXG4vKiogc2NoZW1hcy8g7ZWY7JyEIOqyveuhnOqwgCBjb250cmFjdC9zY2hlbWFzLyDrgrTrtoDsnbjsp4Ag6rKA7KadICovXG5mdW5jdGlvbiBhc3NlcnRJbnNpZGVTY2hlbWFEaXIoc2NoZW1hS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgc2NoZW1hc0RpciA9IHBhdGguam9pbihnZXRDb250cmFjdERpcigpLCBcInNjaGVtYXNcIik7XG4gIGNvbnN0IHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKHNjaGVtYXNEaXIsIGAke3NjaGVtYUtleX0uc2NoZW1hLmpzb25gKTtcbiAgaWYgKCFyZXNvbHZlZC5zdGFydHNXaXRoKHNjaGVtYXNEaXIgKyBwYXRoLnNlcCkgJiYgcmVzb2x2ZWQgIT09IHNjaGVtYXNEaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOycoO2aqO2VmOyngCDslYrsnYAg7Iqk7YKk66eIIO2CpOyeheuLiOuLpDogJHtzY2hlbWFLZXl9YCk7XG4gIH1cbn1cblxuLyoqIHNjaGVtYSDrqqnroZ0g67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFNjaGVtYXMoKTogeyBzY2hlbWFzOiBDZGRTY2hlbWFTdW1tYXJ5W10gfSB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgZmlsZXMgPSBzY2FuU2NoZW1hRmlsZXMoKTtcbiAgY29uc3Qgc2NoZW1hczogQ2RkU2NoZW1hU3VtbWFyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3Qga2V5ID0gZXhwZWN0ZWRTY2hlbWFJZChmaWxlLmZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUuYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IEpTT04ucGFyc2UocmF3KSBhcyBDZGRTY2hlbWE7XG4gICAgICBjb25zdCByZWZzID0gY29sbGVjdFNjaGVtYVJlZmVyZW5jZXMoc2NoZW1hLmlkLCBjb250cmFjdERpciwgY29udHJhY3REaXIpO1xuICAgICAgc2NoZW1hcy5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBpZDogc2NoZW1hLmlkLFxuICAgICAgICBwYXRoOiBmaWxlLnJlbFBhdGgsXG4gICAgICAgIHR5cGU6IHNjaGVtYS50eXBlLFxuICAgICAgICBmaWVsZENvdW50OiBzY2hlbWEuZmllbGRzLmxlbmd0aCxcbiAgICAgICAgcmVmZXJlbmNlQ291bnQ6IHJlZnMubGVuZ3RoLFxuICAgICAgICBoYXNJZE1pc21hdGNoOiBzY2hlbWEuaWQgIT09IGtleSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2NoZW1hcy5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBpZDoga2V5LFxuICAgICAgICBwYXRoOiBmaWxlLnJlbFBhdGgsXG4gICAgICAgIHR5cGU6IFwiY29udHJhY3RcIixcbiAgICAgICAgZmllbGRDb3VudDogMCxcbiAgICAgICAgcmVmZXJlbmNlQ291bnQ6IDAsXG4gICAgICAgIGhhc0lkTWlzbWF0Y2g6IGZhbHNlLFxuICAgICAgICBwYXJzZUVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBzY2hlbWFzIH07XG59XG5cbi8qKiBzY2hlbWEg7IOB7IS4IOuwmO2ZmCAo7YyM7J2866qFIOq4sOuwmCBrZXnroZwg7KGw7ZqMKSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRTY2hlbWEoc2NoZW1hS2V5OiBzdHJpbmcpOiBDZGRTY2hlbWFEZXRhaWxFbnZlbG9wZSB7XG4gIGFzc2VydEluc2lkZVNjaGVtYURpcihzY2hlbWFLZXkpO1xuXG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbihjb250cmFjdERpciwgXCJzY2hlbWFzXCIsIGAke3NjaGVtYUtleX0uc2NoZW1hLmpzb25gKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyKpO2CpOuniOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtzY2hlbWFLZXl9YCk7XG4gIH1cblxuICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgY29uc3Qgc2NoZW1hID0gSlNPTi5wYXJzZShyYXcpIGFzIENkZFNjaGVtYTtcbiAgY29uc3QgcmVsUGF0aCA9IHBhdGgucmVsYXRpdmUoY29udHJhY3REaXIsIGFic1BhdGgpO1xuICBjb25zdCByZWZlcmVuY2VzID0gY29sbGVjdFNjaGVtYVJlZmVyZW5jZXMoc2NoZW1hLmlkLCBjb250cmFjdERpciwgY29udHJhY3REaXIpO1xuXG4gIHJldHVybiB7XG4gICAga2V5OiBzY2hlbWFLZXksXG4gICAgcGF0aDogcmVsUGF0aCxcbiAgICBzY2hlbWEsXG4gICAgcmVmZXJlbmNlcyxcbiAgICBoYXNJZE1pc21hdGNoOiBzY2hlbWEuaWQgIT09IHNjaGVtYUtleSxcbiAgfTtcbn1cblxuLyoqIHNjaGVtYSDtjIzsnbzsnYQg7Jm467aAIOyXkOuUlO2EsOuhnCDtjrjsp5EgKO2MjOydvOuqhSDquLDrsJgga2V566GcIOyhsO2ajCkgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0U2NoZW1hKFxuICBzY2hlbWFLZXk6IHN0cmluZyxcbik6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBzY2hlbWFLZXk6IHN0cmluZyB9PiB7XG4gIGFzc2VydEluc2lkZVNjaGVtYURpcihzY2hlbWFLZXkpO1xuXG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbihjb250cmFjdERpciwgXCJzY2hlbWFzXCIsIGAke3NjaGVtYUtleX0uc2NoZW1hLmpzb25gKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyKpO2CpOuniOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtzY2hlbWFLZXl9YCk7XG4gIH1cblxuICBjb25zdCBlZGl0b3IgPSByZXNvbHZlRWRpdG9yQ2xpKCk7XG4gIGF3YWl0IHJ1bkVkaXRvcihlZGl0b3IsIGFic1BhdGgpO1xuXG4gIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHNjaGVtYUtleSB9O1xufVxuXG4vKiog7IaM7IqkIO2MjOydvOydhCDsmbjrtoAg7JeQ65SU7YSw66GcIOyXtOq4sCAo64yA6riw7ZWY7KeAIOyViuydjCkgKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVuU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpID8gZmlsZVBhdGggOiBwYXRoLnJlc29sdmUoU29uYW11LmFwaVJvb3RQYXRoLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBlZGl0b3IgPSByZXNvbHZlRWRpdG9yQ2xpKHsgd2FpdDogZmFsc2UgfSk7XG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oZWRpdG9yLmJpbiwgWy4uLmVkaXRvci5hcmdzLCBhYnNQYXRoXSwge1xuICAgIHN0ZGlvOiBcImlnbm9yZVwiLFxuICAgIGRldGFjaGVkOiB0cnVlLFxuICB9KTtcbiAgY2hpbGQudW5yZWYoKTtcbn1cbiJdLCJuYW1lcyI6WyJzcGF3biIsImZzIiwib3MiLCJwYXRoIiwiU29uYW11IiwiZ2V0Q29udHJhY3REaXIiLCJqb2luIiwiYXBpUm9vdFBhdGgiLCJhc3NlcnRJbnNpZGVDb250cmFjdERpciIsImZpbGVQYXRoIiwiY29udHJhY3REaXIiLCJyZXNvbHZlZCIsInJlc29sdmUiLCJzdGFydHNXaXRoIiwic2VwIiwiRXJyb3IiLCJkZXRlY3RGaWxlVHlwZSIsImZpbGVOYW1lIiwiZW5kc1dpdGgiLCJ1bmRlZmluZWQiLCJzY2FuRGlyZWN0b3J5IiwiZGlyUGF0aCIsInJlbGF0aXZlVG8iLCJlbnRyaWVzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwibm9kZXMiLCJlbnRyeSIsImZ1bGxQYXRoIiwibmFtZSIsInJlbFBhdGgiLCJyZWxhdGl2ZSIsImlzRGlyZWN0b3J5IiwiY2hpbGRyZW4iLCJwdXNoIiwidHlwZSIsImlzRmlsZSIsImZpbGVUeXBlIiwiZ2V0Q2RkVHJlZSIsImV4aXN0c1N5bmMiLCJleGlzdHMiLCJ0cmVlIiwicmVzb2x2ZVNjaGVtYSIsInNjaGVtYUlkIiwic2NoZW1hUGF0aCIsInJhdyIsInJlYWRGaWxlU3luYyIsIkpTT04iLCJwYXJzZSIsInJlYWRDb250ZW50IiwiYWJzUGF0aCIsImRvY3VtZW50IiwiYmFzZW5hbWUiLCJzY2hlbWEiLCJlZGl0Q29udGVudCIsImVkaXRvciIsInJlc29sdmVFZGl0b3JDbGkiLCJydW5FZGl0b3IiLCJzdWNjZXNzIiwiRURJVE9SX0NMSV9NQVAiLCJjbGkiLCJ3YWl0RmxhZyIsIlplZCIsIkN1cnNvciIsIm9wdGlvbnMiLCJ3YWl0IiwiYXBwTmFtZSIsImNvbmZpZyIsImV4dGVybmFsRWRpdG9yIiwibWFwcGluZyIsIk9iamVjdCIsImtleXMiLCJzZWFyY2hQYXRocyIsImhvbWVkaXIiLCJidW5kbGVQYXRoIiwiZmluZCIsInAiLCJjbGlCaW4iLCJiaW4iLCJhcmdzIiwiUHJvbWlzZSIsInJlamVjdCIsImNoaWxkIiwic3RkaW8iLCJvbiIsImVyciIsIm1lc3NhZ2UiLCJjb2RlIiwic2NhblNjaGVtYUZpbGVzIiwic2NoZW1hc0RpciIsImZpbHRlciIsImUiLCJtYXAiLCJjb2xsZWN0U2NoZW1hUmVmZXJlbmNlcyIsInJlZnMiLCJkb2MiLCJleHBlY3RlZFNjaGVtYUlkIiwicmVwbGFjZSIsImFzc2VydEluc2lkZVNjaGVtYURpciIsInNjaGVtYUtleSIsImxpc3RTY2hlbWFzIiwiZmlsZXMiLCJzY2hlbWFzIiwiZmlsZSIsImtleSIsImlkIiwiZmllbGRDb3VudCIsImZpZWxkcyIsImxlbmd0aCIsInJlZmVyZW5jZUNvdW50IiwiaGFzSWRNaXNtYXRjaCIsInBhcnNlRXJyb3IiLCJTdHJpbmciLCJyZWFkU2NoZW1hIiwicmVmZXJlbmNlcyIsImVkaXRTY2hlbWEiLCJvcGVuU291cmNlRmlsZSIsImlzQWJzb2x1dGUiLCJkZXRh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
@@ -0,0 +1,60 @@
1
+ export type CddFileType = "contract" | "spec";
2
+ export type CddSchemaFieldType = "string" | "string[]" | "Record<string, string>" | "Record<string, object>";
3
+ export type CddSchemaField = {
4
+ name: string;
5
+ label?: string;
6
+ type: CddSchemaFieldType;
7
+ renderer?: string;
8
+ required: boolean;
9
+ };
10
+ export type CddSchema = {
11
+ id: string;
12
+ type: "contract" | "spec";
13
+ fields: CddSchemaField[];
14
+ };
15
+ export type CddContentEnvelope = {
16
+ document: Record<string, unknown>;
17
+ schema: CddSchema | null;
18
+ fileType: CddFileType;
19
+ };
20
+ export type CddTreeNode = {
21
+ name: string;
22
+ path: string;
23
+ type: "file" | "directory";
24
+ fileType?: CddFileType;
25
+ children?: CddTreeNode[];
26
+ };
27
+ export type CddSchemaSummary = {
28
+ key: string;
29
+ id: string;
30
+ path: string;
31
+ type: "contract" | "spec";
32
+ fieldCount: number;
33
+ referenceCount: number;
34
+ hasIdMismatch: boolean;
35
+ parseError?: string;
36
+ };
37
+ export type CddSchemaReference = {
38
+ path: string;
39
+ fileType: CddFileType;
40
+ name: string;
41
+ };
42
+ export type CddSchemaDetailEnvelope = {
43
+ key: string;
44
+ path: string;
45
+ schema: CddSchema;
46
+ references: CddSchemaReference[];
47
+ hasIdMismatch: boolean;
48
+ };
49
+ /** Acceptance Criterion 테스트 참조 */
50
+ export type AcceptanceCriterionTestRef = {
51
+ target: string;
52
+ pattern: string;
53
+ };
54
+ /** 구조화된 Acceptance Criterion */
55
+ export type AcceptanceCriterion = {
56
+ id: string;
57
+ condition: string;
58
+ testRef: AcceptanceCriterionTestRef;
59
+ };
60
+ //# sourceMappingURL=cdd-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdd-types.d.ts","sourceRoot":"","sources":["../../src/ui/cdd-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC;AAE9C,MAAM,MAAM,kBAAkB,GAC1B,QAAQ,GACR,UAAU,GACV,wBAAwB,GACxB,wBAAwB,CAAC;AAE7B,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1B,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,WAAW,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,kCAAkC;AAClC,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,gCAAgC;AAChC,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,0BAA0B,CAAC;CACrC,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** 구조화된 Acceptance Criterion */ export { };
2
+
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9jZGQtdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ2RkRmlsZVR5cGUgPSBcImNvbnRyYWN0XCIgfCBcInNwZWNcIjtcblxuZXhwb3J0IHR5cGUgQ2RkU2NoZW1hRmllbGRUeXBlID1cbiAgfCBcInN0cmluZ1wiXG4gIHwgXCJzdHJpbmdbXVwiXG4gIHwgXCJSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XCJcbiAgfCBcIlJlY29yZDxzdHJpbmcsIG9iamVjdD5cIjtcblxuZXhwb3J0IHR5cGUgQ2RkU2NoZW1hRmllbGQgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHR5cGU6IENkZFNjaGVtYUZpZWxkVHlwZTtcbiAgcmVuZGVyZXI/OiBzdHJpbmc7XG4gIHJlcXVpcmVkOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQ2RkU2NoZW1hID0ge1xuICBpZDogc3RyaW5nO1xuICB0eXBlOiBcImNvbnRyYWN0XCIgfCBcInNwZWNcIjtcbiAgZmllbGRzOiBDZGRTY2hlbWFGaWVsZFtdO1xufTtcblxuZXhwb3J0IHR5cGUgQ2RkQ29udGVudEVudmVsb3BlID0ge1xuICBkb2N1bWVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHNjaGVtYTogQ2RkU2NoZW1hIHwgbnVsbDtcbiAgZmlsZVR5cGU6IENkZEZpbGVUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQ2RkVHJlZU5vZGUgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICB0eXBlOiBcImZpbGVcIiB8IFwiZGlyZWN0b3J5XCI7XG4gIGZpbGVUeXBlPzogQ2RkRmlsZVR5cGU7XG4gIGNoaWxkcmVuPzogQ2RkVHJlZU5vZGVbXTtcbn07XG5cbmV4cG9ydCB0eXBlIENkZFNjaGVtYVN1bW1hcnkgPSB7XG4gIGtleTogc3RyaW5nO1xuICBpZDogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHR5cGU6IFwiY29udHJhY3RcIiB8IFwic3BlY1wiO1xuICBmaWVsZENvdW50OiBudW1iZXI7XG4gIHJlZmVyZW5jZUNvdW50OiBudW1iZXI7XG4gIGhhc0lkTWlzbWF0Y2g6IGJvb2xlYW47XG4gIHBhcnNlRXJyb3I/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDZGRTY2hlbWFSZWZlcmVuY2UgPSB7XG4gIHBhdGg6IHN0cmluZztcbiAgZmlsZVR5cGU6IENkZEZpbGVUeXBlO1xuICBuYW1lOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDZGRTY2hlbWFEZXRhaWxFbnZlbG9wZSA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc2NoZW1hOiBDZGRTY2hlbWE7XG4gIHJlZmVyZW5jZXM6IENkZFNjaGVtYVJlZmVyZW5jZVtdO1xuICBoYXNJZE1pc21hdGNoOiBib29sZWFuO1xufTtcblxuLyoqIEFjY2VwdGFuY2UgQ3JpdGVyaW9uIO2FjOyKpO2KuCDssLjsobAgKi9cbmV4cG9ydCB0eXBlIEFjY2VwdGFuY2VDcml0ZXJpb25UZXN0UmVmID0ge1xuICB0YXJnZXQ6IHN0cmluZztcbiAgcGF0dGVybjogc3RyaW5nO1xufTtcblxuLyoqIOq1rOyhsO2ZlOuQnCBBY2NlcHRhbmNlIENyaXRlcmlvbiAqL1xuZXhwb3J0IHR5cGUgQWNjZXB0YW5jZUNyaXRlcmlvbiA9IHtcbiAgaWQ6IHN0cmluZztcbiAgY29uZGl0aW9uOiBzdHJpbmc7XG4gIHRlc3RSZWY6IEFjY2VwdGFuY2VDcml0ZXJpb25UZXN0UmVmO1xufTtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFtRUEsOEJBQThCLEdBQzlCLFdBSUUifQ==