sonamu 0.7.4 → 0.7.5
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.
- package/dist/api/config.d.ts +1 -4
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/sonamu.d.ts +2 -0
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +19 -47
- package/dist/bin/cli.js +6 -6
- package/dist/database/base-model.d.ts +1 -1
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +15 -4
- package/dist/database/code-generator.d.ts.map +1 -1
- package/dist/database/code-generator.js +3 -3
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +1 -1
- package/dist/database/puri-wrapper.d.ts +11 -11
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri-wrapper.js +7 -11
- package/dist/database/puri.d.ts +36 -17
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +54 -7
- package/dist/database/puri.types.d.ts +54 -17
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +2 -4
- package/dist/database/puri.types.test-d.js +129 -0
- package/dist/database/upsert-builder.d.ts +16 -10
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +10 -19
- package/dist/entity/entity-manager.d.ts +113 -22
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +1 -1
- package/dist/entity/entity.d.ts +34 -0
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +110 -37
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +341 -149
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +21 -5
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +7 -1
- package/dist/migration/postgresql-schema-reader.d.ts +11 -1
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +111 -10
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +4 -3
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +12 -2
- package/dist/template/implementations/generated_sso.template.d.ts +3 -3
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +50 -2
- package/dist/template/implementations/model.template.js +6 -6
- package/dist/template/implementations/model_test.template.js +4 -4
- package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
- package/dist/template/implementations/view_enums_select.template.js +2 -2
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +12 -9
- package/dist/template/implementations/view_id_async_select.template.js +4 -4
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +12 -9
- package/dist/template/implementations/view_search_input.template.js +2 -2
- package/dist/template/template.js +2 -2
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +17 -2
- package/dist/testing/fixture-manager.d.ts +2 -1
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +29 -29
- package/dist/types/types.d.ts +593 -68
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +113 -9
- package/dist/vector/chunking.d.ts +25 -0
- package/dist/vector/chunking.d.ts.map +1 -0
- package/dist/vector/chunking.js +97 -0
- package/dist/vector/config.d.ts +12 -0
- package/dist/vector/config.d.ts.map +1 -0
- package/dist/vector/config.js +83 -0
- package/dist/vector/embedding.d.ts +42 -0
- package/dist/vector/embedding.d.ts.map +1 -0
- package/dist/vector/embedding.js +147 -0
- package/dist/vector/types.d.ts +105 -0
- package/dist/vector/types.d.ts.map +1 -0
- package/dist/vector/types.js +5 -0
- package/dist/vector/vector-search.d.ts +47 -0
- package/dist/vector/vector-search.d.ts.map +1 -0
- package/dist/vector/vector-search.js +176 -0
- package/package.json +9 -8
- package/src/api/config.ts +0 -4
- package/src/api/sonamu.ts +21 -36
- package/src/bin/cli.ts +5 -5
- package/src/database/base-model.ts +20 -11
- package/src/database/code-generator.ts +6 -2
- package/src/database/db.ts +1 -0
- package/src/database/puri-wrapper.ts +22 -16
- package/src/database/puri.ts +150 -27
- package/src/database/puri.types.test-d.ts +457 -0
- package/src/database/puri.types.ts +231 -33
- package/src/database/upsert-builder.ts +43 -34
- package/src/entity/entity-manager.ts +2 -2
- package/src/entity/entity.ts +134 -44
- package/src/index.ts +6 -0
- package/src/migration/code-generation.ts +377 -174
- package/src/migration/migration-set.ts +22 -3
- package/src/migration/migrator.ts +6 -0
- package/src/migration/postgresql-schema-reader.ts +121 -21
- package/src/syncer/syncer.ts +3 -2
- package/src/template/implementations/generated.template.ts +51 -9
- package/src/template/implementations/generated_sso.template.ts +71 -2
- package/src/template/implementations/model.template.ts +5 -5
- package/src/template/implementations/model_test.template.ts +3 -3
- package/src/template/implementations/view_enums_dropdown.template.ts +1 -1
- package/src/template/implementations/view_enums_select.template.ts +1 -1
- package/src/template/implementations/view_form.template.ts +11 -8
- package/src/template/implementations/view_id_async_select.template.ts +3 -3
- package/src/template/implementations/view_list.template.ts +11 -8
- package/src/template/implementations/view_search_input.template.ts +1 -1
- package/src/template/template.ts +1 -1
- package/src/template/zod-converter.ts +20 -0
- package/src/testing/fixture-manager.ts +31 -30
- package/src/types/types.ts +226 -48
- package/src/vector/chunking.ts +115 -0
- package/src/vector/config.ts +68 -0
- package/src/vector/embedding.ts +193 -0
- package/src/vector/types.ts +122 -0
- package/src/vector/vector-search.ts +261 -0
- package/dist/template/implementations/view_enums_buttonset.template.d.ts +0 -17
- package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +0 -1
- package/dist/template/implementations/view_enums_buttonset.template.js +0 -31
- package/dist/template/implementations/view_list_columns.template.d.ts +0 -17
- package/dist/template/implementations/view_list_columns.template.d.ts.map +0 -1
- package/dist/template/implementations/view_list_columns.template.js +0 -49
- package/src/template/implementations/view_enums_buttonset.template.ts +0 -34
- package/src/template/implementations/view_list_columns.template.ts +0 -53
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration-set.d.ts","sourceRoot":"","sources":["../../src/migration/migration-set.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,
|
|
1
|
+
{"version":3,"file":"migration-set.d.ts","sourceRoot":"","sources":["../../src/migration/migration-set.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAiBL,KAAK,wBAAwB,EAC9B,MAAM,gBAAgB,CAAC;AAGxB;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,CA2JlF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import inflection from "inflection";
|
|
2
2
|
import { EntityManager } from "../entity/entity-manager.js";
|
|
3
|
-
import { isBelongsToOneRelationProp, isHasManyRelationProp, isManyToManyRelationProp, isNumberProp, isNumericProp, isOneToOneRelationProp, isRelationProp, isStringProp, isVirtualProp } from "../types/types.js";
|
|
3
|
+
import { isBelongsToOneRelationProp, isHasManyRelationProp, isManyToManyRelationProp, isNumberProp, isNumericProp, isOneToOneRelationProp, isRelationProp, isStringProp, isVectorProp, isVirtualProp } from "../types/types.js";
|
|
4
4
|
import { exhaustive } from "../utils/utils.js";
|
|
5
5
|
/**
|
|
6
6
|
* Entity를 읽어서 MigrationSetAndJoinTable을 만들어옵니다.
|
|
@@ -39,6 +39,14 @@ import { exhaustive } from "../utils/utils.js";
|
|
|
39
39
|
precision: prop.precision,
|
|
40
40
|
scale: prop.scale,
|
|
41
41
|
numberType: isNumberProp(prop) ? prop.numberType ?? "numeric" : "numeric"
|
|
42
|
+
},
|
|
43
|
+
// Vector 타입의 경우 dimensions 추가
|
|
44
|
+
...isVectorProp(prop) && {
|
|
45
|
+
dimensions: prop.dimensions
|
|
46
|
+
},
|
|
47
|
+
// Generated Column 정보 추가
|
|
48
|
+
...prop.generated && {
|
|
49
|
+
generated: prop.generated
|
|
42
50
|
}
|
|
43
51
|
};
|
|
44
52
|
r.columns.push(column);
|
|
@@ -67,9 +75,13 @@ import { exhaustive } from "../utils/utils.js";
|
|
|
67
75
|
table: through.from.split(".")[0],
|
|
68
76
|
indexes: [
|
|
69
77
|
// 조인 테이블에 걸린 인덱스 찾아와서 연결
|
|
70
|
-
...entity.indexes.filter((index)=>index.columns.find((col)=>col.includes(`${prop.joinTable}.`))).map((index)=>({
|
|
78
|
+
...entity.indexes.filter((index)=>index.columns.find((col)=>col.name.includes(`${prop.joinTable}.`))).map((index)=>({
|
|
71
79
|
...index,
|
|
72
|
-
columns: index.columns.map((col)=>
|
|
80
|
+
columns: index.columns.map((col)=>({
|
|
81
|
+
name: col.name.replace(`${prop.joinTable}.`, ""),
|
|
82
|
+
nullsFirst: col.nullsFirst,
|
|
83
|
+
sortOrder: col.sortOrder
|
|
84
|
+
}))
|
|
73
85
|
}))
|
|
74
86
|
],
|
|
75
87
|
columns: [
|
|
@@ -135,7 +147,7 @@ import { exhaustive } from "../utils/utils.js";
|
|
|
135
147
|
joinTables: []
|
|
136
148
|
});
|
|
137
149
|
// indexes
|
|
138
|
-
migrationSet.indexes = entity.indexes.filter((index)=>index.columns.find((col)=>col.includes(".") === false));
|
|
150
|
+
migrationSet.indexes = entity.indexes.filter((index)=>index.columns.find((col)=>col.name.includes(".") === false));
|
|
139
151
|
return migrationSet;
|
|
140
152
|
}
|
|
141
153
|
function resolveEntityPropTypeToMigrationColumnType(prop) {
|
|
@@ -181,10 +193,14 @@ function resolveEntityPropTypeToMigrationColumnType(prop) {
|
|
|
181
193
|
return "uuid[]";
|
|
182
194
|
case "json":
|
|
183
195
|
return "json";
|
|
196
|
+
case "vector":
|
|
197
|
+
return "vector";
|
|
198
|
+
case "vector[]":
|
|
199
|
+
return "vector[]";
|
|
184
200
|
default:
|
|
185
201
|
exhaustive(prop);
|
|
186
202
|
throw new Error(`Unknown entity prop type: ${prop.type}`);
|
|
187
203
|
}
|
|
188
204
|
}
|
|
189
205
|
|
|
190
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vbWlncmF0aW9uLXNldC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc051bWJlclByb3AsXG4gIGlzTnVtZXJpY1Byb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1N0cmluZ1Byb3AsXG4gIGlzVmlydHVhbFByb3AsXG4gIHR5cGUgTWlncmF0aW9uQ29sdW1uLFxuICB0eXBlIE1pZ3JhdGlvbkNvbHVtblR5cGUsXG4gIHR5cGUgTWlncmF0aW9uRm9yZWlnbixcbiAgdHlwZSBNaWdyYXRpb25JbmRleCxcbiAgdHlwZSBNaWdyYXRpb25Kb2luVGFibGUsXG4gIHR5cGUgTWlncmF0aW9uU2V0QW5kSm9pblRhYmxlLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4aGF1c3RpdmUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxuLyoqXG4gKiBFbnRpdHnrpbwg7J297Ja07IScIE1pZ3JhdGlvblNldEFuZEpvaW5UYWJsZeydhCDrp4zrk6TslrTsmLXri4jri6QuXG4gKiBAcGFyYW0gZW50aXR5IEVudGl0eSDqsJ3ssrRcbiAqIEByZXR1cm5zIE1pZ3JhdGlvblNldEFuZEpvaW5UYWJsZSDqsJ3ssrRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1pZ3JhdGlvblNldEZyb21FbnRpdHkoZW50aXR5OiBFbnRpdHkpOiBNaWdyYXRpb25TZXRBbmRKb2luVGFibGUge1xuICBjb25zdCBtaWdyYXRpb25TZXQ6IE1pZ3JhdGlvblNldEFuZEpvaW5UYWJsZSA9IGVudGl0eS5wcm9wcy5yZWR1Y2UoXG4gICAgKHIsIHByb3ApID0+IHtcbiAgICAgIC8vIHZpcnR1YWwg7ZWE65OcIOygnOyZuFxuICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG4gICAgICAvLyBIYXNNYW55IOy8gOydtOyKpOuKlCDslYTrrLQg7LKY66as64+EIO2VmOyngCDslYrsnYxcbiAgICAgIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG5cbiAgICAgIC8vIOydvOuwmCDsu6zrn7xcbiAgICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0ge1xuICAgICAgICAgIG5hbWU6IHByb3AubmFtZSxcbiAgICAgICAgICB0eXBlOiByZXNvbHZlRW50aXR5UHJvcFR5cGVUb01pZ3JhdGlvbkNvbHVtblR5cGUocHJvcCksXG4gICAgICAgICAgbnVsbGFibGU6IHByb3AubnVsbGFibGUgPT09IHRydWUsXG4gICAgICAgICAgLi4uKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9wLmRiRGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFRvOiBwcm9wLmRiRGVmYXVsdCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICB9KSgpLFxuICAgICAgICAgIC8vIFN0cmluZyDtg4DsnoXsl5AgbGVuZ3RoIOyeiOuKlCDqsr3smrAg7LaU6rCAXG4gICAgICAgICAgLi4uKGlzU3RyaW5nUHJvcChwcm9wKSAmJlxuICAgICAgICAgICAgcHJvcC5sZW5ndGggIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgICAgICAgIGxlbmd0aDogcHJvcC5sZW5ndGgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAvLyBOdW1iZXIvTnVtZXJpYyDtg4DsnoXsnZgg6rK97JqwIHByZWNpc2lvbiwgc2NhbGUg7LaU6rCAXG4gICAgICAgICAgLi4uKChpc051bWJlclByb3AocHJvcCkgfHwgaXNOdW1lcmljUHJvcChwcm9wKSkgJiYge1xuICAgICAgICAgICAgcHJlY2lzaW9uOiBwcm9wLnByZWNpc2lvbixcbiAgICAgICAgICAgIHNjYWxlOiBwcm9wLnNjYWxlLFxuICAgICAgICAgICAgbnVtYmVyVHlwZTogaXNOdW1iZXJQcm9wKHByb3ApID8gKHByb3AubnVtYmVyVHlwZSA/PyBcIm51bWVyaWNcIikgOiBcIm51bWVyaWNcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgfTtcblxuICAgICAgICByLmNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIC8vIE1hbnlUb01hbnkg7LyA7J207IqkXG4gICAgICAgIGNvbnN0IHJlbE1kID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgY29uc3QgdGFibGUxID0gZW50aXR5LnRhYmxlO1xuICAgICAgICBjb25zdCB0YWJsZTIgPSByZWxNZC50YWJsZTtcbiAgICAgICAgY29uc3Qgam9pbiA9IHtcbiAgICAgICAgICBmcm9tOiBgJHtlbnRpdHkudGFibGV9LmlkYCxcbiAgICAgICAgICB0aHJvdWdoOiB7XG4gICAgICAgICAgICBmcm9tOiBgJHtwcm9wLmpvaW5UYWJsZX0uJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRhYmxlMSl9X2lkYCxcbiAgICAgICAgICAgIHRvOiBgJHtwcm9wLmpvaW5UYWJsZX0uJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRhYmxlMil9X2lkYCxcbiAgICAgICAgICAgIG9uVXBkYXRlOiBwcm9wLm9uVXBkYXRlLFxuICAgICAgICAgICAgb25EZWxldGU6IHByb3Aub25EZWxldGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0bzogYCR7cmVsTWQudGFibGV9LmlkYCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdGhyb3VnaCA9IGpvaW4udGhyb3VnaDtcbiAgICAgICAgY29uc3QgZmllbGRzID0gW3Rocm91Z2guZnJvbSwgdGhyb3VnaC50b107XG4gICAgICAgIHIuam9pblRhYmxlcy5wdXNoKHtcbiAgICAgICAgICB0YWJsZTogdGhyb3VnaC5mcm9tLnNwbGl0KFwiLlwiKVswXSxcbiAgICAgICAgICBpbmRleGVzOiBbXG4gICAgICAgICAgICAvLyDsobDsnbgg7YWM7J2067iU7JeQIOqxuOumsCDsnbjrjbHsiqQg7LC+7JWE7JmA7IScIOyXsOqysFxuICAgICAgICAgICAgLi4uZW50aXR5LmluZGV4ZXNcbiAgICAgICAgICAgICAgLmZpbHRlcigoaW5kZXgpID0+IGluZGV4LmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuaW5jbHVkZXMoYCR7cHJvcC5qb2luVGFibGV9LmApKSlcbiAgICAgICAgICAgICAgLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uaW5kZXgsXG4gICAgICAgICAgICAgICAgY29sdW1uczogaW5kZXguY29sdW1ucy5tYXAoKGNvbCkgPT4gY29sLnJlcGxhY2UoYCR7cHJvcC5qb2luVGFibGV9LmAsIFwiXCIpKSxcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgY29sdW1uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uZmllbGRzLm1hcCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBmaWVsZC5zcGxpdChcIi5cIilbMV0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICB9IGFzIE1pZ3JhdGlvbkNvbHVtbjtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZm9yZWlnbnM6IGZpZWxkcy5tYXAoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAvLyDtmITsnqwg7ZWE65Oc6rCAIOyWtOuWpCDthYzsnbTruJTsl5Ag7IaN7ZWY64qU7KeAIO2MkOuLqFxuICAgICAgICAgICAgY29uc3QgY29sID0gZmllbGQuc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgY29uc3QgdG8gPSAoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShqb2luLnRvLnNwbGl0KFwiLlwiKVswXSl9X2lkYCA9PT0gY29sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4udG87XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4uZnJvbTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbHVtbnM6IFtjb2xdLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgICAgb25VcGRhdGU6IHRocm91Z2gub25VcGRhdGUsXG4gICAgICAgICAgICAgIG9uRGVsZXRlOiB0aHJvdWdoLm9uRGVsZXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgKSB7XG4gICAgICAgIC8vIC1PbmVSZWxhdGlvbiDsvIDsnbTsiqRcbiAgICAgICAgY29uc3QgaWRDb2x1bW5OYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG4gICAgICAgIHIuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBpZENvbHVtbk5hbWUsXG4gICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgbnVsbGFibGU6IHByb3AubnVsbGFibGUgPz8gZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKHByb3AudXNlQ29uc3RyYWludCA/PyB0cnVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHIuZm9yZWlnbnMucHVzaCh7XG4gICAgICAgICAgICBjb2x1bW5zOiBbaWRDb2x1bW5OYW1lXSxcbiAgICAgICAgICAgIHRvOiBgJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaW5mbGVjdGlvbi5wbHVyYWxpemUocHJvcC53aXRoKSkudG9Mb3dlckNhc2UoKX0uaWRgLFxuICAgICAgICAgICAgb25VcGRhdGU6IHByb3Aub25VcGRhdGUgPz8gXCJSRVNUUklDVFwiLFxuICAgICAgICAgICAgb25EZWxldGU6IHByb3Aub25EZWxldGUgPz8gXCJSRVNUUklDVFwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAge1xuICAgICAgdGFibGU6IGVudGl0eS50YWJsZSxcbiAgICAgIGNvbHVtbnM6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgICAgaW5kZXhlczogW10gYXMgTWlncmF0aW9uSW5kZXhbXSxcbiAgICAgIGZvcmVpZ25zOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBqb2luVGFibGVzOiBbXSBhcyBNaWdyYXRpb25Kb2luVGFibGVbXSxcbiAgICB9LFxuICApO1xuXG4gIC8vIGluZGV4ZXNcbiAgbWlncmF0aW9uU2V0LmluZGV4ZXMgPSBlbnRpdHkuaW5kZXhlcy5maWx0ZXIoKGluZGV4KSA9PlxuICAgIGluZGV4LmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuaW5jbHVkZXMoXCIuXCIpID09PSBmYWxzZSksXG4gICk7XG5cbiAgcmV0dXJuIG1pZ3JhdGlvblNldDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUVudGl0eVByb3BUeXBlVG9NaWdyYXRpb25Db2x1bW5UeXBlKHByb3A6IEVudGl0eVByb3ApOiBNaWdyYXRpb25Db2x1bW5UeXBlIHtcbiAgaWYgKHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiIHx8IHByb3AudHlwZSA9PT0gXCJ2aXJ0dWFsXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVzb2x2ZWQgY29sdW1uIHR5cGU6ICR7cHJvcC50eXBlfWApO1xuICB9XG5cbiAgc3dpdGNoIChwcm9wLnR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIFwic3RyaW5nW11cIjpcbiAgICAgIHJldHVybiBcInN0cmluZ1tdXCI7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIGNhc2UgXCJlbnVtW11cIjpcbiAgICAgIHJldHVybiBcInN0cmluZ1tdXCI7XG4gICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgIHJldHVybiBcImludGVnZXJcIjtcbiAgICBjYXNlIFwiaW50ZWdlcltdXCI6XG4gICAgICByZXR1cm4gXCJpbnRlZ2VyW11cIjtcbiAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgcmV0dXJuIFwiYmlnSW50ZWdlclwiO1xuICAgIGNhc2UgXCJiaWdJbnRlZ2VyW11cIjpcbiAgICAgIHJldHVybiBcImJpZ0ludGVnZXJbXVwiO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiBcIm51bWJlck9yTnVtZXJpY1wiO1xuICAgIGNhc2UgXCJudW1iZXJbXVwiOlxuICAgICAgcmV0dXJuIFwibnVtYmVyT3JOdW1lcmljW11cIjtcbiAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgcmV0dXJuIFwibnVtYmVyT3JOdW1lcmljXCI7XG4gICAgY2FzZSBcIm51bWVyaWNbXVwiOlxuICAgICAgcmV0dXJuIFwibnVtYmVyT3JOdW1lcmljW11cIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICAgIGNhc2UgXCJib29sZWFuW11cIjpcbiAgICAgIHJldHVybiBcImJvb2xlYW5bXVwiO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJkYXRlXCI7XG4gICAgY2FzZSBcImRhdGVbXVwiOlxuICAgICAgcmV0dXJuIFwiZGF0ZVtdXCI7XG4gICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIHJldHVybiBcInV1aWRcIjtcbiAgICBjYXNlIFwidXVpZFtdXCI6XG4gICAgICByZXR1cm4gXCJ1dWlkW11cIjtcbiAgICBjYXNlIFwianNvblwiOlxuICAgICAgcmV0dXJuIFwianNvblwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICBleGhhdXN0aXZlKHByb3ApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGVudGl0eSBwcm9wIHR5cGU6ICR7KHByb3AgYXMgeyB0eXBlOiBzdHJpbmcgfSkudHlwZX1gKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImluZmxlY3Rpb24iLCJFbnRpdHlNYW5hZ2VyIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0hhc01hbnlSZWxhdGlvblByb3AiLCJpc01hbnlUb01hbnlSZWxhdGlvblByb3AiLCJpc051bWJlclByb3AiLCJpc051bWVyaWNQcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzUmVsYXRpb25Qcm9wIiwiaXNTdHJpbmdQcm9wIiwiaXNWaXJ0dWFsUHJvcCIsImV4aGF1c3RpdmUiLCJnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5IiwiZW50aXR5IiwibWlncmF0aW9uU2V0IiwicHJvcHMiLCJyZWR1Y2UiLCJyIiwicHJvcCIsImNvbHVtbiIsIm5hbWUiLCJ0eXBlIiwicmVzb2x2ZUVudGl0eVByb3BUeXBlVG9NaWdyYXRpb25Db2x1bW5UeXBlIiwibnVsbGFibGUiLCJkYkRlZmF1bHQiLCJ1bmRlZmluZWQiLCJkZWZhdWx0VG8iLCJsZW5ndGgiLCJwcmVjaXNpb24iLCJzY2FsZSIsIm51bWJlclR5cGUiLCJjb2x1bW5zIiwicHVzaCIsInJlbE1kIiwiZ2V0Iiwid2l0aCIsInRhYmxlMSIsInRhYmxlIiwidGFibGUyIiwiam9pbiIsImZyb20iLCJ0aHJvdWdoIiwiam9pblRhYmxlIiwic2luZ3VsYXJpemUiLCJ0byIsIm9uVXBkYXRlIiwib25EZWxldGUiLCJmaWVsZHMiLCJqb2luVGFibGVzIiwic3BsaXQiLCJpbmRleGVzIiwiZmlsdGVyIiwiaW5kZXgiLCJmaW5kIiwiY29sIiwiaW5jbHVkZXMiLCJtYXAiLCJyZXBsYWNlIiwiZmllbGQiLCJmb3JlaWducyIsImhhc0pvaW5Db2x1bW4iLCJpZENvbHVtbk5hbWUiLCJ1c2VDb25zdHJhaW50IiwidW5kZXJzY29yZSIsInBsdXJhbGl6ZSIsInRvTG93ZXJDYXNlIiwiRXJyb3IiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLGdCQUFnQixhQUFhO0FBRXBDLFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FFRUMsMEJBQTBCLEVBQzFCQyxxQkFBcUIsRUFDckJDLHdCQUF3QixFQUN4QkMsWUFBWSxFQUNaQyxhQUFhLEVBQ2JDLHNCQUFzQixFQUN0QkMsY0FBYyxFQUNkQyxZQUFZLEVBQ1pDLGFBQWEsUUFPUixvQkFBaUI7QUFDeEIsU0FBU0MsVUFBVSxRQUFRLG9CQUFpQjtBQUU1Qzs7OztDQUlDLEdBQ0QsT0FBTyxTQUFTQywwQkFBMEJDLE1BQWM7SUFDdEQsTUFB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
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vbWlncmF0aW9uLXNldC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc051bWJlclByb3AsXG4gIGlzTnVtZXJpY1Byb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1N0cmluZ1Byb3AsXG4gIGlzVmVjdG9yUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgdHlwZSBNaWdyYXRpb25Db2x1bW4sXG4gIHR5cGUgTWlncmF0aW9uQ29sdW1uVHlwZSxcbiAgdHlwZSBNaWdyYXRpb25Gb3JlaWduLFxuICB0eXBlIE1pZ3JhdGlvbkluZGV4LFxuICB0eXBlIE1pZ3JhdGlvbkpvaW5UYWJsZSxcbiAgdHlwZSBNaWdyYXRpb25TZXRBbmRKb2luVGFibGUsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgZXhoYXVzdGl2ZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG4vKipcbiAqIEVudGl0eeulvCDsnb3slrTshJwgTWlncmF0aW9uU2V0QW5kSm9pblRhYmxl7J2EIOunjOuTpOyWtOyYteuLiOuLpC5cbiAqIEBwYXJhbSBlbnRpdHkgRW50aXR5IOqwneyytFxuICogQHJldHVybnMgTWlncmF0aW9uU2V0QW5kSm9pblRhYmxlIOqwneyytFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eShlbnRpdHk6IEVudGl0eSk6IE1pZ3JhdGlvblNldEFuZEpvaW5UYWJsZSB7XG4gIGNvbnN0IG1pZ3JhdGlvblNldDogTWlncmF0aW9uU2V0QW5kSm9pblRhYmxlID0gZW50aXR5LnByb3BzLnJlZHVjZShcbiAgICAociwgcHJvcCkgPT4ge1xuICAgICAgLy8gdmlydHVhbCDtlYTrk5wg7KCc7Jm4XG4gICAgICBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH1cbiAgICAgIC8vIEhhc01hbnkg7LyA7J207Iqk64qUIOyVhOustCDsspjrpqzrj4Qg7ZWY7KeAIOyViuydjFxuICAgICAgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIOy7rOufvFxuICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB7XG4gICAgICAgICAgbmFtZTogcHJvcC5uYW1lLFxuICAgICAgICAgIHR5cGU6IHJlc29sdmVFbnRpdHlQcm9wVHlwZVRvTWlncmF0aW9uQ29sdW1uVHlwZShwcm9wKSxcbiAgICAgICAgICBudWxsYWJsZTogcHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSxcbiAgICAgICAgICAuLi4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb3AuZGJEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0VG86IHByb3AuZGJEZWZhdWx0LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgIH0pKCksXG4gICAgICAgICAgLy8gU3RyaW5nIO2DgOyeheyXkCBsZW5ndGgg7J6I64qUIOqyveyasCDstpTqsIBcbiAgICAgICAgICAuLi4oaXNTdHJpbmdQcm9wKHByb3ApICYmXG4gICAgICAgICAgICBwcm9wLmxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgICAgICAgbGVuZ3RoOiBwcm9wLmxlbmd0aCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIE51bWJlci9OdW1lcmljIO2DgOyeheydmCDqsr3smrAgcHJlY2lzaW9uLCBzY2FsZSDstpTqsIBcbiAgICAgICAgICAuLi4oKGlzTnVtYmVyUHJvcChwcm9wKSB8fCBpc051bWVyaWNQcm9wKHByb3ApKSAmJiB7XG4gICAgICAgICAgICBwcmVjaXNpb246IHByb3AucHJlY2lzaW9uLFxuICAgICAgICAgICAgc2NhbGU6IHByb3Auc2NhbGUsXG4gICAgICAgICAgICBudW1iZXJUeXBlOiBpc051bWJlclByb3AocHJvcCkgPyAocHJvcC5udW1iZXJUeXBlID8/IFwibnVtZXJpY1wiKSA6IFwibnVtZXJpY1wiLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIFZlY3RvciDtg4DsnoXsnZgg6rK97JqwIGRpbWVuc2lvbnMg7LaU6rCAXG4gICAgICAgICAgLi4uKGlzVmVjdG9yUHJvcChwcm9wKSAmJiB7XG4gICAgICAgICAgICBkaW1lbnNpb25zOiBwcm9wLmRpbWVuc2lvbnMsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgLy8gR2VuZXJhdGVkIENvbHVtbiDsoJXrs7Qg7LaU6rCAXG4gICAgICAgICAgLi4uKHByb3AuZ2VuZXJhdGVkICYmIHtcbiAgICAgICAgICAgIGdlbmVyYXRlZDogcHJvcC5nZW5lcmF0ZWQsXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG5cbiAgICAgICAgci5jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAvLyBNYW55VG9NYW55IOy8gOydtOyKpFxuICAgICAgICBjb25zdCByZWxNZCA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IHRhYmxlMSA9IGVudGl0eS50YWJsZTtcbiAgICAgICAgY29uc3QgdGFibGUyID0gcmVsTWQudGFibGU7XG4gICAgICAgIGNvbnN0IGpvaW4gPSB7XG4gICAgICAgICAgZnJvbTogYCR7ZW50aXR5LnRhYmxlfS5pZGAsXG4gICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgZnJvbTogYCR7cHJvcC5qb2luVGFibGV9LiR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0YWJsZTEpfV9pZGAsXG4gICAgICAgICAgICB0bzogYCR7cHJvcC5qb2luVGFibGV9LiR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0YWJsZTIpfV9pZGAsXG4gICAgICAgICAgICBvblVwZGF0ZTogcHJvcC5vblVwZGF0ZSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBwcm9wLm9uRGVsZXRlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86IGAke3JlbE1kLnRhYmxlfS5pZGAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHRocm91Z2ggPSBqb2luLnRocm91Z2g7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IFt0aHJvdWdoLmZyb20sIHRocm91Z2gudG9dO1xuICAgICAgICByLmpvaW5UYWJsZXMucHVzaCh7XG4gICAgICAgICAgdGFibGU6IHRocm91Z2guZnJvbS5zcGxpdChcIi5cIilbMF0sXG4gICAgICAgICAgaW5kZXhlczogW1xuICAgICAgICAgICAgLy8g7KGw7J24IO2FjOydtOu4lOyXkCDqsbjrprAg7J24642x7IqkIOywvuyVhOyZgOyEnCDsl7DqsrBcbiAgICAgICAgICAgIC4uLmVudGl0eS5pbmRleGVzXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGluZGV4KSA9PlxuICAgICAgICAgICAgICAgIGluZGV4LmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZS5pbmNsdWRlcyhgJHtwcm9wLmpvaW5UYWJsZX0uYCkpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5tYXAoKGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLmluZGV4LFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IGluZGV4LmNvbHVtbnMubWFwKChjb2wpID0+ICh7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBjb2wubmFtZS5yZXBsYWNlKGAke3Byb3Auam9pblRhYmxlfS5gLCBcIlwiKSxcbiAgICAgICAgICAgICAgICAgIG51bGxzRmlyc3Q6IGNvbC5udWxsc0ZpcnN0LFxuICAgICAgICAgICAgICAgICAgc29ydE9yZGVyOiBjb2wuc29ydE9yZGVyLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgY29sdW1uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uZmllbGRzLm1hcCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBmaWVsZC5zcGxpdChcIi5cIilbMV0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICB9IGFzIE1pZ3JhdGlvbkNvbHVtbjtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZm9yZWlnbnM6IGZpZWxkcy5tYXAoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAvLyDtmITsnqwg7ZWE65Oc6rCAIOyWtOuWpCDthYzsnbTruJTsl5Ag7IaN7ZWY64qU7KeAIO2MkOuLqFxuICAgICAgICAgICAgY29uc3QgY29sID0gZmllbGQuc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgY29uc3QgdG8gPSAoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShqb2luLnRvLnNwbGl0KFwiLlwiKVswXSl9X2lkYCA9PT0gY29sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4udG87XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4uZnJvbTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbHVtbnM6IFtjb2xdLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgICAgb25VcGRhdGU6IHRocm91Z2gub25VcGRhdGUsXG4gICAgICAgICAgICAgIG9uRGVsZXRlOiB0aHJvdWdoLm9uRGVsZXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgKSB7XG4gICAgICAgIC8vIC1PbmVSZWxhdGlvbiDsvIDsnbTsiqRcbiAgICAgICAgY29uc3QgaWRDb2x1bW5OYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG4gICAgICAgIHIuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBpZENvbHVtbk5hbWUsXG4gICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgbnVsbGFibGU6IHByb3AubnVsbGFibGUgPz8gZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKHByb3AudXNlQ29uc3RyYWludCA/PyB0cnVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHIuZm9yZWlnbnMucHVzaCh7XG4gICAgICAgICAgICBjb2x1bW5zOiBbaWRDb2x1bW5OYW1lXSxcbiAgICAgICAgICAgIHRvOiBgJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaW5mbGVjdGlvbi5wbHVyYWxpemUocHJvcC53aXRoKSkudG9Mb3dlckNhc2UoKX0uaWRgLFxuICAgICAgICAgICAgb25VcGRhdGU6IHByb3Aub25VcGRhdGUgPz8gXCJSRVNUUklDVFwiLFxuICAgICAgICAgICAgb25EZWxldGU6IHByb3Aub25EZWxldGUgPz8gXCJSRVNUUklDVFwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAge1xuICAgICAgdGFibGU6IGVudGl0eS50YWJsZSxcbiAgICAgIGNvbHVtbnM6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgICAgaW5kZXhlczogW10gYXMgTWlncmF0aW9uSW5kZXhbXSxcbiAgICAgIGZvcmVpZ25zOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBqb2luVGFibGVzOiBbXSBhcyBNaWdyYXRpb25Kb2luVGFibGVbXSxcbiAgICB9LFxuICApO1xuXG4gIC8vIGluZGV4ZXNcbiAgbWlncmF0aW9uU2V0LmluZGV4ZXMgPSBlbnRpdHkuaW5kZXhlcy5maWx0ZXIoKGluZGV4KSA9PlxuICAgIGluZGV4LmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikgPT09IGZhbHNlKSxcbiAgKTtcblxuICByZXR1cm4gbWlncmF0aW9uU2V0O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRW50aXR5UHJvcFR5cGVUb01pZ3JhdGlvbkNvbHVtblR5cGUocHJvcDogRW50aXR5UHJvcCk6IE1pZ3JhdGlvbkNvbHVtblR5cGUge1xuICBpZiAocHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgfHwgcHJvcC50eXBlID09PSBcInZpcnR1YWxcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5yZXNvbHZlZCBjb2x1bW4gdHlwZTogJHtwcm9wLnR5cGV9YCk7XG4gIH1cblxuICBzd2l0Y2ggKHByb3AudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIGNhc2UgXCJzdHJpbmdbXVwiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nW11cIjtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSBcImVudW1bXVwiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nW11cIjtcbiAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgcmV0dXJuIFwiaW50ZWdlclwiO1xuICAgIGNhc2UgXCJpbnRlZ2VyW11cIjpcbiAgICAgIHJldHVybiBcImludGVnZXJbXVwiO1xuICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gXCJiaWdJbnRlZ2VyXCI7XG4gICAgY2FzZSBcImJpZ0ludGVnZXJbXVwiOlxuICAgICAgcmV0dXJuIFwiYmlnSW50ZWdlcltdXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIFwibnVtYmVyT3JOdW1lcmljXCI7XG4gICAgY2FzZSBcIm51bWJlcltdXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJPck51bWVyaWNbXVwiO1xuICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJPck51bWVyaWNcIjtcbiAgICBjYXNlIFwibnVtZXJpY1tdXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJPck51bWVyaWNbXVwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgY2FzZSBcImJvb2xlYW5bXVwiOlxuICAgICAgcmV0dXJuIFwiYm9vbGVhbltdXCI7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcImRhdGVcIjtcbiAgICBjYXNlIFwiZGF0ZVtdXCI6XG4gICAgICByZXR1cm4gXCJkYXRlW11cIjtcbiAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgcmV0dXJuIFwidXVpZFwiO1xuICAgIGNhc2UgXCJ1dWlkW11cIjpcbiAgICAgIHJldHVybiBcInV1aWRbXVwiO1xuICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICByZXR1cm4gXCJqc29uXCI7XG4gICAgY2FzZSBcInZlY3RvclwiOlxuICAgICAgcmV0dXJuIFwidmVjdG9yXCI7XG4gICAgY2FzZSBcInZlY3RvcltdXCI6XG4gICAgICByZXR1cm4gXCJ2ZWN0b3JbXVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICBleGhhdXN0aXZlKHByb3ApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGVudGl0eSBwcm9wIHR5cGU6ICR7KHByb3AgYXMgeyB0eXBlOiBzdHJpbmcgfSkudHlwZX1gKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImluZmxlY3Rpb24iLCJFbnRpdHlNYW5hZ2VyIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0hhc01hbnlSZWxhdGlvblByb3AiLCJpc01hbnlUb01hbnlSZWxhdGlvblByb3AiLCJpc051bWJlclByb3AiLCJpc051bWVyaWNQcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzUmVsYXRpb25Qcm9wIiwiaXNTdHJpbmdQcm9wIiwiaXNWZWN0b3JQcm9wIiwiaXNWaXJ0dWFsUHJvcCIsImV4aGF1c3RpdmUiLCJnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5IiwiZW50aXR5IiwibWlncmF0aW9uU2V0IiwicHJvcHMiLCJyZWR1Y2UiLCJyIiwicHJvcCIsImNvbHVtbiIsIm5hbWUiLCJ0eXBlIiwicmVzb2x2ZUVudGl0eVByb3BUeXBlVG9NaWdyYXRpb25Db2x1bW5UeXBlIiwibnVsbGFibGUiLCJkYkRlZmF1bHQiLCJ1bmRlZmluZWQiLCJkZWZhdWx0VG8iLCJsZW5ndGgiLCJwcmVjaXNpb24iLCJzY2FsZSIsIm51bWJlclR5cGUiLCJkaW1lbnNpb25zIiwiZ2VuZXJhdGVkIiwiY29sdW1ucyIsInB1c2giLCJyZWxNZCIsImdldCIsIndpdGgiLCJ0YWJsZTEiLCJ0YWJsZSIsInRhYmxlMiIsImpvaW4iLCJmcm9tIiwidGhyb3VnaCIsImpvaW5UYWJsZSIsInNpbmd1bGFyaXplIiwidG8iLCJvblVwZGF0ZSIsIm9uRGVsZXRlIiwiZmllbGRzIiwiam9pblRhYmxlcyIsInNwbGl0IiwiaW5kZXhlcyIsImZpbHRlciIsImluZGV4IiwiZmluZCIsImNvbCIsImluY2x1ZGVzIiwibWFwIiwicmVwbGFjZSIsIm51bGxzRmlyc3QiLCJzb3J0T3JkZXIiLCJmaWVsZCIsImZvcmVpZ25zIiwiaGFzSm9pbkNvbHVtbiIsImlkQ29sdW1uTmFtZSIsInVzZUNvbnN0cmFpbnQiLCJ1bmRlcnNjb3JlIiwicGx1cmFsaXplIiwidG9Mb3dlckNhc2UiLCJFcnJvciJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsZ0JBQWdCLGFBQWE7QUFFcEMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUVFQywwQkFBMEIsRUFDMUJDLHFCQUFxQixFQUNyQkMsd0JBQXdCLEVBQ3hCQyxZQUFZLEVBQ1pDLGFBQWEsRUFDYkMsc0JBQXNCLEVBQ3RCQyxjQUFjLEVBQ2RDLFlBQVksRUFDWkMsWUFBWSxFQUNaQyxhQUFhLFFBT1Isb0JBQWlCO0FBQ3hCLFNBQVNDLFVBQVUsUUFBUSxvQkFBaUI7QUFFNUM7Ozs7Q0FJQyxHQUNELE9BQU8sU0FBU0MsMEJBQTBCQyxNQUFjO0lBQ3RELE1BQU1DLGVBQXlDRCxPQUFPRSxLQUFLLENBQUNDLE1BQU0sQ0FDaEUsQ0FBQ0MsR0FBR0M7UUFDRixnQkFBZ0I7UUFDaEIsSUFBSVIsY0FBY1EsT0FBTztZQUN2QixPQUFPRDtRQUNUO1FBQ0EsNEJBQTRCO1FBQzVCLElBQUlmLHNCQUFzQmdCLE9BQU87WUFDL0IsT0FBT0Q7UUFDVDtRQUVBLFFBQVE7UUFDUixJQUFJLENBQUNWLGVBQWVXLE9BQU87WUFDekIsTUFBTUMsU0FBUztnQkFDYkMsTUFBTUYsS0FBS0Us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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/migration/migrator.ts"],"names":[],"mappings":"AAGA,OAAa,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAIvC,OAAO,EAAM,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIzD,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,gBAAgB,CAAC;AAMrE,OAAO,KAAK,EAA6B,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1E,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,EAAE,CAAC;AAEJ,qBAAa,QAAQ;YACL,iBAAiB;IAqB/B;;;;;;;;OAQG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IA+F3C;;;;;;;;;OASG;IACG,SAAS,CACb,MAAM,EAAE,OAAO,GAAG,UAAU,EAC5B,OAAO,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,GAChC,OAAO,CAAC,eAAe,CAAC;IAkE3B;;;;;;OAMG;IACH,iBAAiB,CAAC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;;;;IAWtE;;;;;;;OAOG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBpD,OAAO,CAAC,UAAU;IAalB;;;;;;OAMG;IACG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAuBxC,iBAAiB,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAgErE;;;;;;OAMG;IACG,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/migration/migrator.ts"],"names":[],"mappings":"AAGA,OAAa,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAIvC,OAAO,EAAM,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIzD,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,gBAAgB,CAAC;AAMrE,OAAO,KAAK,EAA6B,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1E,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,EAAE,CAAC;AAEJ,qBAAa,QAAQ;YACL,iBAAiB;IAqB/B;;;;;;;;OAQG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IA+F3C;;;;;;;;;OASG;IACG,SAAS,CACb,MAAM,EAAE,OAAO,GAAG,UAAU,EAC5B,OAAO,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,GAChC,OAAO,CAAC,eAAe,CAAC;IAkE3B;;;;;;OAMG;IACH,iBAAiB,CAAC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;;;;IAWtE;;;;;;;OAOG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBpD,OAAO,CAAC,UAAU;IAalB;;;;;;OAMG;IACG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAuBxC,iBAAiB,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAgErE;;;;;;OAMG;IACG,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;CA+DhD"}
|
|
@@ -288,6 +288,12 @@ export class Migrator {
|
|
|
288
288
|
const tdb = knex(Sonamu.dbConfig.test);
|
|
289
289
|
!isTest() && console.log(chalk.magenta(`${shadowDatabase} 삭제`));
|
|
290
290
|
await tdb.raw(`DROP DATABASE IF EXISTS ${shadowDatabase}`);
|
|
291
|
+
await tdb.raw(`
|
|
292
|
+
SELECT pg_terminate_backend(pg_stat_activity.pid)
|
|
293
|
+
FROM pg_stat_activity
|
|
294
|
+
WHERE datname = '${tdbConn.database}'
|
|
295
|
+
AND pid <> pg_backend_pid();
|
|
296
|
+
`);
|
|
291
297
|
await tdb.raw(`CREATE DATABASE ${shadowDatabase} TEMPLATE ${tdbConn.database}`);
|
|
292
298
|
// Shadow DB에 연결
|
|
293
299
|
const sdb = knex({
|
|
@@ -327,4 +333,4 @@ export class Migrator {
|
|
|
327
333
|
}
|
|
328
334
|
}
|
|
329
335
|
|
|
330
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vbWlncmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgdW5saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHN1bSwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IERCLCB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB0eXBlIHsgR2VuTWlncmF0aW9uQ29kZSwgTWlncmF0aW9uU2V0IH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpc1Rlc3QgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUFsdGVyQ29kZSwgZ2VuZXJhdGVDcmVhdGVDb2RlIH0gZnJvbSBcIi4vY29kZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQgeyBnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5IH0gZnJvbSBcIi4vbWlncmF0aW9uLXNldFwiO1xuaW1wb3J0IHsgUG9zdGdyZVNRTFNjaGVtYVJlYWRlciB9IGZyb20gXCIuL3Bvc3RncmVzcWwtc2NoZW1hLXJlYWRlclwiO1xuaW1wb3J0IHR5cGUgeyBDb25uU3RyaW5nLCBNaWdyYXRpb25Db2RlLCBNaWdyYXRpb25TdGF0dXMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBNaWdyYXRpb25SZXN1bHQgPSB7XG4gIGNvbm5LZXk6IHN0cmluZztcbiAgYmF0Y2hObzogbnVtYmVyO1xuICBhcHBsaWVkOiBzdHJpbmdbXTtcbn1bXTtcblxuZXhwb3J0IGNsYXNzIE1pZ3JhdG9yIHtcbiAgcHJpdmF0ZSBhc3luYyBnZXRNaWdyYXRpb25Db2RlcygpOiBQcm9taXNlPE1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIGNvbnN0IHNyY01pZ3JhdGlvbnNEaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcIm1pZ3JhdGlvbnNcIik7IC8vIOydtOqxtCDtmZjqsr3sl5Ag6rSA6rOE7JeG7J20IO2VreyDgSBzcmPsl5DshJwg7LC+7JWE7JW8IO2VtOyalC5cblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNNaWdyYXRpb25zRGlyKSkpIHtcbiAgICAgIGF3YWl0IG1rZGlyKHNyY01pZ3JhdGlvbnNEaXIsIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29kZXMgPSAoYXdhaXQgcmVhZGRpcihzcmNNaWdyYXRpb25zRGlyKSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoXCIudHNcIikpXG4gICAgICAubWFwKChmKSA9PiAoe1xuICAgICAgICBuYW1lOiBmLnJlcGxhY2UoXCIudHNcIiwgXCJcIiksXG4gICAgICAgIHBhdGg6IHBhdGguam9pbihzcmNNaWdyYXRpb25zRGlyLCBmKSxcbiAgICAgIH0pKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IChhLm5hbWUgPCBiLm5hbWUgPyAxIDogLTEpKTsgLy8g7J2066aEIOuCtOumvOywqOyInCDsoJXroKwo7LWc7Iug7IicKVxuXG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldE1pZ3JhdGlvbkNvZGVzOnJlc3VsdHNcIiwgY29kZXMpO1xuICAgIHJldHVybiBjb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiDtg4Dqsp/rs4Qg66eI7J206re466CI7J207IWYIOyDge2DnOyZgCDsvZTrk5wg7IOd7ISxL+ykgOu5hCDsg4Htg5zrpbwg6rWs7ZW07Ji164uI64ukLlxuICAgKiDsi6TsoJzroZwgRELsl5Ag7KCR6re864+EIO2VmOqzoCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvOuPhCDtmZXsnbjtlZjqs6AsXG4gICAqIO2VhOyalO2VmOuLpOuptCDsoIHsmqntlaAg7IiYIOyeiOuKlCDsvZTrk5zrpbwg7IOd7ISx6rmM7KeAIO2VtOyYteuLiOuLpC5cbiAgICpcbiAgICogQ0xJ7JmAIFNvbmFtdSBVSeyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBnZXRTdGF0dXMoKTogUHJvbWlzZTxNaWdyYXRpb25TdGF0dXM+IHtcbiAgICBjb25zdCBjb2RlcyA9IGF3YWl0IHRoaXMuZ2V0TWlncmF0aW9uQ29kZXMoKTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOmNvZGVzXCIsIGNvZGVzKTtcblxuICAgIGNvbnN0IGNvbm5LZXlzID0gT2JqZWN0LmtleXMoU29uYW11LmRiQ29uZmlnKS5maWx0ZXIoXG4gICAgICAoa2V5KSA9PiBrZXkuZW5kc1dpdGgoXCJfc2xhdmVcIikgPT09IGZhbHNlLFxuICAgICkgYXMgKGtleW9mIHR5cGVvZiBTb25hbXUuZGJDb25maWcpW107XG5cbiAgICBsZXQgbWlncmF0aW9uU3RhdHVzRXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb25uS2V5cy5tYXAoYXN5bmMgKGNvbm5LZXkpID0+IHtcbiAgICAgICAgY29uc3Qga25leE9wdGlvbnMgPSBTb25hbXUuZGJDb25maWdbY29ubktleV07XG4gICAgICAgIGNvbnN0IHRDb25uID0ga25leChrbmV4T3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRDb25uLm1pZ3JhdGUuc3RhdHVzKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBgJHtjb25uS2V5feydmCDrp4jsnbTqt7jroIjsnbTshZgg7IOB7YOc66W8IOqwgOyguOyYpOuKlCDrjbDsl5Ag7Iuk7Yyo7ZWY7JiA7Iq164uI64ukLiDrjbDsnbTthLDrsqDsnbTsiqTqsIAg7Jis67CU66W06rKMIOq1rOyEseuQmOyngCDslYrsnYAg6rKDIOqwmeyKteuLiOuLpC4g7ZmV7J247ZWY7Iuc6rOgIOuLpOyLnCDsi5zrj4TtlbTso7zshLjsmpQuXFxu7Iuc64+E7ZWcIOyXsOqysCDshKTsoJU6XFxuJHtKU09OLnN0cmluZ2lmeShrbmV4T3B0aW9ucy5jb25uZWN0aW9uLCBudWxsLCAyKX1cXG7rsJzsg53tlZwg7JeQ65+sOlxcbiR7ZXJyfVxcbmAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbWlncmF0aW9uU3RhdHVzRXJyb3IgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICByZXR1cm4gXCJlcnJvclwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICAgICAgY29uc3QgcGVuZGluZzogc3RyaW5nW10gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBbLCBmZExpc3RdID0gYXdhaXQgdENvbm4ubWlncmF0ZS5saXN0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmRMaXN0Lm1hcCgoZmQ6IHsgZmlsZTogc3RyaW5nIH0pID0+IGZkLmZpbGUucmVwbGFjZShcIi50c1wiLCBcIlwiKSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBtaWdyYXRpb25TdGF0dXNFcnJvciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRDb25uLm1pZ3JhdGUuY3VycmVudFZlcnNpb24oKTtcbiAgICAgICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgICBtaWdyYXRpb25TdGF0dXNFcnJvciA9IF9lcnIgaW5zdGFuY2VvZiBFcnJvciA/IF9lcnIubWVzc2FnZSA6IFN0cmluZyhfZXJyKTtcbiAgICAgICAgICAgIHJldHVybiBcImVycm9yXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgICAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOnN0YXR1c1wiLCBzdGF0dXMpO1xuXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBrbmV4T3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuXG4gICAgICAgIGF3YWl0IHRDb25uLmRlc3Ryb3koKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IGNvbm5LZXkucmVwbGFjZShcIl9tYXN0ZXJcIiwgXCJcIiksXG4gICAgICAgICAgY29ubktleSxcbiAgICAgICAgICBjb25uU3RyaW5nOiBgcGc6Ly8ke2Nvbm5lY3Rpb24udXNlciA/PyBcIlwifUAke2Nvbm5lY3Rpb24uaG9zdH06JHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ucG9ydFxuICAgICAgICAgIH0vJHtjb25uZWN0aW9uLmRhdGFiYXNlfWAgYXMgQ29ublN0cmluZyxcbiAgICAgICAgICBjdXJyZW50VmVyc2lvbixcbiAgICAgICAgICBzdGF0dXM6IHN0YXR1cyBhcyBudW1iZXIgfCBcImVycm9yXCIsXG4gICAgICAgICAgcGVuZGluZyxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOmNvbm5zXCIsIHN0YXR1c2VzKTtcblxuICAgIGNvbnN0IHByZXBhcmVkQ29kZXM6IEdlbk1pZ3JhdGlvbkNvZGVbXSA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXMwY29ubiA9IHN0YXR1c2VzLmZpbmQoKHN0YXR1cykgPT4gc3RhdHVzLnN0YXR1cyA9PT0gMCk7XG4gICAgICBpZiAoc3RhdHVzMGNvbm4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgYFdoaWxlIHRyeWluZyB0byBwcmVwYXJlIG1pZ3JhdGlvbiBjb2Rlcywgd2UgZm91bmQgdGhhdCB0aGVyZSBpcyBubyBkYXRhYmFzZSB0byBjb21wYXJlIG1pZ3JhdGlvbnMuIFdlIG5lZWQgYXQgbGVhc3Qgb25lIGRhdGFiYXNlIHdoZXJlIGV2ZXJ5IG1pZ3JhdGlvbiBpcyBhcHBsaWVkKHN0YXR1cyA9PT0gMCkuIFlvdSBtaWdodCB3YW50IHRvIGFwcGx5IHlvdXIgZXhpc3RpbmcgbWlncmF0aW9ucyB0byBvbmUgb2YgdGhlIGRhdGFiYXNlcy5gLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29tcGFyZURCY29ubiA9IGtuZXgoU29uYW11LmRiQ29uZmlnW3N0YXR1czBjb25uLmNvbm5LZXldKTtcbiAgICAgIGNvbnN0IGdlbkNvZGVzID0gYXdhaXQgdGhpcy5jb21wYXJlTWlncmF0aW9ucyhjb21wYXJlREJjb25uKTtcblxuICAgICAgYXdhaXQgY29tcGFyZURCY29ubi5kZXN0cm95KCk7XG5cbiAgICAgIHJldHVybiBnZW5Db2RlcztcbiAgICB9KSgpO1xuXG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpwcmVwYXJlZENvZGVzXCIsIHByZXBhcmVkQ29kZXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbm5zOiBzdGF0dXNlcyxcbiAgICAgIGNvZGVzLFxuICAgICAgcHJlcGFyZWRDb2RlcyxcbiAgICAgIGVycm9yOiBtaWdyYXRpb25TdGF0dXNFcnJvcixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOuniOydtOq3uOugiOydtOyFmOydhCDsoIHsmqntlZjqsbDrgpgg66Gk67Cx7ZWp64uI64ukLlxuICAgKiBTb25hbXUgVUnsl5DshJwg66eI7J206re466CI7J207IWYIOyekeyXheydhCDsiJjtlontlaAg65WMIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICogQ0xJ7JmAIFNvbmFtdSBVSeyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBhY3Rpb24g7J6R7JeFIOycoO2YlSAoYXBwbHkvcm9sbGJhY2spXG4gICAqIEBwYXJhbSB0YXJnZXRzIOyekeyXhSDrjIDsg4EgREIg7ISk7KCVIO2CpCAoa2V5b2YgU29uYW11REJDb25maWcpXG4gICAqIEByZXR1cm5zIOyekeyXhSDqsrDqs7xcbiAgICovXG4gIGFzeW5jIHJ1bkFjdGlvbihcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgICB0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW10sXG4gICk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjphY3Rpb25cIiwgYWN0aW9uKTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6cnVuQWN0aW9uOnRhcmdldHNcIiwgdGFyZ2V0cyk7XG5cbiAgICAvLyBnZXQgdW5pcSBrbmV4IGNvbmZpZ3NcbiAgICBjb25zdCBjb25maWdzID0gdW5pcXVlKFxuICAgICAgdGFyZ2V0c1xuICAgICAgICAubWFwKCh0YXJnZXQpID0+ICh7XG4gICAgICAgICAgY29ubktleTogdGFyZ2V0LFxuICAgICAgICAgIG9wdGlvbnM6IFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXQgYXMga2V5b2YgdHlwZW9mIFNvbmFtdS5kYkNvbmZpZ10sXG4gICAgICAgIH0pKVxuICAgICAgICAuZmlsdGVyKChjKSA9PiBjLm9wdGlvbnMgIT09IHVuZGVmaW5lZCksXG4gICAgICAoeyBvcHRpb25zIH0pID0+XG4gICAgICAgIGAkeyhvcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcpLmhvc3R9OiR7XG4gICAgICAgICAgKG9wdGlvbnMuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZykucG9ydCA/PyA1NDMyXG4gICAgICAgIH0vJHsob3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnKS5kYXRhYmFzZX1gLFxuICAgICk7XG5cbiAgICAvLyBnZXQgY29ubmVjdGlvbnNcbiAgICBjb25zdCBjb25ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgY29uZmlncy5tYXAoYXN5bmMgKGNvbmZpZykgPT4gKHtcbiAgICAgICAgY29ubktleTogY29uZmlnLmNvbm5LZXksXG4gICAgICAgIGtuZXg6IGtuZXgoY29uZmlnLm9wdGlvbnMpLFxuICAgICAgfSkpLFxuICAgICk7XG5cbiAgICAvLyBhY3Rpb25cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgY2FzZSBcImFwcGx5XCI6XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgY29ubnMubWFwKGFzeW5jICh7IGNvbm5LZXksIGtuZXggfSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBbYmF0Y2hObywgYXBwbGllZF0gPSBhd2FpdCBrbmV4Lm1pZ3JhdGUubGF0ZXN0KCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29ubktleSxcbiAgICAgICAgICAgICAgICBiYXRjaE5vLFxuICAgICAgICAgICAgICAgIGFwcGxpZWQsIC8vIOydtOuyiCBsYXRlc3Qg7Zi47Lac66GcIOyduO2VtCBcInVwXCLsnbQg7KCB7Jqp65CcIOuniOydtOq3uOugiOydtOyFmCDsnbTrpoQoZS5nLiBcIjIwMjUxMTI0MjMzNTU3X2NyZWF0ZV9fY29tcGFuaWVzLnRzXCIp65Ok7J2YIOuwsOyXtOyeheuLiOuLpC4g7LC46rOgOiBodHRwczovL2dpdGh1Yi5jb20va25leC9rbmV4L2Jsb2IvMDFiMTc3YzQ4NWQ2OTZmMWI3Mjg1OGRlZTcyOGJhMTQzYzRmYWQ3Ni9saWIvbWlncmF0aW9ucy9taWdyYXRlL01pZ3JhdG9yLmpzI0w1NjBcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgXCJyb2xsYmFja1wiOlxuICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIGNvbm5zLm1hcChhc3luYyAoeyBjb25uS2V5LCBrbmV4IH0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgW2JhdGNoTm8sIGFwcGxpZWRdID0gYXdhaXQga25leC5taWdyYXRlLnJvbGxiYWNrKCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29ubktleSxcbiAgICAgICAgICAgICAgICBiYXRjaE5vLFxuICAgICAgICAgICAgICAgIGFwcGxpZWQsIC8vIOydtOuyiCByb2xsYmFjayDtmLjstpzroZwg7J247ZW0IFwiZG93blwi7J20IOyggeyaqeuQnCg966Gk67Cx65CcKSDrp4jsnbTqt7jroIjsnbTshZgg7J2066aEKGUuZy4gXCIyMDI1MTEyNDIzMzU1N19jcmVhdGVfX2NvbXBhbmllcy50c1wiKeuTpOydmCDrsLDsl7TsnoXri4jri6QuIOywuOqzoDogaHR0cHM6Ly9naXRodWIuY29tL2tuZXgva25leC9ibG9iLzAxYjE3N2M0ODVkNjk2ZjFiNzI4NThkZWU3MjhiYTE0M2M0ZmFkNzYvbGliL21pZ3JhdGlvbnMvbWlncmF0ZS9NaWdyYXRvci5qcyNMNjExXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICAvLyBkZXN0cm95XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb25ucy5tYXAoKHsga25leCB9KSA9PiB7XG4gICAgICAgIHJldHVybiBrbmV4LmRlc3Ryb3koKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBOYWl0ZS50KFwibWlncmF0b3I6cnVuQWN0aW9uOnJlc3VsdFwiLCByZXN1bHQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsgq3soJwg6rCA64ql7ZWcIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J287J2EIOqygOymne2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGNvbm5zIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5wg67Cw7Je0XG4gICAqIEBwYXJhbSBjb2RlTmFtZXMg7IKt7KCc7ZWgIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOydtOumhCDrsLDsl7RcbiAgICogQHJldHVybnMg7IKt7KCcIOqwgOuKpSDsl6zrtoAg67CPIOyggeyaqeuQnCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvCDsnbTrpoRcbiAgICovXG4gIHZhbGlkYXRlRGVsZXRhYmxlKGNvbm5zOiBNaWdyYXRpb25TdGF0dXNbXCJjb25uc1wiXSwgY29kZU5hbWVzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IGFwcGxpZWRDb2RlcyA9IGNvZGVOYW1lcy5maWx0ZXIoKGNvZGVOYW1lKSA9PlxuICAgICAgY29ubnMuc29tZSgoY29ubikgPT4gY29ubi5wZW5kaW5nLmluY2x1ZGVzKGNvZGVOYW1lKSA9PT0gZmFsc2UpLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2FuRGVsZXRlOiBhcHBsaWVkQ29kZXMubGVuZ3RoID09PSAwLFxuICAgICAgYXBwbGllZENvZGVzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbzsnYQg7IKt7KCc7ZWp64uI64ukLlxuICAgKlxuICAgKiBTb25hbXUgVUnsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gY29kZU5hbWVzIOyCreygnO2VoCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvCDsnbTrpoQg67Cw7Je0XG4gICAqIEByZXR1cm5zIOyCreygnOuQnCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvCDqsJzsiJhcbiAgICovXG4gIGFzeW5jIGRlbENvZGVzKGNvZGVOYW1lczogc3RyaW5nW10pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY29ubnMgfSA9IGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgY29uc3QgeyBjYW5EZWxldGUsIGFwcGxpZWRDb2RlcyB9ID0gdGhpcy52YWxpZGF0ZURlbGV0YWJsZShjb25ucywgY29kZU5hbWVzKTtcbiAgICBpZiAoIWNhbkRlbGV0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgWW91IGNhbm5vdCBkZWxldGUgYSBtaWdyYXRpb24gZmlsZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGFwcGxpZWQuIEFwcGxpZWQgY29kZXM6ICR7YXBwbGllZENvZGVzLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VtKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGNvZGVOYW1lcy5tYXAoYXN5bmMgKGNvZGVOYW1lKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy9taWdyYXRpb25zLyR7Y29kZU5hbWV9LnRzYDtcbiAgICAgICAgICBpZiAoYXdhaXQgZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgYXdhaXQgdW5saW5rKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdlbkRhdGVUYWcoaW5kZXg6IG51bWJlciwgYmFzZURhdGU6IERhdGUgPSBuZXcgRGF0ZSgpKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoYmFzZURhdGUuZ2V0VGltZSgpICsgaW5kZXggKiAxMDAwKTtcbiAgICBjb25zdCBwYWQgPSAobnVtOiBudW1iZXIsIHNpemU6IG51bWJlciA9IDIpID0+IG51bS50b1N0cmluZygpLnBhZFN0YXJ0KHNpemUsIFwiMFwiKTtcbiAgICByZXR1cm4gKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkgK1xuICAgICAgcGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpICtcbiAgICAgIHBhZChkYXRlLmdldERhdGUoKSkgK1xuICAgICAgcGFkKGRhdGUuZ2V0SG91cnMoKSkgK1xuICAgICAgcGFkKGRhdGUuZ2V0TWludXRlcygpKSArXG4gICAgICBwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvOydhCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdSBVSeyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvCDqsJzsiJhcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlUHJlcGFyZWRDb2RlcygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgcHJlcGFyZWRDb2RlcyB9ID0gYXdhaXQgdGhpcy5nZXRTdGF0dXMoKTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2VuZXJhdGVQcmVwYXJlZENvZGVzOnByZXBhcmVkQ29kZXNcIiwgcHJlcGFyZWRDb2Rlcyk7XG4gICAgaWYgKHByZXBhcmVkQ29kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlxcbu2YhOyerCDrqqjrkZAg7Iux7YGs65CcIOyDge2DnOyeheuLiOuLpC5cIikpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8g7Iuk7KCcIOy9lOuTnCDsg53shLFcbiAgICBjb25zdCBtaWdyYXRpb25zRGlyID0gYCR7U29uYW11LmFwaVJvb3RQYXRofS9zcmMvbWlncmF0aW9uc2A7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgcGNvZGVdIG9mIHByZXBhcmVkQ29kZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAocGNvZGUuZm9ybWF0dGVkKSB7XG4gICAgICAgIGNvbnN0IGRhdGVUYWcgPSB0aGlzLmdlbkRhdGVUYWcoaW5kZXgpO1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke21pZ3JhdGlvbnNEaXJ9LyR7ZGF0ZVRhZ31fJHtwY29kZS50aXRsZX0udHNgO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIHBjb2RlLmZvcm1hdHRlZCk7XG4gICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgTUlHUlRBSU9OIENSRUFURUQgJHtmaWxlUGF0aH1gKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXBhcmVkQ29kZXMubGVuZ3RoO1xuICB9XG5cbiAgYXN5bmMgY29tcGFyZU1pZ3JhdGlvbnMoY29tcGFyZURCOiBLbmV4KTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgICAvLyBFbnRpdHkg7Iic7ZqM7ZWY7JesIOyLse2BrFxuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJQg7Y+s7ZWo7ZWY7JesIEVudGl0eeyXkOyEnCBNaWdyYXRpb25TZXQg7LaU7LacXG4gICAgY29uc3QgZW50aXR5U2V0c1dpdGhKb2luVGFibGUgPSBlbnRpdHlJZHNcbiAgICAgIC5maWx0ZXIoKGVudGl0eUlkKSA9PiBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMubGVuZ3RoID4gMClcbiAgICAgIC5tYXAoKGVudGl0eUlkKSA9PiBnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5KEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKSkpO1xuXG4gICAgLy8g7KGw7J247YWM7J2067iU66eMIOy2lOy2nFxuICAgIGNvbnN0IGpvaW5UYWJsZXNXaXRoRHVwID0gZW50aXR5U2V0c1dpdGhKb2luVGFibGUuZmxhdE1hcCgoZW50aXR5U2V0KSA9PiBlbnRpdHlTZXQuam9pblRhYmxlcyk7XG4gICAgLy8g7KSR67O1IOygnOqxsCAo7KSR67O17J24IOqyveyasCBpbmRleGVz66W8IOuzke2VqSlcbiAgICBjb25zdCBqb2luVGFibGVzID0gT2JqZWN0LnZhbHVlcyhncm91cChqb2luVGFibGVzV2l0aER1cCwgKGp0KSA9PiBqdC50YWJsZSkpLm1hcCgodGFibGVzKSA9PiB7XG4gICAgICBhc3NlcnQodGFibGVzICE9PSB1bmRlZmluZWQsIFwidGFibGVzIGlzIHVuZGVmaW5lZFwiKTtcbiAgICAgIGlmICh0YWJsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0YWJsZXNbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50YWJsZXNbMF0sXG4gICAgICAgIGluZGV4ZXM6IHVuaXF1ZShcbiAgICAgICAgICB0YWJsZXMuZmxhdE1hcCgodCkgPT4gdC5pbmRleGVzKSxcbiAgICAgICAgICAoaW5kZXgpID0+IFtpbmRleC50eXBlLCAuLi5pbmRleC5jb2x1bW5zXS5qb2luKFwiLVwiKSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJQg7Y+s7ZWo7ZWY7JesIE1pZ3JhdGlvblNldCDrsLDsl7RcbiAgICBjb25zdCBlbnRpdHlTZXRzOiBNaWdyYXRpb25TZXRbXSA9IFsuLi5lbnRpdHlTZXRzV2l0aEpvaW5UYWJsZSwgLi4uam9pblRhYmxlc107XG5cbiAgICBjb25zdCBjb2RlczogR2VuTWlncmF0aW9uQ29kZVtdID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGVudGl0eVNldHMubWFwKGFzeW5jIChlbnRpdHlTZXQpID0+IHtcbiAgICAgICAgICBjb25zdCBkYlNldCA9IGF3YWl0IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIuZ2V0TWlncmF0aW9uU2V0RnJvbURCKFxuICAgICAgICAgICAgY29tcGFyZURCLFxuICAgICAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgTmFpdGUudChgbWlncmF0b3I6Y29tcGFyZU1pZ3JhdGlvbnM6ZW50aXR5U2V0OiR7ZW50aXR5U2V0LnRhYmxlfWAsIGVudGl0eVNldCk7XG4gICAgICAgICAgTmFpdGUudChgbWlncmF0b3I6Y29tcGFyZU1pZ3JhdGlvbnM6ZGJTZXQ6JHtlbnRpdHlTZXQudGFibGV9YCwgZGJTZXQpO1xuXG4gICAgICAgICAgaWYgKGRiU2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyDquLDsobQg7YWM7J2067iUIOyXhuydjCwg7IOI66GcIO2FjOydtOu4lCDsg53shLFcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZUNyZWF0ZUNvZGUoZW50aXR5U2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g6riw7KG0IO2FjOydtOu4lCDsobTsnqztlZjripQg7LyA7J207IqkXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVBbHRlckNvZGUoZW50aXR5U2V0LCBkYlNldCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICApLmZsYXQoKTtcblxuICAgIC8vIG5vcm1hbCDtg4DsnoXsnbQg7JWe7Jy866GcLCBmb3JlaWdu7J20IOuSpOuhnFxuICAgIGNvZGVzLnNvcnQoKGNvZGVBLCBjb2RlQikgPT4ge1xuICAgICAgaWYgKGNvZGVBLnR5cGUgPT09IFwiZm9yZWlnblwiICYmIGNvZGVCLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKGNvZGVBLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgY29kZUIudHlwZSA9PT0gXCJmb3JlaWduXCIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICogU2hhZG93IERCIO2FjOyKpO2KuOulvCDsp4Ttlontlanri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdSBVSeyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIEByZXR1cm5zIFNoYWRvdyBEQiDthYzsiqTtirgg6rKw6rO8XG4gICAqL1xuICBhc3luYyBydW5TaGFkb3dUZXN0KCk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgdGRiQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG4gICAgY29uc3Qgc2hhZG93RGF0YWJhc2UgPSBgJHt0ZGJDb25uLmRhdGFiYXNlfV9fbWlncmF0aW9uX3NoYWRvd2A7XG5cbiAgICAvLyDthYzsiqTtirgg7IOB7Zmp7JeQ7ISc64qUIO2KuOuenOyereyFmOydhCDstIjquLDtmZTtlZjqs6AsIOyDiCDrjbDsnbTthLDrsqDsnbTsiqQg7Luk64Sl7IWY7J2EIOqwgOyguOyZgOyVvCDtlahcbiAgICBpZiAoaXNUZXN0KCkpIHtcbiAgICAgIGF3YWl0IERCLmNsZWFyVGVzdFRyYW5zYWN0aW9uKCk7XG4gICAgICBhd2FpdCBEQi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLy8g6riw7KG0IFNoYWRvdyBEQiDsgq3soJwg7ZuEIFNoYWRvdyBEQiDsg53shLFcbiAgICBjb25zdCB0ZGIgPSBrbmV4KFNvbmFtdS5kYkNvbmZpZy50ZXN0KTtcbiAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsubWFnZW50YShgJHtzaGFkb3dEYXRhYmFzZX0g7IKt7KCcYCkpO1xuICAgIGF3YWl0IHRkYi5yYXcoYERST1AgREFUQUJBU0UgSUYgRVhJU1RTICR7c2hhZG93RGF0YWJhc2V9YCk7XG4gICAgYXdhaXQgdGRiLnJhdyhgQ1JFQVRFIERBVEFCQVNFICR7c2hhZG93RGF0YWJhc2V9IFRFTVBMQVRFICR7dGRiQ29ubi5kYXRhYmFzZX1gKTtcblxuICAgIC8vIFNoYWRvdyBEQuyXkCDsl7DqsrBcbiAgICBjb25zdCBzZGIgPSBrbmV4KHtcbiAgICAgIC4uLlNvbmFtdS5kYkNvbmZpZy50ZXN0LFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAuLi50ZGJDb25uLFxuICAgICAgICBkYXRhYmFzZTogc2hhZG93RGF0YWJhc2UsXG4gICAgICAgIHBhc3N3b3JkOiB0ZGJDb25uLnBhc3N3b3JkLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHNoYWRvdyBEQiDthYzsiqTtirgg7KeE7ZaJXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFtiYXRjaE5vLCBhcHBsaWVkXSA9IGF3YWl0IHNkYi5taWdyYXRlLmxhdGVzdCgpO1xuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiU2hhZG93IERCIO2FjOyKpO2KuOyXkCDshLHqs7XtlojsirXri4jri6QhXCIpLCB7XG4gICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICBhcHBsaWVkLFxuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbm5LZXk6IFwic2hhZG93XCIsXG4gICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICBhcHBsaWVkLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgdGhyb3cgbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihcIlNoYWRvdyBEQiDthYzsiqTtirgg7KeE7ZaJIOykkSDsl5Drn6xcIik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFNoYWRvdyBEQiDsl7DqsrAg7KKF66OMXG4gICAgICBhd2FpdCBzZGIuZGVzdHJveSgpO1xuXG4gICAgICAvLyBTaGFkb3cgREIg7IKt7KCcXG4gICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsubWFnZW50YShgJHtzaGFkb3dEYXRhYmFzZX0g7IKt7KCcYCkpO1xuICAgICAgYXdhaXQgdGRiLnJhdyhgRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgJHtzaGFkb3dEYXRhYmFzZX1gKTtcblxuICAgICAgLy8gVGVzdCBEQiDsl7DqsrAg7KKF66OMXG4gICAgICBhd2FpdCB0ZGIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxufVxuIl0sIm5hbWVzIjpbImFzc2VydCIsImNoYWxrIiwibWtkaXIiLCJyZWFkZGlyIiwidW5saW5rIiwid3JpdGVGaWxlIiwia25leCIsInBhdGgiLCJncm91cCIsInN1bSIsInVuaXF1ZSIsIlNvbmFtdSIsIkRCIiwiRW50aXR5TWFuYWdlciIsIlNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiIsIk5haXRlIiwiaXNUZXN0IiwiZXhpc3RzIiwiZ2VuZXJhdGVBbHRlckNvZGUiLCJnZW5lcmF0ZUNyZWF0ZUNvZGUiLCJnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5IiwiUG9zdGdyZVNRTFNjaGVtYVJlYWRlciIsIk1pZ3JhdG9yIiwiZ2V0TWlncmF0aW9uQ29kZXMiLCJzcmNNaWdyYXRpb25zRGlyIiwiam9pbiIsImFwaVJvb3RQYXRoIiwicmVjdXJzaXZlIiwiY29kZXMiLCJmaWx0ZXIiLCJmIiwiZW5kc1dpdGgiLCJtYXAiLCJuYW1lIiwicmVwbGFjZSIsInNvcnQiLCJhIiwiYiIsInQiLCJnZXRTdGF0dXMiLCJjb25uS2V5cyIsIk9iamVjdCIsImtleXMiLCJkYkNvbmZpZyIsImtleSIsIm1pZ3JhdGlvblN0YXR1c0Vycm9yIiwic3RhdHVzZXMiLCJQcm9taXNlIiwiYWxsIiwiY29ubktleSIsImtuZXhPcHRpb25zIiwidENvbm4iLCJzdGF0dXMiLCJtaWdyYXRlIiwiZXJyIiwiY29uc29sZSIsIndhcm4iLCJ5ZWxsb3ciLCJKU09OIiwic3RyaW5naWZ5IiwiY29ubmVjdGlvbiIsIkVycm9yIiwibWVzc2FnZSIsIlN0cmluZyIsInBlbmRpbmciLCJmZExpc3QiLCJsaXN0IiwiZmQiLCJmaWxlIiwiY3VycmVudFZlcnNpb24iLCJfZXJyIiwiZGVzdHJveSIsImNvbm5TdHJpbmciLCJ1c2VyIiwiaG9zdCIsInBvcnQiLCJkYXRhYmFzZSIsInByZXBhcmVkQ29kZXMiLCJzdGF0dXMwY29ubiIsImZpbmQiLCJ1bmRlZmluZWQiLCJjb21wYXJlREJjb25uIiwiZ2VuQ29kZXMiLCJjb21wYXJlTWlncmF0aW9ucyIsImNvbm5zIiwiZXJyb3IiLCJydW5BY3Rpb24iLCJhY3Rpb24iLCJ0YXJnZXRzIiwiY29uZmlncyIsInRhcmdldCIsIm9wdGlvbnMiLCJjIiwiY29uZmlnIiwicmVzdWx0IiwiYmF0Y2hObyIsImFwcGxpZWQiLCJsYXRlc3QiLCJyb2xsYmFjayIsInZhbGlkYXRlRGVsZXRhYmxlIiwiY29kZU5hbWVzIiwiYXBwbGllZENvZGVzIiwiY29kZU5hbWUiLCJzb21lIiwiY29ubiIsImluY2x1ZGVzIiwiY2FuRGVsZXRlIiwibGVuZ3RoIiwiZGVsQ29kZXMiLCJmaWxlUGF0aCIsImdlbkRhdGVUYWciLCJpbmRleCIsImJhc2VEYXRlIiwiRGF0ZSIsImRhdGUiLCJnZXRUaW1lIiwicGFkIiwibnVtIiwic2l6ZSIsInRvU3RyaW5nIiwicGFkU3RhcnQiLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJnZW5lcmF0ZVByZXBhcmVkQ29kZXMiLCJsb2ciLCJncmVlbiIsIm1pZ3JhdGlvbnNEaXIiLCJwY29kZSIsImVudHJpZXMiLCJmb3JtYXR0ZWQiLCJkYXRlVGFnIiwidGl0bGUiLCJjb21wYXJlREIiLCJlbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJlbnRpdHlTZXRzV2l0aEpvaW5UYWJsZSIsImVudGl0eUlkIiwiZ2V0IiwicHJvcHMiLCJqb2luVGFibGVzV2l0aER1cCIsImZsYXRNYXAiLCJlbnRpdHlTZXQiLCJqb2luVGFibGVzIiwidmFsdWVzIiwianQiLCJ0YWJsZSIsInRhYmxlcyIsImluZGV4ZXMiLCJ0eXBlIiwiY29sdW1ucyIsImVudGl0eVNldHMiLCJkYlNldCIsImdldE1pZ3JhdGlvblNldEZyb21EQiIsImZsYXQiLCJjb2RlQSIsImNvZGVCIiwicnVuU2hhZG93VGVzdCIsInRkYkNvbm4iLCJ0ZXN0Iiwic2hhZG93RGF0YWJhc2UiLCJjbGVhclRlc3RUcmFuc2FjdGlvbiIsInRkYiIsIm1hZ2VudGEiLCJyYXciLCJzZGIiLCJwYXNzd29yZCIsImUiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVksU0FBUztBQUM1QixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBU0MsS0FBSyxF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
|
|
336
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vbWlncmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgdW5saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHN1bSwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IERCLCB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB0eXBlIHsgR2VuTWlncmF0aW9uQ29kZSwgTWlncmF0aW9uU2V0IH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpc1Rlc3QgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUFsdGVyQ29kZSwgZ2VuZXJhdGVDcmVhdGVDb2RlIH0gZnJvbSBcIi4vY29kZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQgeyBnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5IH0gZnJvbSBcIi4vbWlncmF0aW9uLXNldFwiO1xuaW1wb3J0IHsgUG9zdGdyZVNRTFNjaGVtYVJlYWRlciB9IGZyb20gXCIuL3Bvc3RncmVzcWwtc2NoZW1hLXJlYWRlclwiO1xuaW1wb3J0IHR5cGUgeyBDb25uU3RyaW5nLCBNaWdyYXRpb25Db2RlLCBNaWdyYXRpb25TdGF0dXMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBNaWdyYXRpb25SZXN1bHQgPSB7XG4gIGNvbm5LZXk6IHN0cmluZztcbiAgYmF0Y2hObzogbnVtYmVyO1xuICBhcHBsaWVkOiBzdHJpbmdbXTtcbn1bXTtcblxuZXhwb3J0IGNsYXNzIE1pZ3JhdG9yIHtcbiAgcHJpdmF0ZSBhc3luYyBnZXRNaWdyYXRpb25Db2RlcygpOiBQcm9taXNlPE1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIGNvbnN0IHNyY01pZ3JhdGlvbnNEaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcIm1pZ3JhdGlvbnNcIik7IC8vIOydtOqxtCDtmZjqsr3sl5Ag6rSA6rOE7JeG7J20IO2VreyDgSBzcmPsl5DshJwg7LC+7JWE7JW8IO2VtOyalC5cblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNNaWdyYXRpb25zRGlyKSkpIHtcbiAgICAgIGF3YWl0IG1rZGlyKHNyY01pZ3JhdGlvbnNEaXIsIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29kZXMgPSAoYXdhaXQgcmVhZGRpcihzcmNNaWdyYXRpb25zRGlyKSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoXCIudHNcIikpXG4gICAgICAubWFwKChmKSA9PiAoe1xuICAgICAgICBuYW1lOiBmLnJlcGxhY2UoXCIudHNcIiwgXCJcIiksXG4gICAgICAgIHBhdGg6IHBhdGguam9pbihzcmNNaWdyYXRpb25zRGlyLCBmKSxcbiAgICAgIH0pKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IChhLm5hbWUgPCBiLm5hbWUgPyAxIDogLTEpKTsgLy8g7J2066aEIOuCtOumvOywqOyInCDsoJXroKwo7LWc7Iug7IicKVxuXG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldE1pZ3JhdGlvbkNvZGVzOnJlc3VsdHNcIiwgY29kZXMpO1xuICAgIHJldHVybiBjb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiDtg4Dqsp/rs4Qg66eI7J206re466CI7J207IWYIOyDge2DnOyZgCDsvZTrk5wg7IOd7ISxL+ykgOu5hCDsg4Htg5zrpbwg6rWs7ZW07Ji164uI64ukLlxuICAgKiDsi6TsoJzroZwgRELsl5Ag7KCR6re864+EIO2VmOqzoCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvOuPhCDtmZXsnbjtlZjqs6AsXG4gICAqIO2VhOyalO2VmOuLpOuptCDsoIHsmqntlaAg7IiYIOyeiOuKlCDsvZTrk5zrpbwg7IOd7ISx6rmM7KeAIO2VtOyYteuLiOuLpC5cbiAgICpcbiAgICogQ0xJ7JmAIFNvbmFtdSBVSeyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBnZXRTdGF0dXMoKTogUHJvbWlzZTxNaWdyYXRpb25TdGF0dXM+IHtcbiAgICBjb25zdCBjb2RlcyA9IGF3YWl0IHRoaXMuZ2V0TWlncmF0aW9uQ29kZXMoKTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOmNvZGVzXCIsIGNvZGVzKTtcblxuICAgIGNvbnN0IGNvbm5LZXlzID0gT2JqZWN0LmtleXMoU29uYW11LmRiQ29uZmlnKS5maWx0ZXIoXG4gICAgICAoa2V5KSA9PiBrZXkuZW5kc1dpdGgoXCJfc2xhdmVcIikgPT09IGZhbHNlLFxuICAgICkgYXMgKGtleW9mIHR5cGVvZiBTb25hbXUuZGJDb25maWcpW107XG5cbiAgICBsZXQgbWlncmF0aW9uU3RhdHVzRXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb25uS2V5cy5tYXAoYXN5bmMgKGNvbm5LZXkpID0+IHtcbiAgICAgICAgY29uc3Qga25leE9wdGlvbnMgPSBTb25hbXUuZGJDb25maWdbY29ubktleV07XG4gICAgICAgIGNvbnN0IHRDb25uID0ga25leChrbmV4T3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRDb25uLm1pZ3JhdGUuc3RhdHVzKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBgJHtjb25uS2V5feydmCDrp4jsnbTqt7jroIjsnbTshZgg7IOB7YOc66W8IOqwgOyguOyYpOuKlCDrjbDsl5Ag7Iuk7Yyo7ZWY7JiA7Iq164uI64ukLiDrjbDsnbTthLDrsqDsnbTsiqTqsIAg7Jis67CU66W06rKMIOq1rOyEseuQmOyngCDslYrsnYAg6rKDIOqwmeyKteuLiOuLpC4g7ZmV7J247ZWY7Iuc6rOgIOuLpOyLnCDsi5zrj4TtlbTso7zshLjsmpQuXFxu7Iuc64+E7ZWcIOyXsOqysCDshKTsoJU6XFxuJHtKU09OLnN0cmluZ2lmeShrbmV4T3B0aW9ucy5jb25uZWN0aW9uLCBudWxsLCAyKX1cXG7rsJzsg53tlZwg7JeQ65+sOlxcbiR7ZXJyfVxcbmAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbWlncmF0aW9uU3RhdHVzRXJyb3IgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICAgICAgICByZXR1cm4gXCJlcnJvclwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICAgICAgY29uc3QgcGVuZGluZzogc3RyaW5nW10gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBbLCBmZExpc3RdID0gYXdhaXQgdENvbm4ubWlncmF0ZS5saXN0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmRMaXN0Lm1hcCgoZmQ6IHsgZmlsZTogc3RyaW5nIH0pID0+IGZkLmZpbGUucmVwbGFjZShcIi50c1wiLCBcIlwiKSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBtaWdyYXRpb25TdGF0dXNFcnJvciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRDb25uLm1pZ3JhdGUuY3VycmVudFZlcnNpb24oKTtcbiAgICAgICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgICBtaWdyYXRpb25TdGF0dXNFcnJvciA9IF9lcnIgaW5zdGFuY2VvZiBFcnJvciA/IF9lcnIubWVzc2FnZSA6IFN0cmluZyhfZXJyKTtcbiAgICAgICAgICAgIHJldHVybiBcImVycm9yXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgICAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOnN0YXR1c1wiLCBzdGF0dXMpO1xuXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBrbmV4T3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuXG4gICAgICAgIGF3YWl0IHRDb25uLmRlc3Ryb3koKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IGNvbm5LZXkucmVwbGFjZShcIl9tYXN0ZXJcIiwgXCJcIiksXG4gICAgICAgICAgY29ubktleSxcbiAgICAgICAgICBjb25uU3RyaW5nOiBgcGc6Ly8ke2Nvbm5lY3Rpb24udXNlciA/PyBcIlwifUAke2Nvbm5lY3Rpb24uaG9zdH06JHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ucG9ydFxuICAgICAgICAgIH0vJHtjb25uZWN0aW9uLmRhdGFiYXNlfWAgYXMgQ29ublN0cmluZyxcbiAgICAgICAgICBjdXJyZW50VmVyc2lvbixcbiAgICAgICAgICBzdGF0dXM6IHN0YXR1cyBhcyBudW1iZXIgfCBcImVycm9yXCIsXG4gICAgICAgICAgcGVuZGluZyxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOmNvbm5zXCIsIHN0YXR1c2VzKTtcblxuICAgIGNvbnN0IHByZXBhcmVkQ29kZXM6IEdlbk1pZ3JhdGlvbkNvZGVbXSA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXMwY29ubiA9IHN0YXR1c2VzLmZpbmQoKHN0YXR1cykgPT4gc3RhdHVzLnN0YXR1cyA9PT0gMCk7XG4gICAgICBpZiAoc3RhdHVzMGNvbm4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgYFdoaWxlIHRyeWluZyB0byBwcmVwYXJlIG1pZ3JhdGlvbiBjb2Rlcywgd2UgZm91bmQgdGhhdCB0aGVyZSBpcyBubyBkYXRhYmFzZSB0byBjb21wYXJlIG1pZ3JhdGlvbnMuIFdlIG5lZWQgYXQgbGVhc3Qgb25lIGRhdGFiYXNlIHdoZXJlIGV2ZXJ5IG1pZ3JhdGlvbiBpcyBhcHBsaWVkKHN0YXR1cyA9PT0gMCkuIFlvdSBtaWdodCB3YW50IHRvIGFwcGx5IHlvdXIgZXhpc3RpbmcgbWlncmF0aW9ucyB0byBvbmUgb2YgdGhlIGRhdGFiYXNlcy5gLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29tcGFyZURCY29ubiA9IGtuZXgoU29uYW11LmRiQ29uZmlnW3N0YXR1czBjb25uLmNvbm5LZXldKTtcbiAgICAgIGNvbnN0IGdlbkNvZGVzID0gYXdhaXQgdGhpcy5jb21wYXJlTWlncmF0aW9ucyhjb21wYXJlREJjb25uKTtcblxuICAgICAgYXdhaXQgY29tcGFyZURCY29ubi5kZXN0cm95KCk7XG5cbiAgICAgIHJldHVybiBnZW5Db2RlcztcbiAgICB9KSgpO1xuXG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpwcmVwYXJlZENvZGVzXCIsIHByZXBhcmVkQ29kZXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbm5zOiBzdGF0dXNlcyxcbiAgICAgIGNvZGVzLFxuICAgICAgcHJlcGFyZWRDb2RlcyxcbiAgICAgIGVycm9yOiBtaWdyYXRpb25TdGF0dXNFcnJvcixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOuniOydtOq3uOugiOydtOyFmOydhCDsoIHsmqntlZjqsbDrgpgg66Gk67Cx7ZWp64uI64ukLlxuICAgKiBTb25hbXUgVUnsl5DshJwg66eI7J206re466CI7J207IWYIOyekeyXheydhCDsiJjtlontlaAg65WMIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICogQ0xJ7JmAIFNvbmFtdSBVSeyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBhY3Rpb24g7J6R7JeFIOycoO2YlSAoYXBwbHkvcm9sbGJhY2spXG4gICAqIEBwYXJhbSB0YXJnZXRzIOyekeyXhSDrjIDsg4EgREIg7ISk7KCVIO2CpCAoa2V5b2YgU29uYW11REJDb25maWcpXG4gICAqIEByZXR1cm5zIOyekeyXhSDqsrDqs7xcbiAgICovXG4gIGFzeW5jIHJ1bkFjdGlvbihcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgICB0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW10sXG4gICk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjphY3Rpb25cIiwgYWN0aW9uKTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6cnVuQWN0aW9uOnRhcmdldHNcIiwgdGFyZ2V0cyk7XG5cbiAgICAvLyBnZXQgdW5pcSBrbmV4IGNvbmZpZ3NcbiAgICBjb25zdCBjb25maWdzID0gdW5pcXVlKFxuICAgICAgdGFyZ2V0c1xuICAgICAgICAubWFwKCh0YXJnZXQpID0+ICh7XG4gICAgICAgICAgY29ubktleTogdGFyZ2V0LFxuICAgICAgICAgIG9wdGlvbnM6IFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXQgYXMga2V5b2YgdHlwZW9mIFNvbmFtdS5kYkNvbmZpZ10sXG4gICAgICAgIH0pKVxuICAgICAgICAuZmlsdGVyKChjKSA9PiBjLm9wdGlvbnMgIT09IHVuZGVmaW5lZCksXG4gICAgICAoeyBvcHRpb25zIH0pID0+XG4gICAgICAgIGAkeyhvcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcpLmhvc3R9OiR7XG4gICAgICAgICAgKG9wdGlvbnMuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZykucG9ydCA/PyA1NDMyXG4gICAgICAgIH0vJHsob3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnKS5kYXRhYmFzZX1gLFxuICAgICk7XG5cbiAgICAvLyBnZXQgY29ubmVjdGlvbnNcbiAgICBjb25zdCBjb25ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgY29uZmlncy5tYXAoYXN5bmMgKGNvbmZpZykgPT4gKHtcbiAgICAgICAgY29ubktleTogY29uZmlnLmNvbm5LZXksXG4gICAgICAgIGtuZXg6IGtuZXgoY29uZmlnLm9wdGlvbnMpLFxuICAgICAgfSkpLFxuICAgICk7XG5cbiAgICAvLyBhY3Rpb25cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgY2FzZSBcImFwcGx5XCI6XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgY29ubnMubWFwKGFzeW5jICh7IGNvbm5LZXksIGtuZXggfSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBbYmF0Y2hObywgYXBwbGllZF0gPSBhd2FpdCBrbmV4Lm1pZ3JhdGUubGF0ZXN0KCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29ubktleSxcbiAgICAgICAgICAgICAgICBiYXRjaE5vLFxuICAgICAgICAgICAgICAgIGFwcGxpZWQsIC8vIOydtOuyiCBsYXRlc3Qg7Zi47Lac66GcIOyduO2VtCBcInVwXCLsnbQg7KCB7Jqp65CcIOuniOydtOq3uOugiOydtOyFmCDsnbTrpoQoZS5nLiBcIjIwMjUxMTI0MjMzNTU3X2NyZWF0ZV9fY29tcGFuaWVzLnRzXCIp65Ok7J2YIOuwsOyXtOyeheuLiOuLpC4g7LC46rOgOiBodHRwczovL2dpdGh1Yi5jb20va25leC9rbmV4L2Jsb2IvMDFiMTc3YzQ4NWQ2OTZmMWI3Mjg1OGRlZTcyOGJhMTQzYzRmYWQ3Ni9saWIvbWlncmF0aW9ucy9taWdyYXRlL01pZ3JhdG9yLmpzI0w1NjBcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgXCJyb2xsYmFja1wiOlxuICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIGNvbm5zLm1hcChhc3luYyAoeyBjb25uS2V5LCBrbmV4IH0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgW2JhdGNoTm8sIGFwcGxpZWRdID0gYXdhaXQga25leC5taWdyYXRlLnJvbGxiYWNrKCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29ubktleSxcbiAgICAgICAgICAgICAgICBiYXRjaE5vLFxuICAgICAgICAgICAgICAgIGFwcGxpZWQsIC8vIOydtOuyiCByb2xsYmFjayDtmLjstpzroZwg7J247ZW0IFwiZG93blwi7J20IOyggeyaqeuQnCg966Gk67Cx65CcKSDrp4jsnbTqt7jroIjsnbTshZgg7J2066aEKGUuZy4gXCIyMDI1MTEyNDIzMzU1N19jcmVhdGVfX2NvbXBhbmllcy50c1wiKeuTpOydmCDrsLDsl7TsnoXri4jri6QuIOywuOqzoDogaHR0cHM6Ly9naXRodWIuY29tL2tuZXgva25leC9ibG9iLzAxYjE3N2M0ODVkNjk2ZjFiNzI4NThkZWU3MjhiYTE0M2M0ZmFkNzYvbGliL21pZ3JhdGlvbnMvbWlncmF0ZS9NaWdyYXRvci5qcyNMNjExXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICAvLyBkZXN0cm95XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb25ucy5tYXAoKHsga25leCB9KSA9PiB7XG4gICAgICAgIHJldHVybiBrbmV4LmRlc3Ryb3koKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBOYWl0ZS50KFwibWlncmF0b3I6cnVuQWN0aW9uOnJlc3VsdFwiLCByZXN1bHQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsgq3soJwg6rCA64ql7ZWcIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J287J2EIOqygOymne2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGNvbm5zIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5wg67Cw7Je0XG4gICAqIEBwYXJhbSBjb2RlTmFtZXMg7IKt7KCc7ZWgIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOydtOumhCDrsLDsl7RcbiAgICogQHJldHVybnMg7IKt7KCcIOqwgOuKpSDsl6zrtoAg67CPIOyggeyaqeuQnCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvCDsnbTrpoRcbiAgICovXG4gIHZhbGlkYXRlRGVsZXRhYmxlKGNvbm5zOiBNaWdyYXRpb25TdGF0dXNbXCJjb25uc1wiXSwgY29kZU5hbWVzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IGFwcGxpZWRDb2RlcyA9IGNvZGVOYW1lcy5maWx0ZXIoKGNvZGVOYW1lKSA9PlxuICAgICAgY29ubnMuc29tZSgoY29ubikgPT4gY29ubi5wZW5kaW5nLmluY2x1ZGVzKGNvZGVOYW1lKSA9PT0gZmFsc2UpLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2FuRGVsZXRlOiBhcHBsaWVkQ29kZXMubGVuZ3RoID09PSAwLFxuICAgICAgYXBwbGllZENvZGVzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbzsnYQg7IKt7KCc7ZWp64uI64ukLlxuICAgKlxuICAgKiBTb25hbXUgVUnsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gY29kZU5hbWVzIOyCreygnO2VoCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvCDsnbTrpoQg67Cw7Je0XG4gICAqIEByZXR1cm5zIOyCreygnOuQnCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvCDqsJzsiJhcbiAgICovXG4gIGFzeW5jIGRlbENvZGVzKGNvZGVOYW1lczogc3RyaW5nW10pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY29ubnMgfSA9IGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCk7XG4gICAgY29uc3QgeyBjYW5EZWxldGUsIGFwcGxpZWRDb2RlcyB9ID0gdGhpcy52YWxpZGF0ZURlbGV0YWJsZShjb25ucywgY29kZU5hbWVzKTtcbiAgICBpZiAoIWNhbkRlbGV0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgWW91IGNhbm5vdCBkZWxldGUgYSBtaWdyYXRpb24gZmlsZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGFwcGxpZWQuIEFwcGxpZWQgY29kZXM6ICR7YXBwbGllZENvZGVzLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VtKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGNvZGVOYW1lcy5tYXAoYXN5bmMgKGNvZGVOYW1lKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy9taWdyYXRpb25zLyR7Y29kZU5hbWV9LnRzYDtcbiAgICAgICAgICBpZiAoYXdhaXQgZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgYXdhaXQgdW5saW5rKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdlbkRhdGVUYWcoaW5kZXg6IG51bWJlciwgYmFzZURhdGU6IERhdGUgPSBuZXcgRGF0ZSgpKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoYmFzZURhdGUuZ2V0VGltZSgpICsgaW5kZXggKiAxMDAwKTtcbiAgICBjb25zdCBwYWQgPSAobnVtOiBudW1iZXIsIHNpemU6IG51bWJlciA9IDIpID0+IG51bS50b1N0cmluZygpLnBhZFN0YXJ0KHNpemUsIFwiMFwiKTtcbiAgICByZXR1cm4gKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkgK1xuICAgICAgcGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpICtcbiAgICAgIHBhZChkYXRlLmdldERhdGUoKSkgK1xuICAgICAgcGFkKGRhdGUuZ2V0SG91cnMoKSkgK1xuICAgICAgcGFkKGRhdGUuZ2V0TWludXRlcygpKSArXG4gICAgICBwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvOydhCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdSBVSeyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvCDqsJzsiJhcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlUHJlcGFyZWRDb2RlcygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgcHJlcGFyZWRDb2RlcyB9ID0gYXdhaXQgdGhpcy5nZXRTdGF0dXMoKTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2VuZXJhdGVQcmVwYXJlZENvZGVzOnByZXBhcmVkQ29kZXNcIiwgcHJlcGFyZWRDb2Rlcyk7XG4gICAgaWYgKHByZXBhcmVkQ29kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlxcbu2YhOyerCDrqqjrkZAg7Iux7YGs65CcIOyDge2DnOyeheuLiOuLpC5cIikpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8g7Iuk7KCcIOy9lOuTnCDsg53shLFcbiAgICBjb25zdCBtaWdyYXRpb25zRGlyID0gYCR7U29uYW11LmFwaVJvb3RQYXRofS9zcmMvbWlncmF0aW9uc2A7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgcGNvZGVdIG9mIHByZXBhcmVkQ29kZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAocGNvZGUuZm9ybWF0dGVkKSB7XG4gICAgICAgIGNvbnN0IGRhdGVUYWcgPSB0aGlzLmdlbkRhdGVUYWcoaW5kZXgpO1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke21pZ3JhdGlvbnNEaXJ9LyR7ZGF0ZVRhZ31fJHtwY29kZS50aXRsZX0udHNgO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIHBjb2RlLmZvcm1hdHRlZCk7XG4gICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgTUlHUlRBSU9OIENSRUFURUQgJHtmaWxlUGF0aH1gKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXBhcmVkQ29kZXMubGVuZ3RoO1xuICB9XG5cbiAgYXN5bmMgY29tcGFyZU1pZ3JhdGlvbnMoY29tcGFyZURCOiBLbmV4KTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgICAvLyBFbnRpdHkg7Iic7ZqM7ZWY7JesIOyLse2BrFxuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJQg7Y+s7ZWo7ZWY7JesIEVudGl0eeyXkOyEnCBNaWdyYXRpb25TZXQg7LaU7LacXG4gICAgY29uc3QgZW50aXR5U2V0c1dpdGhKb2luVGFibGUgPSBlbnRpdHlJZHNcbiAgICAgIC5maWx0ZXIoKGVudGl0eUlkKSA9PiBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMubGVuZ3RoID4gMClcbiAgICAgIC5tYXAoKGVudGl0eUlkKSA9PiBnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5KEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKSkpO1xuXG4gICAgLy8g7KGw7J247YWM7J2067iU66eMIOy2lOy2nFxuICAgIGNvbnN0IGpvaW5UYWJsZXNXaXRoRHVwID0gZW50aXR5U2V0c1dpdGhKb2luVGFibGUuZmxhdE1hcCgoZW50aXR5U2V0KSA9PiBlbnRpdHlTZXQuam9pblRhYmxlcyk7XG4gICAgLy8g7KSR67O1IOygnOqxsCAo7KSR67O17J24IOqyveyasCBpbmRleGVz66W8IOuzke2VqSlcbiAgICBjb25zdCBqb2luVGFibGVzID0gT2JqZWN0LnZhbHVlcyhncm91cChqb2luVGFibGVzV2l0aER1cCwgKGp0KSA9PiBqdC50YWJsZSkpLm1hcCgodGFibGVzKSA9PiB7XG4gICAgICBhc3NlcnQodGFibGVzICE9PSB1bmRlZmluZWQsIFwidGFibGVzIGlzIHVuZGVmaW5lZFwiKTtcbiAgICAgIGlmICh0YWJsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0YWJsZXNbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50YWJsZXNbMF0sXG4gICAgICAgIGluZGV4ZXM6IHVuaXF1ZShcbiAgICAgICAgICB0YWJsZXMuZmxhdE1hcCgodCkgPT4gdC5pbmRleGVzKSxcbiAgICAgICAgICAoaW5kZXgpID0+IFtpbmRleC50eXBlLCAuLi5pbmRleC5jb2x1bW5zXS5qb2luKFwiLVwiKSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJQg7Y+s7ZWo7ZWY7JesIE1pZ3JhdGlvblNldCDrsLDsl7RcbiAgICBjb25zdCBlbnRpdHlTZXRzOiBNaWdyYXRpb25TZXRbXSA9IFsuLi5lbnRpdHlTZXRzV2l0aEpvaW5UYWJsZSwgLi4uam9pblRhYmxlc107XG5cbiAgICBjb25zdCBjb2RlczogR2VuTWlncmF0aW9uQ29kZVtdID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGVudGl0eVNldHMubWFwKGFzeW5jIChlbnRpdHlTZXQpID0+IHtcbiAgICAgICAgICBjb25zdCBkYlNldCA9IGF3YWl0IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIuZ2V0TWlncmF0aW9uU2V0RnJvbURCKFxuICAgICAgICAgICAgY29tcGFyZURCLFxuICAgICAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgTmFpdGUudChgbWlncmF0b3I6Y29tcGFyZU1pZ3JhdGlvbnM6ZW50aXR5U2V0OiR7ZW50aXR5U2V0LnRhYmxlfWAsIGVudGl0eVNldCk7XG4gICAgICAgICAgTmFpdGUudChgbWlncmF0b3I6Y29tcGFyZU1pZ3JhdGlvbnM6ZGJTZXQ6JHtlbnRpdHlTZXQudGFibGV9YCwgZGJTZXQpO1xuXG4gICAgICAgICAgaWYgKGRiU2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyDquLDsobQg7YWM7J2067iUIOyXhuydjCwg7IOI66GcIO2FjOydtOu4lCDsg53shLFcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZUNyZWF0ZUNvZGUoZW50aXR5U2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g6riw7KG0IO2FjOydtOu4lCDsobTsnqztlZjripQg7LyA7J207IqkXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVBbHRlckNvZGUoZW50aXR5U2V0LCBkYlNldCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICApLmZsYXQoKTtcblxuICAgIC8vIG5vcm1hbCDtg4DsnoXsnbQg7JWe7Jy866GcLCBmb3JlaWdu7J20IOuSpOuhnFxuICAgIGNvZGVzLnNvcnQoKGNvZGVBLCBjb2RlQikgPT4ge1xuICAgICAgaWYgKGNvZGVBLnR5cGUgPT09IFwiZm9yZWlnblwiICYmIGNvZGVCLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKGNvZGVBLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgY29kZUIudHlwZSA9PT0gXCJmb3JlaWduXCIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICogU2hhZG93IERCIO2FjOyKpO2KuOulvCDsp4Ttlontlanri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdSBVSeyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIEByZXR1cm5zIFNoYWRvdyBEQiDthYzsiqTtirgg6rKw6rO8XG4gICAqL1xuICBhc3luYyBydW5TaGFkb3dUZXN0KCk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgdGRiQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG4gICAgY29uc3Qgc2hhZG93RGF0YWJhc2UgPSBgJHt0ZGJDb25uLmRhdGFiYXNlfV9fbWlncmF0aW9uX3NoYWRvd2A7XG5cbiAgICAvLyDthYzsiqTtirgg7IOB7Zmp7JeQ7ISc64qUIO2KuOuenOyereyFmOydhCDstIjquLDtmZTtlZjqs6AsIOyDiCDrjbDsnbTthLDrsqDsnbTsiqQg7Luk64Sl7IWY7J2EIOqwgOyguOyZgOyVvCDtlahcbiAgICBpZiAoaXNUZXN0KCkpIHtcbiAgICAgIGF3YWl0IERCLmNsZWFyVGVzdFRyYW5zYWN0aW9uKCk7XG4gICAgICBhd2FpdCBEQi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLy8g6riw7KG0IFNoYWRvdyBEQiDsgq3soJwg7ZuEIFNoYWRvdyBEQiDsg53shLFcbiAgICBjb25zdCB0ZGIgPSBrbmV4KFNvbmFtdS5kYkNvbmZpZy50ZXN0KTtcbiAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsubWFnZW50YShgJHtzaGFkb3dEYXRhYmFzZX0g7IKt7KCcYCkpO1xuICAgIGF3YWl0IHRkYi5yYXcoYERST1AgREFUQUJBU0UgSUYgRVhJU1RTICR7c2hhZG93RGF0YWJhc2V9YCk7XG4gICAgYXdhaXQgdGRiLnJhdyhgXG4gICAgICBTRUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQocGdfc3RhdF9hY3Rpdml0eS5waWQpXG4gICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgIFdIRVJFIGRhdG5hbWUgPSAnJHt0ZGJDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgQU5EIHBpZCA8PiBwZ19iYWNrZW5kX3BpZCgpO1xuICAgIGApO1xuICAgIGF3YWl0IHRkYi5yYXcoYENSRUFURSBEQVRBQkFTRSAke3NoYWRvd0RhdGFiYXNlfSBURU1QTEFURSAke3RkYkNvbm4uZGF0YWJhc2V9YCk7XG5cbiAgICAvLyBTaGFkb3cgRELsl5Ag7Jew6rKwXG4gICAgY29uc3Qgc2RiID0ga25leCh7XG4gICAgICAuLi5Tb25hbXUuZGJDb25maWcudGVzdCxcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgLi4udGRiQ29ubixcbiAgICAgICAgZGF0YWJhc2U6IHNoYWRvd0RhdGFiYXNlLFxuICAgICAgICBwYXNzd29yZDogdGRiQ29ubi5wYXNzd29yZCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBzaGFkb3cgREIg7YWM7Iqk7Yq4IOynhO2WiVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBbYmF0Y2hObywgYXBwbGllZF0gPSBhd2FpdCBzZGIubWlncmF0ZS5sYXRlc3QoKTtcbiAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlNoYWRvdyBEQiDthYzsiqTtirjsl5Ag7ISx6rO17ZaI7Iq164uI64ukIVwiKSwge1xuICAgICAgICAgIGJhdGNoTm8sXG4gICAgICAgICAgYXBwbGllZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb25uS2V5OiBcInNoYWRvd1wiLFxuICAgICAgICAgIGJhdGNoTm8sXG4gICAgICAgICAgYXBwbGllZCxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIHRocm93IG5ldyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oXCJTaGFkb3cgREIg7YWM7Iqk7Yq4IOynhO2WiSDspJEg7JeQ65+sXCIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBTaGFkb3cgREIg7Jew6rKwIOyiheujjFxuICAgICAgYXdhaXQgc2RiLmRlc3Ryb3koKTtcblxuICAgICAgLy8gU2hhZG93IERCIOyCreygnFxuICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGEoYCR7c2hhZG93RGF0YWJhc2V9IOyCreygnGApKTtcbiAgICAgIGF3YWl0IHRkYi5yYXcoYERST1AgREFUQUJBU0UgSUYgRVhJU1RTICR7c2hhZG93RGF0YWJhc2V9YCk7XG5cbiAgICAgIC8vIFRlc3QgREIg7Jew6rKwIOyiheujjFxuICAgICAgYXdhaXQgdGRiLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJjaGFsayIsIm1rZGlyIiwicmVhZGRpciIsInVubGluayIsIndyaXRlRmlsZSIsImtuZXgiLCJwYXRoIiwiZ3JvdXAiLCJzdW0iLCJ1bmlxdWUiLCJTb25hbXUiLCJEQiIsIkVudGl0eU1hbmFnZXIiLCJTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24iLCJOYWl0ZSIsImlzVGVzdCIsImV4aXN0cyIsImdlbmVyYXRlQWx0ZXJDb2RlIiwiZ2VuZXJhdGVDcmVhdGVDb2RlIiwiZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eSIsIlBvc3RncmVTUUxTY2hlbWFSZWFkZXIiLCJNaWdyYXRvciIsImdldE1pZ3JhdGlvbkNvZGVzIiwic3JjTWlncmF0aW9uc0RpciIsImpvaW4iLCJhcGlSb290UGF0aCIsInJlY3Vyc2l2ZSIsImNvZGVzIiwiZmlsdGVyIiwiZiIsImVuZHNXaXRoIiwibWFwIiwibmFtZSIsInJlcGxhY2UiLCJzb3J0IiwiYSIsImIiLCJ0IiwiZ2V0U3RhdHVzIiwiY29ubktleXMiLCJPYmplY3QiLCJrZXlzIiwiZGJDb25maWciLCJrZXkiLCJtaWdyYXRpb25TdGF0dXNFcnJvciIsInN0YXR1c2VzIiwiUHJvbWlzZSIsImFsbCIsImNvbm5LZXkiLCJrbmV4T3B0aW9ucyIsInRDb25uIiwic3RhdHVzIiwibWlncmF0ZSIsImVyciIsImNvbnNvbGUiLCJ3YXJuIiwieWVsbG93IiwiSlNPTiIsInN0cmluZ2lmeSIsImNvbm5lY3Rpb24iLCJFcnJvciIsIm1lc3NhZ2UiLCJTdHJpbmciLCJwZW5kaW5nIiwiZmRMaXN0IiwibGlzdCIsImZkIiwiZmlsZSIsImN1cnJlbnRWZXJzaW9uIiwiX2VyciIsImRlc3Ryb3kiLCJjb25uU3RyaW5nIiwidXNlciIsImhvc3QiLCJwb3J0IiwiZGF0YWJhc2UiLCJwcmVwYXJlZENvZGVzIiwic3RhdHVzMGNvbm4iLCJmaW5kIiwidW5kZWZpbmVkIiwiY29tcGFyZURCY29ubiIsImdlbkNvZGVzIiwiY29tcGFyZU1pZ3JhdGlvbnMiLCJjb25ucyIsImVycm9yIiwicnVuQWN0aW9uIiwiYWN0aW9uIiwidGFyZ2V0cyIsImNvbmZpZ3MiLCJ0YXJnZXQiLCJvcHRpb25zIiwiYyIsImNvbmZpZyIsInJlc3VsdCIsImJhdGNoTm8iLCJhcHBsaWVkIiwibGF0ZXN0Iiwicm9sbGJhY2siLCJ2YWxpZGF0ZURlbGV0YWJsZSIsImNvZGVOYW1lcyIsImFwcGxpZWRDb2RlcyIsImNvZGVOYW1lIiwic29tZSIsImNvbm4iLCJpbmNsdWRlcyIsImNhbkRlbGV0ZSIsImxlbmd0aCIsImRlbENvZGVzIiwiZmlsZVBhdGgiLCJnZW5EYXRlVGFnIiwiaW5kZXgiLCJiYXNlRGF0ZSIsIkRhdGUiLCJkYXRlIiwiZ2V0VGltZSIsInBhZCIsIm51bSIsInNpemUiLCJ0b1N0cmluZyIsInBhZFN0YXJ0IiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZ2VuZXJhdGVQcmVwYXJlZENvZGVzIiwibG9nIiwiZ3JlZW4iLCJtaWdyYXRpb25zRGlyIiwicGNvZGUiLCJlbnRyaWVzIiwiZm9ybWF0dGVkIiwiZGF0ZVRhZyIsInRpdGxlIiwiY29tcGFyZURCIiwiZW50aXR5SWRzIiwiZ2V0QWxsSWRzIiwiZW50aXR5U2V0c1dpdGhKb2luVGFibGUiLCJlbnRpdHlJZCIsImdldCIsInByb3BzIiwiam9pblRhYmxlc1dpdGhEdXAiLCJmbGF0TWFwIiwiZW50aXR5U2V0Iiwiam9pblRhYmxlcyIsInZhbHVlcyIsImp0IiwidGFibGUiLCJ0YWJsZXMiLCJpbmRleGVzIiwidHlwZSIsImNvbHVtbnMiLCJlbnRpdHlTZXRzIiwiZGJTZXQiLCJnZXRNaWdyYXRpb25TZXRGcm9tREIiLCJmbGF0IiwiY29kZUEiLCJjb2RlQiIsInJ1blNoYWRvd1Rlc3QiLCJ0ZGJDb25uIiwidGVzdCIsInNoYWRvd0RhdGFiYXNlIiwiY2xlYXJUZXN0VHJhbnNhY3Rpb24iLCJ0ZGIiLCJtYWdlbnRhIiwicmF3Iiwic2RiIiwicGFzc3dvcmQiLCJlIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVNDLEtBQUssRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUNoRSxPQUFPQyxVQUF5QixPQUFPO0FBQ3ZDLE9BQU9DLFVBQVUsT0FBTztBQUN4QixTQUFTQyxLQUFLLEVBQUVDLEdBQUcsRUFBRUMsTUFBTSxRQUFRLFVBQVU7QUFDN0MsU0FBU0MsTUFBTSxRQUFRLGtCQUFTO0FBQ2hDLFNBQVNDLEVBQUUsUUFBNkIsb0JBQWlCO0FBQ3pELFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FBU0MsMkJBQTJCLFFBQVEsaUNBQThCO0FBQzFFLFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFFdkMsU0FBU0MsTUFBTSxRQUFRLHlCQUFzQjtBQUM3QyxTQUFTQyxNQUFNLFFBQVEsdUJBQW9CO0FBQzNDLFNBQVNDLGlCQUFpQixFQUFFQyxrQkFBa0IsUUFBUSx1QkFBb0I7QUFDMUUsU0FBU0MseUJBQXlCLFFBQVEscUJBQWtCO0FBQzVELFNBQVNDLHNCQUFzQixRQUFRLGdDQUE2QjtBQVNwRSxPQUFPLE1BQU1DO0lBQ1gsTUFBY0Msb0JBQThDO1FBQzFELE1BQU1DLG1CQUFtQmpCLEtBQUtrQixJQUFJLENBQUNkLE9BQU9lLFdBQVcsRUFBRSxPQUFPLGVBQWUsK0JBQStCO1FBRTVHLElBQUksQ0FBRSxNQUFNVCxPQUFPTyxtQkFBb0I7WUFDckMsTUFBTXRCLE1BQU1zQixrQkFBa0I7Z0JBQzVCRyxXQUFXO1lBQ2I7UUFDRjtRQUVBLE1BQU1DLFFBQVEsQUFBQyxDQUFBLE1BQU16QixRQUFRcUIsaUJBQWdCLEVBQzFDSyxNQUFNLENB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
|
|
@@ -9,6 +9,8 @@ export type PgColumn = {
|
|
|
9
9
|
numeric_scale: number | null;
|
|
10
10
|
is_nullable: string;
|
|
11
11
|
column_default: string | null;
|
|
12
|
+
is_generated: string;
|
|
13
|
+
generation_expression: string | null;
|
|
12
14
|
};
|
|
13
15
|
type PgIndex = {
|
|
14
16
|
index_name: string;
|
|
@@ -16,6 +18,9 @@ type PgIndex = {
|
|
|
16
18
|
is_unique: boolean;
|
|
17
19
|
is_primary: boolean;
|
|
18
20
|
index_type: string;
|
|
21
|
+
nulls_first: boolean;
|
|
22
|
+
sort_order: "ASC" | "DESC";
|
|
23
|
+
nulls_not_distinct: boolean;
|
|
19
24
|
};
|
|
20
25
|
type PgForeign = {
|
|
21
26
|
constraint_name: string;
|
|
@@ -41,10 +46,15 @@ declare class PostgreSQLSchemaReaderClass {
|
|
|
41
46
|
* 기존 테이블 읽어서 cols, indexes, foreigns 반환
|
|
42
47
|
*/
|
|
43
48
|
readTable(compareDB: Knex, tableName: string): Promise<[PgColumn[], PgIndex[], PgForeign[]]>;
|
|
49
|
+
/**
|
|
50
|
+
* vector 컬럼의 dimensions를 조회합니다.
|
|
51
|
+
* pg_attribute의 atttypmod에서 차원 수를 추출합니다.
|
|
52
|
+
*/
|
|
53
|
+
private getVectorDimensions;
|
|
44
54
|
/**
|
|
45
55
|
* PostgreSQL 컬럼 타입을 분석하여 MigrationColumn 객체로 변환합니다.
|
|
46
56
|
*/
|
|
47
|
-
resolveDBColType(dbColumn: PgColumn): Pick<MigrationColumn, "type" | "length" | "precision" | "scale" | "numberType">;
|
|
57
|
+
resolveDBColType(dbColumn: PgColumn): Pick<MigrationColumn, "type" | "length" | "precision" | "scale" | "numberType" | "dimensions">;
|
|
48
58
|
}
|
|
49
59
|
export declare const PostgreSQLSchemaReader: PostgreSQLSchemaReaderClass;
|
|
50
60
|
export {};
|
|
@@ -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;
|
|
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;IAwHzF;;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"}
|