@descryy/runtime-test-runner 0.4.12 → 0.4.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/dist/bounded-file.d.ts +18 -0
  2. package/dist/bounded-file.d.ts.map +1 -0
  3. package/dist/bounded-file.js +77 -0
  4. package/dist/bounded-file.js.map +1 -0
  5. package/dist/child-environment.d.ts +12 -0
  6. package/dist/child-environment.d.ts.map +1 -0
  7. package/dist/child-environment.js +124 -0
  8. package/dist/child-environment.js.map +1 -0
  9. package/dist/coverage-capture.d.ts +23 -0
  10. package/dist/coverage-capture.d.ts.map +1 -0
  11. package/dist/coverage-capture.js +165 -0
  12. package/dist/coverage-capture.js.map +1 -0
  13. package/dist/executed-coverage.d.ts +45 -0
  14. package/dist/executed-coverage.d.ts.map +1 -0
  15. package/dist/executed-coverage.js +143 -0
  16. package/dist/executed-coverage.js.map +1 -0
  17. package/dist/go-cover-profile.d.ts +29 -0
  18. package/dist/go-cover-profile.d.ts.map +1 -0
  19. package/dist/go-cover-profile.js +162 -0
  20. package/dist/go-cover-profile.js.map +1 -0
  21. package/dist/go-test.d.ts +29 -2
  22. package/dist/go-test.d.ts.map +1 -1
  23. package/dist/go-test.js +149 -30
  24. package/dist/go-test.js.map +1 -1
  25. package/dist/graph-mapping.d.ts +1 -0
  26. package/dist/graph-mapping.d.ts.map +1 -1
  27. package/dist/graph-mapping.js +78 -1
  28. package/dist/graph-mapping.js.map +1 -1
  29. package/dist/index.d.ts +21 -3
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +11 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/lexers/c-family.d.ts +4 -0
  34. package/dist/lexers/c-family.d.ts.map +1 -0
  35. package/dist/lexers/c-family.js +221 -0
  36. package/dist/lexers/c-family.js.map +1 -0
  37. package/dist/lexers/chars.d.ts +7 -0
  38. package/dist/lexers/chars.d.ts.map +1 -0
  39. package/dist/lexers/chars.js +49 -0
  40. package/dist/lexers/chars.js.map +1 -0
  41. package/dist/lexers/index.d.ts +7 -0
  42. package/dist/lexers/index.d.ts.map +1 -0
  43. package/dist/lexers/index.js +5 -0
  44. package/dist/lexers/index.js.map +1 -0
  45. package/dist/lexers/python.d.ts +3 -0
  46. package/dist/lexers/python.d.ts.map +1 -0
  47. package/dist/lexers/python.js +101 -0
  48. package/dist/lexers/python.js.map +1 -0
  49. package/dist/quality/annotations.d.ts +14 -0
  50. package/dist/quality/annotations.d.ts.map +1 -0
  51. package/dist/quality/annotations.js +147 -0
  52. package/dist/quality/annotations.js.map +1 -0
  53. package/dist/quality/assertion-kinds.d.ts +18 -0
  54. package/dist/quality/assertion-kinds.d.ts.map +1 -0
  55. package/dist/quality/assertion-kinds.js +25 -0
  56. package/dist/quality/assertion-kinds.js.map +1 -0
  57. package/dist/quality/chains.d.ts +25 -0
  58. package/dist/quality/chains.d.ts.map +1 -0
  59. package/dist/quality/chains.js +129 -0
  60. package/dist/quality/chains.js.map +1 -0
  61. package/dist/quality/common.d.ts +31 -0
  62. package/dist/quality/common.d.ts.map +1 -0
  63. package/dist/quality/common.js +211 -0
  64. package/dist/quality/common.js.map +1 -0
  65. package/dist/quality/csharp-family.d.ts +9 -0
  66. package/dist/quality/csharp-family.d.ts.map +1 -0
  67. package/dist/quality/csharp-family.js +560 -0
  68. package/dist/quality/csharp-family.js.map +1 -0
  69. package/dist/quality/detect.d.ts +3 -0
  70. package/dist/quality/detect.d.ts.map +1 -0
  71. package/dist/quality/detect.js +348 -0
  72. package/dist/quality/detect.js.map +1 -0
  73. package/dist/quality/durations.d.ts +4 -0
  74. package/dist/quality/durations.d.ts.map +1 -0
  75. package/dist/quality/durations.js +177 -0
  76. package/dist/quality/durations.js.map +1 -0
  77. package/dist/quality/expressions.d.ts +7 -0
  78. package/dist/quality/expressions.d.ts.map +1 -0
  79. package/dist/quality/expressions.js +123 -0
  80. package/dist/quality/expressions.js.map +1 -0
  81. package/dist/quality/facts.d.ts +5 -0
  82. package/dist/quality/facts.d.ts.map +1 -0
  83. package/dist/quality/facts.js +183 -0
  84. package/dist/quality/facts.js.map +1 -0
  85. package/dist/quality/failure-of.d.ts +4 -0
  86. package/dist/quality/failure-of.d.ts.map +1 -0
  87. package/dist/quality/failure-of.js +233 -0
  88. package/dist/quality/failure-of.js.map +1 -0
  89. package/dist/quality/frameworks.d.ts +5 -0
  90. package/dist/quality/frameworks.d.ts.map +1 -0
  91. package/dist/quality/frameworks.js +20 -0
  92. package/dist/quality/frameworks.js.map +1 -0
  93. package/dist/quality/go-family.d.ts +6 -0
  94. package/dist/quality/go-family.d.ts.map +1 -0
  95. package/dist/quality/go-family.js +393 -0
  96. package/dist/quality/go-family.js.map +1 -0
  97. package/dist/quality/index.d.ts +10 -0
  98. package/dist/quality/index.d.ts.map +1 -0
  99. package/dist/quality/index.js +19 -0
  100. package/dist/quality/index.js.map +1 -0
  101. package/dist/quality/java-family.d.ts +12 -0
  102. package/dist/quality/java-family.d.ts.map +1 -0
  103. package/dist/quality/java-family.js +529 -0
  104. package/dist/quality/java-family.js.map +1 -0
  105. package/dist/quality/js-assertions.d.ts +11 -0
  106. package/dist/quality/js-assertions.d.ts.map +1 -0
  107. package/dist/quality/js-assertions.js +297 -0
  108. package/dist/quality/js-assertions.js.map +1 -0
  109. package/dist/quality/js-family.d.ts +3 -0
  110. package/dist/quality/js-family.d.ts.map +1 -0
  111. package/dist/quality/js-family.js +470 -0
  112. package/dist/quality/js-family.js.map +1 -0
  113. package/dist/quality/python-family.d.ts +6 -0
  114. package/dist/quality/python-family.d.ts.map +1 -0
  115. package/dist/quality/python-family.js +786 -0
  116. package/dist/quality/python-family.js.map +1 -0
  117. package/dist/quality/scope.d.ts +26 -0
  118. package/dist/quality/scope.d.ts.map +1 -0
  119. package/dist/quality/scope.js +33 -0
  120. package/dist/quality/scope.js.map +1 -0
  121. package/dist/quality/selectors.d.ts +14 -0
  122. package/dist/quality/selectors.d.ts.map +1 -0
  123. package/dist/quality/selectors.js +137 -0
  124. package/dist/quality/selectors.js.map +1 -0
  125. package/dist/quality/statuses.d.ts +7 -0
  126. package/dist/quality/statuses.d.ts.map +1 -0
  127. package/dist/quality/statuses.js +143 -0
  128. package/dist/quality/statuses.js.map +1 -0
  129. package/dist/quality/stream.d.ts +23 -0
  130. package/dist/quality/stream.d.ts.map +1 -0
  131. package/dist/quality/stream.js +194 -0
  132. package/dist/quality/stream.js.map +1 -0
  133. package/dist/quality/types.d.ts +88 -0
  134. package/dist/quality/types.d.ts.map +1 -0
  135. package/dist/quality/types.js +2 -0
  136. package/dist/quality/types.js.map +1 -0
  137. package/dist/run-timeout.d.ts +25 -0
  138. package/dist/run-timeout.d.ts.map +1 -0
  139. package/dist/run-timeout.js +52 -0
  140. package/dist/run-timeout.js.map +1 -0
  141. package/dist/runner-wrappers.d.ts +74 -0
  142. package/dist/runner-wrappers.d.ts.map +1 -0
  143. package/dist/runner-wrappers.js +604 -0
  144. package/dist/runner-wrappers.js.map +1 -0
  145. package/dist/swift-xctest.d.ts +15 -2
  146. package/dist/swift-xctest.d.ts.map +1 -1
  147. package/dist/swift-xctest.js +143 -20
  148. package/dist/swift-xctest.js.map +1 -1
  149. package/dist/test-runner-collector.d.ts +56 -6
  150. package/dist/test-runner-collector.d.ts.map +1 -1
  151. package/dist/test-runner-collector.js +265 -113
  152. package/dist/test-runner-collector.js.map +1 -1
  153. package/dist/testgen/csharp-facts.d.ts +3 -0
  154. package/dist/testgen/csharp-facts.d.ts.map +1 -0
  155. package/dist/testgen/csharp-facts.js +306 -0
  156. package/dist/testgen/csharp-facts.js.map +1 -0
  157. package/dist/testgen/csharp-profile.d.ts +14 -0
  158. package/dist/testgen/csharp-profile.d.ts.map +1 -0
  159. package/dist/testgen/csharp-profile.js +233 -0
  160. package/dist/testgen/csharp-profile.js.map +1 -0
  161. package/dist/testgen/declarations.d.ts +10 -0
  162. package/dist/testgen/declarations.d.ts.map +1 -0
  163. package/dist/testgen/declarations.js +110 -0
  164. package/dist/testgen/declarations.js.map +1 -0
  165. package/dist/testgen/facts-common.d.ts +33 -0
  166. package/dist/testgen/facts-common.d.ts.map +1 -0
  167. package/dist/testgen/facts-common.js +76 -0
  168. package/dist/testgen/facts-common.js.map +1 -0
  169. package/dist/testgen/failure.d.ts +4 -0
  170. package/dist/testgen/failure.d.ts.map +1 -0
  171. package/dist/testgen/failure.js +106 -0
  172. package/dist/testgen/failure.js.map +1 -0
  173. package/dist/testgen/frameworks.d.ts +6 -0
  174. package/dist/testgen/frameworks.d.ts.map +1 -0
  175. package/dist/testgen/frameworks.js +516 -0
  176. package/dist/testgen/frameworks.js.map +1 -0
  177. package/dist/testgen/go-facts.d.ts +11 -0
  178. package/dist/testgen/go-facts.d.ts.map +1 -0
  179. package/dist/testgen/go-facts.js +237 -0
  180. package/dist/testgen/go-facts.js.map +1 -0
  181. package/dist/testgen/go-profile.d.ts +6 -0
  182. package/dist/testgen/go-profile.d.ts.map +1 -0
  183. package/dist/testgen/go-profile.js +155 -0
  184. package/dist/testgen/go-profile.js.map +1 -0
  185. package/dist/testgen/index.d.ts +28 -0
  186. package/dist/testgen/index.d.ts.map +1 -0
  187. package/dist/testgen/index.js +21 -0
  188. package/dist/testgen/index.js.map +1 -0
  189. package/dist/testgen/java-build.d.ts +13 -0
  190. package/dist/testgen/java-build.d.ts.map +1 -0
  191. package/dist/testgen/java-build.js +250 -0
  192. package/dist/testgen/java-build.js.map +1 -0
  193. package/dist/testgen/java-facts.d.ts +3 -0
  194. package/dist/testgen/java-facts.d.ts.map +1 -0
  195. package/dist/testgen/java-facts.js +349 -0
  196. package/dist/testgen/java-facts.js.map +1 -0
  197. package/dist/testgen/java-profile.d.ts +13 -0
  198. package/dist/testgen/java-profile.d.ts.map +1 -0
  199. package/dist/testgen/java-profile.js +194 -0
  200. package/dist/testgen/java-profile.js.map +1 -0
  201. package/dist/testgen/languages.d.ts +11 -0
  202. package/dist/testgen/languages.d.ts.map +1 -0
  203. package/dist/testgen/languages.js +63 -0
  204. package/dist/testgen/languages.js.map +1 -0
  205. package/dist/testgen/lexer.d.ts +19 -0
  206. package/dist/testgen/lexer.d.ts.map +1 -0
  207. package/dist/testgen/lexer.js +257 -0
  208. package/dist/testgen/lexer.js.map +1 -0
  209. package/dist/testgen/mutant-core.d.ts +19 -0
  210. package/dist/testgen/mutant-core.d.ts.map +1 -0
  211. package/dist/testgen/mutant-core.js +39 -0
  212. package/dist/testgen/mutant-core.js.map +1 -0
  213. package/dist/testgen/mutants-lang.d.ts +6 -0
  214. package/dist/testgen/mutants-lang.d.ts.map +1 -0
  215. package/dist/testgen/mutants-lang.js +291 -0
  216. package/dist/testgen/mutants-lang.js.map +1 -0
  217. package/dist/testgen/mutants.d.ts +9 -0
  218. package/dist/testgen/mutants.d.ts.map +1 -0
  219. package/dist/testgen/mutants.js +148 -0
  220. package/dist/testgen/mutants.js.map +1 -0
  221. package/dist/testgen/paths.d.ts +32 -0
  222. package/dist/testgen/paths.d.ts.map +1 -0
  223. package/dist/testgen/paths.js +211 -0
  224. package/dist/testgen/paths.js.map +1 -0
  225. package/dist/testgen/process.d.ts +19 -0
  226. package/dist/testgen/process.d.ts.map +1 -0
  227. package/dist/testgen/process.js +89 -0
  228. package/dist/testgen/process.js.map +1 -0
  229. package/dist/testgen/profile-failure.d.ts +7 -0
  230. package/dist/testgen/profile-failure.d.ts.map +1 -0
  231. package/dist/testgen/profile-failure.js +29 -0
  232. package/dist/testgen/profile-failure.js.map +1 -0
  233. package/dist/testgen/python-facts.d.ts +11 -0
  234. package/dist/testgen/python-facts.d.ts.map +1 -0
  235. package/dist/testgen/python-facts.js +380 -0
  236. package/dist/testgen/python-facts.js.map +1 -0
  237. package/dist/testgen/python-profile.d.ts +4 -0
  238. package/dist/testgen/python-profile.d.ts.map +1 -0
  239. package/dist/testgen/python-profile.js +344 -0
  240. package/dist/testgen/python-profile.js.map +1 -0
  241. package/dist/testgen/source-facts.d.ts +30 -0
  242. package/dist/testgen/source-facts.d.ts.map +1 -0
  243. package/dist/testgen/source-facts.js +497 -0
  244. package/dist/testgen/source-facts.js.map +1 -0
  245. package/dist/testgen/stubs.d.ts +4 -0
  246. package/dist/testgen/stubs.d.ts.map +1 -0
  247. package/dist/testgen/stubs.js +66 -0
  248. package/dist/testgen/stubs.js.map +1 -0
  249. package/dist/testgen/toolchain.d.ts +23 -0
  250. package/dist/testgen/toolchain.d.ts.map +1 -0
  251. package/dist/testgen/toolchain.js +201 -0
  252. package/dist/testgen/toolchain.js.map +1 -0
  253. package/dist/testgen/types.d.ts +67 -0
  254. package/dist/testgen/types.d.ts.map +1 -0
  255. package/dist/testgen/types.js +2 -0
  256. package/dist/testgen/types.js.map +1 -0
  257. package/dist/v8-coverage.d.ts +21 -0
  258. package/dist/v8-coverage.d.ts.map +1 -0
  259. package/dist/v8-coverage.js +217 -0
  260. package/dist/v8-coverage.js.map +1 -0
  261. package/dist/vitest-reporter.d.ts +46 -13
  262. package/dist/vitest-reporter.d.ts.map +1 -1
  263. package/dist/vitest-reporter.js +119 -26
  264. package/dist/vitest-reporter.js.map +1 -1
  265. package/dist/vitest-version.d.ts +21 -0
  266. package/dist/vitest-version.d.ts.map +1 -0
  267. package/dist/vitest-version.js +98 -0
  268. package/dist/vitest-version.js.map +1 -0
  269. package/package.json +14 -8
  270. package/reporters/junit/classes/DescryJUnitListener.class +0 -0
  271. package/reporters/junit/classes/META-INF/services/org.junit.platform.launcher.TestExecutionListener +1 -0
  272. package/reporters/minitest/descry_minitest_reporter.rb +150 -0
  273. package/reporters/phpunit/DescryPhpUnitExtension.php +209 -0
  274. package/reporters/pytest/descry_pytest_plugin.py +397 -0
  275. package/reporters/rspec/descry_rspec_formatter.rb +175 -0
  276. package/reporters/xunit/bin/Release/netstandard2.0/Descry.TestLogger.deps.json +203 -0
  277. package/reporters/xunit/bin/Release/netstandard2.0/Descry.TestLogger.dll +0 -0
  278. package/reporters/xunit/bin/Release/netstandard2.0/Descry.TestLogger.pdb +0 -0
@@ -0,0 +1,604 @@
1
+ /**
2
+ * Runner wrappers -- the tools a project runs its tests through: `uv run pytest`,
3
+ * `poetry run pytest`, `npx vitest run`, `pnpm exec jest`.
4
+ *
5
+ * **Declared grammar, never a guess.** Each wrapper lists which of its own flags take a value,
6
+ * which take none, and which are refused (with why). The runner is the first token after the
7
+ * wrapper's own flags, so `uv run --with pytest python -m unittest` is not mistaken for pytest,
8
+ * and a flag the grammar does not know is refused by name rather than skipped past -- a wrong
9
+ * split would silently drop a flag the caller wrote.
10
+ *
11
+ * **Nothing is installed during a run.** A wrapper that would build, sync or download an
12
+ * environment is either run offline or refused with the command that prepares it. Where the
13
+ * environment lives outside the repository, `locateWrapperEnvironment` finds it (from files, or
14
+ * by the wrapper's own read-only query) so the sandbox can bind it read-only.
15
+ */
16
+ import { execFileSync } from "node:child_process";
17
+ import { accessSync, constants as fsConstants, existsSync, mkdtempSync, openSync, readSync, closeSync, realpathSync, rmSync } from "node:fs";
18
+ import { tmpdir } from "node:os";
19
+ import { basename, delimiter, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
20
+ import { readBoundedRegularFile } from "./bounded-file.js";
21
+ import { buildChildEnvironment } from "./child-environment.js";
22
+ import { assignmentValue, compileGlob, isInside } from "./testgen/paths.js";
23
+ const NO_FLAGS = { withValue: [], withoutValue: [] };
24
+ const TEMP_ENV = "builds a temporary environment, which needs the network the sandbox denies and would install packages during the run";
25
+ const SHELL_STRING = "takes a shell string, whose runner cannot be read without running a shell";
26
+ const GRAMMARS = [
27
+ {
28
+ name: "uv run",
29
+ binaries: ["uv", "uv.exe"],
30
+ ecosystem: "python",
31
+ global: {
32
+ withValue: ["--directory", "--project", "--cache-dir", "--color", "--config-file"],
33
+ withoutValue: ["-q", "--quiet", "-v", "--verbose", "--no-cache", "--offline", "--no-progress", "--native-tls"],
34
+ },
35
+ subcommand: "run",
36
+ flags: {
37
+ withValue: [
38
+ "--python", "-p", "--extra", "--group", "--only-group", "--no-group", "--package", "--directory", "--project",
39
+ "--env-file", "--cache-dir", "--color", "--index", "--default-index", "--index-url", "--extra-index-url", "--config-file",
40
+ ],
41
+ withoutValue: [
42
+ "--no-sync", "--frozen", "--locked", "--all-extras", "--no-dev", "--dev", "--all-groups", "--no-default-groups",
43
+ "--offline", "--no-cache", "-q", "--quiet", "-v", "--verbose", "--isolated", "--active", "--no-project",
44
+ "--no-env-file", "--exact", "--no-editable", "--all-packages", "--no-progress",
45
+ ],
46
+ refused: { "--with": TEMP_ENV, "--with-editable": TEMP_ENV, "--with-requirements": TEMP_ENV, "--script": "runs a script, not a test runner", "-s": "runs a script, not a test runner", "--gui-script": "runs a script, not a test runner" },
47
+ },
48
+ moduleFlags: ["-m", "--module"],
49
+ },
50
+ {
51
+ name: "poetry run",
52
+ binaries: ["poetry", "poetry.exe"],
53
+ ecosystem: "python",
54
+ global: {
55
+ withValue: ["-C", "--directory", "-P", "--project"],
56
+ withoutValue: ["-q", "--quiet", "-v", "-vv", "-vvv", "--verbose", "-n", "--no-interaction", "--ansi", "--no-ansi", "--no-plugins", "--no-cache"],
57
+ },
58
+ subcommand: "run",
59
+ flags: NO_FLAGS,
60
+ },
61
+ {
62
+ name: "pipenv run",
63
+ binaries: ["pipenv", "pipenv.exe"],
64
+ ecosystem: "python",
65
+ global: { withValue: [], withoutValue: ["-v", "--verbose", "-q", "--quiet"] },
66
+ subcommand: "run",
67
+ flags: NO_FLAGS,
68
+ },
69
+ {
70
+ name: "pdm run",
71
+ binaries: ["pdm", "pdm.exe"],
72
+ ecosystem: "python",
73
+ global: { withValue: ["-p", "--project"], withoutValue: ["-v", "-q", "--verbose", "--quiet"] },
74
+ subcommand: "run",
75
+ flags: {
76
+ withValue: ["-p", "--project", "-L", "--lockfile", "--venv"],
77
+ withoutValue: ["-v", "-q", "--verbose", "--quiet", "-s", "--site-packages"],
78
+ refused: { "-l": "lists scripts and runs nothing", "--list": "lists scripts and runs nothing", "--json": "lists scripts and runs nothing" },
79
+ },
80
+ },
81
+ {
82
+ name: "hatch run",
83
+ binaries: ["hatch", "hatch.exe"],
84
+ ecosystem: "python",
85
+ global: { withValue: ["-e", "--env", "-p", "--project"], withoutValue: ["-v", "-q", "--verbose", "--quiet"] },
86
+ subcommand: "run",
87
+ flags: NO_FLAGS,
88
+ envPrefixedRunner: true,
89
+ },
90
+ {
91
+ name: "npx",
92
+ binaries: ["npx", "npx.cmd"],
93
+ ecosystem: "node",
94
+ global: NO_FLAGS,
95
+ subcommand: null,
96
+ flags: {
97
+ withValue: ["-p", "--package", "--prefix"],
98
+ withoutValue: ["-y", "--yes", "--no", "--no-install", "-q", "--quiet"],
99
+ refused: { "-c": SHELL_STRING, "--call": SHELL_STRING },
100
+ },
101
+ downloads: true,
102
+ },
103
+ {
104
+ name: "npm exec",
105
+ binaries: ["npm", "npm.cmd"],
106
+ ecosystem: "node",
107
+ global: { withValue: ["--prefix"], withoutValue: [] },
108
+ subcommand: "exec",
109
+ flags: {
110
+ withValue: ["-p", "--package", "-w", "--workspace", "--prefix"],
111
+ withoutValue: ["-y", "--yes", "--no"],
112
+ refused: { "-c": SHELL_STRING, "--call": SHELL_STRING, "--workspaces": "runs the command once in every workspace", "-ws": "runs the command once in every workspace" },
113
+ },
114
+ downloads: true,
115
+ },
116
+ {
117
+ name: "pnpm exec",
118
+ binaries: ["pnpm", "pnpm.cmd"],
119
+ ecosystem: "node",
120
+ global: {
121
+ withValue: ["-C", "--dir", "-F", "--filter"],
122
+ withoutValue: ["-s", "--silent"],
123
+ refused: { "-r": "runs the command in every workspace package", "--recursive": "runs the command in every workspace package" },
124
+ },
125
+ subcommand: "exec",
126
+ flags: { withValue: [], withoutValue: [], refused: { "-c": SHELL_STRING, "--shell-mode": SHELL_STRING, "--parallel": "runs the command in every workspace package" } },
127
+ },
128
+ {
129
+ name: "yarn exec",
130
+ binaries: ["yarn", "yarn.cmd"],
131
+ ecosystem: "node",
132
+ global: NO_FLAGS,
133
+ subcommand: "exec",
134
+ flags: NO_FLAGS,
135
+ },
136
+ {
137
+ name: "bunx",
138
+ binaries: ["bunx", "bunx.exe"],
139
+ ecosystem: "node",
140
+ global: NO_FLAGS,
141
+ subcommand: null,
142
+ flags: { withValue: ["-p", "--package"], withoutValue: ["--bun", "--silent"] },
143
+ downloads: true,
144
+ },
145
+ ];
146
+ const WRAPPER_BINARIES = new Set(GRAMMARS.flatMap((grammar) => grammar.binaries));
147
+ function baseNameOf(command) {
148
+ return command.split(/[\\/]/).pop() ?? command;
149
+ }
150
+ const PROJECT_FLAGS = new Set(["-C", "--directory", "--dir", "--project", "-P"]);
151
+ /** Consumes the wrapper's own flags from `tokens[start]`, stopping at `--` (consumed) or the first non-flag token. */
152
+ function scanFlags(grammar, table, where, tokens, start) {
153
+ let i = start;
154
+ let projectDir = null;
155
+ while (i < tokens.length) {
156
+ const token = tokens[i];
157
+ if (token === "--")
158
+ return { ok: true, next: i + 1, projectDir, module: null };
159
+ if (!token.startsWith("-") || token === "-")
160
+ break;
161
+ const eq = token.startsWith("--") ? token.indexOf("=") : -1;
162
+ const name = eq === -1 ? token : token.slice(0, eq);
163
+ const inline = eq === -1 ? null : token.slice(eq + 1);
164
+ const refusal = table.refused?.[name];
165
+ if (refusal !== undefined)
166
+ return { ok: false, reason: `\`${grammar.name}\` with ${name} ${refusal}.` };
167
+ if (grammar.moduleFlags?.includes(name) === true && where === "run") {
168
+ const module = inline ?? tokens[i + 1];
169
+ if (module === undefined || module === "")
170
+ return { ok: false, reason: `\`${grammar.name}\` ${name} needs a module name.` };
171
+ return { ok: true, next: inline === null ? i + 2 : i + 1, projectDir, module };
172
+ }
173
+ if (table.withValue.includes(name)) {
174
+ const value = inline ?? tokens[i + 1];
175
+ if (value === undefined)
176
+ return { ok: false, reason: `\`${grammar.name}\` ${name} needs a value, and the command ends before one.` };
177
+ if (PROJECT_FLAGS.has(name))
178
+ projectDir = value;
179
+ i += inline === null ? 2 : 1;
180
+ continue;
181
+ }
182
+ if (table.withoutValue.includes(name)) {
183
+ if (inline !== null)
184
+ return { ok: false, reason: `\`${grammar.name}\` ${name} takes no value, but was given "${inline}".` };
185
+ i += 1;
186
+ continue;
187
+ }
188
+ return {
189
+ ok: false,
190
+ reason: `\`${grammar.name}\` was given ${name}, a flag Descry does not know for ${grammar.name}. It is refused rather than ` +
191
+ "skipped, because whether it takes a value decides which token is the test runner. Declare the runner without it, " +
192
+ "or run the runner binary directly.",
193
+ };
194
+ }
195
+ return { ok: true, next: i, projectDir, module: null };
196
+ }
197
+ /**
198
+ * Splits a command into wrapper and runner, when it is a wrapper. Pure: reads nothing from disk.
199
+ * `none` for a command no wrapper grammar claims; `refused` for one it claims and cannot split.
200
+ */
201
+ export function unwrapRunnerCommand(command, args) {
202
+ const baseName = baseNameOf(command);
203
+ const grammar = GRAMMARS.find((candidate) => candidate.binaries.includes(baseName));
204
+ if (grammar === undefined)
205
+ return { kind: "none" };
206
+ // A wrapper with no subcommand has one flag list, scanned below; there is no "before the subcommand".
207
+ const global = grammar.subcommand === null ? { ok: true, next: 0, projectDir: null, module: null } : scanFlags(grammar, grammar.global, "global", args, 0);
208
+ if (!global.ok)
209
+ return { kind: "refused", reason: global.reason };
210
+ let i = global.next;
211
+ if (grammar.subcommand !== null) {
212
+ if (args[i] !== grammar.subcommand) {
213
+ return {
214
+ kind: "refused",
215
+ reason: `"${[command, ...args].join(" ")}" is not \`${grammar.name}\`: only \`${grammar.name} <runner> ...\` runs a test runner.`,
216
+ };
217
+ }
218
+ i += 1;
219
+ }
220
+ const own = scanFlags(grammar, grammar.flags, "run", args, i);
221
+ if (!own.ok)
222
+ return { kind: "refused", reason: own.reason };
223
+ const projectDir = own.projectDir ?? global.projectDir;
224
+ const wrapperArgs = args.slice(0, own.module === null ? own.next : moduleFlagStart(args, i, grammar));
225
+ let innerCommand;
226
+ let innerArgs;
227
+ let innerPrefix = "";
228
+ if (own.module !== null) {
229
+ innerCommand = "python";
230
+ innerArgs = ["-m", own.module, ...args.slice(own.next)];
231
+ }
232
+ else {
233
+ const runner = args[own.next];
234
+ if (runner === undefined)
235
+ return { kind: "refused", reason: `\`${grammar.name}\` was given no command to run.` };
236
+ innerCommand = runner;
237
+ innerArgs = args.slice(own.next + 1);
238
+ if (grammar.envPrefixedRunner === true) {
239
+ const prefixed = /^([A-Za-z0-9_.-]+:)(.+)$/.exec(runner);
240
+ if (prefixed !== null) {
241
+ innerPrefix = prefixed[1];
242
+ innerCommand = prefixed[2];
243
+ }
244
+ }
245
+ }
246
+ if (WRAPPER_BINARIES.has(baseNameOf(innerCommand))) {
247
+ return { kind: "refused", reason: `"${[command, ...args].join(" ")}" wraps another wrapper; declare the inner one alone.` };
248
+ }
249
+ return {
250
+ kind: "wrapped",
251
+ wrapper: {
252
+ name: grammar.name,
253
+ ecosystem: grammar.ecosystem,
254
+ command,
255
+ args: wrapperArgs,
256
+ innerPrefix,
257
+ projectDir,
258
+ downloads: grammar.downloads === true,
259
+ },
260
+ inner: { command: innerCommand, args: innerArgs },
261
+ };
262
+ }
263
+ /** Where the module flag starts, so the wrapper's own tokens stop before it: `uv run -m pytest` spawns as `uv run python -m pytest`. */
264
+ function moduleFlagStart(args, from, grammar) {
265
+ for (let i = from; i < args.length; i += 1) {
266
+ const name = args[i].split("=")[0];
267
+ if (grammar.moduleFlags?.includes(name) === true)
268
+ return i;
269
+ }
270
+ return args.length;
271
+ }
272
+ /** The argv to spawn: the wrapper, its own tokens, then the runner with its (reporter-extended) args. */
273
+ export function wrappedSpawnArgs(wrapper, runnerCommand, runnerArgs) {
274
+ return [...wrapper.args, `${wrapper.innerPrefix}${runnerCommand}`, ...runnerArgs];
275
+ }
276
+ const QUERY_TIMEOUT_MS = 20_000;
277
+ const MAX_WRAPPER_CONFIG_BYTES = 4 * 1024 * 1024;
278
+ const MAX_GLOB_SEGMENTS = 32;
279
+ function nearestAncestorWith(start, entry) {
280
+ let dir = resolve(start);
281
+ for (;;) {
282
+ if (existsSync(join(dir, entry)))
283
+ return dir;
284
+ const parent = dirname(dir);
285
+ if (parent === dir)
286
+ return null;
287
+ dir = parent;
288
+ }
289
+ }
290
+ /**
291
+ * The directory uv keeps a project's environment under: the workspace root when the project is a member
292
+ * of a uv workspace (uv's own rule -- one environment per workspace), else the project itself. The nearest
293
+ * ancestor declaring `[tool.uv.workspace]` decides; a project its `members` do not name, or its `exclude`
294
+ * names, stays on its own.
295
+ */
296
+ function uvEnvironmentRoot(projectRoot) {
297
+ let dir = resolve(projectRoot);
298
+ for (;;) {
299
+ const workspace = uvWorkspaceTable(join(dir, "pyproject.toml"));
300
+ if (workspace !== null) {
301
+ const member = relative(dir, projectRoot).split(sep).join("/");
302
+ if (member === "")
303
+ return dir;
304
+ const named = (globs) => globs.some((glob) => globMatches(glob, member));
305
+ return named(workspace.members) && !named(workspace.exclude) ? dir : projectRoot;
306
+ }
307
+ const parent = dirname(dir);
308
+ if (parent === dir)
309
+ return projectRoot;
310
+ dir = parent;
311
+ }
312
+ }
313
+ function uvWorkspaceTable(pyproject) {
314
+ const read = readBoundedRegularFile(pyproject, MAX_WRAPPER_CONFIG_BYTES);
315
+ if (!read.ok)
316
+ return null;
317
+ const lines = read.text.split(/\r?\n/).map((line) => line.replace(/\s+#.*$|^\s*#.*$/, ""));
318
+ const start = lines.findIndex((line) => line.trim() === "[tool.uv.workspace]");
319
+ if (start < 0)
320
+ return null;
321
+ const end = lines.findIndex((line, i) => i > start && line.trimStart().startsWith("["));
322
+ const body = lines.slice(start + 1, end < 0 ? lines.length : end);
323
+ const array = (key) => {
324
+ const first = body.findIndex((line) => assignmentValue(line.replace(/\[.*$/, ""), key) !== null && line.includes("["));
325
+ if (first < 0)
326
+ return [];
327
+ const collected = [];
328
+ let piece = body[first].slice(body[first].indexOf("[") + 1);
329
+ for (let next = first;;) {
330
+ const close = piece.indexOf("]");
331
+ if (close !== -1) {
332
+ collected.push(piece.slice(0, close));
333
+ break;
334
+ }
335
+ collected.push(piece);
336
+ next += 1;
337
+ if (next >= body.length)
338
+ return [];
339
+ piece = body[next];
340
+ }
341
+ return [...collected.join("\n").matchAll(/"([^"]*)"|'([^']*)'/g)].map((m) => (m[1] ?? m[2]).replace(/\/+$/, ""));
342
+ };
343
+ return { members: array("members"), exclude: array("exclude") };
344
+ }
345
+ function globMatches(glob, path) {
346
+ const globSegments = glob.split("/");
347
+ const pathSegments = path.split("/");
348
+ if (globSegments.length > MAX_GLOB_SEGMENTS || pathSegments.length > MAX_GLOB_SEGMENTS * 4)
349
+ return false;
350
+ const compiled = globSegments.map((segment) => (segment === "**" ? "**" : compileGlob(segment)));
351
+ if (compiled.some((entry) => entry !== "**" && !entry.ok))
352
+ return false;
353
+ const memo = new Map();
354
+ const matchesFrom = (globIndex, pathIndex) => {
355
+ const key = globIndex * (pathSegments.length + 1) + pathIndex;
356
+ const known = memo.get(key);
357
+ if (known !== undefined)
358
+ return known;
359
+ let result;
360
+ const entry = compiled[globIndex];
361
+ if (entry === undefined)
362
+ result = pathIndex === pathSegments.length;
363
+ else if (entry === "**") {
364
+ result = false;
365
+ for (let skip = pathIndex; skip <= pathSegments.length && !result; skip += 1)
366
+ result = matchesFrom(globIndex + 1, skip);
367
+ }
368
+ else
369
+ result = entry.ok && pathIndex < pathSegments.length && entry.matcher.test(pathSegments[pathIndex]) && matchesFrom(globIndex + 1, pathIndex + 1);
370
+ memo.set(key, result);
371
+ return result;
372
+ };
373
+ return matchesFrom(0, 0);
374
+ }
375
+ /** A virtualenv directory and the prefix of the interpreter it was created from (`home` in pyvenv.cfg is that interpreter's bin/). */
376
+ function venvRoots(venv) {
377
+ const roots = [venv];
378
+ const cfg = readBoundedRegularFile(join(venv, "pyvenv.cfg"), MAX_WRAPPER_CONFIG_BYTES);
379
+ if (!cfg.ok)
380
+ return roots;
381
+ for (const line of cfg.text.split(/\r?\n/)) {
382
+ const home = assignmentValue(line, "home");
383
+ if (home !== null && isAbsolute(home)) {
384
+ roots.push(dirname(home));
385
+ break;
386
+ }
387
+ }
388
+ return roots;
389
+ }
390
+ function isVenv(dir) {
391
+ return existsSync(join(dir, "pyvenv.cfg"));
392
+ }
393
+ function onPath(binary, env) {
394
+ if (isAbsolute(binary) || binary.includes("/"))
395
+ return existsSync(binary) ? resolve(binary) : null;
396
+ const path = env["PATH"] ?? process.env["PATH"] ?? "";
397
+ for (const dir of path.split(delimiter)) {
398
+ if (dir === "")
399
+ continue;
400
+ const candidate = join(dir, binary);
401
+ try {
402
+ accessSync(candidate, fsConstants.X_OK);
403
+ return candidate;
404
+ }
405
+ catch {
406
+ continue;
407
+ }
408
+ }
409
+ return null;
410
+ }
411
+ /** A wrapper installed as a script (poetry, pipenv, pdm, hatch via pipx) runs on an interpreter of its own, which the sandbox must see too. */
412
+ function scriptInterpreterRoots(binaryPath) {
413
+ let real;
414
+ try {
415
+ real = realpathSync(binaryPath);
416
+ }
417
+ catch {
418
+ return [];
419
+ }
420
+ const buffer = Buffer.alloc(256);
421
+ let read = 0;
422
+ try {
423
+ const fd = openSync(real, "r");
424
+ try {
425
+ read = readSync(fd, buffer, 0, buffer.length, 0);
426
+ }
427
+ finally {
428
+ closeSync(fd);
429
+ }
430
+ }
431
+ catch {
432
+ return [];
433
+ }
434
+ const firstLine = buffer.subarray(0, read).toString("utf8").split("\n")[0] ?? "";
435
+ if (!firstLine.startsWith("#!"))
436
+ return [dirname(real)];
437
+ // Only a virtualenv interpreter (pipx's layout) is bound: a system one (`/bin/sh`,
438
+ // `/usr/bin/env python3`) is already visible, and its prefix can be `/` itself.
439
+ const interpreter = firstLine.slice(2).trim().split(/\s+/)[0] ?? "";
440
+ if (!isAbsolute(interpreter))
441
+ return [dirname(real)];
442
+ const prefix = dirname(dirname(interpreter));
443
+ return [dirname(real), ...(isVenv(prefix) ? venvRoots(prefix) : [])];
444
+ }
445
+ function insideRepository(binaryPath, repositoryRoots) {
446
+ try {
447
+ const real = realpathSync(binaryPath);
448
+ return repositoryRoots.some((root) => isInside(realpathSync(root), real));
449
+ }
450
+ catch {
451
+ return true;
452
+ }
453
+ }
454
+ /** The wrapper's own read-only query, run on the host before the sandbox exists. */
455
+ function query(binaryPath, args, cwd, env, repositoryRoots) {
456
+ if (insideRepository(binaryPath, repositoryRoots)) {
457
+ return {
458
+ ok: false,
459
+ reason: `${basename(binaryPath)} resolves to a file inside the repository (${binaryPath}), so it was not run on the host to find the environment; put an installed copy on PATH instead.`,
460
+ };
461
+ }
462
+ try {
463
+ const out = execFileSync(binaryPath, args, {
464
+ cwd,
465
+ env: buildChildEnvironment({ source: { ...process.env, ...env } }).env,
466
+ encoding: "utf8",
467
+ timeout: QUERY_TIMEOUT_MS,
468
+ stdio: ["ignore", "pipe", "ignore"],
469
+ });
470
+ const line = out.trim().split("\n").pop()?.trim() ?? "";
471
+ return { ok: true, line: line === "" ? null : line };
472
+ }
473
+ catch {
474
+ return { ok: true, line: null };
475
+ }
476
+ }
477
+ function queriedOnHost(name) {
478
+ return `${name} was run on the host, outside the sandbox and with a filtered environment, once to find where this project's environment lives.`;
479
+ }
480
+ /**
481
+ * Where a wrapper's environment lives, and how to run it without it changing: the read-only roots
482
+ * the sandbox binds, the offline switches, and what that means for the caller. Refuses -- with
483
+ * the command that fixes it -- when there is no environment yet, because creating one is an
484
+ * install, and a run never installs.
485
+ *
486
+ * `env` is what the child will run with; `runnerCommand` is the runner's own name, needed for the
487
+ * wrappers that would otherwise download it.
488
+ */
489
+ export function locateWrapperEnvironment(wrapper, cwd, env, runnerCommand) {
490
+ const projectStart = wrapper.projectDir === null ? cwd : resolve(cwd, wrapper.projectDir);
491
+ const binary = onPath(wrapper.command, env);
492
+ const toolRoots = binary === null ? [] : scriptInterpreterRoots(binary);
493
+ if (wrapper.ecosystem === "node") {
494
+ if (!wrapper.downloads)
495
+ return { ok: true, readOnlyRoots: toolRoots, env: {}, disclosures: [] };
496
+ const runner = runnerCommand ?? "";
497
+ if (runner === "node")
498
+ return { ok: true, readOnlyRoots: toolRoots, env: { npm_config_offline: "true" }, disclosures: [] };
499
+ const root = nearestAncestorWith(projectStart, join("node_modules", ".bin", runner));
500
+ if (root === null) {
501
+ return {
502
+ ok: false,
503
+ reason: `\`${wrapper.name} ${runner}\` would download ${runner}: it is not installed in node_modules here or in any ` +
504
+ "parent directory. A run never installs anything -- install it with the project's package manager first.",
505
+ };
506
+ }
507
+ return {
508
+ ok: true,
509
+ readOnlyRoots: [...toolRoots, join(root, "node_modules")],
510
+ env: { npm_config_offline: "true" },
511
+ disclosures: [`${wrapper.name} runs offline (npm_config_offline), so it uses only what is installed.`],
512
+ };
513
+ }
514
+ const projectRoot = nearestAncestorWith(projectStart, "pyproject.toml") ?? projectStart;
515
+ const repositoryRoots = [resolve(cwd), projectRoot];
516
+ const inProject = join(projectRoot, ".venv");
517
+ const ask = (args) => (binary === null ? { ok: true, line: null } : query(binary, args, projectStart, env, repositoryRoots));
518
+ switch (wrapper.name) {
519
+ case "uv run": {
520
+ const uvRoot = uvEnvironmentRoot(projectRoot);
521
+ const configured = env["UV_PROJECT_ENVIRONMENT"] ?? process.env["UV_PROJECT_ENVIRONMENT"];
522
+ const venv = resolve(uvRoot, configured ?? ".venv");
523
+ if (!isVenv(venv)) {
524
+ return { ok: false, reason: `\`uv run\` has no environment at ${venv}. Run \`uv sync\` first -- a run never creates or syncs one.` };
525
+ }
526
+ return {
527
+ ok: true,
528
+ readOnlyRoots: [...toolRoots, ...venvRoots(venv)],
529
+ env: { UV_OFFLINE: "1", UV_NO_SYNC: "1", UV_PYTHON_DOWNLOADS: "never", UV_NO_CACHE: "1" },
530
+ disclosures: ["uv runs offline and without syncing (UV_OFFLINE, UV_NO_SYNC): it uses the environment exactly as it is installed."],
531
+ };
532
+ }
533
+ case "poetry run": {
534
+ let queried = false;
535
+ let found = isVenv(inProject) ? inProject : null;
536
+ if (found === null) {
537
+ const answer = ask(["env", "info", "--path"]);
538
+ if (!answer.ok)
539
+ return answer;
540
+ found = answer.line;
541
+ queried = binary !== null;
542
+ }
543
+ if (found === null || !isVenv(found)) {
544
+ return { ok: false, reason: "`poetry run` has no environment for this project. Run `poetry install` first -- a run never creates one." };
545
+ }
546
+ let cacheDirectory;
547
+ try {
548
+ cacheDirectory = mkdtempSync(join(tmpdir(), "descry-poetry-cache-"));
549
+ }
550
+ catch (error) {
551
+ return { ok: false, reason: `a private cache directory for \`poetry run\` could not be created (${error instanceof Error ? error.message : String(error)}); nothing was run.` };
552
+ }
553
+ return {
554
+ ok: true,
555
+ readOnlyRoots: [...toolRoots, ...venvRoots(found)],
556
+ env: { POETRY_CACHE_DIR: cacheDirectory },
557
+ disclosures: queried ? [queriedOnHost("poetry")] : [],
558
+ cleanup: () => rmSync(cacheDirectory, { recursive: true, force: true }),
559
+ };
560
+ }
561
+ case "pipenv run": {
562
+ const answer = ask(["--venv"]);
563
+ if (!answer.ok)
564
+ return answer;
565
+ if (answer.line === null || !isVenv(answer.line)) {
566
+ return { ok: false, reason: "`pipenv run` has no environment for this project. Run `pipenv install` first -- a run never creates one." };
567
+ }
568
+ return { ok: true, readOnlyRoots: [...toolRoots, ...venvRoots(answer.line)], env: {}, disclosures: [queriedOnHost("pipenv")] };
569
+ }
570
+ case "pdm run": {
571
+ let venv = isVenv(inProject) ? inProject : null;
572
+ let queried = false;
573
+ if (venv === null && binary !== null) {
574
+ const answer = ask(["info", "--python"]);
575
+ if (!answer.ok)
576
+ return answer;
577
+ queried = true;
578
+ if (answer.line !== null && isAbsolute(answer.line))
579
+ venv = dirname(dirname(answer.line));
580
+ }
581
+ if (venv === null || !isVenv(venv)) {
582
+ return { ok: false, reason: "`pdm run` has no virtualenv for this project. Run `pdm install` first -- a run never creates one." };
583
+ }
584
+ return { ok: true, readOnlyRoots: [...toolRoots, ...venvRoots(venv)], env: {}, disclosures: queried ? [queriedOnHost("pdm")] : [] };
585
+ }
586
+ case "hatch run": {
587
+ const answer = ask(["env", "find"]);
588
+ if (!answer.ok)
589
+ return answer;
590
+ if (answer.line === null || !isVenv(answer.line)) {
591
+ return { ok: false, reason: "`hatch run` has no environment for this project yet. Run `hatch env create` first -- a run never creates one." };
592
+ }
593
+ return {
594
+ ok: true,
595
+ readOnlyRoots: [...toolRoots, ...venvRoots(answer.line)],
596
+ env: {},
597
+ disclosures: [queriedOnHost("hatch"), "hatch syncs an environment whose dependencies changed; with the network denied that sync fails, and its output says so."],
598
+ };
599
+ }
600
+ default:
601
+ return { ok: false, reason: `No environment rule for \`${wrapper.name}\`.` };
602
+ }
603
+ }
604
+ //# sourceMappingURL=runner-wrappers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-wrappers.js","sourceRoot":"","sources":["../src/runner-wrappers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,SAAS,IAAI,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7I,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEnG,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA6B5E,MAAM,QAAQ,GAAc,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;AAChE,MAAM,QAAQ,GAAG,sHAAsH,CAAC;AACxI,MAAM,YAAY,GAAG,2EAA2E,CAAC;AAEjG,MAAM,QAAQ,GAA8B;IAC1C;QACE,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC1B,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE;YACN,SAAS,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,CAAC;YAClF,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,CAAC;SAC/G;QACD,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE;YACL,SAAS,EAAE;gBACT,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW;gBAC7G,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe;aAC1H;YACD,YAAY,EAAE;gBACZ,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,qBAAqB;gBAC/G,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc;gBACvG,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe;aAC/E;YACD,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,QAAQ,EAAE,UAAU,EAAE,kCAAkC,EAAE,IAAI,EAAE,kCAAkC,EAAE,cAAc,EAAE,kCAAkC,EAAE;SAC5O;QACD,WAAW,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC;KAChC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;QAClC,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE;YACN,SAAS,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,CAAC;YACnD,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC;SACjJ;QACD,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;QAClC,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE;QAC7E,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;QAC5B,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE;QAC9F,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE;YACL,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC;YAC5D,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,CAAC;YAC3E,OAAO,EAAE,EAAE,IAAI,EAAE,gCAAgC,EAAE,QAAQ,EAAE,gCAAgC,EAAE,QAAQ,EAAE,gCAAgC,EAAE;SAC5I;KACF;IACD;QACE,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;QAChC,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE;QAC7G,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,QAAQ;QACf,iBAAiB,EAAE,IAAI;KACxB;IACD;QACE,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;QAC5B,SAAS,EAAE,MAAM;QACjB,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE;YACL,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC;YAC1C,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC;YACtE,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE;SACxD;QACD,SAAS,EAAE,IAAI;KAChB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;QAC5B,SAAS,EAAE,MAAM;QACjB,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;QACrD,UAAU,EAAE,MAAM;QAClB,KAAK,EAAE;YACL,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC;YAC/D,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC;YACrC,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,0CAA0C,EAAE,KAAK,EAAE,0CAA0C,EAAE;SACvK;QACD,SAAS,EAAE,IAAI;KAChB;IACD;QACE,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;QAC9B,SAAS,EAAE,MAAM;QACjB,MAAM,EAAE;YACN,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC;YAC5C,YAAY,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC;YAChC,OAAO,EAAE,EAAE,IAAI,EAAE,6CAA6C,EAAE,aAAa,EAAE,6CAA6C,EAAE;SAC/H;QACD,UAAU,EAAE,MAAM;QAClB,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,6CAA6C,EAAE,EAAE;KACvK;IACD;QACE,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;QAC9B,SAAS,EAAE,MAAM;QACjB,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,MAAM;QAClB,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;QAC9B,SAAS,EAAE,MAAM;QACjB,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,YAAY,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE;QAC9E,SAAS,EAAE,IAAI;KAChB;CACF,CAAC;AAEF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAsBlF,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC;AACjD,CAAC;AAMD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;AAEjF,sHAAsH;AACtH,SAAS,SAAS,CAAC,OAAuB,EAAE,KAAgB,EAAE,KAAa,EAAE,MAAyB,EAAE,KAAa;IACnH,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACzB,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC/E,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,GAAG;YAAE,MAAM;QACnD,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,WAAW,IAAI,IAAI,OAAO,GAAG,EAAE,CAAC;QACxG,IAAI,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACpE,MAAM,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACvC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,MAAM,IAAI,uBAAuB,EAAE,CAAC;YAC5H,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QACjF,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACtC,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,MAAM,IAAI,kDAAkD,EAAE,CAAC;YACrI,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,UAAU,GAAG,KAAK,CAAC;YAChD,CAAC,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,MAAM,IAAI,mCAAmC,MAAM,IAAI,EAAE,CAAC;YAC5H,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EACJ,KAAK,OAAO,CAAC,IAAI,gBAAgB,IAAI,qCAAqC,OAAO,CAAC,IAAI,8BAA8B;gBACpH,mHAAmH;gBACnH,oCAAoC;SACvC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,IAAuB;IAC1E,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpF,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAEnD,sGAAsG;IACtG,MAAM,MAAM,GACV,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9I,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAClE,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;IACpB,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC;YACnC,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,IAAI,cAAc,OAAO,CAAC,IAAI,qCAAqC;aAClI,CAAC;QACJ,CAAC;QACD,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IACD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IAC5D,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC;IACvD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtG,IAAI,YAAoB,CAAC;IACzB,IAAI,SAA4B,CAAC;IACjC,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACxB,YAAY,GAAG,QAAQ,CAAC;QACxB,SAAS,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,iCAAiC,EAAE,CAAC;QACjH,YAAY,GAAG,MAAM,CAAC;QACtB,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;gBAC3B,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACnD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,uDAAuD,EAAE,CAAC;IAC9H,CAAC;IACD,OAAO;QACL,IAAI,EAAE,SAAS;QACf,OAAO,EAAE;YACP,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO;YACP,IAAI,EAAE,WAAW;YACjB,WAAW;YACX,UAAU;YACV,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,IAAI;SACtC;QACD,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE;KAClD,CAAC;AACJ,CAAC;AAED,wIAAwI;AACxI,SAAS,eAAe,CAAC,IAAuB,EAAE,IAAY,EAAE,OAAuB;IACrF,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACrC,IAAI,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,gBAAgB,CAAC,OAAqB,EAAE,aAAqB,EAAE,UAA6B;IAC1G,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,WAAW,GAAG,aAAa,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC;AACpF,CAAC;AAiBD,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,wBAAwB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AACjD,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,SAAS,mBAAmB,CAAC,KAAa,EAAE,KAAa;IACvD,IAAI,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACzB,SAAS,CAAC;QACR,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,WAAmB;IAC5C,IAAI,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/B,SAAS,CAAC;QACR,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAChE,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/D,IAAI,MAAM,KAAK,EAAE;gBAAE,OAAO,GAAG,CAAC;YAC9B,MAAM,KAAK,GAAG,CAAC,KAAwB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5F,OAAO,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;QACnF,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,WAAW,CAAC;QACvC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB;IACzC,MAAM,IAAI,GAAG,sBAAsB,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;IACzE,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,qBAAqB,CAAC,CAAC;IAC/E,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACxF,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,CAAC,GAAW,EAAY,EAAE;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACvH,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QACzB,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,KAAK,IAAI,IAAI,GAAG,KAAK,IAAM,CAAC;YAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;gBACtC,MAAM;YACR,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,IAAI,IAAI,CAAC,CAAC;YACV,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO,EAAE,CAAC;YACnC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAE,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IACpH,CAAC,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,IAAY;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,YAAY,CAAC,MAAM,GAAG,iBAAiB,IAAI,YAAY,CAAC,MAAM,GAAG,iBAAiB,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACzG,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACjG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;IACxC,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAW,EAAE;QACpE,MAAM,GAAG,GAAG,SAAS,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACtC,IAAI,MAAe,CAAC;QACpB,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,GAAG,SAAS,KAAK,YAAY,CAAC,MAAM,CAAC;aAC/D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,GAAG,KAAK,CAAC;YACf,KAAK,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC;gBAAE,MAAM,GAAG,WAAW,CAAC,SAAS,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1H,CAAC;;YAAM,MAAM,GAAG,KAAK,CAAC,EAAE,IAAI,SAAS,GAAG,YAAY,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAE,CAAC,IAAI,WAAW,CAAC,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QACzJ,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtB,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,OAAO,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,sIAAsI;AACtI,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;IACrB,MAAM,GAAG,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,wBAAwB,CAAC,CAAC;IACvF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,IAAI,KAAK,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1B,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,GAAW;IACzB,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,MAAM,CAAC,MAAc,EAAE,GAAiD;IAC/E,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnG,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACtD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,IAAI,GAAG,KAAK,EAAE;YAAE,SAAS;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,UAAU,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YACxC,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+IAA+I;AAC/I,SAAS,sBAAsB,CAAC,UAAkB;IAChD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC;YACH,IAAI,GAAG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjF,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,mFAAmF;IACnF,gFAAgF;IAChF,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC;AAID,SAAS,gBAAgB,CAAC,UAAkB,EAAE,eAAkC;IAC9E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACtC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,SAAS,KAAK,CACZ,UAAkB,EAClB,IAAuB,EACvB,GAAW,EACX,GAAiD,EACjD,eAAkC;IAElC,IAAI,gBAAgB,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,CAAC;QAClD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,8CAA8C,UAAU,kGAAkG;SAC1L,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,EAAE;YACzC,GAAG;YACH,GAAG,EAAE,qBAAqB,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG;YACtE,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,gBAAgB;YACzB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,GAAG,IAAI,iIAAiI,CAAC;AAClJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAqB,EACrB,GAAW,EACX,GAAiD,EACjD,aAAsB;IAEtB,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAExE,IAAI,OAAO,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,SAAS;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QAChG,MAAM,MAAM,GAAG,aAAa,IAAI,EAAE,CAAC;QACnC,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QAC3H,MAAM,IAAI,GAAG,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACrF,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EACJ,KAAK,OAAO,CAAC,IAAI,IAAI,MAAM,qBAAqB,MAAM,uDAAuD;oBAC7G,yGAAyG;aAC5G,CAAC;QACJ,CAAC;QACD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,aAAa,EAAE,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YACzD,GAAG,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE;YACnC,WAAW,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,wEAAwE,CAAC;SACvG,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,mBAAmB,CAAC,YAAY,EAAE,gBAAgB,CAAC,IAAI,YAAY,CAAC;IACxF,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,CAAC,IAAuB,EAAgB,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;IAC9J,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAC9C,MAAM,UAAU,GAAG,GAAG,CAAC,wBAAwB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YAC1F,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,IAAI,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oCAAoC,IAAI,8DAA8D,EAAE,CAAC;YACvI,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,aAAa,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;gBACjD,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE;gBACzF,WAAW,EAAE,CAAC,mHAAmH,CAAC;aACnI,CAAC;QACJ,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,KAAK,GAAkB,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;YAChE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAC9C,IAAI,CAAC,MAAM,CAAC,EAAE;oBAAE,OAAO,MAAM,CAAC;gBAC9B,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;gBACpB,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;YAC5B,CAAC;YACD,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,0GAA0G,EAAE,CAAC;YAC3I,CAAC;YACD,IAAI,cAAsB,CAAC;YAC3B,IAAI,CAAC;gBACH,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;YACvE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sEAAsE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC;YAClL,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,aAAa,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;gBAClD,GAAG,EAAE,EAAE,gBAAgB,EAAE,cAAc,EAAE;gBACzC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBACrD,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;aACxE,CAAC;QACJ,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,OAAO,MAAM,CAAC;YAC9B,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,0GAA0G,EAAE,CAAC;YAC3I,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACjI,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,IAAI,GAAkB,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/D,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;gBACzC,IAAI,CAAC,MAAM,CAAC,EAAE;oBAAE,OAAO,MAAM,CAAC;gBAC9B,OAAO,GAAG,IAAI,CAAC;gBACf,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;oBAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5F,CAAC;YACD,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mGAAmG,EAAE,CAAC;YACpI,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACtI,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,OAAO,MAAM,CAAC;YAC9B,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,+GAA+G,EAAE,CAAC;YAChJ,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,aAAa,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACxD,GAAG,EAAE,EAAE;gBACP,WAAW,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,yHAAyH,CAAC;aACjK,CAAC;QACJ,CAAC;QACD;YACE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,6BAA6B,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;IACjF,CAAC;AACH,CAAC"}