@poe-platform/safe-bash 0.1.826 → 0.1.828

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 (174) hide show
  1. package/dist/image-ast/index.js +39 -18
  2. package/dist/pdf-ast/image.js +1 -1
  3. package/dist/pdf-ast/index.js +1 -1
  4. package/dist/pdf-ast/vendor/pdfjs-fonts.mjs +9 -3
  5. package/dist/safe-bash/chunks/{chunk-VWLQDZFF.js → chunk-C7RBTLYX.js} +12 -5
  6. package/dist/safe-bash/chunks/{chunk-TZRVK3NU.js → chunk-HWYINF6Y.js} +1 -1
  7. package/dist/safe-bash/chunks/{chunk-AGHV53VF.js → chunk-M6XFU6LQ.js} +3 -1
  8. package/dist/safe-bash/chunks/{chunk-ZJAXMB5M.js → chunk-SGHFQIZB.js} +1 -1
  9. package/dist/safe-bash/chunks/{chunk-363QOIDR.js → chunk-T6FHWSHM.js} +3 -1
  10. package/dist/safe-bash/chunks/{chunk-RAFD5ZAH.js → chunk-Y67A2DE4.js} +1 -1
  11. package/dist/safe-bash/command-chunks/{chunk-VKTM2SOL.js → chunk-2EEIB5O3.js} +192 -489
  12. package/dist/safe-bash/command-chunks/{chunk-FMGNXOMV.js → chunk-2L3NMRLG.js} +7 -3
  13. package/dist/safe-bash/command-chunks/{chunk-DAQO64WC.js → chunk-2YKOJPIW.js} +1 -1
  14. package/dist/safe-bash/command-chunks/{chunk-EPYJSPOY.js → chunk-3QCW4VQF.js} +12 -8
  15. package/dist/safe-bash/command-chunks/{chunk-YRBFNT5B.js → chunk-3YL2TMLA.js} +10 -1
  16. package/dist/safe-bash/command-chunks/{chunk-UWIDPTOB.js → chunk-3ZCABR5P.js} +1 -1
  17. package/dist/safe-bash/command-chunks/{chunk-5H7ZHP7F.js → chunk-43NDRBKY.js} +1 -1
  18. package/dist/safe-bash/command-chunks/{chunk-BBOYR6LV.js → chunk-46GA576V.js} +3 -3
  19. package/dist/safe-bash/command-chunks/{chunk-WPT2FCHH.js → chunk-4SLPM2WM.js} +1 -1
  20. package/dist/safe-bash/command-chunks/{chunk-7ZQVMPSB.js → chunk-5CAXR62E.js} +1 -1
  21. package/dist/safe-bash/command-chunks/{chunk-3DTHX5UU.js → chunk-66653AEZ.js} +40 -14
  22. package/dist/safe-bash/command-chunks/{chunk-ETFJ4L7F.js → chunk-6OLE6CLV.js} +1 -1
  23. package/dist/safe-bash/command-chunks/{chunk-2KMNVJB7.js → chunk-A7PKUIJT.js} +1 -1
  24. package/dist/safe-bash/command-chunks/{chunk-O3FTKLWR.js → chunk-BXOBM4HJ.js} +26 -17
  25. package/dist/safe-bash/command-chunks/{chunk-P66Q5F6K.js → chunk-DEQ47SBQ.js} +3 -3
  26. package/dist/safe-bash/command-chunks/{chunk-ZPBL7TYJ.js → chunk-EF3RAQ7M.js} +1 -1
  27. package/dist/safe-bash/command-chunks/{chunk-RQTFK7AV.js → chunk-EOO3NLD5.js} +1 -1
  28. package/dist/safe-bash/command-chunks/{chunk-EV7A5FNN.js → chunk-FFFRLPXU.js} +2 -2
  29. package/dist/safe-bash/command-chunks/{chunk-MQCLG2CT.js → chunk-FMXBLKWO.js} +1 -1
  30. package/dist/safe-bash/command-chunks/{chunk-4MVQE6CT.js → chunk-FYTBEGSY.js} +1 -1
  31. package/dist/safe-bash/command-chunks/chunk-HS2L7I4N.js +219 -0
  32. package/dist/safe-bash/command-chunks/{chunk-NXZJJM4J.js → chunk-IGXH5W5Z.js} +1 -1
  33. package/dist/safe-bash/command-chunks/{chunk-CMJBRGU2.js → chunk-IHQZKUBS.js} +1 -1
  34. package/dist/safe-bash/command-chunks/chunk-JADJ4BMN.js +1519 -0
  35. package/dist/safe-bash/command-chunks/{chunk-5AQAWIYK.js → chunk-JEZC5V3B.js} +4 -0
  36. package/dist/safe-bash/command-chunks/{chunk-YB5TNDY6.js → chunk-K5VJ4NNL.js} +39 -5
  37. package/dist/safe-bash/command-chunks/{chunk-7RQGRFHJ.js → chunk-KHWDEAE4.js} +2 -2
  38. package/dist/safe-bash/command-chunks/chunk-KSCVKF7I.js +604 -0
  39. package/dist/safe-bash/command-chunks/{chunk-3NJETNC2.js → chunk-MBXNG6C3.js} +2 -2
  40. package/dist/safe-bash/command-chunks/{chunk-WKS2PAZL.js → chunk-N63IGO5F.js} +10 -1
  41. package/dist/safe-bash/command-chunks/{chunk-3DID6MQY.js → chunk-OWTQYLID.js} +2 -2
  42. package/dist/safe-bash/command-chunks/{chunk-4EA7WI3L.js → chunk-QOOQD6BD.js} +42 -33
  43. package/dist/safe-bash/command-chunks/{chunk-R3SLT3ZX.js → chunk-R6GON4H3.js} +11 -1
  44. package/dist/safe-bash/command-chunks/{chunk-2GILUQJY.js → chunk-R7ZGDHME.js} +3 -3
  45. package/dist/safe-bash/command-chunks/{chunk-LKAFLJ5L.js → chunk-RWQKX44L.js} +1 -1
  46. package/dist/safe-bash/command-chunks/{chunk-PKH57OIC.js → chunk-SG2KOOD4.js} +2 -2
  47. package/dist/safe-bash/command-chunks/{chunk-HCPEYQKT.js → chunk-SIAN5LI3.js} +286 -307
  48. package/dist/safe-bash/command-chunks/chunk-T4TGJYFV.js +60 -0
  49. package/dist/safe-bash/command-chunks/{chunk-T7RT2BNL.js → chunk-U5TQVW64.js} +191 -146
  50. package/dist/safe-bash/command-chunks/{chunk-NXCJNPL3.js → chunk-UCE77LYV.js} +2 -1
  51. package/dist/safe-bash/command-chunks/{chunk-OT75C5YS.js → chunk-UGDQSGUZ.js} +1 -1
  52. package/dist/safe-bash/command-chunks/{chunk-EWECMOQ5.js → chunk-UIHPHIKI.js} +1 -1
  53. package/dist/safe-bash/command-chunks/{chunk-4XYGJB24.js → chunk-VJXPNNBD.js} +3 -3
  54. package/dist/safe-bash/command-chunks/{chunk-E5CDHXFA.js → chunk-VOR6YDZC.js} +26 -1
  55. package/dist/safe-bash/command-chunks/{chunk-ZIDESNHW.js → chunk-VQINIBCZ.js} +1 -1
  56. package/dist/safe-bash/command-chunks/chunk-VSNVYOK2.js +30 -0
  57. package/dist/safe-bash/command-chunks/{chunk-Q2ACHUTY.js → chunk-WRO3PB2M.js} +1 -1
  58. package/dist/safe-bash/command-chunks/{chunk-RUAGHZNF.js → chunk-X5ODTF3E.js} +7 -5
  59. package/dist/safe-bash/command-chunks/{chunk-LH4VBNF6.js → chunk-XGTSP2CP.js} +84 -16
  60. package/dist/safe-bash/command-chunks/{chunk-J3VS55K4.js → chunk-YHRESVJ7.js} +9 -3
  61. package/dist/safe-bash/command-chunks/{chunk-K576GZED.js → chunk-YK6ZVCA2.js} +2 -2
  62. package/dist/safe-bash/command-chunks/{chunk-W5LH7D23.js → chunk-YR2A2L4J.js} +8 -8
  63. package/dist/safe-bash/command-chunks/{chunk-UYNJF5QN.js → chunk-ZALAWNOE.js} +76 -122
  64. package/dist/safe-bash/command-chunks/{pdf-renderer-346WYKSZ.js → pdf-renderer-5QWOVFA4.js} +1 -1
  65. package/dist/safe-bash/command-chunks/{prompt-tool-debug-3POFNRYP.js → prompt-tool-debug-G7ATE7D5.js} +6 -4
  66. package/dist/safe-bash/commands/bc/index.browser.js +1 -1
  67. package/dist/safe-bash/commands/llm/index.browser.js +5 -1
  68. package/dist/safe-bash/commands/llm/index.js +1 -1
  69. package/dist/safe-bash/commands/python/executor.browser.js +3 -1
  70. package/dist/safe-bash/commands/python/executor.js +1 -1
  71. package/dist/safe-bash/commands/python/index.browser.js +5 -1
  72. package/dist/safe-bash/commands/python/index.js +1 -1
  73. package/dist/safe-bash/core.browser.js +2 -2
  74. package/dist/safe-bash/full-core.browser.js +14 -6
  75. package/dist/safe-bash/plugins/index.browser.js +3 -3
  76. package/dist/safe-bash/registry-entry.browser.js +2 -2
  77. package/dist/safe-bash/search.browser.js +1 -1
  78. package/dist/safe-bash/shell/runtime.js +18 -7
  79. package/dist/safe-bash/shell/sync-extra-evaluators.js +2 -0
  80. package/dist/safe-bash/shell-entry.browser.js +2 -2
  81. package/dist/safe-bash-command-awk/awk-runtime.js +2 -2
  82. package/dist/safe-bash-command-awk/awk-syntax.js +1 -1
  83. package/dist/safe-bash-command-awk/awk.js +3 -3
  84. package/dist/safe-bash-command-awk/index.js +3 -3
  85. package/dist/safe-bash-command-ffmpeg/index.js +15 -12
  86. package/dist/safe-bash-command-ffprobe/index.js +2 -2
  87. package/dist/safe-bash-command-ffprobe/media.js +2 -2
  88. package/dist/safe-bash-command-git/git_rust.wasm +0 -0
  89. package/dist/safe-bash-command-gpg/index.js +11 -3
  90. package/dist/safe-bash-command-imagemagick/index.js +45 -12
  91. package/dist/safe-bash-command-llm/collections.js +6 -4
  92. package/dist/safe-bash-command-llm/command.js +4 -4
  93. package/dist/safe-bash-command-llm/import-json-document.d.ts +9 -2
  94. package/dist/safe-bash-command-llm/index.d.ts +2 -1
  95. package/dist/safe-bash-command-llm/index.js +10 -4
  96. package/dist/safe-bash-command-llm/loader-provider.d.ts +5 -0
  97. package/dist/safe-bash-command-mcp/index.js +10 -13
  98. package/dist/safe-bash-command-pdftoppm/index.js +2 -2
  99. package/dist/safe-bash-command-playwright-cli/index.js +2 -2
  100. package/dist/safe-bash-command-playwright-cli/playwright/ability-execution.d.ts +1 -0
  101. package/dist/safe-bash-command-playwright-cli/playwright/ability-execution.js +1 -1
  102. package/dist/safe-bash-command-playwright-cli/playwright/controller.d.ts +2 -0
  103. package/dist/safe-bash-command-playwright-cli/playwright/controller.js +2 -2
  104. package/dist/safe-bash-command-playwright-cli/playwright/index.js +2 -2
  105. package/dist/safe-bash-command-python/build-backend.d.ts +2 -0
  106. package/dist/safe-bash-command-python/cache.d.ts +1 -1
  107. package/dist/safe-bash-command-python/executor.d.ts +5 -2
  108. package/dist/safe-bash-command-python/executor.js +11 -6
  109. package/dist/safe-bash-command-python/host-capabilities.js +1 -1
  110. package/dist/safe-bash-command-python/index.js +11 -6
  111. package/dist/safe-bash-command-python/jspi.js +5 -3
  112. package/dist/safe-bash-command-python/manifest-file.d.ts +44 -0
  113. package/dist/safe-bash-command-python/manifest.d.ts +45 -0
  114. package/dist/safe-bash-command-python/provisioning.d.ts +20 -1
  115. package/dist/safe-bash-command-python/provisioning.js +3 -2
  116. package/dist/safe-bash-command-python/reply.js +7 -11
  117. package/dist/safe-bash-command-python/source-archive.js +2 -2
  118. package/dist/safe-bash-command-python/source-zip.js +2 -2
  119. package/dist/safe-bash-command-python/worker.js +34 -21
  120. package/dist/safe-bash-command-sqlite3/engine.d.ts +4 -0
  121. package/dist/safe-bash-command-sqlite3/index.js +174 -18
  122. package/dist/safe-bash-command-svgo/index.js +1 -1
  123. package/dist/safe-bash-command-tar/create.js +3 -3
  124. package/dist/safe-bash-command-tar/extract.js +3 -3
  125. package/dist/safe-bash-command-tar/index.js +5 -5
  126. package/dist/safe-bash-command-tar/modes.js +5 -5
  127. package/dist/safe-bash-command-tar/options.d.ts +1 -1
  128. package/dist/safe-bash-command-tar/options.js +1 -1
  129. package/dist/safe-bash-command-tar/stream.js +1 -1
  130. package/dist/safe-bash-command-wkhtmltopdf/index.js +1 -1
  131. package/dist/safe-bash-command-xan/argv.js +1 -1
  132. package/dist/safe-bash-command-xan/commands.js +3 -3
  133. package/dist/safe-bash-command-xan/index.js +3 -3
  134. package/dist/safe-bash-command-xan/io.js +2 -2
  135. package/dist/safe-bash-compression-engine/bounded-codec.js +3 -3
  136. package/dist/safe-bash-compression-engine/codec-loader.js +2 -2
  137. package/dist/safe-bash-compression-engine/files.js +6 -6
  138. package/dist/safe-bash-compression-engine/index.js +5 -5
  139. package/dist/safe-bash-compression-engine/operand.js +6 -6
  140. package/dist/safe-bash-compression-engine/options.js +1 -1
  141. package/dist/safe-bash-compression-engine/stream.js +5 -5
  142. package/dist/safe-bash-compression-engine/zstd-decode.js +4 -4
  143. package/dist/safe-bash-contracts/filesystem-descriptor.js +1 -1
  144. package/dist/safe-bash-contracts/filesystem-output.js +1 -1
  145. package/dist/safe-bash-csv-engine/index.js +4 -4
  146. package/dist/safe-bash-csv-engine/python-codec-aliases.js +1 -1
  147. package/dist/safe-bash-csv-engine/python-codepages.js +2 -2
  148. package/dist/safe-bash-csv-engine/python-utf16.js +3 -3
  149. package/dist/safe-bash-csv-engine/text-decoder.js +4 -4
  150. package/dist/safe-bash-graphviz-engine/index.js +1 -1
  151. package/dist/safe-bash-pager-engine/index.js +2 -2
  152. package/dist/safe-bash-query-engine/capture.js +3 -3
  153. package/dist/safe-bash-query-engine/delpaths.js +3 -3
  154. package/dist/safe-bash-query-engine/formats.js +2 -2
  155. package/dist/safe-bash-query-engine/index.js +10 -10
  156. package/dist/safe-bash-query-engine/indices.js +3 -3
  157. package/dist/safe-bash-query-engine/input.d.ts +3 -3
  158. package/dist/safe-bash-query-engine/input.js +1 -1
  159. package/dist/safe-bash-query-engine/interpreter.js +9 -9
  160. package/dist/safe-bash-query-engine/query-core.js +10 -10
  161. package/dist/safe-bash-query-engine/regex.js +4 -4
  162. package/dist/safe-bash-query-engine/splits.js +5 -5
  163. package/dist/safe-bash-query-engine/values.js +2 -2
  164. package/dist/safe-playwright-cloudflare/browser-code-executor.js +2 -2
  165. package/dist/safe-playwright-cloudflare/browser-guest-source.d.ts +2 -0
  166. package/dist/safe-playwright-cloudflare/browser-guest-source.js +36 -0
  167. package/dist/safe-playwright-cloudflare/browser-run-code-contract.d.ts +1 -1
  168. package/dist/safe-playwright-cloudflare/browser-run-code-guest.generated.d.ts +1 -2
  169. package/dist/safe-playwright-cloudflare/browser-run-code-guest.generated.js +2 -2
  170. package/dist/safe-playwright-cloudflare/browser-run-code.js +4 -1
  171. package/package.json +4 -3
  172. package/dist/safe-bash/command-chunks/chunk-BKQWFABY.js +0 -960
  173. package/dist/safe-bash/command-chunks/chunk-DV7TCGJR.js +0 -691
  174. package/dist/safe-bash/command-chunks/chunk-ZERCTWUI.js +0 -467
@@ -0,0 +1,604 @@
1
+ import {
2
+ pythonPublicationFile
3
+ } from "./chunk-HS2L7I4N.js";
4
+ import {
5
+ PythonFailure
6
+ } from "./chunk-TO6UNFEF.js";
7
+
8
+ // packages/safe-bash-command-python/src/invocation.ts
9
+ var PythonInvocationError = class extends Error {
10
+ constructor(message) {
11
+ super(message);
12
+ this.name = "PythonInvocationError";
13
+ }
14
+ };
15
+ function parsePythonInvocation(args, env) {
16
+ const startupArgs = [];
17
+ let informational = false;
18
+ let module;
19
+ scan: for (let index = 0; index < args.length; index++) {
20
+ const option = args[index];
21
+ if (option === "--" || option === "-" || !option.startsWith("-")) break;
22
+ if (option === "--help") {
23
+ informational = true;
24
+ break;
25
+ }
26
+ if (option === "--version") {
27
+ informational = true;
28
+ continue;
29
+ }
30
+ if (option.startsWith("--")) throw new PythonInvocationError("unsupported option " + option);
31
+ for (let offset = 1; offset < option.length; offset++) {
32
+ const flag = option[offset];
33
+ if (flag === "h" || flag === "?") {
34
+ informational = true;
35
+ break scan;
36
+ }
37
+ if (flag === "V") {
38
+ informational = true;
39
+ continue;
40
+ }
41
+ if ("cmWX".includes(flag)) {
42
+ const operand = option.slice(offset + 1) || args[++index];
43
+ if (operand === void 0) throw new PythonInvocationError("argument expected for -" + flag);
44
+ if (flag === "m" && !informational) module = { name: operand, args: args.slice(index + 1) };
45
+ if (flag === "c" || flag === "m") break scan;
46
+ if (flag === "X") {
47
+ const separator = operand.indexOf("=");
48
+ const name = separator < 0 ? operand : operand.slice(0, separator);
49
+ const value = separator < 0 ? void 0 : operand.slice(separator + 1);
50
+ let decimal = value ?? "";
51
+ while (decimal.length && " \n\r\v\f".includes(decimal[0])) decimal = decimal.slice(1);
52
+ if (decimal[0] === "+" || decimal[0] === "-") decimal = decimal.slice(1);
53
+ const digits = decimal.length > 0 && [...decimal].every((character) => character >= "0" && character <= "9");
54
+ const supported = name === "utf8" && (value === void 0 || value === "0" || value === "1") || (name === "dev" || name === "warn_default_encoding") && value === void 0 || name === "int_max_str_digits" && digits && Number.isSafeInteger(Number(value)) && Number(value) <= 2147483647 && (Number(value) === 0 || Number(value) >= 640);
55
+ if (!supported) throw new PythonInvocationError("unsupported -X option " + operand);
56
+ startupArgs.push("-X", operand);
57
+ }
58
+ break;
59
+ }
60
+ if (!"BEPOusISbdvqR".includes(flag)) throw new PythonInvocationError("unsupported option -" + flag);
61
+ startupArgs.push("-" + flag);
62
+ }
63
+ }
64
+ if (!informational && !startupArgs.includes("-E") && !startupArgs.includes("-I")) {
65
+ if (env.PYTHONINSPECT) throw new PythonInvocationError("PYTHONINSPECT requires an interactive terminal, which the shell does not expose");
66
+ if (env.PYTHONHOME) throw new PythonInvocationError("PYTHONHOME cannot replace the configured Pyodide runtime");
67
+ }
68
+ const runtimeEnv = { ...env };
69
+ delete runtimeEnv.PYTHONPATH;
70
+ delete runtimeEnv.PYTHONHOME;
71
+ delete runtimeEnv.PYTHONWARNINGS;
72
+ runtimeEnv.PYTHONINSPECT = "";
73
+ startupArgs.push("-c", "");
74
+ return { startupArgs, env: runtimeEnv, module };
75
+ }
76
+
77
+ // packages/safe-bash-command-python/src/package-program.generated.ts
78
+ var pythonPackageProgramGzip = "H4sIAAAAAAACE819a5fbxpHod/6KtrVnAVgYWlLi3IQOk3htKatdv67kJDeZzPJgyJ4ZRCDAAKBGY0f//Z56dVc3AJIjKbt7TmING/2srq5XV1Vv7JVpbbFZdc2+XdtV05bXZZ229u972/XZYmbK7a5pe9Pa3Pyta+qZuWqbrdm3VVVezndF21mpsm+rbleVfQ5/7Wv8e2aoY7M03Od5QiXJxcyUV/x53vVF23e3ZX+TJp8mMC6Nsyv6m6q8lCG+L/qbmfF9wu+UfmXzolvt2zLNZjC+Wbr5SIWZqW1fNWv6NKcfOInkd4kpa/4MY69bu7F1XxZVl5ubpuvNkr/Oqcvkd0luHmczA83rBuAz3xb9+iZtk//667/89afzL87+Upz9+OjsV2eri4d/fZsuxkqz3/5LkuvRsoWfJIw7M63t9hWM/1Oyb6tkoYCbprCObn1jtzbndgj8OYCN/vr73rZ3uUmSLHs7M93+clO2dt037R1uybyzRYuzPn/wrxf68zI9/69/vfgkS3Lj4Af7paoseHLniS5NLswyqDa/bpv9LgVolfVVA0t5O/NwY6xQ7WEHboruxm6iOabdTfH4H91N8eTJz+Gfn/0S/3ny2S/gn88eP/nHdvNZtkzPi7OrR2e/ungYzB6GpG4XOJHzBH7hdKnYTdQ8NMkyMQ/D8ifZzC14U7Yr6COBTsfWYGzVWZPAxMvXlurCSPAHdNPv2xoP1Hyz3+66lDqG2bb96pW965Y/tHubzTb2yqy64gq66PqiqlZb2xeboi9WVdO82u9SLi/6sqlXbdP0uWn3dV9uLf5SZ7jo+tzYtq2b3JR1t7Prng51bpoul7OWm95ud1dlZeGvN/1tW+xyc2uLV629ys2PJX5jOrBuaqijjmi33+1a23VuVPoHqIXM3BSdkb9nhkhOASdWCudf49JmBlaPwF/B5FJaXV1sLVKIVxaQGH7Obb1uNjZN9v3V2S+T3CTdvm2b66K3u6Lrkmx+Y98AZRDINx2ekfnfGqB22G0CUE9y80n6yt6dl4vy4eNHjy7MVdOaEqhDW9TXNn2Um8rWUCXLzeNHj7Iso2m2ti9bmwrIzQPzla1sX9bXZrNv4R9b77e2xX0yZf26qMpN0dsOF9DtirU9W9/Y9SuoelmsX9l6083NC7urijvsr7+xprmt7QYIBnXzt2bfAugAB2yx+dzYYn1jWrtu2g31a5ramstmX2/shkA5nxnXbjkKCP6a8JmRKvZN2fVdyl9xkQYotml2tpbi3OBWlPX1kjcjg+2mQ4hNEKJVWVsAqi6n6dH+miUdjqopNl0KtTOqUzJCIPEoa5Mmj2C7H8N/nsB/fgb/+Tn857MkM01LFTs8JfXaptB7brq+zXhU0xZlZ80fi2pvn7Zt06bJc9odh49mXdmi3u8YsgnPRZNShaUjIMWvGaMuNUbIyWFJn5WV/bbpn8FG4STc7Jpuvq+rsn4V9uvGzk3SNrddkkm/N2Vl1dQ+WhqYg3TXt3fyJ3Tdbjdl6zvjPox9s7a73gxm5ZrCqQrrfvcSa8Bm26BqeUUFc6Q8uGf41/zpt9/98PSb73/4MxOl+dOn/+/5yx/cyo25bG3xSn7hNvEPDXkBy6ZsAbzRYjz4BG/xLD2vr4Dk2evrLjd/ef69sXXf3vH+dp8iCpb1xr7JzfqmrDamqDeGibnZ2u2lbbubEs8SoDOh5FF0xJWNzX2AKrOTMeQE/GjajW0ZQU7udAQzXCkSuZlZV0XXmZd90+IJRla1KuuyX63SzlZX1Bn8NYcWZuk4y3z7agN/Q//LAQNLM0CaNZRdVnbI4DJiriOMb9faq/LNMnGs5ozOKs5BDvFSmNn8CvhO+aPF2eZMwnM/Y9W22dewgEeuRJBhab5taivAeNHcdqOwAJLTQOewRQowXIp/wyeQnXxF7qnY7Wy94X5eA6GiHsorTdnwg2PQ8+/dQCi3ucHczMsOaSNMH9F7ugr2PFdkZEgyvxFSSVKJWd8Au9zg2eLemGyODLNUI2Ad/GmW5pzKi/4CimHXF/Kp61tacRbyIQfJ3CRFMsGOmn2/2/Ni6O/5bVv2NlUSGXUOouBfa5w672lv2wC/R4d+dyYo6xtnf3elrTbBFqdDeDKOnD+6yMZRpCo7OUQs9FFXAk/C5d8DJTqIzTEeC/LGxz6gTDRVOq+wifQbDxiRKFVgHi7NYybj2+KV3ZRtl44cT6Rwg4GknieBrsFV2/xoa7M0z4oKuQotEcTZoqw7t0wna8aCIwtDwYBKBlBjYxcBl6axrm1f9nY7MtQD88K+tm1XXlYWhNzOFK+bcmNgz7u7rrdb0+1sVYGk2O4r2+HxBV3FrJuqKruyqbu5eVqsb6i7dbPdNbWtQRBywiCwNyArtu6rO9NcmULEzqTDoZAJVra+7m9MVW7Lfj6bFnriBUNV10m0MUPZhYkZ0JoIwNJHRMlo/4Qa0dakdEb8eRxig8Y9L+aeSikmScW5jHRZdDhbhaMEjwtNSEJ0VtDANa+aV6z7hasRSOQmuR2bLc/RSWYRXcIT8N4rxa3QS2HYA99LNUNz+8b4jqSlU2RzqFj4afJaxldwlLRO01Ymn9DbeUxfL3iiV621LBEo8uboBeyM0ku7lPgdVmVY/F5/mJPyTuRSKOu/FajmPSvKat/a9ClK0GVTYy+0gVTxad23pb0XDc5DgYXLUG5xsj9hJ8m6XJ+UxaVMnrrOw58zL+27KXt5n2SCaGkZmQmwBi+CcIpW0LSbkpXGvr2jpbhZRtvP8z0HnsHtsgvh9LcnYbVD5PSc9cCfksu73nYJiRVkJXg7zjSxInNNlg0A0VhVcDz5L+UOlIv5atVVTd+tVmx2Kvq+TXGZTCGxNXH7sjbn17YfVLm4yHkBHwj2gSCpYI4A9htD2CM1Dm0Kos051pvLkT95U/x26EE/2IL1QWA5gg5RZWsnwfGZ9VUn+bPgnKNe9Nv82jxayN8Pl2FPwtQemV8vVQNfhxfyHFRNkqRlmNn9TsAhqsj2ICVTepO4Yc13OYLAtb1drdKonDg7I37uEZgGcVx6eH425brPnPiOpwnI6hbOHMmrfBYviPPZCoCH4sPSJGAqW4FRM3Fd9PtdZZUOYLrhERJ1SbEq/DotzsPSZKec1c9vWLZQPITrCevobFG5s7VZNVdXnQVrLApzMHvLVl2W8r6BCwP5vDFdD+quqYsedCIwBJf1NVhq19V+Q3bEXVWui96aG1uAwEsjdHPq7iWaX9dFVciXT2Uhu6JsO1iOCH/tvu5ysCjWZmvba2v628YUvSkMwBg7ZPPtjS12f0fwkSxP2i4Auy3RgoisBZdfvObt6JiB101dNeui4sozkk9QyR2xfKAygBUz2U8cQnQAdRzuRfUDOkvzW5ys9HnKd8iEMRAunSHix3J3BlvJhgizvtnXr0CzvXBqYMgEYZJiKdZiCDedMwlnmkuI4FDNIe5VgHXEtM4EXb0pFUzZ2G0Gh+wXPxc5CbcSpm039N1hMSFw9jlNBkwqLcvdYLKBwsXRxh4QQQfrfdtab2VhSyYjwZn7/BvzmKdZ2at+RajQltc39LdZmnQCudCglxHjxb/RYsf95m6Ah+Zxpo20iHFqrFGMg+85VfVzmaiLFQJQ4yGb40lM01gyDeRZGCfLzeFKOEA2CnZlL3RLyj73hX7y2ecOIEvzxGtfsB2LGDwTEOcesuwUsf2A3G5iBJ+yj6j7WI/+C99KzoDUFuYXkPPP6WytPBE3S0XRpa0SmiI59vOgpW/1nvIMmisrJkfekA+HvcFLDmfP0xB1mC6sDCmsg+xRg/CEgXlwrLJZdKvgTDTvt27ShL4FQXNCD7KkJWUL3BH+hVuGf51gcRFJgy+VdD8k4vJE/9PekZTmbByRiBY0OtfS8CH8H8FqLaFpGZUHiEWPa9urReVQVuyrfgnI4NUq1RHNTSGlLE0qcQ+k6+7r8u97u8KrkBZ5Bv2hddDOooIca4yAgnSFUtZG2gnQ6YODulh04K9z/EZckkQuLKD5/FjuVgji1Jk8/UTkIvquQ20aCBBgQ3fXzbfNBuxl5yLTftlsd5Xt7Vdl281XK/q8Wl3MV9xuZsyoZoyXSN+SpAam03lru6Z6bVebsjWbsgPRbV92N8B734DUVvZkviPULre7qrQbc9VUG9uiAPfA/NsegAG3vGuelrppMl1d7LqbpjeX9gpMrQgTkAqL+s4QinWNKQxdzpsHiHD7uret3UibwlRFb1tT2663G+7d8NRhpsUabIFFJ0LoX55/L1dcTjhhiKO6B4Zk3LJRPVDEaYIltGWopmFFkRaxD6780CSfgouQGw73e0UUtSq2l5tiQS3oPo8B6q2TQgaKDSCYqe2t6ZvdWWVf28rh4dz8cGPL1lyVbdcbvn54YIoKfKLuTLNGBoaoW9R+JwlwOZpdGVIklnWwfVsQpGEbbb05DXqE3yFQZtzzCn2s2lBBAzI9X72wRfV7238JPhiIq1R11bcW9KOi68lBKxU3jvkGHY1Sdv6YX9ueyEwajEU+DQLJFcCCu0Nl3feb4I3P0lzt5lAp7cof7Wq9yZJsftls7uACQnd0ub+6wpWMdXUFF3NlM/830AGff5dC12FHiABF15XX9ZbkxLF+kEoCt/ihAXX1/I3HR7M0b4IeiTOv5PZgrLskge37ER2XUMslZU3kWzIO8l7mYKxfEnJSkwX9E4rpGeA7lU+LGMGHkU6SJFgJ6Y6r+y/oPdYRyZcfflHE+b8S/HlhSdiCxXzbbOwPbVF3V027ZYMxoCAQakKzjl2D4F+ER8eKBVqjy67sV18gLgnfbDZiS70pdlZDDz8xx+KPyxgblWGVRnVaK/NT0Zt1H+EZC2yzsJT7dUHLVp0IHOJuYF3rZne3At0cxLHBMSSbte/6tqw3zW16tcvN8Igz6JSgAr8DQD9r2neBMmhnGqPzMTTP1Ip5n9WCd1WxtkwtkgDJ52it8RiZJQFcg5NEvnwHm+d0k5glp0Jaze0AKHHMa1vbtlyvEJgCJzocf8KdmbofQNpOe6avCaSYMG1blDXIEcugPvdIZJ16K3+0y7PH3FH5o2W1SXUBAIQPZUdeBU1Lv39tHhEMt3ARV/44GByX7G72/SQ9W/FXt364syUaMAYWPixw3LAlsmGWQ0qSxSwzbDIngKsq5AObRtXwtOZxYz5+g3IkD4NSQt0M3LXSx7mh/5V1nyaKnCYHLxoyooKoqLwgD1B2zvhDDQoeUnol2SlhiSaTeHg4n0SzRMNtKCDMV6vrqrksqm61yieoxZJQM5sZ+8auUxBpy4qI91X5ZrUtu66sr93J6AIw5yb5NfTqPfCC+f4G/KmgW7i7jWfM/pigk61+LHdOURX14IH5sqm7vt2vyROzM91dvb5pm7rZg7skim4MpU3Z7dBIWxW1BWdMcnOwr21tbm9s7fwyuT7Laq39m133cC0v8t7nLHnv4TOsBabXGcJls6/ZXQbExV1rX5cwlVMkPlwqERQeic5nLGaapdwlqrs8qeSlJbDvarXKtcf6MaTPk3hCyYWbxswcnb4cuJm3ZvAJDhxcxI6gzR+ndM1wnJkH5j+t3eE+7cq6Zq8kNBauFSrkBgwbWHxZ1qxbbbwXAx7RueuOt5z9eAGVyGBZbIoduv2WfWdscW1bRL7imrysNmW3bl7b9s4gLwPdD7TZre1vmo32gX5WdD2qlvBZFBaq/A4Cvh8DpXviHn8pd8eEKrlHFlEKwDOUpL4sqmrA4curiLkDXx0TSYfuTLjlXsSYK5837yp3T8mGyJQjC8phRV/Rx4Mqlnyf9aAFFbtHeg9HKD24oHGh8YQFeVNIMOx9VqW9o5uNnV/t63WOY3/R9215ue9thrg7VlE6RATCe23UisPP83JDt3jluk+iCnBlhx/BMoI++FgBODtWKtrrDkH9mBv21PiVvbuF61AFxNBn7DAQEWVhAkuZeVpulgzUyN4FMTr9G6z4NdjmwJ4N01qeuxmi9DbSE8J/2P4CdSyc//L8IruP4Afb7GUadYSzgDioaizHyEcWYnQFvnrXRSym6CI8dIGIcl+Jw7FzRwUTNWuHowBQ/g/ddgHkivY6LdrrELAZNx/IK57ejQkr0f4uo99SzfW8dH/JJ6EjS/njdEHH7YOTcgLQyCQCISdYI69ZKvJmK7asv4IRjYSE/ia0mTppyNtAjd0i10L+5MxdZLxCGxnfGZOFc92LIRM7EvEMrG7O1nfm+R3xT+HFRU8FaEFv9j2yS6CT3fvYzD608bdbtyj/LcnNHW8qRVaJDN5U07lHHJ79feyiEhCjLaPu5kdfW8QjMVMhK6W+3XCek2Rpd8ZaB1YGppa4eH3iRZ9mzkAJLhRg9l4GYtuci2eEee9uk+R+lNgC3Z8qt3xIOcWJDCfy9Puwo4Cnq7M6LQ7dh2dgh55paABm4Qbpmk7/5c/EOIIatMSPlnQnfw9OgGK2iohLZB5TmiejwRg19+2W/s/7KJ6yvoAgxzOMlE49VVY5eYqpC/EIZSsvEnpD61O5ulTbGPZ9nnC3yQV17B1NQ8jI17FDCKZ1OY4ctbMu6kP+p7Aed913YEE5SCDPiqoC3/FMUWYXvj133ShcVWSUblC7ebcualkGBQ40rUnmdFFqvSNsRF6DLwFXYCI2ffk8c5EsGhpjt89qjRO2Nr6BizxyudSrGkGsBH1VIrsETwTA9y5A7sq/xAtf9HVzwwRqYm6S1QqE29UqydEWl4GhwwtFoee8bprGE/f2goDODMZMtctmeKMf3/dTPOBqtS72nV2txlwjFuLHrp37AS6iozPccfTg+PjZuapUaWbegQlJdPJc9lvxoWM8iDzEzdIoSe00fjStkY2pWKxcPQPPdbApfEVX9185ZWtKl4qHGSgyaiT+JoMB+UqOKmQMgQ+gkVFP04pY0ATGvo/O9d+qAwNGTurATmoPQQtrPK79CpZ9AHAf13yDRrimD6nkellFySl8fEPpRGm08oFwJXcVZTGkuj65p946rrMOxJQBoRiTVGhmS5lgCOulm+fJosuEsZxCTwKBRcsqML8SA1/FsMfWXJ45qIxE4SgPg1tbdoD5sd35smuqfa9DvorLDonwgK+L7O2aLIPEFVBNvun8MEEdVIZE5t7vbJtmbgOcuKSEDkI5ZUEINDvPYZV3nQOWWqyOXio7kFpkphwgogSGVPFSbZMLXOOUAMLjxvW14mWOLmRk3qdOyXHwznpuPDthShygHyXxMEsj2TzcFwkWBhH1GbgPtnOfEGO1LtY3tkuz2Yx9OfkYpRnwZdGRojQokh7FbhAdIKlPVA/wBS/QXHewqsO5VUa6kFMraLjFqADX0+S0XOwYxjUkwbg+hP3dJjgSCf9+k9zY6vDAsxkbWsBhEcQ7qo0ZonhovCuji2UKsj2YDyac2AxF8G25bptduZuvXtt607R2M98V61fFdVlfz7t2rX7t+7LqxPizLuqmLteI/KhI+QFQJ+DMNVVl8d6nmxeXa2n7zR6vZV7aHhu9LK6sL5oRVcRSuieLKsCOkZvf0qQJqiFJztphRDNJX00z7bIIKSkkvmB2QuaEyd134Qc4CsUeYG8TiV90qLTO/hKGEqI2oMM+IudXlwJmIkCVRXqsu9/BWU9FVRcLZeDEKnawJUMyBNUHTACkl/+OWYCCiFdYDU45djQOdd4gZ0DKceKn+Qlr9wiYSSeqoATQYBTD7EAml9CnSIKvaYB52RXduixTl0DHf9jYdbktKv/pkfk1OipIRBqEumlUAScQ9BL3VVAQ4x9KCx9LwUNH3JIBk9FA7aJ48x8M34/9p+84jFk5zM9OCw0cjxlTpPDAoTgWADEV/eBiCw7lRZK4eL28pYextupiHOhmE6OmWkROp0usy+wQv3BClN5d1jUUZkaYiFcD/8Fkh/xsuybI3XKGJI6Sr6Cr1rqgcMLXFm3kIMZQ1DBeDUwSnWOR7dPR+xrCQaS+ZGQJD+ksDOCPExCh2DkSzH/v8LVgwioudGBcRhd9IqiKuVAWRRWiTJEMlL1ms0kVsQLVpmincAKxAUiXDwWJIHICpQnnfebmva6azg7OEmepU9j4gFOhcQo0vIv83GwaPMLbfQ9hkYVyaYI4xxY9cNYUT0nmxfk/4YSuDp/NSSSiHp1/iQSeoADBWsAhqCuWwzL/5Ba4pBB8hzTMmuV1JfJi4YofLb0UEk6JYnyo2snDH0sWdv9cYTpFmMoQdmCdMuEIrCo9mFudyjTDTmVwY2nlnICXtAuw0eGyOquikueORpBGwpuPGw2krtFY25FQ29MjbaNA23eLs32vMFsRjMLw2CA6Vs7IaHBsEBsLcpmIU0FzTIcEQiPq6P4YTkfCDmJZ5agNwlenw1+pyaBBFO56LNr1nx7s+s+Pdf3nhbpm2WwqtjX6oOJbg6BjiXGNQlw/bITrdIDr4axffK1FWRKeXARYzM7OwV39sbDPkKucEtZ5lLRHUZ9aU/4jpf7xWvOolmwSXEkiyuA+DGj0l+uhtB1LM5OqlR/gXplJ2LLvkpKcFGwZTnEkuHQQZHnStA/n+PAZhYP4Ub0TYnf7wb6BMzlilajKKwsWI47ohCiSqlm/gp3SewmAlqrztVgVVf05inVOWPXqwSMpAkpN1qEkkalcNk0Vq19QRiqu793n3A2iE+SKGgANv6ULGMCV67Fd1kOfmiUeSd3lugnrdSIuiMrj9FudmE4SwzxGtZWzPI90yD/PFzD1i7DOOS7nwiu+1BFBAXOBA7VQ6bX6oqwYtEgNgFyIfEkzx4VhKziFWP/hYGVg4MjmaoBXFnPGdT5DGY+En+e7ZkfJO6ljiptJYtkZP7JOCn/rAbLzR7BM5UMAAwQ1VE5sTF3vTJNwm5uCaxre16FHt0+apjF7NLV805VvvkdGRpELHSWbL69Mf7ezQb9zYiAuB/F4W4fCQVOcMs5UGYz4Zgd2YkBic/O8+8KFrnCRRGvD5X4/+Pq9bbHHpqYY/hlSfJc1f7gUf1XuJjVHYjQgOTNhBTzl0I50VZRkRea0iizWwXKFgmgalLpNmYkABHjlnB1EGtTWrl8+/tUTfU8h8yAZVMYnU7tOIcznn2Q0VwozE4RHltO3SGxUObB2kuNmmsl6iBKtS5UOLHOKpqNABdPhr3hIEEKAavCvHJsRyv01Hp3jpHsiOfvTN2X/si/WrzyTiu3N0g1EjEjtQ/TeFwcUH7rUus4PFoYr2jvA73TbbOwyuX04wobhIYNbOOnLJIGkUZNW7iyecTQxHDaclHYKfGD+4+V330JATme+ePnl8+fGdutix/6S+7oHZw4I2tnIhDqMsK+aa7haMLumK/H2gCLGW4sprVxKJnJz7eBlAHzZwRTrte06Dk61G1Os26br0C2r6JuWKB4auIjwc/fCHWy9oYkP0rihnDgqdYQdfeR7WngAdda+ktQVm+zA6MxIOHw3toTjJHKDh3NBWcXAHu+SjpHaB7XOqYcF/fMQWjiTm0+3CFMjrZE78izVze0hhf+pCnHbpN5XFWuYg7afSSGBNvg+ZWT7IAZiBVxARBLU+UIFaSCVeFnEuQUNNlT+jjdUykeg5htxSBf6R5O+HZFgtYm+fyDCsI/pr375s0f/R6V0PrAvjvpyGYCcH3uB3VmckIGfM55xJBUn0xrRmuJR2SJBAanKWsQTGqapg5cB4M7CR5aa3yBev/MsEcZim/DBqvEZ09tCGCD2GBKGkoQ0NOwuG2MO/46jd6dK9iL8DRmM5ssDegO55Jxp2Rl8oHThu42XO3l4nLyNzTLz6aegh48fI5kwlOtGkZlbi5ck+9Uka2Bd5Izg9tQ3jb4yXt+oa2L8Ofud/uGFTidvcu4CvHiMn1lx76uIiyFLnRDwWc2vrN1wrCg3embt5nss4YogdLrpfQnehXc7lxQEJCzXYE5RudcQHfjObvbKrZHQ6CXh8LSDPSd4PzGpApvY0HetL1oY/oAjIteY8kX0n8WpjraCQ8fi3pR33teY+TzwpCPnPFv1nSQtlEIG5D1d57ynBCDctAPdqHfcPEhniU59BGahBUc95yTWdBnto/ef4xoD/zkplyHRq/++TnJMAX1AucLIsl7TDR+Cpm6OO7ZR7+Ap3GzsajVfNyu8QqT25gzvuOEbONmytxw0nWjpEmiTV5yTyJE+0JYHRA3aQkuMEu7G05rK0SSsImRaNytJXOrmgflCVlp5RRg5dMGTOqKmvhvBeAYErmzqk4iG/AUVVLv0ELnLdXDGmKtjeAyWkrLpELPRG07gUgVsKuuCQhDv9y3C1UfC80Q7JR93zvuCd3wAiNFGyqxKXC1UdlIeFfLkbm3XFdfqTkKPMKgwcwSRfOq23XUHihaRROKjq/W+ncu0YjbNrF4zapcnCs0VSVDdTybJTep/5RmkwHaokCwcLkAEQQAY+Sa/oYJaV7LQYHibAWxCcVKUeVStA1V+VDXnTBOA+Kmo3y5ABj/JHhxj0xiQf18+PcF+uS+XI8e5NMoo3fwbAoFw0y+gfJKL+u0NuehzHPhZ22zHOClyCspkpuKiN5ZDHF3+lcD3n3wCogaUc+3RxdwlWnYLSRbHfciZ2TM/jpzCfU+eB7KLKriGI6k8yEBH2jMPzU5IOvS/XxCBAFQdLyjI4Pz36RaVuefvgduDqeDpm11qq34ZSi+5uZYKnf7kS7MPK97ISicFHJr9MTHnhFAAfgATdFSS85GbgeE1OoRfacOmK726hvRMjEzzVWtBV5HpI/zxm1nyWaX7aJJaoIAFpXeSqYW88ZS7qWnQ+2I4mpS8j/hFnSd6Jf88+et9BDDeXVEX/xsFMc9OKI88TSSbTVhOuWRb1JjRZeCxvOrWzc6pjFGpZ0ra9O5FP13qBL+D1tvDEl9uvsEoP/r7JQTp080rxHk4/oeS5fgFh/ONjA4YXGvoQ4ahHO5GIyHPD3zTJlwQmzA2Y+dz5sMz8BJUWZ3R2YAlHOjldWlvh6w3ntTYVQ039rcvLououyJavMedUpCICZoEEYmniPsRTtPXwYUJR5eQTsCy1gpwYQUTrK9pbExayxL/yRTSn+Po5EoK3GFMdij246SWEbKlI5NcIiQycfuRhLhxUABjqZMC/PUKCUfkf+AFMvZkxkfilJg2lMsw6IgrxDmzYck5k88Vw+OgOCmPH3A4gVMjgncQThfiXWaIslVuVNxeqCRa4LRwxt8J5XDqbv8n+I2vGit9au2s4wVdHlT1uPNlBIwsN3Efot7F5VrLi79pZY+BDu/gWtmRMEzNW4cdCPhBE/6du5eHCZYPzDf7qi/BvGo2tlu3JYY+QZI2cCqHxCelEz6aS8jwdoZDbJDzFX15WVZlT8mY51PvoAA9ugNTNb/Cxw5Afo5stBW/k2CKUYJDWeNAmFgq+s/bpx9CwWN32oii/kJA0OhYs7Fp6ZhCJ8RfRMGGE7I+VIuJCB/dZbjfMENHLSIsJvR1w72XYYGZl6PcwEiy2RRTx4f7IibkeHrAsYd8+T04sXp/LGB/PB3mrScLIcB5b9x1QsjIxpkJD4S8JB1yAWqyFIoQ+iV931o4EhbSEvwOyylLwcwUkJuRvFw4/3m6rlhovy3K3vFWjBJZ7aSjNMGI0UTuBvTigLBGK9GfOe7uPQDGzuD88zwBOGAuc3EFo0N/ZAHFZpPkKmzNe9ofW7nl6C3etXXVpdns6AuX5BRz12xKiEq/KgVN2329gl1Qzkdckk5O4aYAvZAnzLXkK1BkWkCw9XO3wVkc/Ufk1UviitiuquJOi+P0MepAJijCu3j8UPE3SqTHGQXFUVe3N9ZWlDubOvkTFGDqTGnvSuJlhDGK8NT7StZS6bun6Mu9YyFb+/c9h9K44V74MjdRVZYbvsocqzf8FB5egteXeltSvRuAXb/r+qIv18NjDZvPPaQ+akWMTiOITiTaBQ5Odnxl+/XNCl8US/dtlZtXt5j9QnWfjvXvWmTZvG/45/GBSLRdFfXGiYDxqCKP+FBZvrMem4ajMjiTWchjzxNUt8SIdu6sThezmZ8YdYgYu8JJ8olX88qN3yL7BowY/ra/uymefPYLIFn7Fu2MFLfZVqSDkLgdfXXsHAojCxi7SbR+bfImHEr24eBBPQr7pvmoW5vD25e7PsONDM/ofKXwxO2NgtlsAElQZPZtBXyIYSki0zLqW6rCCrExpqKnurivXDzXGZQRdEvo2C0UK80mOgfDi+eY6dhUY4Iaq1jf6DhsN4qUTmDUprmtydEYkYrAGGIVEWcOx6c7DRo2VLpE+1c1TjwkIzOZ444oBM4yNbxfeeeGVyLk9BjuOKp5kU/TTwnZ/JKFWkBuEiBQUgZ/v82cF9JKDTmEtxOWopjmLJvYCfaM440gk/ToFjj/Z5zjVAqUbxhNIKjXYtQmhWiZogdvPjikvQvgZLzm92VkJyj78W/hrDqn02R3tysT/xQ9Uxf1Bj2SFdnDmd6Xn5Lv//zdV8+/erp6+d0fXnz5FODKuerdlz+8+DrYAiIa+7ZKctdppuq//PcvgJzoJucQ/A1UNXn+7csfvvj666cvkoVJ5NwkbxGKUXqDBUa/wqF2WEtPYa4u71Bum9PXVElyDinEPswd6IPh1n+eeMIwB8RDFYlacDYJeV6WMCCJyUlCJtFEekyCd64cMhweEM1iBPUVr2iA+tG4uUlcPGayIJ/gt5nKA6JiVvWmuXnm5qe3wfll0aYLpytb+uLp//3D8xdPX+J8BweVQ7Le0FUXKAVvPAykYxhtmgrISTuZCIipUMoDC3jfFusewAVf+5Zv0QBHHQA8FiAc5IFTfbbnJD6zDCXPOa92bQMWihWNJsEgEQ+R8xoxPimOq8uZX46RHxbzRcZejgnT6aTAKFoCOr4pTqwYQLghXBErZDN3LKV9yGKCqc2xDuAnOj4Ckrcgve1SSCWEiAFs1SmJ3OXFcBC5Xg1KMw7ZC1iucNpg9l7kx5/cBJzbQte0G7A+KfWggHNPP/6+t/h8oepmjmUCJy2oqiYrwGJCDQ+N3HzySSAkV7bocC9+eotq9L5Wrv2mKrp+hazBG18V8Hy/Ye5CRsyI2+KseEawJRdqMsrZ3ztfRqHDwWTcg4l4h1LWZJSS+UtoAF4wkdEiJzZGaYtpfnNZPqTQ3IpNwAHlnFt6SoP7krpWQMhc73gpSkMofweckEp/odbQtIGf6beNy4MhuLdu6qvyet9CvqPYQEN48D0tBE4uAxatuUwG4+XhVeUkGrlVOuwZyCJ0vUGEpuPosy53IoF7Iwpc950lXOmUqGTBnrDE4EIkO504hUOo48b6tUR+DnPOaWHE0Xh+e1NJpjCC94Ryq/pirJuoSFYilusnpPPgGceJuZMOgFzpoUnM70wCkViuHQIsCE7BEkApKMBQCMaqFF8+hcVvi/aVRTxSP+cW1EXguD8R+wHpJnmbkXiAFfctBb4S3z6wLqmNKxs3XKTUyVzFOeEsBSW0FYyrOlH+p7e5OcAsnCUKIKFNsZJEjGG0IJSi51G5OgcJajCJP+gJsOJbIkdW+IyrR7NGbMEHrI2pw9VMkQYsBKeC8qoETyc22nmKsmutnGD1pPjQQ/37u/6mqR31kNkC9ajKdb8gXIvQKMCEYwgeIMKOpODDGL5cyqBUzpPKBD+UoOwbYsog9cWDTfIQ7cr6HUB2HGYEgKOQUxaxgKqpsNls3DNf2+skIdggl6EYslVleo/QtyW3QU0o0NdQ6ISvmWVTHvY6VNTPgCrJy/dD2kuuOxwtOgshgVkR0ap+v/jvAEbTICGrU/Gm3O63Yju6LTeYGeGRBAnv4NZoMwLtIHFH0UE4aC5ROpvy2uK7SfyBNdaxUbfFm1QXUUhUMNAp20d3sqA6hlFTeufiQClZq5sCFsgEoC86VrQaUbjoi7MvYK4vfEqDM6px7Rv7hv5KmTCoKOLJNGav7N2pMesq3YyPORIXpiDqEwOOgjxnDGpMdPbEP2gPhIA60JlhJO6Pvpwvzh5fjLSIopKErmDjYUY0KQ7yoUmiM/xIac5obEzIIOXmNwEGLXT6moNJ0Fp3nBhRkixcoB+DyrfwZAOeM66xHKLmbOqlcOrIzU4wM94WhYeccy54hp0xLYasQlABB/bh3iV/D2iMxYXxWOHsxqO/Fu8zNFz5Ixh/MwJq43zaPloGZ/8c21ws/H6JlkVdcrl4r7MKg64uLgEGUN/ZSWfyaKY0TOihU/c4yTOgaSp/z1HiNpUJaIS4KX2GoKDkO45BIKVFuXCqUAn2OPLGbXb78T5Bkjtf/g3Fs9wEnsuY1CM3CfeT5NJj5i/sZSLok8qfnccpSddBvXlb3NIawFDBDVQhWuvcT2euQ9c67beqsiSIi5D3y0DsGKnh+g0yKTBgyeEodT7+cjt8AnxVlV1Tleu78ML2Z0/+e7ZAcjIMt6FpHQxkgh2Tcpog1Aj36dr2oOxKRdkpKR7UD/ZVt/AfwHRR36XMSoMt1eJXmvAgIBl5VMim9p1rs6afqivDmSSnQ4W4am5tK6o20gXnZHv4hDH/lw7kCWTGsBCw8qozXQqRV6QfK5tynREj7Af3hw2QM7iGX90U3cqliu3e3xsW9lYCUYeusEGcaqo8ZwHj8RdUX4GDAUCj8+X2+joq3thdR1d8Ajff1bqpX9u2D1ut+mbVoWMOdTLApShPCXUKi0qzezjpvpejkXkAp/2MbtOd36T3wLuX/x34edZ3Ke4nh3LzRnY92kai3ZdK9zoaLCCdDEadjJ40JZ0f64/abXRcRzOnqWmBVhZ5qYbeqSNeil1uZCba70C8/TggQyWDGksPwq79LgXHeIpArhXYt8gVPwt8FqPER+/pDE7e4GNHzjmGLxy0DnLIhFXh7gyGJS3qNPdrQQ1xvzYOVyJnxsgh+0DoJbiUivft+0VTquAjR5bJ8RFRqTIOAFAa0hFuSRgf24lRdH4twaVokcvNfnfdFhu7RHkvBzxZux/0RG9RknUE4oeQ9NHnzN3uqGrDZGWhXVlVpafi5OdhyzJkeHRV52gU7CbMbl+qyayLGnXM4rU11CjRQY++R2+zHRQetEYye1fGMdXeGV7ZmO7vK/wUkUzw3cuFriwO58qIPWwMJ1ffMko6d1cnkPHFyuR3Y3w62tTnm885qydbyU7eOq2LeCOh+delBrUrl3Se/pMYQ9E6qroSN6e47KPlaOtxTEF7IrA70S7Vqv7w4uuOTI0DKDBVDAeOx51NTvkQgEe35TRrcDhSNtOmgJEt8HbawBb87tZaBbsRU21oA51CixFUGoAowBbHm7yHpFH0bfS2Sx0PMCAH9xS6rb4RuN+tjsyBiM44UfQjReOqVIq+VE1gUHhPEqXaO2zW0w3ISkvmW6EKXMNTLbi+NP/Qc6IqGa8SrSt5tFifR1gtWz25ovoRu+lg+AMLAkeMPqUIUDWAE3QovSrZ5v13v2uATLbr7WYlT6/rZ0fURDIX0Dfp8OycB3bbGXWDcejFutdXV7vtXBVL/Dpj7q4q1oi5qkoad0V++Y7hF5vNSp2JVVnXtvVmeH+XZt9QEqoAcy4kH+W6fyM4/FDXwX/f0muQ8CfbnHjPLpjwCc6id5lL1aw+yOUfqAq+WKHzJ5/INMApgef7lk4s/2KpAheSLSIpP3BmFnl9HDYBz8wy9xQkXKwyaVx1RV92V6W+0MjNJ7kpqqq5XbWW/XG8fOQW7PjQCVTcUe/DN3JQ00c0nHqZhuRglDxnjq1NUOGTbxFdXUfXfAQC2SrnQdZ9yPVoN0HOA9mrKfjDfHk0lFhR4mVRVsSCaA7RqQ5wxbDASwlTT5/DcOuj39nQC0g82Qa3YWOkwG/FGBVQ3hnao8d7Ww1HgpTJO8hS0Is0jwx/OYgnAeyWRYEUAAcw/SlRUkmyQKVHibxd9jaU3jgPLbkSBnmyDy02WOGIc8Ehhj1+Tz1ExMjZUEB17q6Vpwa5yEKnts0Ye4hxjX2AEd5+q92iNBeMeJZPcDoU1uNvzB3j4mgy6nsYW0bLmXlIvS6bfbfyuZIH98oOFHw4OueOhi+bYL5iW69L63wBOp+p+39ZbBgcCKjgBCwf+CWG7QBOYieqgkUMXN+G4pf2x3Fwi4Oh3RcljJ0a8ZhFvP2nJHlr/mGOCHF4kzSRgKFqIEeFgz7/Tk+2I+M2bOy6KloBHO6+IAia08LvwY3WCD/ybf0NtNYUxiWM6POY4EyiTRbKNpGAEW5xPNdx7XtQU6boPDidKTNQZsZwLLy4j67xnU8k5wh015mOOo5iXfhJEYnhEY/T0Wt1JryHDEhA2A+DknHI7eZqUl8ZVcLdmuIepo9sWIb3t6NdZLq2B6dLb82vcdrKR0/1U2pK1LU/cZGip9bIfZRdt7/0PctwWbAWKQ2VpWFvwZKUsjcxSdb+opGPwCVYEH9eBPnAmb+EbIW4Z8avTWHaH7x06PB9R3PdFrsbjHyxxcY0V3wvgS8JVJWmJHQ9wVmgsTvoBq4pKgv7JN5kEvMKiaXZZrzZ76pyXfT2bBNeLW1sS/TvgWnhJqvu0GP47Bb+sq8txonV8AaWn8eutWu7gUuxviPJJ7ydmJ16bLLF4BC68+GO67hGHB+ZbIwMuJRl7F0zbDtiMgp6mDQZBTuNJ02p3JFBKHzzNAikXYaYyP1lMSopmhUg4VifOD9BSAeRWOaZOwe26Z5OdP/UW8pI5HLVoxYGl4eUZfjAWHEIehgVM9pkRgxkusbssDQ6xRcmIBZ9j4TYAzLsuAh7RIIdFWBH8hCiy2PqIqJUJkJ44G70TQp5gSJyVnJ95OZ7eXo7uIDkz3O4GkqTT5LYG6AbUDx5qQFeNYD3F/HdMH4zT815Fj/h5l/3i99+8I+dRh5+UI5On+CTAOmVYJjwNey+2T3HxPiQ2cI78kVD82Xo4M0H/+gDLRYPPY7omLbWAmXNWtyIRorHkAgOLHZPLoXvLErKK3mQ8FN+f1OGDrFowiVCcOZ+/hC5l5ZPcoyYyFEAPiX0HhT85a5J6SfObFXWq1AqfGC+3Hc99Cnhm7u2eV1G1/hla3b7y6pcG7gtBgaKHgs1Pcf8P+mFgSnwLK7OO1/QWqEPWH9cbq+vDxSrh8knKvC12dAfYxLM4XLu4Zsx5QMg3tgDoXp4q49V1aX+2J0+1dFX+lgiruh0q6+zP3Kv4q6gHRyo5f/y5G8n3ffTGvmyHwTMfef8Wb58+cccPc3pJavcXDG8UXnEp2RtvYbw6G1R9+W6M/ua5drPsbemru6UlAc2MTQLUkJH7MWdSASB5AmHl0tAuu/Lfg/S+8xjw/+8EwKHTAkhGuB9YAkgWolOCmiJxQcSKZtaf4NHPSMjAL4d66i2fKVSOn5k4fsUy7K5uCwMRhxl8AGtjEwQ0fDqrGOhTjZRVK+4Q7QEnuQFp8SJY5Qg0nwOvusWiFWZb4wnPHmU5Ebe4xE/9MfOIoAlfNHjH/41ii8uXXfylhp7zztTT7QM4NUrRl82gHFn5TgRC1r4ZalWgZOSpoVeI5zqJaaHp4hQA/kisOQMBCkGA3TFMs8gaOKQUHVUrJoQrEZFKy1c0ahlt9KbSXIWFabZeP9RE+XrTs5o/utCb5JmKKqc3t7U0h0OCe7PtDlD8c/497ci2CvJgN5hpjMavJGpxO/wKWd57c+FUMQzPXucG/q/2E7GHulV/evly/Fwrwx6o6M0Lzt80RPJVriw4Mz6Q5Yb/xSqUa8daX+tbfO6qFYVSj/a3npPSfQIcVIHGnPq48EjeUKC4rznYXw2B6dy4Ht4wPUQ0GOQj9r5GZLItN0V6x7h2umpyGPNSDBoylkufwxM1dh8Lm9Iw+vRlWW7NBcuVAZQ4krBB9E7QLyFCufyitbjCwpd57n4h7rg6boC8kzYNvR5oAcM8dFi+Q7pyz9NVMCPg47CETeI++CyJ3ySZEEmhYfY3RhMhcQSoAAbaTp64ZPKkEJAl9RGetDx3ru7dcJxdxVnxZR9pHFHn0AP5kDzLK/Ipdj3LSGI890dRTMleEt0hmqAyBKU7+dVudshCfVIgY++45xwDJrdYuJiQ8kBVJPvMcpu3bweR5n4m0ApWgQBCCVDTz5gJAYEfMAu2YpN5JAXFKAFkwa3SCeyj6+Uq2MXAd2jCrkBTJLmeGZQeONmucA0G4IsPKfupIVHjAk6/eK0I/s6zm0ymXjEVeXUI0wBUdpF7bW4XLvYmGK3Q+uwPNRFv8MIWQgfY+9v/j4RJ8zxeMFLhvzsXJScjpxG9vWrLm12zO9zcmm/gtWr+8/jSR/5xT/9QJ0TPORNj4mMkBQbN5iDkKZP0nP00sE5OQswXtafY9lFlmWDtzuFfdPYZUfiA2/rt03/HIzsYFSEa+TAEYeqYDuMcKOF8XN19D67Trn1+BdnlU0yeZMsTExKd8tYGRPBxWtEZQeUMufTHAKetkde3kNXIloP5uucH9o959PjIBCu2j/JGsOCehWvXnlVxaUlxflKlhag8viCMJ1NaprNKyLwwb0RVWZiw2PwQ/efB0JIUH+OGVqZGJ0ffAUwMmM7RVauTxIveQfGWDzE8MznV7hT4EcDoVS8bzSN88eLC7cqfn3YZ/4Y6yZ4+DwA3XuuwIXYDkhQtAuZ9jnFNiADCq4gI0dMScjTiWr4CxYde7tcml/QkeN6D8051LuYzsS7gwzQrXWJeIUWjeXNYgoQZeMdyMkQvo7d5OZRFriMwmHg/UJDXZJL69y4N6jh7iS+mycvXezlo+W0V4X6dmj+KqHtlCPy/ZD10GCU+ZesTCLszw43Gcv5GwKV+QfEJT+612Om/8SMwSPQdekfrm0PgVbDUX0gOkxVcOPa9olXx9APQ6M9H015Ntv5vwSniIam8K4gJcYAXz2UsjBtQzCnEF+zmfKtgOr4qJAeeTwfx8HBVazXkVOCqWqhtoInZ/8KstMGfREVkcrEwqjJLHxdlTw4xriQJIUPQSRuP4M94Ej4cAfDFJHeuQvlvGA9nkHSEtqQmga8YGb4NWawShc9JqkEGz3RKr7R2rdYPnG4WTlGCTiJ+Ti/34iMfAySR/m48Eya3UdLmdqQz/BMszgUEaZwDkNesEAVSUS0fhCBnFQUm5a4ypL/EFaZmL/2f20l+l84O9UJn9ll2C5NYuvNsbkH9Xm1Tomh3s8fXSAszo/1Ndhdbv94cYGpGVvas9iRKhgIpnFBj3lRL3hjRG0BVYATwuNaTm0+OCYAYHxEtWjX5dTC8/dbOKWBOLZwGOjjYwOBwMWJM+gRbT50WsqiLrMTpSqPORNrgNfLLwLIK5wXWhOcmWNYB4SEE5pqTqP5IdFNOrqfSarKMMtrHuR+7cAnobNaLFLK3lwkKOnK3SDgLY5QLK+UahLoY7eiobgvETNWfHeC1NKb89xnTAwiTLUcfCanY+WUM+1KP3R1C0GjMq4T6RbQOjeccNRPDc4L/F7A3TxNzvDmlCxKZ1JXWVwylQA0AOVi2q1CpftHHwv60t11lFjRh8y4opkZB7DrJY0aYE4GBHOy27e2Ki+TLLhM0q5XCLA4ViCGoso+PFJ/p17RCI62CF1oaZ6A+KDfe4A/GGK+fSWW/1QN/KlJvnn6wxdfffHDF0lGaWDoenU0ZTIduMGccvM4G+lYp4B+j76fjPX94umX3734Kuw2UUu+R+pnNVimN3Ms+XM0izgh88gqqRc/MdifIxfSRa+GyU5J3aBtr+6E6PQNYfBD8F183VUmPwWRE8M7nTY1EkI0CuWBXjg8QC6Y6GgGR1y4D70QoErmdiACz0B+hagX8WSjd2m71LMNThwu12q62B63P3JFtj4GjTcu3DRUFXVi1qBBPuJPg4RTEVQZt7LXxfpuMTPRkOJOpoeMYvyD2WUzvJmbhe6RMdk+GEoUrUFlA5hyI4xmMLWGQQhNHMIzEo4Tgv49onXHWRjy+9RnmQ4JDJ4l/VEvKAs8oQ4w6ODWc7QnTNx78tl0Xs2bxhJRw/xlxnlCBanBknEsdp5xw2ND98VhgPUxjD9wnvxU6FCdcioGYkYQEr26Z8Cx5+ucTFVJeaHAdiDgOBvE76gs7QeCPcORsykqrgM/lwdDuVlbaoOGEp7p2947U+5gwdq/20FORbKoLweD+6OOw+jSsUWE0f/j8d0xNoyFeschfAdoKOVJia6iKNQ0LsZY1BcSN5kfYyjKEVrwP3pxqfnK7rpsNuZMrXwEfBCi+N54PPKqjLfgDBKIg0Nod+Prws3dwnkmK5fAYNDFlDXVbkt4NajfNHvU1Y15uV+vbddd7avqzqhhAukBO/WeiC4lofIYDqsKKIaLdcySnwmf5DBTmUsU14nzpbhBzhNecJdcjIVCRt5QCppKTvxAUY9HxUOPEZFQGKckmZAc3TwZokEAUhCteLSv/HRxT0GLxh2fh1tbXCnQlserBMFhI1liKIeQP0Y3TdefMeuKrZJaGuY3Rd55DYHUIACefr7QnTnbtnDm/vTFi2+ff/v7hXkJd/bAveOpYcr7AgKUhH25Yzl31kVtpjqk3YywCw+AieilY/t/Knl5hs9LoKcuPn9EqyBXu/FV+0KZExKbP8gmT4HrbLThQqAVyNWKTNwBhdAsE4zWmIJ7VHUl27oeW8zW5NZBd/a1SX+W/zzLRixISl7hTcBn4hwPBOiygzZxhaP+Zs7m6LPg+bONriFenUWfkR/LXXqe/KnZ450LkOsFYiUWUE4iKDTptry+6c2lNdui3gOZh9wl4GICr0EpaDnnKCpDO7AYVpSPpJ9Z6M3kPX8DWui7cd9O5GgeExgEOiXv1ES1u+WJ4+iRsBc9jHBGBScdSjN0Vj1lzO/bZm3txqR//rTOfmuSIOCzqLtbFOVGX4XDrNQgo9Gdvk95GgCd+0B7Pqafr+E/3v1NubmeMt8/N3u4au92TQ15Zihj105wnQZDaSIztwUROrSsXmFkqHv+UHroFgacSHKjb1jCxS9hyouhHZ9NmVUD4SXKkMkFnhJCgbog4+8g+nyNX1L/8lkWUF4Iht0E7Ww7l/LgsZ/RGsP4ZVHwHbVKzzXhoJx0OmRrsuNwjn7W97XVDBdxIpMJrjhUlApizbdNj2xCeVmzG4lho8gpNjC5dNyUG5e+GMKKx/n+qEIPi1gX7SadrE2yrfa4Dr5kTn46xJfGxOaR4P5ADIlUC4mQj4LKA+uE3Hz4DIeBzHtEJJ5wYa73VSXZndwZUoUzlIZTzLQe5a3ByDZ220rejOZaH5jXVCPNDdWA7MbI1l5J1O6tyFSif3C29eSnj3nxHy9+ln/M10YfL84TFSF72/kXM1jlRQszaIT8uG26A38tlSUoHOXjxPtstj15wba9j7NhdzvnxvCIXqmASllufv7oV78IFPqg88GDe9DqnHoUH2jo4SI7fwyvO2SH5vguus/7qT7+Y5hZYpgFJhDeXIPxC51hf0rdcR+DqwbfZFTzmNSjXLv7aE3jNyQo9rlIvDS8vAlUEGqocULSkg7JkqQeDdS6VfSmlu5WpINwyDHh1UNyUn6NdFv1ikJg27vtRo9nnmSxQOt8SEZFc/EpIZ+neJaLyfPjHT6NPvcPOSSLeNBBxzR0HE3y4eOaY/M8j2Z2QcD2nO4D2BPMSJw9kp3UCXLKcHSeCPs/+yPhLIhuePhyk6gil9OZWG8ySPNMEirENXdnT9GMf+GjpnSoyVju6GAd6NmbecGfPBle2buoBO4JoiJxdwiq8etAsZJ3mnKltKsJdL4XQo8T4XP/WStKbU9+/gOS4850vMO5q8w0BiIxEif455kC6xRPU6PHStPkokL1rvPbjMBeHOzmfFw3i2LsTtQgI36BPR3bkWlQqMvgPBvUl2kG2uPoEi8G+x+8bD7OBgY33AN0U52IU+fY6CAx+dZIbI4sWD1YnB1E3It4XSH51KRNVwEn/wEbTYI8KzFmA2ofwOyLwRiQWwl8+jEXIoW/hOEz2ogxbM0RASduTXbIeHAyr2hufUc+OUzb3DIzPGRV0IksIW1E096l2egtgbwhym/XBWKEeh1heAPqpCAXRbRQoRJD+YkGGHMoCPIjsUh2ith+kX/sbKGBtN5ZW0dBkHGH2lN2YPKP7xIiGI5Tfi8jRa1hNovYkVB9OkSPfDWVAk2lbT9Gq/gVeCVYHELJXVlP4yOPGnrmHNict9GlULDokaR2uMhY5xVMjMsHSnKoDI9djQ/yEr2b4UNSv6y9wHW9nskfc0keks3+P+Lcdq46CgEA";
79
+
80
+ // packages/safe-bash-command-python/src/package-program.ts
81
+ var decoded;
82
+ function loadPythonPackageProgram() {
83
+ return decoded ??= new Response(new Blob([Uint8Array.from(atob(pythonPackageProgramGzip), (character) => character.charCodeAt(0))]).stream().pipeThrough(new DecompressionStream("gzip"))).text();
84
+ }
85
+
86
+ // packages/safe-bash-command-python/src/native-wheel.generated.ts
87
+ var pythonNativeWheelGzip = "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";
88
+
89
+ // packages/safe-bash-command-python/src/native-wheel.ts
90
+ var decoded2;
91
+ function loadPythonNativeWheel() {
92
+ return decoded2 ??= new Response(new Blob([Uint8Array.from(atob(pythonNativeWheelGzip), (character) => character.charCodeAt(0))]).stream().pipeThrough(new DecompressionStream("gzip"))).text();
93
+ }
94
+
95
+ // packages/safe-bash-command-python/src/package-url-hash.ts
96
+ function pythonPackageUrlHash(url) {
97
+ const match = /(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)/.exec(url);
98
+ return match ? [match[1], match[2]] : void 0;
99
+ }
100
+
101
+ // packages/safe-bash-command-python/src/provisioning-runtime.ts
102
+ async function installPythonPackages(supplied, start, request, maxTransferBytes, installationRoot) {
103
+ if (!start.requirements.length && !start.uninstall && !start.bootstrap) return;
104
+ const runtime = supplied;
105
+ if (runtime.version !== "314.0.6" || !runtime._api?.packageManager || !runtime._api.lockfile_packages || typeof runtime._api.packageManager.installPackage !== "function" || typeof runtime.loadPackage !== "function" || typeof runtime.runPythonAsync !== "function") throw new PythonFailure("runtime-abi", { cause: new Error("Python package installer ABI requires Pyodide 314.0.6") });
106
+ let transportFailure;
107
+ let accepting = true;
108
+ let pending = Promise.resolve();
109
+ let installing = Promise.resolve();
110
+ const manager = runtime._api.packageManager;
111
+ const transfer = (consume) => {
112
+ if (!accepting) return Promise.reject(new Error("Python package transport is only available during installation"));
113
+ const work = pending.then(async () => {
114
+ if (transportFailure) throw transportFailure.error;
115
+ try {
116
+ return await consume();
117
+ } catch (error) {
118
+ transportFailure ??= { error };
119
+ throw error;
120
+ }
121
+ });
122
+ pending = work.then(() => {
123
+ }, () => {
124
+ });
125
+ return work;
126
+ };
127
+ const readArtifact = (operation, key, offset, length) => {
128
+ const failed = (error) => {
129
+ transportFailure ??= { error };
130
+ throw error;
131
+ };
132
+ try {
133
+ const result = request(operation, start.session, key, offset, Math.min(length, maxTransferBytes, 65536));
134
+ return result instanceof Promise ? result.catch(failed) : result;
135
+ } catch (error) {
136
+ return failed(error);
137
+ }
138
+ };
139
+ const withArtifact = (url, expected, metadata, consume) => transfer(async () => {
140
+ const opened = await request("package-open", start.session, url, expected, ...metadata ? [metadata] : []);
141
+ try {
142
+ return await consume(opened, (offset, length) => readArtifact("package-read", opened.key, offset, length));
143
+ } finally {
144
+ await request("package-close", start.session, opened.key);
145
+ }
146
+ });
147
+ const wheel = async (size, read, configuration) => {
148
+ const globals = ["_safe_native_wheel_read", "_safe_native_wheel_config", "_safe_extract_native_wheel", "_safe_native_wheel_index", "_safe_native_wheel_dynlib"];
149
+ let indexed = false;
150
+ try {
151
+ runtime.globals.set(globals[0], read);
152
+ runtime.globals.set(globals[4], async (path) => {
153
+ try {
154
+ await runtime._api.loadDynlib(path);
155
+ return "";
156
+ } catch (error) {
157
+ return String(error);
158
+ }
159
+ });
160
+ runtime.globals.set(globals[3], (operation, ...args) => {
161
+ if (operation === "start") indexed = true;
162
+ const failed = (error) => {
163
+ transportFailure ??= { error };
164
+ throw error;
165
+ };
166
+ try {
167
+ const result2 = request("package-index", start.session, operation, ...args);
168
+ return result2 instanceof Promise ? result2.catch(failed) : result2;
169
+ } catch (error) {
170
+ return failed(error);
171
+ }
172
+ });
173
+ runtime.globals.set(globals[1], JSON.stringify({ ...configuration, size }));
174
+ const result = JSON.parse(await runtime.runPythonAsync(await loadPythonNativeWheel()));
175
+ if (result && typeof result === "object" && "wheelError" in result) throw new Error(result.wheelError);
176
+ if (result && typeof result === "object" && "dynlibError" in result) throw new Error(result.dynlibError);
177
+ return result;
178
+ } finally {
179
+ try {
180
+ if (indexed) await request("package-index", start.session, "close");
181
+ } finally {
182
+ for (const name of globals) runtime.globals.delete(name);
183
+ }
184
+ }
185
+ };
186
+ const fetch = (url, expected, metadata) => withArtifact(url, expected, metadata, async (opened, read) => {
187
+ const bytes = new Uint8Array(opened.size);
188
+ for (let offset = 0; offset < bytes.length; ) {
189
+ const chunk = await read(offset, bytes.length - offset);
190
+ if (!Array.isArray(chunk) || chunk.length === 0 || offset + chunk.length > bytes.length) throw new Error("Invalid Python package chunk");
191
+ bytes.set(chunk, offset);
192
+ offset += chunk.length;
193
+ }
194
+ return { bytes, headers: opened.headers };
195
+ });
196
+ manager.downloadPackage = async (metadata) => {
197
+ if (!accepting) throw new Error("Python package transport is only available during installation");
198
+ if (metadata.channel === manager.defaultChannel) {
199
+ const pkg = runtime._api.lockfile_packages[metadata.normalizedName];
200
+ if (!pkg) throw new Error(`Missing matching Pyodide package: ${metadata.normalizedName}`);
201
+ return { url: new URL(pkg.file_name, "https://cdn.jsdelivr.net/pyodide/v314.0.6/full/").href, expected: pkg.sha256 };
202
+ }
203
+ return { url: metadata.channel };
204
+ };
205
+ manager.installPackage = (metadata, source) => {
206
+ if (!accepting) return Promise.reject(new Error("Python package transport is only available during installation"));
207
+ const work = installing.then(async () => {
208
+ if (source instanceof Uint8Array) throw new Error("Expected retained Python package source");
209
+ const pkg = runtime._api.lockfile_packages[metadata.normalizedName] ?? metadata.packageData;
210
+ if (!pkg) throw new Error(`Missing matching Pyodide package: ${metadata.normalizedName}`);
211
+ return withArtifact(source.url, source.expected, void 0, (opened, read) => wheel(opened.size, read, {
212
+ filename: pkg.file_name,
213
+ target: pkg.install_dir ?? null,
214
+ metadata: { INSTALLER: "pyodide.loadPackage", PYODIDE_SOURCE: metadata.channel === manager.defaultChannel ? "pyodide" : metadata.channel }
215
+ }));
216
+ });
217
+ installing = work.then(() => {
218
+ }, () => {
219
+ });
220
+ return work;
221
+ };
222
+ const loadPackages = async (names) => {
223
+ const errors = [];
224
+ const importlib = runtime._api.importlib;
225
+ let invalidate = false;
226
+ if (installationRoot && importlib) runtime._api.importlib = { invalidate_caches() {
227
+ invalidate = true;
228
+ } };
229
+ try {
230
+ await runtime.loadPackage(names, { messageCallback() {
231
+ }, errorCallback(message) {
232
+ errors.push(message);
233
+ } });
234
+ } finally {
235
+ if (installationRoot && importlib) runtime._api.importlib = importlib;
236
+ }
237
+ if (invalidate) await runtime.runPythonAsync("import importlib; importlib.invalidate_caches()");
238
+ if (errors.length) throw new Error(errors.join("\n"));
239
+ };
240
+ const installedGlobals = [];
241
+ const bind = (name, value) => {
242
+ runtime.globals.set(name, value);
243
+ installedGlobals.push(name);
244
+ };
245
+ try {
246
+ if (installationRoot) {
247
+ bind("_safe_installation_root", installationRoot);
248
+ await runtime.runPythonAsync(`
249
+ import sys, site, sysconfig
250
+ from pathlib import Path
251
+ from pyodide import _package_loader
252
+ sys.prefix = sys.exec_prefix = _safe_installation_root
253
+ site.PREFIXES = [sys.prefix, sys.exec_prefix]
254
+ sysconfig._CONFIG_VARS = None
255
+ _package_loader.SITE_PACKAGES = Path(site.getsitepackages()[0])
256
+ _package_loader.DSO_DIR = _package_loader.SITE_PACKAGES.parents[1]
257
+ _package_loader.TARGETS.update(site=_package_loader.SITE_PACKAGES, dynlib=_package_loader.DSO_DIR)
258
+ _package_loader.SITE_PACKAGES.mkdir(parents=True, exist_ok=True)
259
+ sys.path.insert(0, str(_package_loader.SITE_PACKAGES))
260
+ `);
261
+ }
262
+ await loadPackages(["micropip", ...start.bootstrapPackages ?? []]);
263
+ bind("_safe_package_native", loadPackages);
264
+ bind("_safe_package_preloaded", (operation, name) => transfer(async () => request("package-index", start.session, "names-" + operation, ...name === void 0 ? [] : [name])));
265
+ bind("_safe_package_bytes", async (url, hash) => (await fetch(url, hash)).bytes);
266
+ bind("_safe_package_metadata", async (url) => {
267
+ const result = await fetch(url, void 0, "metadata");
268
+ return JSON.stringify({ text: new TextDecoder().decode(result.bytes), headers: Object.fromEntries(result.headers.map(([name, value]) => [name.toLowerCase(), value])) });
269
+ });
270
+ bind("_safe_package_wheel_download", async (url, expected) => withArtifact(url, expected, void 0, async (opened, read) => {
271
+ const hash = pythonPackageUrlHash(url);
272
+ if (hash) await wheel(opened.size, read, { integrity: hash });
273
+ return JSON.stringify(await request("package-retain", start.session, opened.key));
274
+ }));
275
+ bind("_safe_package_wheel_metadata", async (serialized) => transfer(async () => {
276
+ const { source, name } = JSON.parse(serialized);
277
+ return wheel(source.size, (offset, length) => readArtifact("package-read-retained", source.token, offset, length), { metadata_name: name });
278
+ }));
279
+ bind("_safe_package_wheel_install", async (serialized) => transfer(async () => {
280
+ const { source, ...configuration } = JSON.parse(serialized);
281
+ await wheel(source.size, (offset, length) => readArtifact("package-read-retained", source.token, offset, length), configuration);
282
+ }));
283
+ bind("_safe_package_indexes_json", JSON.stringify(start.indexUrls ?? null));
284
+ bind("_safe_package_constraints_json", JSON.stringify(start.constraints ?? []));
285
+ bind("_safe_package_requirements_json", JSON.stringify(start.requested ?? start.requirements));
286
+ for (const key of ["pre", "upgrade", "forceReinstall", "legacy", "noDeps"]) {
287
+ bind("_safe_package_" + key, !!start[key]);
288
+ }
289
+ bind("_safe_package_restore_json", JSON.stringify(start.restore ?? []));
290
+ const inputRecords = start.recordCount === void 0 ? start.records?.map((row) => [row[0], row[1], row[2], [...row[3]], [...row[4]], row[5] ?? null]) : void 0;
291
+ const recordCount = start.recordCount ?? inputRecords?.length ?? -1;
292
+ const publication = start.streamManifest && installationRoot && start.restore !== void 0 ? installationRoot + "/" + pythonPublicationFile : null;
293
+ bind("_safe_package_publication", publication);
294
+ const outputRecords = [], pinned = [];
295
+ bind("_safe_package_record", (operation, key, value, field) => transfer(async () => {
296
+ if (publication && (operation === "pin" || operation === "append")) throw new Error("Expected caller-file Python publication");
297
+ if (operation === "pin") {
298
+ if (typeof key !== "string") throw new Error("Invalid Python package pin");
299
+ const pin = JSON.parse(key);
300
+ if (typeof pin !== "string") throw new Error("Invalid Python package pin");
301
+ pinned.push(pin);
302
+ return null;
303
+ }
304
+ if (operation === "start") {
305
+ await request("package-index", start.session, "records-start");
306
+ return recordCount;
307
+ }
308
+ if (operation === "append") {
309
+ if (typeof key !== "string") throw new Error("Invalid Python package record");
310
+ if (start.restore !== void 0) outputRecords.push(JSON.parse(key));
311
+ return null;
312
+ }
313
+ if (operation === "read" || operation === "get" || operation === "field") {
314
+ if (operation === "field" && (!Number.isInteger(field) || field < 0 || field > 5)) throw new Error("Invalid Python package record field");
315
+ const offset = value ?? 0;
316
+ if (!Number.isSafeInteger(offset) || offset < 0) throw new Error("Invalid Python package record offset");
317
+ const ordinal = operation !== "read" ? await request("package-index", start.session, "records-get", key) : key;
318
+ if (ordinal === null) return offset === 0 ? "null" : "";
319
+ if (!Number.isSafeInteger(ordinal) || ordinal < 0 || ordinal >= recordCount) throw new Error("Invalid Python package record ordinal");
320
+ const chunk = start.recordCount === void 0 ? JSON.stringify(operation === "field" ? inputRecords[ordinal][field] ?? null : inputRecords[ordinal]).slice(offset, offset + 8192) : await request("package-record-read", start.session, ordinal, offset, ...operation === "field" ? [field] : []);
321
+ if (operation === "field" && chunk === false) return false;
322
+ if (typeof chunk !== "string" || chunk.length > 8192) throw new Error("Invalid Python package record chunk");
323
+ const last = chunk.charCodeAt(chunk.length - 1);
324
+ return last >= 55296 && last <= 56319 ? chunk.slice(0, -1) : chunk;
325
+ }
326
+ return request("package-index", start.session, "records-" + operation, ...key === void 0 ? [] : [key], ...value === void 0 ? [] : [value]);
327
+ }));
328
+ bind("_safe_package_uninstall_json", JSON.stringify(start.uninstall ?? null));
329
+ bind("_safe_package_emit", async (stream, message) => {
330
+ if (stream !== "stdout" && stream !== "stderr") throw new Error("Invalid package output stream");
331
+ const bytes = new TextEncoder().encode(message);
332
+ for (let offset = 0; offset < bytes.length; offset += maxTransferBytes) await request(stream, Array.from(bytes.subarray(offset, offset + maxTransferBytes)));
333
+ });
334
+ bind("_safe_package_line", async () => {
335
+ const bytes = [];
336
+ while (true) {
337
+ const chunk = await request("stdin", 1);
338
+ if (!chunk.length) {
339
+ if (!bytes.length) throw new Error("EOF when reading package confirmation");
340
+ break;
341
+ }
342
+ if (chunk[0] === 10) break;
343
+ bytes.push(chunk[0]);
344
+ }
345
+ return new TextDecoder().decode(Uint8Array.from(bytes));
346
+ });
347
+ const program = await loadPythonPackageProgram();
348
+ const installerFailure = await runtime.runPythonAsync(`
349
+ import sys as _safe_install_sys
350
+ from micropip.logging import setup_logging as _safe_install_logging
351
+ _safe_install_handlers = [handler for handler in _safe_install_logging().logger.handlers if getattr(handler, 'stream', None) is _safe_install_sys.stdout]
352
+ _safe_installer_failure = None
353
+ try:
354
+ for handler in _safe_install_handlers: handler.setStream(_safe_install_sys.stderr)
355
+ ${program.split("\n").map((line) => " " + line).join("\n")}
356
+ except BaseException:
357
+ import traceback
358
+ _safe_installer_failure = traceback.format_exc()
359
+ finally:
360
+ for handler in _safe_install_handlers: handler.setStream(_safe_install_sys.stdout)
361
+ _safe_installer_failure
362
+ `);
363
+ if (typeof installerFailure === "string" && installerFailure) throw new Error(installerFailure);
364
+ await installing;
365
+ accepting = false;
366
+ await pending;
367
+ if (transportFailure) throw transportFailure.error;
368
+ if (publication) await request("package-commit-file", start.session);
369
+ else await request("package-commit", start.session, start.restore === void 0 ? pinned : { version: 3, installed: pinned, records: outputRecords });
370
+ if (start.uninstall) await runtime.runPythonAsync("await _safe_publish_uninstalled()");
371
+ } catch (error) {
372
+ await installing;
373
+ accepting = false;
374
+ await pending;
375
+ throw transportFailure ? transportFailure.error : error;
376
+ } finally {
377
+ await installing;
378
+ accepting = false;
379
+ await pending;
380
+ manager.downloadPackage = manager.installPackage = async () => {
381
+ throw new Error("Python package transport is only available during installation");
382
+ };
383
+ for (const name of installedGlobals) runtime.globals.delete(name);
384
+ }
385
+ }
386
+
387
+ // packages/safe-bash-command-python/src/execution.ts
388
+ var pythonExecution = `
389
+ import sys, os, json, runpy, traceback, types, warnings, textwrap, io, struct, linecache
390
+ _safe_invocation = json.loads(_safe_invocation_json)
391
+ os.environ.clear()
392
+ os.environ.update(_safe_invocation['env'])
393
+ _safe_args = list(_safe_invocation['args'])
394
+ sys.orig_argv = [_safe_invocation.get('command', 'python')] + _safe_args
395
+ _safe_exit = 0
396
+
397
+ class _SafeOptionError(ValueError):
398
+ pass
399
+
400
+ def _safe_system_exit(_error):
401
+ if isinstance(_error.code, int):
402
+ _status = int.__index__(_error.code)
403
+ _long_bound = 1 << (8 * struct.calcsize('@l') - 1)
404
+ status = (_status & 255) if -_long_bound <= _status < _long_bound else 255
405
+ else:
406
+ status = 0 if _error.code is None else 1
407
+ if _error.code is not None and not isinstance(_error.code, int):
408
+ print(_error.code, file=sys.stderr)
409
+ return status
410
+
411
+ def _safe_launch():
412
+ args = list(_safe_args)
413
+ unbuffered = False
414
+ ignore_env = bool(sys.flags.ignore_environment)
415
+ safe_path = bool(sys.flags.safe_path)
416
+ native_warning_options = list(sys.warnoptions)
417
+ # Pyodide adds a bootstrap cwd entry even when CPython safe-path mode is set.
418
+ # Each execution mode below supplies its own entry after explicit PYTHONPATH.
419
+ sys.path[:] = [entry for entry in sys.path if entry != '']
420
+ warning_options = []
421
+ version_count = 0
422
+ options_terminated = False
423
+ while args and args[0].startswith('-') and args[0] != '-':
424
+ option = args.pop(0)
425
+ if option == '--':
426
+ options_terminated = True
427
+ break
428
+ if option in ('--help', '-h', '-?'):
429
+ print('usage: python [-uBEPOsSIbdvqR] [-W filter] [-X option] [-c code | -m module | file | -] [args ...]')
430
+ print('Dedicated Pyodide interpreter; stdin is noninteractive.')
431
+ print('-u: unbuffered binary output; -B: disable bytecode writes; -E: ignore PYTHON* settings')
432
+ print('-P: omit automatic unsafe sys.path entry; -W: Python warning filter')
433
+ print('-O/-OO, -S/-s/-I, -b/-bb, -d/-v/-q/-R: CPython startup flags')
434
+ print('-X: utf8, dev, warn_default_encoding, int_max_str_digits; interactive flags are unsupported.')
435
+ return
436
+ if option == '--version':
437
+ version_count += 1
438
+ continue
439
+ if option.startswith('--'):
440
+ raise _SafeOptionError('unsupported option ' + option)
441
+ index = 1
442
+ while index < len(option):
443
+ flag = option[index]
444
+ if flag in ('h', '?'):
445
+ args = ['--help']
446
+ break
447
+ if flag == 'V':
448
+ version_count += 1
449
+ index += 1
450
+ continue
451
+ if flag in ('c', 'm', 'W', 'X'):
452
+ operand = option[index + 1:] if index + 1 < len(option) else args.pop(0) if args else None
453
+ if operand is None:
454
+ raise _SafeOptionError('argument expected for -' + flag)
455
+ if flag in ('W', 'X'):
456
+ if flag == 'W': warning_options.append(operand)
457
+ break
458
+ args = ['-' + flag, operand] + args
459
+ break
460
+ elif flag in ('O', 'S', 's', 'I', 'b', 'd', 'v', 'q', 'R'):
461
+ pass # Applied by CPython startup configuration before bootstrap.
462
+ elif flag == 'u':
463
+ unbuffered = True
464
+ elif flag == 'B':
465
+ sys.dont_write_bytecode = True
466
+ elif flag == 'E':
467
+ ignore_env = True
468
+ elif flag == 'P':
469
+ safe_path = True
470
+ else:
471
+ raise _SafeOptionError('unsupported option -' + flag)
472
+ index += 1
473
+ if args and args[0] in ('-c', '-m'):
474
+ break
475
+ if version_count:
476
+ print('Python ' + (sys.version if version_count > 1 else sys.version.split()[0]))
477
+ return
478
+ if not ignore_env:
479
+ unbuffered = unbuffered or bool(os.environ.get('PYTHONUNBUFFERED'))
480
+ sys.dont_write_bytecode = sys.dont_write_bytecode or bool(os.environ.get('PYTHONDONTWRITEBYTECODE'))
481
+ safe_path = safe_path or bool(os.environ.get('PYTHONSAFEPATH'))
482
+ path = os.environ.get('PYTHONPATH')
483
+ if path:
484
+ sys.path[0:0] = [os.path.abspath(entry) for entry in path.split(os.pathsep)]
485
+ if os.environ.get('PYTHONWARNINGS'):
486
+ warning_options[0:0] = os.environ['PYTHONWARNINGS'].split(',')
487
+ encoding = os.environ.get('PYTHONIOENCODING')
488
+ if encoding:
489
+ name, separator, errors = encoding.partition(':')
490
+ for stream in (sys.stdin, sys.stdout):
491
+ stream.reconfigure(encoding=name or None, errors=(errors or 'strict'))
492
+ sys.stderr.reconfigure(encoding=name or None, errors='backslashreplace')
493
+ # CPython's -b/-bb filter follows environment and command-line -W filters.
494
+ byte_warning = ('error' if sys.flags.bytes_warning > 1 else 'default') + '::BytesWarning'
495
+ native_before = [value for value in native_warning_options if not (sys.flags.bytes_warning and value == byte_warning)]
496
+ warning_options = native_before + warning_options + ([byte_warning] if sys.flags.bytes_warning else [])
497
+ warnings._processoptions(warning_options)
498
+ sys.warnoptions[:] = warning_options
499
+ if unbuffered:
500
+ for name in ('stdout', 'stderr'):
501
+ stream = getattr(sys, name)
502
+ stream.flush()
503
+ encoding, errors = stream.encoding, stream.errors
504
+ binary = stream.detach()
505
+ raw = binary.detach() if hasattr(binary, 'detach') else binary
506
+ replacement = io.TextIOWrapper(raw, encoding=encoding, errors=errors, write_through=True)
507
+ setattr(sys, name, replacement)
508
+ setattr(sys, '__' + name + '__', replacement)
509
+ main = types.ModuleType('__main__')
510
+ main.__dict__.update(__package__=None, __spec__=None, __loader__=__import__('importlib.machinery', fromlist=['BuiltinImporter']).BuiltinImporter, __builtins__=__builtins__)
511
+ sys.modules['__main__'] = main
512
+ if not sys.flags.no_site:
513
+ sys.argv = [args[0]] + args[2:] if not options_terminated and args and args[0] in ('-c', '-m') else args or ['']
514
+ import site
515
+ site.addsitepackages(site.addusersitepackages(None), list(dict.fromkeys([_safe_runtime_mount, sys.prefix])))
516
+ if not options_terminated and args and args[0] == '-c':
517
+ sys.argv = ['-c'] + args[2:]
518
+ if not safe_path: sys.path.insert(0, '')
519
+ source = textwrap.dedent(args[1])
520
+ code = compile(source, '<string>', 'exec')
521
+ # CPython 3.14 retains -c source for both top-level and nested tracebacks.
522
+ linecache._register_code(code, source, '<string>')
523
+ exec(code, main.__dict__)
524
+ elif not options_terminated and args and args[0] == '-m':
525
+ sys.argv = args[1:]
526
+ if not safe_path: sys.path.insert(0, os.getcwd())
527
+ runpy._run_module_as_main(args[1], alter_argv=True)
528
+ elif not args or args[0] == '-':
529
+ sys.argv = (['-'] + args[1:]) if args else ['']
530
+ if not safe_path: sys.path.insert(0, '')
531
+ main.__file__ = '<stdin>'
532
+ exec(compile(sys.stdin.buffer.read(), '<stdin>', 'exec'), main.__dict__)
533
+ else:
534
+ sys.argv = args
535
+ # CPython makes __file__ absolute without collapsing ./ or ../ components.
536
+ path = args[0] if os.path.isabs(args[0]) else os.path.join(os.getcwd(), args[0])
537
+ importer = __import__('pkgutil').get_importer(path)
538
+ if importer is not None:
539
+ sys.path.insert(0, path)
540
+ runpy._run_module_as_main('__main__', alter_argv=False)
541
+ else:
542
+ if not safe_path: sys.path.insert(0, os.path.dirname(os.path.realpath(path)))
543
+ try:
544
+ with open(path, 'rb') as source:
545
+ code = source.read()
546
+ except OSError as error:
547
+ print("python: can't open file " + repr(path) + ': [Errno ' + str(error.errno) + '] ' + error.strerror, file=sys.stderr)
548
+ return 2
549
+ main.__file__ = path
550
+ main.__loader__ = __import__('importlib.machinery', fromlist=['SourceFileLoader']).SourceFileLoader('__main__', path)
551
+ exec(compile(code, path, 'exec'), main.__dict__)
552
+ return 0
553
+
554
+ try:
555
+ _safe_exit = _safe_launch() or 0
556
+ except SystemExit as _error:
557
+ _safe_exit = _safe_system_exit(_error)
558
+ except _SafeOptionError as _error:
559
+ print('python: ' + str(_error), file=sys.stderr)
560
+ _safe_exit = 2
561
+ except BaseException as _error:
562
+ # Hide bridge frames while preserving actual Python frames and chained errors.
563
+ _trace = _error.__traceback__
564
+ while _trace is not None and _trace.tb_frame.f_code.co_filename == '<exec>':
565
+ _trace = _trace.tb_next
566
+ _error.__traceback__ = _trace
567
+ sys.last_exc = _error
568
+ _safe_exit = 130 if isinstance(_error, KeyboardInterrupt) else 1
569
+ try:
570
+ sys.excepthook(type(_error), _error, _trace)
571
+ except SystemExit as _hook_error:
572
+ _safe_exit = _safe_system_exit(_hook_error)
573
+ except BaseException as _hook_error:
574
+ print('Error in sys.excepthook:', file=sys.stderr)
575
+ traceback.print_exception(type(_hook_error), _hook_error, _hook_error.__traceback__.tb_next)
576
+ print('\\nOriginal exception was:', file=sys.stderr)
577
+ sys.__excepthook__(type(_error), _error, _trace)
578
+ finally:
579
+ for _stream in (sys.stdout, sys.stderr):
580
+ if _stream is not None and not getattr(_stream, 'closed', False):
581
+ try:
582
+ _stream.flush()
583
+ except BaseException:
584
+ _safe_exit = 120
585
+ _safe_exit
586
+ `;
587
+
588
+ // packages/safe-bash-command-python/src/runtime-programs.generated.ts
589
+ var pythonRuntimeProgramsGzip = "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";
590
+
591
+ // packages/safe-bash-command-python/src/runtime-programs.ts
592
+ var decoded3;
593
+ function loadPythonRuntimePrograms() {
594
+ return decoded3 ??= new Response(new Blob([Uint8Array.from(atob(pythonRuntimeProgramsGzip), (character) => character.charCodeAt(0))]).stream().pipeThrough(new DecompressionStream("gzip"))).json();
595
+ }
596
+
597
+ export {
598
+ PythonInvocationError,
599
+ parsePythonInvocation,
600
+ pythonPackageUrlHash,
601
+ installPythonPackages,
602
+ pythonExecution,
603
+ loadPythonRuntimePrograms
604
+ };