perttool 0.1.0 → 0.3.0

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 (213) hide show
  1. package/CHANGELOG.md +112 -33
  2. package/README.md +206 -111
  3. package/dist/analysis/temporal-deadline.d.ts +59 -0
  4. package/dist/analysis/temporal-deadline.d.ts.map +1 -0
  5. package/dist/analysis/temporal-deadline.js +387 -0
  6. package/dist/analysis/temporal-deadline.js.map +1 -0
  7. package/dist/analysis/temporal-precedence.d.ts +45 -0
  8. package/dist/analysis/temporal-precedence.d.ts.map +1 -0
  9. package/dist/analysis/temporal-precedence.js +123 -0
  10. package/dist/analysis/temporal-precedence.js.map +1 -0
  11. package/dist/analysis/temporal-resource.d.ts +66 -0
  12. package/dist/analysis/temporal-resource.d.ts.map +1 -0
  13. package/dist/analysis/temporal-resource.js +292 -0
  14. package/dist/analysis/temporal-resource.js.map +1 -0
  15. package/dist/application/analyze.js +5 -5
  16. package/dist/application/analyze.js.map +1 -1
  17. package/dist/application/check.d.ts +16 -0
  18. package/dist/application/check.d.ts.map +1 -1
  19. package/dist/application/check.js +51 -0
  20. package/dist/application/check.js.map +1 -1
  21. package/dist/application/contract4.d.ts +17 -0
  22. package/dist/application/contract4.d.ts.map +1 -0
  23. package/dist/application/contract4.js +27 -0
  24. package/dist/application/contract4.js.map +1 -0
  25. package/dist/application/init.d.ts +43 -0
  26. package/dist/application/init.d.ts.map +1 -0
  27. package/dist/application/init.js +226 -0
  28. package/dist/application/init.js.map +1 -0
  29. package/dist/application/mutate.d.ts +19 -0
  30. package/dist/application/mutate.d.ts.map +1 -1
  31. package/dist/application/mutate.js +47 -25
  32. package/dist/application/mutate.js.map +1 -1
  33. package/dist/application/next.d.ts +2 -0
  34. package/dist/application/next.d.ts.map +1 -1
  35. package/dist/application/next.js +7 -1
  36. package/dist/application/next.js.map +1 -1
  37. package/dist/application/project.d.ts +3 -1
  38. package/dist/application/project.d.ts.map +1 -1
  39. package/dist/application/project.js +2 -1
  40. package/dist/application/project.js.map +1 -1
  41. package/dist/application/target-check.d.ts +34 -0
  42. package/dist/application/target-check.d.ts.map +1 -0
  43. package/dist/application/target-check.js +90 -0
  44. package/dist/application/target-check.js.map +1 -0
  45. package/dist/application/target-grammar-boundary.d.ts +22 -0
  46. package/dist/application/target-grammar-boundary.d.ts.map +1 -0
  47. package/dist/application/target-grammar-boundary.js +91 -0
  48. package/dist/application/target-grammar-boundary.js.map +1 -0
  49. package/dist/application/target-mutate.d.ts +8 -0
  50. package/dist/application/target-mutate.d.ts.map +1 -0
  51. package/dist/application/target-mutate.js +56 -0
  52. package/dist/application/target-mutate.js.map +1 -0
  53. package/dist/application/target-project.d.ts +28 -0
  54. package/dist/application/target-project.d.ts.map +1 -0
  55. package/dist/application/target-project.js +60 -0
  56. package/dist/application/target-project.js.map +1 -0
  57. package/dist/application/target-temporal-analysis.d.ts +138 -0
  58. package/dist/application/target-temporal-analysis.d.ts.map +1 -0
  59. package/dist/application/target-temporal-analysis.js +409 -0
  60. package/dist/application/target-temporal-analysis.js.map +1 -0
  61. package/dist/application/target-temporal-input.d.ts +86 -0
  62. package/dist/application/target-temporal-input.d.ts.map +1 -0
  63. package/dist/application/target-temporal-input.js +238 -0
  64. package/dist/application/target-temporal-input.js.map +1 -0
  65. package/dist/application/target-unit-migration-candidate.d.ts +60 -0
  66. package/dist/application/target-unit-migration-candidate.d.ts.map +1 -0
  67. package/dist/application/target-unit-migration-candidate.js +290 -0
  68. package/dist/application/target-unit-migration-candidate.js.map +1 -0
  69. package/dist/application/target-unit-migration-request.d.ts +35 -0
  70. package/dist/application/target-unit-migration-request.d.ts.map +1 -0
  71. package/dist/application/target-unit-migration-request.js +68 -0
  72. package/dist/application/target-unit-migration-request.js.map +1 -0
  73. package/dist/application/target-unit-migration-result.d.ts +66 -0
  74. package/dist/application/target-unit-migration-result.d.ts.map +1 -0
  75. package/dist/application/target-unit-migration-result.js +86 -0
  76. package/dist/application/target-unit-migration-result.js.map +1 -0
  77. package/dist/application/unit-migration.d.ts +13 -0
  78. package/dist/application/unit-migration.d.ts.map +1 -0
  79. package/dist/application/unit-migration.js +9 -0
  80. package/dist/application/unit-migration.js.map +1 -0
  81. package/dist/cli.js +494 -383
  82. package/dist/cli.js.map +1 -1
  83. package/dist/command/discovery.d.ts +30 -0
  84. package/dist/command/discovery.d.ts.map +1 -0
  85. package/dist/command/discovery.js +752 -0
  86. package/dist/command/discovery.js.map +1 -0
  87. package/dist/command/registry.d.ts +84 -0
  88. package/dist/command/registry.d.ts.map +1 -0
  89. package/dist/command/registry.js +964 -0
  90. package/dist/command/registry.js.map +1 -0
  91. package/dist/command/usage.d.ts +42 -0
  92. package/dist/command/usage.d.ts.map +1 -0
  93. package/dist/command/usage.js +337 -0
  94. package/dist/command/usage.js.map +1 -0
  95. package/dist/conversion/mermaid-import.js +56 -56
  96. package/dist/conversion/mermaid-import.js.map +1 -1
  97. package/dist/conversion/mermaid.js +1 -1
  98. package/dist/conversion/mermaid.js.map +1 -1
  99. package/dist/formatter/source-formatter.d.ts +12 -0
  100. package/dist/formatter/source-formatter.d.ts.map +1 -1
  101. package/dist/formatter/source-formatter.js +48 -6
  102. package/dist/formatter/source-formatter.js.map +1 -1
  103. package/dist/formatter/target-source-formatter.d.ts +8 -0
  104. package/dist/formatter/target-source-formatter.d.ts.map +1 -0
  105. package/dist/formatter/target-source-formatter.js +36 -0
  106. package/dist/formatter/target-source-formatter.js.map +1 -0
  107. package/dist/help/guide.d.ts +12 -0
  108. package/dist/help/guide.d.ts.map +1 -0
  109. package/dist/help/guide.js +103 -0
  110. package/dist/help/guide.js.map +1 -0
  111. package/dist/help/registry.d.ts +0 -6
  112. package/dist/help/registry.d.ts.map +1 -1
  113. package/dist/help/registry.js +186 -86
  114. package/dist/help/registry.js.map +1 -1
  115. package/dist/index.d.ts +20 -7
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +8 -3
  118. package/dist/index.js.map +1 -1
  119. package/dist/io/safe-write.d.ts +7 -0
  120. package/dist/io/safe-write.d.ts.map +1 -1
  121. package/dist/io/safe-write.js +36 -27
  122. package/dist/io/safe-write.js.map +1 -1
  123. package/dist/io/target-safe-write.d.ts +7 -0
  124. package/dist/io/target-safe-write.d.ts.map +1 -0
  125. package/dist/io/target-safe-write.js +33 -0
  126. package/dist/io/target-safe-write.js.map +1 -0
  127. package/dist/migration/conversion.d.ts +40 -0
  128. package/dist/migration/conversion.d.ts.map +1 -0
  129. package/dist/migration/conversion.js +106 -0
  130. package/dist/migration/conversion.js.map +1 -0
  131. package/dist/migration/grammar-boundary.d.ts +20 -0
  132. package/dist/migration/grammar-boundary.d.ts.map +1 -0
  133. package/dist/migration/grammar-boundary.js +92 -0
  134. package/dist/migration/grammar-boundary.js.map +1 -0
  135. package/dist/migration/request.d.ts +79 -0
  136. package/dist/migration/request.d.ts.map +1 -0
  137. package/dist/migration/request.js +308 -0
  138. package/dist/migration/request.js.map +1 -0
  139. package/dist/model/calendar-arithmetic.d.ts +46 -0
  140. package/dist/model/calendar-arithmetic.d.ts.map +1 -0
  141. package/dist/model/calendar-arithmetic.js +236 -0
  142. package/dist/model/calendar-arithmetic.js.map +1 -0
  143. package/dist/model/calendar.d.ts +22 -0
  144. package/dist/model/calendar.d.ts.map +1 -0
  145. package/dist/model/calendar.js +83 -0
  146. package/dist/model/calendar.js.map +1 -0
  147. package/dist/model/declaration-fields.d.ts +15 -0
  148. package/dist/model/declaration-fields.d.ts.map +1 -0
  149. package/dist/model/declaration-fields.js +54 -0
  150. package/dist/model/declaration-fields.js.map +1 -0
  151. package/dist/model/exact-duration-source.d.ts +10 -0
  152. package/dist/model/exact-duration-source.d.ts.map +1 -0
  153. package/dist/model/exact-duration-source.js +69 -0
  154. package/dist/model/exact-duration-source.js.map +1 -0
  155. package/dist/model/rational.d.ts +2 -2
  156. package/dist/model/rational.d.ts.map +1 -1
  157. package/dist/model/rational.js +3 -1
  158. package/dist/model/rational.js.map +1 -1
  159. package/dist/model/syntax.d.ts +9 -2
  160. package/dist/model/syntax.d.ts.map +1 -1
  161. package/dist/model/syntax.js +20 -4
  162. package/dist/model/syntax.js.map +1 -1
  163. package/dist/model/target-calendar.d.ts +25 -0
  164. package/dist/model/target-calendar.d.ts.map +1 -0
  165. package/dist/model/target-calendar.js +56 -0
  166. package/dist/model/target-calendar.js.map +1 -0
  167. package/dist/mutation/advance.d.ts.map +1 -1
  168. package/dist/mutation/advance.js +21 -4
  169. package/dist/mutation/advance.js.map +1 -1
  170. package/dist/mutation/gate.d.ts +5 -0
  171. package/dist/mutation/gate.d.ts.map +1 -0
  172. package/dist/mutation/gate.js +156 -0
  173. package/dist/mutation/gate.js.map +1 -0
  174. package/dist/mutation/milestone.d.ts +10 -1
  175. package/dist/mutation/milestone.d.ts.map +1 -1
  176. package/dist/mutation/milestone.js +104 -48
  177. package/dist/mutation/milestone.js.map +1 -1
  178. package/dist/mutation/project.d.ts +7 -1
  179. package/dist/mutation/project.d.ts.map +1 -1
  180. package/dist/mutation/project.js +32 -19
  181. package/dist/mutation/project.js.map +1 -1
  182. package/dist/mutation/resource.js +22 -22
  183. package/dist/mutation/resource.js.map +1 -1
  184. package/dist/mutation/target-types.d.ts +42 -0
  185. package/dist/mutation/target-types.d.ts.map +1 -0
  186. package/dist/mutation/target-types.js +2 -0
  187. package/dist/mutation/target-types.js.map +1 -0
  188. package/dist/mutation/task.d.ts +12 -1
  189. package/dist/mutation/task.d.ts.map +1 -1
  190. package/dist/mutation/task.js +148 -89
  191. package/dist/mutation/task.js.map +1 -1
  192. package/dist/mutation/types.d.ts +34 -3
  193. package/dist/mutation/types.d.ts.map +1 -1
  194. package/dist/parser/document-parser.d.ts +14 -0
  195. package/dist/parser/document-parser.d.ts.map +1 -1
  196. package/dist/parser/document-parser.js +159 -55
  197. package/dist/parser/document-parser.js.map +1 -1
  198. package/dist/recommendation/override-types.d.ts +2 -2
  199. package/dist/recommendation/override.d.ts +2 -2
  200. package/dist/recommendation/override.d.ts.map +1 -1
  201. package/dist/recommendation/override.js +49 -12
  202. package/dist/recommendation/override.js.map +1 -1
  203. package/dist/semantic/target-validator.d.ts +36 -0
  204. package/dist/semantic/target-validator.d.ts.map +1 -0
  205. package/dist/semantic/target-validator.js +87 -0
  206. package/dist/semantic/target-validator.js.map +1 -0
  207. package/dist/semantic/validator.d.ts +2 -0
  208. package/dist/semantic/validator.d.ts.map +1 -1
  209. package/dist/semantic/validator.js +90 -45
  210. package/dist/semantic/validator.js.map +1 -1
  211. package/dist/version.d.ts +1 -1
  212. package/dist/version.js +1 -1
  213. package/package.json +3 -3
@@ -0,0 +1,106 @@
1
+ import { serializeExactDurationSource, } from "../model/exact-duration-source.js";
2
+ import { divide, multiply, rational } from "../model/rational.js";
3
+ import { selectExactDurationGrammarBoundary, } from "./grammar-boundary.js";
4
+ function exactValue(value, unit) {
5
+ const normalized = rational(value.numerator, value.denominator);
6
+ return Object.freeze({
7
+ numerator: normalized.numerator,
8
+ denominator: normalized.denominator,
9
+ unit,
10
+ });
11
+ }
12
+ function exactPositive(value, name) {
13
+ const normalized = rational(value.numerator, value.denominator);
14
+ if (normalized.numerator <= 0n) {
15
+ throw new Error(`${name} must be positive`);
16
+ }
17
+ return normalized;
18
+ }
19
+ function targetPerSource(input) {
20
+ if (!input.changed) {
21
+ if (input.sourceUnit !== input.targetUnit) {
22
+ throw new Error("unchanged migration must retain the source unit");
23
+ }
24
+ if (input.effectiveVelocity !== null ||
25
+ input.velocityDisposition !== null) {
26
+ throw new Error("unchanged migration must not select a velocity");
27
+ }
28
+ return null;
29
+ }
30
+ const velocity = input.effectiveVelocity;
31
+ if (velocity === null || input.velocityDisposition === null) {
32
+ throw new Error("changing migration requires an effective velocity");
33
+ }
34
+ const points = exactPositive(velocity.points, "velocity points");
35
+ const period = exactPositive(velocity.period, "velocity period");
36
+ if (input.sourceUnit === "point") {
37
+ if (input.targetUnit === "point" ||
38
+ velocity.periodUnit !== input.targetUnit) {
39
+ throw new Error("Point migration target must match the velocity period unit");
40
+ }
41
+ return divide(period, points);
42
+ }
43
+ if (input.targetUnit !== "point" ||
44
+ velocity.periodUnit !== input.sourceUnit) {
45
+ throw new Error("time migration source must match the velocity period unit");
46
+ }
47
+ return divide(points, period);
48
+ }
49
+ function convertField(field, sourceUnit, targetUnit, factor) {
50
+ if (field.sourceUnit !== sourceUnit) {
51
+ throw new Error(`migration inventory field ${field.fieldPath} has the wrong source unit`);
52
+ }
53
+ const original = exactValue(field.sourceValue, sourceUnit);
54
+ if (original.numerator < 0n) {
55
+ throw new Error(`migration inventory field ${field.fieldPath} must not be negative`);
56
+ }
57
+ const converted = exactValue(multiply(original, factor), targetUnit);
58
+ const serialized = serializeExactDurationSource(converted, targetUnit);
59
+ const token = Object.freeze({ ...serialized });
60
+ return {
61
+ record: Object.freeze({
62
+ entityKind: field.entityKind,
63
+ entityId: field.entityId,
64
+ fieldPath: field.fieldPath,
65
+ original,
66
+ converted,
67
+ canonicalToken: token.token,
68
+ tokenClassification: token.classification,
69
+ }),
70
+ token,
71
+ };
72
+ }
73
+ export function convertPreparedUnitMigrationRequest(input) {
74
+ if (input.ok !== true) {
75
+ throw new TypeError("exact unit conversion requires a successful prepared request");
76
+ }
77
+ if (!Array.isArray(input.durationInventory)) {
78
+ throw new TypeError("durationInventory must be an array");
79
+ }
80
+ const factor = targetPerSource(input);
81
+ const convertedFields = [];
82
+ const generatedTokens = [];
83
+ if (factor !== null) {
84
+ for (const field of input.durationInventory) {
85
+ const converted = convertField(field, input.sourceUnit, input.targetUnit, factor);
86
+ convertedFields.push(converted.record);
87
+ generatedTokens.push(converted.token);
88
+ }
89
+ }
90
+ const grammar = selectExactDurationGrammarBoundary(input.sourceGrammarVersion, generatedTokens, {
91
+ migrationChanged: input.changed,
92
+ velocityDisposition: input.velocityDisposition,
93
+ });
94
+ return Object.freeze({
95
+ sourceGrammarVersion: grammar.sourceGrammarVersion,
96
+ targetGrammarVersion: grammar.targetGrammarVersion,
97
+ grammarDisposition: grammar.grammarDisposition,
98
+ sourceUnit: input.sourceUnit,
99
+ targetUnit: input.targetUnit,
100
+ changed: input.changed,
101
+ convertedFields: Object.freeze(convertedFields),
102
+ reversibility: grammar.reversibility,
103
+ qualifications: grammar.qualifications,
104
+ });
105
+ }
106
+ //# sourceMappingURL=conversion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversion.js","sourceRoot":"","sources":["../../src/migration/conversion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type ExactDurationSourceToken } from "../model/exact-duration-source.js";
2
+ export type MigrationGrammarVersion = 1 | 2 | 3;
3
+ export type MigrationGrammarDisposition = "retained" | "upgraded_for_exact_fraction";
4
+ export type MigrationVelocityDisposition = "retained" | "replaced" | "inserted";
5
+ export type MigrationReversibility = "exact" | "values_exact_metadata_changed" | "not_applicable";
6
+ export type MigrationQualification = "grammar_upgraded_for_exact_fraction" | "grammar_version_retained_on_inverse" | "velocity_replaced" | "velocity_inserted";
7
+ export interface ExactDurationGrammarBoundaryContext {
8
+ readonly migrationChanged: boolean;
9
+ readonly velocityDisposition: MigrationVelocityDisposition | null;
10
+ }
11
+ export interface ExactDurationGrammarSelection {
12
+ readonly sourceGrammarVersion: MigrationGrammarVersion;
13
+ readonly targetGrammarVersion: MigrationGrammarVersion;
14
+ readonly grammarDisposition: MigrationGrammarDisposition;
15
+ readonly requiresVersionUpgrade: boolean;
16
+ readonly reversibility: MigrationReversibility;
17
+ readonly qualifications: readonly MigrationQualification[];
18
+ }
19
+ export declare function selectExactDurationGrammarBoundary(sourceGrammarVersion: number, generatedTokens: readonly ExactDurationSourceToken[], context: ExactDurationGrammarBoundaryContext): ExactDurationGrammarSelection;
20
+ //# sourceMappingURL=grammar-boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grammar-boundary.d.ts","sourceRoot":"","sources":["../../src/migration/grammar-boundary.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,mCAAmC,CAAC;AAE3C,MAAM,MAAM,uBAAuB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEhD,MAAM,MAAM,2BAA2B,GACnC,UAAU,GACV,6BAA6B,CAAC;AAElC,MAAM,MAAM,4BAA4B,GACpC,UAAU,GACV,UAAU,GACV,UAAU,CAAC;AAEf,MAAM,MAAM,sBAAsB,GAC9B,OAAO,GACP,+BAA+B,GAC/B,gBAAgB,CAAC;AAErB,MAAM,MAAM,sBAAsB,GAC9B,qCAAqC,GACrC,qCAAqC,GACrC,mBAAmB,GACnB,mBAAmB,CAAC;AAExB,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,mBAAmB,EAAE,4BAA4B,GAAG,IAAI,CAAC;CACnE;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,oBAAoB,EAAE,uBAAuB,CAAC;IACvD,QAAQ,CAAC,oBAAoB,EAAE,uBAAuB,CAAC;IACvD,QAAQ,CAAC,kBAAkB,EAAE,2BAA2B,CAAC;IACzD,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,sBAAsB,CAAC;IAC/C,QAAQ,CAAC,cAAc,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAC5D;AA+DD,wBAAgB,kCAAkC,CAChD,oBAAoB,EAAE,MAAM,EAC5B,eAAe,EAAE,SAAS,wBAAwB,EAAE,EACpD,OAAO,EAAE,mCAAmC,GAC3C,6BAA6B,CAyD/B"}
@@ -0,0 +1,92 @@
1
+ import { canonicalizeExactDurationSourceToken, } from "../model/exact-duration-source.js";
2
+ function requireGrammarVersion(value) {
3
+ if (value !== 1 && value !== 2 && value !== 3) {
4
+ throw new RangeError("source grammar version must be 1, 2, or 3");
5
+ }
6
+ }
7
+ function requireContext(context) {
8
+ if (typeof context.migrationChanged !== "boolean") {
9
+ throw new TypeError("migrationChanged must be boolean");
10
+ }
11
+ if (context.velocityDisposition !== null &&
12
+ context.velocityDisposition !== "retained" &&
13
+ context.velocityDisposition !== "replaced" &&
14
+ context.velocityDisposition !== "inserted") {
15
+ throw new TypeError("velocityDisposition is invalid");
16
+ }
17
+ if (context.migrationChanged &&
18
+ context.velocityDisposition === null) {
19
+ throw new TypeError("a changing migration requires a velocity disposition");
20
+ }
21
+ if (!context.migrationChanged &&
22
+ (context.velocityDisposition === "replaced" ||
23
+ context.velocityDisposition === "inserted")) {
24
+ throw new TypeError("a no-op migration cannot replace or insert velocity");
25
+ }
26
+ }
27
+ function requireCanonicalGeneratedToken(value) {
28
+ if (value === null ||
29
+ typeof value !== "object" ||
30
+ (value.classification !== "decimal" &&
31
+ value.classification !== "fraction") ||
32
+ typeof value.token !== "string") {
33
+ throw new TypeError("generated Duration token is invalid");
34
+ }
35
+ const canonical = canonicalizeExactDurationSourceToken(value.token);
36
+ if (canonical === null ||
37
+ canonical.token !== value.token ||
38
+ canonical.classification !== value.classification) {
39
+ throw new TypeError("generated Duration token must be canonical");
40
+ }
41
+ }
42
+ export function selectExactDurationGrammarBoundary(sourceGrammarVersion, generatedTokens, context) {
43
+ requireGrammarVersion(sourceGrammarVersion);
44
+ if (!Array.isArray(generatedTokens)) {
45
+ throw new TypeError("generatedTokens must be an array");
46
+ }
47
+ requireContext(context);
48
+ for (const token of generatedTokens)
49
+ requireCanonicalGeneratedToken(token);
50
+ const fractionRequired = generatedTokens.some(({ classification }) => classification === "fraction");
51
+ if (!context.migrationChanged &&
52
+ sourceGrammarVersion !== 3 &&
53
+ fractionRequired) {
54
+ throw new TypeError("a no-op migration cannot require a grammar upgrade");
55
+ }
56
+ const requiresVersionUpgrade = sourceGrammarVersion !== 3 && fractionRequired;
57
+ const targetGrammarVersion = requiresVersionUpgrade
58
+ ? 3
59
+ : sourceGrammarVersion;
60
+ const qualifications = [];
61
+ if (requiresVersionUpgrade) {
62
+ qualifications.push("grammar_upgraded_for_exact_fraction");
63
+ }
64
+ else if (context.migrationChanged &&
65
+ sourceGrammarVersion === 3 &&
66
+ generatedTokens.length > 0 &&
67
+ !fractionRequired) {
68
+ qualifications.push("grammar_version_retained_on_inverse");
69
+ }
70
+ if (context.velocityDisposition === "replaced") {
71
+ qualifications.push("velocity_replaced");
72
+ }
73
+ else if (context.velocityDisposition === "inserted") {
74
+ qualifications.push("velocity_inserted");
75
+ }
76
+ const reversibility = !context.migrationChanged
77
+ ? "not_applicable"
78
+ : qualifications.length > 0
79
+ ? "values_exact_metadata_changed"
80
+ : "exact";
81
+ return Object.freeze({
82
+ sourceGrammarVersion,
83
+ targetGrammarVersion,
84
+ grammarDisposition: requiresVersionUpgrade
85
+ ? "upgraded_for_exact_fraction"
86
+ : "retained",
87
+ requiresVersionUpgrade,
88
+ reversibility,
89
+ qualifications: Object.freeze(qualifications),
90
+ });
91
+ }
92
+ //# sourceMappingURL=grammar-boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grammar-boundary.js","sourceRoot":"","sources":["../../src/migration/grammar-boundary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import type { SourceSpan } from "../model/diagnostics.js";
2
+ import type { Rational } from "../model/rational.js";
3
+ import type { DocumentNode } from "../model/syntax.js";
4
+ import type { DurationUnit, Velocity } from "../model/units.js";
5
+ import type { MigrationGrammarVersion, MigrationVelocityDisposition } from "./grammar-boundary.js";
6
+ export declare const UNIT_MIGRATION_IDENTITY: Readonly<{
7
+ readonly id: "perttool.unit-migration";
8
+ readonly version: 2;
9
+ }>;
10
+ export type UnitMigrationCause = "invalid_original" | "invalid_replacement_velocity" | "missing_velocity" | "unsupported_direction" | "velocity_period_mismatch" | "same_unit_velocity_change" | "unsupported_duration_field" | "invalid_candidate";
11
+ export type UnitMigrationDiagnosticCode = "PTMIG-401" | "PTMIG-402" | "PTMIG-403" | "PTMIG-404" | "PTMIG-405" | "PTMIG-406" | "PTMIG-407" | "PTMIG-409";
12
+ export declare const UNIT_MIGRATION_DIAGNOSTIC_CODES: Readonly<Record<UnitMigrationCause, UnitMigrationDiagnosticCode>>;
13
+ export interface UnitMigrationRequest {
14
+ readonly targetUnit: DurationUnit;
15
+ readonly replacementVelocity?: string | null;
16
+ }
17
+ export interface NormalizedUnitMigrationRequest {
18
+ readonly targetUnit: DurationUnit;
19
+ readonly replacementVelocity: string | null;
20
+ }
21
+ export interface UnitMigrationUnavailableCause {
22
+ readonly cause: UnitMigrationCause;
23
+ readonly diagnosticCode: UnitMigrationDiagnosticCode;
24
+ readonly fieldPaths: readonly string[];
25
+ }
26
+ export interface ExactMigrationVelocity extends Velocity {
27
+ readonly inputToken: string;
28
+ }
29
+ export interface UnitMigrationDurationField {
30
+ readonly entityKind: "project" | "task";
31
+ readonly entityId: string;
32
+ readonly fieldPath: string;
33
+ readonly sourceUnit: DurationUnit;
34
+ readonly sourceToken: string;
35
+ readonly sourceValue: Rational;
36
+ readonly valueSpan: SourceSpan;
37
+ }
38
+ export interface UnitMigrationPreservedTemporalField {
39
+ readonly entityKind: "project" | "milestone" | "task";
40
+ readonly entityId: string;
41
+ readonly fieldPath: string;
42
+ readonly sourceToken: string;
43
+ readonly valueSpan: SourceSpan;
44
+ }
45
+ export interface UnitMigrationValidatedSource {
46
+ readonly grammarVersion: MigrationGrammarVersion;
47
+ readonly document: DocumentNode;
48
+ }
49
+ export interface PreparedUnitMigrationRequest {
50
+ readonly ok: true;
51
+ readonly unitMigration: typeof UNIT_MIGRATION_IDENTITY;
52
+ readonly sourceGrammarVersion: MigrationGrammarVersion;
53
+ readonly sourceUnit: DurationUnit;
54
+ readonly targetUnit: DurationUnit;
55
+ readonly changed: boolean;
56
+ readonly effectiveVelocity: ExactMigrationVelocity | null;
57
+ readonly velocityDisposition: MigrationVelocityDisposition | null;
58
+ readonly durationInventory: readonly UnitMigrationDurationField[];
59
+ readonly preservedTemporalFields: readonly UnitMigrationPreservedTemporalField[];
60
+ readonly unavailableCauses: readonly UnitMigrationUnavailableCause[];
61
+ }
62
+ export interface RejectedUnitMigrationRequest {
63
+ readonly ok: false;
64
+ readonly unitMigration: typeof UNIT_MIGRATION_IDENTITY;
65
+ readonly sourceGrammarVersion: MigrationGrammarVersion;
66
+ readonly sourceUnit: DurationUnit;
67
+ readonly targetUnit: DurationUnit;
68
+ readonly changed: false;
69
+ readonly effectiveVelocity: null;
70
+ readonly velocityDisposition: null;
71
+ readonly durationInventory: readonly UnitMigrationDurationField[];
72
+ readonly preservedTemporalFields: readonly UnitMigrationPreservedTemporalField[];
73
+ readonly unavailableCauses: readonly UnitMigrationUnavailableCause[];
74
+ }
75
+ export type UnitMigrationRequestPreparation = PreparedUnitMigrationRequest | RejectedUnitMigrationRequest;
76
+ export declare function normalizeUnitMigrationRequest(request: UnitMigrationRequest): NormalizedUnitMigrationRequest;
77
+ export declare function unitMigrationCause(kind: UnitMigrationCause, fieldPaths?: readonly string[]): UnitMigrationUnavailableCause;
78
+ export declare function prepareUnitMigrationRequest(source: UnitMigrationValidatedSource, request: NormalizedUnitMigrationRequest): UnitMigrationRequestPreparation;
79
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/migration/request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,308 @@
1
+ import { compare, divide, rational } from "../model/rational.js";
2
+ import { fieldNamed } from "../model/syntax.js";
3
+ export const UNIT_MIGRATION_IDENTITY = Object.freeze({
4
+ id: "perttool.unit-migration",
5
+ version: 2,
6
+ });
7
+ export const UNIT_MIGRATION_DIAGNOSTIC_CODES = Object.freeze({
8
+ invalid_original: "PTMIG-401",
9
+ invalid_replacement_velocity: "PTMIG-402",
10
+ missing_velocity: "PTMIG-403",
11
+ unsupported_direction: "PTMIG-404",
12
+ velocity_period_mismatch: "PTMIG-405",
13
+ same_unit_velocity_change: "PTMIG-406",
14
+ unsupported_duration_field: "PTMIG-407",
15
+ invalid_candidate: "PTMIG-409",
16
+ });
17
+ const requestKeys = new Set(["targetUnit", "replacementVelocity"]);
18
+ const durationUnits = new Set(["day", "hour", "point"]);
19
+ function isRecord(value) {
20
+ return value !== null && typeof value === "object" && !Array.isArray(value);
21
+ }
22
+ export function normalizeUnitMigrationRequest(request) {
23
+ if (!isRecord(request)) {
24
+ throw new TypeError("unit migration request must be an object");
25
+ }
26
+ for (const key of Object.keys(request)) {
27
+ if (!requestKeys.has(key)) {
28
+ throw new TypeError(`unit migration request field ${key} is unsupported`);
29
+ }
30
+ }
31
+ if (!durationUnits.has(request.targetUnit)) {
32
+ throw new TypeError("unit migration targetUnit must be day, hour, or point");
33
+ }
34
+ const replacementVelocity = request.replacementVelocity ?? null;
35
+ if (replacementVelocity !== null &&
36
+ typeof replacementVelocity !== "string") {
37
+ throw new TypeError("unit migration replacementVelocity must be a string or null");
38
+ }
39
+ return Object.freeze({
40
+ targetUnit: request.targetUnit,
41
+ replacementVelocity,
42
+ });
43
+ }
44
+ function unitFromSuffix(suffix) {
45
+ return suffix === "d" ? "day" : suffix === "h" ? "hour" : "point";
46
+ }
47
+ function exactDurationValue(value) {
48
+ if (!isRecord(value))
49
+ return false;
50
+ if (value["suffix"] !== "d" && value["suffix"] !== "h" && value["suffix"] !== "p") {
51
+ return false;
52
+ }
53
+ return ((typeof value["digits"] === "bigint" &&
54
+ typeof value["scale"] === "number") ||
55
+ (typeof value["numerator"] === "bigint" &&
56
+ typeof value["denominator"] === "bigint"));
57
+ }
58
+ function exactDurationRational(value) {
59
+ return "numerator" in value
60
+ ? rational(value.numerator, value.denominator)
61
+ : rational(value.digits, 10n ** BigInt(value.scale));
62
+ }
63
+ function decimalRational(source) {
64
+ if (!/^[0-9]+(?:\.[0-9]+)?$/.test(source))
65
+ return null;
66
+ const [whole, fraction = ""] = source.split(".");
67
+ if (whole === undefined)
68
+ return null;
69
+ return rational(BigInt(`${whole}${fraction}`), 10n ** BigInt(fraction.length));
70
+ }
71
+ function parseReplacementVelocity(source) {
72
+ const match = /^([0-9]+(?:\.[0-9]+)?)p\/([0-9]+(?:\.[0-9]+)?)([dh])$/.exec(source);
73
+ if (match === null)
74
+ return null;
75
+ const points = decimalRational(match[1]);
76
+ const period = decimalRational(match[2]);
77
+ if (points === null ||
78
+ period === null ||
79
+ points.numerator <= 0n ||
80
+ period.numerator <= 0n) {
81
+ return null;
82
+ }
83
+ return Object.freeze({
84
+ points,
85
+ period,
86
+ periodUnit: match[3] === "d" ? "day" : "hour",
87
+ inputToken: source,
88
+ });
89
+ }
90
+ function declaredVelocity(value) {
91
+ if (value === undefined)
92
+ return null;
93
+ return Object.freeze({
94
+ points: exactDurationRational(value.points),
95
+ period: exactDurationRational(value.period),
96
+ periodUnit: value.period.suffix === "d" ? "day" : "hour",
97
+ inputToken: value.text,
98
+ });
99
+ }
100
+ function velocitySemanticallyEqual(left, right) {
101
+ return (left.periodUnit === right.periodUnit &&
102
+ compare(divide(left.points, left.period), divide(right.points, right.period)) === 0);
103
+ }
104
+ function cause(kind, fieldPaths) {
105
+ return Object.freeze({
106
+ cause: kind,
107
+ diagnosticCode: UNIT_MIGRATION_DIAGNOSTIC_CODES[kind],
108
+ fieldPaths: Object.freeze([...fieldPaths]),
109
+ });
110
+ }
111
+ export function unitMigrationCause(kind, fieldPaths = []) {
112
+ return cause(kind, fieldPaths);
113
+ }
114
+ function projectFrom(document) {
115
+ const project = document.declarations.find((declaration) => declaration.kind === "project");
116
+ if (project === undefined) {
117
+ throw new Error("validated migration source has no project declaration");
118
+ }
119
+ return project;
120
+ }
121
+ function sourceDurationUnit(document) {
122
+ const field = fieldNamed(projectFrom(document), "duration_unit");
123
+ if (field?.value !== "day" &&
124
+ field?.value !== "hour" &&
125
+ field?.value !== "point") {
126
+ throw new Error("validated migration source has no duration unit");
127
+ }
128
+ return field.value;
129
+ }
130
+ function scalarFields(field) {
131
+ return field.children ?? [field];
132
+ }
133
+ function durationFieldPath(declarationKind, declarationId, field, parent) {
134
+ if (declarationKind === "project" &&
135
+ parent === field &&
136
+ (field.name === "critical_epsilon" || field.name === "target_duration")) {
137
+ return `project.${field.name}`;
138
+ }
139
+ if (declarationKind !== "task")
140
+ return null;
141
+ if (parent === field && field.name === "duration") {
142
+ return `task.${declarationId}.duration`;
143
+ }
144
+ if (parent.name === "estimate" &&
145
+ (field.name === "optimistic" ||
146
+ field.name === "most_likely" ||
147
+ field.name === "pessimistic")) {
148
+ return `task.${declarationId}.estimate.${field.name}`;
149
+ }
150
+ return null;
151
+ }
152
+ function inventoryDurationFields(source, sourceUnit) {
153
+ const fields = [];
154
+ const unsupportedFieldPaths = [];
155
+ for (const declaration of source.document.declarations) {
156
+ for (const parent of declaration.fields) {
157
+ for (const field of scalarFields(parent)) {
158
+ if (!exactDurationValue(field.value))
159
+ continue;
160
+ const fieldPath = durationFieldPath(declaration.kind, declaration.id, field, parent);
161
+ if (fieldPath === null) {
162
+ unsupportedFieldPaths.push(`${declaration.kind}.${declaration.id}.${parent.name}${parent === field ? "" : `.${field.name}`}`);
163
+ continue;
164
+ }
165
+ const valueUnit = unitFromSuffix(field.value.suffix);
166
+ if (valueUnit !== sourceUnit) {
167
+ throw new Error("validated migration source contains a mismatched Duration unit");
168
+ }
169
+ fields.push(Object.freeze({
170
+ entityKind: declaration.kind,
171
+ entityId: declaration.id,
172
+ fieldPath,
173
+ sourceUnit,
174
+ sourceToken: field.rawValue,
175
+ sourceValue: exactDurationRational(field.value),
176
+ valueSpan: field.valueSpan,
177
+ }));
178
+ }
179
+ }
180
+ }
181
+ return unsupportedFieldPaths.length === 0
182
+ ? { ok: true, fields: Object.freeze(fields) }
183
+ : {
184
+ ok: false,
185
+ unsupportedFieldPaths: Object.freeze(unsupportedFieldPaths),
186
+ };
187
+ }
188
+ function preservedTemporalFields(document) {
189
+ const fields = [];
190
+ for (const declaration of document.declarations) {
191
+ for (const field of declaration.fields) {
192
+ const fieldPath = declaration.kind === "project" && field.name === "as_of"
193
+ ? "project.as_of"
194
+ : declaration.kind === "milestone" && field.name === "deadline"
195
+ ? `milestone.${declaration.id}.deadline`
196
+ : declaration.kind === "task" && field.name === "not_before"
197
+ ? `task.${declaration.id}.not_before`
198
+ : declaration.kind === "task" && field.name === "deadline"
199
+ ? `task.${declaration.id}.deadline`
200
+ : null;
201
+ if (fieldPath === null)
202
+ continue;
203
+ fields.push(Object.freeze({
204
+ entityKind: declaration.kind,
205
+ entityId: declaration.id,
206
+ fieldPath,
207
+ sourceToken: field.rawValue,
208
+ valueSpan: field.valueSpan,
209
+ }));
210
+ }
211
+ }
212
+ return Object.freeze(fields);
213
+ }
214
+ function reject(source, sourceUnit, targetUnit, unavailableCause) {
215
+ return Object.freeze({
216
+ ok: false,
217
+ unitMigration: UNIT_MIGRATION_IDENTITY,
218
+ sourceGrammarVersion: source.grammarVersion,
219
+ sourceUnit,
220
+ targetUnit,
221
+ changed: false,
222
+ effectiveVelocity: null,
223
+ velocityDisposition: null,
224
+ durationInventory: Object.freeze([]),
225
+ preservedTemporalFields: Object.freeze([]),
226
+ unavailableCauses: Object.freeze([unavailableCause]),
227
+ });
228
+ }
229
+ export function prepareUnitMigrationRequest(source, request) {
230
+ const sourceUnit = sourceDurationUnit(source.document);
231
+ const targetUnit = request.targetUnit;
232
+ const project = projectFrom(source.document);
233
+ const replacement = request.replacementVelocity === null
234
+ ? null
235
+ : parseReplacementVelocity(request.replacementVelocity);
236
+ if (request.replacementVelocity !== null && replacement === null) {
237
+ return reject(source, sourceUnit, targetUnit, cause("invalid_replacement_velocity", [
238
+ "request.replacement_velocity",
239
+ ]));
240
+ }
241
+ if (sourceUnit === targetUnit && replacement !== null) {
242
+ return reject(source, sourceUnit, targetUnit, cause("same_unit_velocity_change", [
243
+ "request.replacement_velocity",
244
+ ]));
245
+ }
246
+ if (sourceUnit !== "point" &&
247
+ targetUnit !== "point" &&
248
+ sourceUnit !== targetUnit) {
249
+ return reject(source, sourceUnit, targetUnit, cause("unsupported_direction", [
250
+ "project.duration_unit",
251
+ "request.target_unit",
252
+ ]));
253
+ }
254
+ const declaredField = fieldNamed(project, "velocity");
255
+ const declared = declaredVelocity(declaredField?.value);
256
+ if (sourceUnit !== targetUnit && replacement === null && declared === null) {
257
+ return reject(source, sourceUnit, targetUnit, cause("missing_velocity", ["project.velocity"]));
258
+ }
259
+ let effectiveVelocity = null;
260
+ let velocityDisposition = null;
261
+ if (sourceUnit !== targetUnit) {
262
+ if (replacement === null) {
263
+ effectiveVelocity = declared;
264
+ velocityDisposition = "retained";
265
+ }
266
+ else if (declared !== null &&
267
+ velocitySemanticallyEqual(declared, replacement)) {
268
+ effectiveVelocity = declared;
269
+ velocityDisposition = "retained";
270
+ }
271
+ else {
272
+ effectiveVelocity = replacement;
273
+ velocityDisposition = declared === null ? "inserted" : "replaced";
274
+ }
275
+ if (effectiveVelocity === null) {
276
+ throw new Error("changing migration has no effective velocity");
277
+ }
278
+ const requiredPeriodUnit = sourceUnit === "point" ? targetUnit : sourceUnit;
279
+ if (effectiveVelocity.periodUnit !== requiredPeriodUnit) {
280
+ return reject(source, sourceUnit, targetUnit, cause("velocity_period_mismatch", [
281
+ replacement === null
282
+ ? "project.velocity"
283
+ : "request.replacement_velocity",
284
+ sourceUnit === "point"
285
+ ? "request.target_unit"
286
+ : "project.duration_unit",
287
+ ]));
288
+ }
289
+ }
290
+ const inventory = inventoryDurationFields(source, sourceUnit);
291
+ if (!inventory.ok) {
292
+ return reject(source, sourceUnit, targetUnit, cause("unsupported_duration_field", inventory.unsupportedFieldPaths));
293
+ }
294
+ return Object.freeze({
295
+ ok: true,
296
+ unitMigration: UNIT_MIGRATION_IDENTITY,
297
+ sourceGrammarVersion: source.grammarVersion,
298
+ sourceUnit,
299
+ targetUnit,
300
+ changed: sourceUnit !== targetUnit,
301
+ effectiveVelocity,
302
+ velocityDisposition,
303
+ durationInventory: inventory.fields,
304
+ preservedTemporalFields: preservedTemporalFields(source.document),
305
+ unavailableCauses: Object.freeze([]),
306
+ });
307
+ }
308
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/migration/request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAQjE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAOhD,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,CAAC;IACnD,EAAE,EAAE,yBAAyB;IAC7B,OAAO,EAAE,CAAC;CACF,CAAC,CAAC;AAsBZ,MAAM,CAAC,MAAM,+BAA+B,GAExC,MAAM,CAAC,MAAM,CAAC;IAChB,gBAAgB,EAAE,WAAW;IAC7B,4BAA4B,EAAE,WAAW;IACzC,gBAAgB,EAAE,WAAW;IAC7B,qBAAqB,EAAE,WAAW;IAClC,wBAAwB,EAAE,WAAW;IACrC,yBAAyB,EAAE,WAAW;IACtC,0BAA0B,EAAE,WAAW;IACvC,iBAAiB,EAAE,WAAW;CAC/B,CAAC,CAAC;AA+EH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC,CAAC;AACnE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEtE,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,OAA6B;IAE7B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;IAClE,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,SAAS,CAAC,gCAAgC,GAAG,iBAAiB,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,IAAI,CAAC;IAChE,IACE,mBAAmB,KAAK,IAAI;QAC5B,OAAO,mBAAmB,KAAK,QAAQ,EACvC,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,mBAAmB;KACpB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,MAAuB;IAC7C,OAAO,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AACpE,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;QAClF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CACL,CAAC,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;QACrC,CAAC,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,QAAQ;YACrC,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAC5C,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAyB;IACtD,OAAO,WAAW,IAAI,KAAK;QACzB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC;QAC9C,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,QAAQ,CACb,MAAM,CAAC,GAAG,KAAK,GAAG,QAAQ,EAAE,CAAC,EAC7B,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAc;IAC9C,MAAM,KAAK,GACT,uDAAuD,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IAC1C,IACE,MAAM,KAAK,IAAI;QACf,MAAM,KAAK,IAAI;QACf,MAAM,CAAC,SAAS,IAAI,EAAE;QACtB,MAAM,CAAC,SAAS,IAAI,EAAE,EACtB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM;QACN,MAAM;QACN,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;QAC7C,UAAU,EAAE,MAAM;KACnB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAgC;IAEhC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC;QAC3C,MAAM,EAAE,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC;QAC3C,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;QACxD,UAAU,EAAE,KAAK,CAAC,IAAI;KACvB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB,CAChC,IAA4B,EAC5B,KAA6B;IAE7B,OAAO,CACL,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU;QACpC,OAAO,CACL,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAChC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CACnC,KAAK,CAAC,CACR,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CACZ,IAAwB,EACxB,UAA6B;IAE7B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,+BAA+B,CAAC,IAAI,CAAC;QACrD,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;KAC3C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,IAAwB,EACxB,UAAU,GAAsB,EAAE;IAElC,OAAO,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,QAAsB;IACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,CACxC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,SAAS,CAChD,CAAC;IACF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAsB;IAChD,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAC;IACjE,IACE,KAAK,EAAE,KAAK,KAAK,KAAK;QACtB,KAAK,EAAE,KAAK,KAAK,MAAM;QACvB,KAAK,EAAE,KAAK,KAAK,OAAO,EACxB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC;AAED,SAAS,YAAY,CACnB,KAAgB;IAEhB,OAAO,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,iBAAiB,CACxB,eAAuB,EACvB,aAAqB,EACrB,KAAgB,EAChB,MAAiB;IAEjB,IACE,eAAe,KAAK,SAAS;QAC7B,MAAM,KAAK,KAAK;QAChB,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAAC,EACvE,CAAC;QACD,OAAO,WAAW,KAAK,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IACD,IAAI,eAAe,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAClD,OAAO,QAAQ,aAAa,WAAW,CAAC;IAC1C,CAAC;IACD,IACE,MAAM,CAAC,IAAI,KAAK,UAAU;QAC1B,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY;YAC1B,KAAK,CAAC,IAAI,KAAK,aAAa;YAC5B,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,EAC/B,CAAC;QACD,OAAO,QAAQ,aAAa,aAAa,KAAK,CAAC,IAAI,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,uBAAuB,CAC9B,MAAoC,EACpC,UAAwB;IAUxB,MAAM,MAAM,GAAiC,EAAE,CAAC;IAChD,MAAM,qBAAqB,GAAa,EAAE,CAAC;IAC3C,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QACvD,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACxC,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC;oBAAE,SAAS;gBAC/C,MAAM,SAAS,GAAG,iBAAiB,CACjC,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,EAAE,EACd,KAAK,EACL,MAAM,CACP,CAAC;gBACF,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;oBACvB,qBAAqB,CAAC,IAAI,CACxB,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,GAClD,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,EACxC,EAAE,CACH,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACrD,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;oBAC7B,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;gBACJ,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;oBACxB,UAAU,EAAE,WAAW,CAAC,IAA0B;oBAClD,QAAQ,EAAE,WAAW,CAAC,EAAE;oBACxB,SAAS;oBACT,UAAU;oBACV,WAAW,EAAE,KAAK,CAAC,QAAQ;oBAC3B,WAAW,EAAE,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC;oBAC/C,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC3B,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,qBAAqB,CAAC,MAAM,KAAK,CAAC;QACvC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;QAC7C,CAAC,CAAC;YACE,EAAE,EAAE,KAAK;YACT,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC;SAC5D,CAAC;AACR,CAAC;AAED,SAAS,uBAAuB,CAC9B,QAAsB;IAEtB,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,KAAK,MAAM,WAAW,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;QAChD,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACvC,MAAM,SAAS,GACb,WAAW,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBACtD,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;oBAC7D,CAAC,CAAC,aAAa,WAAW,CAAC,EAAE,WAAW;oBACxC,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;wBAC1D,CAAC,CAAC,QAAQ,WAAW,CAAC,EAAE,aAAa;wBACrC,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;4BACxD,CAAC,CAAC,QAAQ,WAAW,CAAC,EAAE,WAAW;4BACnC,CAAC,CAAC,IAAI,CAAC;YACjB,IAAI,SAAS,KAAK,IAAI;gBAAE,SAAS;YACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;gBACxB,UAAU,EAAE,WAAW,CAAC,IAAwC;gBAChE,QAAQ,EAAE,WAAW,CAAC,EAAE;gBACxB,SAAS;gBACT,WAAW,EAAE,KAAK,CAAC,QAAQ;gBAC3B,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,MAAM,CACb,MAAoC,EACpC,UAAwB,EACxB,UAAwB,EACxB,gBAA+C;IAE/C,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,KAAK;QACT,aAAa,EAAE,uBAAuB;QACtC,oBAAoB,EAAE,MAAM,CAAC,cAAc;QAC3C,UAAU;QACV,UAAU;QACV,OAAO,EAAE,KAAK;QACd,iBAAiB,EAAE,IAAI;QACvB,mBAAmB,EAAE,IAAI;QACzB,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,uBAAuB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;KACrD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,MAAoC,EACpC,OAAuC;IAEvC,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,KAAK,IAAI;QACtD,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,wBAAwB,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,mBAAmB,KAAK,IAAI,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACjE,OAAO,MAAM,CACX,MAAM,EACN,UAAU,EACV,UAAU,EACV,KAAK,CAAC,8BAA8B,EAAE;YACpC,8BAA8B;SAC/B,CAAC,CACH,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,KAAK,UAAU,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACtD,OAAO,MAAM,CACX,MAAM,EACN,UAAU,EACV,UAAU,EACV,KAAK,CAAC,2BAA2B,EAAE;YACjC,8BAA8B;SAC/B,CAAC,CACH,CAAC;IACJ,CAAC;IACD,IACE,UAAU,KAAK,OAAO;QACtB,UAAU,KAAK,OAAO;QACtB,UAAU,KAAK,UAAU,EACzB,CAAC;QACD,OAAO,MAAM,CACX,MAAM,EACN,UAAU,EACV,UAAU,EACV,KAAK,CAAC,uBAAuB,EAAE;YAC7B,uBAAuB;YACvB,qBAAqB;SACtB,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,gBAAgB,CAC/B,aAAa,EAAE,KAAkC,CAClD,CAAC;IACF,IAAI,UAAU,KAAK,UAAU,IAAI,WAAW,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC3E,OAAO,MAAM,CACX,MAAM,EACN,UAAU,EACV,UAAU,EACV,KAAK,CAAC,kBAAkB,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAChD,CAAC;IACJ,CAAC;IAED,IAAI,iBAAiB,GAAkC,IAAI,CAAC;IAC5D,IAAI,mBAAmB,GAAwC,IAAI,CAAC;IACpE,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QAC9B,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,iBAAiB,GAAG,QAAQ,CAAC;YAC7B,mBAAmB,GAAG,UAAU,CAAC;QACnC,CAAC;aAAM,IACL,QAAQ,KAAK,IAAI;YACjB,yBAAyB,CAAC,QAAQ,EAAE,WAAW,CAAC,EAChD,CAAC;YACD,iBAAiB,GAAG,QAAQ,CAAC;YAC7B,mBAAmB,GAAG,UAAU,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,iBAAiB,GAAG,WAAW,CAAC;YAChC,mBAAmB,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;QACpE,CAAC;QACD,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,kBAAkB,GACtB,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;QACnD,IAAI,iBAAiB,CAAC,UAAU,KAAK,kBAAkB,EAAE,CAAC;YACxD,OAAO,MAAM,CACX,MAAM,EACN,UAAU,EACV,UAAU,EACV,KAAK,CAAC,0BAA0B,EAAE;gBAChC,WAAW,KAAK,IAAI;oBAClB,CAAC,CAAC,kBAAkB;oBACpB,CAAC,CAAC,8BAA8B;gBAClC,UAAU,KAAK,OAAO;oBACpB,CAAC,CAAC,qBAAqB;oBACvB,CAAC,CAAC,uBAAuB;aAC5B,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9D,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAClB,OAAO,MAAM,CACX,MAAM,EACN,UAAU,EACV,UAAU,EACV,KAAK,CACH,4BAA4B,EAC5B,SAAS,CAAC,qBAAqB,CAChC,CACF,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,IAAI;QACR,aAAa,EAAE,uBAAuB;QACtC,oBAAoB,EAAE,MAAM,CAAC,cAAc;QAC3C,UAAU;QACV,UAAU;QACV,OAAO,EAAE,UAAU,KAAK,UAAU;QAClC,iBAAiB;QACjB,mBAAmB;QACnB,iBAAiB,EAAE,SAAS,CAAC,MAAM;QACnC,uBAAuB,EAAE,uBAAuB,CAAC,MAAM,CAAC,QAAQ,CAAC;QACjE,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;KACrC,CAAC,CAAC;AACL,CAAC"}