sonamu 0.10.7 → 0.10.9

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 (79) hide show
  1. package/dist/api/decorators.d.ts.map +1 -1
  2. package/dist/api/decorators.js +5 -12
  3. package/dist/bin/cli.js +10 -253
  4. package/dist/database/base-model.d.ts +1 -0
  5. package/dist/database/base-model.d.ts.map +1 -1
  6. package/dist/database/base-model.js +14 -8
  7. package/dist/database/db.d.ts +2 -1
  8. package/dist/database/db.d.ts.map +1 -1
  9. package/dist/database/db.js +13 -3
  10. package/dist/database/puri-wrapper.d.ts.map +1 -1
  11. package/dist/database/puri-wrapper.js +4 -11
  12. package/dist/database/transaction-context.d.ts +8 -3
  13. package/dist/database/transaction-context.d.ts.map +1 -1
  14. package/dist/database/transaction-context.js +12 -7
  15. package/dist/migration/code-generation.js +2 -2
  16. package/dist/naite/naite-reporter.d.ts +8 -3
  17. package/dist/naite/naite-reporter.d.ts.map +1 -1
  18. package/dist/naite/naite-reporter.js +9 -4
  19. package/dist/ui-web/assets/{index-D0MHYbxl.js → index-CJf8uJYf.js} +47 -41
  20. package/dist/ui-web/assets/index-GMMIVGja.css +1 -0
  21. package/dist/ui-web/index.html +2 -2
  22. package/package.json +3 -3
  23. package/src/api/decorators.ts +11 -22
  24. package/src/bin/cli.ts +12 -375
  25. package/src/database/__tests__/transaction-scope.test.ts +227 -0
  26. package/src/database/base-model.ts +31 -6
  27. package/src/database/db.ts +17 -2
  28. package/src/database/puri-wrapper.ts +5 -22
  29. package/src/database/transaction-context.ts +14 -6
  30. package/src/migration/code-generation.ts +1 -1
  31. package/src/naite/naite-reporter.ts +8 -3
  32. package/dist/ui-web/assets/index-Dx_JX4aQ.css +0 -1
  33. package/src/skills/AGENTS.md +0 -108
  34. package/src/skills/sonamu/SKILL.md +0 -75
  35. package/src/skills/sonamu-ai-agents/SKILL.md +0 -205
  36. package/src/skills/sonamu-api/SKILL.md +0 -480
  37. package/src/skills/sonamu-auth/SKILL.md +0 -327
  38. package/src/skills/sonamu-auth/references/plugins.md +0 -310
  39. package/src/skills/sonamu-auth/references/user-id-migration-followups.md +0 -192
  40. package/src/skills/sonamu-auth/references/user-id-migration.md +0 -455
  41. package/src/skills/sonamu-config/SKILL.md +0 -203
  42. package/src/skills/sonamu-config/references/database.md +0 -452
  43. package/src/skills/sonamu-config/references/environments.md +0 -178
  44. package/src/skills/sonamu-config/references/server-options.md +0 -400
  45. package/src/skills/sonamu-entity/SKILL.md +0 -180
  46. package/src/skills/sonamu-entity/references/creation-workflow.md +0 -581
  47. package/src/skills/sonamu-entity/references/design-guides.md +0 -243
  48. package/src/skills/sonamu-entity/references/field-types.md +0 -170
  49. package/src/skills/sonamu-entity/references/relations-detail.md +0 -245
  50. package/src/skills/sonamu-entity/references/relations.md +0 -463
  51. package/src/skills/sonamu-entity/references/subset.md +0 -156
  52. package/src/skills/sonamu-fixture/SKILL.md +0 -180
  53. package/src/skills/sonamu-fixture/references/cli-usage.md +0 -439
  54. package/src/skills/sonamu-fixture/references/cone.md +0 -298
  55. package/src/skills/sonamu-frontend/SKILL.md +0 -142
  56. package/src/skills/sonamu-frontend/references/components.md +0 -323
  57. package/src/skills/sonamu-frontend/references/examples.md +0 -64
  58. package/src/skills/sonamu-frontend/references/hooks.md +0 -273
  59. package/src/skills/sonamu-frontend/references/runtime.md +0 -165
  60. package/src/skills/sonamu-frontend/references/scaffolding.md +0 -439
  61. package/src/skills/sonamu-i18n/SKILL.md +0 -287
  62. package/src/skills/sonamu-migration/SKILL.md +0 -316
  63. package/src/skills/sonamu-naite/SKILL.md +0 -266
  64. package/src/skills/sonamu-query/SKILL.md +0 -48
  65. package/src/skills/sonamu-query/references/model-patterns.md +0 -390
  66. package/src/skills/sonamu-query/references/model.md +0 -366
  67. package/src/skills/sonamu-query/references/puri.md +0 -413
  68. package/src/skills/sonamu-query/references/search.md +0 -238
  69. package/src/skills/sonamu-query/references/upsert.md +0 -324
  70. package/src/skills/sonamu-tasks/SKILL.md +0 -236
  71. package/src/skills/sonamu-testing/SKILL.md +0 -251
  72. package/src/skills/sonamu-testing/references/devrunner.md +0 -405
  73. package/src/skills/sonamu-testing/references/helpers.md +0 -185
  74. package/src/skills/sonamu-testing/references/patterns.md +0 -263
  75. package/src/skills/sonamu-testing/references/pitfalls.md +0 -588
  76. package/src/skills/sonamu-testing/references/quick-start.md +0 -285
  77. package/src/skills/sonamu-testing/references/type-safety.md +0 -172
  78. package/src/skills/sonamu-testing/references/writing-plan.md +0 -375
  79. package/src/skills/sonamu-vector/SKILL.md +0 -222
@@ -6,6 +6,11 @@
6
6
  *
7
7
  * 프로젝트별로 고유한 소켓을 사용하기 위해 sonamu.config.ts 경로의 해시를 사용합니다.
8
8
  *
9
+ * 모듈 싱글턴이지만 인스턴스는 프로세스마다 별개입니다. run/start·run/end는
10
+ * Vitest 메인 프로세스(NaiteVitestReporter 커스텀 리포터)에서, test/result는
11
+ * 각 worker 프로세스(bootstrap의 afterEach)에서 전송되므로 buffer와 소켓
12
+ * 연결을 서로 공유하지 않습니다.
13
+ *
9
14
  * fs mock 충돌을 피하기 위해 net 모듈만 사용합니다.
10
15
  */
11
16
 
@@ -24,17 +29,17 @@ declare class NaiteReporterClass {
24
29
  */
25
30
  private send;
26
31
  /**
27
- * beforeAll에서 호출합니다.
32
+ * Vitest 커스텀 리포터(NaiteVitestReporter)의 onTestRunStart에서 호출합니다.
28
33
  * 테스트 run 시작을 알립니다 (데이터 클리어 신호).
29
34
  */
30
35
  startTestRun(): Promise<void>;
31
36
  /**
32
- * afterEach에서 호출합니다.
37
+ * bootstrap()의 afterEach에서 호출합니다.
33
38
  * 테스트 케이스 결과를 traces와 함께 전송합니다.
34
39
  */
35
40
  reportTestResult(result: Omit<NaiteMessagingTypes.TestResult, "receivedAt">): Promise<void>;
36
41
  /**
37
- * afterAll에서 호출합니다.
42
+ * Vitest 커스텀 리포터(NaiteVitestReporter)의 onTestRunEnd에서 호출합니다.
38
43
  * 테스트 run 종료를 알립니다.
39
44
  */
40
45
  endTestRun(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"naite-reporter.d.ts","sourceRoot":"","sources":["../../src/naite/naite-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;;AAUH,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AA+B7D,cAAM,kBAAkB;IACtB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAE9B;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,IAAI;IAgBlB;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC;;;OAGG;IACG,gBAAgB,CACpB,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,GACzD,OAAO,CAAC,IAAI,CAAC;IAYhB;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAiBlC;AAED,eAAO,MAAM,aAAa,oBAA2B,CAAC"}
1
+ {"version":3,"file":"naite-reporter.d.ts","sourceRoot":"","sources":["../../src/naite/naite-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;;AAUH,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AA+B7D,cAAM,kBAAkB;IACtB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAE9B;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,IAAI;IAgBlB;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC;;;OAGG;IACG,gBAAgB,CACpB,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,GACzD,OAAO,CAAC,IAAI,CAAC;IAYhB;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAiBlC;AAED,eAAO,MAAM,aAAa,oBAA2B,CAAC"}
@@ -12,6 +12,11 @@ import { connect } from "net";
12
12
  *
13
13
  * 프로젝트별로 고유한 소켓을 사용하기 위해 sonamu.config.ts 경로의 해시를 사용합니다.
14
14
  *
15
+ * 모듈 싱글턴이지만 인스턴스는 프로세스마다 별개입니다. run/start·run/end는
16
+ * Vitest 메인 프로세스(NaiteVitestReporter 커스텀 리포터)에서, test/result는
17
+ * 각 worker 프로세스(bootstrap의 afterEach)에서 전송되므로 buffer와 소켓
18
+ * 연결을 서로 공유하지 않습니다.
19
+ *
15
20
  * fs mock 충돌을 피하기 위해 net 모듈만 사용합니다.
16
21
  */
17
22
  init_utils();
@@ -78,7 +83,7 @@ var NaiteReporterClass = class {
78
83
  }
79
84
  }
80
85
  /**
81
- * beforeAll에서 호출합니다.
86
+ * Vitest 커스텀 리포터(NaiteVitestReporter)의 onTestRunStart에서 호출합니다.
82
87
  * 테스트 run 시작을 알립니다 (데이터 클리어 신호).
83
88
  */
84
89
  async startTestRun() {
@@ -89,7 +94,7 @@ var NaiteReporterClass = class {
89
94
  });
90
95
  }
91
96
  /**
92
- * afterEach에서 호출합니다.
97
+ * bootstrap()의 afterEach에서 호출합니다.
93
98
  * 테스트 케이스 결과를 traces와 함께 전송합니다.
94
99
  */
95
100
  async reportTestResult(result) {
@@ -101,7 +106,7 @@ var NaiteReporterClass = class {
101
106
  });
102
107
  }
103
108
  /**
104
- * afterAll에서 호출합니다.
109
+ * Vitest 커스텀 리포터(NaiteVitestReporter)의 onTestRunEnd에서 호출합니다.
105
110
  * 테스트 run 종료를 알립니다.
106
111
  */
107
112
  async endTestRun() {
@@ -121,4 +126,4 @@ const NaiteReporter = new NaiteReporterClass();
121
126
  //#endregion
122
127
  export { NaiteReporter };
123
128
 
124
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUtcmVwb3J0ZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25haXRlL25haXRlLXJlcG9ydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTmFpdGVSZXBvcnRlclxuICpcbiAqIO2FjOyKpO2KuCDqsrDqs7zsmYAgVHJhY2Ug7KCV67O066W8IFVuaXggU29ja2V07Jy866GcIFZTIENvZGUgZXh0ZW5zaW9u7JeQIOyghOuLrO2VqeuLiOuLpC5cbiAqIGV4dGVuc2lvbuydtCB+Ly5zb25hbXUvbmFpdGUte2hhc2h9LnNvY2vsl5Ag7IaM7LyTIOyEnOuyhOulvCDsl7TslrTrkaHri4jri6QuXG4gKlxuICog7ZSE66Gc7KCd7Yq467OE66GcIOqzoOycoO2VnCDshozsvJPsnYQg7IKs7Jqp7ZWY6riwIOychO2VtCBzb25hbXUuY29uZmlnLnRzIOqyveuhnOydmCDtlbTsi5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIGZzIG1vY2sg7Lap64+M7J2EIO2UvO2VmOq4sCDsnITtlbQgbmV0IOuqqOuTiOunjCDsgqzsmqntlanri4jri6QuXG4gKi9cbi8qIG94bGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi8gLy8gTmFpdGXripQgZXhwZWN07JmAIO2YuOydke2VmOuPhOuhnSBhbnnrpbwg7ZeI7Jqp7ZWoXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSBcIm5ldFwiO1xuaW1wb3J0IHsgdHlwZSBTb2NrZXQgfSBmcm9tIFwibmV0XCI7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIE5haXRlTWVzc2FnaW5nVHlwZXMgfSBmcm9tIFwiLi9tZXNzYWdpbmctdHlwZXNcIjtcblxuLyoqXG4gKiBzb25hbXUuY29uZmlnLnRzIOqyveuhnOulvCDrsJvslYTshJwg7ZSE66Gc7KCd7Yq467OEIOqzoOycoCDtlbTsi5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICog7J217Iqk7YWQ7IWY6rO8IOuPmeydvO2VnCDrsKnsi53snLzroZwg6rOE7IKw7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvamVjdEhhc2goY29uZmlnUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJtZDVcIikudXBkYXRlKGNvbmZpZ1BhdGgpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCA4KTtcbn1cblxuLyoqXG4gKiDtmITsnqwg7ZSE66Gc7KCd7Yq47J2YIOyGjOy8kyDqsr3roZzrpbwg6rOE7IKw7ZWp64uI64ukLlxuICogU29uYW11LmFwaVJvb3RQYXRo6rCAIOyEpOygleuQnCDtm4Tsl5Ag7Zi47Lac7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0U29ja2V0UGF0aCgpOiBzdHJpbmcge1xuICAvLyBzb25hbXUuY29uZmlnLnRz7J2YIOygiOuMgCDqsr3roZwg6rOE7IKwXG4gIC8vIGFwaVJvb3RQYXRo64qUIC9wcm9qZWN0L2FwaSDtmJXtg5zsnbTqs6AsIGNvbmZpZ+uKlCAvcHJvamVjdC9hcGkvc3JjL3NvbmFtdS5jb25maWcudHPsl5Ag7J6I7J2MXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKGZpbmRBcGlSb290UGF0aCgpLCBcInNyY1wiLCBcInNvbmFtdS5jb25maWcudHNcIik7XG4gIGNvbnN0IGhhc2ggPSBnZXRQcm9qZWN0SGFzaChjb25maWdQYXRoKTtcblxuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiXG4gICAgPyBgXFxcXFxcXFwuXFxcXHBpcGVcXFxcbmFpdGUtJHtoYXNofWBcbiAgICA6IGpvaW4oaG9tZWRpcigpLCBcIi5zb25hbXVcIiwgYG5haXRlLSR7aGFzaH0uc29ja2ApO1xufVxuXG4vKipcbiAqIOyXsOqysCDsi6TtjKjqsIAg7KeA7IaN65CgIOuVjChleHRlbnNpb24g66+47Iuk7ZaJIOuTsSkgYnVmZmVy6rCAIOustO2VnO2eiCDsu6Tsp4Dsp4Ag7JWK64+E66GdXG4gKiDstZzqt7wg66mU7Iuc7KeA66eMIOydtCDqsJzsiJjrp4ztgbwg7Jyg7KeA7ZWp64uI64ukLlxuICovXG5jb25zdCBNQVhfQlVGRkVSRURfTUVTU0FHRVMgPSAxMDAwO1xuXG5jbGFzcyBOYWl0ZVJlcG9ydGVyQ2xhc3Mge1xuICBwcml2YXRlIHNvY2tldFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNvY2tldDogU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgYnVmZmVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiDshozsvJMg7Jew6rKwIOyLnOuPhFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDb25uZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3RlZCB8fCB0aGlzLnNvY2tldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgIGlmICghdGhpcy5zb2NrZXRQYXRoKSB7XG4gICAgICAgIHRoaXMuc29ja2V0UGF0aCA9IGdldFNvY2tldFBhdGgoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc29ja2V0ID0gY29ubmVjdCh0aGlzLnNvY2tldFBhdGgpO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIC8vIOuyhO2NvOyXkCDsjJPsnbgg66mU7Iuc7KeAIOyghOyGoVxuICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgIHRoaXMuc29ja2V0Py53cml0ZShtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgICAgIHJlcygpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiZXJyb3JcIiwgKGUpID0+IHtcbiAgICAgICAgLy8g7Jew6rKwIOyLpO2MqCDrrLTsi5wgKGV4dGVuc2lvbuydtCDqurzsoLjsnojsnYQg7IiYIOyeiOydjClcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgICByZWooZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOuplOyLnOyngCDsoITshqEgKOykhOuwlOq/iOycvOuhnCDqtazrtoQpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmQoZGF0YTogTmFpdGVNZXNzYWdpbmdUeXBlcy5OYWl0ZU1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtc2cgPSBgJHtKU09OLnN0cmluZ2lmeShkYXRhKX1cXG5gO1xuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKCkuY2F0Y2goKF8pID0+IHt9KTtcblxuICAgIGlmICh0aGlzLmNvbm5lY3RlZCAmJiB0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5zb2NrZXQud3JpdGUobXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7Jew6rKwIOuMgOq4sCDspJHsnbTrqbQg67KE7Y287JeQIOyggOyepSwg7IOB7ZWcIOy0iOqzvCDsi5wg7Jik656Y65CcIOuplOyLnOyngOu2gO2EsCDtj5DquLBcbiAgICAgIHRoaXMuYnVmZmVyLnB1c2gobXNnKTtcbiAgICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPiBNQVhfQlVGRkVSRURfTUVTU0FHRVMpIHtcbiAgICAgICAgdGhpcy5idWZmZXIuc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmVmb3JlQWxs7JeQ7IScIO2YuOy2nO2VqeuLiOuLpC5cbiAgICog7YWM7Iqk7Yq4IHJ1biDsi5zsnpHsnYQg7JWM66a964uI64ukICjrjbDsnbTthLAg7YG066as7Ja0IOyLoO2YuCkuXG4gICAqL1xuICBhc3luYyBzdGFydFRlc3RSdW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkNJKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgIHR5cGU6IFwicnVuL3N0YXJ0XCIsXG4gICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZnRlckVhY2jsl5DshJwg7Zi47Lac7ZWp64uI64ukLlxuICAgKiDthYzsiqTtirgg7LyA7J207IqkIOqysOqzvOulvCB0cmFjZXPsmYAg7ZWo6ruYIOyghOyGoe2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHJlcG9ydFRlc3RSZXN1bHQoXG4gICAgcmVzdWx0OiBPbWl0PE5haXRlTWVzc2FnaW5nVHlwZXMuVGVzdFJlc3VsdCwgXCJyZWNlaXZlZEF0XCI+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgdHlwZTogXCJ0ZXN0L3Jlc3VsdFwiLFxuICAgICAgcmVjZWl2ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgLi4ucmVzdWx0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGFmdGVyQWxs7JeQ7IScIO2YuOy2nO2VqeuLiOuLpC5cbiAgICog7YWM7Iqk7Yq4IHJ1biDsooXro4zrpbwg7JWM66a964uI64ukLlxuICAgKi9cbiAgYXN5bmMgZW5kVGVzdFJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgdHlwZTogXCJydW4vZW5kXCIsXG4gICAgICBlbmRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfSk7XG5cbiAgICAvLyDsl7DqsrAg7KKF66OMXG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICB0aGlzLnNvY2tldC5lbmQoKTtcbiAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBOYWl0ZVJlcG9ydGVyID0gbmV3IE5haXRlUmVwb3J0ZXJDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O1dBa0JnRDs7Ozs7QUFPaEQsU0FBUyxlQUFlLFlBQTRCO0NBQ2xELE9BQU8sV0FBVyxLQUFLLENBQUMsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDdEU7Ozs7O0FBTUEsU0FBUyxnQkFBd0I7Q0FJL0IsTUFBTSxPQUFPLGVBRE0sS0FBSyxnQkFBZ0IsR0FBRyxPQUFPLGtCQUN0QixDQUFVO0NBRXRDLE9BQU8sUUFBUSxhQUFhLFVBQ3hCLHNCQUFzQixTQUN0QixLQUFLLFFBQVEsR0FBRyxXQUFXLFNBQVMsS0FBSyxNQUFNO0FBQ3JEOzs7OztBQU1BLE1BQU0sd0JBQXdCO0FBRTlCLElBQU0scUJBQU4sTUFBeUI7Q0FDdkIsYUFBb0M7Q0FDcEMsU0FBZ0M7Q0FDaEMsWUFBb0I7Q0FDcEIsU0FBMkIsQ0FBQzs7OztDQUs1QixNQUFjLG1CQUFrQztFQUM5QyxJQUFJLEtBQUssYUFBYSxLQUFLLFFBQ3pCO0VBR0YsT0FBTyxJQUFJLFNBQVMsS0FBSyxRQUFRO0dBQy9CLElBQUksQ0FBQyxLQUFLLFlBQ1IsS0FBSyxhQUFhLGNBQWM7R0FFbEMsS0FBSyxTQUFTLFFBQVEsS0FBSyxVQUFVO0dBRXJDLEtBQUssT0FBTyxHQUFHLGlCQUFpQjtJQUM5QixLQUFLLFlBQVk7SUFFakIsS0FBSyxNQUFNLE9BQU8sS0FBSyxRQUNyQixLQUFLLFFBQVEsTUFBTSxHQUFHO0lBRXhCLEtBQUssU0FBUyxDQUFDO0lBQ2YsSUFBSTtHQUNOLENBQUM7R0FFRCxLQUFLLE9BQU8sR0FBRyxVQUFVLE1BQU07SUFFN0IsS0FBSyxZQUFZO0lBQ2pCLEtBQUssU0FBUztJQUNkLElBQUksQ0FBQztHQUNQLENBQUM7R0FFRCxLQUFLLE9BQU8sR0FBRyxlQUFlO0lBQzVCLEtBQUssWUFBWTtJQUNqQixLQUFLLFNBQVM7R0FDaEIsQ0FBQztFQUNILENBQUM7Q0FDSDs7OztDQUtBLE1BQWMsS0FBSyxNQUF1RDtFQUN4RSxNQUFNLE1BQU0sR0FBRyxLQUFLLFVBQVUsSUFBSSxFQUFFO0VBRXBDLE1BQU0sS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLENBQUM7RUFFN0MsSUFBSSxLQUFLLGFBQWEsS0FBSyxRQUN6QixLQUFLLE9BQU8sTUFBTSxHQUFHO09BQ2hCO0dBRUwsS0FBSyxPQUFPLEtBQUssR0FBRztHQUNwQixJQUFJLEtBQUssT0FBTyxTQUFTLHVCQUN2QixLQUFLLE9BQU8sTUFBTTtFQUV0QjtDQUNGOzs7OztDQU1BLE1BQU0sZUFBOEI7RUFDbEMsSUFBSSxRQUFRLElBQUksSUFDZDtFQUdGLE1BQU0sS0FBSyxLQUFLO0dBQ2QsTUFBTTtHQUNOLDRCQUFXLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtFQUNwQyxDQUFDO0NBQ0g7Ozs7O0NBTUEsTUFBTSxpQkFDSixRQUNlO0VBQ2YsSUFBSSxRQUFRLElBQUksSUFDZDtFQUdGLE1BQU0sS0FBSyxLQUFLO0dBQ2QsTUFBTTtHQUNOLDZCQUFZLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtHQUNuQyxHQUFHO0VBQ0wsQ0FBQztDQUNIOzs7OztDQU1BLE1BQU0sYUFBNEI7RUFDaEMsSUFBSSxRQUFRLElBQUksSUFDZDtFQUdGLE1BQU0sS0FBSyxLQUFLO0dBQ2QsTUFBTTtHQUNOLDBCQUFTLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtFQUNsQyxDQUFDO0VBR0QsSUFBSSxLQUFLLFFBQVE7R0FDZixLQUFLLE9BQU8sSUFBSTtHQUNoQixLQUFLLFNBQVM7R0FDZCxLQUFLLFlBQVk7RUFDbkI7Q0FDRjtBQUNGO0FBRUEsTUFBYSxnQkFBZ0IsSUFBSSxtQkFBbUIifQ==
129
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUtcmVwb3J0ZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25haXRlL25haXRlLXJlcG9ydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTmFpdGVSZXBvcnRlclxuICpcbiAqIO2FjOyKpO2KuCDqsrDqs7zsmYAgVHJhY2Ug7KCV67O066W8IFVuaXggU29ja2V07Jy866GcIFZTIENvZGUgZXh0ZW5zaW9u7JeQIOyghOuLrO2VqeuLiOuLpC5cbiAqIGV4dGVuc2lvbuydtCB+Ly5zb25hbXUvbmFpdGUte2hhc2h9LnNvY2vsl5Ag7IaM7LyTIOyEnOuyhOulvCDsl7TslrTrkaHri4jri6QuXG4gKlxuICog7ZSE66Gc7KCd7Yq467OE66GcIOqzoOycoO2VnCDshozsvJPsnYQg7IKs7Jqp7ZWY6riwIOychO2VtCBzb25hbXUuY29uZmlnLnRzIOqyveuhnOydmCDtlbTsi5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIOuqqOuTiCDsi7HquIDthLTsnbTsp4Drp4wg7J247Iqk7YS07Iqk64qUIO2UhOuhnOyEuOyKpOuniOuLpCDrs4TqsJzsnoXri4jri6QuIHJ1bi9zdGFydMK3cnVuL2VuZOuKlFxuICogVml0ZXN0IOuplOyduCDtlITroZzshLjsiqQoTmFpdGVWaXRlc3RSZXBvcnRlciDsu6TsiqTthYAg66as7Y+s7YSwKeyXkOyEnCwgdGVzdC9yZXN1bHTripRcbiAqIOqwgSB3b3JrZXIg7ZSE66Gc7IS47IqkKGJvb3RzdHJhcOydmCBhZnRlckVhY2gp7JeQ7IScIOyghOyGoeuQmOuvgOuhnCBidWZmZXLsmYAg7IaM7LyTXG4gKiDsl7DqsrDsnYQg7ISc66GcIOqzteycoO2VmOyngCDslYrsirXri4jri6QuXG4gKlxuICogZnMgbW9jayDstqnrj4zsnYQg7ZS87ZWY6riwIOychO2VtCBuZXQg66qo65OI66eMIOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuLyogb3hsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqLyAvLyBOYWl0ZeuKlCBleHBlY3TsmYAg7Zi47J2R7ZWY64+E66GdIGFueeulvCDtl4jsmqntlahcblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tIFwibmV0XCI7XG5pbXBvcnQgeyB0eXBlIFNvY2tldCB9IGZyb20gXCJuZXRcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwib3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBmaW5kQXBpUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IHR5cGUgTmFpdGVNZXNzYWdpbmdUeXBlcyB9IGZyb20gXCIuL21lc3NhZ2luZy10eXBlc1wiO1xuXG4vKipcbiAqIHNvbmFtdS5jb25maWcudHMg6rK966Gc66W8IOuwm+yVhOyEnCDtlITroZzsoJ3tirjrs4Qg6rOg7JygIO2VtOyLnOulvCDsg53shLHtlanri4jri6QuXG4gKiDsnbXsiqTthZDshZjqs7wg64+Z7J287ZWcIOuwqeyLneycvOuhnCDqs4TsgrDtlbTslbwg7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRQcm9qZWN0SGFzaChjb25maWdQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY3JlYXRlSGFzaChcIm1kNVwiKS51cGRhdGUoY29uZmlnUGF0aCkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDgpO1xufVxuXG4vKipcbiAqIO2YhOyerCDtlITroZzsoJ3tirjsnZgg7IaM7LyTIOqyveuhnOulvCDqs4TsgrDtlanri4jri6QuXG4gKiBTb25hbXUuYXBpUm9vdFBhdGjqsIAg7ISk7KCV65CcIO2bhOyXkCDtmLjstpztlbTslbwg7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRTb2NrZXRQYXRoKCk6IHN0cmluZyB7XG4gIC8vIHNvbmFtdS5jb25maWcudHPsnZgg7KCI64yAIOqyveuhnCDqs4TsgrBcbiAgLy8gYXBpUm9vdFBhdGjripQgL3Byb2plY3QvYXBpIO2Yle2DnOydtOqzoCwgY29uZmln64qUIC9wcm9qZWN0L2FwaS9zcmMvc29uYW11LmNvbmZpZy50c+yXkCDsnojsnYxcbiAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4oZmluZEFwaVJvb3RQYXRoKCksIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcbiAgY29uc3QgaGFzaCA9IGdldFByb2plY3RIYXNoKGNvbmZpZ1BhdGgpO1xuXG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCJcbiAgICA/IGBcXFxcXFxcXC5cXFxccGlwZVxcXFxuYWl0ZS0ke2hhc2h9YFxuICAgIDogam9pbihob21lZGlyKCksIFwiLnNvbmFtdVwiLCBgbmFpdGUtJHtoYXNofS5zb2NrYCk7XG59XG5cbi8qKlxuICog7Jew6rKwIOyLpO2MqOqwgCDsp4Dsho3rkKAg65WMKGV4dGVuc2lvbiDrr7jsi6Ttlokg65OxKSBidWZmZXLqsIAg66y07ZWc7Z6IIOy7pOyngOyngCDslYrrj4TroZ1cbiAqIOy1nOq3vCDrqZTsi5zsp4Drp4wg7J20IOqwnOyImOunjO2BvCDsnKDsp4Dtlanri4jri6QuXG4gKi9cbmNvbnN0IE1BWF9CVUZGRVJFRF9NRVNTQUdFUyA9IDEwMDA7XG5cbmNsYXNzIE5haXRlUmVwb3J0ZXJDbGFzcyB7XG4gIHByaXZhdGUgc29ja2V0UGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc29ja2V0OiBTb2NrZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBidWZmZXI6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIOyGjOy8kyDsl7DqsrAg7Iuc64+EXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUNvbm5lY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGVkIHx8IHRoaXMuc29ja2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNvY2tldFBhdGgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXRQYXRoID0gZ2V0U29ja2V0UGF0aCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zb2NrZXQgPSBjb25uZWN0KHRoaXMuc29ja2V0UGF0aCk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgLy8g67KE7Y287JeQIOyMk+yduCDrqZTsi5zsp4Ag7KCE7IahXG4gICAgICAgIGZvciAoY29uc3QgbXNnIG9mIHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgdGhpcy5zb2NrZXQ/LndyaXRlKG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICAgICAgcmVzKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJlcnJvclwiLCAoZSkgPT4ge1xuICAgICAgICAvLyDsl7DqsrAg7Iuk7YyoIOustOyLnCAoZXh0ZW5zaW9u7J20IOq6vOyguOyeiOydhCDsiJgg7J6I7J2MKVxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgICAgIHJlaihlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog66mU7Iuc7KeAIOyghOyGoSAo7KSE67CU6r+I7Jy866GcIOq1rOu2hClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZChkYXRhOiBOYWl0ZU1lc3NhZ2luZ1R5cGVzLk5haXRlTWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1zZyA9IGAke0pTT04uc3RyaW5naWZ5KGRhdGEpfVxcbmA7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24oKS5jYXRjaCgoXykgPT4ge30pO1xuXG4gICAgaWYgKHRoaXMuY29ubmVjdGVkICYmIHRoaXMuc29ja2V0KSB7XG4gICAgICB0aGlzLnNvY2tldC53cml0ZShtc2cpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDsl7DqsrAg64yA6riwIOykkeydtOuptCDrsoTtjbzsl5Ag7KCA7J6lLCDsg4HtlZwg7LSI6rO8IOyLnCDsmKTrnpjrkJwg66mU7Iuc7KeA67aA7YSwIO2PkOq4sFxuICAgICAgdGhpcy5idWZmZXIucHVzaChtc2cpO1xuICAgICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA+IE1BWF9CVUZGRVJFRF9NRVNTQUdFUykge1xuICAgICAgICB0aGlzLmJ1ZmZlci5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWaXRlc3Qg7Luk7Iqk7YWAIOumrO2PrO2EsChOYWl0ZVZpdGVzdFJlcG9ydGVyKeydmCBvblRlc3RSdW5TdGFydOyXkOyEnCDtmLjstpztlanri4jri6QuXG4gICAqIO2FjOyKpO2KuCBydW4g7Iuc7J6R7J2EIOyVjOumveuLiOuLpCAo642w7J207YSwIO2BtOumrOyWtCDsi6DtmLgpLlxuICAgKi9cbiAgYXN5bmMgc3RhcnRUZXN0UnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICB0eXBlOiBcInJ1bi9zdGFydFwiLFxuICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogYm9vdHN0cmFwKCnsnZggYWZ0ZXJFYWNo7JeQ7IScIO2YuOy2nO2VqeuLiOuLpC5cbiAgICog7YWM7Iqk7Yq4IOy8gOydtOyKpCDqsrDqs7zrpbwgdHJhY2Vz7JmAIO2VqOq7mCDsoITshqHtlanri4jri6QuXG4gICAqL1xuICBhc3luYyByZXBvcnRUZXN0UmVzdWx0KFxuICAgIHJlc3VsdDogT21pdDxOYWl0ZU1lc3NhZ2luZ1R5cGVzLlRlc3RSZXN1bHQsIFwicmVjZWl2ZWRBdFwiPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkNJKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgIHR5cGU6IFwidGVzdC9yZXN1bHRcIixcbiAgICAgIHJlY2VpdmVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC4uLnJlc3VsdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWaXRlc3Qg7Luk7Iqk7YWAIOumrO2PrO2EsChOYWl0ZVZpdGVzdFJlcG9ydGVyKeydmCBvblRlc3RSdW5FbmTsl5DshJwg7Zi47Lac7ZWp64uI64ukLlxuICAgKiDthYzsiqTtirggcnVuIOyiheujjOulvCDslYzrpr3ri4jri6QuXG4gICAqL1xuICBhc3luYyBlbmRUZXN0UnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICB0eXBlOiBcInJ1bi9lbmRcIixcbiAgICAgIGVuZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcblxuICAgIC8vIOyXsOqysCDsooXro4xcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuc29ja2V0LmVuZCgpO1xuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0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